人类的软件开发已进入了一个新的时代;不是人工智能将取代人类写代码,而是人类可与人工智能“结对编程”;人类将可从与人工智能 “结对” 的过程当中,不断的激发自身写代码的潜能,不断的证明自己的脑力与创意是 “无限” 的。
善用人工智能,能让我们的心智不断的获得 “进化”,才是我们面对人工智能应有的思维与态度,也才是人工智能应该要走的一条路。
最近,DeepMind的NS论文又新添一篇。
这回,是“信息学竞赛选手”AlphaCode,登上了最新一期Science封面。
对,就是那个悄悄潜入10场编程比赛敲代码,成绩超过了一半人类的编程AI。
并且就在这篇最新更新的论文中,DeepMind还首次透露了AlphaCode的“一次通过率”:66%。
也就是说,AlphaCode近三分之二的提交,都是一次AC(Accepted)的。
CMU博世人工智能中心教授J. Zico Kolter的最新评论文章也同时发表在了这一期Science上,他认为:
AlphaCode不仅仅是复制现有的解决方案。在面对以前没见过的编程题时,它表现得非常好,无论它是在多大程度上真正“理解”了这个任务。
首次通过率66%
尽管AI编程领域,GitHub的Copilot已经快进到收费模式,甚至还和程序员们“法庭上见”了。
但在DeepMind看来,AlphaCode还是颇有些不同之处。
一方面,编程竞赛对于AI而言本身就是比纯编程更为复杂的任务,关键是要为无法预见的问题构建解决方案。
另一方面,在架构上,AlphaCode采用了不同的机制来编码赛题文本。
值得一提的是,AlphaCode“打”的这10场编程比赛都来自Codeforces。
相比其他针对算法和数据结构的编程比赛,Codeforces更偏好考查思维能力,这意味着AI无法仅仅通过“背题”来完成挑战。
例如这是Codeforces上关于1553D问题的描述:
有两个字符串s和t,都是由小写字母组成。对于字符串s,我们从前向后扫描整个字符串。如果按下Backspace键,就删除该光标前到上一个未删除字符之间的所有字符。
也就是说,假设字符串s是”abcbd”,你分别在第一个位置和第四个位置按下Backspace,那么将得到字符串”bd”。
因为在第一个光标位置前没有字符,所以第一次没有动作。第四个光标位置前的字符是c,上一个未删除字符是a,所以按下Backspace将删除前三个字符”bd”。
针对这个“前提”,我们需要解决的问题如下:
我们能否从前向后扫描一次s字符串,让s变为t?如果可以就输出YES,否则输出NO。
那么,我们只需要给定输入的字符串数量(4)和具体的字符串内容,就能让程序输出对应的结果:
第一组ababa(ba),第二组ababa(bb),第三组aaa(aaaa),第四组aababa(ababa)。
对此程序输出的结果分别是YES、NO、NO和YES。
在做题过程中,AlphaCode的“解题思路”也不再是黑箱。
它不仅成功解决了问题,还能将代码和注意力高亮的对应位置显示出来:
上述还只是AlphaCode解的其中一道题。
整体来说,在Codeforces平台举办的编程比赛模拟评估中,AlphaCode在超过5000名参与者的比赛中平均排名前54.3%——击败了一半的选手。
并且第一次提交就通过的概率达到了66%。
对于AlphaCode的出现,有程序员调侃称“可以在艺术家旁边排队等领救济粮了。”
不过,DeepMind官方对于AlphaCode的定调并非“AI版程序员”,而是希望它作为一个辅助的角色出现在编程工作中:
我们希望它能作为软件开发者的助手,尤其是为0编程基础的人提供写代码的机会。
而在DeepMind的官方推特下,还有不少人把AlphaCode同当红炸子鸡ChatGPT联系了起来。
有人已经迫不及待看到两者同台演出。
给不了解背景的读者稍微普及一下:ChatGPT是美国的OpenAI这家公司做的一个能跟人对话的人工智能。
鉴于这个AI做出来的目的是协助软件开发,有人就拉上它搞了三天结对编程。这三天实验下来,可以说,这个AI已经超过了对方合作过的一大半pair。这家伙,是真有用。比如说吧,结对者正在做的易经打卦App,有这么一个用户故事:
作为求卦者
我想在卜得卦象之后查看卦象详细解释
以便我理解卦象的含义
拿着这个故事问AI
可是不止一个文件要读呀,64卦就是64个文件呀。接着问,
行,照办。然后就发现,这行代码,
await rootBundle.loadString("asset/text/01.md");
br
返回的是一个Future<String>对象。这玩儿在单元测试里咋验证啊?没学过呀。接着问,
行,照抄,分分钟测试有了。然后怎么在卦象页显示从文件读出来的内容呢?我连这种控件在Flutter里面应该叫什么都不知道,
这下知道了,原来这东西叫Dialog。那除了AlertDialog还有没有别的形式的Dialog?
挺好挺好,我就需要个简单的Dialog。但是卦象描述是Markdown格式,SimpleDialog怎么渲染Markdown呢?
这就做完了……整个Story大概花了不到1个小时吧(得有一半时间是在等ChatGPT一个字一个字往外吐字),真·全程无脑抄……
做完回头一看,好家伙,这不就是一个先做tasking(任务拆解)然后一个个task完成的过程么。以前我们说tasking是软件开发中的一个重要环节,现在可好,跟AI结对,tasking快变成软件开发中唯一重要的环节了。只要把任务拆解成10~15分钟完成的颗粒度,ChatGPT就能给你明确的答案,根本不需要你自己再去记什么框架怎么用什么算法怎么写。
布鲁克斯在《没有银弹》中所说,软件开发的本质性工作(essential task)是创造出一种由抽象的软件实体所组成的复杂概念结构,而附属性工作(accidental task)则是用编程语言来表现这些抽象的实体。本质性工作(即,说白了,“搞清楚到底要做什么”)是无法消除的,软件技术的发展一直都在试图降低乃至消除附属性工作。跟ChatGPT结对编程这几天,我感觉这个技术在消除附属性工作的方向上取得了很大的进步。
那么这对于程序员到底意味着什么?《与机器赛跑》那本书说,“深蓝”打败卡斯帕罗夫以后,国际象棋比赛不但没有消亡,还相当活跃。现在大家都是人脑和电脑组队,配合着打比赛。而最强的队伍,既不是最强的电脑,也不是最强的棋手,而是相当不错的电脑加上相当不错并且善于和电脑配合的棋手的组合。我觉得今天我们看待ChatGPT这样的AI也是一样的视角:你不要试图在机器擅长的事情上去跟机器竞争(race against machine),而是要找到跟机器配合的方式,和机器一起去竞争(race with machine)。有个靠谱的AI一起结对编程,对程序员肯定是件好事。
软件开发这件事,不管使用的工具如何变,其核心其实都是同一件事,即希尔伯特第十问题的推论:这世上存在的问题,比图灵机可计算的问题,要多出无穷多——几乎随便找一个世上存在的问题,都一定是图灵机不可计算的。软件开发者的任务就是对着一个有人想要、但是图灵机不可计算的问题(即“需求”),将它建模为一个近似的、图灵机可计算的问题(即“解决方案”)。易知这个建模过程本身等价于停机问题,因此是图灵机不可计算的——说人话就是,再强大的工具,只要计算机架构没有发生本质的革命,在软件开发的核心问题上就取代不了程序员。
以上内容来源于:公众号量子位/公众号极限编程合作社
END
现如今,IT从业者面临着种种挑战,又该何去何从呢?
明晚八点K+talk特邀Thoughtworks创新技术总经理肖然和极限编程合作社发起人/《敏捷中国史》作者熊节做客直播间,与大家共同探讨当IT正在逐渐变成不怎么好的职业时,IT从业者怎么调整心态把日子过下去。