大模型的快速发展带来了AI应用的井喷。统计GPT使用情况,编程远超其他成为落地最快、使用率最高的场景。如今,大量程序员已经习惯了在AI辅助下进行编程。数据显示,GitHubCopilot将程序员工作效率提升了55%,一些实验中AI甚至展示出超越普通程序员的能力。目前AI在编程领域所扮演的角色,更多的还是一个「效率工具」——以Copilot的形式帮助提高编程效率。
那么AI编程的下一步是什么?我们认为,是理解并生成复杂代码集、从而实现真正的软件自动化开发。如果AI能够像人类程序员一样,在大型复杂软件项目的代码集上工作,并且能有效地与人类工程师分工协作,生成几十万上百万行代码,这意味着对软件行业的根本性颠覆。
如纳德拉在GithubUniverse2023上所说,"当你向一个组织引进GithubCopilot,工作流程将发生改变。当销售人员开始写代码,这个组织就变了,它会以代码的速度前进。现在有了Copilot和代码的速度,从根本上改变了数字经济。包括汽车、金融、制药...每家公司都是家数字公司,也是家软件公司。"
最受开发者欢迎的AI编程工具
目前主要使用场景
据不完全统计,过去一年,市场中涌现的AI编程工具多达几十种。在此我们先对市场上的主流产品做个简要总结,方便读者对发展现状有个直观的了解。
创业公司的产品分为两类,一类是通用AI编程,跟巨头的产品重合度高;另一类聚焦垂类,在某个领域/功能做得深入。
通用AI编程
聚焦垂类的AI编程
除了如上的通用AI编程项目外,还有一些聚焦垂直行业或聚焦编程中某个具体环节的初创公司。包括
产品切入点
通过概览AI编程领域的主要项目,可以看到目前主流的产品趋势还是做CodeCopilot——即作为工具,辅助人类提升编程效率,而其中最具主导地位的是GithubCopilot,同时其他巨头也纷纷入局。在这样一个巨头林立的领域,初创公司目前主打的切入点主要有如下几种:
面向未来,有两个关键问题:AI编程会朝什么方向发展AI会不会取代人类码农的工作,实现完全的」软件开发自动化"
我们目前正处于第一个阶段:在这个阶段,AI大幅加速人类程序员工作效率,就好像一个人长了多只手,能够以更少的人力完成更多的工作。展望未来,AI编程的下个10x阶段,是他称之为「AIProductEngineer"的阶段,AI可以完成大部分工作,人类只需要在几个关键环节参与协作及决策。而在更远的未来,AI编程的终极图景,便是「AIEngineerAgent」,届时,软件工程领域已经是AI主导的天下,AIAgent可以互相协同完全自主地完成一个复杂项目。
现代软件工程经历了从早期瀑布流到最近25年中的敏捷开发模式,其成功的原因之一是代码和功能的不断积累。正是这种不断地快速迭代和积累,让软件工程成为人类社会中发展最快、复杂度最高的产业之一。未来如果AI编程自动开发成为主体,这种通过迭代和积累实现增量开发的模式会有什么改变呢?
大型软件项目的代码集规模远远超出AI目前context长度,未来也很难期待AI能够把代码集完整地装入内存。即便context长度可以无限扩展,它的编程能力仍受限于模型的推理能力。基于目前Transformer架构,仍然很难想象AI可以一次性地重新生成上百万行的复杂代码集。即便推理能力支持,其性价比是否真的支撑落地应用,也是一个巨大的问题。
一次性生成大型代码集的方法不仅非常脆弱,而且很不经济,其背后深刻的悖谬之处在于:一旦有人创造出能以增量式开发的AI自动软件开发系统,它在可靠性和经济性上一定会显著优于一次性生成整个代码集的系统。从系统演化的角度,不断优化积累的系统是唯一最终能够存活下来的系统,就像自然界最终选择的基因演化机制一样。
基于这个假设,我们认为,AI要想在编程领域真正替代人,最需要解决的是如何能像人类一样在软件这个不断积累的」增量「系统中工作。这需要AI对现有大型复杂代码集的理解,并在此基础上进行修改、扩充、测试等工作。
上文提到,AI要想在编程领域替代人类,必须要能在复杂代码集上做增量工作。而如何能够实现AI对复杂代码集的理解、并在此之上让AI接手呢?我们从软件开发的基本结构出发,分析实现这一功能所面临的主要挑战与突破点。
软件开发的三个阶段
对于一个独立的开发任务,无论新功能开发、现有功能改进、代码部分或全局重构、bugfix等等,几乎所有开发任务都包含三个阶段:
1)定义任务:Spec
这个阶段的交付是需求文档(Spec)。Spec具体描述任务的结果,即从软件的用户或维护者的视角看来,任务完成后软件系统有什么具体的改变,包括交互界面、系统行为和性能等。Spec的核心是把Why转化成What。
2)设计实现方案:DesignDoc
这个阶段的交付是开发设计文档(Designdoc)。DesignDoc描述需要对功能的哪些节点进行何种修改,并把一个任务分解为多个不同的步骤。DesignDoc把PM看到的产品的What转变成架构的What,同时讲清楚架构要如何实现(How)。DesignDoc最后一般会包含开发计划(Devplan)。
3)实现:代码及测试
这个阶段的交付是代码集的最终完成和测试。根据开发设计文档的规划,逐步完成代码,去跟外部API和底层操作系统对接,从而驱动软硬件完成任务。
AI在各阶段的作用
每个阶段的特点不同,AI起的作用相应的不一样。
1)Spec。Spec是把用户的需求转化成软件任务的过程。这个环节涉及到大量与人的交互,包括市场调研、反复沟通理解确认用户需求,目前这个环节靠人来做效率是最高的。
用一个简单的例子类比,让AI在现有的系统上增加个新功能,就好比要给一个城市增加地铁系统。其中涉及大量对现有城市交通状态的理解与规划,需要考虑全局的交通效率、做路线规划和资源分配,每个节点的变化都牵扯到其他一些节点的,不是单独增加一个地铁站就可以的。对应到代码集,系统级代码非常复杂,有很多相互关联的复杂函数调用、全局变量等约束及边界条件。
AI要解决这个问题,需要的是一个「全局地图」——一个能够让AI可以快速定位每个变动对于全局影响的「地图」。一旦有了这个全局地图,AI就能快速地理解代码、确定变化范围开始工作了。
3)Coding。实现阶段是对各模块的代码和测试。AI核心需要解决两个问题:
其一是对于开发环境的理解。任何代码最终都要落在具体的平台上,在哪个操作系统上、用什么编程语言、如何编译、代码管理、部署等等……这些都要求AI要对平台有深入的了解,就像人类工程师一样。人类工程师所掌握的,远远不止对编程语言的理解,而是对这一整套适配环境的理解。
其二是自动测试和Debug的能力。代码生成后,需要测试它是否正确地工作,有问题要能够找到问题所在。这是一个完整的CodeAgent必需的能力之一。
对于AI来说,构建理解复杂代码集所需的「全局地图」,关键是把针对代码集的RAG(retrieval-augmentedgeneration)做好。目前Transformer架构的大模型,没有RAG很难做好增量开发场景下的代码生成。RAG主要解决以下几个问题:
定位受影响代码,并做修改。
当大模型生成了新的代码后,因为它推理能力不足,生成的代码可能没有考虑到对整个代码集的影响,这样生成的代码一般是不完全或错误的。这个时候需要RAG去找到整个代码集中所有被当前修改影响的区域,然后再对那些代码区域进行修改。
代码的可维护性是AI编程的一个有趣的问题。
考虑自动软件开发系统的工作方式,AI是否会像人类个体一样参与大型软件项目?是否需要和人类协作共同开发一个代码集?AI写的代码未来由谁来维护?从机器人和自动驾驶的发展历史来看,开发人机协作的系统远比开发一个全自动的系统困难很多。如果AI生成的代码需要由人类工程师来维护,这个模式对自动软件开发系统提出了更严峻的挑战。
AI编程可能存在一种比较极端的新的可能性:如果代码都是AI生成的,而AI修改自己生成的代码或者重新生成代码都比人类要高效得多,那么是否可以放松复用的要求,同时也降低测试的复杂度?只要不需要人类维护AI生成的代码,也许更低的复用性未必会降低代码集的可维护性,甚至可能产生bug更少的代码。
AI编程整个赛道还在非常早期。虽然巨头已经纷纷杀入,但这个领域很难完全垄断。
举两个例子:上文所说的增量开发场景下理解整个代码集的问题,在目前就没有被很好地解决(SWE-Bench的研究也一部分验证了这个现实)。另一个例子是针对Legacy系统的维护,许多企业内部存在着大量legacycode,这些code不开源,经过常年积累,已经沉淀了许多商业机密,推倒重来需要耗费极其昂贵的成本,日常维护又消耗很多人力,是AI非常适合发挥作用的场景。
我们认为,AI编程的未来是CodeAgent,让AI越来越多地介入软件工程的各个环节,自动开发。跟所有AIAgent一样,做好CodeAgent的关键,在于构建世界模型以及Agent的经验积累和学习能力。
构建世界模型
多模态的发展让人与Agent沟通的方式更加丰富。GPT-5对多模态的支持,可以用架构图和设计图帮助AI建立对复杂系统的理解,应该比文本和代码的沟通带宽高很多。在许多场景中,综合运用多模态的方式相比单纯的文本会大大提升沟通效率。未来Agent对于多模态的应用能力,是竞争中很关键的一环。能够根据不同场景灵活运用多模态的Agent将更具竞争力。
CodeAgent的经验积累和学习能力
一旦被提供了复杂系统的信息,AI需要记住它。如何让AI记住世界是什么样子的,需要为AI建立好一套记忆体系——做好大模型记忆的存储、管理、调用等。