每天三篇 arXiv cs.SE 论文 · 讲给不懂这个领域的人

← 全部论文

把改代码变成做料理

用做菜游戏教程序员改写代码:一场关于动机与理解的课堂实验

Eman Abdullah AlOmar, Christopher Engelbart, Stephen Pachucki, Nerissa Lundquist, David Van Hist · 26.09.30 · arXiv:2609.40086

1问题

想象你面对一段像意大利面一样缠在一起的烂代码。逻辑是通的,功能是好的,但你读起来头痛,想改又怕出错。这时候,老师告诉你:“别管功能,去重构它。”

什么是重构?就是在不动对外表现的前提下,把内部结构修整齐。比如把重复的代码抽成一个函数,或者给变量起个好听的名字。

但学生面临一个大困境:没人爱干这活儿。因为改得好不好,立刻就能跑测试看出来;而重构好不好,往往要等几个月后维护时才发现。这就好比让你去刷马桶,而且现在不臭、以后才看你能不能忍受异味。没有即时反馈,也没有动力。很多学生宁愿写新bug,也不愿花时间去清理旧债。这就是“代码异味”教育里的死结:你知道该做,但你不想做。

2翻译

转折发生在作者看到了一招“移花接木”。既然学生不爱干脏活,那就把脏活包装成好玩的事。

他们搞了个叫 Refactoria 的游戏平台。主角不是冷冰冰的编辑器,而是一个大厨,还有个助手叫“打蛋器机器人”。任务是把这些机器人的菜谱指令,整理得干净利落。

这里有个承重类比:你看那个“代码气味”,在学术里它是抽象的概念,但在游戏里,它就是“难吃的食材”或者“混乱的厨房”。你看到的每一行烂代码,都是一道没放盐的汤或者切不完的洋葱。重构的动作,就是把这些乱七八糟的步骤打包好,让厨房(程序)运转得更顺畅。

让我们看看效果。参与实验的是30个学生开发者。第一组数据:感知度。几乎所有人都说这个游戏“有用”。这不是客套话,是指他们真的觉得这个游戏帮他们理解了那些枯燥的重构概念。在游戏里,他们不再盯着分号看,而是盯着“这道菜是不是太咸了”。第二组数据:理解力。通过对比前后测,学生在识别“代码坏味道”的能力上有了明显提升。以前他们看不懂哪段代码有问题,现在能指出来了。这说明,“玩”这个过程本身并没有干扰学习,反而成了认知的脚手架。第三组数据:动机值。这是最关键的。在传统课堂上,让学生手动找重构点,大家是低头不语;在游戏中,他们会争论:“这个步骤能不能合并?”“那部分代码能不能简化?”这种争论,就是动机的火花。

还有一个反直觉的发现:哪怕有些学生之前连基本的编程语法都还磕磕绊绊,他们在游戏里的表现并不差。为什么?因为游戏剥离了语法的噪音,直接聚焦在逻辑的结构上。对于新手来说,结构比语法更容易被直观感知。他们没有陷入“括号没对齐”的痛苦,而是享受了“理顺逻辑”的快乐。

3核心概念

要讲透这个故事,得拆开主角手里的三样关键东西。

第一样东西,叫“游戏化映射”。这不是简单的加分加徽章,而是深层的语义转换。论文的核心设计选择在这里:它把“代码坏味道”映射为“烹饪效率低下”。什么是代码坏味道?简单说,就是代码里那些暗示着你可能应该修改的信号。比如一个函数太长,就像厨师一次炒太多菜,手忙脚乱;变量名太短,就像把白糖标为“A”,让人困惑。游戏里没有显示“Long Method Warning”,而是显示“火候失控”。这种映射必须准确,否则玩家会玩歪。作者选的是厨师和厨房,是因为烹饪和编程惊人地相似:都有流程、都有材料(变量)、都有成品(输出)。这个比喻不是随便选的,是经过精心打磨的锚点。

第二样东西,叫“情境化反馈”。传统工具给你反馈是灰色的文字报错。Refactoria 给你的反馈是视觉上的清爽或混乱。当你完成一次重构,你会发现原本杂乱的指令条变得整齐有序,像是厨房从地狱变回了天堂。这种视觉反馈直接对应了“可维护性”的提升。你不需要懂编译器,你也能感觉到“这样更好看”、“这样更合理”。这就是把抽象的质量指标,变成了具象的美学体验。

第三样东西,叫“隐性评估机制”。这是很多人容易忽略的点。你以为学生在玩游戏?其实系统在后台一直在记录他们的决策路径。他们选择了哪种重构模式?他们在哪个步骤卡住了多久?这些行为数据构成了评估依据。论文没有展示复杂的图表,但其实验设计的巧妙之处在于:它不要求学生交卷,而是通过分析他们的游戏操作来评估学习效果。这意味着,评估不再是痛苦的考试,而是游戏的自然延伸。

4洞见

这篇论文留下的那颗东西是:教育的阻力往往不在智力门槛,而在心理摩擦;当学习过程被赋予即时的、感官的回报时,高认知负荷的任务也能被普通人轻松拆解。

这句话脱离论文也成立。想想你打游戏通关的快感,再看看你背单词的痛苦。不是单词难,是你得不到快乐反馈。重构也是如此,它之所以难推广,不是因为技术复杂,而是因为它的回报延迟太远。游戏化做的,就是把遥远的回报拉近到眼前。

5博导审稿

来,坐。这篇论文我看完了。选题眼光不错。重构确实是软件工程教学里的老大难,大家都头疼,所以这个问题是真问题。方法上,用游戏化来破局,思路很清晰,不是那种为了创新而创新的伪需求。

但是,我要挑几个刺。首先,样本量太小。30个人,只够做个小范围的可行性研究,撑死了算初步探索。这点你得诚实承认,别吹牛说这是大规模实证。30个人能说明什么?只能说明在特定班级、特定环境下有效。换个学校、换批学生,结果不一定复现。其次,隐含的预设有点乐观。你假设“游戏化”一定能转化为“深度学习”。但我们知道,很多时候学生只是沉迷于游戏的表面奖励,玩完了觉得爽,转头还是不会写代码。你的评估主要靠主观问卷和简单的技能对比,缺乏长期的跟踪。三个月后,他们还记得这些重构原则吗?如果没有长期数据,这个结论就站不稳脚跟。再者,写作功力中规中矩。虽然故事讲得通顺,但缺乏对“失败案例”的深入分析。哪些学生在游戏里失败了?为什么失败?这部分往往比成功更有价值。你只报了喜不报忧,诚意稍显不足。

判决:weak accept。理由是有明确的启发意义和初步验证,但证据力度较弱,需要更大规模的后续研究支撑。是个好的开始,但不是终点。

6启发

这意味着你可以___。

1. 迁移:把你体系里那些“枯燥但必要”的审查环节,比如代码规范检查、单元测试编写,做成类似的微游戏。不用做得这么宏大,只要把“发现错误”变成“抓住害虫”,把“通过检查”变成“升级等级”,就能显著提升参与度。2. 混搭:把你的现有工具和一个轻量级的叙事外壳结合。比如,在IDE插件里,把警告信息翻译成拟人化的抱怨。“这段代码太累了,我想休息(提取方法)”。不改动核心逻辑,只改呈现层,就能产生奇妙的化学反应。3. 反转:通常我们假设学生需要强制约束才能学好规范。但这篇论文提示我们,或许我们可以反向操作:给学生自由,但给他们一个让他们自发追求秩序的目标。与其禁止烂代码,不如奖励整洁代码。在你的产品设计中,试着把“合规”包装成“优化”或“美化”,而不是“惩罚”。