前言 软件正在改变人们的生活。作为21世纪伟大的工程实践,软件已经渗透到当今社会生活的方方面面。人们的生活离不开软件,大多数人每天早晨起床后的第一件事,很可能就是打开某个手机App。计算机C++语言的发明人Bjarne Stroustrup所谓“人类的文明运行于软件之上”,就道尽了此间情景。软件技术是新一轮制造业革命的核心竞争力,我们正进入一个软件定义的时代,“软件无处不在、软件定义一切、软件使能一切”正是这个时代的特征。 软件中的程序取自工业工程。纵观历史,程序起源于工厂的操作列表,软件工程则类似于工业工程,对于工业工程师来说,程序就是一天工作的规划和操作。以前,软件工程师操纵计算机,使其正确工作并求解问题,当时软件的核心是数据的组织和算法的实现。直到今天,越来越多的底层工作,如内存管理、网络通信等都已实现自动化,或者可以实现代码重用。这样,软件工程师无须直面机器代码,而是使用高级语言、集成工具,把更多思考留给软件问题本身。软件制造复杂多变,其难度远超传统工业工程。随着软件的功能越来越强、使用越来越方便、规模越来越大、复杂程度越来越高,现在构建软件系统注定比以前更加困难。 在解决上述复杂、困难的问题过程中,出现了软件设计和体系结构。复杂性是软件开发过程中固有的特质,而软件设计在于帮助软件工程师驾驭这种复杂性。 作为软件开发的核心活动之一,软件设计对开发出满足需求的高质量软件起着关键作用。软件设计需要综合考虑软件系统的各种约束条件,并给出最优方案。设计方法的快速发展和应用程序的大量部署,使得现有计算机系统内部的代码构成差异很大。随着应用软件市场竞争越来越激烈,用户需求交付越来越快、系统功能越来越多、性能要求越来越可靠,结果就有了复用现有系统代码、代码外包、采购商品化构件进行系统集成。在这种大环境下,软件工程师不能仅凭一种程序设计方法,按照设计书逐步进行开发,而是要从阅读、维护、迁移各种已有的系统和外包代码开始进行程序设计。程序设计方法隐藏在不同来源的代码中,软件工程师需要理解、复用、改造这些代码,并应全面了解各种方法的优缺点。这中间不存在一种放之四海而皆准的程序设计方法,各种方法都有其长处和短处。例如,相对抽象和高级的方法,在提高开发效率的同时,往往会导致执行效率的降低; 相对低级和离硬件近的方法,尽管可能学习时间较短,但是适应面却受到了限制。适合的才是最好的,软件工程师需要根据自己的情况,选择适合的程序设计方法。 软件如同建筑物,软件设计不能脱离实用价值。今天,“软件架构师”这个在软件领域负责软件设计、分析、处理来自不同涉众、不同关注点和需求关系的职位,已经被普遍认为是软件开发团队的核心。在软件工程方法中,软件需求与软件设计之间存在着一道很难逾越的鸿沟,从而很难有效地将需求转换为相应的设计,而软件体系结构的出现,恰好在需求与设计之间架起一座“桥梁”,由此实现了软件系统的需求向实现的平坦过渡。软件体系结构是软件架构师洞见系统内部结构、规律、原则、逻辑的过程,并对软件开发的各种外在因素、内在动力、人本属性进行集中关注和深入剖析。作为整体设计的刻画,软件体系结构包括全局组织和控制结构,有关通信、同步、数据存取的协议,设计构件功能定义和物理分布,设计方案的选择、评估、实现等。软件设计的成功,在于有一个健壮、优雅、灵活、易维护的软件体系结构。围绕着比“类”更大的粒度、更高的抽象,软件体系结构刻画了系统的构件组成、构件的关联结构、构件的交互行为,并给出软件设计的动机,即其在功能目标、非功能目标、制约因素之间的权衡取舍。 智能制造业需要硬件、工艺、流程、知识的软件化,进而实现软件的平台化。伴随“软件定义”的挑战,不得不说,软件系统无处不在,需要设计出在应用形态上满足新要求的软件体系结构来,这就是软件给未来世界达成的目标,也是软件架构师的机遇所在。 本书由秦航任主编,第1章、第14章由秦航编写,第2章由包小军编写,第3章、第9章由夏浩波编写,第4章、第6章由邱林编写,第5章、第7章、第11章由张健编写,第8章、第10章由徐杏芳编写,第12章、第13章由胡森森编写,全书由秦航负责统稿,由王同喜任主审。借此机会,编者谨向为本书付出辛勤劳动和智慧的老师及全体同仁表示诚挚的谢意。 本书可作为高等院校“软件设计与体系结构”课程的教材或教学参考书,也可供有一定实际经验的软件工程人员和需要开发应用软件的广大计算机用户阅读参考。 由于作者水平有限,书中不当之处在所难免,敬请广大读者和专家提出宝贵意见,以帮助作者不断地改进和完善。 编者 2020年8月