那就是去讀別人寫的程式碼。讀那些你常用的庫、程式設計框架的原始碼,讀那些你景仰的大牛的原始碼,讀程式碼裡的測試(測試本身就是一種有效的文件);讀程式碼、改程式碼、執行程式碼。
其實,所謂寫程式,大部分的時間都是花在讀程式碼上,“寫”的部分耗時極少;所以把“讀”的技能訓練好了,是很有好處的。
作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的iOS交流群:776598941,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長! 提高程式設計能力萬無一失的辦法
編注:這篇文章最初於 2010 年 5 月為 Fuel Your Coding 網站而寫。不幸的是,那個網站已經不復存在了,所以我將這篇文章重新發布。為了緊跟時代步伐,我想過對其進行更新,但我又覺得這篇文章經得起時間考驗。經不起時間考驗的內容是有些可笑的,不管怎樣,盡情享受吧。
——-
每個人都知道,提高程式設計能力的顯著方法是寫更多程式碼。然而,我保證能夠提高程式設計能力的另一種方法卻不是寫程式碼。我會盡我所能說明這一點:
如果你想大幅提高自己的程式設計能力,你需要閱讀別人的程式碼。
不管你以前是不是這樣想的,現在你應該接受這個觀點。如果你願意嘗試一下,那麼你將會收穫頗豐。
在這篇文章中,我會幫助你選擇閱讀哪些程式碼並且給出如何閱讀程式碼的實用建議。如果你已經是一個程式碼閱讀者,你可能已經找到了一些有效的方法,否則,我覺得你應該開始閱讀程式碼。
閱讀哪些程式碼
這是一個重大的決定,也是一個很難提出建議的決定。由於閱讀什麼程式碼歸根結底與你的工作有關,所以我不會簡單的指出我認為你應該讀的具體程式碼。然而,我將會提供給你一些閱讀程式碼的參考。
閱讀你依賴的程式碼
閱讀使用的外掛或庫是一個很好的開始。
一個你真正喜歡的 WordPress 外掛
一個你發現有用的 Ruby gem
一個你一直使用的 jQuery 外掛
這些都是很好的選擇。你已經很熟悉它們的公共 API,這樣會降低對內部工作機制的理解障礙。此外,作為程式碼的使用者,你有機會新增文件、實現新功能或以某種方式為專案貢獻程式碼。
閱讀令你印象深刻的程式碼
我記得第一次看到 280 Slides 的情景,當時我告訴自己“這真的令人印象深刻”。我很快了解到它是一個由開源 Cappuccino 專案框架開發的網站,我將它牢記於心,當我再次遇到一個令人印象深刻的 app 也使用 Cappuccino 框架時,我知道我可以從這個專案中學到很多。最近令你印象深刻的是什麼?它是開原始碼嗎?如果是,那麼它將是一個很好的選擇,因為程式碼可能會與應用一樣令你印象深刻。
閱讀你崇拜的人寫的程式碼
如果你已經使用開源軟體寫了一段時間程式碼,你可能會有一些崇拜的程式設計師。我能想到幾個令人羨慕的程式碼開發者。
如果你沒有一個崇拜的開發者,你也可以很容易地找到一個。她/他很可能寫了前面兩段提到的程式碼(你依賴的程式碼、令你印象深刻的程式碼)。
閱讀你可以理解的程式碼
如果你喜歡冒險,你可能會考慮深入理解一個大型專案,如 Ruby on Rails、Drupal、或者 jQuery。我建議你目前避開這樣的專案,除非你是一個有經驗的程式碼閱讀者。
大專案包括更多模組,你可能掙扎於紛雜的概念,而沒有學到有價值的內容。困惑會使人沮喪,專案越大,越容易產生困惑,從而影響你的閱讀。閱讀小專案的好處就是你可以很快的瞭解整個程式的邏輯,這樣你就更容易集中精力發現和學習其中的細節。
如何閱讀
現在你已經選擇了要讀的程式碼,那麼閱讀程式碼的最佳方式是什麼呢?
我已經讀過很多的程式碼,我可以給出一些最大限度提高投資回報率的閱讀方法。
縱觀全域性
我認為你至少要在巨集觀層面瞭解你所讀的程式碼。如果不瞭解,建議你閱讀專案網站、教程、文件或者其它除程式碼以外的任何資料。
好了,從巨集觀層面瞭解程式碼後,我建議你第一步先了解專案的結構。這項工作的工作量取決於你所選擇程式碼的規模,任何多於一個檔案的專案都需要花一點時間。
首先注意檔案結構。這一步可以使用一個有資料夾層次結構檢視的編輯器(如 TextMate),比如,這是一個很好的Twitter Ruby gem 總覽。
這一步的目標是熟悉原始碼。找出哪些檔案包含/需要/載入其它檔案,大部分程式碼在哪,使用的名稱空間是什麼以及這類性質的內容。一旦瞭解了全域性,你就可以準備深入挖掘細節了。
記錄你的發現
閱讀程式碼不應該是個被動行為。我鼓勵你新增註釋,當開始瞭解程式流程時記錄你的假設和結論。當你第一次開始寫評論時看起來是這樣的:
1
2
3
4
5
6
I think this function is called after 'initialize'
我認為這個函式在“初始化”之後呼叫
What does this equation even do?
這個公式是做什麼用的?
Pretty sure this variable loses scope after line 17
非常確定這個變數在 17 行後失去作用域
隨著你的深入理解,你可以刪除自己的使用者評論,寫出可以反饋給專案的更有意義、更權威的評論。
使用測試,Luke(用於方便開發和診斷的第三方工具)
希望你選擇的專案有測試套件。如果沒有,你完全可以跳過這一節(或者找一個有的)。
當你閱讀別人的程式碼時,測試是一個很好的開始,因為它們記錄了程式碼應該實現的功能。有些測試比其他資訊更豐富,但是不管寫的多好,你經常會發現使用測試比執行程式碼更容易瞭解程式設計師的意圖。當你閱讀時,試著讓測試套件成功執行。這將確保你的開發環境配置正確,並將使你在進行更改時更加自信。
執行,改變內容,執行
誰說讀程式碼就不需要動手?一旦你打破一切再將它們重新整合在一起,你才開始真正明白。還記得你做過的那些測試嗎?使測試失敗,新增一些新功能,或者嘗試在不破壞的情況下改變執行。嘗試著新增一些你覺得很酷的小功能,或者設定專案範圍的日誌記錄,這樣可以在程式碼各個階段列印輸出。這還是閱讀嗎?當然,此時更像是自己在冒險,而不是看一本偵探小說。這是一件好事。
沖洗和重複
當你讀完一個程式碼庫,選擇另外一個程式碼庫重新開始這個過程。你讀的程式碼越多、讀的越好,完成的時間就越短。我想你會發現投資回報率在飛快的增長,這實際上是一種非常愉快的學習方式。
作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的iOS交流群:776598941,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!