架构软件工程的未来

Posted 半吊子全栈工匠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了架构软件工程的未来相关的知识,希望对你有一定的参考价值。

软件对国家的全球竞争力、创新和国家安全至关重要。它还确保了我们的现代生活水平,并使国防、基础设施、医疗保健、商业、教育和娱乐不断进步。卡内基梅隆大学软件工程研究所领导社区创建了这样一个多年研发愿景和路线图,用于设计下一代软件系统。

基于软件的性质,它在能力、复杂性和互连方面在持续无限制的增长。软件的发展似乎没有停滞不前。为了使未来的软件系统安全、可预测和可进化,软件工程界必须共同努力,从战略上推进软件工程的理论和实践,以实现下一代软件依赖系统。

1. 介绍

我们生活在一个由软件驱动的变革时代。在过去的半个世纪里,软件已经深深地与我们的个人生活交织在一起,对国家的全球竞争力、创新和国家安全是至关重要的。随着社会赋予了软件越来越复杂和关键的功能,我们对未来软件系统的依赖将持续增加,但系统的构建和维护会变得更加复杂,而软件工程是负责构建和维护这些普及软件系统的学科。

软件工程应用了必要的理论、工具和实践,从而能够交付和维护功能强大、可靠、及时且价格合理的软件系统。随着系统不断发展,几乎可以肯定,新类型的系统将超越当前软件工程的界限。我们将无法充分地开发和维护未来的软件系统,除非进行适当的研究,以克服新趋势和软件技术中固有的工程问题。软件提供了无限的潜力,但只有通过软件工程的进步才能实现。

1.1 软件赋能与创新

软件为现代生活中的许多重要活动提供了能力。它使我们的手机、汽车、医疗设备等功能更加强大。软件也有助于创新。例如,在如今的汽车中,几乎每一个部件都连接到了一台中央计算机,数百万行代码实现了我们期望的所有功能。

软件是一切,一切皆为软件。软件将决策者与数据联系起来,改善了货物对客户的流向,并实现了全球通信。我们可以通过软件支持的社交网络与远隔重洋的朋友和家人联系。我们可以很容易地获得石油、天然气和电力,因为软件可以管理这些资源通过管道和电网的流量。多亏了软件,使我们认为这些和其他重要商品一样出现在日常生活中是理所当然的。

1.2 软件是阿喀琉斯之踵

虽然软件是一个社会日益依赖的使能器,但也使我们容易受到其弱点的影响。例如,最近的软件质量问题的一个漏洞,导致黑客访问了数十亿个人、公司和政府办公室的数据[Tunggal,2021]。软件漏洞还导致了美国历史上最大规模的一条输油管道关闭,攻击导致了多个州数百家企业[Satter 2021]的瘫痪。软件质量问题已经导致了飞机上的旅客丧生、空间飞行行业中的事故、车祸等昂贵的故障[Rhee 2020;CBS 2010]。事实上,根据信息和软件质量联合会(CISQ)[Krasner,2021]的数据,2020年在美国,由于软件质量问题导致的总成本为2.08万亿美元。

1.3 软件是关键安全系统的脊梁

许多跨国公司正在面对软件工程工作未达到其系统所要求的质量水平时出现的严重故障。例如,一项重大太空计划一直受到设计错误、软件错误和质量保证实践问题的困扰[Pasztor,2021]。这些问题的根本原因,是缺乏软件工程领导力和纪律[McFall-Johnsen 2020]。在这些挑战中,并非只有物理空间上的举措。例如,过去十年中,与几种不同汽车软件相关的非预期加速被认为与许多人的死亡有关,汽车制动控制的其他问题可追溯到有问题和质量差的软件[Mitchell 2010]。

1.4 软件通常依赖于复杂的供应链

现代软件供应链通常包括大量的利益相关者,他们对软件产品的内容做出贡献或有机会进行修改。因此,整个供应链是生态系统的重要组成部分,在考虑软件质量时必须考虑到这一点。(参见图1,了解美国国防部系统供应链中可能存在的复杂关系示例。)

软件开发日益全球化,这一特点引起了对供应链攻击的关注。这些类型的攻击在数量和规模上都在迅速增长,并且由于系统之间的互联性越来越强以及软件代码库和库缺乏透明度,它们变得更加犀利。

例如,2020年,一家以帮助企业管理其网络和信息技术基础设施的美国开发软件公司被证明是迄今为止已知最大规模供应链攻击的理想目标。通过在例行软件更新中插入恶意代码,黑客能够破坏五分之四的财富500强公司(包括微软、英特尔、FireEye和德勤等)和许多美国政府机构(包括国土安全部、国务院和国防部)使用的第三方软件。总共约有30000个公共和私有组织在使用可能被感染的软件,这导致了一个数据、系统和网络受损的情景[Turton 2020]。

理解所用代码的功能和质量,并记录和验证供应链,这一点很重要。供应链完整性是至关重要的,但重用低质量或未知质量的代码是司空见惯的。跟踪软件的来源是解决这个问题的一种方法,开发这样的技术和工具将有助于提高软件质量。

1.5 软件是关键基础设施的组成部分

低质量软件的开发或重用可能会引入漏洞,使网络犯罪分子能够访问控制关键基础设施的软件并造成严重破坏。2021 5月,Colonial Pipeline发生了一起引人注目的袭击事件,该管道每天运输约1亿加仑汽油、柴油和航空燃料,为东海岸提供约45%燃料【伊顿2021】。黑客组织DarkSide对管道系统发起了勒索软件攻击,导致该公司关闭所有业务以遏制攻击。这起事件被认为是历史上对关键基础设施最重大的袭击之一。勒索软件攻击在2020年增加了715%,目前是增长最快的网络攻击类型[Bitdefender 2020]。每周约有1000家公司受到勒索软件攻击,公用事业公司是第二大最常见的攻击目标,仅次于医疗机构[Lanowitz,2021]。

虽然在关键基础设施中开发和部署安全软件的许多长期挑战是已知的,但问题仍然存在,低质量的软件代码继续在整个基础设施中传播着漏洞。

