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