Coding as Craft: Going Back to the Old Gym

2025年4月22日 • 阅读时长约 6 分钟 AICodingCraftClean ArchitectureCareerProgramming

最近,Shopify 的 CEO Tobi Lütke 分享了关于 AI 在 coding 中作用的看法,他指出:“在 Shopify,现在人们理所当然地认为应该熟练使用 AI。” 他的主要意思是 AI 正在彻底改变我们的工作方式,每个人都应该赶上这趟列车,否则就有被抛弃的风险。 我稍微转述了一下,但差别不大——可以查看原文了解完整的上下文和内容。

这引起了我的共鸣,但与他的意图不同。在与 Elm 工程师的 Slack 对话中,我发现自己写道:

时机很有趣。我刚刚切换回 vim,以进一步远离 AI 对我 coding 的干扰。我上次关于 AI 的演讲有一个副标题“自动化那些无聊的部分”(受到经典的 Python 书籍的启发),这对我来说就是 AI 的用途。

然而,coding 并不是无聊的部分,它是我的手艺,我想享受它并保持敏锐。当然,如果手头只有 LLM,那么用它来提问和讨论话题是可以的。但是“熟练使用 AI”听起来像是一种我不希望加在我身上的诊断。

如果人们不再经历那种偶尔陷入僵局,咬牙切齿,看着问题,哭泣,散步,祈祷和尖叫,直到突然间恍然大悟(并且学到了一些东西!)的过程,我会认为这是一种严重的倒退,而不是进步。

我越是反思这段对话以及其他前辈的评论,就越意识到它与我们与技术和手艺之间更深层次的关系有关。现在是时候谈谈回到“老旧训练场”了。

Rocky Balboa 原则 Link to heading

在《洛奇3》中,Mickey 面对 Rocky 失去优势的关键时刻说:“你过去就像超自然一样,但最糟糕的事情发生了,这可能会发生在任何战士身上:你变得文明了!”

Mickey 的解决方案是什么? “我们离开这里,回到老旧训练场!”

这个场景一直留在我的脑海中,因为它捕捉到了关于掌握和技能发展的一些深刻的东西。“老旧训练场”代表着真实成长发生的原始、必要的条件。它并不舒适。它并不豪华。但它是完成真正工作的地方。

在 coding 的背景下,我们的“老旧训练场”是我们直接与问题、算法和架构搏斗的精神空间,没有 AI 为我们生成解决方案的缓冲。

AI 是一种工具,而不是替代品 Link to heading

请允许我明确一点:我并不反对 AI。事实上,我发现它非常有用——对于那些无聊的部分。

AI 擅长:

但是编程的核心——思考、设计、架构决策——这些是我想要保留作为我的手艺的部分。这些是我想要通过在老旧训练场训练来保持强大的肌肉。

认知斗争的价值 Link to heading

在与一个难题作斗争的过程中,有些东西是无法替代的。当你陷入困境,完全陷入困境时,你会:

  1. 沮丧地咬紧牙关
  2. 离开电脑
  3. 散步
  4. 向耶稣祈祷和/或放声大哭
  5. 回来并尝试不同的方法
  6. 重复直到……突然,它灵光一闪

那个“啊哈!”的时刻会重塑你的大脑。它创造了神经通路,使你永久地擅长你所做的事情。它是 coding 中相当于肌肉记忆的东西,也是我们作为工程师成长的方式。

当我们把这种斗争外包给 AI 时,我们就剥夺了自己这些成长机会。我们得到了解决方案,但没有理解。我们得到了代码,但没有工艺。

AI 可以生成代码,但它(尚未)理解那些使系统在一段时间内真正可维护和适应的细微决策。它不会用来自深刻经验和来之不易的知识的关怀和考虑来设计你的领域层。再次说明:如果你关心你的手艺,那么它是否成功地完成了手头的特定任务不应该是你唯一的关注点——你是否学到了一些东西也应该很重要!

需要明确的是,早在 LLM 占据中心舞台之前,人们就已经在避免斗争™了。StackOverflowGoogle,甚至坐在附近办公桌旁的工程师同事,如果被滥用,都可能是剥夺你适当学习的绝佳工具。但是,AI 工具触手可及的持续可用性和巨大的范围是如此的广泛和巨大——这就是我特别提出它的原因。

熟练使用 vs. 有意协作 Link to heading

“熟练使用 AI”这个短语引发了我最强烈的反应。“熟练使用”暗示着不假思索、自动依赖。它暗示着不仅委派任务,还委派判断本身。

我提倡的是与 AI 进行有意的协作:

这种方法保留了你作为工匠的能动性,同时仍然利用 AI 可以带来的效率。

老旧训练场锻炼计划 Link to heading

那么,“回到老旧训练场”对于 2025 年的 coding 来说是什么样的呢?这是我的方法:

  1. 为 AI 使用设置界限:定义何时使用它,何时不使用。我用它来处理文档、解释和偶尔的样板代码——很少用于核心算法或架构。而且我没有使用 AI 驱动的自动完成功能!
  2. 练习手动 coding:定期处理问题,没有任何 AI 协助。Advent of CodeLeetCode 等网站,甚至从头开始实现小型实用程序,都可以保持这些肌肉的强壮。(AI 不是唯一的问题——我特别针对那些“一切都只使用现有的 npm 包”的瘾君子,以及那些“没有我那花哨的 IDE 我就迷失了方向”的可怜的灵魂!)。
  3. 了解你使用的所有东西:如果 AI 为你生成代码,不要只是粘贴进去。研究它。理解它。重构它。使它成为你的。永远,永远不要仅仅接受 copilot / cursor 选项卡建议并继续前进!
  4. 拥抱奋斗:当遇到困难时,抵制立即向 AI 寻求帮助的冲动。给自己时间来解决问题。奋斗是成长发生的地方。
  5. 深入学习基础知识:对算法、数据结构和设计模式的扎实知识使你能够批判性地评估 AI 生成的解决方案。与其让 AI 提出答案,不如与它讨论(如果有的话)并要求提供相关的(人为的!)资源来深入研究。

寻找平衡 Link to heading

这并不是要拒绝进步或成为一个 coding 纯粹主义者。而是要在日益自动化的手艺中保持人的因素。

正如厨师可能会使用食品加工机进行繁琐的准备工作,但绝不会想到要自动化食谱开发和风味平衡的创造性方面一样,我们应该使用 AI 来做它擅长的事情,同时保留 coding 中带给我们快乐和成长的部分。

结论 Link to heading

在一个推动“熟练使用 AI”的世界中,我提倡一些不同的东西:与 AI 进行深思熟虑、有意的协作,以保留 coding 作为一种手艺的本质。

就像 Rocky 一样,我们有时需要远离舒适、文明的环境,回到老旧训练场——通过奋斗、坚持和专注的练习来实现真正成长的地方。

因为 coding 不仅仅是关于产出。它是关于成为更好的问题解决者、更好的思考者和更好的工程师的旅程。有些旅程是无法外包的,即使是最先进的 AI 也无法做到。

让我们使用 AI 来自动化那些无聊的部分,但将手艺掌握在自己手中。

“重要的不是你能打多重,而是你能承受多重的打击,并且继续前进。”——Rocky Balboa