第一次认真学习编程,是跟着郝斌的 Java 课程敲代码。那时我仍在机械专业读书,熟悉的是尺寸、公差和制图规范,对类、对象和引用几乎没有直觉。屏幕上最简单的 Hello World,也比一张画好的零件图更陌生。
机械制图要求一个零件在不同视图里保持一致,程序也要求同一份状态在不同路径里得到一致解释。这种相似感让我开始理解:编程不是记忆关键字,而是建立一套不会自相矛盾的描述。
语法只是入口
最初很容易把学习等同于“把课程看完”。变量、循环、数组、继承,每一节都能照着写,但合上视频后仍然不知道该从哪里开始。后来我给自己加了一条规则:每学一个语法点,都用它解决一个不在课程里的小问题。
学循环时写九九乘法表,学数组时做成绩统计,学类时把机械零件的属性拆成对象。程序很小,却会不断暴露误解。真正有效的反馈不是“视频看懂了”,而是编译器能否接受、输出是否符合预期、换一组输入会不会失败。
我保存下来的一个练习,是按材料密度估算零件重量。现在看只有十几行,但它第一次迫使我把单位和无效输入讲清楚:长度用毫米还是米,密度用什么单位,负数尺寸要不要接受。
final class Plate {
private final double lengthMm;
private final double widthMm;
private final double thicknessMm;
Plate(double lengthMm, double widthMm, double thicknessMm) {
if (lengthMm <= 0 || widthMm <= 0 || thicknessMm <= 0) {
throw new IllegalArgumentException("尺寸必须大于 0");
}
this.lengthMm = lengthMm;
this.widthMm = widthMm;
this.thicknessMm = thicknessMm;
}
double weightKg(double densityKgPerM3) {
double volumeM3 = lengthMm * widthMm * thicknessMm / 1_000_000_000d;
return volumeM3 * densityKgPerM3;
}
}最初的版本把换算系数散落在 main 方法里,输入稍微换一下就不知道结果为什么错。把单位写进变量名、把尺寸检查放到对象入口后,计算公式反而成了最简单的一行。这个练习让我第一次看到:程序的难处不只是计算,而是阻止含义不清的数据进入计算。
错误是一种精确反馈
工程课里的错误有时要到加工或装配阶段才出现,代码的错误却会立刻给出行号。刚开始我讨厌这些红色提示,后来发现它们是最耐心的老师:类型不匹配、空引用、越界,每一种错误都在说明我的模型和机器执行的模型不一致。
学习编程之后,我开始习惯先定义输入与输出,再讨论过程;先让问题变得可验证,再追求漂亮的实现。这种思维远比某一门语言更重要。
当时我没有测试框架,就用一张很土的表格记录输入和预期。它后来成了我写测试用例的雏形:
| 场景 | 输入 | 预期 |
|---|---|---|
| 正常钢板 | 1000 × 500 × 10mm,密度 7850 |
39.25kg |
| 小数尺寸 | 12.5 × 8 × 2mm |
结果不被整数截断 |
| 零尺寸 | 厚度 0 |
明确拒绝,而不是返回 0 |
| 错误单位 | 把 7.85g/cm³ 直接传入 |
通过命名和文档暴露单位不匹配 |
第三个场景让我理解“能算出一个数”和“程序正确”完全不同。第四个场景则更难:类型系统只能知道它是 double,不知道单位。后来学习值对象时,我才知道可以继续把单位也建模进去。
给学习建立闭环
我把练习分成三个动作:先不看答案写一遍,再用不同输入破坏它,最后隔一天重新实现。第一遍检验记忆,第二遍暴露假设,第三遍才检验是否真正理解。遇到错误时不急着复制解决方案,而是先写下自己认为程序会怎样执行,再与实际结果逐步对照。
这种方式没有连续看课程快,却能留下更可靠的东西。编程学习最怕用熟悉感代替掌握:看别人敲过十遍,依然不等于自己能从空白文件开始。
今天的代码还非常笨拙。但只要一个想法能被写成程序,它就不再只是想法,而是可以运行、失败和继续改进的东西。这也是我愿意长期学习下去的原因。
图:熟悉感只有经过独立重写和失败输入,才会变成可调用的能力。
我当时真正留下的练习账本
后来回看,最有效的不是连续看了多少节课,而是一张很朴素的表:题目、自己先写的输入、预期输出、第一次失败原因、第二天能否不看答案重写。每周只保留三道最能暴露误解的题。
题目:统计一组零件数量
边界:空数组、负数、总和超过 int
第一次错误:把空数组平均值当成 0
修复证据:3 个固定输入 + 预期异常
一周后:脱离视频重写这份账本比“学完数组”更诚实:它记录的不是接触过什么,而是什么已经能够独立完成。