為什么你在寫代碼時總會遇到這樣或那樣的問題?為什么你總是記錯某些語法?為什么有些人能夠快速學(xué)會新的編程語言,而有些人則不能?在試圖解決困難或復(fù)雜的問題時,我們的大腦其實(shí)有一套特定的工作方式。本書從認(rèn)知科學(xué)角度剖析優(yōu)秀程序設(shè)計背后的腦科學(xué)原理,為你揭開大腦思考編程的奧秘。本書分為四大部分,共有13章。你將了解如下內(nèi)容:如何高效地學(xué)習(xí)新的編程語言,如何快速地理解復(fù)雜的代碼,如何牢固地記住各種語法,如何在繁雜的程序設(shè)計工作中優(yōu)化認(rèn)知資源。
本書是程序員的普適書,初學(xué)編程的初高中生也可以閱讀。
隨著ChatGPT橫空出世,作為程序員的你是否已經(jīng)有了危機(jī)感?在自己編寫代碼和理解他人所寫代碼這兩個方面,人工智能是否已經(jīng)超越了人類程序員?無論人工智能如何“進(jìn)化”,有一點(diǎn)是它無法取代的,那就是人類程序員的超強(qiáng)大腦。本書是專為程序員而寫的大腦使用指南,旨在幫助程序員用好自己的認(rèn)知優(yōu)勢。
本書作者指出,程序設(shè)計是一個認(rèn)知過程,這個過程對程序員的認(rèn)知要求頗高。因此,本書從認(rèn)知科學(xué)的角度幫助程序員了解大腦工作機(jī)制,從根本上提高程序設(shè)計工作的效率。
本書特點(diǎn)
●有助于理解大腦如何加工與代碼相關(guān)的信息。
●內(nèi)容組織符合認(rèn)知模式:代碼閱讀、代碼思考、代碼編寫、代碼協(xié)作。
●助你醍醐灌頂,實(shí)現(xiàn)更快的代碼讀寫速度、更高的工作效率、更少的返工。
●以Python、JavaScript、Java等為例,但原理對所有語言適用。
【作者簡介】
費(fèi)莉安·赫爾曼斯(Felienne Hermans),荷蘭萊頓大學(xué)副教授,致力于研究人類如何利用認(rèn)知科學(xué)快速、有效地學(xué)習(xí)程序設(shè)計語言。費(fèi)莉安對ChatGPT給軟件工程領(lǐng)域帶來的深遠(yuǎn)影響有獨(dú)到見解,多次就這一話題接受媒體專訪。她是TC39(JavaScript標(biāo)準(zhǔn)委員會)成員,還自創(chuàng)了Hedy程序設(shè)計語言。
【譯者簡介】蔣楠
出身電子與計算機(jī)工程專業(yè)的高級技術(shù)產(chǎn)品經(jīng)理,負(fù)責(zé)C端產(chǎn)品的規(guī)劃和設(shè)計,對算法和數(shù)據(jù)密集型應(yīng)用同樣興趣濃厚。兼具科技圖書譯者、馬拉松跑者、航天愛好者等多重身份,譯作包括《計算機(jī)簡史(第三版)》《計算機(jī)科學(xué)精粹》等。
第 一部分 代碼閱讀
第 1章 剖析程序設(shè)計之惑 2
1.1 代碼造成的各種困惑 2
1.1.1 第 一種困惑:缺乏知識 3
1.1.2 第二種困惑:缺乏信息 4
1.1.3 第三種困惑:缺乏加工能力 4
1.2 影響程序設(shè)計的不同認(rèn)知過程 5
1.2.1 長時記憶和程序設(shè)計 5
1.2.2 短時記憶和程序設(shè)計 6
1.2.3 工作記憶和程序設(shè)計 7
1.3 認(rèn)知過程之間的關(guān)系 8
1.3.1 簡要剖析認(rèn)知過程如何相互作用 8
1.3.2 編程任務(wù)涉及的認(rèn)知過程 9
1.4 小結(jié) 10
第 2章 快速閱讀代碼 12
2.1 快速閱讀代碼 13
2.1.1 大腦的活動情況 14
2.1.2 回顧默寫的代碼 15
2.1.3 回顧第二次默寫的代碼 16
2.1.4 閱讀不熟悉的代碼時為什么會感到困難 16
2.2 彌補(bǔ)記憶容量不足的短板 17
2.2.1 組塊威力大 18
2.2.2 資深程序員比新手程序員更善于記憶代碼 21
2.3 看到的代碼比讀到的代碼多 22
2.3.1 圖像記憶 22
2.3.2 不是記憶的內(nèi)容,而是記憶的方法 24
2.3.3 代碼分塊練習(xí) 30
2.4 小結(jié) 31
第3章 快速學(xué)習(xí)編程語法 32
3.1 語法記憶小貼士 32
3.2 如何利用抽認(rèn)卡快速學(xué)習(xí)語法 34
3.2.1 使用抽認(rèn)卡 34
3.2.2 擴(kuò)充抽認(rèn)卡 35
3.2.3 精簡抽認(rèn)卡 35
3.3 如何避免遺忘 36
3.3.1 遺忘的原因何在 37
3.3.2 間隔重復(fù) 38
3.4 如何牢記編程語法 39
3.4.1 記憶信息的兩種機(jī)制 39
3.4.2 “眼見”還不夠 40
3.4.3 主動回憶能夠鞏固記憶 41
3.4.4 主動思考也能鞏固記憶 42
3.5 小結(jié) 44
第4章 閱讀復(fù)雜的代碼 45
4.1 為什么復(fù)雜的代碼難以理解 45
4.1.1 工作記憶與短時記憶的區(qū)別 46
4.1.2 與程序設(shè)計相關(guān)的3種認(rèn)知負(fù)荷 47
4.2 減輕認(rèn)知負(fù)荷的方法 49
4.2.1 重構(gòu) 50
4.2.2 替換不熟悉的語言結(jié)構(gòu) 51
4.2.3 在抽認(rèn)卡兩面寫上等價的代碼可以顯著增強(qiáng)學(xué)習(xí)效果 54
4.3 利用記憶輔助工具解決工作記憶過載的問題 54
4.3.1 繪制依賴圖 55
4.3.2 創(chuàng)建狀態(tài)表 57
4.3.3 結(jié)合使用依賴圖和狀態(tài)表 59
4.4 小結(jié) 61
第二部分 代碼思考
第5章 深入理解代碼 64
5.1 變量角色框架 65
5.1.1 變量不同,承擔(dān)的任務(wù)也不同 65
5.1.2 涵蓋大多數(shù)變量的11種角色 66
5.2 角色和范式 68
5.2.1 角色的優(yōu)點(diǎn) 68
5.2.2 匈牙利命名法 70
5.3 加深對程序的了解 72
5.3.1 文本結(jié)構(gòu)知識與計劃知識 72
5.3.2 程序理解的不同步驟 72
5.4 閱讀代碼和閱讀文本有相似之處 75
5.4.1 閱讀代碼時大腦的活動情況 76
5.4.2 能學(xué)會法語,就能學(xué)會Python 77
5.5 運(yùn)用文本理解策略來閱讀代碼 80
5.5.1 激活先驗知識 81
5.5.2 監(jiān)測 82
5.5.3 確定不同代碼行的重要性 83
5.5.4 推斷變量名的含義 84
5.5.5 視覺化 85
5.5.6 提問 86
5.5.7 摘要 86
5.6 小結(jié) 87
第6章 更好地解決編程問題 88
6.1 借助模型來思考代碼 89
6.2 心智模型 91
6.2.1 詳細(xì)剖析心智模型 92
6.2.2 學(xué)習(xí)新的心智模型 93
6.2.3 如何運(yùn)用心智模型提高代碼分析的效率 94
6.3 概念機(jī)器 98
6.3.1 概念機(jī)器的定義 99
6.3.2 概念機(jī)器的例子 99
6.3.3 概念機(jī)器適用的不同層面 100
6.4 概念機(jī)器和語言描述 101
6.4.1 概念機(jī)器可以擴(kuò)展 102
6.4.2 不同的概念機(jī)器可能催生出相互矛盾的心智模型 103
6.5 概念機(jī)器和圖式 104
6.5.1 圖式的重要性 104
6.5.2 概念機(jī)器是否具有語義性 105
6.6 小結(jié) 105
第7章 迷思概念:錯誤的思維方式 106
7.1 為什么學(xué)習(xí)第二門編程語言比學(xué)習(xí)第 一門編程語言更容易 107
7.1.1 充分挖掘現(xiàn)有編程知識的潛力 108
7.1.2 不同的遷移類型 109
7.1.3 已經(jīng)掌握的知識:是福還是禍 110
7.1.4 遷移有難度 111
7.2 迷思概念:思維中存在的錯誤 113
7.2.1 通過概念轉(zhuǎn)變來消除迷思概念 114
7.2.2 抑制迷思概念 114
7.2.3 與編程語言有關(guān)的迷思概念 115
7.2.4 在學(xué)習(xí)新的編程語言時避免形成迷思概念 117
7.2.5 判斷代碼庫中存在的迷思概念 118
7.3 小結(jié) 118
第三部分 代碼編寫
第8章 提高命名的質(zhì)量 120
8.1 命名為什么重要 121
8.1.1 命名的重要性何在 121
8.1.2 與命名有關(guān)的不同觀點(diǎn) 122
8.1.3 最初的命名實(shí)踐影響深遠(yuǎn) 124
8.2 從認(rèn)知的角度剖析命名 125
8.2.1 規(guī)范的命名方式對短時記憶有利 126
8.2.2 含義明確的標(biāo)識符對長時記憶有利 127
8.2.3 標(biāo)識符可以包括不同類型的信息以幫助理解 127
8.2.4 評估標(biāo)識符質(zhì)量的時機(jī) 129
8.3 哪些類型的標(biāo)識符更容易理解 129
8.3.1 是否應(yīng)該使用縮寫 129
8.3.2 采用駝峰命名法還是蛇形命名法 133
8.4 標(biāo)識符與代碼錯誤之間的關(guān)系 134
8.5 如何設(shè)計質(zhì)量更高的標(biāo)識符 135
8.5.1 名稱模具 135
8.5.2 運(yùn)用Feitelson設(shè)計的三步模型來提高標(biāo)識符質(zhì)量 138
8.6 小結(jié) 139
第9章 避免低質(zhì)量代碼和認(rèn)知負(fù)荷:兩種框架 140
9.1 為什么存在異味的代碼會加重認(rèn)知負(fù)荷 140
9.1.1 代碼異味簡介 141
9.1.2 代碼異味對認(rèn)知的負(fù)面影響 144
9.2 低質(zhì)量標(biāo)識符對認(rèn)知負(fù)荷的影響 146
9.2.1 語言反模式 146
9.2.2 認(rèn)知負(fù)荷的測量 147
9.2.3 語言反模式和認(rèn)知負(fù)荷 151
9.2.4 語言反模式為什么令人困惑 152
9.3 小結(jié) 152
第 10章 提高解決復(fù)雜問題的能力 153
10.1 問題解決的實(shí)質(zhì) 153
10.1.1 問題解決的三大要素 153
10.1.2 狀態(tài)空間 154
10.2 長時記憶在解決編程問題時所起的作用 155
10.2.1 問題解決本身是否屬于認(rèn)知過程 155
10.2.2 培養(yǎng)長時記憶來解決問題 157
10.2.3 解決問題時起作用的兩類記憶 157
10.3 自動化:構(gòu)建內(nèi)隱記憶 160
10.3.1 內(nèi)隱記憶會隨著時間的推移而變化 161
10.3.2 為什么自動化可以加快編程速度 163
10.3.3 強(qiáng)化內(nèi)隱記憶 164
10.4 從代碼及其解釋中汲取經(jīng)驗 165
10.4.1 第三種認(rèn)知負(fù)荷:關(guān)聯(lián)認(rèn)知負(fù)荷 166
10.4.2 在工作中運(yùn)用樣例 168
10.5 小結(jié) 169
第四部分 代碼協(xié)作
第 11章 編程活動和任務(wù) 172
11.1 程序設(shè)計包括不同的編程活動 172
11.1.1 搜索活動 173
11.1.2 理解活動 173
11.1.3 轉(zhuǎn)寫活動 174
11.1.4 遞增活動 174
11.1.5 探索活動 174
11.1.6 為什么符號認(rèn)知維度框架不包括調(diào)試活動 175
11.2 受到干擾的程序員 176
11.2.1 編程任務(wù)需要“預(yù)熱” 176
11.2.2 思路被打斷的后果 177
11.2.3 如何減輕干擾的影響 177
11.2.4 限制干擾出現(xiàn)的時機(jī) 180
11.2.5 關(guān)于多任務(wù)處理的一些思考 182
11.3 小結(jié) 183
第 12章 設(shè)計和改進(jìn)大型系統(tǒng) 184
12.1 代碼庫的屬性 185
12.1.1 認(rèn)知維度 185
12.1.2 利用代碼庫認(rèn)知維度來改進(jìn)代碼庫 193
12.1.3 設(shè)計策略及其權(quán)衡 194
12.2 認(rèn)知維度和編程活動 196
12.2.1 認(rèn)知維度對不同編程活動的影響 196
12.2.2 針對預(yù)期的編程活動優(yōu)化代碼庫 197
12.3 小結(jié) 198
第 13章 對新程序員進(jìn)行適崗培訓(xùn) 199
13.1 適崗培訓(xùn)中存在的問題 199
13.2 高級程序員與初級程序員的區(qū)別 200
13.2.1 深入分析初級程序員的表現(xiàn) 201
13.2.2 具體看待概念與抽象看待概念之間的區(qū)別 205
13.3 完善適崗培訓(xùn)流程 207
13.3.1 貪多嚼不爛 207
13.3.2 改善受訓(xùn)者的記憶 208
13.3.3 代碼共讀 210
13.4 小結(jié) 212
寫在最后 213