兔年春节一过,APIcat进入到云服务版本的开发阶段,过年前发生了一件大事,Chatgpt横空出世,不少人预测Chatgpt会替代的10大行业,其中就有程序员。
这时,一位特斯拉的老哥出来说,GitHub Copilot帮助他写了80%的代码。
当地时间2022年12月30日,特斯拉的人工智能主管、开发自动驾驶仪的主要领导人安德烈·卡尔帕西 (Andrei Karpathy)在推特发文称,他写的代码中有80%是由GitHub Copilot编写完成的,且准确率约为80%。
有这么大的能耐么?我们开春就来试一下
GitHub Copilot是什么
GitHub Copilot 是由 Github 和 OpenAI 创造的 AI 工具。该工具通过自动代码补全来帮助程序员们编写代码。Visual Studio Code、Neovim 和 JetBrains 的用户可以使用插件来使用对应功能,这个功能是付费使用的,目前是免费体验60天,之后每月10美元。
下载插件,填写信用卡等信息,就可以启动了,基本无感启动。
GitHub Copilot使用效果展示
GitHub Copilot也不需要什么交互,就是你写程序的时候会自动的出来。我给大家边写代码边展示。
今天准备加一个controller,来完成APIcat的项目管理功能:
Copilot展示
我做了什么:我创建了一个叫project.go的文件,进去后,敲了必要的声明信息,之后的事情,几乎就是在等Copilot给我建议,Tab引用,再等下一个建议,再用Tab引用……
当然,这是“合作”一周之后的结果,刚开始的时候,他不清楚我会在函数前面加上swag注释,不过写过一两次就好了。
那么接下来,我们看看,Copilot还会建议我们给Project这个controller加哪些功能函数呢?
Copilot使用体验2
有意思吧,Copilot直接建议我为Project:
- 添加List用于列出所有的Project
- 添加Delete用于删除
- 添加Update用于更新
- 添加Get用于获取单个详情
这基本一个大体的资源管理控制器的主体功能就出来了。
上面这段就是我写文章的时候边写边敲的,没有做任何的事前准备,所有的代码加中文注释都是Copilot自己想的。
实际Copilot在这周还帮我做了很多的事情:
当我不想写注释的时候,帮我写注释
为我补充测试例(注意,我并没有让他取个新的id)
为我写最不想写的输入验证规则(我都不知道他从他找来这么个规则)
而且这家伙真的是学识渊博,我有个按位取值的简单权限系统,他给的权限操作直接是按位来的,我都要再去写个矩阵想想到底对不对……
func (a *Admin) HasPrivilege(privilege int32) bool {
return a.Privilege&privilege&privilege != 0
}
func (a *Admin) RemovePrivilege(privilege int32) {
a.Privilege &= ^privilege
}
如果单纯说代码量,我看80%都是少的
当然,他也没那么智能
大家也不用担心,未来的几年,他还替代不了程序员,还是会出很多的错
func (g *generator) hasDefault(par interface{}) bool {
if par == nil { //AI自动判断
return false
}
switch tp := par.(type) {
case *openapi3.ParameterRef:
return tp.Value != nil && tp.Value.Schema != nil && tp.Value.Schema.Value.Default != nil
case *openapi3.SchemaRef:
return tp.Value.Default != nil
}
return false
}
例如上面的片段,我出错了,Copilot加了个nil判断,实际在par参数类型为interface{},实际是下面两个类型的指针的时候,这个判断无效。
d.CloudProvider = CloudProvider(bucket.Get([]byte("cloud_provider"))[0])
例如上面的这个操作,是要先判断bucket.Get([]byte("cloud_provider"))是否为nil的。
但话说回来,我也只是写了下面代码的第一行,Copilot就直接补全了后面的:
var bts = bucket.Get([]byte("cloud_provider"))
if len(bts) > 0 {
d.CloudProvider = CloudProvider(bts[0])
}
所以,Copilot确实从Github大量的项目中学习到了很多编程知识,但是也因为采集面太广,他的实际表现也基本等同于一个初中级程序员,太深的东西他也做不出来。
还有个关键,效率似乎也没有太大提升
看完上面的,也许大家要说,那其实就是检查一下他写的对不对,然后大量代码都不用写了,是不是觉得工作效率就会高很多。
但实际我用下来,也不是这么回事,有几个大的问题:
- 他的思路和我的思路还是有区别,我不得不像理解一个同事一样去理解他,这就造成他写出来一段代码之后,我必须停下来阅读,查看里面不一致的部分,并进行修改,这个从敲代码的层面看,我确实也没做太多的工作,但是问题在于,我的思路一直在自己的和Copilot的之间进行转换,很多时候,这种工作的效率也不高。
- 他会从其他库中学习灵感,但可能和项目不符,比如我们在创建User权限的时候,他会建议很多种用户类型,但是和我们的定义不符,这时,Copilot转变自己思路的速度会稍慢,造成你不得不用修改多次类似代码的方式来和他沟通
- 我需要查看并检查他是否出错,这是最大的问题来源了,比如上面说的没有判断nil的问题,确实他一次也修改完成了,但是问题在于他默认提示的是有问题的,这时要反过来验证和查找问题,程序员就知道,时间损耗就多多了。
所以,总的来说,我也没太感觉编程效率有太大的提升,更多的在于解放双手,大脑并没有解放。
但是,我也回不去了,你要知道每个月只用花60多块钱而已,这仅仅是普通开发1,2个小时的工资,即便只解放了双手也值啊。
这样的好日子又能有多久?
可以说,现在的阶段是程序员最好的时光了,有个AI帮你干活,还不能替代你的作用,但是这样的发展阶段又能有多久呢,听说GPT4的模型又扩展了数倍的参数规模,现在看网上的效果,也可以写出来一小段的程序了, 难保哪一天,你直接给需求,就能直接把整个系统写出来。
那时候,可能程序员就真失业咯
更多的思考
- 我写的代码是不是又回去帮助了美国人?
- 国内版本的什么时候有?
- 我乐意教一个徒弟,但是让我去教一个魔王,我不乐意,能收他培训费么?
- 如果美国程序员以1当5了,中国涉密的研发还跟得上么?
- 这玩意拿来控制武器怎么办?