1.6 软件工程决定软件质量

软件故障直接反映了软件开发和维护方式的不足【van Genuchten 2019;Shaw 2002】。也就是说,低质量的软件是当前软件工程技术和实践的直接结果。一些影响是非常明显的,例如,由于失去对物理实体的控制而造成的生命损失。其他影响不太明显,例如当车辆排放系统性能不佳或手机应用程序未经用户许可收集和共享数据。如果没有对软件工程投资的催化剂,由于对越来越多和复杂软件系统的依赖性越来越大,情况将更加恶化。本报告旨在成为使软件工程成为战略优势的催化剂。

1.7 行动呼吁

尽管软件的进步是从许多部门逐步实践中有机出现的,并实现了20年前无法想象的进步,但它们并没有提供未来系统所需的能力、安全性、质量和可进化性水平。在对软件工程进行合理研究的同时,需要集中精力、持续投资和改进关键的软件工程技术;否则,可以肯定的是,下一代应用  程序根本不可能实现。

本研究报告确定了对实现未来系统中至关重要的研究领域,并提供了指导软件工程研究的路线图。在制定本路线图时,确保将未来软件系统的安全性、可预测性和可进化性所需的工作放在首位。

本报告是一份行动呼吁,强调了持续投资软件工程研究的必要性,以实现研究路线图中所描述的愿景。研究投资必须与软件工程对国家安全和竞争力的重要性相称,激励行业和政府投资伙伴关系将是成功的关键要素。

1.8 范围

本研究解决了以下问题:

  • 如何快速开发、保证、分析和部署未来的软件系统?

  • 哪些重大的开放性问题和“重大挑战”是重要的?

  • 需要哪些软件工程研究来发明面对这些挑战的解决方案?

  • 如何促进政府、学术界和行业之间的战略伙伴关系和合作?

需要强调的是,软件工程不能孤立地考虑,它需要系统视角,包括软件、硬件和人。在报告中包含了这种思想的元素,但主要集中在软件工程研究的议程上。本研究旨在适用于所有类型的软件系统,如军事安全和商业系统;商业和物流系统;以及支持所有研究类型的系统。

虽然软件工程支持的解决方案可能对社会和经济的所有部门产生变革性影响,但也有人担心这些系统的安全性和脆弱性。这项研究没有直接深入探讨网络安全,因为其重要性已经得到充分肯定,SEI和其他机构也在继续开展这方面的研究。

随着人工智能革命的推进,这些技术的开发和部署将加速。我们已经将人工智能定位为一种能力增强剂以及工程不确定性的来源,但没有提出人工智能的研究议程。SEI和其他机构也都有专门研究机器学习和人工智能的重要项目。

1.9 受众

本研究的一些预期受众如下所述:

  • 工业研究人员、学术研究人员、技术人员和研究实验室可能会感兴趣的是,确定重要的开放问题领域,在这些领域中,研究解决方案可能特别有效,跨行业/学术界的新工作模式可能产生红利。

  • 研究资助者、决策者和立法代表可能会理解这样一种观点,即在所确定领域的投资有可能广泛支持多个领域的研究和实践的重要发展。

  • 软件开发人员、从业者和项目经理可能会发现当今领域中的关键挑战是有用的,并可能会受到启发与研究人员合作,帮助更广泛地解决这些问题。

  • 政府资助的研究与开发中心可能会受到启发,共同致力于一些基本软件问题,这些问题将有助于解决各个许多特定重点领域的国家优先事项。

  • 教育工作者可能会欣赏该领域当前实践状态的快照(及其限制的阐述),以便在课堂和课程中使用。

  • 行业领导者可能会发现研究方向和劳动力的改进领域,以补充他们的需求,并确定与研究人员合作解决商业领域关键问题的方法。

1.10 方法

软件工程作为一个全球生态系统存在,包括许多具有不同观点的利益相关者,包括软件开发人员、软件工具供应商、将软件集成到其产品中的公司、软件研究人员和软件的政府赞助者。在这项研究中,CMU SEI与软件工程社区合作,组建了一个由商业、学术界和政府部门的远见者和思想领袖组成的咨询委员会。在他们的投入下,研究团队致力于创建下一代软件依赖系统工程的多年研发愿景和路线图。

这些社区之间的协调对于制定议程至关重要,也将是落实成果的必要条件。了解不同的软件工程生态系统、确定未来需求和确定实现变更的方法需要一系列活动,如图2所示。

在开展这项研究时,团队进行了背景研究和文献调查,举办了研讨会,进行了专家访谈,评估了计算和软件趋势和新兴技术,开发了未来场景,与咨询委员会合作,检查了与软件相关的经济和商业数据。附录A提供了与软件工程界合作举办的研讨会的更多信息,包括与国防高级研究计划局(DARPA)合办的研讨会。

2. 探索新兴技术与趋势

计算技术的进步仍然是美国在科学技术、国家安全和经济竞争力方面保持领先地位的关键驱动因素[DIB 2019]。为了预测未来支持软件工程所需的研究和开发,必须密切关注有助于了解新挑战和机遇的新兴趋势和技术。

虽然不可能在一个文档中对它们进行全面探讨,但本节中包含的内容有助于描绘影响软件工程研究的技术前景。

2.1 新兴趋势

在当今快速发展的世界中,趋势在不断变化。以下重点介绍了我们认为对于预测软件系统未来的发展非常重要的几个当前趋势。

软件工程的流水线正在发生变化,加快了软件代码的生产和高速部署的能力。如今,私营企业和公共部门面临着快速变化的竞争环境、不断变化的安全需求和性能可扩展性的挑战。企业正在努力以创新和信心来快速开发和部署,弥合运营稳定性和快速功能开发之间的差距。在大型航空航天组织或产品组织(如亚马逊)的规模上,这通常意味着数千个独立软件团队必须能够并行工作,以快速、安全、可靠地交付软件,并且对中断或错误零容忍。快速开发实践,如持续集成/持续开发(CI/CD)和DevSecOps,正被用于快速、可靠地交付软件功能。随着这一快速开发/部署连续体的进一步发展,软件工程流水线的概念正在演变为一个动态过程,通过这个过程,新的能力被引入不断演进的系统中。

