软件工程离银弹还远吗

xzhren@pku.edu.cn 任星彰 返回主页

       《人月神话》自出版便具有极高的影响力,一度被奉为软件工程领域的圣经。其饱受争议的一章《没有银弹》中声称和断定,在近十年内(1975年开始),没有任何技术或管理上的进展,能够独立地许诺在生产率、可靠性或简洁性上取得数量级的进步。那么,四十二年过去了,软件工程造出银弹来了吗?如今风靡一时的人工智能会是软件工程的银弹吗?本文将围绕《人月神话》、软件工程的银弹、人工智能这三个主题展开探讨。

《人月神话》

       《人月神话》是FrederickP. Brooks博士在IBM公司担任System/360计算机系列以及其庞大的软件系统OS/360项目经理时的实践经验总结。

       Brooks博士认为大型软件开发就像史前时代的“焦油坑”,只有非常少数的项目满足了目标、时间进度和预算的要求,各种大型的和小型的,庞杂的和精干的团队,一个接一个淹没在了焦油坑中。这些失败的软件项目最主要的原因是缺乏合理的时间进度安排,这不仅因为编程人员都会乐观估计自己的进度,更因为项目经理对于“人月神话”的忽视。所谓的人月神话就是项目的人月关系并不能被简单的替换累加,向进度落后的项目中增加人手,只会使进度更加落后(Brooks法则)。为此,我们常常需要组建一个小型精干队伍来完成复杂的任务,就像“外科手术队伍”一样,以此来减少高级程序员和初级程序员沟通和交流的成本。同时,为了保证概念的完整性和一致性,项目管理者需要采取“贵族专制”,即非常少数互有默契的人员来实现;也需要采取民主政治来避免“画蛇添足”,即必须坚持至少拥有两个系统以上开发经验结构师的决定。在项目实施中需要采取文档化的规格说明、会议和大会、电话日志、产品测试等来“贯彻执行”,以此保证每个人听从、理解并实现结构师的决策。同时,大型编程项目需要一个合理的组织架构来保证充分的交流,避免“巴比伦塔”失败。为了“胸有成竹”地完成项目,不能仅仅通过编码部分来估计整个任务,测试和调试等会占总共问题5/6甚至更多。对项目经理而言,为了很好的控制规模,需要“削足适履”,合理减少不必要的规模来实现良好的可伸缩性和健壮性。文档在软件项目开发过程汇总能起到“提纲挈领”的作用,能够记录决策、消除分析、促进沟通等。在软件工程开发过程中,唯一不变的就是变化本身,因此要时刻“未雨绸缪”,为变更计划系统,为变更计划组织架构,前进一步后退一步。软件开发项目所选择的技术和工具正如“干将莫邪”对保障项目能否如期完成的起着关键的作用。为了开发出可运行的系统,需要考虑“整体部分”的设计,构建单元测试和系统集成测试。项目进度的滞后原因往往是“祸起萧墙”,来自不易察觉的点滴延误,为此,需要制定里程碑和关键路径图来对进度进行观察和掌控。软件的开发还有“另外一面”来完成将程序传递到用户的过程,即流程图、程序文档、用户手册等。

       Brooks博士最终得出结论:软件工程中是“没有银弹”的。

软件工程的银弹

       Brooks博士对所有软件活动分为根本任务和次要任务,其根本任务是打造由抽象软件实体构成的复杂概念结构;次要任务是使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言。Brooks博士坚信对于软件活动的根本任务十年内没有高效的解决方案,因此,《人月神话》在《没有银弹》一章中都得出了软件工程没有银弹的推断。之所以称为“银弹”是一个形象的比喻,Brooks博士将熟悉的软件项目喻为人狼,因为它们可以完全出乎意料地从熟悉的面孔变成可怕的怪物,而软件项目常常也是看似简单明了的东西,却有可能变成一个落后进度、超出预算、存在大量缺陷的怪物。为了对付人狼,我们需要寻找可以消灭它们的银弹,对于软件工程,我们也需要探索解决其根本任务的“银弹”。

       由于现代软件工程无法规避的内在特征:复杂性、一致性、可变性和不可见性,导致其很难造出解决根本任务的银弹。那么,至今为止,软件工程已经经历了四十二的发展,产生了很多杰出的研究成果,这些研究成果可能会是软件搞工程的银弹吗?

       敏捷开发与银弹 敏捷软件开发是1990年代开始逐渐引起广泛关注的一些新型软件开发方法,是一种应对快速变化的需求的一种软件开发能力,它强调在项目的整个生命周期中,拥抱并促进由于软件进化式的发展所带来的变化[1]。结对编程、极限编程成为敏捷开发在实践中使用最广泛和最有效的方法,同时,国内外围绕敏捷开发涌现了一些协同开发工具,如:Jira、Slack、Teambition、Onboard等。然而,敏捷开发由于每个人都要熟悉敏捷、成功经验难以复制、坚持敏捷压力过大等原因,无法高效解决软件工程的根本任务。

       服务计算与银弹 面向服务的体系结构(SOA:Service-OrientedArchitecture)将应用程序功能作为服务发送给最终用户或者其他服务,由于其松耦合、可重用、可组合等特点被广泛应用于构造分布式计算的应用程序[2]。基于SOA实现的微服务架构更强调分布式系统的特性,比如横向伸缩性、服务发现、负载均衡、故障转移、高可用,正逐渐演变成一种主流的架构风格。然而,微服务由于其运维成本过高、接口不匹配、代码重复、分布式系统复杂性等原因[3],目前无法高效解决软件工程的根本任务。

       云计算与银弹 云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机各种终端和其他设备,拥有软件即服务(SaaS)、平台即服务(PaaS)、基础设施即服务(IaaS)三种服务模式[4]。国内外的GAE(GoogleApp Engine)、WindowsAzure、AmazonElastic Beanstalk、阿里云(ACE:AliyunCloud Engine)等PaaS平台通过解耦开发团队和运维团队,将极大地提高未来软件交付的效率。尽管云计算的代码部署能力、代码运行时环境、各种应用运行所需的服务等使得开发大型软件更为便捷,但是因为它做不到全自动无故障的运维管理、无法提供全套的管理工具、提供的服务有限等原因[5],目前无法高效解决软件工程的根本任务。

       人工智能与银弹 随着深度学习技术的革新,人工智能在传统的图像、视觉、语言等多个领域突飞猛进,甚至引发了第四次工业革命。那么,在此次人工智能的浪潮中,软件工程是否会迎来造出银弹的契机呢?

