听说

当年 cursor 刚出来时,经常在网上看到帖子说什么 8 岁孩子使用 cursor 一下午做了一个 app 或者一个网站什么的。但是按照我写代码时使用 AI 助手的经验,似乎一个功能完整的让 AI 来写不可靠,可能我遇到的很多功能都是设计新算法,或者不常见?这样的情形遇到多了,也就不大用了,有些自己写的代码,让 AI 来重构,发现还是比较好的方式,经常会有些新的思路出来。不过也经常会重构得乱七八糟,把重要的功能给漏了或着改了。所以一直以来,我对 AI 大模型的使用都比较克制,也有了一个相对刻板的印象。

最近有了个机会,算是重度尝试了一下,发现之前的刻板印象不一定对。虽然没有突破之前的判断和想象,但是只要使用得法,AI 写代码对于高效产出也是一个比较好的路径。

第一个任务,代码翻译

之前我整理过一个框架,可以通过串口,adb,网络等方式搜集各个节点的日志,汇集到一个 python 可视化框架中进行分析。这次又遇到一个需要通过 android 蓝牙连接的传感器,首先用 android 做了一个搜集日志的 app,然后通过 adb logcat 把日志搜集到 python 的调试器中,这样就可以快速使用 python 来验证处理算法并做可视化,不需要一直编译 apk 等。经过几天将算法开发完毕,测试也通过了,于是需要将算法集成到 apk 中。看了一眼,原来的 app 是 kotlin 写的,这个语言简单了解过,但是不熟,要手工翻译过去估计要起码一周,大部分时间还会是熟悉语法。因此就想到了使用 AI。

打开 vs code 的灵码,打开对应的 python 工程,加入文件,给出指令,“帮我将这个 python 文件翻译成 kotlin”,很快完成了,将代码贴到 android-studio,出现几个报错,看了下,还比较好解决。配合原来 apk 代码格式,简单改了下,没想到很快跑起来了。大的框架集成没问题了,剩下的细节上小修小改,就用不着 AI 了,差不多只用了几个小时,整个移植都做完了。

代码翻译类任务,基本上可以比较放心的让 AI 来做,哪怕目标语言不是很熟悉,只要了解一些基本的语法,都可以修修补补使用起来。

第二个任务,unity 集成

最近遇到的另一个问题,需要使用 unity 来连接 android 蓝牙,从蓝牙搜集处理的数据,并控制 unity 中场景。因为完全不知道怎么做,先问了下 AI,答复说 unity 没有原生蓝牙能力,因此需要用到 android 来写蓝牙处理,然后通过互相调用来集成。这个回答逻辑和思路上看起来都没有问题,所以需要一个最小的 POC 来实现思路。

将这个任务分成了两部分,第一部分是 unity 和 android 的互相调用,请教 AI,给出了一些示例代码,使用示例代码,发现真能跑起来,整个原理是通的。第二部分涉及到 android 的蓝牙权限等,发现可以直接使用android 的权限代码,主要需要将其中涉及到的例如 appcompat,kotlin 等库打包进去,而这两个包打包时候,遇到一些底层库的冲突,在 AI 帮助下,使用打包脚本的 exclude 完美解决了问题。

到此位置,蓝牙和互相联通都跑起来了,其他的工作就好做了,借助于 AI,不到一天,这个跨系统集成的任务就完成了。

对于自己不了解的一些编程任务,使用 AI 时,首先需要辨别其描述逻辑上是否有问题,若没有问题,可以从最小代码开始实践。编程的一个好处是,遇到问题很容易验证,而不是一些不了解的领域,AI 胡说八道也无法辨别。

第三个任务,前端项目

上周开始,想要做一个小网站实现一个特定的功能。功能说起来也不是很复杂,不过我之前掌握的做网站的框架还是 python + django,这个框架用起来确实还行,只是搭建部署什么的比较麻烦。当前比较流行的应该是 node 系的一些框架,例如 vue,react 等。而看到网上那些用 AI 做网站的,大部分都是前端类项目。所以就萌生了一个想法,试试让 AI 完整实现整个项目吧。

找到了 trae 国际版,还能使用 claude,号称是大模型里面代码写的最好的。