新型系统将持续超越当前软件工程理论、工具和实践所能支持的范围[Kim 2019;Murphy 2020;NITRD 2011;Weyuker 2021;Wing 2021]。例如,趋势已经指向这些系统类型的开发和使用:

  • 高适应性的防御系统。软件越来越多地支持结合智能、武器、人机协同和其他能力的新型异构计算系统。

  • 执行大规模数据融合的系统。无论是新闻还是情报,这些系统都利用了大量的数据流,包括开源数据。这些数据流还将推动构建未来软件系统的新方法。

  • 智能城市、智能建筑、智能道路、智能汽车和其他智能交通工具。软件系统现在是这些领域中关键基础设施的组成部分,它们需要处理大规模集成,并适当处理安全和隐私问题。

  • 真正有帮助的个人数字助理。软件系统必须能够学习和自适应,作为其在家庭、商业和国家安全工作流程以及我们个人生活中集成的一部分。

  • 医疗保健的动态集成。家庭、医生和医院的设备将越来越多地集成到功能和数据的使用中。这种整合将导致更好的疾病预防、治疗和恢复护理。

  • 社会规模的系统。这些平台在连接性、人工智能和数据科学的推动下,变得越来越大,影响力也越来越大。随着这些系统的发展,它们影响着社会行为,并在社会层面产生影响。在过去十年中,这类系统的发展趋势已经爆发,全世界有39.6亿人使用社交媒体[Dean,2021]。

规模激发了对安全和弹性软件组合的需求。 依赖软件的系统范围和规模在不断变化和增长[NRC 2010]。随着计算机硬件的改进,可以开发更复杂、更高级的软件,随着更多设备通过传感器和网络连接到物联网(IoT)中,规模的增加显然是一种趋势,没有减缓的迹象。在这些大型复杂系统中从头开始开发和维护软件组件已不再现实。因此,一个共同的趋势是从模块化组件中集成(并不断重新集成)软件系统,其中许多组件是从现有元素中重用的。

人工智能(AI)系统的开发和维护与构建、部署和维护软件系统有许多相似之处。人工智能吸引了公众的想象力,以及大量的投资和研究资金[Gil 2019]。随着人工智能越来越多地应用于各个行业,人工智能的使用呈扩大趋势。而人工智能是一个领域,它本身有许多子领域和应用,在软件开发中具有巨大的潜力。人工智能增强的软件开发有望自动化常见或繁琐的任务,并使流程更高效、更有效、更令人愉快。软件工程需要关注AI元素给软件分析、设计、构建、部署、维护和演化带来的挑战。

数据隐私和可信是软件系统越来越重要的设计考虑因素。数据现在是一种战略资产,在全球范围内捆绑、共享、出售和分发。适当地使用这些数据,同时保护数据并防止其被滥用,会带来与隐私、信任和道德相关的严重架构挑战和软件工程挑战,例如差分隐私的技术。这些技术对于人口普查、医学分析和其他涉及收集个人信息的数据分析工作非常重要。信任与用户对系统数据或输出的信心有关,包括社会上特别关注人工智能的系统中。其他技术也有建立信任的潜力,例如区块链,一种分布式账本技术。它为软件工程带来了新的机遇,在软件测试、质量、配置管理和维护方面都有应用[Demi,2021]。

2.2 新兴技术

我们今天拥有的强大技术生态系统意味着不断引入新技术,而且还有更多的技术即将出现。了解这些技术可以带来的能力,以及如何快速、安全、可预测地将它们集成到系统中,是确保它们成为软件系统的关键资产,而不是弱点或不稳定的来源。在以下段落中,简要介绍了一些直接影响软件工程的技术[Holland 2020]

高级计算在组成和开放系统方面带来了新的工程挑战。高级计算通常是指台式计算机和普通公众无法获得的一组功能。这通常意味着使用专门的软件或硬件来提供支持大规模数据密集型项目的先进技术能力。高级计算的一些例子包括高性能计算(通常用于模拟和建模)、大型云计算实现以及量子计算和信息理论的使用。

在过去的十年中,在新硬件的支持下,高级计算有了许多发展,如多核芯片、图形处理单元、现场可编程门阵列和芯片级的专用集成电路,还存在一个长期的技术机会来开发一个能够实现可扩展量子计算的软件生态系统。高级计算强调了一个事实,即未来的计算环境将越来越异构,这将在跨计算基础来构建和发展系统方面带来新的挑战。

由于规模的原因,智能边缘带来了新的挑战。“智能边缘”是一个概括术语,指将异构计算能力、应用程序和数据推向互联网的边缘。它超越了传统的计算机网络,融合了网络边缘的设备,如传感器、物联网设备和移动电话。尽管普适计算的概念已经存在了几十年,但最近出现了智能边缘的加速,包括硬件改进和5G网络的广泛部署。由于无处不在的传感器和物联网,边缘数据正在快速增长,分析领域正在创造新的新方法,利用边缘设备和中央处理的组合进行分布式数据分析。未来更智能的边缘甚至可能包括更多非传统设备,如卫星,以实现下一代的连接。

数字孪生为可信体系创造了新的机遇和挑战。数字孪生是物理对象的高保真数字或计算机表示,具有一定的推理能力。这些类型的模型使我们能够了解现实世界中的对象在许多不同条件或要求下的行为。数字孪生已经开始将现实世界物体感测到的实时数据结合起来。这种新的、更高分辨率的传感器数据允许数字孪生对未来的行为进行推理,然后将反馈传输到物理对象。数字孪生为软件工程师利用数据开发和可信软件系统创造了新的机会,但随着物理世界中越来越多的系统产生了数字孪生,他们也在规模上带来了新的挑战。

