Use AI to write good code

缘起

最近阅读了 Uncle Bob 的《代码整洁之道》(一本挺不错的书),突然感觉自己平时用AI写的代码不怎么符合里面的原则。比如一个函数参数越少越好,但是AI经常可以一口气写带5、6个参数的函数。我突发奇想可不可以让AI优化它自己生成的代码,使之符合人类定义的“好代码”,更具备可扩展性。

我选取的软件系统是我最近的工作,一个MLsys系统。这个项目其实已经做好了架构设计,架构是人和AI都同意的,具体函数部分的细节外包给了AI,所以有很多优化空间。

过程

由于架构层面是当时进行过仔细思考的,类的内聚还行,所以问题不大,不用大改。我直接以一个个类为单位进行优化。

比如Runtime类,我先找出所有的对外接口。

Runtime(device,initial_ratio)
get_ratio_handle()
befire_batch()

嗯嗯,这个接口看起来还行,在不改变接口的情况下,可以放心地更改其他部分代码。我把代码整洁之道的pdf喂给了chatgpt,让它从不同的章节和方面把要点总结给我,如命名,函数,类等等(实际上AI做得很不错)。我再把这些部分给codex,让它根据这些要点,分别进行优化。

实际上,AI做得很不错。通过git的追踪功能,你可以看到每次它改了哪些代码,确定没有乱改。然后每完成一个方面的修改,代码都能通过所有的测试。可以很明显地感觉到代码在优化后变得简洁,人也可以理解得更清楚了。唯一我不喜欢的是AI喜欢做很多防御性的编程,和函数逻辑混在一起,但是这也不是个很大的事情。可以看到,AI优化完后的代码功能稳定(通过所有测试点),同时更简洁。

第二次vibe coding

这其实是我第二次使用coding Agent做具有一定规模的项目,和第一次做的时候感觉还是很不一样。

当我第一次使用vibe coding的时候,做法基本是许愿式编程,但是这一次我更多地加入了对设计的理解,从完全依赖AI到自己把握主要设计,把细节实现外包给AI。同时我还专门保留了md文档仓库来实现AI的理解持久化,确保项目设计的一致性。给我的感受是我更愿意进一步编程,思路也更清晰。我也更理解系统,知道下一步该如何去做。自我感觉比第一次好了很多。

Take away

这也让我思考人在软件工程中的价值何在。确实AI非常强,大到系统设计,小到具体函数的实现,很多时候都是依赖AI生成蓝本,我在其基础上进行改动。就今天来说,AI有时候会违背基本的软工原则,比如本应隔离修改的代码(已经在设计中规定好了),AI依然会跨模块修改。而且AI非常多变,在我指出一些问题之后,它会全然推翻之前的设计,怀疑设计的可靠性。

可能AI会完全在软件领域取代人类,Idea和想象力将会越来越重要,也可能AI会在大型项目中失败(我还没有做过大型系统,说不定AI的到来会催生超大型系统,bigger than ever)。但是抛开对软件开发人员面包的影响不谈,AI其实让软件开发人员变得开心了,在短时间内可以取得更好的效果,而不是沉溺在语法和细节中。

我有一种悲观的想法是,软件工程本身就是在设计上层层封装的,通过封装隐去了大量细节,从而让人类可以在某一个层面进行操作和设计。但是封装后的每一个层级,AI其实都比人类强,在相同的信息下,AI生成的方案非常可行(可能需要人类把关一下)。如果在每一层都让AI迭代设计,这也意味着软件问题被解决了。

但是我认为这不意味着人没有价值。对于人而言,人适合深度工作模式,这也意味着未来需要AI的生成速度大大加快,消除这个间歇时间。AI公司不是很喜欢展示AI在软件,硬件,数学,生物上的强大能力吗?那么有没有可能造出足够便宜的硬件和软件,让个人也可以拥有自己的模型和硬件呢?智能体的速度是否可以加快10倍呢?更多的需求会随之浮现出来。同时,从原理上来看,在从事没有已有数据的工作时,AI会变得很垃圾,这才是人类的价值所在。人类需要迈向这些新领域。对于我个人而言,我也要加速从软件构建领域往更新的领域靠拢了。不知道半导体领域是不是一个好方向。

对于工程师来说,Idea也变得更加重要了。虽然要理解很多的工程原则,防止AI设计出乱到爆炸的产品,但是我感觉这种防范将会变得廉价(虽然AI可能也会变得廉价),因为人类只需要偶尔进行指导。过去我有一种错误的观念,认为Idea是学术界的事,廉价,论文导向。但是这是不对的,只要是重要的方向,Idea也是工业界的事情。

Uncle Bob的最新访谈

作为《代码整洁之道》的作者,Uncle Bob也表达了自己的一些看法。他提到需要使用确定性工具(测试等)建立循环,让agent持续修改,直到质量达标。他最近设计了一个工具,我觉得还蛮有意思的:通过图形化的界面表示系统,而不是代码,让人类可以在一个更高的维度构建软件(在AI替人类生成所有代码后)。

< Back to all posts