开发者与 AI 协作修复 Bug:展现 AI 优缺点,凸显人工参与重要性 与人工智能协同工作一个具体示例总体而言对人工智能持矛盾态度。过去一年里它成为开发领域强大工具但也带来诸多危险包括对个人思维能力的影响以及集体层面的环境问题、个人计算成本增加等。在《代码更便宜》一文中曾对“魔法师的学徒”问题发出警告即开发者过度依赖人工智能无法解决系统中出现的问题。本文将讲述维护 hyperscript 时与人工智能的一次具体交互展示其优缺点并说明“魔法师的学徒”问题。Hyperscript 解析器hyperscript 是用于 Web 的替代解释型脚本语言完全用 JavaScript 编写。编写时故意打破许多解析规则进行实验例如解析逻辑与解析元素放在一起、解析器可插拔且语法动态定义、支持多种属性访问语法。虽不建议大多数编程语言采用此方法但在该项目中效果不错证明软件开发解决问题有多种途径。一个 bug 报告一位用户报告升级到 0.9.91 版本时出现回归问题表达式“fetch {% url trade:get_symbol_data %}?symbol${symbol} as JSON”无法正确解析。具体是“as JSON”绑定过紧应获取给定 URL 并将结果视为 JSON而非提前转换。这是解析过程的经典问题因 hyperscript 是 xTalk 风格语言继承英语歧义问题更严重。调查原因调查回归问题出现的原因时借助了人工智能 Claude。它找出根本原因0.9.91 版本重构 go 命令与 fetch 命令共享逻辑时过于激进提取通用方法 parseURLOrExpression() 时不小心将 fetch 命令后的语法扩展到包含通用的 expression 表达式。“as”关键字在表达式中有类型转换含义也是 fetch 命令的修饰符。重构中让解析器在 fetch 关键字后解析表达式使“as”被当作表达式解析而非 fetch 的修饰符。Claude 帮助下几分钟内就找出问题比自己摸索快得多。修复问题人工智能在找出问题原因上有帮助但解决问题表现不佳。提议的修复方案 1临时修补第一个建议是先解析“类字符串”叶子节点再尝试完整表达式可解决用户直接问题但过于针对报告的 bug无法解决一般情况如使用变量作为 fetch 的目标因此被拒绝。提议的修复方案 2更好但不必要的复杂性第二个提议是在解析器上添加 noConversions 标志解析 URL 时设置让 AsExpression.parse 在标志设置时退出这会使 hyperscript 解析器变得上下文相关。但 hyperscript 解析器本来就是上下文相关的研究后发现已有所需的上下文相关基础设施无需引入新标志Claude 未发现这点。Hyperscript 解析器中的 “跟随” 概念hyperscript 解析器中有“跟随”概念即由“上级”解析元素声明为跟随标记的标记。它是递归下降解析器允许解析元素声明关键字使表达式不与这些关键字匹配。例如 when 特性使用 or 作为分隔符。可将“as”作为跟随标记推入、解析表达式后弹出防止 AsExpression 解析同时允许通用表达式正常工作。提议的修复方案 3接近但未成功向 Claude 指出这点后它用此技术修复 bug在 parseURLOrExpression() 中添加正确代码从根本上解决问题。最终的半自然修复方案审查更改时发现新修复方案过于宽泛fetch 和 go 共享方法但只有 fetch 使用“as”表示修饰符现有方案阻止了 go 命令中有效的“as”类型转换表达式使用。因此自己在 FetchCommand#parse() 中实现最终修复方案将特殊情况限制在 fetch 命令上使 go 命令解析不受影响。测试整个过程中让 Claude 为各种情况生成测试用例。hyperscript 有现有测试套件Claude 出色创建了小型、有针对性的测试展示问题及修复方案是否正常工作这是人工智能表现良好的领域。故事的启示这个 bug 修复故事显示人工智能在调查和测试用例创建方面表现出色但在提出简洁解决方案方面表现不佳。若不熟悉 hyperscript 解析器及其基础设施修复过程易积累技术债务因此让了解底层基础设施的人与人工智能协作在控制复杂性方面比人工智能独自工作更有效。此例中了解情况的人与人工智能协作一定程度上控制了复杂性避免像“魔法师的学徒”那样盲目接受解决方案而是要求适合现有代码库架构的正确解决方案。希望这与“氛围编码”形成对比“氛围编码”中开发者似乎以不理解实际发生的事情为荣。题外话人工智能与年长的开发者作为 50 岁的年长开发者随着年龄增长会“失去速度优势”记忆力不如以前不能长时间工作。人工智能解决了这两个问题在记忆力方面通过提示可快速理解事物提高在开源和工作项目间切换的效率在长时间工作方面人工智能能持续工作使项目拥有更广泛的测试套件。但担心人工智能会导致整体智力普遍下降依赖它的时间过长会感到羞愧这是仍在探索的领域。结论记录这一系列交互体现了人工智能在编码辅助方面的优缺点展示了有能力的开发者与人工智能协作的价值也揭示了盲目接受人工智能解决方案的危险希望对思考与人工智能协作策略有帮助。俳句JavaScript 疲惫渴望超文本已然在手