最近一段时间,AI替代程序员的新闻越来越多,有纯AI自主写出一个浏览器的新闻,也有行业大佬跳反鼓吹人工编程末日已经降临的新闻。刚好最近一段时间,我也用AI协助写了一些代码,谈谈我自己的体验。我没有使用Agent这些时髦的工具,只使用最基础的模式,向deepseek描述我的需求,然后检查它给出的代码,如果没问题则合并到我的代码中,如果有问题,则继续向deepseek提问以修正代码。
我使用的开发语言是C++,写的代码也相对比较底层,对性能有一定要求。根据deepseek的表现,我把这些场景分为几类:
1、常规需求,性能要求一般:对于这类需求,只要描述信息到位,deepseek能很快的给出合格的代码,甚至于还能想到很多我没想到的边角场景,我检查这类代码也比较轻松,开发效率可以达到手写的10倍以上;
2、常规需求,要求高性能高并发:对于这类需求,deepseek也能很快给出靠谱的代码,接口也很清晰。然而由于涉及高并发场景,我检查的速度就比较慢了,一个无锁高速消息总线的类,花了半个小时交互生成代码,检查代码却花了一上午!最终还是发现了一个接口有并发风险,于是反馈给deepseek,deepseek马上承认并修复了BUG。总体算下来也比纯手写代码效率要高上5倍以上;
3、高级特殊需求:比如有一个类模板要实现编译期反射功能,需要用到模板元编程,这一般是只有C++库的开发者才会用到的特性,也是C++编程里面最让人头皮发麻的部分。照常给出需求描述后,deepseek生成了代码,然后我傻眼了,WTF!这是C++语法???!!!试了下编译,报了一堆稀奇古怪的错误。限制了最高使用C++20语法,依然看不懂,于是开始了漫长的学习C++模板元新语法的过程,3天后,代码终于达到我的要求并测试通过。也许,下次再碰到这类需求,我就不需要再花3天了。
通过这段时间的AI辅助编程体验,我的感受是:
1、AI就是一个万能的预测机器,你的需求越普通,它就做得越好。
2、如果你想做点和别人不一样的,那就要想办法把有效信息表达出来,否则它会随便套一个模板上去交差。
3、由于自然语言充满歧义,实际上想要精准的表达需求是很困难的,最高效的方式还是交互式的生成,不断由人工检查AI的输出并纠偏。
4、最大的瓶颈还是在人这边,如果没有有效的人工检查和纠偏,AI会在不起眼的地方胡编乱造,也许每个步骤的靠谱程度都是99%,但是最终整个系统就是灾难。
5、AI把程序员从底层的编码工作中解放出来了,极大的提升了开发效率,但是它并没有自动构建一个系统的能力,至少目前还没有。
6、驾驭AI的程序员依然需要学习所有AI用到的知识点,否则可能被糊弄。
我不相信目前的AI有能力自己构建一个复杂系统,前面提到的AI开发的浏览器项目,最近也被人爆出根本编译不过,更别说能正常跑起来了。从信息论的角度看,一个系统需要的决策信息不可能凭空产生。当然如果你要做的本就是一个“大路货”,那么它所包含的有效信息其实是很少的。如果你想做的东西跟现有的都不一样,那么如何精确描述系统的行为和特征就是一个绕不过去的难题:要么用自然语言啰啰嗦嗦的说一大堆却依然漏洞百出;要么用严谨晦涩的形式化语言来对系统建模;要么先把测试用例代码写好,然而依照经验,测试代码的规模是产品代码的3倍以上。
理论上,如果能给出所有的有效信息,代码是不需要人工手写的,甚至于都不需要用到AI,传统软件方法完全可以自动生成代码。比如只要给出一门编程语言的形式化定义(如巴科斯范式),就可以全自动生成这种语言的编译器。又比如IBM之前开发的系统建模工具Rational,就可以根据所画出的UML图自动生成代码,然则实践中大家发现,写代码的难度,还不及如何用Rational工具精准表达需求的难度,最终业界选择了这么一条路:你先写出来,我看看是不是我想要的。
软件开发最大的难点从来都不是把代码写出来,而是需求说不清楚。AI相比于Rational的进步在于,对于用户没有说清楚的部分,它可以自动给套用模板,这样就把自动生成代码这条链路的鸿沟给填平了。然而,香农定理依然在起作用,如果你能接受AI给你自动套用的模板,那么事情很完美,否则事情又回到老路上去:你先写出来,我看看是不是我想要的。只不过这次的甲方是程序员,乙方是AI。