怎樣高效閱讀原始碼?
阿新 • • 發佈:2019-01-03
寫程式碼是從模仿開始的,提高也是從觀摩別人的優秀設計和程式碼開始的。所以閱讀原始碼至關重要,接下來咱從下列方面聊聊閱讀原始碼的事兒。
- 目的
- 工具
- 知識準備
- 執行與開發環境
- 筆記
- 實用技巧
- 心理除錯(散步在各個環節)
目的
當我們閱讀面前的原始碼時,無非有以下幾種目的:
- 純粹學習
- 新增新功能
- 重構舊程式碼
- 修復他人的Bug
不同的目的會有不同的心情,會影響到工作的進展,像修復他人的Bug這種事情,類似於沒被掰彎的男猿捏著鼻子給另外一個男人擦屁股,是很噁心的,很容易讓人拒絕的。所以因這種目標而閱讀原始碼,往往是欲拒還迎、欲說還休,效率較低。然而修復實際工作中幫別人修復Bug這種情形,十有八九你要遇到,無可逃避。所以,心理除錯很重要。
為了學習去讀原始碼,這是最愉快的最放鬆的。不過提醒一點,設定可檢驗的目標才會有收穫,否則就會像走到大街上看見一美女擦肩而過那樣,驚豔一下下,過後嘛關係嘛收穫也沒了。
其他的目的,重構舊程式碼、新增新功能,比幫別人擦溝子(陝西話,屁股)略強,因為他帶有創造性,創造性的活動能給人帶來強烈的愉悅,所以雖然這兩種目的也有很多讓人不爽的部分,不過想到我可以讓一棵老樹煥發青春,不爽也就慢慢弱下去了。
工具
工欲善其事必先利其器,這是亙古不變的道理。要很好的完成閱讀原始碼的任務,我們大概需要下列這些工具:
- SourceInsight,最好的原始碼瀏覽工具,它能維護符號庫,動態顯示上下文,還能繪製呼叫關係圖,最好的,沒有之一
- 紙質筆記本,隨時記錄心得和疑惑,隨時繪製各種圖(類圖、時序圖、框圖),比UML工具快,也比Visio快
- 中性筆
- 記事本、Notepad++、有道雲筆記、為知筆記等,記錄閱讀原始碼過程中的關鍵點、心得體會、分析過程
- Visio,用於繪製簡單的框圖,表述原始碼的模組劃分、層次結構等
- StartUML,用於最後繪製類圖、時序圖等,方便交流
- 掃描全能王(CamScanner),一款可以通過拍照達到掃描效果的App,可以用它掃描你在紙質筆記本上寫下的文字,繪製的框圖,分享給其他人,如果你懶得用軟體繪製圖標,那手繪之後掃描成電子檔就最適合你了
知識準備
前戲很重要,準備好了後面水到渠成快感不斷,否則就會頻頻受挫直感道阻且長。
- 業務基礎,每一份有實際意義的原始碼都離不開業務,必須先對業務有概念
- 技術基礎,這個原始碼用什麼語言,什麼框架,什麼第三方模組,都需要先有所瞭解
- 文件,儘量找到業務、需求、概要、詳細等文件,幫助會很大,然而,我們經常面臨的情況是,只有原始碼,只有原始碼,只有原始碼,片言隻字的文件也無,所以只好堅信——原始碼是最好的文件。這個心理門檻兒其實也容易過,你就想像著原始碼只是神仙姐姐的畫像,看再多畫像也不抵當面一眼效果強大——要麼摧毀三觀要麼魂牽夢縈
- 人,搞明白哪個程式設計師維護過這份程式碼,方便後面不懂時請教,有時人家點一下頂你自己瞎琢磨一天
執行與開發環境
- 配置好開發環境,目的是為了除錯,對有些程式設計師來講,除錯是弄明白軟體內部機理的最好方法,按著F5、F10、F11、F9,一切都搞定了
- 配置好執行環境,為使用軟體、體驗軟體做準備,從使用者角度,從外面看看軟體到底是怎麼回事,便於揣摩內部邏輯
筆記
在閱讀原始碼的過程中,做筆記是必須的。我有這樣的體會,因為程式碼不是自己寫的,很難很快在腦子裡刻下印記,經常是看著這裡忘了那裡,早上覺得弄懂了資料流向,中午吃個飯就忘了。所以,筆記就顯得尤為重要。
- 找到適合你的記錄方式,小本本、軟體皆可。用軟體(Notepad++、有道筆記、為知筆記等)來記錄有個壞處——必須切換螢幕,會在形式上中斷程式碼閱讀過程。所以我經常在緊張得不能中斷時隨手用筆寫些斷句殘章在本子上,告一段落時梳理下用軟體再記錄。
- 儘可能詳細的記錄,但不必看到什麼記錄什麼,要間隔性的記錄,比如弄明白了某個子模組的邏輯、某個類的作用、某些函式的呼叫關係時再記錄,否則記錄這個動作本身會打斷思考
- 每天工作結束,記錄進度(弄明白的部分),記錄疑問,記錄第二天要弄明白什麼東西,這樣你的工作狀態就入棧了,第二天來了很容易出棧,快速進入工作狀態
- 記錄看到的優秀設計,提高審美,見賢思齊,自我成長
滄海遺珠
我在漫長的讀碼生涯裡積攢了一些的經驗,算是碎碎念,供參考:
- 理清某一業務如何對映在程式碼執行流程上的,這點很關鍵。
- 理清不同模組間的業務關係,程式碼呼叫關係,很關鍵
- 除錯是弄明白程式碼呼叫流程的最快方式,之一
- 找出關鍵程式碼(代表實際物件的類、銜接不同模組的類、代表業務關鍵節點的類)
- 分析日誌可以幫助分析程式碼執行流程和業務流程
- 先用已有的可執行軟體,體驗業務,琢磨你點這裡一下點那裡一下程式碼可能是怎麼做出反應的
- 閱讀應該圍繞目的,把實現目標放在第一位,比如修改Bug,如果有期限,在最後日期前搞定是第一要務,然後有時間就繼續讀原始碼或改進Bug修復方案,力求沒有副作用和後遺症,再有時間就修修別人留下的破窗戶(你也可以順帶鄙視下前任維護者)
- 千萬次的問,還記得前面說要弄明白誰維護過你要讀的程式碼吧,別不好意思,問吧,問吧,問吧
- 對著設計文件、介面文件或測試用例看程式碼
- 心理除錯,勿畏難,別放棄。我有時看程式碼,看兩天也不知道看了個甚,一頭霧水兩眼發花是常有的事兒,有時真是覺得搞不定了,然而,這要麼是你基礎知識沒準備好,要麼是你找錯了入口,要知道,任何一份程式碼,都有一條隱形的線串著,耐心點,總會找到。這樣不行就那樣,多換換角度,多換換方法,讀不行,就除錯,除錯不行,就執行,執行不行,就研究日誌,都不行,我靠,while(!i.isDead())i.analyzeCode(),跟Y死磕!總之,你不放棄自己,就沒人能放棄你!
- 給自己設定小獎勵,弄明白某個邏輯或某個模組的程式碼後獎勵自己休息一下,5~10分鐘,走出辦公室轉轉,或者乾脆在網上瞎逛一下,瀏覽自己喜歡的網站
- 讀不懂才要讀,想不明白才要想,這是進步和成長的開始。那些阻擋你的蹂躪你的而殺又不死你的,終將幫助你成長讓你變得更強大