量子使能系统在组合不同的计算模型方面带来了新的挑战。软件工程是量子使能系统的挑战:许多领域都需要进步,包括量子算法、开发工具、语言、计算平台和测试平台。如果我们设想实现了允许量子计算扩展的硬件,那么软件和软件工程也将需要更多的进步。

扩展现实为人类交互和可视化复杂数据和系统提供了新的机会。扩展现实是指增强现实(AR)、虚拟现实(VR)以及两者的组合。AR包括使用设备,如辅助显示的专用眼镜,允许个人看到真实世界,但具有增强的信息。相反,虚拟现实指的是使用专用设备,使人只能看到虚拟世界。扩展现实的一个本质特征是它能够从根本上重塑人类对信息的推理。这些技术可以为软件工程师提供新的界面,以可视化复杂的数据或系统,并使新的用户交互界面具有更高的生产率。

3. 调查结果

在本研究的调查结果中,软件工程是一个高度动态、快速发展的领域,技术可以迅速崛起并发展成为现代生活基础设施的组成部分。虽然这也许并不令人惊讶,但近期技术趋势的融合程度以及高质量能力的迅速涌现是惊人的。

以下发现总结了软件工程未来所需的关键知识、关键挑战和新研究。

3.1 保持国家软件工程能力是一项战略优势

软件工程影响一切,因为软件无处不在,包括国家的基础设施、国防、金融、教育和医疗系统。我们对软件系统日益增长的依赖使得我们必须保持我们国家在软件工程领域的领导地位和战略优势。我们需要提高软件工程的知名度,使其获得与其对国家安全和竞争力的重要性相称的持续认可和投资。

软件越来越多地以越来越大的规模在影响着人类的互动。随着我们对软件依赖的增加,需要改进软件工程的技术来处理未来更大、更复杂的系统。

3.2 保持国家软件工程能力需要持续的研究

新型系统将继续超越当前软件工程理论、工具和实践所能支持的范围。未来的系统和软件工程中的根本性转变需要在智能自动化、不断发展的可信系统和理解组合系统等领域进行新的研究重点。新的系统类型,如人工智能系统、社会规模系统和量子系统,也推动了这项新的研究。

人工智能的可预测性和普遍使用也将导致新的软件工程原理。将人工智能纳入软件系统需要对人工智能工程进行研究,以增强必要的软件工程环境和工具。引入人工智能还需要理解人工智能和非人工智能组件如何协同工作,以实现整体可预测的系统行为。软件工程工具是一种特殊的系统,将人工智能纳入这些工具将使软件工程更加有效。一旦我们了解了如何以可预测的方式做到这一点,它将允许更多的责任转移到人工智能,人工智能和人类之间的合作将继续加强软件工程。

3.3 保持国家软件工程能力需要促进战略伙伴关系

我们需要促成战略伙伴关系和协作,以推动行业、研究实验室、学术界和政府之间的软件工程研究创新。将人工智能引入这些工具将使软件工程更加有效。

3.4 保持国家软件工程能力需要持续的投资

我们必须确保决策者认识到软件工程的好处,并使其成为一项重要的国家能力。这种承认将意味着持续的投资战略。

3.5 软件工程的愿景需要改变

当前基于程序员意图的软件开发流水线的概念将被人工智能和人类合作并不断进化的系统所取代。

3.6 将重点放在可信系统上,使新能力能够持续、快速地整合

由于软件无处不在,因此对软件的需求不断增加,不断发展,并整合新的功能。因此,我们需要了解如何在不损害现有能力的情况下,持续有效地保证软件系统是可信的,提高可信证据和论据的重要性将是关键。

3.7 社会规模的系统需要新的设计原则

对软件影响的加深认知正在产生新的质量属性需求,软件工程师需要开发更好的设计方法。除传统属性(如可修改性、可靠性、性能等)外,还需要添加新的质量属性,如透明度和影响力。

社会规模的系统涉及微妙的判断(例如,软件系统和言论自由原则之间的适当交互)。社会规模系统的一个共同特征是人类成为系统的组成部分。这些系统应提供信息或通信渠道,可预测地从用户那里获得期望的结果(如参与度、准确性等)。随着这些系统的激增,需要更多的研究来实现对系统行为的预测和控制。

3.8 需要重新设想并构建软件工程的人员队伍

依赖于软件的系统是由一群拥有完全不同技能的人为许多不同目的而构建的,其中许多人没有受过正式的软件工程培训。我们需要更好地了解所需劳动力的性质以及如何促进其增长。

社会普遍对软件工程人才的充足性和可用性表示关注。人们似乎越来越关注一些话题,包括不断变化的技术技能、软件工程人才的全球竞争以及软件教育的作用。似乎很清楚的是,无论提供了什么工具,或者我们使用什么抽象级别来构建系统,人在不断发展的软件工程中始终扮演着最重要的角色。

4. 展望软件工程的未来

假设现在是2035年,软件工程会是什么样子?也许我们可以把它想象成人类和计算机之间的技术对话,而不是手动细化规范和编写代码的过程。

4.1 未来情景

考虑一下这个场景:无休止的需求和设计审查的日子已经过去了。一个由航空工程师、飞行员和软件工程师组成的联合团队通过提出想法,共同设计下一个具有太空能力的飞行器,这些想法在获得关于物理系统的广泛知识以及物理局限性的基础上,变为可行的设计。这些设计是实时显示的,团队通过实时模拟典型任务,在飞行中比较防御和机动能力。最终设计是根据成本、能力和时间的最理想平衡来选择的。与这种流动的迭代过程相比,今天的软件开发生命周期的概念似乎过时了。

未来的软件开发可能更多是表达所需的能力,而不是编写代码或拥有算法的思想仓库。软件工程师必须熟练地表达意图,使计算机能够从经验中学习。“优雅的软件”不再指聪明的代码,而是人类与自动化和人工智能系统合作,以最及时、经济、符合道德和安全的方式实现人类所能想象的最佳想法的结果。

