张大妈

AI编程会替代程序员吗?

源自知乎:NGINX洪志道

02-19 11:39

通过一个nginx实际bug修复案例,深度对比AI与人类程序员在解决复杂技术问题时的思维差异。从功能实现到系统设计,从快速修复到优雅重构,展现了人类程序员独特的工程审美和系统思考能力。

AI编程会替代程序员吗?智能速览

  • AI擅长快速解决问题,但缺乏系统层面的深度思考

  • 人类程序员追求代码的简洁性和可维护性

  • 优秀的修复方案需要理解系统设计层面的根本问题

  • 代码审美来自于长期维护他人代码的痛苦经验

  • AI与人类在编程上的差异主要体现在思维层次而非代码能力

AI编程会替代程序员吗?精华内容

当一个HTTP/2缓存bug出现时,AI和人类程序员展现了截然不同的解决思路。这个案例不仅揭示了技术实现层面的差异,更深层次地反映了人类与AI在工程思维上的本质区别。

问题背景

在nginx项目中,一个复杂的bug涉及HTTP/2 upstream、proxy_cache和keepalive三个功能的交互。缓存命中的请求会报"upstream sent frame for unknown stream"错误,但这个请求根本没有到达上游服务器

问题的根源在于ctx->id的初始化逻辑。在共享路径上,代码硬编码了ctx->id = 1,这个假设在复用连接时导致了stream ID校验失败。三个子系统各自逻辑正确,问题出现在交叉路径上。

AI的解决方案

AI给出了几种修复方案。一种是在校验处直接跳过cached请求;另一种是在各个可能出问题的地方加同步判断,确保ctx->id和r->cached两个值对上。

AI的核心思路是:cached的时候报错了,就在cached的时候绕过去。这些方案都能work,但AI并不关心这个补丁对系统的长期影响,只是单纯地解决眼前的问题。

作者的改进

作者试图让逻辑更简洁,在校验前同步ctx->id和ctx->stream_id,只用两行代码解决。功能上没有问题,测试也通过了。

但这种做法和AI一样,仍在校验处做文章,引入了r->cached这个上层概念。cache是HTTP层的事,stream ID校验是HTTP/2协议层的逻辑,两者本来不该有交集。

同事的优化

同事Arut给出了完全不同的方向:问题不在校验逻辑,而在ctx->id的初始化。他按连接类型分别初始化:新连接id = 1,复用连接id = 0。

校验处看到id == 0就知道还没发过请求,自然跳过。不需要知道上层是cache还是别的原因,任何复用场景都自动覆盖。

最终版本

经过一轮review,又精简掉了一个不必要的改动。last_stream_id是连接级别的状态,新连接和复用连接都应该从1开始,只有ctx->id需要区分,因为它表示当前请求有没有发出stream。

最终的方案在概念上更干净:id == 0就是没发过请求,不需要任何额外解释。

思维差异

四个版本的代码量差不多,差距在看问题的角度上。AI的做法是"这里出了事,加个特殊处理";作者的做法是"用最简洁的方式处理掉";Arut的做法是"去掉不该有的假设,问题自然消失";最后还多问了一步:“改动里有没有哪些其实不需要改的。”

人会被无数次维护别人代码的痛苦训练出对简洁、清晰的追求,这种审美AI目前还不具备。

AI在把想法翻译成代码这一层已经很强,但搞清楚该写什么、该改哪里、为什么这么改,需要系统整体的理解。将"替代"拆开看,AI能快速make it work,但make it right仍需人类来完成。或许未来的编程是AI负责实现,人类负责架构和审美?

AI编程会替代程序员吗?关键评论

  • 遇到bug时不该只让AI解决,而要分析系统设计是否有问题才会导致bug出现

  • 讨厌AI的KPI思路,为了通过而写代码,各种防御性编程导致可读性差得要死

  • AI写的代码是头痛医头脚痛医脚,但对代码品质有要求的人基本无法满意

  • 现实是make it work比make it right重要得多,资本推动下没人关心代码质量

  • 作为资深程序员,对这个思考非常理解,但现实中能运行就够了

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章