一次AI编程体验

AI编程火起来好久了,但之前没想着实现些什么。直到最近基于自身需求萌生出一个想法,而市面上似乎没有合适的工具,才用起AI编程,花了点时间用vscode+copilot折腾了一个简单的桌面应用(注,本文的AI编程全都指向vscode+copilot)。

总的来说,从0到1的过程确实很惊艳,简单几句话描述就能生成一个可以跑起来的桌面应用,关键页面UI样式也不丑,但从1开始不断加功能,不断打磨的过程也很折磨,折腾了几次AI都改不出让我满意的效果,还引入了新的bug,让它自己解决问题,试了好几次依然没改对,只好放弃折腾(我自己也改不动),推倒重来。

不过,在重新开始之前,还是有必要总结一下使用经验的。一开始听信各种自媒体吹捧,以至于让我对现阶段的AI编程有了过高的期待,然而目前看来问题蛮多,不过这也不是AI的问题,在实际生活中,需求的澄清和理解,也是一个反复的过程,人和人都不一定能沟通清楚,何况是人与AI?所以,与其调教AI成为好员工,时不时被气的不行,不如调教我自己成为使用AI的熟练工

AI编程对我的价值

目前AI编程对我最大的价值,在于快速验证一些小想法,做出来的东西不完美,但不讲究的话也确实能用

毕业6年多一直从事后端开发,前端懂点皮毛,但如果要从头开始做一个前端项目,直接就能把我劝退。不找队友的情况下,不仅要学前端,还要有点设计和审美,以至于之前即便有想法,一想到做交互页面需要找人或者自己学,想法直接就搁浅了,可能学不到一半就放弃了,而现在AI编程的出现,确实降低了想法落地的门槛,验证阶段不用再去找人,或者花时间学习,用AI就能快速看到效果,节省不少时间。到时觉得效果还不错,想加大投入的时候,再去认真学也不迟

举个例子,在做桌面应用之前,是先用AI做的微信小程序。花了一两晚用AI生成代码,然后用小程序开发工具直接打开,调试效果,就发现

  • 需要对外发请求获取公开数据,但代码里的http header在小程序对外请求时会自动替换,而这个关键header参数又决定了能不能拿到数据
  • 说是可以用云函数,然而小程序测试号不支持,又注册了一个正式号,等注册完,果然还得花钱才能用云函数
  • 还没花钱,就发现:小程序对外请求需要添加白名单,但测试号可以加的域名,在正式号里一直添加不了,小程序后台提交的时候审核不通过,没有具体的原因,结合可能的原因列表推测,大概率是域名没有备案?
  • 还不确定花钱用云函数能不能绕过限制,也不确定后续还会有哪些坑,微信生态庞大,但限制也很多,不如直接弃坑

这要是没有AI,从0开始接触小程序开发,到发现这些坑,估计就不是一两晚的事情了。后续就转向用Electron开发桌面应用,数据都存本地,没有服务器成本,还支持跨平台。给AI说了下,AI也是二话不说直接生成代码,出来一个桌面应用。当有一个半成品放在眼前,总会冒出更多的想法,这里改一下,那里优化一下 ,于是就发现了一些问题

发现的问题

有问题,但不一定是AI编程的问题,也有可能是我使用方式不对。

1. 无法自己调试

AI编程目前侧重于生成代码,实际运行效果如何,得依靠我去把项目启动起来,才能验证。于是整个流程就变成了

  1. 我告诉AI想要什么,AI根据自己的理解生成一大段代码
  2. 开始debug,发现问题,直接把错误信息发给AI,AI直接修复
  3. 继续debug,确认当前功能正常。继续循环上述步骤,进一步增加/调整功能

持续改进的过程中,我就是一个产品+测试,AI就是那些写了逻辑直接提测从不自测的开发,经常改出问题而不自知。一些功能问题还好,比如按钮点击不生效啥的很快就能修复,麻烦的是UI问题,后面选择放弃也是因为UI改坏了,各种css样式和js代码相互影响,仅靠AI已经改不好了。而且AI编程好像遵循的是追加代码的思路, 同一个组件的CSS样式存在不少的重复,让它把重复代码删掉吧,等它改完代码还在,一点都不听劝。这里有点好奇,明明AI能阅读整个项目的代码,为什么不在原来的基础上改,而是追加不少新代码呢?难道学会了人类开发在屎山上堆屎的倾向?

