程序员的身份危机

作者:Simon Højberg

我是一名程序员。一个码农。一个键盘牛仔。一个黑客。我每天的工作就是敲击键盘,催生代码。这很有趣;这就是我的身份认同。Vim 编辑器 就是我的工作室,我的圣殿。在这里,我磨练我的手艺,打磨我的工具,通过好奇心拓展我的能力。有那么一会儿,我能遁入一种如痴如醉的“心流” (flow) 状态。一个全屏的终端窗口,除了 INSERT 模式,我与思想之间再无障碍。在 Bram 的祭坛前 (指 Vim 的作者 Bram Moolenaar),我凭空编织现实的纱线,将其化作在硅片中闪耀的比特。这是一个完全想象出来的、无形的,却能在现实世界 (IRL) (In Real Life, 即“现实生活”) 掀起波澜的世界。在这个世界里,我在技艺和创造中找到了慰藉。时间在解决谜题的过程中消失了。在这里,把碎片拼凑起来的过程比完成一幅完整的图画更重要。技艺从指尖倾泻到缓冲区 (buffer,编程中指临时存储数据的区域)。我编程,我渐入佳境,沉浸在心流与创作之中。

1950 年代末,麻省理工学院 (MIT) 涌现出一种令人振奋的新文化。它强调亲自动手、实验精神和反权威。我总爱想象自己就在那里,坐在石板蓝的 L 形控制台前。在 Flexowriter (一种早期的电动打字机和数据终端) 上敲着代码,它吐出穿孔纸带程序,再被送入附近那堵由金属立柱、缠绕的电线和早期晶体管组成的墙——“Tixo” (早期晶体管计算机 TX-0 的昵称)。我屏息以待,机器运行程序时发出迷人的蜂鸣声:它会成功吗?我想象着那些后来被称为“黑客”(Hackers) 的人就在我身边,他们指着代码,为我如何实现“正确之物” (The Right Thing) (指最完美、简洁、优雅的程序) 提供建议。我能感觉到,当他们热情地践行“黑客伦理” (The Hacker Ethic) 时,最初的编程文化正从他们身上倾泻而出,他们分享着自己的纸带程序片段,指引我前行。

就在那里——在 26 号楼那个计算的大熔炉里——编码这门手艺被铸造出来了。近 70 年前,“科技模型铁路俱乐部”的成员们沉浸在机器的语言中,追求对数字巫术的精通。这是一种崇高的魔法:操纵形式语言,去解决日益具有挑战性的神秘难题,并且——作为文化的核心——与其他“软件巫术”这门黑暗艺术的学生们分享发现。

古代黑客的灵魂仍然在机器中游荡,并通过他们建立的文化,在我们的思想中徘徊。他们锻造技艺的遗产依然存在。这是一门深刻而充满动能的手艺,我们将其发扬光大,并在此基础上建立了一个充满激情的行业。驱动我们的,是与他们当年一样的好奇心、成就感和解谜的优雅。我们仍然被“正确之物”所驱动。这些根本性的理念,这些程序员的身份认同,正日益受到威胁。岌岌可危。编程的未来,曾经如此光明和清晰,现在却笼罩在不祥的黑暗、欺诈和不确定性之中。


事实上,如果我们要相信那个价值数十亿美元的 AI 产业、Hacker News (一个知名的科技新闻和讨论社区) 上的居民(及其背后的大佬),以及 LinkedIn (领英,一个职场社交平台) 上那些大语言模型 (LLM) 的狂热军团,那么软件开发的未来与编程几乎没什么关系了。“凭感觉编程” (Vibe-coding)——一年前似乎还是个梗——现在正逐渐成为主流。

目前(尽管这一点随时在变),“凭感觉”的狂热者们会让我们用 Markdown (一种轻量级标记语言) 来写规范,而不是写代码。我们所熟知的那种深度参与和精湛手艺已经一去不复返了:那些在代码库的角落里花费时间、解决难题、揭开尘封秘密的日子。相反,我们被要求接受“分散的认知” (scattered cognition) (指注意力不集中,思维在多个任务间跳跃),在一群替我们思考的 AI 智能体 (AI Agent) 之间切换上下文。创造性的解谜工作被留给了机器,而我们变成了仅仅是操作员,与我们的手艺渐行渐远。


