为什么你在写代码时总会遇到这样或那样的问题?为什么你总是记错某些语法?为什么有些人能够快速学会新的编程语言,而有些人则不能?在试图解决困难或复杂的问题时,我们的大脑其实有一套特定的工作方式。本书从认知科学角度剖析优秀程序设计背后的脑科学原理,为你揭开大脑思考编程的奥秘。本书分为四大部分,共有13章。你将了解如下内容:如何高效地学习新的编程语言,如何快速地理解复杂的代码,如何牢固地记住各种语法,如何在繁杂的程序设计工作中优化认知资源。
本书是程序员的普适书,初学编程的初高中生也可以阅读。
随着ChatGPT横空出世,作为程序员的你是否已经有了危机感?在自己编写代码和理解他人所写代码这两个方面,人工智能是否已经超越了人类程序员?无论人工智能如何“进化”,有一点是它无法取代的,那就是人类程序员的超强大脑。本书是专为程序员而写的大脑使用指南,旨在帮助程序员用好自己的认知优势。
本书作者指出,程序设计是一个认知过程,这个过程对程序员的认知要求颇高。因此,本书从认知科学的角度帮助程序员了解大脑工作机制,从根本上提高程序设计工作的效率。
本书特点
●有助于理解大脑如何加工与代码相关的信息。
●内容组织符合认知模式:代码阅读、代码思考、代码编写、代码协作。
●助你醍醐灌顶,实现更快的代码读写速度、更高的工作效率、更少的返工。
●以Python、JavaScript、Java等为例,但原理对所有语言适用。
【作者简介】
费莉安·赫尔曼斯(Felienne Hermans),荷兰莱顿大学副教授,致力于研究人类如何利用认知科学快速、有效地学习程序设计语言。费莉安对ChatGPT给软件工程领域带来的深远影响有独到见解,多次就这一话题接受媒体专访。她是TC39(JavaScript标准委员会)成员,还自创了Hedy程序设计语言。
【译者简介】蒋楠
出身电子与计算机工程专业的高级技术产品经理,负责C端产品的规划和设计,对算法和数据密集型应用同样兴趣浓厚。兼具科技图书译者、马拉松跑者、航天爱好者等多重身份,译作包括《计算机简史(第三版)》《计算机科学精粹》等。
第 一部分 代码阅读
第 1章 剖析程序设计之惑 2
1.1 代码造成的各种困惑 2
1.1.1 第 一种困惑:缺乏知识 3
1.1.2 第二种困惑:缺乏信息 4
1.1.3 第三种困惑:缺乏加工能力 4
1.2 影响程序设计的不同认知过程 5
1.2.1 长时记忆和程序设计 5
1.2.2 短时记忆和程序设计 6
1.2.3 工作记忆和程序设计 7
1.3 认知过程之间的关系 8
1.3.1 简要剖析认知过程如何相互作用 8
1.3.2 编程任务涉及的认知过程 9
1.4 小结 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 不是记忆的内容,而是记忆的方法 24
2.3.3 代码分块练习 30
2.4 小结 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 小结 44
第4章 阅读复杂的代码 45
4.1 为什么复杂的代码难以理解 45
4.1.1 工作记忆与短时记忆的区别 46
4.1.2 与程序设计相关的3种认知负荷 47
4.2 减轻认知负荷的方法 49
4.2.1 重构 50
4.2.2 替换不熟悉的语言结构 51
4.2.3 在抽认卡两面写上等价的代码可以显著增强学习效果 54
4.3 利用记忆辅助工具解决工作记忆过载的问题 54
4.3.1 绘制依赖图 55
4.3.2 创建状态表 57
4.3.3 结合使用依赖图和状态表 59
4.4 小结 61
第二部分 代码思考
第5章 深入理解代码 64
5.1 变量角色框架 65
5.1.1 变量不同,承担的任务也不同 65
5.1.2 涵盖大多数变量的11种角色 66
5.2 角色和范式 68
5.2.1 角色的优点 68
5.2.2 匈牙利命名法 70
5.3 加深对程序的了解 72
5.3.1 文本结构知识与计划知识 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 监测 82
5.5.3 确定不同代码行的重要性 83
5.5.4 推断变量名的含义 84
5.5.5 视觉化 85
5.5.6 提问 86
5.5.7 摘要 86
5.6 小结 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 小结 105
第7章 迷思概念:错误的思维方式 106
7.1 为什么学习第二门编程语言比学习第 一门编程语言更容易 107
7.1.1 充分挖掘现有编程知识的潜力 108
7.1.2 不同的迁移类型 109
7.1.3 已经掌握的知识:是福还是祸 110
7.1.4 迁移有难度 111
7.2 迷思概念:思维中存在的错误 113
7.2.1 通过概念转变来消除迷思概念 114
7.2.2 抑制迷思概念 114
7.2.3 与编程语言有关的迷思概念 115
7.2.4 在学习新的编程语言时避免形成迷思概念 117
7.2.5 判断代码库中存在的迷思概念 118
7.3 小结 118
第三部分 代码编写
第8章 提高命名的质量 120
8.1 命名为什么重要 121
8.1.1 命名的重要性何在 121
8.1.2 与命名有关的不同观点 122
8.1.3 最初的命名实践影响深远 124
8.2 从认知的角度剖析命名 125
8.2.1 规范的命名方式对短时记忆有利 126
8.2.2 含义明确的标识符对长时记忆有利 127
8.2.3 标识符可以包括不同类型的信息以帮助理解 127
8.2.4 评估标识符质量的时机 129
8.3 哪些类型的标识符更容易理解 129
8.3.1 是否应该使用缩写 129
8.3.2 采用驼峰命名法还是蛇形命名法 133
8.4 标识符与代码错误之间的关系 134
8.5 如何设计质量更高的标识符 135
8.5.1 名称模具 135
8.5.2 运用Feitelson设计的三步模型来提高标识符质量 138
8.6 小结 139
第9章 避免低质量代码和认知负荷:两种框架 140
9.1 为什么存在异味的代码会加重认知负荷 140
9.1.1 代码异味简介 141
9.1.2 代码异味对认知的负面影响 144
9.2 低质量标识符对认知负荷的影响 146
9.2.1 语言反模式 146
9.2.2 认知负荷的测量 147
9.2.3 语言反模式和认知负荷 151
9.2.4 语言反模式为什么令人困惑 152
9.3 小结 152
第 10章 提高解决复杂问题的能力 153
10.1 问题解决的实质 153
10.1.1 问题解决的三大要素 153
10.1.2 状态空间 154
10.2 长时记忆在解决编程问题时所起的作用 155
10.2.1 问题解决本身是否属于认知过程 155
10.2.2 培养长时记忆来解决问题 157
10.2.3 解决问题时起作用的两类记忆 157
10.3 自动化:构建内隐记忆 160
10.3.1 内隐记忆会随着时间的推移而变化 161
10.3.2 为什么自动化可以加快编程速度 163
10.3.3 强化内隐记忆 164
10.4 从代码及其解释中汲取经验 165
10.4.1 第三种认知负荷:关联认知负荷 166
10.4.2 在工作中运用样例 168
10.5 小结 169
第四部分 代码协作
第 11章 编程活动和任务 172
11.1 程序设计包括不同的编程活动 172
11.1.1 搜索活动 173
11.1.2 理解活动 173
11.1.3 转写活动 174
11.1.4 递增活动 174
11.1.5 探索活动 174
11.1.6 为什么符号认知维度框架不包括调试活动 175
11.2 受到干扰的程序员 176
11.2.1 编程任务需要“预热” 176
11.2.2 思路被打断的后果 177
11.2.3 如何减轻干扰的影响 177
11.2.4 限制干扰出现的时机 180
11.2.5 关于多任务处理的一些思考 182
11.3 小结 183
第 12章 设计和改进大型系统 184
12.1 代码库的属性 185
12.1.1 认知维度 185
12.1.2 利用代码库认知维度来改进代码库 193
12.1.3 设计策略及其权衡 194
12.2 认知维度和编程活动 196
12.2.1 认知维度对不同编程活动的影响 196
12.2.2 针对预期的编程活动优化代码库 197
12.3 小结 198
第 13章 对新程序员进行适岗培训 199
13.1 适岗培训中存在的问题 199
13.2 高级程序员与初级程序员的区别 200
13.2.1 深入分析初级程序员的表现 201
13.2.2 具体看待概念与抽象看待概念之间的区别 205
13.3 完善适岗培训流程 207
13.3.1 贪多嚼不烂 207
13.3.2 改善受训者的记忆 208
13.3.3 代码共读 210
13.4 小结 212
写在最后 213