如果铅笔优先于键盘是原则,那么实际操作是什么样子的?纸面工作长什么样?学生究竟画什么?键盘什么时候进来?

本文通过一个完整的实例展示整个过程,以及 Turing 反复使用的三种核心工具。

三种工具

三种纸面成果完成了几乎所有的工作。

1. 伪代码

伪代码是用结构化的普通语言描述算法。比英语更接近代码,但不绑定于任何特定的编程语言。一个简单的伪代码示例:

BEGIN
    SET total TO 0
    FOR each number FROM 1 TO 10
        ADD number TO total
    END FOR
    OUTPUT total
END

关键字(BEGIN, END, FOR, END FOR, SET, ADD, OUTPUT)赋予它结构。学生可以大声朗读并准确理解应该发生什么。它也很容易翻译成 Python:

total = 0
for number in range(1, 11):
    total = total + number
print(total)

一旦两者都熟悉了,伪代码到 Python 的翻译就是机械性的。思维在伪代码层次发生。

2. 流程图

流程图是伪代码的视觉表亲。动作用方框,决策用菱形,控制流用箭头。它们对有分支逻辑的问题特别有效,否则就需要嵌套的 IF 语句,读起来很费劲。

「用户输入是否大于 10?」的流程图是一个序列:开始 → 获取输入 → 菱形问「输入 > 10?」 → YES 分支打印「大」,NO 分支打印「小」 → 两个分支在结束处汇合。画出来迫使学生明确每个分支去向哪里。

对于 KS3 学生来说,画流程图通常能澄清他们在代码中原本会弄错的分支逻辑。五分钟的时间是值得的。

3. 干运行表格

干运行表格是你假装自己是计算机的地方。每个变量一列,每个步骤一行。你写下每一步每个变量包含的内容。对于一个「求 1 到 5 之和」的算法,total 这一列会依次经过 0、1、3、6、10、15,而 number 这一列经过 1、2、3、4、5。最终答案:15。如果你的追踪与预期不符——找到 bug 了,在任何代码运行之前。

实例:FizzBuzz

FizzBuzz 是 KS3 中结合循环、条件和取模运算的经典问题。完整问题:

打印从 1 到 30 的数字。但对于 3 的倍数,打印"Fizz"而不是数字。对于 5 的倍数,打印"Buzz"。对于 3 和 5 都是倍数的,打印"FizzBuzz"。

先按键盘的尝试通常会失败。学生输入 if i % 3 == 0: print("Fizz"),然后 if i % 5 == 0: print("Buzz"),结果在 15 这个数字上分两行分别打印了"Fizz"和"Buzz",而不是"FizzBuzz"。他们挠头,再试别的方法,猜测。

Turing 风格的课程则这样进行:

1. 分解

程序需要做什么?

  • 从 1 到 30 遍历数字。
  • 对于每个数字,决定打印什么。
  • 决策有四种情况:3 和 5 都是倍数(打印 FizzBuzz)、只是 3 的倍数(Fizz)、只是 5 的倍数(Buzz)、或者都不是(数字本身)。

分解已经揭示了关键点。「3 和 5 都是倍数」的情况必须首先被检查,在单独检查之前。做了规划的学生不太可能写出那个 bug。

2. 画流程图

在实际课程中,学生在纸上画出这个——一个从 i=1 到 i=30 的循环,循环内有一组链式决策菱形:先检查 i % 15 == 0(打印 FizzBuzz),然后 i % 3 == 0(打印 Fizz),然后 i % 5 == 0(打印 Buzz),否则打印 i。视觉顺序使「15 的倍数必须放在最前面」的规则变得显而易见——你可以看出为什么把 FizzBuzz 的情况单独提出来修复了那个 bug。

3. 写伪代码

BEGIN
    FOR i FROM 1 TO 30
        IF i MOD 15 == 0 THEN
            OUTPUT "FizzBuzz"
        ELSE IF i MOD 3 == 0 THEN
            OUTPUT "Fizz"
        ELSE IF i MOD 5 == 0 THEN
            OUTPUT "Buzz"
        ELSE
            OUTPUT i
        END IF
    END FOR
END

4. 干运行几个值

不需要干运行全部 30 个。选几个有代表性的:1(都不匹配)、3(Fizz)、5(Buzz)、15(FizzBuzz)、30(FizzBuzz)。对于每一个,按顺序走过各个条件并检查输出。五个都追踪正确——算法没问题。

5. 翻译成 Python

for i in range(1, 31):
    if i % 15 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

第一次就能正常运行。学生理解每一行。明天可以写一个变体(不同的范围、不同的倍数)而不需要帮助。

总耗时:大约十二分钟。相比之下,二十分钟的键盘猜测,最终得到的是学生并不完全理解的能运行的代码。

Turing 在干运行失败时怎么做

当干运行表明算法不起作用时,修复发生在纸上,而不是代码里。学生修改流程图,重新追踪,只有在纸面版本正确之后才转向 Python。这就是大多数 KS3 学生从未形成的循环。他们的默认做法是运行代码 → 随机调整 → 再运行。Turing 训练出的循环是追踪 → 发现逻辑错误 → 修复算法 → 重新追踪 → 翻译。第二种建立理解。第一种建立挫折感。

什么时候可以放下纸张

纸面工作不是永久的脚手架。经过两三周的铅笔优先课程,大多数 KS3 学生开始在脑中完成规划。流程图依然存在——在他们的脑子里。干运行依然发生——快速地,在内部。键盘再次变快了,但思维已经融入其中。

这种过渡就是目标。纸张不是为了永远被画下去而存在的。它的作用是建立那些让画图变得不必要的习惯。

延伸阅读


Duke Harewood 是 aitutors.me 的创始人,有一个 Year 8 的孩子,以及约十五年在教育相关领域构建软件的经验。2026 年 5 月 21 日更新。