有些人——比我想象的要多——似乎很欢迎这种变化,这种新的身份:“规范工程” (Specification Engineering)。他们很高兴能成为一名操作员,cosplay (角色扮演) 史蒂夫·乔布斯 (Steve Jobs) 来“指挥整个交响乐团”。人们不禁要问,既然他们对编码似乎不感兴趣,当初为什么还要成为程序员呢?他们是不是把沃兹尼亚克 (Woz) (苹果公司的另一位创始人,以技术卓越闻名) 和乔布斯搞混了?

我无法想象(也许是我缺乏想象力)所谓的“提示词 (Prompt) 工程”、“上下文 (Context) 工程”或“规范工程” 会给程序员带来一个光明和繁荣的职业。这股味道,闻起来就是对手艺、技能和劳动的贬低。在这个新身份下,我们那套独特的抽象思维能力并不是必需的;这把我们推向了一个早已被产品经理和设计师占据的领域。

在公司内部,随着这种新身份的推行,权力动态正在发生变化。为了在错误的地方 (作者暗示,真正的效率瓶颈不在于编码速度,而在于需求、沟通和设计) 疯狂地提高生产力,开发人员被迫以越来越具体的方式使用大语言模型。要么遵从,要么出局。要么使用那些预示着我们即将被淘汰的产品,要么辞职。以前,管理层很少会对我们的工具做出如此具体的规定。这些工具,就像厨师的刀具或木匠的刨子一样,是我们引以为豪、亲手挑选和打磨的:精心配置我们的编辑器、捣鼓 dot files (指 Unix 系统中的隐藏配置文件,如 .bashrc)、搭建开发环境。作为这门手艺的一部分,我们一直致力于个性化我们的工具集,使其与我们的思维方式相匹配。现在,让那些对日常工作几乎一无所知、本应关心结果、流程和促进创造力的管理层来下达这样的命令,感觉就像一种侵犯。几十年来,程序员在公司里一直备受宠爱。而这些(关于 AI 的)新叙事为管理层提供了一种新方法,让他们能把天平拨回对他们有利的那一边。


有些人幸灾乐祸、满怀期待地将大语言模型及其影响,比作从低级语言到高级语言的过渡:比如从汇编 (Assembly) 到 Fortran (一种早期的阶编程语言)。我认为,这种类比在几个方面都是错误的:首先,我们用 Fortran 实现的飞跃是植根于编程的,Fortran 并没有试图消灭一门手艺,而是在其之上构建。Fortran 没有移除程序形式主义的精确性和表达力,反而扩展了它们。其次,给定输入,Fortran 总能成功地产生正确的结果。在大语言模型的世界里,这些都不成立。我几乎能听到那些狂热者在大喊:“你只是用错了!”,同时他们不断移动球门,以适应不断变化的叙事。但我们不能指望 AI 工具能产生与编程语言相同的结果。它们是基于一套完全不同的规则和参数设计的。

英语中所有的脏话加起来,也不足以充分描述计算机和编程有多么令人沮丧,但至少,我们始终可以信赖它们的精确性:它们会完全按照编程的指示执行。也许正是因为我们依赖和信任计算机的精确性,所以当聊天机器人“煤气灯”我们 (Gaslight,一种心理操控,让对方怀疑自己的认知),让我们以为它们做了我们要求的事情时,我们似乎才那么容易相信它们。

大语言模型及其相关工作天然就是不精确的。无论是在大语言模型本身的属性上,还是在我们指导它们的方式上——使用充满歧义的自然语言。考虑到我们程序员是多么厌恶“非确定性” (non-determinism) (指一个操作可能产生多种不同结果),我们居然选择了这种计算方式,真是奇怪。我们更喜欢可预测性、可组合性、幂等性 (idempotence) (指一个操作执行一次和执行多次的结果相同),以及那些不会“飘忽不定” (flaky) (指时而通过时而失败) 的集成测试。而大语言模型生成的代码恰恰代表了相反的东西:不一致的混乱。

