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