1.4 软件开发方法
软件开发方法是一种使用定义好的技术集及符号表示组织软件开发的过程,它的目标是在规定的时间和成本内,开发出符合用户需求的高质量的软件。因此,针对不同的软件开发项目和对应的软件过程,应该选择合适的软件开发方法。
1.4.1 基本的软件开发方法
1.结构化方法
1978年,E.Yourdon和L.L.Constantine提出了结构化方法,也可称为面向功能的软件开发方法或面向数据流的软件开发方法。1979年,Tom DeMarco对此方法做了进一步的完善。
结构化方法采用自顶向下、逐步求精的指导思想,应用广泛,技术成熟。它首先用结构化分析对软件进行需求分析,然后用结构化设计方法进行总体设计,最后是结构化编程。这一方法不仅开发步骤明确,而且给出了两类典型的软件结构(变换型和事务型),便于参照,使软件开发的成功率大大提高,因而深受软件开发人员的青睐。
2.面向数据结构方法
1975年,M.A.Jackson提出了一类软件开发方法。这一方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其他细节,就可得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其他方法结合,用于模块的详细设计。Jackson方法有时也称为面向数据结构的软件设计方法。
1974年,J.D.Warnier提出的软件开发方法与Jackson提出的方法类似。差别有3点:一是使用的图形工具不同,分别使用Warnier图和Jackson图;二是使用的伪码不同;第三点,也是最主要的差别,在构造程序框架时,Warnier方法仅考虑输入数据结构,而Jackson方法不仅考虑输入数据结构,而且还考虑输出数据结构。
3.面向对象方法
面向对象方法是软件技术的一次革命,在软件开发史上具有里程碑的意义。随着面向对象编程向面向对象设计和面向对象分析的发展,最终形成面向对象的软件开发方法。
这是一种自底向上和自顶向下相结合的方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象的数据结构。面向对象方法在需求分析、可维护性和可靠性这3个软件开发的关键环节和质量指标上有了实质性的突破,很大程度上解决了在这些方面存在的严重问题。
面向对象方法有Booch方法、Goad方法和OMT(Object Modeling Technology)方法等。为了统一各种面向对象方法的术语、概念和模型,1997年推出了统一建模语言(UML),通过统一的语义和符号表示,将各种方法的建模过程和表示统一起来。
4.形式化方法
形式化方法最早可追溯到20世纪50年代后期对程序设计语言编译技术的研究,研究高潮始于20世纪60年代后期。针对当时的“软件危机”,人们提出种种解决方法,归纳起来有两类:一类是采用工程方法来组织、管理软件的开发过程;另一类是深入探讨程序和程序开发过程的规律,建立严密的理论,以用来指导软件开发实践。前者导致“软件工程”的出现和发展,后者则推动了形式化方法的深入研究。
经过多年的研究和应用,如今人们在形式化方法这一领域取得了大量重要的成果,从早期最简单的一阶谓词演算方法到现在的应用于不同领域、不同阶段的基于逻辑、状态机、网络、进程代数和代数等众多形式化方法,形式化方法的发展趋势逐渐融入软件开发过程的各个阶段。
1.4.2 开源软件开发方法
开源软件开发活动以互联网软件社区为平台,其开发过程和制品数据对外开放(共享),允许不同的开发者参与其中(协同),能够有效汇聚来自互联网的创意和贡献。
开源软件开发指的是由开源软件项目组开发开源软件或类似原件的过程,其中,开源软件的源代码是公开可用的。这些软件产品及其源代码在开源许可下可用,它们常常被用于研究、更改和改进其设计。一些流行的开源软件产品的例子有Mozilla Firefox、Google Chromium、Android、LibreOffice和VLC媒体播放器等。
开源项目可以被分为以下四类。
1)有各种各样的软件程序和库,它们由独立的代码段组成,有些甚至可能依赖于其他开源项目。这些项目服务于特定目的并满足特定需求。此类项目的示例包括Linux内核、Firefox Web浏览器和LibreOffice办公工具套件等。
2)发行版是另一种类型的开源项目。发行版是从同一来源发布的具有共同目的的软件集合。发行版最突出的例子是操作系统。有许多Linux发行版(如Debian、Fedora Core、Mandriva、Slackware、Ubuntu等)提供Linux内核和许多用户级组件。还有其他发行版,如ActivePerl,用于各种操作系统的Perl编程语言,以及用于Microsoft Windows开源程序的Cygwin发行版等。
3)其他开源项目,如BSD衍生品,在一个版本控制系统中维护整个操作系统、内核及其所有核心组件的源代码,作为一个团队一起开发整个系统。这些操作系统开发项目与其他基于分布式的系统相比,更紧密地集成了它们的工具。
4)还有图书或独立文档项目。这些项目通常不作为开源软件包的一部分提供。例如,Linux文档项目承办了许多此类项目,这些项目记录了GNU/Linux操作系统的各个方面。
开源项目的工作可以通过以下多种方式进行。
1)意识到项目需求的个人宣布了公开开发项目的意图。
2)开发人员在有限但有效的代码仓库上工作,将其作为开源程序的第一个版本发布给公众。
3)到期项目的源代码向公众发布。
4)一个完善的开源项目可以由感兴趣的外部用户派生。
1.4.3 群体化软件开发方法
通常,软件开发都是基于自己组织的开发团队,或者企业、组织机构的内部人员组织的开发团队。以这种方式组织的开发团队,针对一般的要实现的软件功能还是能应付的。但是,对某些比较大型、复杂的软件系统,软件系统的交付质量和交付时间要求得比较高,此时使用传统的软件开发方法在并发效率或是软件质量等方面就无法胜任了。
随着互联网技术的发展,软件开发技术和开发模式都有了很多新的概念。其中,以开源和众包为代表的群体化软件开发方法极大地优化了软件开发。开源软件开发方法在第1.4.2小节中已经讨论过了,这里不再赘述。众包软件开发指的是公开发布软件开发任务,由参与竞争的个人或团队给出解决方案的软件开发方法。软件开发的任何阶段都可以是众包的,如需求(功能、用户界面、性能)、设计(算法、架构)、编码(模块和组件)、测试(包括安全测试、用户界面测试)、维护、用户体验或这些阶段的任意组合。
群体化软件开发方法最大的特点是面向公众。开源软件开发方式可以被看作是一种以合作为主的群体化软件开发方法,而众包软件开发方法则更类似于竞争性的群体化软件开发方法。它们的目的都是集合互联网中众多开发人员的智慧和力量,以更低的成本实现更完善的软件项目。
互联网能够将全世界各地的开发人员连接起来,他们彼此之间可以进行交流、分工合作。软件开发可借助开放群体的智慧和力量。开源软件就是常用的方法。借助开源软件的托管社区,互联网上的众多软件开发人员可通过自组织方式进行分工合作,开发出很多优秀的开源项目,展示出了他们的创造力、开发效率和软件质量。
群体化软件开发方法融合工业化软件生产和开源软件的开发方式,连接互联网开发人员群体与企业/组织机构的开发团队,通过群体化协同、开放式共享和持续性评估等实现高效的软件开发。
群体化软件开发方法遵循的核心原则:开放、平等、共享、全局行动。
与群体化软件开发方法相关的模型有:代码与证据紧密耦合的可信软件演化模型;创作与生产紧密耦合的软件开发过程模型;协同、共享、监控与分析紧密耦合的服务支撑模型。
群体化软件开发方法将软件开发过程全面开放并快速迭代,不断发布系统原型,吸引互联网大众体验,借助互联网平台开展各种形式的交流、协同和共享,实现群体需求及创意的汇聚。软件开发团队对大众需求创意进行识别审查,借助工业化生产的强组织模式来组织软件开发过程,实现高质量软件产品的输出。群体化软件方法将大众群体的软件创作过程有机地融入开发团队的软件生产流程中,能够充分发挥大众群体和开发团队在软件开发过程中各自的优势,有效地支持网络环境下的软件开发。
除了上述几种软件开发方法,软件开发方法还包括问题分析法、可视化开发方法等。本书接下来的章节中将会对结构化方法和面向对象方法进行更加详细和更深入的介绍。