乐于分享
好东西不私藏

AI 正在重构开发流程

AI 正在重构开发流程

大五一放假的时候,为啥会写这么一篇文章?只能说,谁让我答应了别人呢。下次这种大过节还让我干活的任务,不接了!

书归正传。

接下来聊聊,究竟怎么让 AI 深入应用到一个项目开发中。这个项目是我业余时间做的个人项目:历史的今天。

这是一个发布于 2023 年 2 月的 iOS 练手小应用。一开始采用原生 iOS SwiftUI 编写。八个月前,我把项目整体推翻重构,改用 Kotlin Multiplatform(KMP)重写。重写原因有两个:一个是因为 Xcode 的自动提示、使用体验等等,相比 IDEA 感觉简直不是一个时代的产物(个人感觉,不喜勿喷,都是你对);另外一个原因是我还是想做跨平台(这一点最后还是放弃了,国内应用商店上架真的对个人开发者太不友好了!!!!)。最终,这个应用还是只上线了 iOS 平台。

这次 KMP 技术栈重构,是我第一次真正与 AI 进行深度编程协作。首先,我让 AI 详细分析了一下原有项目的逻辑,包括有几个 Tab、每个 Tab 内的详细功能,以及对应的逻辑和布局样式。在这个过程中,AI 帮我生成了很多项目相关的文档。为什么是很多个,而不是一个?实测生成一篇完整文档时,篇幅会非常受限,功能描述得不够清晰;或者后续持续沟通修改时,会把已经写好的内容再次改得面目全非;再或者,它会忘记我在几轮对话前反复强调过的事情。总之,如果上下文过长,信息丢失是不可接受的(现在 DeepSeek 据说有 1M 上下文,我还没试过,很有必要试一下)。基于此,我采用了分步骤、分模块的方式进行划分。经过我和 AI 多轮沟通、审查和调整,最终根据原有项目生成了数个 Markdown 格式的项目详情文档。

接下来,我创建了一个 KMP 初始化项目,设置了一些基本的包名信息等基础内容后,就把上面生成的 Markdown 文档输入给了 AI,让它根据文档去生成代码。不得不说,第一次完整生成一个项目是真的慢呀!!在我的印象中,Agent 至少运行了四五个小时。我承认,项目最后真的跑起来了,但是由于一些内容的逻辑关系,并不是一小段程序就能搞定的,而是涉及多个界面的用户操作、状态流转、数据更新等问题,所以这个项目还是存在很多问题的。

没有办法,只能继续和 AI 聊,让它明白我想干嘛、它哪里不对。这个过程单调、无聊且繁琐,但反倒是让我最快了解 Agent 能力边界的一个过程。比如,刚开始时,某些修改可能会引起编译不过的问题。我让它在每次修改后都进行编译检查,于是它基本上会把每次 TODO List 的最后一项都设置为编译和 Lint 检查,最终直接结束后,基本都能编译通过了。

再比如,执行某些操作时,如果我让它修改某一个变量的名称,它不仅会修改这个变量名称,也会把相关的其他变量一起修改,使整体命名符合统一习惯,相关引用的地方也会同步修改。它不仅仅是在执行我的指令,还会有一定的扩展。这一部分可以通过调节 Agent 的发散性来获得不同表现,现在主流的大模型基本都支持对应参数。

再比如,我让它升级某些依赖库。它发现升级后存在某些问题时,不是去解决问题,而是直接回退升级修改,怎么说都不行。最后还是我手动修改的。这个时候我也不知道它为什么那么固执。

在这个过程中,我不是单纯地和它说我要做一个什么样的应用或者功能,而是先基于原有项目生成 Markdown 文档,再让它根据文档重新实现。这其实让这次第一版重构可以基本完全还原原有的功能和界面。如果是我和它一点点说要怎么弄,估计会是一场灾难(这句话好像有点英语味)。

这个应用后续我又进行了很多迭代和修改。我发现,大模型由于只能通过逻辑分析,无法真实地在界面中运行并观察最终效果,因此对于可能存在的问题,需要你明确指出它具体是什么样的表现,它才能进行修改。这一点我还没找到一个特别好的解决办法。

PS:把问题视频上传给 ChatGPT 后,直接让 ChatGPT 分析问题原因,有时有奇效。再把分析出来的问题原因交给 Agent,往往可以快速解决问题。

再有就是,Agent 对于代码重构,尤其是一些小模块、高内聚、重构思路明确的任务,处理起来极其方便并且快速。比如进行一些模块抽象处理、重复代码重构优化等等,它甚至会给出一些意想不到但非常优秀的重构思路。

接下来再聊聊,在工作中我是如何与 AI 协作完成需求的。

首先,PM 出的需求质量参差不齐。有的是很多东西想不到,也不写;有的是废话连篇,重点没几句;有的是需求只有一个大概,完全没有细节。当然,也有条理清晰、主次分明的,这样的 PM 太少了,可遇不可求。

如果我决定最终要用 Agent 帮我完成具体的编码工作,我往往会先把需求交给 AI 分析一遍,让它处理成一份详细、清晰、可执行的需求说明文档。这个文档要尽可能详细且准确地描述需求,同时也会包括一些技术边界和实现细节。在这个过程中,我也需要多次确认文档内容是否正确。

给 AI 的输入,可能是我直接把需求文档下载下来,修改后再上传;也可能是使用 Skill 从需求卡片中读取需求。这取决于需求本身的质量是否足够高。总之,这一部分的输出,是之后 AI 具体执行的根本依赖。这里搞错了,后面就白玩。

接下来,我一般会重启一个新的 Session 会话,避免之前的各种信息污染和上下文过长,让 Agent 基于新的输出去真实执行编码操作。这个过程中免不了各种修改和调试,这和普通的直接 Coding 没什么区别。

Claude Code 确实如此 NB,也确实如此 Expensive。GLM 有点慢,但是基本能完成工作。其他模型我用得比较少,就不做评价了。

还是那句暴论:现在的模型能力,已经不是 Coding 的瓶颈了!

这里需要明确说一点:对于比较大的项目,Agent 没有办法完全理解,至少现阶段还不能。项目越大,效果可能会出现急速下降。因此,如何给模型画道道,让它在不需要完全理解整个项目的情况下完成功能,是现阶段比较重要的课题。

附上答应别人的问题是:拿到一个需求,到完成开发,AI 在这个过程中的具体实践记录。

五四青年节快乐!以上!