开云 开云体育平台软件的开发过程
开发过程是软件工程的核心,为了生产出用户满意的产品,软件工程提供了一整套工程化的方法,来指导软件人员的工作。
如同传统工程的生产线上有很多工序,每道工序都有明确的规程,软件生产线上的工序主要包括: 需求分析、概要设计、详细设计、编码、测试、提交、维护等。采用一定的流程将各个环节连接起来,并可用规范的方式操作全过程,就可以形成不同的生存期模型,这个生存期模型就是在项目规划过程中选择的策略,如同工厂的生产线。常见的软件工程模型有线性模型、V模型、渐增式模型、螺旋模型、快速原型模型等等。
“瀑布模型”借鉴了其他行业中进行工程项目的做法。它要求 “项目目标固定不变”,“前一阶段的工作没有彻底做好之前决不进行下一阶段的工作”。然而对于软件来说,“项目目标固定不变”不很现实。为了解决这一问题,在“瀑布模型”中添加了种种反馈,并引入线性模型。虽然线性模型太理想化,太单纯,已不再适合现代的软件开发模式,但“线性”是人们最容易掌握并能熟练应用的思想方法。我们应该灵活应用线性的方式,例如增量式模型就是一种分段的线性模型,螺旋模型则是连续的、弯曲了的线性模型。在很多其他模型中也能够找到线性模型的影子。
在软件开发过程中可以按照项目计划中规划的生存期,通过配置管理来控制开发的流程。以一个网上招聘系统项目为例,在项目计划过程中,已经确定生存期模式是可以反馈的瀑布和增量模式,通过配置管理工具控制的开发流程如图1所示。
项目的基线是需求、设计、代码、产品。通过评审后的基线产品,不可以任意修改,如果需要修改,必须通过变更控制实现,即通过图1中的变更请求实现。图1中的需求、设计、编码是单向的,测试与编码可以是双向的。
从这个实施流程看,需求基线完成之后,设计基线才可以完成; 设计基线完成之后,代码基线才可以完成; 代码基线完成之后,产品基线才可以完成,但是设计可以在需求基线完成之前开始,代码也可以在设计基线完成之前开始。
在开发过程中应该严格按照这个控制流程实施,就如同其他工程的生产线,否则会出现生产问题。现在我们就分别说明这个生产线的各个环节或者说各个工序。
软件需求是指用户对软件的功能和性能的要求,也就是用户希望软件能做什么事情、完成什
么样的功能、达到什么样的性能。需求是一个软件项目的开端,也是项目建设的基石。有资料表明,软件项目中 40%~60%的问题源于在需求分析阶段埋下的隐患。软件开发中返工开销占开发总费用的40%,而其中70%~80%的返工是由需求方面的错误所导致的。在以往失败的软件项目中,80%是由于需求分析的不明确而造成的。因此一个项目成功的关键因素之一就是对需求分析的把握程度。
软件需求是软件项目关键的一个输入,和传统的生产企业相比较,软件的需求具有模糊性、不确定性、变化性和主观性的特点,是软件项目最难把握的,同时又是关系到项目成败的关键因素,因此对于需求分析和需求变更的处理十分重要。
需求工序中通过需求获取、需求分析、编制需求规格,最后通过需求验证和评审,才能确定需求基线。需求工序最后提交的是需求规格。如何编制需求规格由企业的过程体系确定,企业可以制定一个需求规格的标准和模板。一般需求规格通过用例分析,采用UML语言编写。
在需求管理过程中需要进行很多的变更,因此在编写需求规格时需要考虑需求的变更性和扩充性。从图1可以看到,如果需求基线已经形成后,不可以随意返回修改需求,只有通过变更申请才能决定是否进行需求的修改,而不能通过其他渠道进入需求阶段。
需求工序之后将进入设计工序。软件需求讲述的是“做什么?”,而软件设计解决的是“怎么做”的问题。软件设计是将需求描述的“做什么”问题变为一个实施方案的创造性的过程。良好的软件设计是软件快速开发的根本,它使得整个项目在逻辑上和物理上能够得以实现。
设计分为两个级别,一个是高级设计,也称为概要设计(或者总体设计),另外一种设计是低级设计,也称为详细设计。概要设计是从需求出发,描述了总体上系统架构应该包含的组成要素。这个过程讲究尽可能模块化,同时描述各个模块之间的关联。详细设计主要是描述实现各个模块的算法和数据结构,以及用特定计算机语言实现的初步描述,例如变量、指针、进程、操作符号以及一些实现机制。
当建筑师开始一个建筑项目的时候,首先要设计该建筑的框架结构,有了这个蓝图,接下来的实际建筑过程才会有条不紊,井然有序。同样软件开发者开始一个项目的时候,首先也应该构思软件应用的框架结构。
应用程序框架结构是一个可以重复使用的、大致完成的应用程序。可以通过对其进行定制开发成一个客户需要的真正的应用程序。框架结构提供给程序员可以重用的骨干模块,程序员使用这些模块来构造自己的应用。重用的骨干模块具有如下特征:
框架结构可以提高软件开发的速度和效率,并且使软件更便于维护。例如开发Web应用时,要从头设计并开发出一个可靠、稳定的框架不是一件容易的事情,随着Web开发技术的日趋成熟,在Web开发领域出现了一些现成的、优秀的框架,开发者可以直接使用它们。 Struct就是一个很好的框架结构,它是基于MVC的Web的应用框架,让开发者不必从头开始全部开发组件,对于大项目很有帮助。
《网上招聘系统》项目就是采用了Struct体系结构进行的概要设计,图2是概要设计文档中的一个架构图示。
如果说概要设计是以比较抽象概括的方式提出了解决问题的办法,而详细设计的任务则是将解决问题的办法进行具体化。详细设计主要是针对程序开发部分来说的,但这个阶段不是真正编写程序,而是设计出程序的详细规格说明。这种规格说明的作用类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。
详细设计将概要设计的框架内容具体化、明细化,将概要设计转化为可以操作的软件模型,但在实际项目进行过程中,这个过程可以省略,主要是看项目的具体情况和项目要求。
可以有详细设计也可以直接按照概要设计进行编码,这个过程主要是保证编码的顺利进行,可以扫清编码过程中的障碍,提高代码的质量和效率。
详细设计的结果基本决定了最终的程序代码的质量。衡量程序的质量不仅要看逻辑是否正确,性能是否满足要求,更主要的是要看它是否容易阅读和理解。因此详细设计的目标不仅是逻辑上正确地实现了模块的功能,更重要的是设计出的处理过程应该尽可能地简明易懂。
设计是基线,这个基线也一定在需求基线完成之后才可以形成。设计基线形成之后,如果需要修改,只能通过基线控制系统提出申请,才可以进入设计基线。
设计工开云 开云体育平台序之后将进入编码工序。编码工序是将设计结果转换为可执行的程序代码。实现设计(编写代码,简称编码或者编程)有很多的选择,因为有很多的实现语言、工具等,但是一般而言,在设计中会直接或者间接地确定实现语言。
在编写代码的时候应该有复用的观念,首先看能否复用别的项目的程序,同时,考虑自己的代码能否被同项目组的别人或者别的项目复用。
由于目前软件质量管理还不完善,很多的缺陷还需要在测试阶段发现。因此,尽管代码是一个重要的基线,但是为了提高代码的质量,允许测试开始前代码冻结一次,然后对测试过程中发现的问题,在严格的版本控制下跟踪问题的修复过程直到测试结束,再进行第二次代码冻结,这时代码的基线才形成。在测试和代码的修复过程中,可以不进行变更控制。
随着软件工程理论和实践的提高、过程管理的完善,产品的质量更多地应该在前期解决,而不应该在后期。从理论上讲,单元测试前应该解决所有的缺陷,测试只是评估产品质量的手段,而不是提高产品质量的手段,只有代码的基线完成之后,才可以进行测试,而且如果代码在测试中出现问题需要修改的话,应该通过变更控制系统解决代码的修改问题。
编码工序之后将进入测试工序。软件测试的过程与软件开发的过程是相反的过程,在早期的开发过程中,软件工程师试图从一个抽象的概念构建出一个实实在在的系统。测试过程,软件工程师试图通过设计测试案例来“破坏”这个构建好的系统。开发是构造的过程,测试是“破坏”的过程。而测试的破坏性质主要体现在:
测试过程包括计划、设计、开发、测试执行、测试跟踪和测试评估,如图3所示。《网上招聘系统》项目在测试过程中产生的结果包括《测试计划》、《测试设计》、《测试脚本》、《测试跟踪表》和《测试评估总结》。
从如何识别一个问题(需求),设计解决方案,然后实现这个方案,再测试这个实施的结果。现在我们需要将实施完成的结果提交给用户,进行版本,而且保证这个系统版本可以继续正确运行。这时还需要进行产品确认,确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。
这个提交过程不是简单地将系统放到指定的位置,还需要帮助用户明白这个系统,而且让他们感觉到这个产品很好。如果产品提交过程不成功,用户可能不会正确使用开发的系统,因此不满意系统的性能,那样前面的努力就白费了。
为了保证成功地将开发的软件提交给用户,需要对用户进行培训,同时提交必要的文档。《网上招聘系统》提交阶段提交的结果包括可以运行的产品(一张光盘)和《用户使用手册》、《系统管理员手册》、《产品提交手册》等文档。
前几个环节是如何建造一个软件系统的过程,但是这个系统的生命并没有随着产品的提交而结束。因为系统在使用过程中还存在很多的变化,还面临着系统维护这个现实的需求。
当一个系统在实际的环境中已经被用户投入使用,可以进行正常的操作,我们就说系统开发完成了。以后对系统变更所做的任何工作,称为维护。软件的维护与硬件的维护不同,硬件的维护是维修、预防器件的磨损,而软件维护则是变更部分与原来的系统整合。
除非最简单的情况,我们开发的系统是不断进化的,也就是一个系统的生命期内,系统的特性是不断变化的。软件系统发生变更不仅仅是因为客户变换了工作方式等原因,还有系统本身的原因。现实世界包含很多不确定因素,因而导致软件系统的现实需求也是不断变化的。
维护的时候,一方面要确认原来开发的产品是否让用户和系统管理员使用得很满意; 另外一方面,由于需求的变更、系统的变更、硬件、软件以及接口的变更等,要预测可能引入的错误。所以,维护是一个很广的范围,需要更多的跟踪和控制。
维护的类型主要包括纠错性维护、适应性维护、完善性维护和预防性维护等。例如附表就是《网上招聘系统》的一个维护记录。
自“软件工厂”这一概念提出以来,人们一直在围绕软件过程以及软件复用开展有关软件生产技术和软件生产管理的研究与实践,尤其是复用,包括文档的复用、设计的复用、编码的复用、测试的复用以及维护的复用等等。
基于复用(重用)的软件工程是比较理想的策略,因为在开发过程中可以最大化重用已经存在的软件。正如汽车企业不再自己制造轮胎,而是向擅长制造开云 开云体育平台轮胎的企业购买轮胎。对于软件开发,道理也是一样: 借助于已有的组件,小型团队也可以开发出优秀的软件。然而,尽管复用的效益已经被认可很多年,也只是近几年人们才渐渐从传统的开发过程转向复用的开发过程。
软件复用的主要优势在于复用可以降低开发成本,减少重新规划、设计、编程和测试新功能的工作量。除此之外,复用还有很多其他的优势,增加软件的可靠性、降低了风险、增加专家的利用率、增强了标准化的兼容性、加速开发时间。
可以设想一下,如果软件复用发展到一定的阶段,我们可以有更多的规划时间,例如需要什么样功能的软件,可以到软件超市购买需要的程序。就如同我们需要一个什么规格的元器件,就按照需要的标准购买需要的元器件一样。复用可以让我们不必要从头做起,不必要重走弯路,可以“踩着别人的肩膀往上走”。就如同我们不需重新做一个芯片,我们只做集成电路,需要什么芯片和元器件,直接购买就好了。
可以复用的软件单元有很多种,例如应用系统的复用、模块的复用、对象类和函数的复用等。复用有两种类型,一种是生产者复用,一种是消费者复用。生产者复用是开发的模块,可以为本项目后续复用。消费者复用是使用其他项目开发的模块。很多的企业有领域范围的复用或者企业范围的复用计划。
开发过程中也提倡提供更多更方便的模板,就如同在一个硬件的生产过程中可以提供模具一样,可以保证产品的一致性,提高质量。
随着软件工程理论和实践的发展,软件开发正逐步向工业化、流水化发展,软件的开发也逐步向框架结构发展,以后的编码工作应该类似水泥的浇灌,编码基本应该采用填空的方式。
扫一扫关注微信公众帐号