5. 如何学习编程
1. 先理解语义,再积累惯用法
1.1 真正的底层是“语义”,而非实现
很多初学者认为,“底层”就是指那些跟硬件打交道的东西,比如汇编和操作系统。这没错,但它不是学习的起点。
先确认规则,再研究实现
对于学习者而言,真正的“底层”是语言的“语义”(Semantics)——即一个特性“是什么”以及它“承诺遵守的规则”。
- 语义(你要先掌握的):比如,
union可以包含多个成员,但同一时刻只保存其中一个成员的值。这是它的核心身份,是它不变的承诺。 - 实现(你可以后探索的):编译器具体如何实现这条规则,不同编译器的实现有什么差异。这是它具体的“建造方式”。
1.2 掌握语言的“成语”与“套路”(Idioms)
每门编程语言都有一些约定俗成的、用于高效解决特定问题的最佳实践,我们称之为“套路”或“惯用法”(Idioms)。
以循环为例:
for和while都能实现循环。但它们的“套路”完全不同。for的套路:用于已知次数的迭代。当你看到一个数组,想对它从头到尾进行操作,你的大脑里应该自动浮现出for (int i = 0; i < n; i++)这个标准句式。它结构紧凑,意图清晰——“我要对这个序列做 N 次事”。while的套路:用于未知次数、依赖某个条件才能结束的迭代。比如读取文件直到末尾,或等待用户输入特定指令。它的句式while (condition)完美地表达了“只要条件满足,就一直做”的意图。
先学语义,后探索套路,必要时了解实现。
1.3 如何学习这些“套路”?——从观摩大师开始
这么重要的"套路",为什么书上很少系统地教?
这是一个极好的问题。因为“套路”源于实践,它存在于鲜活的代码和程序员社区中。教科书能给你地图,但真正的驾驶技巧要在路上学。
那么,去哪里学?走出书本,去代码的世界里“观摩”和“实践”。
- 看各种代码片段(Snippets):主动寻找和阅读解决小问题的优秀代码。
- 使用在线编程平台(如 Codewars):这些平台是学习“套路”的绝佳健身房。
- 遵循最高效的学习回路:
- 第一步:自己动手。用你当前学会的知识,努力解决一个问题。
- 第二步:观摩高手。提交你的答案后,去看别人的解决方案,特别是那些被高票点赞的。
- 第三步:对比反思。你会震惊地发现:“原来这个问题还能这么写!”“原来这个函数还能这么用!”
- 第四步:吸收内化。在巨大的差距和顿悟中,你就能最高效地吸收新的“套路”,并把它变成你自己的武器。
你的目标,是在更高的抽象层次上思考:通过掌握一个个“套路”,将解决问题的步骤打包成可以直接调用的“模式”。
1.4 我需不需要理解某些“概念”?
追究概念的“本质”是非常难的。许多概念的演变,涉及复杂的历史过程,涉及十分基础的数学、逻辑等理论原理。关于编程语言理论的很多讨论超出了本教程的范围——很多时候,本教程只讲应用。
2. 必须亲手运行和修改
- 实践是检验真理的唯一标准
- 敲过才算学过
3. 建议的学习循环
- 阅读规则,并预测示例结果。
- 运行原始程序,确认预测。
- 每次只改变一个条件,再次预测和运行。
- 用标准文档、实现文档和诊断信息解释差异。
- 把得到的规则用于一个新的小程序。
4. 实践
- 选取一个短示例,在不运行的情况下先写出预期输出。
- 修改一个字面量、一个条件和一条语句,分别记录行为变化。
- 解释哪些结论来自 ISO C,哪些只来自当前实现。
5. 自测
单选
关于 for 和 while 的“套路”(Idioms),哪个描述是正确的?
for 用于未知次数的循环,while 用于已知次数的循环。
for 的“套路”是处理已知次数的迭代,如遍历数组。
while 的“套路”是处理固定次数的迭代。
两者完全可以互换,没有各自擅长的场景。