1. 程式人生 > >從《如何高效閱讀》到如何閱讀代碼

從《如何高效閱讀》到如何閱讀代碼

分布式 存儲 代碼閱讀 雲計算

?《如何高效學習》是一本主張通過整體性學習的方法來提高學習效率的書。書中結合信息的幾種不同類型(隨意的、觀點的、過程的、具體的、抽象的),從信息的獲取、理解、拓展、糾錯和應用這幾個逐步深入的層次,提出了如何高效學習的假說,指出了不少具有實用價值的方法,例如快速閱讀、筆記流、比喻內化、圖表、糾錯和項目應用等。

剛看這本書的時候,我是一口氣大約在一個多小時快讀完的,記了十幾條筆記。後面兩天都回頭來翻一番書後的總結和自己的筆記,每次都有些新的感想。這裏尤其想整理的是:這本書給自己在閱讀代碼方面的幾點啟迪。

整體性學習與理解業務邏輯

在《如何高效學習》這本書中,整體性學習是指遵循書中建議的信息獲取、理解、拓展、糾錯和應用的具體步驟,以達到對信息的內化、融會貫通和靈活應用的方法。其實這裏的信息不僅僅可以指書本上的信息,還可以是某個軟件項目上的信息:它包括用戶需求、業務流程、系統設計和軟件實現。不對這些全面的獲取和深入的理解,不可能理解了後面的系統設計,更別提軟件實現了。筆者最近學習一個分布式存儲系統的時候,就在這裏走了彎路。我當時在對系統的整體模塊有了大概的了解之後,就開始看模塊介紹文檔,然後馬上開始話費大量時間閱讀代碼。最後花了一兩周時間,對系統整體的業務的理解仍然少得可憐,並且看過的模塊裏面仍然有很多怎麽也看不懂的代碼。現在想來,正確的做法應該是先了解整個系統的功能、特點和接口,然後深入學習去理解它的主要業務操作的原理和流程,代碼的閱讀應該放在最後。

比喻、類比和關聯

比喻這種方法受到《如何高效學習》的強烈推崇,因為它能夠深入淺出地描述問題、說透問題。而類比則是建立橫向聯系的必經之路,它能夠把所學習的知識和其他已知的關聯起來,這是一個加深理解和記憶的過程。比如當時學習分布式存儲系統的時候,對復制組放置的邏輯一直模糊,直到最近細讀ceph, 讀到裏面介紹PG和OSD的關系的時候,才徹底清晰起來。而這一環節,其實在之前做某款文件系統的時候有接觸過的,單就是沒有和分布式裏面的存儲資源的劃分和分配關聯起來。而之所以沒有本能地關聯起來,根本還是在於對於一個存儲系統的幾個關鍵功能、模塊的理解還沒有內化。

結構、模型和高速公路

《如何高效學習》這本書中提出了關於學習的“結構”、“模型”和“高速公路”的三個概念,分別用來比喻已建立緊密聯系的一系列知識、簡化了的並且做了快照之後的結構以及結構和結構之間的聯系。落實到存儲系統方面,它的“結構”不外乎包括前端接入、邏輯地址映射、物理地址映射、後端寫入四個部分,實現地址映射的“模型”則主要包括hash、索引,後端寫入的模型通常是一部非阻塞IO模型。而連接存儲系統和分布式的“高速公路”就是支持一致性協議的和業務無關的接口庫。

勤於應用和熟能生巧

高效學習中最關鍵的步驟就是:將所學的知識用到實際中去。因為如果你能發現知識在你生活中的價值,知識就與你產生了緊密的聯系。想想大學的那些布爾代數、離散數學、線性代數和微積分,它們可憐地在你的記憶裏蒙上了一層厚厚的灰塵,以至於你都快認不出它們了。寫一個算法,裏面的全排序是否是必需,優先級隊列是不是就夠了?另外,算法的正確性如何證明?這些好像聽起來有些困難。根本原因還是你沒有把它們真正用起來過。以自己為例,不知道看了多少遍《深入理解Linux內核》,卻很少用到在最近的工作當中去。而我們對C/C++/Java/Python等則一目了然,只因為它簡單麽?每次想到這些問題,才感覺到自己在日常工作中的深入思考之少!

不過言歸正傳,還是先回到閱讀代碼方面的“應用”。在這裏,業務邏輯相當於“原理”,而代碼的實現則相當於“應用”,所以理解了原理,迅速找到相應代碼的實現能加深對系統的理解,而修改相應的代碼乃至重構才是熟悉代碼的不二法門。

讀書筆記和代碼筆記

《高效學習》這本書建議隨身帶上一個小本子和筆,便於隨時記錄信息中的關鍵、難點、重點,而非信息的主要內容。代碼閱讀也是如此,目的不是歸納出流程,而是理解邏輯。因此,同樣也可以隨時記錄看不懂模塊的所在層次、功能、關鍵邏輯和重要函數。特別需要針對不懂的函數和功能,確定到底是算法不懂,還是業務不懂。如果是算法,回去搞明白相應模塊的算法原理;如果是業務,退一步從上層看看之前的業務邏輯的理解是否有偏差。

從《如何高效閱讀》到如何閱讀代碼