4、软件工程原理
(1)什么是软件工程?
软件工程是指导计算机软件开发和维护的一门学科。
采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
以下是NATO和IEEE给出的软件工程定义:
- NATO(1968):为了经济地获得可靠的且能在实际机器上运行的软件,而建立和使用完善的工程原理。
IEEE(1993):1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,即把工程应用于软件;2)研究1)中的途径。软件工程是开发、运行、维护和修复软件的系统方法。
(2)软件工程的本质特性
从前面的定义可以看出,软件工程从本质上就是为了解决软件危机。具体可总结为如下几条:
- 软件工程关注于大中型程序的构造。大中型程序相对比较复杂,因此有必要采用系统的工程理论与方法,规范软件的开发和维护过程,以保障软件的质量。
软件工程的中心课题是控制复杂性。软件所解决的问题十分复杂,以致于不能把问题作为一个整体通盘考虑,只能采用模块化分解的方法解决。模块化方法并不能降低问题的整体复杂性,但是却使它变成可以管理的。许多软件的复杂性主要不是由问题的内在复杂性造成的,而是由必须处理的大量细节造成的。
提高开发软件的效率。现实世界在不断的变化,软件为了不被很快的淘汰,必须随着所模拟的现实世界一起变化。如何更快的适应需求的变化,是软件工程面临的重要挑战。
注重团队合作。软件处理的问题十分庞大,必须许多人协同工作才能解决这类问题。纪律是成功地完成软件开发项目的一个关键,良好的团队合作有利于项目的成功。软件开发人员必须学会合作与沟通,才能保证软件的质量和开发效率。
充分了解用户需求。在软件工程领域中是由具有一种文化背景的人为另一种文化背景的人创造产品。缺乏应用领域的相关知识,是软件开发项目出现问题的常见原因。软件工程师不仅缺乏应用领域的实际专业知识,还缺乏该领域的文化知识。因此有必要通过访谈、阅读书面文件等方法了解用户组织的工作流程,然后用软件实现。
(3)Boem软件工程原理
著名的软件工程专家巴利.玻姆(Barray W. Boehm)总结了七条软件工程基本原理并指出这七条原理是保证软件产品质量和开发效率的原理的最小集合。
|
![]() |
注:巴利.玻姆(1935-2022)是一位美国计算机科学家和软件工程师,曾在多家知名机构工作,包括IBM、美国国家航空航天局和南加州大学(USC)。他对软件工程领域做出了重大贡献(开发软件工程经济学模型、螺旋模型等),并因其工作获得了许多奖项,包括软件工程研究所的史蒂文斯奖和IEEE哈兰·D·米尔斯奖。详细介绍可参阅百度百科。
(4)二八定律(帕雷托法则)
二八定律是一种经济学原理,也被称为帕累托定律。该定律认为,在一个系统中,大约80%的结果是由20%的原因所决定。这个原则也可以应用于软件工程领域,即:
- 对软件项目进度和工作量的估计:一般主观上认为已经完成了80%的,往往实际上只完成了20%;
- 对程序中存在的问题的估计:80%的问题往往存在于20%的程序之中;
- 对模块功能的估计:20%的模块实现了80%的功能;
- 对人力资源的估计:20%的人解决了软件中80%的问题;
- 对投入资金的估计:企业信息系统中80%的问题,可以用20%的资金来解决。
注:帕累托定律又称帕累托分析法或巴雷托分析法、柏拉图分析、主次因分析法 、ABC分析法、分类管理法、物资重点管理法、ABC管理法、abc管理、巴雷特分析法,平常我们也称之为“80对20”规则是由意大利经济学家维尔弗雷多·帕累托首创的。帕雷托通过长期的观察发现:美国80%的人只掌握了20%的财产,而另外20%的人却掌握了全国80%的财产,而且很多事情都符合该规律。于是他应用此规律到生产上。详细介绍可参阅百度百科。
(5)软件工程三要素
过程、方法和工具是软件工程的三个要素。
- 过程:软件工程过程是一系列有序的步骤和活动,用于支持软件开发各个环节的控制和管理。过程包括需求分析、设计、编码、测试、部署和维护等阶段。
- 方法:软件工程方法是指用于解决软件开发过程中各个阶段的问题和挑战的技术和工具。常见的软件工程方法包括结构化分析和设计(SSAD)、面向对象分析和设计(OOAD)、敏捷开发等。
- 工具:软件工程工具是指为软件开发方法提供自动的或半自动的软件支撑环境。常见的软件工程工具包括集成开发环境(IDE)、代码版本控制系统、自动化测试工具等。
无论是过程、方法,还是工具,其最终目标都是提高软件的质量。
(6)软件生存期模型
为了更好的理解软件工程过程,软件工程领域的专家们把软件比作生物体,就像其他生物体一样,软件也有一个孕育、诞生、成长、成熟、衰亡的生存过程,我们称其为软件的生命周期(或生存期)。
通常我们把软件生存期的活动划分为以下6个阶段:
- 问题定义与可行性研究:弄清楚“要解决的问题是什么?该问题有行得通的解决办法吗?”。
- 需求分析:弄清楚“目标系统必须做什么?”,确定系统必须具备的功能、性能要求及其他需求。
软件设计:“应该如何解决这个问题?”。软件设计包括概要设计和详细设计。
软件实现:如何把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的“源程序清单”。程序应正确、容易理解、容易维护。
软件测试:目的就是通过各种测试使软件达到预定要求。
软件运行与维护:通过各种维护使系统持久地满足用户需要。通常包括改正性、适应性、完善性和预防性维护。
对这六个阶段的工作可以采用不同的组织过程,这便是软件生存期模型,也称作软件生命周期模型或软件过程模型。典型的软件生存期模型包括:
- 瀑布模型:是1970年 由W.Royce提出的生命周期模型。20世纪80年代之前,瀑布模型一直是唯一被广泛采用的生命周期模型。现在它仍然是软件工程中应用得最广泛的过程模型。传统软件工程方法学的软件过程,基本上可用瀑布模型来描述。
瀑布模型是传统的开发策略,软件过程分为若干个阶段,阶段间具有顺序性、依赖性,它的目的是为了推迟实现。随着瀑布模型的应用推广,人们发现为了解决软件维护过程中发现的问题,还需要对前面的工作进行改进,同时每一个阶段都会为前一阶段反馈问题。于是就有了下图所示的改进后的瀑布模型。
瀑布模型的优点是结构清晰、易于理解和管理,适用于较小规模的项目。它适合需求明确、不易变动的项目,且开发人员能够准确预估项目进度和资源需求。
然而,瀑布模型也存在一些缺点。由于各个阶段的边界严格,一旦某个阶段出现问题或变动,可能会导致整个项目延期或失败。另外,瀑布模型对于客户需求变化较为敏感,难以应对快速变化的市场需求和技术变革。
因此,在实际项目中,瀑布模型通常会与其他模型相结合,如迭代模型或敏捷开发模型,以弥补其局限性,并提高软件开发的灵活性和适应性。
- 原型模型:原型模型是基于这样一个假设,即“在项目开发的初始阶段,对软件的需求认识常常不够清晰,往往需要做多次修正才能使得项目取得成功。第一次只是试验开发,其目标只是在于探索可行性,弄清软件需求。下一次则是在此基础上获得较为满意的软件产品。”。
原型模型属于演化模型。每一次演化都会完成一个原型系统,它是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品的一个子集。原型模型的工作流程如下图所示:
- 增量模型:把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。其工作流程如下图所示:
在增量模型中,软件开发按照一系列的增量进行,每个增量代表软件系统的一个部分。每个增量开发完成后,都可以独立运行,并且可以在此基础上进行下一轮的增量开发。
增量模型的优点是可以快速地开发出可用的软件功能,并且可以及时获取用户的反馈。同时,增量模型也可以降低开发过程中的风险,因为每个增量都经过了测试和验证,可以及时发现和解决问题。
然而,增量模型也存在一些局限性。首先,由于每个增量都需要进行独立的开发和测试,因此可能增加开发成本和时间。其次,增量模型可能不适用于一些需要一次性交付完整功能的项目。
总的来说,增量模型是一种逐步递增地开发软件的方法,可以快速地获取软件功能和用户反馈,但也需要权衡开发成本和时间的局限性。
- 螺旋模型:1988年,巴利.玻姆(Barray W. Boehm)正式发表了软件系统开发的“螺旋模型”,它将瀑布模型和快速原型模型结合起来,强调了风险分析,使用原型及其他方法来尽量降低风险。其工作流程如下图所示:
如图所示,螺旋模型是一种迭代的增量模型,它将软件开发过程划分为多个循环,每个循环包含四个主要阶段:计划、风险分析、工程构建和评审。每个循环都是前一个循环的增量,并且每个循环的目标是针对风险进行评估和缓解,以及开发软件的一部分功能。
螺旋模型的主要特点是强调风险管理和迭代开发。在每个循环中,团队会对风险进行评估,并根据评估结果制定相应的风险缓解计划。这种风险驱动的方法可以在项目早期就识别和解决潜在的问题,从而降低了项目失败的风险。
螺旋模型的优点包括能够灵活应对需求变化、提高软件质量、降低开发成本和缩短开发时间。然而,螺旋模型也有一些缺点,比如较高的复杂性和管理难度。
总的来说,螺旋模型适合于大型和复杂的软件项目,特别是在风险较高的情况下。它可以帮助项目团队更好地管理和控制项目风险,并以迭代的方式逐步开发和交付软件功能。
- 喷泉模型:是1990年,B.H.Sollers 和J.M.Edwards 提出的一种面向对象方法模型,由于它以喷泉的形态来比喻软件开发的过程,因此又称喷泉模型。其工作流程如下图所示:
喷泉模型认为软件开发是一个持续不断的循环过程,类似于喷泉的水源不断循环往上冒泡、落下的过程。喷泉模型强调了软件开发过程中的迭代和持续改进。
在喷泉模型中,软件开发过程被划分为多个阶段,包括需求收集、面向对象分析、面向对象设计、编码、集成测试、部署和维护等阶段。喷泉模型是一种以用户需求为动力,以对象为驱动的模型。每个阶段都是一个循环,每次循环都会有新的需求被收集和分析,然后进行设计、编码、测试和部署。
喷泉模型的主要特点包括以下几点:
a.迭代循环:软件开发是一个不断迭代的过程,在每个阶段都会有新的需求被引入和分析,不断推进软件开发的进程。
b.持续改进:喷泉模型强调了软件开发过程中的持续改进,每次循环都可以对前一次循环的结果进行反馈,不断改进软件的质量和性能。
c.高度交互性:喷泉模型鼓励开发团队和用户之间的紧密合作和交流,以确保软件的需求和用户的期望能够得到充分的理解和满足。
喷泉模型的优点在于能够快速适应需求变化和不断改进软件的质量和性能。然而,它也存在一些挑战,包括对开发团队的要求较高、开发过程中的交互和反馈需要及时和有效等。因此,在使用喷泉模型时需要注意灵活性和沟通效率的问题。
- 统一模型:即统一软件开发过程(Rational Unified Process,简称RUP),由IBM的Rational Software Corporation提出并推广。RUP基于面向对象的软件开发方法,强调迭代和适应性,提供了一套可重用的软件开发过程模板和指导原则,以帮助开发团队在软件开发的各个阶段进行有效的管理和控制。其工作流程如下图所示:
如图所示,RUP将软件生命周期分解为四个阶段:初始阶段、细化阶段、构造阶段和交付阶段。 RUP的核心理念是将软件开发过程分解为一系列迭代的阶段,每个阶段都包括业务建模、需求获取、分析与设计、实现、测试和部署等活动且会综合考虑配置与变更管理、项目管理及环境因素。每个迭代周期都会生成一个可运行的软件版本,通过不断反馈和验证来逐步完善系统。
RUP具有以下特点:
a.迭代和增量: RUP将软件开发过程分解为若干个迭代周期,每个周期都会增加新的功能或改进现有功能。这种迭代和增量的开发方式有助于逐步完善系统,并在早期发现和解决问题。
b.面向体系结构: RUP强调软件系统的整体架构,通过定义和建立适合项目需求的体系结构,提高软件系统的可维护性、可扩展性和可重用性。
c.风险驱动: RUP认为项目中存在潜在的风险,并提供了一套风险管理的方法和实践。通过对风险的识别、评估和控制,能够及时应对和解决问题,确保项目的成功。
d.适应性和可定制性: RUP提供了一套灵活的工具和方法,使开发团队能够根据具体项目的需求进行定制和适应,从而提高开发效率和质量。
RUP的优点是能够提高软件开发的可控性和可重用性,能够快速响应需求的变化,并且能够提供详细的开发指导和文档支持。同时,RUP也有一些缺点,例如需要较大的人力和时间投入,以及对团队的组织和管理能力要求较高。
总的来说,RUP是一种灵活、可扩展的软件开发方法论,通过迭代和适应性的方式来管理软件开发过程,提高开发团队的协同效率和软件质量。
- 敏捷过程:敏捷软件开发方法其实不是一个具体的过程,而是一个涵盖性术语,用于概括那些应需而生的具有类似价值观的软件开发方法。
敏捷方法的主要特点包括:以人为核心、循环迭代、响应变化等,高质量地快速交付客户满意的工作软件。
敏捷方法的价值观集中体现在下图所示的敏捷宣言中。
敏捷宣言是由一群软件开发领域的专家于2001年在美国犹他州的一次会议上共同制定的。当时,这些专家对于传统的软件开发方法感到不满,认为其注重过程和文档,而忽视了快速响应变化和实际交付价值的重要性。因此,他们决定制定一份新的宣言来推动一种更灵活、快速和高效的软件开发方法。
敏捷宣言的核心内容如下:
a.个体和互动胜过过程和工具(Individuals and interactions over processes and tools)
b.可以工作的软件胜过详尽的文档(Working software over comprehensive documentation)
c.客户合作胜过合同谈判(Customer collaboration over contract negotiation)
d.响应变化胜过遵循计划(Responding to change over following a plan)
值得注意的是,在宣言的最后提到:“That is, while there is value in the items on the right, we value the items on the left more.”(虽然右面的内容也具有价值,但我们认为左面的内容具有更大的价值)。这也充分体现了一种继承发展的创新理念:推出新的方法,并不意味着必须要完全推倒旧的方法,而是要通过创新来弥补过去的不足,继往开来,创新发展。
敏捷宣言强调了个体和团队之间的交流与合作,以及快速交付可用的软件,与客户进行积极的合作,并灵活地响应变化。这些原则成为了敏捷开发方法的核心理念,并得到了广泛的应用和推广。
代表性的敏捷开发方法包括:极限编程(XP),特征驱动软件开发(FDD),动态系统开发( DSDM),自适应软件开发( ASD),SCRUM,Crystal等。
扩展阅读:
(7)软件工程方法学
软件工程方法学是指在软件开发过程中采用的一种系统化的方法和指导原则。它包括了一系列的开发活动、工具、技术和过程,旨在提高软件开发的效率和质量。软件工程方法学主要分为传统方法学和面向对象方法学两大类。
- 传统方法学:生命周期方法学,或结构化方法。它强调把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成各个阶段的任务。采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务。
- 面向对象方法学:传统方法把数据和对数据的操作人为地分离成两个独立的部分,要么面向数据,要么面向对数据的操作。而客观世界是由对象构成的,对象是一个属性(数据)和对数据操作的封装体。数据和对数据的处理原本是密切相关的,因此面向对象方法是把数据和对数据的操作紧密结合起来的方法。
有关这两类方法涉及的核心思想、方法、过程及工具,我们会在后续的章节里作详细介绍。
(8)软件工程工具
“子贡问为仁。子曰:‘工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。’”
--《论语·卫灵公》
无论采用什么样的方法学,都需要用到合适的工具,才能事半功倍。我们前面提到,软件工程的本质特性之一就是要提高软件开发的效率,而要提高效率,其中一个重要的途径就是软件工程工具的使用。
- 从狭义上理解,软件工程工具是指用于辅助软件生命周期过程的基于计算机的工具,其目的在于将重复并明确定义的动作自动化,减少了软件工程师的认知负担,使软件工程师可以集中在开发过程的创造性方面。 比如各种IDE(Integrated Development Environment,集成开发环境)、测试工具等。
从广义上理解,软件工程工具还应包括在软件开发或建模过程中用到的各种图表,如数据流图、E-R图、思维导图、甘特图、流程图等等。
(9)关于软件的质量
无论是采用什么方法、用到什么工具,其最终目标都是为了提高软件的质量,这也是软件工程的目标。对于质量,不同的人或组织对其有不同的定义,以下是一些经典的定义:
- 对于Philip Crosby,质量就是“遵从用户需求”。
- Watts Humphrey认为质量就是“达到适合使用的卓越层次”。IBM发明了术语“市场驱动的质量”,它基于达到全面的客户满意,关于组织质量的Baldrige准则使用了一个类似的短语“客户驱动的质量”,将客户满意作为主要的考虑。
- 在ISO9001:2000中,质量被定义为“一组内在特征满足需求的程度”。
注:a. Philip Crosby(菲利普·克罗斯比,1926-2001),是一位美国商人和质量管理专家。他最为人所知的是他在质量管理领域的工作和他的“零缺陷”哲学,该哲学强调第一时间把事情做好以防止错误和缺陷的重要性。详细可参见克劳士比管理哲学_360百科。b.Watts S. Humphrey(1927-2010)被誉为“软件质量之父”。他在软件工程领域的影响深远,特别是在软件质量控制和软件过程改进方面做出了巨大贡献。Humphrey的职业生涯主要集中在软件工程研究所(SEI),致力于推广软件过程的改进和优化。他的工作主要集中在软件开发的质量控制上,强调通过遵循高度规范的过程来开发出高质量的软件产品。Humphrey提出了一种软件成熟度模型(CMM),这是一种集中了软件开发优秀实践的模型,被广泛应用于美国军工、印度软件外包公司以及中国的软件公司。他的工作不仅影响了软件开发的方法和实践,还深刻影响了软件质量管理的理念和实践。详细可参见软件质量之父——Watts Humphrey_工作。c.ISO9001:2000质量管理体系是ISO(国际标准化组织)推行的一种国际通用的质量管理标准,旨在帮助组织建立、实施、维护和改进质量管理体系,以确保产品或服务的质量和性能符合相关要求。详细参见iso质量体系认证_百度百科。
5、软件工程的相关规范
(1)软件工程知识体系
这里的软件工程知识体系,我们以IEEE发布的《软件工程知识体系指南》为参照,最新的版本是3.0,即2014年发布的《SWEBOK v3.0》。在该版本的指南中,将软件工程知识体系划分为以下15个知识领域。
|
![]() |
上面以红色标注的内容,在我们后面都会介绍到。有关SWEBOK的进一步介绍,可参考:Software Engineering Body of Knowledge (SWEBOK)。
(2)软件项目的开发流程
我们开发软件大多是以项目的形式进行的,作为软件项目,其组织是按一定的流程进行的。
如图所示,软件项目的开发流程主要包括:
招投标:由客户(业主)根据企业自身的需求情况,制定招标文件。委托招标公司进行招标或投标邀请,软件企业向招标公司报名,购买招标文件,完成投标文件的制作。经过招投标评审流程,确定中标企业。客户与中标企业签订软件开发合同。
调研与需求分析:通过深入了解和分析,组织项目开发团队,制定软件开发计划,进行任务分解、人员分配、制定开发进度等。开发者获取用户需求,编写软件需求规格说明书文档。
软件设计:首先需要对软件系统进行概要设计,包括系统的基本处理流程、系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等。在此基础上,进行软件系统详细设计,描述实现具体模块所涉及到的主要算法流程、数据结构、类的层次结构及调用关系。
编码与测试:根据详细设计的具体要求,编写程序,实现对目标系统的功能、性能、接口、界面等方面的要求。测试是项目研发中一个相当重要的步骤,测试编写好的系统。发现软件中存在的问题。
软件交付:在软件测试证明软件达到要求后,软件开发者应向用户提交开发的程序、数据库的数据字典、用户安装手册、用户使用指南、需求报告、设计报告、测试报告等双方合同约定的产物。
验收:用户进行确认验收,查看软件是否完成合同所规定的各项任务。当软件项目较大时,用户往往聘请第三方软件测试机构进行验收测试。
运行维护:根据用户需求的变化或环境的变化,对应用程序进行全部或部分的修改。