編程,,又被稱作“寫代碼”。這個說法有可能會帶來一點(diǎn)點(diǎn)誤解,,讓人覺得如何“寫”是學(xué)習(xí)編程要解決的主要問題,。但事實(shí)并非如此。盡管最終代碼要在鍵盤上敲出來,,但這個過程在開發(fā)中的實(shí)際時間占比可能要遠(yuǎn)遠(yuǎn)小于你的預(yù)期,。編寫之前的設(shè)計,編寫之后的調(diào)試,,以及閱讀他人的代碼,,這些會花費(fèi)比“寫”更多的時間。 關(guān)于調(diào)試 debug,,我們在上一篇文章 開發(fā)5分鐘,,調(diào)試2小時 - 你的問題在哪里,? 里已經(jīng)有所介紹。今天說說另一個事情:讀代碼,。 為什么要讀代碼 讀代碼通常有兩種原因:一是開發(fā)過程中不得不去讀,,二是為了學(xué)習(xí)和提升編程能力。 真實(shí)的開發(fā)中,,很少有獨(dú)自開發(fā)的項目,,大多數(shù)項目都是多人合作開發(fā),或多或少都需要閱讀別人的代碼,,了解接口和具體實(shí)現(xiàn)等,。在軟件公司里,你也極有可能接手其他同事的代碼,,這通常不是個令人愉快的事情,,但也得硬著頭皮去讀。哪怕你跟同事分工明確,,耦合度極低,,也沒有接手“祖?zhèn)鞔a”,那也免不了使用一些第三方庫和框架,。當(dāng)使用中遇到問題而文檔和搜索都無法解決的時候,,讀其源碼是必須的。 開發(fā)中讀代碼大多數(shù)被動的,。出于學(xué)習(xí)和提升的目的,,主動讀代碼也很有必要,。這也是我們今天討論的重點(diǎn): 1. 提高編程能力,。學(xué)習(xí)都要從模仿開始做起,不管是入門時候閱讀教程里的示例代碼,,還是進(jìn)階階段閱讀優(yōu)秀項目源碼,,都是很好的學(xué)習(xí)方式。否則沒有標(biāo)桿,,僅憑自己悶頭寫,,往往事倍功半。 2. 提高 debug 能力,。對代碼的閱讀,,本身就是一種能力,是需要練習(xí)積累的,。只有能看懂代碼,,你才能快速準(zhǔn)確地定位代碼中的問題。 3. 良好的代碼風(fēng)格,。Python 是一門優(yōu)美的語言,,Readability counts(可讀性很重要)是寫在 Python 之禪里的,。“開發(fā)”不僅要寫可以執(zhí)行的代碼,,更是要寫別人讀得懂的代碼,,這對代碼的維護(hù)和擴(kuò)展大有好處。要寫出很 pythonic 的代碼,,少不了閱讀優(yōu)秀的源碼,。 4. 交流學(xué)習(xí)的機(jī)會。閱讀別人代碼的同時,,一定也伴隨著和其他開發(fā)者的交流討論,,這對一個開發(fā)者的成長是很重要的。我們的論壇和答疑群里,,有一些同學(xué)會查看并解答其他人的代碼問題,。這個操作不僅是單純地幫助別人,對自己也是一種的提高,。更進(jìn)一步,,你甚至可以通過閱讀代碼參與到一些開源項目,與高手交流,。 如何讀代碼 既然讀代碼是有益且必要的,,那么該如何讀代碼呢?這里給幾點(diǎn)建議: 1. 有目的的閱讀,。對于想通過閱讀源碼提升能力的同學(xué),,首先要明確自己的目標(biāo)是什么。雖然讀源碼好處多多,,但也不是人人都適合,。在學(xué)習(xí)初期,還是應(yīng)當(dāng)以系統(tǒng)學(xué)習(xí)為主,。否則連基本的語法,、數(shù)據(jù)結(jié)構(gòu)、函數(shù),、模塊都還不夠熟悉,,直接看代碼只能是一臉懵逼。等到了可以讀源碼的程度,,也要選擇適合難度的代碼,,以及自己熟悉或感興趣的方向開始閱讀,在精不在多,。 2. 自上而下,,由表及里。如果你想閱讀一個外部庫的代碼,,首先你應(yīng)當(dāng)去讀下它的文檔,,了解它解決了什么問題,,有哪些功能;然后再看看它的示例代碼,,如何被使用,;最后才是開始看源碼。閱讀的時候,,先看項目的文件結(jié)構(gòu),,有哪些功能模塊;再看類,、函數(shù)的組織,;最后再深入實(shí)現(xiàn)的細(xì)節(jié)。 3. 了解基本的設(shè)計模式,。設(shè)計模式不是具體的編程技術(shù),,卻普遍存在于開發(fā)之中。找本設(shè)計模式的教程學(xué)一學(xué)(推薦《Head First Design Pattern》),,再閱讀代碼,,你會更容易理解別人為什么這么設(shè)計。 4. 選個趁手的編輯器,。你不可能用記事本或者自帶的 IDLE 來閱讀源碼,。熟練跳轉(zhuǎn)函數(shù)定義、跳轉(zhuǎn)函數(shù)調(diào)用,、查找,、斷點(diǎn)等操作,你才能愉快地閱讀源碼,。另外說句,,折疊代碼是個好功能,會讓你更清晰地觀察代碼結(jié)構(gòu),。這些 PyCharm 都可以給你,,相關(guān)介紹可在公眾號對話里回復(fù)關(guān)鍵字 pycharm 5. 嘗試動手修改,??创a是單向的,更好的方式是邊看邊改,,那怕僅僅是一些簡單的輸出也好,。腦中設(shè)想下某段代碼的作用,通過修改運(yùn)行驗證你的想法,,這樣的交互可以鍛煉你對代碼的理解,。譬如我們的教程里有個 pygame 做的打飛機(jī)游戲,有些同學(xué)看了就會想,,我能不能把子彈改成三排,,能不能把敵機(jī)改成會左右移動等等,。這樣就會比你簡單地看一遍再照抄一遍好很多。 6. 默寫,,對比,。當(dāng)你認(rèn)為自己理解代碼之后,把它關(guān)掉,,自己實(shí)現(xiàn)一遍,,完成后再與原代碼進(jìn)行對比。很多同學(xué)跟我說過,,代碼能看懂,,就是自己寫不出來。實(shí)際上,,我覺得就是沒看懂:你只是看懂了每一行代碼的意思,,但并沒有理解整個代碼的設(shè)計。從簡單的代碼做起,,重復(fù)這樣的過程,。 讀哪些代碼 說了那么多,到底該讀哪些代碼,? 1. 教程里的代碼,。新手不要急于求成,想一口吃成個大胖子,。市面上評分較高的教程書籍,,里面的代碼都不會太差。認(rèn)定一本后,,從頭到尾的示例代碼都認(rèn)真地閱讀,、理解、運(yùn)行(要手打不要復(fù)制),。這是最簡單最有效的方式,,然而卻并不是人人都能做到。依然有不少人寧愿相信只看幾期在線視頻就能學(xué)會,。 2. 看官方示例的代碼,。大多數(shù)優(yōu)秀項目都提供了詳盡的文檔,包含 Quick Start,、Tutorial 之類的新手引導(dǎo),。在學(xué)習(xí)初期,這些代碼就是很好的例子,。比如我們之前文章 這個男人讓你的爬蟲開發(fā)效率提升8倍 里介紹過的 requests 庫,,它的文檔就很清晰,還是中文的,。 3. 看 Python 的內(nèi)置代碼,。如果你用 PyCharm 之類的 IDE,,很方便跳轉(zhuǎn)或直接查看 Python 自身的代碼。比如前文截圖中就是我們常用的 random.py 的代碼,??梢詮拇祟悊挝募a看起。 4. 優(yōu)秀的第三方庫,。這類有很多,,不過難度對初學(xué)者來說可能有一點(diǎn)高,可在進(jìn)階時考慮,。依然是推薦下大神 Kenneth Reitz 的項目,,不僅僅是 requests,例如他的 records,、envoy 等小項目也是值得一讀的,。另外有個經(jīng)典項目叫做 500 line or less,都是不超過 500 行的小項目,,地址:http:///blog/ 5. 關(guān)于代碼風(fēng)格,,先讀一讀這份指南: https://pythonguidecn./zh/latest/writing/style.html#code-style 上次我們的送書活動,征集了大家的許多代碼,。其中也有不錯的項目,,有興趣的同學(xué)可自行關(guān)注交流: 小說閱讀微信小程序。 https://github.com/moxier/BookApplet 工程師執(zhí)業(yè)證書查詢(桌面版) https://paste./p/rV3sTfVJdp/ EOS的桌面版輔助工具 https://github.com/oraclechain/eosdevhelper Python3.x+Fiddler抓取APP數(shù)據(jù)(blog里還有其他很多不錯的文章) https://segmentfault.com/a/1190000015571256 Maya綁定工具集 https://github.com/TDChina/Rigging-Tool TensorFlow練習(xí) https://github.com/difanyi/DeepLearning 在這里恭喜被選中的 10 位同學(xué): 離島,、春虎,、小明123、木有魚丸木有粗面?,、keyliva晶,、自由民、Spartucus,、薇祎,、楊小丑、小花 也感謝其他提交代碼同學(xué)的積極參與,,這里不一一列出,。沒有被選中也不用遺憾,項目本身就是你們給自己最好的獎勵,。之后我們還會有類似的活動,。希望可能在下次看到你們的進(jìn)步。 下課,! |
|