能够“编程”和创建复杂系统的人自然也会扩展。我们与计算机的对话将以领域语言进行,例如,计算生物学家通过谈论测序和基因来开发软件能力,而不是学习Python。所有类型的专家都需要适当地通知计算机,他们的交互方式将与今天有很大不同。

仿真的使用可以将今天的整个测试和评估方式转变为一种沉浸式体验。设想为一系列空间资产规划了新的硬件配置和软件功能。在完全沉浸式虚拟现实环境中,通过对当前资产的全面遥测来模拟环境变化。工程师可以从任何有利位置查看新的空间配置,而不仅仅是在可视范围内。来自当前环境的所有可用数据和元数据也实时呈现。如果期望的效果不是预期的,工程师会做出改变,并立即看到对整体空间环境的影响。此外,数十名或更多的工程师正在共享体验中观察和操作相同的环境。工程师之间的沟通,通过多种类型的媒体和共享的决策过程,确保系统作为一个整体没有意外或不期望行为。一旦做出更改,将使用相同的环境来支持操作员培训和实时任务演练。

软件一旦被部署,系统的适应性和可集成性也将大大提高。考虑一个涉及特种部队部署的场景,想象一场交火。小队措手不及,通讯中断,他们不确定用什么武器对付他们。幸运的是,他们正在与一组微型无人驾驶飞机系统合作,利用备用通信渠道主动建立网状网络,以重新建立与总部的联系。一旦该网络建立,该小队将指挥设备秘密观察和分析战场上的武器,并在掩护时提供缓解选项。因此,他们不仅能够在当地克服新的威胁,而且能够将他们的实时经验提供给处于战场边缘可能处于风险中的其他部队。为了使这一场景成为现实,软件工程师将需要设计灵活的架构,并允许根据来自传感器的数据和来自现场用户的其他输入对系统进行调整。

随着自适应用户界面的扩展,设计一部电影的工作方式可能会有所不同。人们不再期望他们知道编码和脚本,他们可以在开发完全沉浸式电影的过程中进一步提高他们的创造性设计技能。在“全息甲板时代”,他们能够融入新颖的视觉故事情节,为下一代触觉反馈设计服装,并创造对观众输入做出反应的事件。随着时间的推移,随着情景可能性的探索,互动体验不断发展和改进,以适应参与者的偏好,并以艺术家的意图为基础。

软件工程的学生也将学习不同的知识。帮助他们编写代码的人工智能和自动化工具可能在很大程度上是不可见的,因为他们专注于主要工作:学习如何最好地理解和表达软件应该(和不应该)做什么。他们的计划意图是什么?他们如何能确保这一意图得到实现呢?最终结果是否不仅是功能性的,而且是可进化的、对用户直观的、值得信赖的?一个示例项目可能涉及一个个性化的web“浏览器”,它可以根据个人的需要定制,同时还可以自我更新安全层,以保护关键数据。同样的系统仍然可以建立并实时匿名分享适当的信息,以帮助其他从事类似项目的学生。

随着软件工程师进入劳动力市场,他们将不再需要试图理解日益复杂的系统变化带来的连锁反应。由于系统是由人类和人工智能助手共同进化的,因此在实施之前,问题已经被识别和纠正。通过分析变更可能对系统的基础和保证参数产生的影响,确保变更不会破坏系统,这是由熟练的软件工程师设计的。设计也将保证符合质量的标准,作为由专家工程师实施的复杂软件开发框架的一部分,但对不需要关注这些方面的程序员隐藏。

尽管软件工程取得了这些进步,但任何类型的复杂系统都不可能是完美的。未来,可能会出现专门的学科,如检测潜在系统问题、在故障发生时恢复能力、发现并消除原因的学科。例如,安全软件工程师可能会参加与世界各地同事的虚拟会议,分析客户安全代码中的漏洞,并确定其可能产生的影响。另一个与社会技术生态系统合作的工程师可能会被系统本身要求:如果它注意到情绪的总体表达正朝着不受欢迎的极端发展,请介入。当检测到这些问题时,专业软件工程师的工作就是找出根本原因。它是一个训练不足的机器学习算法,表达了不好的意图,亦或一个因为没有考虑特定变量而违反了架构的组件,还是其他什么?

在所有这些场景中,软件工程无处不在,尽管它的外观和行为与今天不同。它实现了所描述的所有功能,而且安全、可预测且经济。未来的研究进步将使不同群体的人有更广泛的机会进行创造性开发,但软件工程将确保系统具有卓越的能力,在很大程度上没有我们今天看到的问题和失败。

4.2 软件工程的未来展望

虽然智能算法和人工智能的确切角色仍有待确定,但软件工程对我们愿景的重要性是显而易见的:人类和人工智能将是值得信赖的合作者,能够根据程序的意图快速进化系统。

随着软件工程师不断与智能软件助理互动,计算机和人类将能够做他们都做得最好的事情。以这种方式工作,我们甚至无法想象的可能性将成为现实。本报告中的研究为推进软件工程学科提供了必要的基础,以确保必要的框架到位,以最大化这些未来的优势。

软件工程的新愿景需要新的开发和架构范例,这也激励了第5节中描述的重点研究领域。

先进的发展模式,将在规模上带来效率和信任:

  • 人类利用可信人工智能作为软件创建各个方面的劳动力乘数。

  • 形成正式的保证论据,以确保并有效地保证软件的不断发展。

  • 先进的软件组合机制能够在越来越大的规模上实现系统的可预测构建。

先进的架构范式将使新计算模型的可预测使用成为可能,如下所述:

  • 来自行为科学的理论和技术用于设计大规模社会技术系统,导致可预测的社会结果。

  • 人工智能和非人工智能组件以可预测的方式相互作用,以实现增强的任务、社会和业务目标。

  • 新的分析和设计方法促进了量子使能系统的开发。

5 研究的重点领域

本报告中描述的软件工程的基本转变和进步需要新的研究领域。我们与顾问委员会和软件工程研究社区的其他领导者密切合作,制定了一个包含六个重点领域的研究路线图。

