了解你的敌人:对AI辅助软件开发的批判性探讨
摘要
Amy J. Ko 分享了她对AI辅助软件开发的批判性观点,探讨了使用LLM编写代码的前景与陷阱,并讲述了她为期三个月的实验,以评估对生产力和实践的真实影响。
<p><a href="https://lobste.rs/s/7ke9cs/know_thine_enemy_critical_engagement">评论</a></p>
查看缓存全文
缓存时间: 2026/07/12 22:54
# 知己知彼:对AI辅助软件开发的批判性审视
来源:https://medium.com/bits-and-behavior/know-thine-enemy-a-critical-engagement-with-ai-assisted-software-development-e41d9b058ab1
*(按下回车或点击查看全图)*
*这幅作品曾挂在波特兰一家深受喜爱的餐厅的洗手间里。它很好地诠释了当前LLM与社会之间的关系。*
Amy J. Ko (https://medium.com/@amyjko?source=---byline--e41d9b058ab1---------------------------------------)
长期以来,我一直对大型语言模型、生成式AI以及其他基于对人类数字活动进行监控的巨型统计模型持怀疑态度。并非我不相信它们能工作,或者它们不会改变人们或社会,甚至不认为它们是令人印象深刻的工程壮举——它们当然能工作,当然也在改变世界,正如技术常做的那样。问题在于,它们助长了**学习回避** (https://medium.com/bits-and-behavior/more-than-calculators-why-large-language-models-threaten-public-education-480dd5300939),为了生产力和利润而招致了**大规模监控** (https://medium.com/bits-and-behavior/dagstuhl-trip-report-creativity-code-and-generative-ai-26b5e414bdf3),它们让实现软件过程中的棘手部分(理解、连贯性 (https://medium.com/bits-and-behavior/large-language-models-will-change-programming-a-little-81445778d957))变得更加困难,并且让设计软件的重要部分(需求)变得**过于容易**以至于做得很差 (https://medium.com/bits-and-behavior/large-language-models-will-change-programming-a-lot-5cfe13afa46c)。最糟糕的是,用数据建模人类行为和历史这一理念本身,就否认了我们的**非数字的、情感的现实** (https://medium.com/bits-and-behavior/we-are-not-binary-ai-and-dehumanization-db03754d06ac),以及我们未来自我所有无法编码的可能性。
然而,近年来LLMs在许多领域的影响是无法忽视的。无论我认为这是否道德,人们都在将撰写电子邮件委托给语言模型,搜索和总结文档集合,生成艺术,逃避学习,上瘾,甚至有时死亡。尽管我非常不喜欢这种转变,并将继续对此发声,但我无法忽视这个现实。
我同样无法在不理解人们看中生成式AI什么、资本家如何定位它的情况下,令人信服地**反对**它。如果我们正处于一场争夺人类灵魂的战争之中,那么让身处未来前线的人们对另一方的武器一无所知,对任何人都没有好处。因此,三个月前,我决定深入探究我最熟悉的领域之一——软件工程——以建立我自己的直觉:编程将走向何方,AI辅助软件开发有何不同,以及它如何改变实践。
我有充分的理由进行这次深度探索。作为业余爱好,我维护着几个开源项目(Wordplay (https://wordplay.dev/)、Adminima (https://www.adminima.app/)、Bookish.press (https://bookish.press/) 和 Reciprocal.Reviews (http://reciprocal.reviews/)),因此我编写大量代码,审查大量拉取请求,修复大量错误。最重要的是,我用业余时间做这些,而时间非常宝贵。AI辅助软件开发营销描绘的美好前景是,我可以用相同时间完成更多工作,或者完成同样工作量但能找回一些周末时间。我想回答的问题是:这两种情况是否真的能实现?如何实现?以及这会对我和我周围的人及社区产生哪些负面外部效应?为了找到答案,我订阅了 Claude Max 订阅,购买了一些 Claude API 额度,安装了 Claude CLI 和 VS Code 扩展,并将我的软件开发工作流程从依靠电音、爵士和蓝调背景音乐的湿件专注模式,转变为分心的提示和代码审查模式。为此,我使用了 Opus 4.8 以及最近的 Fable。
三个月过去了,我得到了一些观察,特别是关于软件开发的,但也关于更广泛的作为技术的生成式AI。
## 我确实用更少时间构建了更多,但并非总是如此
我从12岁开始编写计算机程序,这意味着我有24年的经验来塑造需求、规划架构和实现它们。这意味着我使用 Claude Code 的方法主要是预先投入大量精力进行防御性的书面设计规格说明。我被坑过足够多次,深知在实现之前尽可能多地预判,对于防止返工和缺陷至关重要。而且,我见过足够多的架构,能够在脑海中想象出我要构建的东西、哪些设计模式、算法、控制流和数据流适合满足需求、以及工作的难点可能在哪里——所有这些都在写一行代码之前完成。这种专业知识意味着我是这些工具的**最佳**案例开发者。这并非评估新手或学习者如何使用该工具,而是专家分析。
因为我的计划非常详尽,环境设置提供了丰富的上下文,架构也很干净,对于大多数任务,Claude Code 在90%的情况下能给出一个合理的实现。在每一个这样的案例中,它通常都未能遵循我代码仓库里的约定,尽管这些约定有文档记录且无处不在。我经常需要告诉它避免创建代码克隆,因为它会忽略已有的功能,尤其是在有30万行代码的 Wordplay 中。但在这些情况下,我需要修复的大部分问题都是关于可理解性和可维护性的小问题。
然而,剩下的10%情况往往糟糕透顶。因为 Claude 无法有效存储我仓库的全部上下文,而详细的架构描述也常常不足以涵盖其细微差别,缺陷通常是深层嵌入的假设。它生成的算法存在性能问题,只有了解应用程序的实际使用方式时才会显现。它嵌入了关于可用性、可访问性、可学习性以及其他难以编码的属性的特定软件质量假设,这些假设大概是从更广泛的互联网实现模式中继承而来的。它创建的测试用例编码了有缺陷的需求,导致正确性和完整性的评估过于乐观。有几次,它甚至损坏了数据,并无法恢复地删除了未提交的、进行中的编辑。
我能发现所有这些问题的唯一原因,是我会深入审查它生成的每一行代码,并提供多轮(有时甚至几十轮)的批判性反馈,将实现的形态锤炼成可以发布的样子。这项工作让编程感觉不再像是构建东西,而更像是一个传话游戏:我描述一些东西,得到某种万花筒般的版本,然后迭代直到它创造出足够好的作品。这不是通往创造美丽或智力上连贯之物的途径,而是创造出功能尚可但未经雕琢的东西。就像资本主义政治经济中任何其他形式一样,它满足于商品,因为更便宜、更快。
## 它解放了我的时间,却以牺牲注意力为代价
我一生所做的编程工作,始终要求大量不间断的专注时间。编写软件是一项认知要求很高的工作。当我们编程时,我们会用关于问题的极其细致的上下文填满工作记忆,进行推理、逻辑、判断和创造。这个过程追求的是永难达到的**心流** (https://en.wikipedia.org/wiki/Flow_(psychology)),并且可以非常快乐,就像艺术家进入她的工作室进行沉浸式创作,出来时创造出前所未有的美丽事物。这种体验只有在专注时才有可能实现。
使用 Claude Code 来创建软件则是一种明显不那么快乐、也不那么专注的体验。用户体验通常是用自然语言编写需求,等待 Claude 摄入足够的上下文来制定计划,审查并细化计划,等待它执行计划,并为有副作用的风险操作授予权限。一旦完成,就开始了代码审查、反馈和细化的过程,直到满足最初的需求(或者,像正常编程一样,过程中浮现出新需求)。
这个过程的问题在于,它无情地割裂了我的注意力。我需要监控它的规划,以免它忽略关键上下文并生成有缺陷的计划。我需要仔细阅读它的计划,并经常自己阅读它处理的源代码,以确保计划是合理的。在执行期间,它会每隔几秒到几分钟就中断一次,请求权限。而在代码审查期间,我分析的不是我自己写的、基本都能理解的代码,而是必须审查不熟悉的代码。总的来说,这通常比我自己创建要快,但这意味着不是几个小时的学习和专注,而是三十分钟的分散注意力——在此期间我试图做其他事情,比如家务或电子邮件。如果我同时并行处理两个、三个甚至更多会话时,情况会更糟,每分钟都会被打断。
因为 Claude 在构建,而我没有亲自构建,我的确找回了一些时间。我整个周六的工作时间确实缩短到了上午,留出了下午做其他事情。但上午现在变得无聊而碎片化,而不是充满创造力和赋能。更糟糕的是,每次会话结束后,我都有一种要继续下去的冲动——能够如此快速、大量地构建具有一种力量感,既然我过去需要花一整天,为什么不构建以前的2到3倍呢?Anthropic 发布的“远程控制”功能(允许从智能手机指导一个会话)只会让情况更糟,因为这样我**在任何地方**都可能分心,而不是仅限于笔记本电脑。
这当然已经渗透到我的人际关系和其他工作中。与其和妻子一起专心用餐,我的心却牵挂着 Claude 应用里的权限通知。与其在工作周有专注的写作时间,我却让 Claude 的通知侵入了我的阅读、写作甚至顾问工作。这意味着需要更刻意地练习正念,因为总有一个算法在索求我的专业知识。
唯一能遏制这一切的,除了我自己的正念练习,就是金钱。Claude 将订阅限制在固定的令牌消耗会话期内,而 API 的限制则取决于我的钱包。这种安排意味着,我的大部分注意力被结构化成了 Anthropic 与我的大脑之间一种榨取性的、几乎是虐待的关系:尊重限制,我就能安然无恙;但屈服于任何想要制造更多的欲望,就意味着更多的金钱、更少的专注和更少的快乐。
## 它扭曲了我的设计流程
我拥有人机交互博士学位。当我设计软件时,我的天性和所受训练都要求我在进行软件制作之前先暂停、倾听、学习和提问。我会问我们是否应该构建它,为什么应该构建它,我们为谁以及与谁一起构建它。实现,甚至软件架构,都必须在与人们和社区进行长时间学习、了解他们的需求、愿望和渴望之后才能进行。创造的本身应该包含将使用它的利益相关者的声音,任何将他们与这种创造过程隔离开来的设计都是有问题的。
Claude Code 的设计基于一个不同的前提:决策者是个体。产品没有任何地方承认或支持集体工作,甚至包括设计工作。它当然可以与 GitHub 和版本控制之类的东西良好接口,但这些远非集体项目;它们是专家空间,几乎没有容纳其他声音的余地。这意味着在使用它时,阻力最小的路径是孤立自己:与人交谈只会让你慢下来,而你的令牌可等着被消耗呢!
我自己的流程与这相冲突,因此将 Claude 引入其中产生了摩擦。现在有一种感觉,发布就在一个提示词之外,而过去,工程成本足够高,以至于找到正确的设计至关重要。随着工程成本的降低,产品制造了一种幻觉:正确的设计可以稍后获得,因为那个正确的设计也将只是一个提示词之遥。当然,现实是,一旦某样东西发布,人们开始使用它,软件就变成了一个粘性的新现实。竞相发布实际上意味着竞相**假设**。
我不得不在我的流程周围设置各种障碍来解决这种摩擦。这些措施包括:
- 强制在拉取请求中详细阐述“为什么”,以揭示假设——不仅来自他人,也来自我自己。
- 明确且有方法地质疑实现中内置的假设,以验证它们没有违反我对需求的理解。
- 将 Claude 的使用限制在远离设计的下游实现阶段。它仅**在**经历了漫长的需求收集过程后**才出现**,并且我不将其用于需求收集本身。
与我的注意力一样,所有这些都需要自律,而这项技术的一切都鼓励人们走捷径,违背这些原则。
## (超越)结论
如果我戴上最狭隘的计算机科学帽子,我当然会感到印象深刻。自动化程序合成在十年前还仅仅是一个梦想;现在它已成为现实。促成它的研究背后的动机——无论是受《星际迷航》中基于语音的计算机编程描绘所驱动的自然语言处理梦想,还是关于更快开发的软件工程研究梦想——都已经实现。计算机科学长久以来一直想自动化软件开发,而基于LLM的开发代表了自该领域诞生以来,朝着这一愿景迈出的最大一步。
然而,正如计算机科学的整个历史一样,这项工程壮举几乎忽视了其对人们、社区和世界影响的每一个方面。我清楚地看到,在过去三个月里,它是如何剥夺了我的专注、快乐、金钱和价值观。其他像我同事 Emily Bender 这样的人已经**充分记录** (https://thecon.ai/)了它将如何剥夺世界的可持续性、土地、学习、权利和自由。在某种程度上,这些都不令人意外——毕竟,支配、榨取和非人化正是更广泛的资本主义政治经济体系的设计目的——但现在有了一个工具可以更快地做到这一点,并且披着进步的外衣。而我们中的许多人,直接或间接地,将为了竞相奔向那场崩溃而付出巨大的代价。
这个结论让我面临一个道德问题:我还应该使用它吗?我将这个问题与其他类似问题进行比较:“*当汽车是美国人的头号死因时,我还应该继续开车吗?*”、“*当飞行是我们最大的碳排放源时,我还应该继续飞行吗?*”、“*当大学被构建成工业化、新自由主义白人至上主义的项目时,我还应该在那里教书吗?*”这让我想起了 Audre Lorde 那句常被引用的名言:
> **“主人的工具永远不会拆除主人的房子。它们可能让我们暂时在他的游戏中击败他,但永远不会让我们带来真正的改变。”**
人们可以开车、飞行和教书,作为解放工作的一部分,甚至也许可以时不时地使用LLMs进行政治上的小规模冲突,但工具本身不是目标。目标是改变我们的社会系统,而在这个系统中,很可能没有为那些为剥削和贪婪而构建的废话机器留出空间。
对我来说,我认为这意味着一种减少伤害的方法。在某些时候,当我使用
相似文章
审查AI代码并非一个站得住脚的论点(2025)
文章认为,要求全面审查代码会抵消LLM编码助手所谓的生产力提升,因为实证研究显示它们并不能帮助写出更好或更快的代码,而且支持者未能解决固有的错误率问题。
关于AI辅助编码的十二种错误方式
本文批判了评估AI辅助编码工具的常见错误方法,例如计算代码行数、计时人工任务以及依赖开发者自我报告,主张采用更严谨的研究方法。
LLMs 与表演式生产力
一位开发者反思使用 AI 代理的经历,并质疑表面上的生产力提升是真实的还是仅仅是表演性的,指出虽然任务完成得更快,但深层理解和真正价值可能会丢失。
关于人工智能
作者回顾了自己从在老旧Macintosh上手动输入代码到使用Copilot和Claude等AI辅助代码补全工具的历程,并得出结论:尽管AI行业存在问题,但技术本身是有用的。
技能成为新的代码检查工具
作者认为,使用AI技能来自动化代码质量检查,会重现代码检查工具最初旨在解决的内存与可靠性问题,从而质疑基于大语言模型的技能作为替代方案的有效性。