人工智能

       人工智能(AI:ArtificialIntelligence)是指由人制造出来的机器所表现出来的智能。它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。在软件工程领域,人工智能也在悄然影响着传统的编程和管理方式。

       自动代码生成 自动代码生成是人工智能编程的实现方式,是指利用深度学习等方法,依据用户对程序功能的设定,自动生成可执行的代码。自动代码生成是集成开发环境(IDE)自动代码补全的最终目标。pix2code系统[6]是一家位于哥本哈根的创业公司UIzardTechnologies开发出的自动代码生成工具。该系统运用CNN+LSTM构建了端到端的深度神经网络,能够根据输入的图形用户界面(GUI)截图直接生成领域专用语言(DSL:DomainSpecific Language),再将DSL转换为对应的源代码。Beltramelli是该公司的创始人,他表示,在未来,可能会用生成对抗网络(GANs)对pix2code进行进一步的完善。

       自动缺陷修复 自动缺陷修复是人工智能程序测试的实现方式,是指利用深度学习等方法,对完成的程序进行自动化缺陷定位以及缺陷的自动化修复。GenProg[7]是Virginia大学的Weimer等人提出的基于源代码的修复方法,利用遗传编程等随机搜索方法与轻量级程序分析相结合,以找到现存软件中的实际错误的补丁。CodePhage[8]是麻省理工学院(MIT)计算机科学与人工智能实验室(CSAIL)开发的漏洞自动修复系统,CodePhage能够在没有获取访问源代码权限的前提下寻找适合的代码,然后以相同的前提对缺陷程序进行不断的调试,直至找到最理想的修复代码为止。MIT计算机科学与工程教授MartinRinard表示,“我们的长期目标是,让你再也不需要去重复别人已经写过的代码。系统将自动寻找相应的代码,然后将你所需的那些部分组合成一个能够运行的整体。”

       智能编程助手 智能编程助手可以协助软件项目开发者的工作,不仅在编程方面会有代码提示、缺陷提示等功能,更在软件项目设计、项目管理和进度安排等方面起到智能化分析提示的作用。以色列初创公司Codota[9]想成为编程界继Github之后的下一个颠覆者,通过运用人工智能,Codota可以为编程者推荐代码语句从而提升编程效率。除了提升编程的速度和准确性,程序员在使用Codota的过程中还可以发现某个问题更好的解决方案,因此Codota对程序员的编程能力提升会很有帮助。

       随着人工智能技术的发展,促进了软件工程自动化程度的提升,而软件工程的自动化和智能化意味着一批又一批软件工程辅助工具的诞生,包括:智能的软件系统设计辅助工具、自动化的系统代码生成工具、自动化的缺陷修复工具、智能的软件工程助手等。

       这些智能工具的诞生,将使得软件工程更为容易更为普遍,软件将会定义一切,而从前那个难以控制、难以估计、难以实施的“人狼”怪物,也将在人工智能这颗“银弹”下,致命绝杀。

xzhren@pku.edu.cn 任星彰 返回主页

参考

  1. https://zh.wikipedia.org/wiki/%E6%95%8F%E6%8D%B7%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91
  2. https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E6%9C%8D%E5%8A%A1%E7%9A%84%E6%9E%B6%E6%9E%84
  3. http://highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html
  4. https://zh.wikipedia.org/wiki/%E9%9B%B2%E7%AB%AF%E9%81%8B%E7%AE%97
  5. http://www.infoq.com/cn/news/2014/10/paas-not-silverbullet
  6. https://github.com/tonybeltramelli/pix2code
  7. https://pdfs.semanticscholar.org/3aa3/5c213730e688fa191a1ce241db31087956f0.pdf
  8. http://people.csail.mit.edu/fanl/papers/codephage-pldi2015.pdf
  9. https://www.codota.com/