本节描述这六个领域的动机,它们与上一节的发现密切相关。在本节中,还提供了一个完整的路线图,然后深入讨论了每个研究的重点领域。

5.1 先进的开发范式

使用DevSecOps和数字孪生的趋势表明,现场系统和开发环境之间的边界开始模糊。例如,通过成熟的人工智能技术,软件正在增强人类的决策,并成为从数据中学习来提高性能的有用工具。操作数据与仿真相结合,可以实时了解系统的行为。不断变化的任务需求正在推动系统的连续演化,需要有效的系统保证和系统开发的组合方法。这些趋势推动了前三个研究重点领域,我们认为这三个领域是先进开发范式的基础:

1.人工智能增强软件开发:使用成熟的人工智能技术增强软件工程中的人类决策,并从大量软件工程数据中学习。

2.确保持续发展的软件系统:认识到快速变化系统有效保证的重要性,同时考虑到未来软件系统推理所需的许多科学领域和证据。

3.通过组成的正确性进行软件构建:认识到开发和进化系统的唯一可行方法是通过实现组合开发的技术。

5.2 高级架构范式

未来系统的一些特性为软件工程提出了新的和有趣的问题。特别是,将人工智能组件引入系统,将人类视为系统的元素,并有效利用量子计算,对未来系统提出了特别重要的挑战。在我们的软件工程愿景中,高级

架构范例将使系统的这些新方面的可预测使用成为可能。这些挑战激发了以下三个研究重点领域,我们认为这三个领域是高级架构范例的基础:

4.工程社会规模软件系统:讨论建模人类行为的挑战

5.人工智能工程化支持的软件系统:关注处理人工智能组件给系统带来的不确定性的挑战

6.量子计算工程化的软件系统:考虑量子计算的哪些方面应隐藏于或暴露于软件堆栈的更高层

5.3 研究路线图

我们确定的研究领域是相互协同。例如,人工智能增强软件开发需要考虑不断发展的系统,最终,人工智能工具在提供软件开发建议时需要使用可保证的论据。通过组合正确性进行的软件构建与确保持续发展的软件系统之间的关系也很强,因为随着系统的发展,组合技术和推理将是增量确保的关键因素。同样,所有高级开发范式都适用于高级架构范式中讨论的每种新系统类型。

5.4 AI增强软件开发研究重点领域

5.4.1目标

提高软件工程师效率和减少其认知负荷已经推动改进了自动化和形式化的趋势,以支持软件开发任务。使用人工智能增强方法的软件工程师也将能够专注于需要批判性思维和创造力的任务。该研究领域侧重于开发自动化AI相关的软件工程任务方法,并加速可靠性工程自动化的发展。这一研究领域的成果将进一步将人类的注意力转移到计算机不擅长的概念性任务上,并消除计算机可以帮助任务中的人为错误,从而使可靠软件的设计、开发和部署成为可能。

在过去十年中开发的许多自动化方法,包括基于模型的软件工程、DevSecOps工具、缺陷和漏洞分析、自动错误修复、现代代码审查和价值流管理工具,都旨在提高软件开发效率和质量[Lago 2015;Rahman 2017;Morrison 2018;Le Goeus 2019;Sadowski 2018;Murphy 2019]。尽管在自动化方面取得了这些进步,但故障、软件安全和质量问题以及超支仍然是常态。考虑到问题的规模,仅美国政府就在2019年花费了900多亿美元用于系统维护和运营[GAO 2019]。

我们需要创建工具,使软件工程师能够轻松表达他们关心的更改,包括需求和设计权衡以及不同的解决方案选项,然后相信自动化将在编程语言级别正确解决大部分(如果不是全部)细节。例如,许多系统将受益于开发工具,以帮助开发人员在开发软件时避免、检测和修复缺陷。一系列技术,包括更安全的编程语言、设计更好的框架、廉价且简单的自动生成测试,以及提供修复建议的工具,将共同提供比单独依赖任何一种技术更好的结果。在未来十年,人工智能方法将提供一个重新思考我们如何实现编程目标的机会,特别是通过提供改进的能力来消除后来难以发现和修复的琐碎错误。

这些进步将不可避免地推动对软件开发过程的重新设计,增加对开发人员的智能支持。利用通过软件开发生命周期生成的数据将是该过程的有益和自然的副产品。因此,这一研究领域提出了一个问题:人工智能增强软件开发在未来会是什么样子?

5.4.2当前实践的局限性

当前,软件开发是人力和测试密集型的,而且容易出错。特别是,软件开发的实践方法受到了以下的限制:

  • 开发人员需要成为许多主题(需求、架构、设计、编程语言、分析模型、令人眼花缭乱的技术和框架、质量属性、测试方法、平台等)的专家。软件工程师通常依赖于没有正确遵循的软件开发过程来协调这些活动以及创建的工件。

  • 从开始到部署,需求规范生成了大量工件,如设计文档、分析工件、测试用例和部署脚本。精简这些工件以实现成功的系统交付仍然是一项资源密集型的挑战。

  • 在没有有效工具的情况下,开发人员需要理解复杂系统中的连锁反应(在规模、分布、并发性等方面)。

  • 正式方法和基于模型的方法已经创建,并承诺可靠地生成代码和演化系统,但即使在关键的安全系统中,它们也不能突破系统的局限。

  • 当进度的挑战来临时,用于设计和测试系统的时间继续缩短,进一步危及所开发系统的质量。

  • 系统的可持续性和演化,特别是遗留系统,继续着手动驱动的高风险工作。

  • 作为软件开发框架或工具链的一部分,不能保证符合质量标准和预期架构。

5.4.3研究主题

在软件开发的每一个阶段,人工智能可以帮助人类,并使过程更加高效、有效和愉快。每一代新的工具和朝着这一目标的进步都会被开发人员接受:

  • 执行开发人员已经完成的任务,但效率更高(例如,测试速度更快)。

  • 执行开发人员已经完成的任务,但做得更好(例如,捕捉更多错误)。

  • 执行开发人员目前无法完成的任务(例如,利用新数据集成新的一致性检查或生成新的测试)。

  • 减少移交并集成当前断开连接的元素(例如,提供需求可追溯性)。

  • 教导开发人员如何更好地完成任务(例如,建议和/或指导实施错误的实时反馈)。

  • 帮助扩展开发人员已经可以做的事情(例如,允许他们考虑更多的替代设计选项)。