计算机科学家艾兹赫尔·戴克斯特拉 (Dijkstra) 在《论“自然语言编程”之愚蠢》一文中,曾一针见血地写道:“我们必须挑战‘自然语言能简化工作’这一假设。” 以及:“形式化文本的美德在于,它们的操作,为了合法,只需要满足几条简单的规则;当你仔细想想,它们是一种极其有效的工具,可以排除掉各种各样的胡言乱语——而当我们使用母语时,这些胡言乱语几乎是不可避免的。”


有一场运动试图通过强加严格的流程和官僚主义,来将 AI 辅助开发(让智能体占主导地位)与“凭感觉编程”划清界限,但这忽略了这头野兽的根本性质。我发现,我不会像读自己写的代码,或是在代码评审 (PR, Pull Request) 中审查的代码那样,去仔细阅读大语言模型为我生成的代码。似乎大语言模型编码天生就有什么东西,让我的眼睛发直。我只是草草掠过。既感到不知所措,又觉得无聊。只要 CI (Continuous Integration, 持续集成,一种自动化测试流程) 通过了,程序编译成功了,我就会盲目地接受那些暗藏的陷阱。根本不会去检查测试是否真的被设置运行了,或者它是否引入了一个根本不存在的库,抑或干脆自己实现了一整个库。当然,我稍后会付出代价,当我掉进自己挖的坑里,意识到数小时的工作都是建立在一个破碎的基石上时。或者,也许我根本注意不到,直到有人在代码评审中、在缺陷报告 (bug report) 中点名我,或者当我因为线上事故被呼叫 (paged) 时。

一本书的评论或概要永远无法取代你亲身阅读它的体验:当每个句子被仔细品味时,你花上数小时和数百页的篇幅去沉思其中的思想。同样地,浏览 AI 完成任务的摘要,剥夺了我们对领域、问题和可能解决方案形成深刻理解的机会;它剥夺了我们与代码库之间的联系。纵身跃入自己无知的深渊,去揭示、学习和理解一个主题及其含义,这既能带来满足感,也对优秀的软件至关重要。主人翁精神、能动性,以及深刻而充实的工作,已经被分散在 AI 智能体各个标签页之间的注意力所取代。

伟大的美国散文家琼·迪迪恩 (Joan Didion) 有句名言:“我写作,完全是为了搞清楚我在想什么,我在看什么,我看到了什么,以及它意味着什么。” 彼得·诺尔 (Peter Naur) 在他的著作《编程即理论构建》 (Programming as Theory Building) 中探讨了同样的概念。诺尔的“理论” (Theory) 体现了对代码库的理解。它如何运作,它的形式主义,以及它对现实世界的表征。这是一种只有通过沉浸才能获得的背景知识和洞察力。诺尔将这种“理论”描述为编程的主要成果,是真正的产品,而不是它所产生的软件本身。只有具备了发展完善的“理论”,一个人才能有效地对代码库进行功能扩展和缺陷修复。伴随着“凭感觉编程”而来的,是对代码的漫不经心的一瞥,这样是很难建立起这种理论的。我敢肯定,诺尔会认为这根本不可能。

好的设计源于沉浸。源于浸泡。源于在文本缓冲区中的反复打磨,而且常常源于远离键盘的思考。我们不可能把整个代码库都装在脑子里。我们必须深入到模块、类和函数中,去打磨我们模糊的心智模型。阅读和编写代码,以扩展我们的认知,重新获得对问题领域的熟悉和理解。

一旦脑海中形成了大致的上下文,通过大量的糟糕尝试,我们最终才能发现解决方案。我们必须能 感觉到 糟糕设计带来的“不和谐感”:只有当我们写出令人反感和重复的代码时,我们才会意识到,还有一种更好、更简洁、更优雅、可组合和可复用的方式。这会让你停下来。退后一步,深入思考问题。推倒重来。周而复始。与此截然相反,AI 智能体的工作是“无摩擦”的;我们避免了尝试替代方案,也无法知道我们接受的方案是完美的、平庸的、糟糕的,还是甚至是有害的。质量是通过迭代来精心打磨的——如果我们从未探索过那些糟糕的设计,我们又怎么能想象出好的设计呢?