一开始,提出了需求,帮我写一个 xxx 网站,需要有如下几个功能,1, …, 2,…, 3,…. 等等。AI 很快理解了,然后还自己分析了一下,提出了分层,框架,之类的。然后创建了项目,就开始哗哗哗写代码了。使用了 react,这个我完全不熟,于是只能无脑一路 accept 他给的方案。看了下,数据库设计,页面功能编排等看起来似乎都是那么回事。第一波完成后,我兴冲冲的开始运行,结果一运行就报错了。把错误喂给 AI,倒是很快反应过来了,原来写了数据库表,都没有执行初始化,加入后勉强能跑起来。但是页面太丑,就让他美化下页面。这下好,一下子出来几百行的 css,弄了个效果。勉强能看上眼,但是细节上总有些问题,对齐之类的比较别扭。好在详细描述要求之后改过来了。

接下来就测试各个页面,发现有些页面只有一句“这个是 xxx 页面”,逻辑没写。就让 AI 补充,哼次哼次补上了。而每个页面的 css 什么的似乎还不一样,就开始调试效果,结果有些页面无论怎么调都调不过来,每次都是“我找到了问题”,然后一个修改,结果改了没什么用。我自己去看了眼代码,似乎绕比较深,也没看出个所以然,就卡这了,同一个问题让 AI 改了不下 10 次,硬是没改对。功能框架上也乱七八糟,缺的缺,乱的乱,UI 也不统一。于是当天的编码就卡那了。

过了一个周末接着想这个事情,发现之前给 AI 一个具体的小任务,完成度都比较好。而让它直接去写一个系统,可能是需求上不明确的太多,它生成的代码约束也少很多,所以很难实现需要的功能。让 AI 干活,可能要反过来,框架自己定,然后划分成一系列明确的小任务,让它执行就好。

因此这周开始,重新开启了一个项目,这次一开始就按照一个不同思路来。第一句是:“帮我写个xxx 系统,这个系统只有两个页面,其中一个是用户登录,用户使用邮箱和密码登录,登录后跳转到第二个页面,是 xxx, 具有 yyyyyy 功能,使用 vue 框架。”,这次也很快实现好了。而且因为说的比较仔细,所以第二个页面实现也比较完善。然后进一步细化,把第二个页面需要添加的几个特定功能再给到 AI, 很快也实现了。下面就是增加功能了,常用的对话是,“帮我增加一个 xxx 页面,这个页面具有 yyy 功能,使用数据库表 zzz,…”,几乎每次都能比较好的实现。偶尔有一些不完善的地方,或者报错,只要再喂回去,也很快解决了。

使用 vue 框架的原因是,这个框架我基本了解过,所以看到问题还能知道如何来定位。在开发过程中,我发现,这样增加页面的方法,单独看每个页面都没有什么问题,但是经常是两个页面,本来很多元素相仿,但是可能会冒出几种写法,就比如混用 <script><script setup> ,每个页面都不一样。而多个页面使用的导航栏,或者一些复用的控件,也是每个都单独重新做了一次。所以开发过程中,常常我会告诉 AI “将 xxx 页面的 yyy 功能抽取成一个组件,并应用到 xxx 页面和 zzz 页面”。遇到这个问题,AI 会去读取 xxx 页面和 zzz 页面,看需要的组件有那些附加属性和功能,然后再集成,完成也还不错。有时候遇到一些问题或报错,AI 会胡乱猜测原因,每次我都会看看它的分析,如果逻辑上有问题,会自己去看看,如果不是这个问题,只要告诉 AI,这个修改不对,应该是 xxx,倒是会很快的改过来,当 AI 改错陷入到死循环时比较好用。

经过一轮轮功能添加,以及组件抽取优化,基本上这个项目一直在我控制下,没有出什么大问题,就这么一个个功能添加过来了。整体来看,效果还比较满意。

总结

总结来看,AI 可以做需求明确时的编码,但是不可依赖它做架构。一旦需求复杂,需要用户自行分解成更小更具体的任务。另外就是改错时,最好能给到用户自己的判断,否则仅仅通过报错信息,容易走入死胡同。

AI 应该是一个具有高级技巧的小工,可以解决具体的小问题,完成不了复杂的大问题,而且有时也会自以为是的耍崇明,因此测试方面需要认真细致。