为了最好地评估这种新的自动化工具和方法在实践中的有效性,还需要无缝地扩展和集成开发人员的环境,即使在研究阶段也是如此。人工智能增强软件工程进一步利用了数据收集、迭代反馈循环和测试开发人员的持续集成和部署环境。

5.4.3.1人工智能支持的重新设想开发工作流

敏捷和精益软件开发流程通过帮助开发人员关注最优先事项并了解库存中的任务,鼓励消除浪费[Reinertson 2019]。例如,测试驱动的开发工作流可能提倡在软件完全开发之前将软件需求转换为测试用例。然后,可以通过针对所有测试用例重复测试软件来跟踪软件开发,这将显著提高软件开发的效率并提高系统质量。类似地,人工智能支持的开发工作流将针对数据密集和繁琐的活动,这可能导致软件开发生命周期中不同的任务依赖性。例如,当人工智能增强bug修复成为现实时,开发人员可能不需要测试某些类型的bug。

结合基于AI支持的工具也将触发为开发人员设想更有效工作流的需求。例如,在代码质量一致性方面改进的实时帮助可以减少在测试和部署期间对添加的静态代码分析的依赖,提高本地一致性分析与系统范围、跨领域、架构质量和运行时问题分析之间的平衡。今天,系统范围的分析通常是手动工作,很少得到自动化的支持。

在AI增强的开发生命周期中,开发人员和人工智能助手都将发挥监督作用。开发人员将指导并改进人工智能助手。人工智能助手将通过提供实时反馈,并及时向开发人员演示重复错误,发挥监督作用。在开发人员团队中,总是有一些开发人员比其他人更值得您信任(可能是由于经验、技能或表现)。人工智能辅助开发工作流程将触发以同样方式思考人工智能“合作伙伴”的需求。作为生产高质量软件的整体团队的一部分,人类和人工智能在哪些方面最有效?

5.4.3.2自动代码修复

自动代码修复是自动代码生成的一种特殊应用。代码生成包括完成不同任务的方法和技术的广泛集合,其确切含义在很大程度上取决于代码库的哪一部分。几十年来,代码生成已经可以用来生成部分代码,例如类声明,以匹配统一建模语言(UML)。这类工作通常被用作起点,开发人员希望在这个代码框架中来管理实现细节。对于驱动代码生成的几种形式,已经有了一些零散的研究。类似地,现有的计算机辅助软件工程工具具有有限的代码生成能力。

人工智能为代码生成提供的机会是搜索现有代码并识别与预期新代码具有相似模式的能力。现有的代码可以用作输入,并进行转换,以解决特定类型的问题,而不是从规范(如UML模型)开始。基于ML的技术可以帮助生成与现有代码类似的代码。这意味着可以从小型开始,使用基于人工智能的代码生成方法来利用通常重复的应用程序。

自动代码修复同样可以使用现有代码作为输入,然后对其进行转换,以解决特定类型的修复问题[Oliveira 2018;Klieber 2016]。需要填补的研究空白包括找出用户需要为程序指定哪些部分才能大规模生成可用的解决方案,以及如何生成部分可接受的解决方案以取得增量进展。其他差距包括确定代码库是否提供相关数据来标记和创建复杂代码生成任务的ML模型,以及确定开发人员如何确定生成的内容是否合适。

随着生成的代码和其他软件工件的数据量指数增长,人为错误的机会增加;被忽略的错误数量也在同时增加。AI,特别是ML,擅长识别大量数据中的模式。成功将取决于识别自动代码生成和修复问题中小型可扩展部分的能力[Kirbas,2021]。

5.4.3.3消除设计/规范一致性差距

调整系统的设计和实现可以提高产品质量并简化产品开发。特别是对于国防部的系统,符合特定体系结构方法(如开放式体系结构)的能力不仅支持技术目标,而且支持任务目标,如跨领域集成的能力。同样的挑战也存在于工业系统中,如智能城市。今天,这种一致性目标是通过定性技术实现的。虽然开发人员获得了人工智能增强的工具和技术,这些工具和技术越来越多地帮助他们完成实现任务,但代码和设计之间的抽象差距限制了一致性和设计任务的自动化。代码经常偏离系统的预期设计,系统中设计的质量无法实现,增加了维护工作。如果开发人员能够确认每个代码提交是否符合预期的设计和质量,则可以防止这种情况。为了以可扩展的方式实现这一点,需要自动化,以将实现的设计与预期的设计作为持续集成流水线的一部分进行比较。ML和基于搜索的算法提供了重新审视这个棘手问题的机会。

5.4.3.4 多工件系统分析

依赖人工智能助手帮助开发人员找到工件、代码库、缺陷和漏洞记录或文档建议中的相关示例,既有机会也有危险。例如,许多开发人员复制了不安全的代码,传播了不良的实践方式。然而,人工智能助手在主动设计以防范此类错误时,可有助于降低此类做法带来的风险。例如,建议可以包含来自多个工件的特征,以及提高相关性的置信度。例如,当项目可以利用来自需求、分析和技术选择的输入来改进来自其他项目的重用代码时,支持多工件分析的人工智能助手就可以在规划阶段支持工程任务。

结合来自多个软件工程工件的信息,在ML方法(如自然语言处理算法和数据增强算法)的支持下,将弱学习者转化为强学习者,将为软件开发生命周期中的可追溯性开辟更好的途径。例如,如果开发人员正在描述他们不太确定的东西,系统可以基于人工智能的干预不断地重建自身的各个方面,直到描述变得更清晰。通过这样做,它可以利用不同软件工程工件潜在的共同特性,这些特性驱动这些学习者的发展。