充斥着大语言模型的编码所带来的“认知债务”,并不仅仅是我们对手艺的疏离。我们都听过这样的故事。那些被过度吹捧、“凭感觉”上头、注意力比 2010 年代初那些频繁跳槽换框架的 JavaScript 开发者还短的“垃圾代码骑师” (slop-jockeys) (一个贬义词,指那些大量产出低质量 AI 生成内容的人),在代码评审和设计文档中倾倒他们的污泥,阻碍了协作,扰乱了团队。负责审查代码的同事们快要疯了,他们痛心地意识到,自己现在成了质量控制的 第一道 防线,而不是最后几道之一。他们被要求审查;却被迫去挑刺。指出那些刚添加却从未被调用过的函数、AI 幻觉出来的(不存在的)库依赖,以及明显的运行时或编译错误。而始作俑者——显然只是草草看了眼“自己”的代码——却不承担任何责任,只是说:“哎呀,那是 Claude (一款 AI 模型的名字) 写的。傻傻的 AI,哈哈。”

爱管闲事的经理和吝啬的高管们正在(希望是无意中)推动团队减少人与人之间的互动。我们变得孤立无援,失去了联系,现在反倒被“赋能”和鼓励在我们的工作体验周围筑起高墙。当我们需要一个结对编程 (pair programmer) 的伙伴、一个可以来回碰撞解决方案的人、一个一起制作原型或勾勒架构的人,或者一个能回答代码库中深奥部分专家问题的人时,我们伸向的是大语言模型,而不是人。我们不再需要入职伙伴、导师或同事;相反,我们可以和机器对话。有了大语言模型,避免人际接触变得如此容易,以至于它很可能成为常态。未来“真”是光明啊……


令人不安的是,我们是如此顺从地接受了 AI 的炒作叙事,并积极参与这场有计划的、对我们手艺的抹杀,如此心甘情愿地交出了我们的思考工具。我们曾经是那些靠爱好谋生的幸运儿。即使我们制定了繁琐而僵化的流程来对抗“垃圾代码” (slop)——就像有些人支持的那样,其形式与古老的瀑布模型 (waterfall model) (一种老式的、线性的软件开发流程) 惊人地相似——我们仍然是把工作中“有趣的部分”外包了出去,取而代之的是导演式的苦差事。接下来呢?难道是写 TPS 报告吗? (TPS 报告源自电影《上班一条虫》,是“无意义的官僚主义文书工作”的代名词)

大语言模型看起来像是一种“从轨道上发射核弹”(一种夸张的说法,指“彻底摧毁一切”式的解决方案),用来解决软件的复杂性。我们没有解决真正的问题,而是伸手去拿一个更复杂、更模糊的东西来治疗症状。我其实并不介意用 Claude 来代替 sed (一个经典的命令行文本处理工具),或者在查阅了数小时文档后,仍然对某个库或框架感到困惑时去问问它。但我发自内心地不想仅仅成为一个操作员或代码审查者:在有趣和有意思的工作面前退居二线。我想手握方向盘,我想沉浸在手艺中,我想 交响乐团中演奏,我想解决复杂的谜题。我想继续做一名程序员,一名手艺人。

我更喜欢那些能帮我处理重复性任务(在编程中这种任务很多)、理解代码库和编写正确程序的工具。我对那些“旨在替我思考”的产品感到被冒犯了。它们剥夺了我对自己所生产软件的理解自主权,切断了我与同事之间的联系。即使大语言模型真的像宣传的那么神,我们仍然会失去所有这些,以及我们的手艺。人类比机器和它们背后的公司更重要,那些公司正在牟取暴利,而我们其他人则在追逐它们所兜售的新“美国梦”。作为代价,我们献上的是我们的批判性思维能力、我们的乐趣、我们的手艺、我们的隐私,也许还有我们的地球。