AI时代下的软件品味与“slop”之辨
文章探讨了在AI辅助编程日益普及的背景下,软件“品味”的重要性。作者认为,仅仅正确的代码是不够的,好的软件还需要优雅的用户体验和深思熟虑的设计,这源于开发者的品味和智慧。AI生成的技术正确但缺乏品味的软件可能淹没世界,而规范驱动开发(SDD)可以发挥关键作用,但前提是规范必须捕捉到品味和“为什么”。同时,初级工程师的成长路径也将改变,他们不再通过大量编码积累经验,而是通过快速迭代和判断力培养。
在AI辅助编程日益普及的今天,一个古老的问题再次浮出水面:为什么有些软件如此出色,而大多数却只是“能用”?不是充满bug,不是运行缓慢,而是——糟糕。一种你初次使用就能从骨子里感受到的糟糕。答案不在于工具、预算或团队规模,而在于一个被长期忽视的概念:品味。而且,在AI时代,品味可能就是决定胜负的全部。
我们无休止地谈论正确性:是否编译通过?测试是否通过?是否安全?是否可扩展?所有那些“性”——必要性俱在,但无一充分。因为存在一些软件,它们满足了所有上述要求,却依然是彻头彻尾的使用灾难。而另一些软件——有些甚至是由三个人在地下室编写并免费提供的——会让你惊叹:“哦,原来应该是这样工作的。”你不必与之对抗,它预判你的需求,它有主见,而且主见总是对的。
第二种软件绝非偶然。它是被固化的品味。想想巅峰时期的苹果。乔布斯并非杰出的工程师,但他是一个毫不妥协、痴迷于品味的人,拒绝推出任何不够“正确”的产品,并建立了一个能够长期持续交付“正确”的企业。那些关于Mac机箱内部即便无人看见也追求美观的著名故事,并非虚荣。那是一种将“我们绝不出售垃圾”内化为企业文化的结果。软件之所以被热爱,是因为组织拥有品味,而产品正是这种组织的可视化呈现。
康威定律深入人心:组织架构决定系统架构。但它的含义不止于沟通结构。软件镜像了构建它的组织的价值观、品味、纪律,以及对另一端使用者的尊重或漠视。这就是为什么某些开源软件在数十年后仍然是其领域的最佳之作。git、ffmpeg、sqlite、curl——这些不是由优化季度EBITDA的匿名委员会开发的,而是由深刻理解问题、在乎正确性、只对自己的标准和用户负责的人们开发的。少数有主见的人的品味在每一个命令和每一个标志中固化,这就是魔法,是封装后的智慧。
这也是为什么那么多企业软件令人深恶痛绝。我不点名——你知道我说的是谁,你心里也有自己的名单。这些软件糟糕并非因为工程师不行,而是因为它们是为满足所有客户的所有需求而构建的,由缺乏统一观点的庞大组织开发,优化的是RFP检查清单而非键盘前的人,更关心利润和增长而非用户。没有品味可以封装,因此什么都没有封装。你每天使用它们时都能感受到这种缺失。
那么,“优雅代码”到底是什么?工程师们像追求圣杯一样追逐优雅代码。但如果问十个人什么是优雅,你会得到十个答案,大多数只是感觉。我的答案是:优雅是理解的精炼。它是你在真正领悟问题之后,丢弃所有不属于问题的东西后剩下的。优雅的代码事后看起来显而易见,这欺骗人们以为它很简单。其实并不简单,它是艰苦得来的。优雅是被压缩到能装进你脑袋的智慧。优雅不是代码的属性,而是代码背后理解的属性。你无法伪造,也无法事后追加。而且——这一点我希望你深思——使用的优雅与代码的优雅同等重要,甚至更重要。一个华美的内部架构包裹着一个令人困惑、充满敌意的用户体验,这并不优雅,只是穿着漂亮西装的垃圾。
垃圾正在涌来,而且不仅仅是代码。让我夜不能寐的是:我们将用AI辅助软件淹没世界。而关于“AI垃圾”的讨论几乎全部集中在代码是否正确、安全、是否幻觉出不存在API。这是个小问题。大问题是,垃圾将体现在软件如何工作上:流程、默认设置、关于让什么变容易、什么变可能的成千上万个微小决策。一个智能体对于这个界面应该是一屏还是三屏没有主见。它没有品味。它会愉快地生成一个技术上正确、经过全面测试、文档精美但使用体验糟糕的软件——而且速度比那些训练我们接受痛苦的企业级大厂快一万倍。因此,我们将得到一万倍的垃圾。
因为还有一件事:我们已经被训练了。几十年来“足够好”的企业软件和巨大的切换成本教会我们接受糟糕为正常。耸肩,提交工单,然后继续。我们不再期望软件是好的。AI将对这种习得性无助火上浇油。除非……
如果我们能在它被构建之前就阻止它呢?这正是规范驱动开发(SDD)可以大放异彩的地方,也是我既兴奋又担忧之处。美好的前景是:如果智能体将根据我们的规范构建一切,那么规范就是品味现在所在之处。规范是杠杆点。把规范做对——捕捉“为什么”、优雅、以及软件使用时应有的精确感觉——你就可以在编写一行代码之前拦截垃圾。这是我们从未遇到过的机遇。我们可以在前端编码智慧。
但是,“把规范做对”这句话包含了巨大的工作量。我深入研究了新的规范驱动文献。有一本书《Agentic Spec-Driven Development: A Practical Method for Using AI to Build Complete Specifications》,说实话,如果你的团队还没读过,应该读一读。它的严谨性真实不虚,介于摩天大楼的建筑规范与源代码之间——充满了那些应该出现在我们规范里却通常缺失的东西。我非常尊重它。但读它时我无聊得要死。我感觉自己像个刻板的会计。构建的乐趣——最初让我爱上这项工作的东西——被简化为菜谱,步骤、检查清单、必须填写的章节。
别误会。菜谱的机制很重要,非常重要。目前有很好的基础设施正在建设中。谷歌的Open Knowledge Format是一个严肃的尝试,旨在标准化我们编写菜谱物质部分的方式——事实、约束、共享知识。而诸如Tolaria之类的工具则试图让编写和维护这些知识变得容易,这正是整个运动所需的那种平凡但关键的管道。如果技能是关于“怎么做”,那么知识格式就是关于“什么是真的”。我们两者都需要。但是,一个没有品味的人遵循完美的菜谱,仍然只能做出平庸的食物。
然后我读了Jay Acunzo的文章《Your Move, Chief》,它让我大为震撼。这正是我一直在寻找的解药。如果你知道那个场景,你一定明白。《心灵捕手》中,罗宾·威廉姆斯饰演的Sean在公园长椅上对那个狂妄的天才少年说:你能引用每一位艺术评论家关于米开朗基罗的评论,但你无法告诉我西斯廷教堂里的气味。你从未站在里面。你可以读到关于爱情、战争和失去的一切,但你从未真正经历过。知道一件事与经历过一件事是两码事。轮到你了,老大。
这正是菜谱与菜肴之间的差距,也是规范与好软件之间的差距。模型读遍一切,知道一切,但它从未真正活过。它从未发布过一个伤害真实用户的功能并不得不直视他们的眼睛。它从未感受过某个技术正确但精神崩溃的工作流程带来的那种特定厌恶。它没有伤疤,没有品味,因为品味是活出来的,不是学来的。人类的部分——智慧、经验、品味——将决定软件是好还是仅仅正确。而那部分不能被下载,必须被赚取。
那么我们该把初级工程师指向何处?把我们自己指向何处?这部分真的让我重新思考如何培养人才。初级工程师过去通过缓慢的方式获得品味:数年写代码、在评审中被撕碎、凌晨两点维护别人的烂摊子、感受后果。那条路是学徒之路。那条路已经消失了。不是“改变”,是消失。过去人们积累伤疤的苦活角色不复存在——智能体现在做那些工作。我们无法把下一代送上我们走过的路,因为路已经被新的车站覆盖。
但这里有充满希望的部分,我真的相信这一点:他们现在可以建造更多,而不是更少。有了智能体,一个初级工程师可以尝试过去需要资深团队才能做的事情。他们可以发布、观察、感受后果并迭代——比我们过去更快。他们可以培养品味、智慧和判断力——但走的是一条完全不同的轨迹。他们不必像我们那样受苦才能到达那里。事实上他们不能,而且谢天谢地。
那么,我们把他们指向哪里?指向判断力,而非语法;指向为什么这个是好的,那个是垃圾;指向站在西斯廷教堂里,而不是阅读关于它的文章——把真实的东西发布给真实的人,培养区分“不错”与“正确”的嗅觉。而我们把自己指向哪里?同一个方向,老实说。我们的工作正在从编写东西转变为知道什么是好的并能说出为什么——清晰到足以转化为智能体可以执行的规范。这是一个全新的理解和综合层次。它比编码更难。但它也更人性化。
这对规范意味着什么。我不反对规范,远非如此。我认为严谨、结构良好的规范即将成为软件中最重要的工件。读那本书,采用格式,使用工具。机制很重要,我不会轻视它们。但规范是容器,菜谱不是烹饪。如果我们把平庸的理解倒入格式完美的规范中,我们就会得到格式完美的垃圾。更快,且规模化。格式是必要的,但远非充分。真正的工作——没有工具能为你做的那部分——是深入挖掘的人类工作:真正理解问题和你要为之解决的人,深刻到对“正确”的感觉有主见。捕捉的不仅是需求,还有品味、“为什么”、优雅、以及软件应该如何工作的精确最佳点。
那就是我们必须学会写下的智慧。我们中的大多数人从未需要明确表达它——我们只是拥有它,然后它渗透到代码中。现在我们必须有目的地让它明确,以智能体可以构建的形式。这就是新的手艺。
结论:好的软件一直要求品味、纪律和深刻的理解。随着AI承担代码编写工作,人类的判断力和将智慧编码到规范中的能力将变得更加关键。我们必须培养不是语法,而是判断力。我们的组织必须培养品味,否则我们将被无味但技术正确的软件垃圾淹没。