挖掘软件仓库的工作在过去几十年中取得了进展[Hassan 2008;MSR 2021],特别是在缺陷分析和预测、开发人员情绪分析以及代码审查等实践领域。这部分工作为改进工件内共享信息的可追溯性提供了基础,从而为开发人员提供更及时和正确的决策支持。

5.4.3.5 自动化演进和重构

软件设计、开发和部署是基于权衡的活动。基于搜索的软件工程技术[Harman 2015]显示了适应软件设计的帕累托最优,事实上,代表了设计权衡空间的多种可行解决方案。尽管在为软件工程师提供自动化开发工具方面取得了进展,但诸如重新设计和重构现有软件等复杂活动仍然是资源密集型的。

大规模自动化演化和重构的愿景要求自动化,以设计语言来帮助开发人员,并自动化实现这些更改所需的代码更改[Ivers 2020]。需要解决的问题包括流程的哪些部分可以和应该自动化,以及人工智能方法如何可靠地生成解决方案。对繁琐、重复和容易出错的活动进行自动化是一个明确的起点。工具是否应该最低限度的改变以实现重构目标,还是应该创造机会,沿着总体质量改进目标在改进系统的过程中“清理”一切?我们可以将数据与代码一起重构吗?工具应该重构测试套件和代码。还可以创建单元测试作为大规模重构的副产品吗?解决这些问题将使人工智能增强软件开发能够支持更多高速变化的未来。

5.4.4 研究问题

研究主题产生的问题包括:

  • 我们如何将程序应该做什么的高级规范转化为实现它的低级程序(即,使用抽象逻辑推理创建满足给定规范的程序)?

  • 人工智能可以用何种方式使规范更加精确并解决歧义,符合系统受众的需求?开发人员在编写规范时是否比在编写代码时更容易出错,AI在哪里可以弥补编写代码和规范的差距?

  • 在人工智能辅助的范式中,是否有新的阶段或活动成为软件开发生命周期的一部分?我们是否需要重新思考生命周期的各个方面,以纳入意图的激发?人工智能助手的反馈是否可以用于培养开发人员的技能?

  • 人工智能助手能否帮助开发人员协调持续的系统进化,软件将不再像现在的这样静态和硬编码,而是动态调整以不断实现其目的?

  • 人工智能支持的工具将扮演什么角色,人类开发人员将保留什么角色?

  • 人工智能增强的软件开发工具如何生成有效验证或验证代码所需的元数据?

  • 人工智能能力是否可以通过检测开发环境来支持调试代码(例如,自动化分析是否可以查看关键系统中的问题日志,并了解解决特定类型问题需要多长时间,然后将其反馈给决策制定)?

  • 什么是正确的抽象级别?我们使用了更高级的编程语言、架构模式等。需要哪些新的抽象级别来支持不同的开发人员任务?

  • 需要收集哪些新的软件开发数据(符合道德规范,并确保安全和隐私)以支持此类未来研究?如果我们收集这些数据,哪些活动缺乏可追溯性?

对基于人工智能的解决方案的信任,无论其形式如何,都归结为风险评估。结果正确的概率是多少?如果它是错误的,会有什么影响?如果人工智能提出错误的建议,相关的风险将如何显著降低?开发人员最初将不得不坐在驾驶座上,初期进展缓慢;然而,在回答这些问题方面取得进展将加速。因此,人工智能增强的软件开发将为开发人员创造可靠的自动化支持,提高他们开发的系统的效率、有效性和质量。

5.4.5研究课题

为了在这些领域取得进展,每个领域都必须能够通知其他领域,特别是通过生成数据并使用这些数据确定下一个相关研究步骤。进展将是迭代和增量的,指导成功的里程碑如下:

  • 重新设想软件开发生命周期。需要考虑软件开发生命周期在人工智能增强范式中的变化方式。随着研究的进展,重要的是澄清人类和人工智能增强工具的不同角色,从人工智能作为可信赖的助手到人工智能完全取代某些任务。

  • 获取数据并为人工智能增强范式开发数据模型。需要为人工智能增强范式的每个阶段或工作流建模提供数据,需要进行评估,以确定哪些额外的数据将有帮助,如何以最少的干预收集缺失的数据,以及如何以合乎道德的方式收集这些数据。

  • 确定质量证据的新形式。需要自动累积和携带质量证据,并验证结果是否正确。AI生成元数据以有效地验证代码,并使用代码生成可跟踪证据。

  • 自动化设计、演进和分析工具。需要可靠的自动化工具与开发人员使用他们的词汇表进行交互,以帮助开发和重构任务。

  • 自动代码生成和修复的规模化。基于模型的技术和形式化方法需要用人工智能技术加以扩充,以扩大其适用范围和规模。

  • 收集证据,证明开发人员接受AI的援助并有效。开发人员必须自信地接受新的交互形式;经验数据表明,开发人员在设计任务上花费的时间最多,而不是在软件复杂性和提高质量的挑战上。

5.5 确保软件系统持续演进的重点研究领域

5.5.1目标

该研究领域的重点是如何创建一个可演化的确保方式,该确保方式只需要在对系统进行增量变更时进行增量修改。对系统增量修改所需的保证也应少于完整的从头开始的保证工作。此外,确保的方式应足够充分(即,确保方式中不确定性的唯一来源应是证据中的缺陷。推理结构应完全演绎,在证据和论证推断完全正确的情况下能够提供正确的结论)。

5.5.2当前实践的局限性

软件系统的范围、规模和普遍性在不断增长和变化。增量保证是及时部署和更新系统的唯一可行方法,对其运行行为有足够的信心。对于软件缺陷可能对生命或财产造成灾难性影响的安全和任务关键型系统,提供这种信

以上是关于架构软件工程的未来的主要内容,如果未能解决你的问题,请参考以下文章

互联网的未来架构之道-DDD领域驱动设计

架构软件工程的未来

架构软件工程的未来

架构软件工程的未来

微服务架构优缺点未来如何发展?

云原生技术及其未来发展趋势展望 | 趋势解读