我們一直談論“寫程式碼”,但你會“讀程式碼”嗎?
程式設計,又被稱作“ 寫程式碼 ”。這個說法有可能會帶來一點點誤解,讓人覺得如何“寫”是學習程式設計要解決的主要問題。但事實並非如此。儘管最終程式碼要在鍵盤上敲出來,但這個過程在開發中的實際時間佔比可能要遠遠小於你的預期。編寫之前的 設計 ,編寫之後的 除錯 ,以及 閱讀 他人的程式碼,這些會花費比“寫”更多的時間。
關於除錯 debug,我們在上一篇文章 ofollow,noindex" target="_blank">開發5分鐘,除錯2小時 - 該如何debug? 裡已經有所介紹。今天說說另一個事情: 讀程式碼 。
為什麼要讀程式碼
讀程式碼通常有兩種原因:一是 開發過程中不得不去讀 ,二是 為了學習和提升程式設計能力 。
真實的開發中,很少有獨自開發的專案,大多數專案都是 多人合作開發 ,或多或少都需要閱讀別人的程式碼,瞭解介面和具體實現等。在軟體公司裡,你也極有可能 接手其他同事的程式碼 ,這通常不是個令人愉快的事情,但也得硬著頭皮去讀。哪怕你跟同事分工明確,耦合度極低,也沒有接手“祖傳程式碼”,那也免不了 使用一些第三方庫和框架 。當使用中遇到問題而文件和搜尋都無法解決的時候,讀其原始碼是必須的。
開發中讀程式碼大多數被動的。出於學習和提升的目的,主動讀程式碼也很有必要。這也是我們今天討論的重點:
1. 提高程式設計能力 。學習都要從模仿開始做起,不管是入門時候閱讀教程裡的示例程式碼,還是進階階段閱讀優秀專案原始碼,都是很好的學習方式。否則沒有標杆,僅憑自己悶頭寫,往往事倍功半。
2. 提高 debug 能力 。對程式碼的閱讀,本身就是一種能力,是需要練習積累的。只有能看懂程式碼,你才能快速準確地定位程式碼中的問題。
3. 良好的程式碼風格 。Python 是一門優美的語言, Readability counts (可讀性很重要)是寫在 Python 之禪 裡的。“開發”不僅要寫可以執行的程式碼,更是 要寫別人讀得懂的程式碼 ,這對程式碼的維護和擴充套件大有好處。要寫出很 pythonic 的程式碼,少不了閱讀優秀的原始碼。

4. 交流學習的機會 。閱讀別人程式碼的同時,一定也伴隨著和其他開發者的交流討論,這對一個開發者的成長是很重要的。我們的論壇和答疑群裡,有一些同學會檢視並解答其他人的程式碼問題。這個操作不僅是單純地幫助別人,對自己也是一種的提高。更進一步,你甚至可以通過閱讀程式碼參與到一些 開源專案 ,與高手交流。
如何讀程式碼
既然讀程式碼是有益且必要的,那麼該如何讀程式碼呢?這裡給幾點建議:
1. 有目的的閱讀 。對於想通過閱讀原始碼提升能力的同學,首先要明確自己的目標是什麼。雖然讀原始碼好處多多,但也不是人人都適合。在學習初期,還是應當 以系統學習為主 。否則連基本的語法、資料結構、函式、模組都還不夠熟悉,直接看程式碼只能是一臉懵逼。等到了可以讀原始碼的程度,也要選擇 適合難度的程式碼 ,以及 自己熟悉或感興趣的方向 開始閱讀, 在精不在多 。
2. 自上而下,由表及裡 。如果你想閱讀一個外部庫的程式碼,首先你應當去讀下它的文件,瞭解它解決了什麼問題,有哪些功能;然後再看看它的示例程式碼,如何被使用;最後才是開始看原始碼。閱讀的時候,先看專案的檔案結構,有哪些功能模組;再看類、函式的組織;最後再深入實現的細節。
3. 瞭解基本的設計模式 。設計模式不是具體的程式設計技術,卻普遍存在於開發之中。找本設計模式的教程學一學(推薦《Head First Design Pattern》),再閱讀程式碼,你會更容易理解別人為什麼這麼設計。
4. 選個趁手的編輯器 。你不可能用記事本或者自帶的 IDLE 來閱讀原始碼。熟練 跳轉函式定義、跳轉函式呼叫、查詢、斷點 等操作,你才能愉快地閱讀原始碼。另外說句, 摺疊程式碼 是個好功能,會讓你更清晰地觀察程式碼結構。這些 PyCharm 都可以給你,相關介紹可在 公眾號對話裡回覆關鍵字 pycharm

