朱大鹏
开发方法是开发模型中非常关键的要素,不同的开发模型既可以运用相同的开发方法,也可以运用不同的开发方法。
软件生命周期模型(开发模型)与软件开发方法是两个不同的事物。开发模型是指开发软件项目的总体过程的框架安排。软件开发方法指如何组织软件生产过程的方法,包括一系列的步骤,每一步骤都与相应的技术和符号相关;目的在于有效地完成一个运行的系统及其支持文档。因此,开发方法是开发模型中非常关键的要素,不同的开发模型既可以运用相同的开发方法,也可以运用不同的开发方法。
软件开发方法是伴随着计算机性能提高、应用范围扩大而不断发展的。软件行业普遍认可和应用的开发方法,起源于20世纪60年代软件危机。为了应对软件危机,1968、1969年连续召开两次著名的北大西洋公约组织会议,提出了软件工程的概念,软件开发方法也逐渐实现了科学化。按照时间序列,核心的软件开发方法是结构化方法、面向数据结构方法、维也纳开发方法、面向对象的开发方法;模块化开发方法、可视化开发方法和敏捷开发方法可视为非核心的开发方法。下面逐一介绍。
结构化方法就是以现实用户的实际结构和所开发的软件的结构为框架,以用户数据流和软件数据流为核心,以分解和抽象、独立的模块化等为主要方法进行软件开发。结构是指系统内各组成要素之间的相互联系、相互作用的框架。结构化开发方法的特点主要表现在:一是自顶向下,逐步求精。将软件分析的过程划分成若干个层次,每一个新的层次都是上一个层次的细化。二是模块化。将软件系统分解成若干个模块,每个模块内的信息被屏蔽,并实现特定的功能。最终的系统由这些模块组装而成,模块之间通过接口传递信息。三是语句结构化。在每个模块中只允许出现顺序、分支和循环三种流程结构的语句。结构化方法由结构化分析、结构化设计、结构化程序设计等三部分组成。结构化方法是软件工程中最早、最传统的开发方法。被称为续子程序、高级语言之后软件发展中的第三个里程碑,影响深远。结构化开发方法是从针对普通数据的处理应用发展而来的,技术成熟,是其他开发方法的基础。特别适合于数据处理领域的问题;但不适应于规模大以及特别复杂项目。难以解决软件重用问题、需求变化问题和维护问题。
面向数据结构的方法是一种以数据结构设计为核心,以事件和数据驱动,基于进程的软件开发方法,是从结构化方法演变而来的。面向数据结构的方法强调数据结构,而不像结构化方法强调数据流,这是由于一个问题的数据结构与处理该问题的数据结构的控制结构高度相似。该方法的特点为:首先描述问题的输入、输出数据结构,分析其对应性,并用数据结构图(特指该类方法所用的图形描述工具,如Jackson结构图、Warnier图)来表示,再在此基础上进行需求分析。最后完成问题的软件过程描述。该方法也是遵循分解和抽象的原则,将问题分解为由顺序、选择和重置三种基本结构形式表示的各部分层次结构。再用数据结构图来表达。该方法适合于小规模的项目。当输入数据结构和输出数据结构无对应关系时,难以应用该方法。
维也纳开发方法是用严格的形式语言来描述软件需求,用形式化的开发方法把描述模型变换成目标系统。形式化是指借助数学方程、函数等数学方式的表达形式。该方法的特點是将软件系统视为一个模型,输入/输出是模型的对象,模型通过对对象的操作实现了软件功能。这个模型具有代数式的特点:输入/输出和对象的真正含义都用数学的域方程来表示,系统在计算机内的状态用数学函数表示。该方法产生于用高级语言开发编译系统的过程中。先应用于开发程序语言的语义形式说明,逐步演变成一般软件的开发方法,但应用范围不如其他方法广泛。
面向对象的开发方法是以对象为中心,以类、属性、服务和继承等为构造机制来认识、理解、反映客观世界,以封装、聚合、消息传送、结构与连接等来设计,构建相应的软件系统。面向对象的开发方法最大的特点是将其他开发方法以数据流、数据结构等为中心,调整为以对象为中心;而对象是构成世界的一个独立单位,具有自己的静态特征和动态特征;计算机实现的对象与真实世界的对象具有一一对应的关系,更能易于为人们所理解和接受,降低了用户、开发人员的沟通成本。面向对象方法包括面向对象分析、设计和实现活动。由于对象是客观存在的,因此当需求变化时对象的性质要比对象的使用更为稳定。从而使建立在对象结构上的软件系统也更为稳定,因此该方法彻底解决了软件的可维护性问题,成为近年来最流行的软件开发方法。
上述方法属于核心的开发方法,具有比较全面的技术、使用、管理和经济等特征,理论体系、技术应用均处于成熟的状态。此外,还有一些非核心的开发方法,主要是模块化、可视化和敏捷开发方法,这些方法更具有工具性或者组合性的特点,整体性和理论体系不够显著。
模块化开发方法把一个待开发的软件进行分解,分解成若干模块,每个模块分别独立地开发、测试,最后再组装出整个软件。模块就是可组成系统的、具有某种确定独立功能的半自律性的子系统。该方法将复杂的软件系统通过模块分解的方式降低难度和复杂度,每个模块的研发和改进都独立于其他模块的研发和改进,既保证模块功能的独立,又能实现模块的重复使用;每个模块所特有的信息处理过程都被包含在模块的内部,通过一个或数个通用的标准界面与系统或其他模块相互连接,既实现了内部信息的屏蔽,又提高信息处理的效率和准确性。该方法缺点在于处理大型复杂的问题,往往无法分解;此外,在分解过程中,不同角度要求屏蔽的信息是不同的,形成冲突。因此,该方法一般是融合入其他开发方法内来运用的。
可视化开发方法就是在可视开发工具提供的图形用户界面上,通过操作界面元素,诸如菜单、按钮、对话框、编辑框、单选框、复选框、列表框和滚动条等,由可视开发工具自动生成应用软件。该开发方法是事件驱动的,系统按照事件一消息一消息相应函数的逻辑运行的。该开发方法的核心要素是消息响应函数,是由可视开发工具在生成软件时自动装入的。该开发方法可实现两类服务:一是生成图形用户界面及相关的消息响应函数;二是为各种具体的子应用的各个常规执行步骤提供规范窗口,包括对话框、菜单、列表框、组合框、按钮和编辑框等,提高开发效率。由于要事先生成各种消息相应函数,该方法只能应用于相当成熟的领域,比如关系数据库等;在一般应用领域,只适合用户界面的可视化开发。该开发方法一般不能独立运用,需要融入其他开发方法中来运用。
敏捷开发方法是移动互联时代兴起的综合性开发方法,将互联网精神融入到开发团队,采取适应变化、以人为杨心、迭代、循序渐进的开发方法。该方法是在互联网技术和商业发展背景下产生的,适用互联网软件开发需求不明确、客户体验性强、用户竞争激烈等情况。该方法注意团队组合。一般将项目经理、用户人员和开发团队混合编组,注意激发开发人员活力、给与充分授权等适应互联网精神的团队组织和管理理念,融合原有的迭代、增量、喷泉等开发模型中分析、设计、开发等既有方法。把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态;强调各个阶段任务的短、小、灵、快。该方法是一种综合方法,重视强调一些核心原则和辅助原则,这些原则既是开发人员和团队价值取向,也是工作方法。比如,核心原则包括:①注重个人及互动胜于过程和工具;②注重可用的软件胜过详尽的文档;③注重客户协作胜于合同谈判;④注重响应变化胜于恪守计划等。具体的敏捷开发方法包括×P极限编程、Scrunm、水晶方法、开放式源码、功用驱动开发方法、自适应软件开发方法等。
不论开发方法如何变化,并不存在完美无缺的开发方法;也不存在一种万能的开发方法,能适应于所有软件开发之需。在实践中,各种开发方法是可以组合使用的。结构化方法和模块化方法,可理解为系统架构的设计方法路径;面向数据结构的方法,可理解为从数据结构作为起点的一种设计思路,而不是将功能作为设计起点;敏捷方法更多的是偏向过程和团队建设的工作组织方法。因此,在一个项目中,可以以敏捷方法作为工作组织形式,按照模块化方法把工作任务分解,然后按照数据结构方法进行内部设计。当需要选用开发方法时,应实事求是,选择最适合主客观条件的开发方法。