江湖上一直流传着这样的传闻:“程序员们很快就要失业了,因为人工智能马上就能写出完美的代码了”。人工智能是以软件形式存在的,编写了这些强大软件的码农们,如果被自己编写的代码所取代,来写出新一代的代码,那会是一个神奇而又悲伤的故事。我们今天就来看看人工智能在软件开发领域里的现状,我们距离传奇还有多远?
有人说软件开发是一种艺术,有人说软件开发需要工匠精神,不管是哪一种说法,软件开发都是一个创造性的工作,而机器曾被认为是缺乏创造力的,但是随着深度学习的发展,人工智能在一些创造性的领域也得到了飞跃的发展。
现在的人工智能可以画画:
Trippy Artworks Created by Artificial Neural Networks
可以作曲:
musical.ai
可以写作:
• 2017年5月,机器人微软小冰出版了诗集《阳光失了玻璃窗》。
• 2017年,韩国某通讯社也测试使用人工智能进行足球比赛报道,几秒钟就可以稿件上线。
• 2018年,阿里妈妈推出的AI智能文案。
下图是我用最近世界足坛最出色的球星梅西(蹭一下煤老板转会风波的热度)的名字为种子让AI创作的诗:
感觉这个诗做的不错呀,把煤老板的转会风波又推进了一个意境,你觉得呢?
同为创作,AI离写代码还有多远?
上面提到的这些例子,大多是使用深度学习为基础来进行创作,而用深度学习技术来进行软件开发,主要面临着以下的一些挑战:
1. 很难判断
深度学习是一种监督学习算法,需要大量标注的数据,也就是说对数据的正确和错误打标签。但是代码很难用正确或者错误的标签来标记。也很难用数值来量化。而可用于训练的已标注的代码也非常少。
2. 容错率低
对于谷歌的猫狗判别算法,能有个90%可能就算是不错了,但是软件代码有99%都是对的,那可还是编译不通过,软件要求不能有任何错误。不同于自然语言,代码对于噪声非常敏感。
3. 复杂的上下文
开发软件需要大量的上下文知识,需求的分析,系统的非功能性要求等等,如何把这些知识融入到代码,对于AI来说,挑战颇高。
尽管如此,人工智能在软件开发领域已经开始有所突破,那么我们就看看AI现阶段都能做些什么?
代码辅助
代码辅助指的是辅助写代码的一些功能和过程。例如代码自动补全,代码搜索推荐,代码转换等。人工智能在这个领域大有可为,想想我写代码的时候,一大半的时间在查文档,还有一大半的时间在搜google和stackoverflow,人工智能可以很好充当码农的好助手。在这个领域里,已经有了不少的创业公司和相应的产品。
TabNine
TabNine是加拿大一位大四学霸开发的智能代码补全工具,作者Jacob Jackson目前在滑铁卢大学主修计算机科学与组合优化专业。该工具支持23种语言,支持VS Code、Sublime Text、Atom、Emacs、Vim五种代码编辑器。在VS Code的扩展商店里,TabNine已经被下载超过万次,获得全5星好评。2019年12月,被Codota收购。
Kite
Kite是硅谷创业公司,成立于2014年,A轮融资1700万美元。Kite提供智能代码补全,支持Python和JavaScript。
Kite目前支持以下的IDE:
Codata
以色列的创业公司,成立于2013年,融资260万美元。
Codota是一家以色列AI编程助手,专注于用AI帮程序员写代码,基于从网上学习到的编程模式,它能实时地为程序员推荐最合适的代码。它能无缝地接入程序员的集成开发环境中,帮助他们节约时间,减少人为错误。除了代码补全,它提供了聚合搜索功能,覆盖了包含github,stackoverflow等码农喜闻乐见的代码源。
Aroma
Facebook的Aroma是一款代码到代码型搜索与推荐工具。其采用机器学习(简称 ML)技术进行代码推荐,旨在降低从大型代码库当中获取洞察见解的难度。
在Aroma出现之前,各类原有工具一直无法彻底解决这个问题。文档工具往往可用性较差且严重过时,代码搜索工具通常会返回无数个匹配结果,而用户却很难立即从其中找到自己习惯的使用模式。通过 Aroma,工程师们现在能够轻松发现常见的编码模式,而不再需要手动浏览数十个代码段,这将显著节约日常开发工作所耗费的时间与精力。
Stage1:基于特征的搜索,将代码语料库索引为稀疏矩阵
• Aroma分析代码语料库给每种method并为其创建解析树;
• 从解析树中提取相关变量的用法、method调用等关键的结构特征;
• 根据每种method的特征创建一个稀疏向量,成为索引矩阵,用于搜索检索。
Stage2:重排和聚类
• 以相似性对候选代码进行重排,相似性比较仅考虑与查询代码匹配的部分;
• 对重排候选代码进行迭代聚类,查找用于生成推荐代码的关键clusters。
Stage3:Intersecting生成代码推荐
• 以cluster中某一代码为基准,与其他代码进行比较迭代,得到最大公约数。
与传统代码搜索工具相比,Aroma代码推荐具有如下优势:
• 在语法树上执行搜索,可以查找语法上与查询代码相似的实例,而不是简单的字符串/令牌匹配。修剪无关语法结构突显匹配代码。
• 自动将相似的搜索结果聚类,生成代码建议。这些建议反映了常用的编码模式,比未聚类的搜索结果更易使用。
• 足够快,可以实时使用。即使对于非常大的代码库,也可以在几秒钟内生成推荐,并且不需要提前进行模式挖掘。
• 核心算法与语言无关。已经在Hack,JavaScript,Python和Java的内部代码库中部署了Aroma。
详情可参考:
https://ai.facebook.com/blog/aroma-ml-for-code-recommendation/
CodeBERT
微软、哈工大在arxiv上联合发表了一篇论文,标题为《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》,再次拓宽了BERT的应用,将BERT应用到了Python、PHP、Java、JavaScript、Go、Ruby等编程语言的代码搜索和生成任务当中。整体方案仍然是传统的预训练+微调框架,模型规模不大。
BERT作为一种双向Transformer的编码器,其对预训练方法的创新深受业界和学术界的喜爱,虽然其他大规模的预训练模型例如ELMo、GPT等已经能够在各种NLP任务中提升SOTA。
但是上述提到的模型基本上都是面向自然语言处理,例如掩蔽语言建模、从未标记文本学习上下文表示。相比以往的Bert的应用场景,作者另辟蹊径,推出双模态预训练模型,即兼顾NLP任务和Python、Java等编程语言。
具体来说,CodeBERT抓住了自然语言和编程语言之间的语义联系,能够支持自然语言代码搜索等NL-PL理解任务以及一系列像代码生成这样的生成任务。
整体方案:预训练语言模型+下游任务微调
预训练语言模型:结合NL-PL双模态Masked Language Modeling和PL单模态Replaced Token Detection训练目标的1.25亿参数预训练模型;训练损失函数为min(LMLM+LRTD)。
下游任务
自然语言代码搜索 :给定NL-PL对,检测模型预测masked token的能力。被作者简化为max, min, less, greater四选一问题,用NL-PL Probing方法评估。
代码文档生成:从代码生成自然语言文档,用smoothed BLEU方法评估。
预训练数据:210万双模态数据,640万单模态数据。
六种编程语言-Python,Java,JavaScript,PHP,Ruby,Go。
简单总结,CodeBERT想解决从自然语言到编程语言的映射关系。有了这样的映射关系,我们就可以用自然语言来查找对应的代码,或者直接把自然语言翻译为代码。最终(当然这个还要等很久)码农就不需要了,产品经理直接说要啥就好了。
详情参考 https://arxiv.org/pdf/2002.08155.pdf
代码翻译转换
记得我在德国某BI企业的时候,当时产品开发做了一件事,就是把一个之前用C++写的产品用Java重写了一遍,大公司就是这么任性,虽然功能完全没有变化,但是我就是喜欢Java,因为Java代表着更先进的生产力。后来Java被竞争对手O记给收了,估计做此决策的人想死的心都有了。这个时候你需要的是一款代码自动翻译转换工具。
Facebook Transcoder
https://github.com/facebookresearch/TransCoder
代码翻译的问题是,手工重新改写不仅耗时,还很难找到懂多种编程语言的程序员,基于规则等方法转换质量非常差,最新的无监督神经转换器能在某些特定范围上很好的完成代码翻译任务。
Facebook最近开发的神经转换编译器TransCoder让代码转换越过了新的篇章。该系统可以将代码从一个高级语言转换成另一个,比如 c + + 、 Java 和 Python。
这个系统是弱监督的,可以在没有标签的数据集中寻找以前未检测到的模式,只需要少量的人工监督。研究人员称,这比基于规则数据集的模型要高效得多。
从Java到C++,TransCoder转换准确率超九成!
TransCoder是基于跨语言模型预训练去做的模型初始化,这样的训练不着眼于编程语言的类型,而仅仅将表示相同指令的代码段映射为相同的表示形式。
之所以TransCoder能进行跨语言模型的训练,是因为系统的标记原理着眼于跨语言之间的共同关键字,如「if」,「for」等,以及数字、数学运算符和出现在源代码中的英语字符串。这样反向翻译之后通过源-目标模型和并行训练的目标-源模型耦合,从而提高了训练的质量。
代码生成
代码生成聚焦在特定领域或特定任务的自动编程,即Domain-Specific Automated Programming(DAP)和Task-Specific Automated Programming(TAP)。目标是让机器完成简单的编程任务,解放开发者繁重的编程工作。
这个可能是目前最接近于取代码农工作的AI。
DeepCoder
DeepCoder是微软和剑桥大学联合开发的一种计算机算法,可以用于自行编写代码并解决简单的数学问题。该系统分成两个组成部分:代码编写算法,以及搜索潜在代码的机制。该算法发表于2016年11月的论文中。
DeepCoder所用的技术叫程序合成( program synthesis),通过截取已有软件的代码行来组成新的程序。通过学习一系列代码片(code fragment)的输入(inputs)和输出(outputs)数据,DeepCoder能自动摘取出对目标任务有用的代码片。
DeepCoder 使用被称作“程序组合”(program synthesis)的方法,只要给定系统输入值和需要的输出结果,DeepCoder 便可透过搜寻其他程序的程序代码,挑出适合的程序代码片段,再组合成可运作的程序,让程序顺利生成需要的结果。事实上,这个步骤就像许多工程师常做的事:在程序问答网站 Stack Overflow 上搜寻适合的程序代码,再“复制贴上”他们认为可行的程序代码片段。所以这个跟我们之前提到的代码辅助很像。
SketchCode
Airbnb研发出了一种工具可以把下面的草图直接转换为HTML5的代码。
但是Airbnb没有开源,有位大神自己开源了sketch-code,可以完成类似的工作。
https://github.com/ashnkumar/sketch-code
经网友亲测有效,当然还不是很完美。
手稿生成图
可能会有小伙伴站出来挑战,html也算编程语言么?写网页能算写代码么?不急,看看最新的自然语言模型的威力吧!
GPT-3
OpenAI发布最新的NLP模型GPT-3使用的数据集容量达到45TB,参数个数1750亿,一个训练好的模型就要 700G的硬盘空间来存储。充分反映了“大力出奇迹”的特点。GPT-3通过对大量文本进行预训练,针对特定任务进行微调,模型的性能可以在许多 NLP 任务以及基准测试中获得显著提升。
近日有开发者根据GPT-3模型上线了一个能够自动生成代码的网站debuid(https://debuild.co/)。在这网站注册后,用户只要用英语描述需求,前端代码会自动生成。
GPT3正成为新的AI基础设施,巨大的新型图数据库,可以生成大段有意义的篇章,代码可通过自监督学习;以前代码生成很难超过50-60行,现在有望得到突破;以前自动生成代码很难通过测试,现在也有望突破。
代码审查
代码审查是现代软件开发过程中的必要流程,代码审查面临着很多挑战
• 软件系统正变得越来越复杂:更多模块,更多执行路径,更大状态空间,逐渐超过手工检测的能力范围
• 资源有限,时间和人力都不够用,码农们需要996和007
• 团队中的专家不够用
面临这些挑战,利用人工智能来提高代码审查的效率,是一个不错的途径。
AWS CodeGuru Reviewer
CodeGuru Reviewer 是AWS提供的代码检视服务,可发现九大类别的代码质量问题:
•AWS 最佳实践:正确使用 AWS API(如:轮询、分页)
• Java 最佳实践:正确使用常用的 Java 语言和库功能
•并发:检测导致功能不正确的缺少的同步,或导致性能问题的多余的同步。
• 死锁:检查并发线程之间的协调
•资源泄露:正确处理资源(如,释放数据库连接)
• 敏感信息泄露:个人身份信息泄露(如,记录信用卡详细信息)
•常见的代码错误:难以发现的缺陷,例如,没有为每次 Lambda 调用创建客户端
•代码克隆:识别可以整合的重复代码,以提高代码可维护性
•输入验证:检查来自不受信任来源的格式错误的数据或恶意数据
DeepCode
DeepCode是静态代码监视工具(和前面提到的DeepCoder不要搞混),使用机器学习分析代码库中的安全缺陷和潜在错误,领会代码背后真实意图。DeepCode是一家瑞士startup,成员主要来自ETH。与其他Code Review AI相比,它不仅能够发现语法错误,而且能够确定代码的意图,因此能够识别更多潜在的重要错误和漏洞。
DeepCode实现了一种方法,可以在达到临界安全级别之前分析用户输入处理。因此,当任何数据在没有安全验证或清除的情况下从一个点移动到另一个点时,该工具会将其标记为受污染的,并向您发出警告。该工具可以标记的问题包括跨网站脚本、SQL注入威胁、远程代码执行以及路径遍历攻击等。
快速精准理解代码背后真实意图,准确定位语法错误和漏洞
训练流程:DeepCode的模型训练分三步进行:
Step1:将各类编程语言写成的代码进行解析,生成解析树;
Step2:通过线性复杂度数据求解器可在几秒内完成代码库分析;
Step3:语义事实表示方法用于ML模型理解代码结构及其背后意图。
战略简要,覆盖面广和技术优势是DeepCode的制胜法宝:
战略重点简明扼要:让机器code review可以提供尽可能多的、更广泛且深入的代码建议;
缺陷检测覆盖范围广:
其他现有静态分析工具的缺陷检测范围仅为DeepCode的十分之一;
可以快速兼容来自其他工具的checkers/rules/patterns;
可与GitHub,GitLab集成。
程序分析、AI算法、特征工程和大数据多种能力互补,形成独特技术优势:持续从开源项目在线学习的能力;
独立于编程语言的平台,可以在几周内完成新语言添加;
无需编译,大型代码库平均分析时间仅5秒(其他方案一般要通宵)。
代码测试
人工智能在代码测试的市场空间最大,通过大量规则和AI结合定制,解决测试领域的难题。
AI正在改变软件测试:差异性、可视性、说明性、自动化…
• 计算机图形学协助UI测试:AI保证UI元素有正确的颜色、位置、尺寸等,传统手工或基于规则的方法很难检测差异性,难以自动化;
•API测试自动化:通过人工智能算法,让API测试自动进行
• 自动创建测试用例:AI可以学习应用程序,了解文档模型的关系以及变化,自动生成用例。
• 测试用例相关性检测:任何代码小改动,不需要重测整个代码,通过AI分析,只运行相关的测试。这个相当于是推荐系统,推荐需要运行的测试用例。
人工智能正在逐步改变整个软件测试领域,可以大量节省测试时间,增加代码质量,软件测试正在从DevOps向AI过渡,由简单的发现问题转到根据上下文找到根因,从人工测试走向全自动化测。2019软件测试市场126亿美元,2024年288亿美元。
利用人工智能辅助软件测试的工具很多,下面列出几个比较有特点的:
Mabl
首款基于机器学习的商用智能软件测试工具,使用机器学习技术,开创了智能化软件测试的先河。开发mabl的是一家位于波士顿的创业公司。共同创始人是Dan Belcher和Izzy Azeri。这两位哥们是连续创业者。他们于2014年创办了Stack Driver。这家公司为云平台(例如谷歌GCP,亚马逊AWS)上的应用程序提供监测和诊断服务。后来这家公司被谷歌收购,这两位就进入了谷歌工作。2017年初,他们又出来创业,创办了mabl。公司一经成立,便获得了来自Charles River Ventures和Amplify Partners和1000万美元首轮投资。不到一年,便发布了面向商业市场的mabl产品(https://www.mabl.com/)。mabl以SaaS(software-as-a-service)方式,为用户提供智能软件测试服务。软件测试的全过程自动化,不再需要人工参与。自动创建和执行测试,自动分析测试结果,同时还能根据需求的变化自动适配和维护测试。
mabl的口号非常响亮:You write code, mabl tests (你写代码,mabl来测试)。
mabl使用机器学习技术,自动创建和执行测试(Tests),自动分析测试结果,同时还能根据需求的变化自动适配和维护测试。也就是说,mabl将软件测试的全过程均自动化了。有了mabl,软件测试将不再需要人工参与。
mabl已经脱离了自动化软件测试的范畴,开创了智能化软件测试(intelligent testing)的先河。
机器学习为软件测试自动化的用户体验带来质的飞跃,它提供:
• 无脚本测试:测试人员无需创建和维护测试用例。测试工作由机器学习算法在没有测试用例的情况下自主完成。
• 无基础设施:mabl以SaaS的方式提供服务,用户无需安装和维护任何本地基础设施。
• 自动维护测试:当产品发生改变时,机器学习算法自动适配这种变化。
• 自动分析结果:mabl自动分析结果、定位问题原因。
• 第三方集成:mabl与Jenkins,Slack,Jira等第三方工具均能很好的集成。
test.ai
Test.AI(前身为Appdiff)被视为一种将AI大脑添加到Selenium和Appium的工具,以一种类似于Cucumber的BDD语法的简单格式定义测试。Test.AI在任何应用程序中动态识别屏幕和元素,并自动驱动应用程序执行测试用例。它由Justin Liu和Jason Arbon创建。
这家初创公司刚刚在Gradient Ventures领投的A轮融资中获得了1100万美元的投资,Gradient Ventures是谷歌专注于人工智能的风险基金。参与此次投资的还有e.ventures、Uncork Capital和Zetta Venture Partners。成立于2015年Test.ai迄今为止已经融资1760万美元。
该公司的技术不仅仅是利用人工智能来缩短应用测试所需的时间;当开发人员准备要测试的场景列表时,它有助于消除更加冗长的过程。Test.ai已经对他们的机器人进行了“成千上万个应用”的训练,以帮助它了解一个应用的样子以及它们通常
diffblue
DiffBlue是一种非常有用而又简单的用于代码自动化的平台。DiffBlue有几个核心目的——测试编写、bug定位、重构代码以及发现和替换弱点的能力——这些都是通过使用自动化实现的。Diffblue专注于用AI技术为代码提供数字模型,Diffblue正在研发三款产品,分别是用于发现bug,编写测试代码的测试产品;能够自动标记bug并对其进行测试的安全产品;以及自动修改不合理代码或过时代码的重构产品。
在AI辅助自动化测试领域,还有很多产品,这里就不一一细说,它们有:
• apptest.ai
AI辅助的移动应用自动化测试
• Appvance IQ
根据应用程序的映射和实际用户活动分析,使用机器学习和认知自动生成自动化测试脚本
• Eggplant AI
使用AI和深度学习来从界面上寻找缺陷,能够自动生成测试用例,大幅度提高测试效率和覆盖率。
• Sauce Labs
利用机器学习来针对测试数据进行分析,更好地理解测试行为,主动改进测试自动化。
• Sealights
利用机器学习技术分析SUT的代码以及与之对应的测试,不局限于单元测试,还包括系统级的业务测试和性能测试。它还基于机器学习呈现完整的质量Dashboard,帮助我们进行“质量风险”的评估。
• Testim
专注于减少不稳定的测试(flaky tests)和测试维护,试图利用机器学习来加快开发、执行和维护自动化测试。
总之软件测试的自动化正在向着越来越智能的方向前进。
总结
机器会取代人类么?
人工智能会抢走码农的饭碗么?
AI有想象力么?
这些问题,我没有答案,当马斯克推出他的脑机接口的时候,我在想,未来AI和人类的交互会变得更容易,AI可能不会取代人类,但是它会和人类融为一体,我和我的AI结对编程,那样应该也不错!
推荐阅读