文章摘要
文章指出,使用AI编程时容易忽视代码质量,例如重复编写相同逻辑的条件判断。作者反思了这种懒惰做法,认为即使AI能处理后续修改,也应遵循最佳实践,编写易于人类维护的代码。
文章总结
标题:像人类会维护那样写代码
大型语言模型(LLM)能全天候为你写代码,这确实很棒。你不再需要担心“不要重复自己”原则——比如,你无需亲自在四个不同文件中更新同一个冗长的条件判断,AI会替你完成,对吧?
最近我在一个用AI构建的项目中,发现自己逐渐放松了警惕。我在多个地方需要相同的访问权限检查:路由处理器、后台任务、API端点、Webhook等。每次我都描述需求,模型生成可运行的代码,我就直接合并了。
每个版本大致如下:
if (user.isActive && user.hasPermission('read') &&
!user.isSuspended && account.status === 'open') {
// 执行操作
}
本质上每次都是相同的条件判断:四个条件,变量名略有不同,逻辑几乎就是复制粘贴,只改了一两个词。其实有更干净的做法——比如提取一个共享辅助函数,如果我自己写代码肯定会这么做。但我没有。代码能跑!测试通过了,而且反正不是我以后要维护它。
这就是懒惰所在:如果代码不遵循最佳实践,或者我知道某段代码将来维护起来很麻烦,那又怎样?以后需要修改时,LLM会处理,又不是我。
然而,LLM并非在真空中写代码。它会读取你的代码库:你打开的文件、已有的模式、最近的改动。你合并到代码库中的每一个捷径,都在传递“这里就是这么干”的信号。下次你让LLM写另一个具有相同访问规则的端点时,模型不会从基本原则出发,而是会参考仓库里已有的四个副本。
于是你要求第五个端点,得到第五个条件判断,还是同样的复制代码。你要求重构,模型保留了全部五个,因为你的代码看起来就是这样。坏模式不再是偶然,它成了你的风格。
如果继续这样放任,你真的能相信LLM以后会抓住每一个实例来修复吗?
当然,几个这样的问题不会造成灾难。事情总是这样开始的,但代码坏味道会不断累积。每个重复的条件判断、每个“上帝”函数、每个“我以后会清理”的合并,都会为下一次提示增加一层信号。最终,你无法轻易通过提示摆脱困境——至少得亲自动手、卷起袖子。
最令人沮丧的是:我原以为把维护工作外包给了LLM,但实际上我正滑向一个斜坡,训练它养成越来越糟糕的习惯。
像人类会维护那样写代码。 LLM就像海绵,会吸收你做的每一件事,然后原样反馈给你。所以,确保你写的是好代码。
评论总结
根据评论内容,主要围绕AI生成代码的可维护性展开讨论,存在两种核心观点:
观点一:AI代码需保持人类可维护性 - 支持者强调代码应优先考虑可读性,引用经典名言:"Add comments to your code under the assumption that the next person to maintain it is a homicidal maniac who knows where you live"(alexpotato) - 建议通过AGENTS.md明确要求:"You are an engineer who writes code for human brains, not machines"(phaser) - 认为代码库质量影响未来AI输出:"The key idea here is that your codebase is context that will be used for future changes"(wxw)
观点二:AI时代应改变代码维护范式 - 主张放弃人类可读性:"don't write code for human consumption if you use AI; BUT you have to accept AI coding lock in"(andrewjneumann) - 认为传统模式已过时:"These patterns were designed to make code easier for humans to read and write, but that is no longer the primary way software is built"(uhhhd) - 实践者表示:"If the tests pass it's good to ship. AI can deal with the problems it may create"(schnebbau)
平衡性补充: - 部分评论指出问题本质不在AI:"Humans have been writing unmaintainable code well before LLMs came along"(bdcravens) - 提出实用解决方案:通过自动化工具(linting/static analysis)和定期代码审查(cron job)维持质量(jasonlotito, planb) - 强调组织规范的重要性:定义软件层、业务词汇、数据字典等基础建设(exabrial)