2. 响应越来越久

起初功能简单,响应还挺快的,但持续加逻辑之后,代码文件越来越长。而每次AI处理文件,都是先阅读整个文件,然后再重写整个文件。一来一回需要的时间蛮久,如果改一次就能改对,那倒是能原谅它。问题是改了很多次依然没解决,此时我就像我的领导,丝毫不理解一个“简单”的bug为什么需要改怎么久。

也萌生过一个想法,把逻辑拆到不同的文件中, 响应会不会快一些?还没实验过,后续可以试试,但可以想到的是,拆成多个小文件,AI不可避免的也要阅读多个文件,最后总体的阅读量好像差不多?不阅读所有的代码,再加上不自测,到头来同样也会改出各种问题。或许这就是非本地大模型的局限性,并不适合处理整个项目,毕竟把所有代码传到远端,阅读理解一番,再把改动传回来,重写相关文件,费时是必然的,但无疑还是比人脑处理快多了,但人估计一遍就能改对,而现阶段还不能对AI编程有这样的期望

3. 让使用者产生依赖

AI的正确率无法保证,但用的时候还是按捺不住想要偷懒的心。想加的功能,直接扔给AI,发现的问题也丢给AI,想起之前摘录的内容

我长期使用 AI,靠它帮助编程,已经不能在没有 AI 帮助的情况下解决问题了。

我不再阅读文档。既然 AI 可以立即解释一切,为什么还要费心阅读呢?

我的调试技能日益生疏。我甚至不再阅读报错消息,只是把它们复制并粘贴到 AI,让 AI 解读。

我已经成为了一个人肉剪贴板,仅仅是代码和 AI 之间的中介。

以前,每条报错都会让我学到一些东西。现在呢?AI 提供了解决方案,我却什么也没学到。实时答案带来的多巴胺刺激,取代了真正理解的满足感。

另一个受到影响的地方是深度理解。以前,我花费数小时来理解某个解决方案为何有效,现在,我只是照着 AI 建议实施。如果这些建议不起作用,我会改进提示的上下文,再次询问 AI。这种循环使得我对 AI 的依赖性不断增加。

我的情绪也受到影响。以前,解决新问题是编程乐趣的一部分。现在,如果 AI 不能在五分钟内给出解决方案,我就会感到沮丧。

我该怎么办?我不想采取任何激进的措施,比如完全放弃 AI,这是不现实的。我打算每周实行一天”无 AI 日”。

我的感觉是,AI 不会让我们成为10倍效率的程序员,只会让我们对它的依赖程度增加10倍。

每当我们让 AI 解决我们自己可以解决的问题时,我们就是用短期生产力换取长期理解,我们以牺牲明天的能力为代价来完成今天的效率。

—- 科技爱好者周刊(第 336 期):面对 AI,互联网正在衰落

深有同感,AI编程的过程中不仅依赖AI解决问题,也不去看AI写出来的代码,每次得到结果都是无脑accept,然后debug看效果。以至于后来真的遇到AI解决不了的问题了,由于不熟悉代码,也没有在这个过程中,去看AI写出来的代码,有点无从下手的感觉。就是想让它改,也说不出一个前端领域内的专有名词来让它理解我的诉求,只会说类似于,这个框大一点,这个圆小一点之类的提示词

当然啦,在选择重开之前,还是花了大半天去看代码尝试解决问题的,只是后来觉得,与其优化一个不太满意的雏形,倒不如拿这个时间来琢磨更好的设计,完善一下想法,然后再来一遍

几点建议

后续用AI编程的一些建议

  • 做好版本控制,得到一个稳定版本,就可以考虑用git commit一次。后续让AI改问题,越改越乱的时候,可以考虑回退版本,重新开始。vscode的copilot也支持回退变更,可以适当用起来,也许回退版本重新开始比一股脑让AI改来改去要快得多
  • 边做边学,学习AI写出来的代码,知道有哪些组件,命名是什么。顺带去了解出现的新概念,技术组件,专有名词等等。 要清晰的指挥AI,离不开精准的描述
  • 考虑付费使用高级模型,即便花钱也比找人便宜。一些觉得AI蠢的case,或许会在高级的模型中得到改善。 目前免费的claude 3.5 sonnet preview,确实没有那么聪明的样子。