前言
AI编程是近期的热门话题,很多程序员都使用AI来加快自己的开发效率。本篇文章介绍我使用AI为我的Android开源项目音视频编辑器开发界面的过程和一些经验。
使用AI编程开发的过程和经验
确定好AI的开发任务,选择适合你的AI工具或者模型
我近期在开发一款开源的音视频编辑器,我希望能使用AI编程加快的我的开发效率。AI编程主要分为代码补全和根据需求生成完整代码两类,我希望AI能直接帮我分担Android界面的开发工作,我告诉它需要什么样的界面,它直接给我生成一份完整的代码。
我的音视频编辑器项目的架构比较简单,音视频处理的具体逻辑都放在Service代码中,前台的UI主要负责让用户确定好音视频编辑的各种参数,向Service提交音视频编辑的任务,从Service中获取任务进度等信息展示给用户。Service的接口都是确定好的,就分为启动任务、取消任务、获取任务进度三个部分,前台界面调用接口就行。我与AI的分工是Service中的音视频处理的具体逻辑由我来写,AI负责UI开发。
现在的支持AI编程的工具或者模型有很多,国外的有GitHub Copilot、Cursor、Gemini等,国内的Trae、豆包MarsCode、通义千问、deepseek、腾讯元宝等。其中网页版的通义千问、Gemini、腾讯元宝我都使用过它们的AI编程功能。一开始我希望同时尝试使用若干款AI去生成代码,挑出其中我觉得最好的那份。在实践中我发现这样很容易陷入混乱和低效的状态,不同AI生成的代码的思路往往不一样,你得一个一个读,一个一个在IDE里面跑起来看看效果。AI生成的代码初次粘进IDE里面一般会爆红线,然后你得帮它们把红线去掉再把代码跑起来。一般情况下初次生成的代码总是需要改进的地方,不同AI生成的代码你认为需要改进的点可能都不一样,然后还得一个一个跟它们说。上面的流程来个几次就会觉得很烦躁和低效。我折腾一圈后觉得还是起步的时候多试试几款AI,挑出一款觉得不错的,后面安心只用那一款就好了。我进行Android开发觉得Gemini的表现是最好的,可能是因为Google自家的模型比较擅长自家的框架,后面我一直使用网页版的Gemini去生成代码,为了达到最好的效果,我还专门使用百度翻译去和Gemini英文沟通。
做好需求分析,记录和总结prompt
我经常在互联网上看见程序员抱怨产品经理在没有弄清楚自己想要什么的时候就提需求,需求分析就是摆设,想到什么就提什么,后面还时不时地改需求,导致开发进入混乱状态。当AI变成我们自己的程序员的时候,如果我们希望AI能进行高质量的开发,那也应该在给AI提需求前就想好自己需求是什么,做好需求分析。如果边想边提需求,AI给出的代码也会比较混乱。更重要的一点是,和AI对话的上下文越长,AI就越有可能忘记之前提的要求或者变笨,所以,尽量一次性把自己的需求讲清楚讲明白是很重要的。
我让AI开发一个视频时长剪裁的界面,给AI需求描述如下:
你好,请使用jetpack compose 和 viewmodel 开发一个视频剪裁的页面。
1.这个页面可以播放视频,并且用户可以选取剪裁的开始时间和结束时间。
2.页面上有一个按钮,用户点击按钮后就可以开始剪裁。视频剪裁的实现你不需要给出。
3.你开发的这个页面只需要让用户确定好剪裁的开始时间和结束时间即可。
4.我要求页面的代码简洁、安全、能处理各种报错情况且符合代码的最佳实践,
5.页面是精致漂亮的。
请参考市面上主流剪辑软件的剪裁视频功能的页面。
经过后续的反复对话和修改之后,最后得到的界面如下:
我们使用AI编程需要把自己与AI对话的prompt给专门记录下来。根据我的使用体验,AI不太可能一次就给出令人满意的代码,我们需要与AI反复沟通,然后AI生成的代码一般会很长,将之前的对话顶上去,后面你想查找自己发的东西就得不停往上翻,比较麻烦。将prompt都记录下来有利于你查找自己前面提的要求,也有利于之后复盘和总结,避免自己把说过的话给忘了。重要的是,如果你觉得与AI的本次对话效果不好,越聊越偏,AI怎么也理解不了你的需求,你可以先停下来,看看自己记录下来的prompt,想想是不是改一改陈述方式能取得更好的效果,再次提炼归纳一下自己的所有需求,然后新开一个对话重新提需求。
与AI交流也有沟通成本,尽可能使用专业术语
当你让AI帮你解决LeetCode算法题或者解答教科书上面的经典问题的时候,AI一般都能给出高质量的代码。而当你向AI阐述你实际工作中的业务逻辑,希望AI能够给出解决业务问题的代码的时候,AI编程的质量就是很不稳定的,这取决于AI是否完全正确的理解了你陈述的业务逻辑。LeetCode算法题和教科书上面的经典问题显然会被拿来训练AI模型,而业务逻辑往往是非常个性化的,千人千面,不一定在AI的知识库中。更重要的是,你本人对业务是否理解到位,表述是否清楚明白也是个问题, AI没听懂你说的话不一定是AI的问题,你把同样的话讲给某个人听,人也未必能立即听明白。这其实就是一个沟通成本的问题,我们在公司工作与同事沟通有沟通成本,现在与AI沟通,其实也会存在沟通成本的问题。因此我们在使用AI编程的时候确实需要花时间思考一下怎么样与AI沟通会更好,这其实可以以包含在AI提需求前进行需求分析的环节里。
在与AI沟通的时候。能使用专业术语就尽量使用专业术语,一般来说。专业术语会有很大概率存在于AI的知识库中。比如说如果你希望下面那个东西出现在你的界面上,最好知道它的专门称呼是"滑块"(Slider),而不是"在一根杆子上左右滑动的小球"。你告诉给AI你希望页面上有"在一根杆子上左右滑动的小球来控制某个变量的数值大小",它可能给你生成其他模样的东西。
然后你在给AI讲述自己的实际工作中遇到的业务问题的时候,你要懂得自己去提炼关键点,如果能把实际中的业务问题归纳总结成某个教科书上面的经典问题,这样AI就很有很大概率能够帮你解决问题。
有帮AI DEBUG的能力,渐进式开发
实事求是地讲,AI生成的代码确实大概率会存在各种各样的问题,也许是AI的代码存在语法错误,也许是AI使用了某个已经弃用的过时的API,也许是AI使用的库与你实际使用的版本不一致,也许是AI自己虚构出来一个根本不存在的API。你把AI给出的代码直接粘到IDE里面大概率会有若干个地方出现红线,需要把红线去掉代码才能跑起来。你可以让AI改自己的代码,但是有的时候看它慢吞吞地一点一点重新生成代码,还不如自己直接上手改的快。使用AI编程不能把AI的代码当作黑箱来使用,你得理解AI生成的代码的思路与逻辑,代码有问题你需要有能力定位和修复问题。 我尝试让AI帮我开发一个可以显示大文件内容的界面,具体需求如下:
你好,请帮我使用jetpack compose 和 viewmodel 开发一个阅读文件内容的页面。
1.可以支持阅读大文件,加载文件内容的速度快。
2.支持两种模式。一种模式是用户第一次点开文件看见的是文件开头的内容,另一种模式是用户第一次点开文件看见的是文件结尾的内容。
3.如果用户能看见文件结尾的内容,但同时文件有追加的内容,要同步加载追加的内容在页面显示。
2.通过上下滑动阅读文件,敏捷响应用户上下滑动操作。
3.有进度条,显示用户阅读进度,用户可以通过进度条跳转到指定位置。
4.阅读页面要精美。
5.代码要能够处理各种错误情况,代码要符合谷歌推荐的最佳实践。
AI给出的代码的思路挺好的,就是分块读取文件内容,使用可观察列表(mutableStateListOf())加载文件内容,使用LazyColumn展示可观察列表的内容。对可观察列表增删改查,LazyColumn都会自动更新展示内容,这是Jetpack Compose响应式编程的特点。初版代码里面有一个问题,更新操作可观察列表的逻辑放在另一个单独的线程里面执行,在高频率更新的情况下,LazyColumn要渲染某个item,但是这个item对应的可观察列表的内容正好同时被删掉了,导致空指针异常报错。跟AI反馈问题后,新代码改成将LazyColumn的更新和可观察列表的更新都放在主线程里执行,文件IO放在另一个线程里。遗憾的是,虽然AI的思路是正确的,但它后面给出的代码总是有问题,只能我自己去解决问题,把代码写完。最后的效果如下:
AI给出的代码不能无脑使用,得自己读懂,帮AI走查一遍。比较好的开发模式是渐进式开发,开发一部份,测试一部分,确定这部分可用了再继续下一步开发,稳扎稳打。不这样做很容易出现这种情况,你一口气提了一大堆需求,AI为你生成一大坨代码,你运行后觉得不满意,让它改,改后运行还是不满意,反复几次你还是没能得到想要的代码,放弃了,长叹AI编程就是噱头,骗人的,浪费了自己的时间,那一大坨代码最终也没用上。将自己的需求拆解成互若干份,一份一份让AI实现,就算最后AI卡在了某一步过不去,需要你自己上手写代码解决问题,至少AI前面已经帮你生成可用的代码了。
总结
AI编程还是能提升开发效率的,只是与AI合作需要磨合,需要琢磨如何使用AI才能发挥它的最好效果。AI画基本的UI还是能做到稳定输出的。
参考
1.通义千问网页版
2.腾讯元宝网页版