revise Ch1-4 software engineering based on feedback
This commit is contained in:
parent
47d1a19191
commit
d8bb8c00fe
|
@ -1,6 +1,5 @@
|
|||
% !TEX root = main.tex
|
||||
|
||||
|
||||
\section{软件工程的诞生}
|
||||
50年前(1968年)在德国的一个叫做Garmisch的小镇上,由NATO科学委员会主导召开了一个小型研讨会,有来自11个国家的50位代表参加。会议的议题是如何应对当时面临的所谓“软件危机”。在这个研讨会上诞生了“软件工程”这个学科领域[1]。软件危机指,在所需时间内编写出有用且高效的计算机程序存在很大困难。其原因出自,一计算机能力的迅速增长,二希望用软件来解决的现实问题的日益复杂,三当时可以采用的软件开发方法明显不能应对。导致软件的开发出现了许多问题。
|
||||
|
||||
|
@ -107,11 +106,13 @@
|
|||
|
||||
在总结早期飞行控制软件开发经验的基础上,M. H. Hamilton设计了一个通用系统语言(Universal System Language, USL)[14],其灵感来自她对Apollo软件开发过程中出现的错误模式或错误类别的认识。当时,子系统间的接口错误占了软件错误的绝大部分,而且这些错误通常是最难找到和调试正确的。USL给出了不同接口错误的类别定义,通过这些系统定义来识别错误并在系统设计的时候预防它们。 USL定义了六个公理,形成了控制逻辑的数学构造性理论的基础。该语言还在Hamilton Technologies,Inc推出的001 Tool Suite软件上得到实现。
|
||||
|
||||
软件工程方法是用于指导软件开发和维护的结构化方法,主要为了使软件开发和维护具有结构性,使软件开发和维护成为系统化可重复的过程,从而提高软件开发的成功率。随着软件和软件应用的发展,软件工程方法一直在不断地发展,其主要关注点从系统的功能设计和实现(结构化方法)。到面向现实世界问题实体对象的设计和实现(面向对象方法),再到面向现实世界问题求解非功能属性的设计和实现等,使软件开发方法的隐含面不断向现实世界发展。
|
||||
软件工程方法是用于指导软件开发和维护的结构化方法,主要为了使软件开发和维护具有结构性,使软件开发和维护成为系统化可重复的过程,从而提高软件开发的成功率。主流的软件工程方法(如结构化方法和面向对象方法)都是在相应的程序设计方法基础上发展起来的。其中,程序设计方法主要关心程序的组织、构造和集成,而软件工程方法则将类似的思想(如对象和类的划分及其关系)拓展到软件分析和设计。随着软件和软件应用的发展,软件工程方法一直在不断地发展,其主要关注点从系统的功能设计和实现(结构化方法)。到面向现实世界问题实体对象的设计和实现(面向对象方法),再到面向现实世界问题求解非功能属性的设计和实现等,使软件开发方法的隐含面不断向现实世界发展。
|
||||
|
||||
除了系统化的软件开发方法,软件开发效率和质量是软件工程追求的一个目标,面向构件的软件工程尝试采用大规模重用的手段,提高软件的开发效率,以及提升所开发的软件的质量。面向服务的软件工程则是另一种基于重用的方法,将其它软件提供的服务作为可重用的构件,软件系统通过重用并无缝集成来自不同提供方的服务来获得。
|
||||
除了系统化的软件开发方法,软件开发效率和质量是软件工程追求的一个目标,面向构件的软件工程尝试采用大规模复用的手段,提高软件的开发效率,以及提升所开发的软件的质量。面向服务的软件工程则是另一种基于复用的方法,将其它软件提供的服务作为可复用的构件,软件系统通过复用并无缝集成来自不同提供方的服务来获得。
|
||||
|
||||
除此之外,还有其它一些软件开发和软件工程模式,比如开源软件开发、基于搜索的方法以及敏捷开发等,它们都从不同的角度应对软件开发的问题,解决软件危机,尝试找到软件开发的“银弹”。
|
||||
各种不同的软件开发方法虽然在问题分解和解决方案组织等方面的思路不同,但一般都遵循模块化原则,即将软件划分为相对独立的模块,允许不同的模块分别开发和测试并通过模块集成得到完整的软件解决方案。模块独立性一般可以使用内聚度和耦合度来衡量。满足模块独立性的软件设计可以使得软件的划分结构容易理解,简化模块间接口同时降低不同模块间的相互影响。模块化原则在不同的软件开发方法中可以通过不同的方式实现,例如程序和子程序、类以及构件划分等。1970年代末期兴起的模块互联语言(Module Interconnection Language,简称MIL)[p1]可用于形式化地刻画构成一个完整的软件系统所需的各种模块之间联接关系的规格说明,基于这种形式化描述可以验证系统的完整性和模块间兼容性。模块互联语言是一种结构化的设计语言。与之相似的还有各种体系结构描述语言(Architecture Description Language,简称ADL)。
|
||||
|
||||
除了上述软件开发方法之外,还有其它一些软件开发和软件工程模式,比如开源软件开发、基于搜索的方法以及敏捷开发等,它们都从不同的角度应对软件开发的问题,解决软件危机,尝试找到软件开发的“银弹”。
|
||||
\subsubsection{结构化系统分析和设计方法 \protect\footnote{https://en.wikipedia.org/wiki/Structured\_systems\_analysis\_and\_design\_method}}
|
||||
结构化系统分析和设计方法(SSADM)是一种系统化的软件分析方法,它发展于20世纪70-80年代,是一种用于分析和设计信息系统的瀑布方法。SSADM是不同流派的结构化方法的综合集成,典型的包括Peter Checkland的软系统方法[15],Larry Constantine的结构化设计[16],Edward Yourdon的Yourdon结构化方法[17],Michael A. Jackson的Jackson结构化编程[18]和结构化设计[19],以及Tom DeMarco的 结构化分析[20]等。
|
||||
|
||||
|
@ -131,21 +132,20 @@
|
|||
\subsubsection{面向对象的分析和设计 \protect\footnote{https://en.wikipedia.org/wiki/Object-oriented\_analysis\_and\_design}}
|
||||
面向对象方法起源于20世纪90年代,早期有不同的面向对象方法,它们通常与特定的计算机辅助软件工程(CASE)工具联系在一起。其中比较有代表性的包括,Grady Booch的Booch方法[21],James Rumbaugh的OMT方法[22],Ivar Jacobson的OOSE方法[23]。但这三种不同体系下形成的软件制品彼此间难以理解和复用,如何形成一个能够支撑从需求到实现的软件行业标准,成为当时的一个亟需解决的问题。1994年,他们一起合作开发了统一建模语言(UML)[24],并将他们的方法与其他各种见解和经验集成到Rational Unified Process(RUP)[25]中,自此统一过程成为面向对象分析和设计最流行的方法和参考模型,形成全面的迭代和增量过程的指南和框架,成为软件开发和项目管理的最佳实践。
|
||||
|
||||
面向对象方法强调模块化和可重用性,追求“开放的封闭原则”的实现。如果模块支持扩展,或者模块提供标准化方法来添加新行为或描述新状态,则模块是开放的。这在面向对象方法中通过创建现有类的新子类来实现。如果模块具有明确定义的稳定接口,所有其他模块只能通过这个接口访问该模块,从而限制由于其它模块的改变而引入的交互和潜在错误,则该模块是封闭的。这在面向对象方法中通过定义调用对象上的方法来实现,方法可以是公共的或私有的,即,对象特有的某些行为不会暴露给其他对象。这减少了软件实现中的许多常见错误。
|
||||
面向对象方法强调模块化和可复用性,追求“开闭原则”(即对扩张开放、对修改封闭)的实现。如果模块支持扩展,或者模块提供标准化方法来添加新行为或描述新状态,则模块是开放的。这在面向对象方法中通过创建现有类的新子类来实现。如果模块具有明确定义的稳定接口,所有其他模块只能通过这个接口访问该模块,从而限制由于其它模块的改变而引入的交互和潜在错误,则该模块是封闭的。这在面向对象方法中通过定义调用对象上的方法来实现,方法可以是公共的或私有的,即,对象特有的某些行为不会暴露给其他对象。这减少了软件实现中的许多常见错误。
|
||||
|
||||
相比于结构化分析将过程和数据分开考虑,面向对象分析的特点是,关注于从问题领域中识别出来的对象,并围绕这些对象来组织系统需求,通过对象集成系统的行为(流程)和状态(数据)。在设计阶段,面向对象方法侧重于将实现约束作用于分析过程中得到的概念模型上,比如硬件和软件平台,性能要求,持久存储和事务,系统的可用性以及预算和时间所施加的限制等,分析模型中与技术无关的概念被映射到实现类和接口,进而得到解决方案域的模型,强调利用架构模式和设计模式等指导软件架构的设计[26]。
|
||||
\subsubsection{基于构件的软件工程}
|
||||
因为面向对象的软件开发并没有能够支持大规模的软件重用,而软件产业发展带来大量软件资产,特别是可重用软件资产的积累,人们希望能充分利用这些可重用的软件资产,提高软件开发效率,提升所开发软件的可靠性,因而提出基于构件的软件工程\footnote{https://en.wikipedia.org/wiki/Component-based\_software\_engineering}。
|
||||
软件复用被视为解决软件危机,提高软件生产效率和软件质量的现实可行的途径[p2]。基本的软件复用对象主要是各种软件代码单元,包括子程序(subroutine)、函数(function)、类(class)和构件(component)等。早在1968年Doug Mcllroy在NATO软件工程会议上发表的论文“大量生产的软件构件”中就提出了大规模软件复用的思想[p3]。早期流行的软件复用对象主要是各种函数库,例如美国自然科学基金会组织构建的数学函数库。随后,面向对象开发中所使用的类由于其良好的封装性以及对应客观世界的实体特性而逐渐成为一种主流的软件复用对象。
|
||||
|
||||
实际上,早在60年代,就已经出现基于构件的软件工程的萌芽,当时程序员建立了可在各种工程和科学应用中重复使用的科学子程序库,当然这些子程序库虽然以有效的方式重用了定义良好的算法,但它们的应用领域有限。基于构件的软件工程建立在软件对象,软件架构,软件框架和软件设计模式的前驱方法之上,可重用构件封装了数据结构和应用于数据结构的算法。
|
||||
早期的软件复用方法所复用的代码单元较小同时缺乏系统性的过程和方法支持,因此难以形成完整的软件开发方法。随着CORBA、EJB、COM/DCOM等软件构件标准的成熟和广泛应用,基于构件的软件开发方法作为一种系统性的基于复用的软件开发方法被提出来了。构件是指软件系统中具有相对独立功能、可以明确辨识、接口由契约指定、和语境有明显依赖关系、可独立部署、且多由第三方提供的可组装软件实体[p4]。这种方法以软件构件作为基本的复用对象,将软件构造从传统以软件编码工作为主的方式转换为以软件构件集成和组装为主的方式。
|
||||
|
||||
根据基于构件的软件工程的理念,单个可重用的软件构件可以是软件包,web服务,web资源或一组相关功能(或数据)的封装体。也就是,把相关的功能体/数据资源等放在一个单独的构件中,每个构件内的所有数据和函数在语义上都是相关的。因此,构件可以说是\textbf{实现层的模块化和内聚}。
|
||||
与传统的函数和类等复用单元相比,软件构件具有多个方面的特性使得其更适合作为一种系统化的软件复用对象。软件构件一般粒度较大,实现了相对完整的业务功能,按照某种构件标准进行了良好的封装并且可以独立部署。另一方面,软件构件具有明确的构件描述、环境依赖和接口规约,用户通过构件描述查找构件并理解其使用方式,根据环境依赖对其进行部署和配置,同时按照接口规约请求构件的服务。此外,为了实现良好的可复用性,软件构件还应当具有较好的通用性和质量,易于组装并提供完善的文档和复用样例。
|
||||
|
||||
构件通过接口相互通信,以实现系统层的协调。当构件向系统的其余部分提供服务时,它采用提供的接口,国定其他构件可以使用的服务,以及它们如何执行此操作。这个接口可看作为构件的签名 – 调用方不需要了解构件(实现)的内部工作方式即可使用它。这个原理称为\textbf{构件的封装}。
|
||||
基于构件的软件开发过程主要包括构件的识别和开发、构件描述和管理、基于构件的应用开发三方面。构件的识别和开发针对特定业务或技术领域的共性需求和技术问题进行分析,从中识别并抽象出可复用构件的开发机会,并按照特定构件标准进行实现和封装。构件描述和管理对软件构件进行描述、分类、存储,并提供构件发布版本管理和检索机制,在此基础上通过建立软件构件库对外提供统一的构件上传、更新、检索等服务。基于构件的应用开发根据应用软件的需求检索并获取可复用构件,对其进行定制和适配,然后基于软件体系结构描述实现构件间的组装,从而实现应用软件的需求。
|
||||
|
||||
构件的另一个重要属性是\textbf{可替代性},也就是说,如果一个构件满足另一个构件的接口规范,则在设计时或运行时前一个构件可以替代后一个构件,因而能支持系统版本更新和替代,而不破坏所支撑的运行系统。
|
||||
软件构件技术的发展还催生了商用成品构件(Commercial Off-The-Shelf,简称COTS)的出现,例如在信息系统中有着广泛应用的报表构件、文档处理构件等。商用成品构件一般都符合特定的构件标准并具有良好的可组装性,由独立的构件开发厂商提供,应用开发厂商通过购买获得构件使用权,并通过黑盒的方法进行组装和复用。
|
||||
|
||||
可重用性是高质量软件构件的重要特征。构件模型是构件必须满足的属性的定义,组件组成的方法和机制,目前已经有几种具有不同特征的构件模型,比如:Enterprise JavaBeans(EJB)模型,构件对象模型(COM)模型,.NET模型和公共对象请求代理体系结构(CORBA)构件模型等。
|
||||
\subsubsection{基于搜索的软件工程}
|
||||
许多软件工程任务可以建模位计算搜索、组合优化问题,基于搜索的软件工程就是用来解决这些软件工程任务的。这类方法最早在1976年出现,当时,Webb Miller 和 David Spooner尝试把优化算法用于浮点测试数据的生成[27]。1992年,Xanthakis等将搜索算法用于解决软件测试问题[28]。2001年,Harman 和 Jones正式基于搜索的软件工程[29]。
|
||||
|
||||
|
@ -175,9 +175,10 @@
|
|||
|
||||
软件过程管理涉及对软件开发过程的管理,包括软件过程的建立、执行、监控、评估以及改进等活动。软件过程管理最重要的内容,就是从众多企业的软件开发活动的经验教训中,总结形成的可供参考的模型。最著名的软件过程管理参考模型是能力成熟度模型CMM以及其后续的集成模型CMMI[34]。
|
||||
\subsection{软件质量保证}
|
||||
软件是一种人工制品,需要有相应的软件质量保证(Software Quality Assurance, SQA)机制,包括监控软件工程过程以确保质量。软件质量保证涵盖整个软件开发过程,包括需求定义,软件设计,编码,源代码控制,代码审查,软件配置管理,测试,发布管理和产品集成等。
|
||||
软件是一种人工制品,为确保其质量需要通过软件质量保证(Software Quality Assurance, SQA)机制持续对软件开发过程进行监控,同时采用多种方法确保各种软件开发制品的质量。根据ISO/IEC 15504标准\footnote{https://www.iso.org/standard/38932.html}的定义,软件质量保证是一种独立的支持性过程,其目的是确保所有的软件开发制品、活动和过程都遵循预定义的计划和标准。软件质量保证是一个完整的体系,以软件质量标准为参照,以所采用的软件开发过程(如瀑布模型或敏捷开发过程)为基础,贯穿整个软件开发过程(包括需求定义、软件设计、编码、测试、集成和发布等),同时结合过程管理、版本与变更管理、测试、评审、程序分析与形式化验证等多种手段。
|
||||
|
||||
\subsubsection{软件质量标准}
|
||||
目前,已经存在一系列标准用于监控和评估软件生产过程过程,以确保软件的质量,如,ISO / IEC 15504\footnote{https://www.iso.org/standard/38932.html},其第一个版本专注于软件开发过程,后来扩展到涵盖软件业务中的所有相关流程,例如项目管理,配置管理,质量保证等,是成熟度模型的参考模型,评估者可以根据模型在评估期间收集证据,全面确定所开发产品(软件,系统和IT服务)的能力。其更新版本是ISO / IEC 33000\footnote{https://www.iso.org/standard/54175.html}。其它质量标准还包括ISO/IEC 25000\footnote{https://www.iso.org/standard/64764.html}、ISO/IEC/IEEE 29119\footnote{https://www.iso.org/standard/45142.html}等。
|
||||
目前,已经存在一系列标准用于监控和评估软件生产过程过程,以确保软件的质量,如,ISO/IEC 15504,其第一个版本专注于软件开发过程,后来扩展到涵盖软件业务中的所有相关流程,例如项目管理,配置管理,质量保证等,是成熟度模型的参考模型,评估者可以根据模型在评估期间收集证据,全面确定所开发产品(软件,系统和IT服务)的能力。其更新版本是ISO/IEC 33000\footnote{https://www.iso.org/standard/54175.html}。其它质量标准还包括ISO/IEC 25000\footnote{https://www.iso.org/standard/64764.html}、ISO/IEC/IEEE 29119\footnote{https://www.iso.org/standard/45142.html}等。
|
||||
\subsubsection{形式化规约}
|
||||
除了采用工程方法来组织、管理软件的开发过程,并根据标准检验过程的正确性外。还有一类工作就是深入探讨程序和程序开发过程的规律,建立严密的理论,以其用来指导软件开发实践,这类工作推动了形式化方法的深入研究,其目标是以严格的数学推演为基础,通过对系统的形式规约、验证和逐步精化来构造并实现软件,从而提高软件设计的可靠性和鲁棒性。通过对系统的形式规约、验证和逐步精化来构造并实现软件。其中,形式规约是使用形式语言构建所开发的软件系统的规约,对应软件生命周期不同阶段的制品,刻画系统不同抽象层次的模型和性质。形式化开发就是构造并证明形式规约之间的等价转换和精化关系,以系统的形式模型为指导,通过逐步精化,最后开发出满足需要的系统,也称为构造即正确(Correct by Construction)的开发。
|
||||
|
||||
|
@ -187,9 +188,25 @@
|
|||
|
||||
根据软件工程工具所服务的人员角色不同,可将软件工程工具分为软件开发工具、软件运维工具、软件开发管理工具等。后续将对各类软件工程工具的历史和现状进行简要回顾。
|
||||
\subsubsection{软件开发工具}
|
||||
早期的软件开发主要针对特定的硬件平台特定流程或工具,采用机器语言或汇编语言,并没有独立的软件开发工具。20世纪五六十年代,随着Fortran、Basic等高级语言的出现,计算机程序逐步脱离了面向特定硬件系统的束缚,更加接近于自然语言而易于开发人员书写。开发人员使用文本编辑工具编写代码后,使用代码解释或编译工具将源代码转换为操作系统可以识别的代码,进而完成预期的程序动作。广义上来说,文本编辑器和编译器都可以看作最原始的软件开发工具。然而,通用文本编辑工具在编写代码时无法提供语法高亮、编译、调试等功能,因此集成开发环境(IDE)逐渐发展起来。20世纪80年代,通用编程语言Ada带有自己的编程支持环境APSE提供了编辑界面、编译器、测试器、连接加载器等功能模块,将集成开发环境提升到一个新的阶段。此后,微软(Microsoft)、宝蓝(Borland)等软件公司相继开发出各自的开发环境用于支持相应编程语言的开发与调试。IDE的出现为软件开发人员在开发过程中集中完成软件开发任务提供了统一的环境,也为后续进一步扩展新软件工程工具奠定了基础。从早期的基于字符界面的开发工具到以视窗为特征的图形界面集成开发环境,从软件企业开发的商用集成开发环境到开源社区主导的开放式插件式集成开发环境,软件开发工具随着程序语言、开发技术、开发过程的变化日益复杂。例如,1987年宝蓝公司推出的Turbo C开发环境,在字符界面上提供了灵活的代码编写和调试环境,使得开发人员能够一站式完成程序编写、测试和调试。1991年为了适应微软公司的视窗(Windows)操作系统界面风格,宝蓝公司又推出Borland C++,并在90年代后期推出Borland C++ Builder提升了集成开发环境的易用性和代码编译链接的效率。在这个工具的升级过程中,不仅需要适应C/C++语言标准的变化、操作系统的变化,还考虑了开发人员的易用性需求,通过可视化的窗体设计器、对象观察器等可视化元素加入到开发环境中,推出了VCL构件库,引领了快速应用程序开发(RAD)开发方法,大大降低了开发Windows应用程序的难度。
|
||||
早期的软件开发工具仅限于汇编器和编译器。20世纪五六十年代,随着Fortran、Basic等高级语言的出现,计算机程序逐步脱离了面向特定硬件系统的束缚,更加接近于自然语言而易于开发人员书写。开发人员使用文本编辑工具编写代码后,使用代码解释或编译工具将源代码转换为操作系统可以识别的代码,进而实现预期的程序行为。广义上来说,文本编辑器、汇编器、编译器都可以看作最原始的软件开发工具。
|
||||
|
||||
随着软件开发过程的成熟以及软件开发技术的发展,软件开发工具开始在基本的代码编辑和编译功能基础上提供代码元素高亮、即时语法检查和提示、调试等辅助功能,同时针对编码之外的软件开发活动的支持工具也不断涌现,主要包括以下几种类型。
|
||||
\begin{itemize}
|
||||
\item 分析和设计建模工具:在规范化的建模语言基础上,通过图形化的建模工具支持软件的需求分析和设计建模,例如广泛使用的ER模型和UML建模工具等;
|
||||
|
||||
随着软件日益复杂和开发过程的不断演进,仅提供代码编辑、调试能力不足以支撑丰富的软件工程活动。开放式架构的开源集成开发环境以插件的形式提供各类辅助支持,包括在开发环境中提供各类代码静态扫描功能、代码重构功能、代码自动补全和框架自动生成功能等,大大扩展了集成开发环境的能力范围,使之能服务于不同的开发过程活动。例如最初由IBM公司主导开发的Eclipse在2001年开源转入非盈利组织Eclipse基金会管理后,开源社区的大量开发者为其开发了众多实用的功能,进而衍生出了MyEclipse、IBM Rational Software Architect等多种工具软件,服务于不同层次和复杂程度的开发需求。
|
||||
\item 测试工具:针对单元测试、集成测试、性能测试等不同种类的测试所提供的测试用例生成、测试环境模拟、测试执行与测试结果分析等方面的工具支持;
|
||||
|
||||
\item 分析和验证工具:针对软件代码、模型等软件开发制品进行自动化分析和验证,发现潜在的质量问题或确认所期望的属性,例如各种代码缺陷检查工具、形式化验证工具等;
|
||||
|
||||
\item 逆向分析和度量工具:针对源代码或二进制代码进行逆向分析以恢复软件的高层视图从而辅助理解,或者度量代码的各种属性以获得关于代码质量的信息。
|
||||
|
||||
\end{itemize}
|
||||
|
||||
单一的软件开发工具很多时候由于缺少必要的上下文信息或与其他工具的联系而很难使用。因此,基于多种软件开发工具形成的集成开发环境(IDE)逐渐发展起来。20世纪80年代,通用编程语言Ada带有自己的编程支持环境APSE,提供了编辑界面、编译器、测试器、连接加载器等功能模块,将集成开发环境提升到一个新的阶段。此后,微软(Microsoft)、宝蓝(Borland)等软件公司相继开发出各自的开发环境用于支持相应编程语言的开发与调试。IDE的出现为软件开发人员在开发过程中集中完成软件开发任务提供了统一的环境,也为后续进一步扩展新的软件工程工具奠定了基础。例如,1987年宝蓝公司推出的Turbo C开发环境,在字符界面上提供了灵活的代码编写和调试环境,使得开发人员能够一站式完成程序编写、测试和调试。1991年为了适应微软公司的视窗(Windows)操作系统界面风格,宝蓝公司又推出Borland C++,并在90年代后期推出Borland C++ Builder提升了集成开发环境的易用性和代码编译链接的效率。在这个工具的升级过程中,不仅需要适应C/C++语言标准的变化、操作系统的变化,还考虑了开发人员的易用性需求,通过可视化的窗体设计器、对象观察器等可视化元素加入到开发环境中,推出了VCL构件库,引领了快速应用程序开发(RAD)开发方法,大大降低了开发Windows应用程序的难度。
|
||||
%从早期的基于字符界面的开发工具到以视窗为特征的图形界面集成开发环境,从软件企业开发的商用集成开发环境到开源社区主导的开放式插件式集成开发环境,软件开发工具随着程序语言、开发技术、开发过程的变化日益复杂。
|
||||
%随着软件日益复杂和开发过程的不断演进,仅提供代码编辑、调试能力不足以支撑丰富的软件工程活动。
|
||||
|
||||
开放式架构的开源集成开发环境以插件的形式提供各类辅助支持,包括在开发环境中提供各类代码静态扫描功能、代码重构功能、代码自动补全和框架自动生成功能等,大大扩展了集成开发环境的能力范围,使之能服务于不同的开发过程活动。例如最初由IBM公司主导开发的Eclipse在2001年开源转入非盈利组织Eclipse基金会管理后,开源社区的大量开发者为其开发了众多实用的功能,进而衍生出了MyEclipse、IBM Rational Software Architect等多种工具软件,服务于不同层次和复杂程度的开发需求。
|
||||
|
||||
特别值得一提的是,在中国有一项重大工程就是青鸟工程[37],由北京大学牵头,从“六五”开始一直到“十五”,经过很长时间的科技攻关,这项工程有很多单位参加, 在“七五”期间,有11个单位 100多位科技成员,“八五”期间有22个单位338位科技成员,遍布了全国各地。青鸟工程的目标是以实用的软件工程技术为依托,建立软件产业基础,推行软件工程化、工业化生产技术和模式,提供软件工业化生产手段和设备,形成规模经济所需的人才储备、技术储备、产品储备。它从基础研究,到实用化、产品化技术的研究,到工程化、工业化生产技术的研究。它的关键是创新,这个创新不仅是概念的创新,还是机制的创新和技术的创新,目的就是使得手工作坊式通过工业化生产技术和工程化开发方法,设计支撑环境与工具,构建标准规范体系,提出了青鸟软件生产线模式,实现作坊式的开发方式到工业化生产方式变革,这是中国软件产业建设的共性和基础性工作。
|
||||
\subsubsection{软件运维工具}
|
||||
|
@ -256,11 +273,11 @@
|
|||
\end{table}
|
||||
|
||||
\section{领域工程}
|
||||
领域工程\footnote{https://en.wikipedia.org/wiki/Domain\_engineering},是支持软件开发中全面系统化重用领域知识的整个过程。领域工程的出发点是,大多数软件系统都不是全新的系统,领域工程可以通过使用同领域相似系统的模型和代码,提高新软件的开发效率额和质量,降低成本。因此,领域工程面向特定领域装煮鱼捕获和收集可重用的软件制品,以便在与之相对的应用工程中重用。与应用工程相对应,领域工程也分为分析、设计和实现三个阶段。
|
||||
领域工程\footnote{https://en.wikipedia.org/wiki/Domain\_engineering},是支持软件开发中全面系统化复用领域知识的整个过程。领域工程的出发点是,大多数软件系统都不是全新的系统,领域工程可以通过使用同领域相似系统的模型和代码,提高新软件的开发效率额和质量,降低成本。因此,领域工程面向特定领域装煮鱼捕获和收集可复用的软件制品,以便在与之相对的应用工程中复用。与应用工程相对应,领域工程也分为分析、设计和实现三个阶段。
|
||||
|
||||
领域分析侧重于识别和定义领域,并生成领域模型。面向特征的领域分析方法[44]是具有代表性的领域分析方法。领域分析的来源是某领域过去产生的制品,包括现有系统及其如设计文档,需求文档和用户手册等制品。领域分析的目标是将根据已知的领域知识进行扩展,通过领域特征建模,识别领域的公共特征,以及存在的差异性,从而支持领域需求的可配置性。领域设计根据领域分析阶段生成的领域模型,产生领域中所有系统都能符合的通用系统架构模式,并确定模式的范围以及与模式相关的上下文,以适当限定架构适用的范围。最后领域实现是创建为能有效生成本领域客户化软件使用的过程和工具。
|
||||
|
||||
最早的代表性领域工程是产品线工程,以产品特征建模为基础,又称面向特征重用 [44],FORM通过领域工程过程,支持开发可重用的体系结构和构件,并支持使用领域工程生成的领域制品开发应用程序。 FORM首先分析出领域特定领域中应用程序在服务、操作环境、领域技术和实现技术等方面共性的或者差异性的功能特征。这个分析过程构建出来的模型被称为特征模型。 该模型则可用于定义参数化参考体系结构和在实际应用程序开发时可实例化的适当的可重用构件。
|
||||
最早的代表性领域工程是产品线工程,以产品特征建模为基础,又称面向特征复用 [44],FORM通过领域工程过程,支持开发可复用的体系结构和构件,并支持使用领域工程生成的领域制品开发应用程序。 FORM首先分析出领域特定领域中应用程序在服务、操作环境、领域技术和实现技术等方面共性的或者差异性的功能特征。这个分析过程构建出来的模型被称为特征模型。 该模型则可用于定义参数化参考体系结构和在实际应用程序开发时可实例化的适当的可复用构件。
|
||||
|
||||
特别一提,我国陆汝钤院士提出并建立基于领域建模的软件工程[45],采用知识工程方法建模领域知识,并支持全过程领域模型驱动的软件开发。
|
||||
\section{结束语}
|
||||
|
@ -496,3 +513,22 @@
|
|||
\setlength{\hangindent}{2em}
|
||||
[45] R. Lu and Z. Jin, Domain Modeling based Software Engineering, Kluwer Academic Publishers, 2000.
|
||||
|
||||
\noindent
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{2em}
|
||||
[p1] Ruben Prieto-Diaz, James M.Neighbors. Module interconnection languages. Journal of Systems and Software, Volume 6, Issue 4, November 1986, Pages 307-334.
|
||||
|
||||
\noindent
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{2em}
|
||||
[p2] 杨芙清 . 1999. 软件复用与软件构件技术[J]. 电子学报, 27(2):68–75.
|
||||
|
||||
\noindent
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{2em}
|
||||
[p3] Mcllroy D. Mass produced software components. 1968 NATO conf. on Software Engineering. PP. 138-155
|
||||
|
||||
\noindent
|
||||
\hangafter=1
|
||||
\setlength{\hangindent}{2em}
|
||||
[p4] 张效祥. 2005. 计算机科学技术百科全书[M].[S.l.]: 清华大学出版社有限公司.
|
||||
|
|
Loading…
Reference in New Issue