肇鑫的日常博客

日常

我也会用AI写程序了

我使用AI写程序的方式

目前使用的是Xcode + GitHub Copilot(gpt-4o) + AlexSideBar(Claude Sonnet 3.5)的方式进行开发。

AI_coding

这些居然都是免费的。Copilot免费是因为我在GitHub上有开源程序,被GitHub认定是符合免费使用Copilot。而AlexSideBar是因为目前它处在Beta阶段,所以免费。

AI开发带来的收益

初级代码编写

免去了很多脚手架代码的自我编写。可以实现将功能用注释表明,然后让AI编写代码并处理错误等。

快速试错

AI可以快速生成代码和修改代码,并且可以自动合并到源代码中。比自己改要快很多。这样有想法可以快速试错。更快看到编程时的瓶颈。

很多时候,编程开发的最大难点就是这些瓶颈。也许是官方文档不全,也许是没有相应的功能,甚至可能是SDK的bug等。

自动修改

通过指导,AI可以按照用户要求的方向对于代码快速进行修改。也可以根据IDE提示的错误来修改代码。

快速进入陌生的领域

本次新应用需要使用IOKit的通知功能。这部分是我陌生的,但是AI自动生成了相关的代码。可以让我更专注应用的功能和逻辑,而不是具体细节如何编写。

AI的不足

当遇到框架的bug时,AI不能识别。需要有经验的程序员指导AI绕过坑

比如AI在List中使用DisclosureGroup,结果DisclosureGroup的展开箭头显示不出来。我问AI为什么点击之后不能展开,AI只是尝试添加点击的手势,但是那没什么用。

后来我提示AI可能是List中使用DisclosureGroup会有问题。于是AI修改方案为ScrollView+VStack来代替List,问题得到解决。

AI不懂相对复杂的Xcode配置问题

比如我虽然知道如何创建开机启动项(Login Items)。但是我将这个描述给AI之后,AI一步一步让我实现出来的配置+代码却无法显示开机启动这个功能。由于这个功能的实现需要在Xcode调整多项配置,AI却提都没提,而是让在Info.plist里添加了无关的权限申请。

最后,我还是决定按照自己的思路来做。不再使用AI实现这个功能。

AI有时不能从项目的角度来考虑问题,而是着眼于当前文件

虽然AI可以读取项目的所有代码。但是它在修改时,仅仅是基于当前页面的代码。当前页面修改之后,如果其他页面不出现bug。AI不会主动考虑到其他页面也需要做相应的修改。因此,对于项目的整体把握,还需要开发者自行掌握。

这一点我不确定是AlexSidebar独有的缺点,还是说所有这类应用都有这个问题。因为我只用过这一个。
后续我又发现,有时AI还是能够考虑多文件的修改的。但是那个大多是修改View的时候,涉及到Model的修改。如果是View和View之间的,就还是不会考虑到。

AI的思考存在局限性

比如我在macOS发送用户通知时,发现通知有时能发送,有时不能。我告诉AI之后,AI并没有修改代码到我满意的程度。

原因是后来我发现,SwiftUI的onReceive是依赖视图的。当视图不存在时,通知就没法弹出。AI没有考虑过这一点。所以它修改代码是不能成功的。我将这个问题告知Ai之后,经过指导的AI创建了一个额外的类来单独处理通知,这样就没问题了。

AI有时会钻牛角尖

比如有一个函数,可以通过A获得A中所有的B。一开始,AI没有考虑到B存在嵌套B的情况。我指出之后,AI视图通过递归来获取所有的B。但是它递归的函数是错的,它一直想要递归func getAllBs(from a: A) -> [B],这是不可能成功的。因为虽然是A包含所有的B,但是B是嵌套的,需要递归的是B的嵌套,而不是从A到B。最后没办法,我手写了这部分代码。

AI并不知晓过于小众的知识

对于AI来说,重复率越高的知识,它越知晓。但是如果一旦某个知识过于小众,这会导致AI并不知晓哪种说法是正确的。

比如我想获得雷电设备插拔的检测。Claude Sonnet 3.5和gpt-4o给出的代码都是错误的。gpt-4o给出的匹配字符串是"IOThunderboltInterface",Claude Sonnet 3.5使用的是"AppleThunderboltHALType",但最后我发现唯一正确的应该是"IOPCIDevice"。

结论

善用AI的确可以大大提高开发者的效率。不过现阶段的AI,还存在诸多的局限性。需要开发者站在更高的角度,对于AI指导,才能获得最佳的结果。

最后,附上我合作AI共同开发的第一个应用:

USB-C Speed。这个应用的功能是显示当前USB口和雷电口连接设备的接口速率。开发这个的原因是,我发现,如果使用USB 4或者雷电3/4接口连接相应接口的移动硬盘盒。有时连接后的速率实际上并不是理论上的最高速率。这在Mac mini M1上,可能会从40 Gbps降低到10Gbps。这是因为Mac mini的USB-C接口在40Gbps之下,就只支持10Gbps或更低。

这个应用会显示当前连接所有设备的连接速率。并且在USB设备插拔时,弹出插入或者拔出的设备名和接口速率。这样就可以立刻看到当前的速率是否是理论上的最佳速率了。