读源码,对程序员重要吗?
來源:?CSDN(ID:CSDNnews)?
嘿,朋友們!本文我將分享一些關于主動閱讀和研究源碼的一些想法。在我看來,閱讀源碼能夠幫你成為一名更專業的開發人員。毫無疑問的是,閱讀源碼提高了我的軟件開發水平。
應該閱讀源碼嗎?
是的,你應該這么做!
好消息是,你日復一日開發軟件時已經在這么做了。多年來,我看到各種統計數據表明,開發人員大多數時間都花在了閱讀代碼上,而非寫代碼上。
當你要開發一個新功能或者修復一個 BUG 時,你必須要先理解現有代碼的邏輯。你可以通過閱讀單元測試來了解代碼的邏輯,因為單元測試應該能夠清楚地表達代碼行為期望,但是通常我們還是要深入到具體的代碼實現中去分析。
本文將給出一個推薦的源碼閱讀形式。我在這里推薦大家要主動閱讀源碼,特別是閱讀那些從未見過的源碼。因為和從未見過的代碼相比,閱讀自己曾經編寫的代碼對我們技能的提高幫助不大。
如果你能夠更好地閱讀和分析源碼,你以后就能更從容地編寫新功能和解決 BUG。你可以通過閱讀有關代碼,快速獲取工作所需的信息。正如我們可以訓練自己更快閱讀書籍一樣,我們也可以訓練自己更快地閱讀和理解源碼。
為什么要花時間閱讀源碼
讓我們先思考孩子是如何學習讀寫的。在 Caroline Linse 寫的《少年學習者》中,她說你能寫出一個單詞的前提是你之前讀過它。在我看來,這聽起來很合理。首先通過在上下文中閱讀到單詞,然后你開始理解它們的含義并學會正確地使用。
讀書可以拓展你的閱讀量,學到將來可能用在寫作中的技巧。這也是我們為什么要在學校里學習文學的原因。最終,隨著我們讀的越來越多,我們有了辨識能力,知道哪些是更有用。
對軟件代碼來說也是如此。我是一個 C# 程序員,但是不管你是什么編程語言的開發者,每種編程語言都會有很多語法和關鍵字。你可以將這些簡單的關鍵字和概念,可以合在一起編碼出無限種可能性。有很多方法可以實現同樣的效果,就像有很多方式表達出同樣的含義一樣。雖然從技術角度而言,不同的代碼都可以實現同樣的效果,但是有些方法卻比其他方法更適合。通過閱讀源碼,我們會發現,有些方案可能比其他方案更有效。
不知道你有沒有遇到過自己的同事甚至自己編寫過難以閱讀的代碼?反正我有遇到過。難以閱讀的代碼很難維護,并且會影響開發進度。正如在語言中,段落結構不合理很容讓人感到困惑,難以理解,代碼也是如此。很多難以理解的段落或代碼需要反復閱讀才能理解其真正含義或意圖。我們可以通過的源碼提高編碼水平,從而避免編寫出難以理解的代碼。
提高技能需要刻苦地努力。學習那些比你工作經驗更豐富的人的代碼將會給你未來的工作編碼帶來幫助。舉個例子,醫生通過多年的培訓才能擁有行醫資格。這些醫生最初和經驗豐富的老醫生一起工作,先觀察模仿,然后才能獨立工作。頂尖的醫生也會主動學習他們專業領域的論文,從中學習新的技術和方法。
就上述描述而言,我認為軟件開發領域做的不夠。有些團隊相對做得更好一些。結對編程和 Mob 編程(3 個或 3 個以上程序員一起編程)只是開發人員共享技能的方式之一。另外一個提高自己技能的途徑是定期接觸新的代碼,并能夠堅持下去。
在這個問題上我可以直言不諱嗎?如果你沒時間閱讀,你就沒時間寫作,就這么簡單。
?― 史蒂芬·金, 《寫作這回事: 斯蒂芬·金創作生涯回憶錄》
?
應該閱讀哪些源碼?
如果你認可我的上述觀點,我希望你能接受將閱讀源碼當做日常工作的一部分的理念,以便可以通過閱讀源碼不斷提高技能。
下一個問題就是你該讀哪些源碼?
從宏觀上講,我認為這個問題不重要,重要的是你有沒有去閱讀源碼。請記住,并不是所有的軟件代碼都生來平等。你閱讀一些源碼會明顯比閱讀另外一些源碼效果更好,但是不管好源碼還是壞源碼都可以幫助我們提高編碼能力。
這并不是說你必須贊同你閱讀的所有代碼。閱讀“糟糕”的代碼也可以給我帶來一些啟示。如果你在閱讀一些代碼的過程中發現了自己不喜歡的風格或者讀到了沒啥用的方法,同樣也可以節省我們自己的編碼時間,因為我們可以避免犯同樣的錯誤。
也就是說,你需要閱讀代碼來補充一些新的、更靠譜的實踐方式(下面一節將講述如何尋找源代碼)。
閱讀的源碼的多樣性至關重要,因為這將有助于你有意識(潛意識)地學習不同來源的模式。當你在不同的地方看到相同的方法、模式和編碼趨勢時,說明它更可信。
我把時間花在研究我經常使用的 C# 代碼庫的源碼上。通過這種方式,不僅提高了我閱讀代碼的能力,還幫我更好的了解庫函數的內部工作原理,進一步幫助我更好地使用它們,可謂是一箭雙雕。
雖然我也不是經常這么做,但是我打算嘗試閱讀一些我很少或者從沒有用過的編程語言代碼。精通一門編程語言非常有用,但是拓展自己的語言范圍也有諸多好處。如果你仔細思考下會發現,很多人學習第二種甚至第三種語言,并能夠從中受益。他們和其他國家的人交流起來會非常容易,而且通過對其他語言的學習,又反過來促進了母語的學習和使用。
學習第二種編程語言不僅能夠拓寬你的職業選擇,而且還能讓你注意到它和自己主要編程語言的異同。我們經??吹揭环N編程語言的特性會影響到另外一種編程語言。例如 C# 中越來越多的函數式語法,首先出現在 F# 的每個版本中。一些 .NET 的特性如 Channel 就受到了 Go 語言的影響。我們可以通過關注第二個編程語言來預先學習這些特性。
?
在哪里找優秀的源碼
有很多潛在的源碼來源。
GitHub
這里幾乎擁有所有編程語言的源碼。那么要從哪里入手呢?我個人更喜歡先學習微軟的 ASP.NET Core 和 CoreFx庫。我發現深入研究框架團隊的高質量代碼是一個很好的學習方法。
這些框架是非常好的學習資源,因為它們的代碼的質量很高,而且從中也可以瞥見微軟編碼模式的影子。通過閱讀和學習團隊如何構建可拓展的框架代碼,我個人收獲很大。最近我花了一些時間思考任務并行庫,在我編寫的一些代碼中發現了很多關于 CancellationTokenSource 的用法。通過學習微軟的源碼,我學到他們相關的常見用法。
GitHub 提供了很好的源碼搜索功能,你甚至不需要下載代碼就可以在瀏覽器中學習源碼。如果你想深入學習,我更傾向于建議你將源碼克隆到本地,這樣學習起來更方便。
我還喜歡通過閱讀我使用的庫的源碼如 Polly 和 MediatR來拓展我可以使用的功能。這讓我接觸到了其他的編程風格,幫助我加深對編碼的理解。我并不是都喜歡或者贊同所閱讀的源碼,但是閱讀源碼有助于幫助我了解自己的編碼習慣。通過閱讀源碼,我會更有意識地主動避開潛在的陷阱和糟糕的設計。
博客文章
網上有很多軟件開發相關的優秀文章。你肯定可以找到帶有示例代碼的技術博客。因為這些文章的代碼通常比較短小,所以更容易在短時間內理解消化。通常,博客配套的代碼作者也會給出注釋或者解釋,你可以先對代碼進行分析然后和作者的意圖進行比對。
圖書
有很多經典的技術圖書,包括電子版和紙質版。這兩種圖書都會包含一些源碼。去年我就通過閱讀Konrad Kokosa 寫的《深入 .net 內存管理》學到了很多編寫高性能代碼的知識。
StackOverFlow
你肯定在 StackOverFlow 上看過一些優秀的和普通的代碼示例。在這里可以很容易地搜索問題和答案,可以學習到不同的編碼風格,可以得到各種參考意見。如果想了解更多代碼相關內容,可以去?代碼審查區?學習。
內部資源
前面我講過,讓自己接觸之前沒見過的代碼對讀源碼至關重要。我想補充的是,你還可以通過學習工作代碼庫中自己很少參與的項目來提高編碼能力。可以花點時間去理解這些代碼,搞懂他們的工作原理。如果有一天需要你去支持這些項目,你可能比源作者更熟悉這些代碼。
當你加入一個新的團隊時,你可以通過學習團隊現有的代碼來快速了解編碼規范和常見的模式。這將加快你融入團隊的速度,促進你的個人發展。
這不是一個非常詳細的清單。不管你在哪里找源碼,都應該花費更多的時間去深層次閱讀和學習。用這種方式投入時間來提高開發技能非常值得。
如何閱讀源碼?
關于閱讀源碼,每個人都會有自己的喜好。按照你認為正確的方式去做就好了。在這里,我會分享自己的閱讀源碼的方法,你可以借鑒這些方法開啟自己的源碼閱讀之旅。
通常我會將重點放在那些想學習的編碼風格的源碼或者那些能夠加深我對編碼知識的理解的源碼上。正如前面我講到的,這種投資將會得到豐厚的回報。
我通常會從 GitHub 上找源碼。我會集中精力理解代碼的意圖。我會嘗試從一個高抽象的函數作為出發點,然后逐步深入到內部。在學習代碼時,我喜歡用 OneNote 做筆記,記錄代碼的流程。這些都是比較簡單的筆記。這個過程與其說是在積累參考資料,不如說是幫我加深記憶和理解。通過將源碼轉為書面描述,我的印象更加牢固,對知識點的理解也會更好。
瀏覽代碼并在心中形成一個邏輯圖是一個非常棒的技能。如果你能夠在閱讀源碼過程中培養出這種能力的話,下次你修復 BUG 時將會更加順利。
一旦我對源碼有個一個整體的了解,我將會更深入地研究下去。接下來,我會將源碼克隆到本地并將其導入到 IDE 中??梢允褂?IDE 的代碼導航功能快速在源碼中切換,進一步深入研究源碼。此時,我會去思考作者這樣寫代碼的原因是什么。我喜歡先自己去思考,然后和作者的實際代碼進行對比。我會思考:像作者這么寫法會更好、更有效?下次如果我也遇到類似的場景,要不要參考他的寫法?
在閱讀源碼的過程中,我會發現自己編碼時從未用到的 API。我發現當我編碼時,我會傾向于使用自己已經熟悉的 API,但這可能并不是最佳的實現方式。有時候正是因為我們不知道還有其他選擇,所以才繼續使用已經熟悉的 API。閱讀源碼的過程中,如果遇到我從未用過的 API,我會查看它的描述和方法簽名來了解它的用途。
閱讀源碼還提高了我使用 IDE 工具的能力。在瀏覽代碼時,我會發現一些技巧或學會一些實用的快捷鍵,從而節省了很多時間。我還經常會把一個類拖到第二個顯示屏的一塊屏幕上,這樣可以快速跟蹤代碼流。我寫代碼的時候也會經常這么做。?讀源碼時我也會努力學習自己不熟悉的語言特征或模式。通過閱讀源碼我快速掌握了 C# 的新特性。
如果有些代碼理解不了怎么辦?
莫慌,這絕對沒問題。剛上來,你不可能理解自己讀到的所有源碼。而且有些不理解,這正是我們想要的效果。你就應該讀新的代碼或者包含新語法的代碼,來提升自己的編碼技能。閱讀容易理解的代碼,就像閱讀一本非常簡單的書一樣,對你的幫助并不大。
你應該在大腦中嘗試將代碼拆分成小部分。思考這些代碼是為了實現什么功能,為什么要這么寫?作者是否用了一個方法解決了一個你從未思考過的問題?當你遇到某個語法不理解或者某個關鍵字不懂時,請停下來搜索幫助文檔。有了實際的使用場景,再去查幫助文檔理解就會更好一些。
如果你遇到從未用過的框架 API 時,如果有代碼文檔,可以查看代碼文檔。對于所有的微軟庫,公共方法都會包含 XML 注釋。你可以直接閱讀這些注釋也可以通過訪問.NET API 文檔?來查詢。
有意識的主動閱讀源碼的意義在于,這是你你主動分配自己的時間,為自己技能投資。而不是在工作中面臨最后期限,要完成各種功能,還要修復各種 BUG。這樣你將很少有精力去學習自己直接使用的代碼之外的源碼。這種情況對學習沒啥幫助。
我從源碼中學到了什么?
我從源碼中學到了很多東西,這也是為什么我不遺余力地推薦大家學習源碼。現代的手藝人會經常研究自己領域大師的作品,以期有朝一日能夠達到他們的水平。開發人員也可以像他們一樣向自己領域的專家學習來提高自己的技能。
就我個人而言,作為一個 .NET 開發人員,我發現學習微軟的 .NET Core 和 ASP.NET Core 源碼非常有價值。微軟有很多優秀的開發人員,他們對語言或運行時特定知識的掌握更加專業。
我是一名自學成才的開發者,最近在 Twitter 上看到有人這么說(不過,我記不住他是誰了)。我通過各種嘗試和各種錯誤中學習了 C#,并且我會主動學習源碼。正如很多學者們研究偉大的文學作品一樣,通過閱讀偉大的代碼,可以解鎖很多秘密。
我向那些對軟件設計感興趣并且希望深入了解 .NET Core 框架的人推薦一個資源,該資源可以從 YouTube 上獲取。.NET 團隊每周會在 YouTube 上發布他們的 .NET 設計評審。在這些會議上,團隊會審查對 ?.NET Core 的 API 變更的提議。我建議選擇性觀看這些會議,對于一些人來說用自己的時間去看會議可能有些太過“極客”,但這仍然是一個非常的學習途徑。這個團隊是由真正專家組成的,他們對語言、運行時和框架了如指掌,讓人震驚。通過觀看他們對提議的 API 的討論,可以幫助我們理解一個廣泛使用的框架必須考慮的問題。通過觀看這些視頻,我經??梢垣@得一些非常有價值的觀點。
總結
我寫這篇文章的主要目的是鼓勵一些讀者更加主動地閱讀和學習源碼。通過閱讀源碼,我學到了更多 C# 語言和 .NET Core 框架的知識,幫助我成為一名更優秀的開發者。定期投資幾個小時來閱讀源碼,將在未來帶來豐厚的回報。通過閱讀源碼,你將對不同的編碼風格和技術有自己的看法。你將從更深的層次上了解你平時所用的框架的工作原理,反過來又促進你更好的使用它。你將可以更快地閱讀源碼,從而幫助你縮短從需求到編碼完成的時間。
原文:https://www.stevejgordon.co.uk/become-a-better-developer-by-reading-source-code
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的读源码,对程序员重要吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络(CNN)介绍
- 下一篇: chrome网页另存pdf_如何在Goo