學習如何理解代碼以成為更優秀的程序員
為什么一些程序員似乎有某種神奇的能力在眨眼之間從代碼中提取其意義?
為了嘗試回答這個問題,我深入到了科學所認知的我們如何理解代碼的方式中去。
事實證明,我們對代碼理解心理學 有了很多的認識,我們可以用這些知識來改善程序員的程度。它允許你拓展在理解過程中的所有方面,因此你不會在編程技巧上遇到瓶頸。
在這篇文章中,我將看看我們對于程序理解的了解,并討論了三種可使用的知識,以成為更好的程序員。
為了理解代碼你就必須構建一個心理模型
編程的***步是構建問題的 心理模型 ,以便你可以完成該任務。你的心理模型是理解問題或程序的驅動力。
從屏幕上的代碼到頭腦中的模型的旅程遵循完全理解的進程。我們對流程的理解絕非完整,但我們所知道的知識可以被用于識別要重點改進的區域。
我們來看看我們如何理解代碼。
- 你的心理模型是由通用知識和專業知識之間的配對所構成的
- 你用于理解代碼的知識或是通用的編程知識或是軟件特定知識。
通用知識包括關于計算機科學概念、編程語言、框架和編程準則的知識。大多數教程將側重于這種類型的知識 - 例如設計模式、高效 web 堆棧、已認證的企業架構、通常適用于各種解決方案的任意其他內容。專業的知識是你正在從事的特定程序或問題的知識。
形成心理模型包括將你正在閱讀的代碼與你現有的通用和專業知識關聯起來。“這是一個類,這是一個循環,這個函數是按價格過濾發票。”
這些類型的知識都可以是新的或現有的。有時你需要學習新的通用知識來解決問題。例如,輪巡調度程序的工作原理。專業知識往往比現有的更新,但是有時你將,通過與特定代碼庫的歷史記錄相關的方法,獲得您目前正在開發的程序的現有知識。
你的心理模型包含與此問題相關的通用和專業知識之間的一系列鏈接。
這些配對是通過制定、驗證和修改假設形成的
我們形成配對的方式是給出假設。
- 假設你發現你在代碼中識別的一些東西。一個提醒你一些更高層次概念的指引。“ 那個循環看起來像是一個排序 。”
- 然后,你將尋找方法來驗證這一假設。 “ 讓我們看看是否在循環中交換了這兩個項。 ”
- 之后,我們會修改假設或接受它,并開始尋找新的假設,建立在我們剛才所做的假設之上。
你可以預測某些東西究竟是什么,找到方法來證明或反證該預測,根據結果進行修改,并重復這個過程。
那么這如何有助于我們成為更好的程序員呢?
有三種方法可以使能成為更好的程序員:
你要知道理解代碼的能力取決于三件事情:
- 知識 - 解決問題的基石。
- 鏈接 - 基石之間的膠合劑。
- 假設 - 形成鏈接的工具。
很明顯,更善于編程方面需要一個整體的方法。
1. 你可以獲得更多的通用知識
由于你理解代碼的能力取決于你在現有知識和您想要解決的問題之間進行的匹配的次數,因此如此認為貌似是合理的:你用于自己工作中用到的知識越多,你就越可能獲得成功。
作為程序員,我們將自己很大一部分時間來用于獲取新知識。如果你想保持在技術世界中的同步,這是必要的。為了充分利用你的研究, 聚焦在原則而不是技術上 是很重要的。
考慮到這一點,我們來看看你可以添加到你的知識包中的知識類型:
語言相關知識
語言相關知識是許多開發人員所關注的領域。
這是關于學習你所選擇的語言或框架的細節。了解API和語言構造,找到語言中怪異行為,并明確知道其中后臺是如何工作的。
這類知識通常很容易找到好的課程和信息。
這類知識是至關重要的,每個開發人員都需要知道他的工具集內外細節。
這類知識的問題是總是有更多的知識。一個新的框架出來了。該語言的下一個版本發布了。你知道這個知識的時間越長,就變得越有價值(知道如何讀取打卡不再是一個熱門技巧了)。
編程概念
這類知識具有更長的生命期。在20年的時間里,排序算法依然是一種排序。
計算機科學學位要在這些主題上耗費大量的時間。你也將學習這些概念作為學習語言和框架的附屬品。從語言或框架中學習這些概念的問題是,有時難以將基礎概念與其在語法中的表達方式分開。
一些語言在表達某些概念時也會很好或者很糟糕。了解一些不同的框架和語言在此是有一些幫助的。另一種選擇是先學習概念,然后學習如何應用于不同的語言。找到采用這種方法的信息和課程要難得多。這些概念包括模式、算法、數據結構等等。
領域知識
了解你正在從事的行業為你提供了一套額外的用于心理建模的非編程概念。例如,了解投資工具的工作原理有助于你理解處理投資工具的代碼。
2. 你可以更善于將代碼與通用知識做匹配
一旦你有足夠的通用知識,你可以專注于更好地形成匹配規則。如果你知道在代碼和實踐中找到特定線索來識別他們,你將很快從代碼中提取意義。
學會識別代碼中的信標
代碼信標是你的代碼中的模式,暗含了一個基本概念。這些模式可以跨越不同程度的復雜性。它們是代碼的代碼片段,用于照亮更高層次概念之路。
例如,當你看到遵循此模式的代碼時:
在數組中迭代元素。基于此條件在新數組中添加元素。
你知道你正在處理一個過濾器。
將這段代碼視為“一個過濾器”,而不是“一個循環,其中包含一個 if 條件,然后將一些舊數組中的元素項放到新數組中”,這使得你可以同時在頭腦中保存更多的想法。你把一些小小的想法合并為一個更大的想法。
在傳統的軟件開發中,“模式”是指聞名的四人幫一書—— 設計模式:可重用的面向對象的軟件元素 。雖然代碼信標和設計模式是相關的,但它們并不是一個概念。例如,設計模式中也有代碼信標。
學習 Discourse 規則
discourse 規則是在框架或語言中使用的慣用法和編碼風格。就像談話中的對話規則一樣,他們在程序員的心中設定了期望。你在 Ruby 和 C# 中的對方法的名稱是不同的。Rails 充分利用了 MVC 模式,其他框架并不這樣(例如 Meteor.js )。
編寫遵循期望的 discourse 規則的代碼使代碼更容易理解。即使對專家要求亦如此。
這一點來的非常自然,你從閱讀示例代碼或你的同事那里獲得這些規則。有時候遷移到新的語言或框架時,這是值得特別留意的。這是一種在新語言中感覺更舒適的快速方式。
3. 你可以更善于建立和修改假設
***一個難題在于更善于建立和修改假設。你構建的一個可能是正確的假設越好,你就能越快建立心理模型。
使用系統方法
建立心理模型的系統方法涉及閱讀每一行代碼,并隨著代碼的閱讀,建立你的認識。它通常產生***的結果,但是對于較大的代碼庫來說很快就變得不可行。這最適合于具有可控大小的非常關鍵的代碼。我發現這在現實世界中相當少見。通常,你會與多年來已發展壯大的、龐大的代碼庫打交道。
使用機會主義方法
通過機會主義的方法,你可以查找有趣的代碼片段,形成關于它的功能的假設,然后開始深入進去,看看你是否處于正確的軌道上。在語法層面和較高級別的抽象層面上,擅長識別標識真的有助于你形成更好的假設。
相對于完全理解,這種方法并不是很好,但是你可以更快地獲得相對較好的理解。 這也很容易導致快速修復,然后破壞一些你不明白的系統的其他部分,所以要小心。
要成為***的程序員,你需要全部掌握以上三點
我們都想成為我們可以成為的***程序員。在當今技術世界中,事情一直發生變化,緊跟所有***的框架和方法論可能非常具有挑戰性。幸運的是,相比于其他程序員,你可以從本文中獲得優勢。如果你知道要尋找什么,并且可以認識到你的弱點,你可以在相同的努力付出前提下獲得更進一步和更快速的進步。
對我來說,將好的程序員與真正優秀的程序員區分開來的一直是他們對編程中的核心概念的理解。
什么樣的程序員讓你覺得杰出呢? 讓我在下面的評論中看到吧。