5. 嘗試動手修改 。看程式碼是單向的,更好的方式是邊看邊改,那怕僅僅是一些簡單的輸出也好。腦中設想下某段程式碼的作用,通過修改執行驗證你的想法,這樣的互動可以鍛鍊你對程式碼的理解。譬如我們的教程裡有個 pygame 做的打飛機遊戲 ,有些同學看了就會想,我能不能把子彈改成三排,能不能把敵機改成會左右移動等等。這樣就會比你簡單地看一遍再照抄一遍好很多。
6. 默寫,對比 。當你認為自己理解程式碼之後,把它關掉,自己實現一遍,完成後再與原始碼進行對比。很多同學跟我說過,程式碼能看懂,就是自己寫不出來。實際上,我覺得就是沒看懂:你只是看懂了每一行程式碼的意思,但並沒有 理解整個程式碼的設計 。從簡單的程式碼做起,重複這樣的過程。
讀哪些程式碼
說了那麼多,到底該讀哪些程式碼?
1. 教程裡的程式碼 。新手不要急於求成,想一口吃成個大胖子。市面上評分較高的教程書籍,裡面的程式碼都不會太差。認定一本後, 從頭到尾的示例程式碼都認真地閱讀、理解、執行(要手打不要複製) 。這是最簡單最有效的方式,然而卻並不是人人都能做到。依然有不少人寧願相信只看幾期線上視訊就能學會。
2. 看官方示例的程式碼 。大多數優秀專案都提供了詳盡的文件,包含 Quick Start、Tutorial 之類的新手引導 。在學習初期,這些程式碼就是很好的例子。比如我們之前文章 這個男人讓你的爬蟲開發效率提升8倍 裡介紹過的 requests 庫,它的文件就很清晰,還是中文的。
3. 看 Python 的內建程式碼 。如果你用 PyCharm 之類的 IDE,很方便跳轉或直接檢視 Python 自身的程式碼。比如前文截圖中就是我們常用的 random.py 的程式碼。可以從此類單檔案程式碼看起。
4. 優秀的第三方庫 。這類有很多,不過難度對初學者來說可能有一點高,可在進階時考慮。依然是推薦下大神 Kenneth Reitz 的專案,不僅僅是 requests ,例如他的 records、envoy 等小專案也是值得一讀的。另外有個經典專案叫做 500 line or less ,都是不超過 500 http:// aosabook.org/blog/
5. 關於 程式碼風格 ,先讀一讀這份指南:
https:// pythonguidecn.readthedocs.io /zh/latest/writing/style.html#code-style
-
上次我們的送書活動,徵集了大家的許多程式碼。在此列出一些還不錯的學生作品,有興趣的同學可自行關注交流:
小說閱讀微信小程式: Applet" target="_blank" rel="nofollow,noindex"> https:// github.com/moxier/BookA pplet
工程師執業證書查詢(桌面版): https:// paste.ubuntu.com/p/rV3s TfVJdp/
EOS的桌面版輔助工具: https:// github.com/oraclechain/ eosdevhelper
Python3.x+Fiddler抓取APP資料(blog裡還有其他很多不錯的文章): https:// segmentfault.com/a/1190 000015571256
Maya繫結工具集: https:// github.com/TDChina/Rigg ing-Tool
TensorFlow練習: https:// github.com/difanyi/Deep Learning
恭喜被選中的 10 位同學。也感謝其他提交程式碼同學的積極參與,這裡不一一列出。沒有被選中也不用遺憾,專案本身就是你們給自己最好的獎勵。之後我們還會有類似的活動。希望可能在下次看到你們的進步。
下課!
════
其他文章及回答:
如何自學Python |新手引導 |精選Python 問答 |如何debug? |Python單詞表 |知乎下載器 |人工智慧 |嘻哈 |爬蟲 |我用Python |高考 |requests |AI平臺
歡迎搜尋及關注: Crossin的程式設計教室