技術資料的幾種讀法
作為一名程序員,有幾種獲取知識的渠道,比如本文將要討論的技術書籍、開源代碼、學術論文。這些可能都不是什麽秘密,但每個人都有不同的方式和習慣,也就對應有不同的效果和效率。本文就分享下自己這些年來的一些經驗,不一定適用每個人,但也許每個人能有些小的觸動和收獲。
1.技術書籍
可能程序員都很少讀書,因為這個時代就是這樣的特點,讀書的人在減少。大家更多地從工作日常獲得知識,對於程序員來說比如CSDN、StackOverflow、Quora等。但這種獲取知識的方式就好比上廁所時看手機,獲取的都是所謂的“碎片化”的知識。你不會因為知道一堆“冷知識”而比別人出色,相信大部分高手大牛也不是這樣煉成的。之前在《高效程序員的狂暴之路》中曾提到過:“李小龍說過:我不害怕把一萬種踢法都練一次的人,但我害怕把一種踢法練一萬次的人。”,牛人都是形成了自己的知識體系,深刻、完整、自洽,這才是你的競爭力。
想要有自己的體系就需要系統化地學習,而系統化學習最直接的方式就是讀書,讀好書。然而技術書籍汗牛充棟,即便是有口皆碑的好書也足夠我們讀一輩子了。這時就需要正確的學習策略,對不同類型的書用不同的閱讀方法,才能最大程度地發揮其價值。這一部分就簡單談談,技術書籍的幾種常見讀法和適用的情況。
1.1 精讀與回看
從頭到尾一氣呵成地精讀,這種方式適用於章節間有著較強邏輯關系的經典好書。因為有順序關系,所以從頭到尾,因為是經典,所以要精讀。比如,《Introduction to Algorithms》(CLRS)、SICP等,不僅正文要讀,甚至習題也要認真去做,這樣才會有最大收獲。這一類書都是慢工出細活,著急不得,適合有一段完整的時間,比如這段工作不忙,那就每天下班固定一兩個小時投入進去。
前面以CLRS舉例可以不是十分準確,因為畢竟這是一部大部頭的巨作,第一次接觸的話幾乎不可能順利地從頭到尾一字不落地讀完的。但書非常經典,我們還是很想仔細揣摩學習的,這時可以采取反復閱讀的策略。切記:千萬不要讓任何東西打消你的興趣。盡量堅持讀完每一章,但如果發現有一處就是看不懂,千萬不要卡住甚至就此把書丟到一邊。這時可以毫不猶豫地跳過,先盡力讀完全書,從作者的動機、背景知識、重要章節、最終結論等各方面,在整體上有一個了解。之後在回頭去看當時沒太看懂的部分,這樣避免浪費一本好書。
1.2 對比閱讀
這裏所謂的對比閱讀就是,同時讀兩三本同專題的書,從不同角度學習。這種方式適合學習一種特定的技術,而不是很大的一個方向或範圍
1.3 工具類資料
還有一類書,類似詞典等工具書,書名中一般有Handbook、大全、Cookbook之類的字眼。另外網上能找到的各種命令、快捷鍵Cheatsheet也屬於這一類。這種工具書通常會放在手邊,需要時隨手查詢一下,非常方便。比如最近發現的《Python Cookbook》就是一本不錯的工具書,對Python方方面面的語法和API都有涉及,對於一名Java為主的程序員來說還是非常實用的。
2.開源代碼
除了技術書籍,網上的開源軟件為我們提供了另一種學習方式。雖然是免費的開源軟件,但通常比較流行的開源軟件都具有工業級別的標準,所以其代碼量都不會太小。因此就跟看書是一個道理,如果不講究點策略的話,一頭紮進代碼的海洋,後果可想而知,一定是暈頭轉向、鎩羽而歸。下面就談談個人的一點經驗。
2.1 周邊環境
一個軟件當然不只包括產品的核心代碼,肯定還有編譯、打包、測試框架、運行環境等構建工具來支撐它。所以我們可以從這些外圍周邊工具入手,先整體上了解這個軟件是什麽語言、哪些依賴、如何構建和運行的等等。了解了這些來龍去脈後,再看源代碼會非常舒服。比如近期看了一些ElasticSearch的Kibana源代碼,開始看之前一無所知,於是就從外圍入手,先確定開發語言是Javascript,用了AngularJS+Nodejs的技術棧。
2.2 找到入口
了解了周邊環境和背景知識後,就可以開始讀源碼了,但首先一步是找到入口。找入口看似簡單,實則不然,就像美劇《西部世界》裏的劇情一樣,黑衣人花了一季時間還沒找到迷宮的入口。開源代碼的入口應該從Shell或其他啟動腳本找起,可以是明顯的main函數,也可能是其他指定的位置。可能是直接的加載,也可能是由操作系統內核似的Bootloader間接的加載,達到靈活或安全的目的。
2.3 抓住主線
找到了入口,遊戲才真正開始。但不要高興得太早,就像玩遊戲先玩“主線劇情”一樣,看源碼也要抓住個主線才不會迷失。開源代碼的主線就是該開源軟件的啟動過程以及之後主要操作背後所對應的代碼。在梳理這條主線時,一般可以采取下面幾種辦法:
- 調試大法好:如果有幸軟件可以跑起來或者遠程調試的話,那真是再好不過,這種方式能夠幫你快速理解復雜的邏輯。因為在調試過程中,所有變量的值你都能看到,可以說是帶著一副能直接看到變量含義的神奇眼鏡,一遍不行就再來一遍,一般不需要很多次就能對流程有不錯的理解了。
- 抽取代碼庫:邊看代碼邊敲也是一種不錯的方式,但這不是要照抄,而是梳理出核心的邏輯和結構,並且幫助自己專註地找下去,最後讀完後還能形成一個該軟件的Mini版本放到自己的代碼庫裏,也算是學習的成果。大概8年前學習Spring時就采取的這種方式,最後梳理出了一個Mini容器,最後還碰巧用到了畢業設計裏做成了一個OSGi的小動態內核,非常有趣。
- 調用鏈圖+文章記錄:如果不是什麽要保密的東西,那麽隨手畫一些調用關系圖,再寫點文字也是不錯的方式。最後整理好了,甚至還能出一個系列的源碼學習文章。
3.學術論文
有時要想了解最前沿領域的知識,就要讀一些論文。論文一般都不簡單,有背景介紹、有解決問題的創新點、設計思路、實驗驗證、結論總結等。不求完全讀懂,但要想抓住其主要思想,也是需要些方法的。《How to Read a Paper》是念研究生修一門課時,一位教授推薦的。她當時推薦我們用這篇文章方式讀論文,然後為她布置的幾篇經典論文寫summary。這裏就簡單總結一下這篇文章的主要思想——“三趟閱讀法”:
- 第一趟:這一趟只要5~10分鐘,仔細讀title、abstract、introduction,每個section忽略所有內容只讀標題,然後讀conclusion部分,最後掃一眼reference部分看看哪些是讀過的。這一趟過後,你應該對這篇論文的分類、上下文、貢獻、清晰度和正確性有個大概了解,並決定是否繼續讀下去。
- 第二趟:這一趟大概要一小時,仔細看各種圖表,標記reference裏沒讀過看似比較重要的。這一趟過後,你應該對其主要的證據有所了解,但不一定有很深的了解,因為可能論文中有你不知道的術語、縮寫、實驗或證明技術等。
- 第三趟:這一趟對於初學者可能需要4~5小時,將自己想象成這篇論文的作者,reimplement the paper,設想自己會如何寫這篇論文。然後對比當前作者的寫法,對與你的想象不一致的地方都要探究其是否正確,是否有漏掉的assumption、citation,實驗是否有哪些步驟有潛在的問題等。
http://blog.csdn.net/dc_726/article/details/77861715
技術資料的幾種讀法