软件开发的金字塔



在软件开发中,可以用一个金字塔来形容从需求分析到编码这整个过程。从中来分析整个开发过程以及开发过程中是否规范的利与弊。

金字塔从下到上依次是由需求分析、概要设计、详细设计、编码组成,这里把需求分析又分成了需求和软件需求规格说明书,如图1所示:

图1 规范的软件开发金字塔

下面从下到上开始来分析规范的软件开发金字塔。

在软件开发中,无论你的软件或大或小,需求分析是最重要且必不可少的,也是整个软件开发的基础。图1中浅绿色部分即为需求分析,这里把需求分析分为需求和软件需求规格说明书。在实际的项目开发中,很多的项目是没有需求规格说明书的,一方面可能项目太小,一方面对文档的要求不够。

需求分析是为了明确用户和客户的需要是什么,需要我们的软件做什么,解决什么问题,软件作成什么样子,最终达到什么效果。这差不多也就是项目所要达到的目标。有了目标之后,我们才开始对需要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,得到什么结果,最后应输出什么,处理过程中需要遵循什么准则等等,最后整理出软件需求规格说明书。软件项目属于工程项目,而软件需求规格说明书就相当于工程的设计效果图,我们是通过这个设计效果图来与客户达成一致,也便于开发人员有一个明确的开发目标。如果缺少了这张效果图,我们辛辛苦苦开发出来的软件有可能最终不是客户所需要的效果,而导致反工。

有了设计效果图,现在就该来搭建软件的架构、表述各模块功能、模块接口连接和数据传递的实现等各项事务了,这个阶段就是概要设计,即图1中棕色部分。在概要设计阶段我们需要把系统从整体的角度按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等去进行软件结构设计。我们还需要对数据特征进行描述、确定数据的结构特性、以及数据库的设计来完成数据结构的设计。通过软件结构设计和数据结构设计完成目标系统的逻辑模型。

目标系统的逻辑模型设计好了,接下来我们就应该开始设计每个模块的实现算法、所需的局部数据结构,对概要设计中表述的各模块进行深入分析,对各模块组合进行分析等,把程序的具体实现的功能、现象等描述出来。这就是详细设计所需要我们做的事情了,图1中的黄色部分即为详细设计。

有了需求、设计效果图、逻辑模型、具体实现的描述,我们就可以根据系统的特点以及公司的人员情况来确定最后采用什么开发语言,由哪个项目组去编码实现。到这里,我们的软件开发金字塔也就基本开发完成。

图2 不规范的软件开发金字塔

在实际的开发过程中,无论我们是否明显的划分这些阶段去做,我们都是潜在的按照着这样的流程去开发的,只是一些阶段,我们草草的走过了,或者是没有留下该阶段的文档记录,过程如同图2。通过这些金字塔,我们还可以形象的来表现出我们需要在这些阶段大概花费的时间,以及后期维护过程中可能存在的风险。

图3 金字塔中各层级的功能

从图3中,我们可以看到各个阶段的责职,需求是客户提出的问题,需要我们的软件去解决的问题,解决这些问题的时候有什么准则等等,一切都是围绕着问题。软件需求规格说明书是为了解决这些问题设计出来的设计效果图,我们用它来与客户达成一致,客户满意了我们便可以进行下一步的工作。这个设计效果图也将是指导我们的开发人员进行开发的标准,因为它的最终效果是与客户达成一致的,使客户最终所想要的,我们只有按照这个标准开发出来的软件最后才能顺利的通过客户的验收。有了设计效果图我们是不是就可以直接上手开始编码了呢?我认为还欠点火候。虽然说我们已经有了设计效果图,但是我们对整个系统的认识还是没有很清楚,我们还有很多模糊的地方。所以我们需要根据设计效果图来建立一个目标系统的逻辑模型,通过这个逻辑模型来分析系统的整体架构,数据结构的设计,各个模块的划分,以及未来新的问题出现时对系统可能带来的风险等等。我们只有从整体去审视这个系统,才能更好的去搭建系统的架构,使系统更稳健,代码结构设计更合理,才能经得起那些未知的问题出现时的考验。那么怎么样才能更好的去编码呢,我们就来对这个目标系统的逻辑模型进行详细的设计描述。

按照整个规范的过程下来,真正编码前所花费的时间,要比编码的时间多得多。然而我们的工期却是有限的,因此很多公司都把其中的很多过程都草草而过,采用的是图2不规范的软件开发金字塔,前期的工作花费的时间很少,大部分的时间都放在了编码中。其实这种不规范的金字塔中的编码过程也包含了概要设计和详细设计,只是他们是同步进行的。

不规范的金字塔漏洞百出,存在的问题也很多,看似能很快的把系统做出来了,虽然存在很多问题,以后也可以慢慢的去修改,总之能在工期结束时能给客户交个系统,大体的功能实现就行。然而,我们对一个软件,所花费最多的时间在哪呢?是开发吗?很显然不是。我们开发出一个系统不是给了客户就完事了,以后不用再管了,我们还要对它进行维护,对它出现的问题进行解决,我们所花费在对系统后期维护上的时间要远远大于开发的时间。

很明显,我们做好了前期的工作,也与客户达成了一致,也对系统的各个方面做好了分析,能通过整体全面的去分析系统。那么,无论后期维护中,有什么新需求的增加,也不会对整个系统的结构造成多大的影响。后期维护人员即使是一点都不了解系统的,前人也都留下了“设计效果图”,目标系统的逻辑模型,以及系统实现的描述,很快他就能了解整个系统,也能给好的参与到系统的维护中去。即使有新的需求,他也能根据系统的整体架构去重新设计和开发,保证系统的整体架构,性能以及代码结构的质量。这样就能很大程度的降低了维护成本。

而不规范的金字塔,则把大部分的时间花在了编码上,前期工作也就匆匆的做了一下,也没留下多少有用的设计文档。对系统的很多地方都是模糊的,也有可能因为这些模糊而在编码过程中遇到很多问题,而没有很好的解决方案,或者解决方案只考虑了当前模块的,忽略了系统的整体,从而又产生了别的问题,如此恶性循环下去。最终做出来的系统,很有可能还不是客户所期望的效果,还存在很多问题和漏洞,从而产生了很多的bug。后期维护时,什么有用的文档也没有留下。这样一来,开发成本很有可能没有降低下来,维护成本却很大程度上增加了。

即使后期维护时才来编写设计文档,虽然很大程度上利于后期开发维护,但是编写出来的文档或多或少都会受到已成型的系统的干扰,比如理解不够准确,缺少一些重要的分析等等都会对后期的维护造成影响,导致编写出来的文档可能存在设计上的问题,导致不了解系统的后期维护人员在后期开发维护中造成很多不良的影响。比如华北票据系统的分公司机打票管理模块和分公司定额票管理模块的功能基本都是一样的,从浏览器的地址栏来看,路径是不一样的,这两个模块应该是分开了单独写的,从实现的角度来说,这两个模块是可以放在一起来处理和显示的,然而后期编写的文档只能按照分开的来写,那么如果后面再有别的类型的票据增加,增加新的模块,功能也是差不多的,那么按照文档来开发,已经实现的模块代码只因票据类型不同而又得再写一遍,无疑是增加了维护成本。类似于这样的问题,其他的老系统也存在。

综上,我们的开发过程和文档的编写越规范,从长远的角度来说更利于我们的软件产品的开发和维护,也能保障我们软件产品的质量,从而降低开发成本和维护成本。

时间: 2024-10-23 22:12:23

软件开发的金字塔的相关文章

结构化方法和面向对象方法在软件开发中的对比

学习过C语言和JAVA的同学们一定清楚,这两种语言代表了两种不同的开发方式,即以C语言为代表的结构化开发方法和JAVA代表的面向对象的开发方法.由于二者在程序结构上有着很大的区别,因此,在软件开发领域中,根据自己的需求来选择合理的开发方式就显得尤为重要. 开发软件通常有三个层次: 1.满足用户需求 2.可维护性,即可修改性,让软件能随着用户需求的变更而容易改变 3.可重用性(在其它软件中,能尽量重用该软件的模块) 通过对软件的这三个主要层次的分析,我们就能在实际开发中确定我们的选择. 结构化方法

敏捷软件开发简述

前言:由于我读了邹欣老师的<构建之法:现代软件工程(第二版)>,因此对敏捷软件开发有了比较大的兴趣.于是我在网上找了一些论文,比如Requirements Engineering and Agile Software Development.A decade of agile methodologies: Towards explaining agile software development.在读了这些论文之后,对敏捷软件开发有了大致的了解.这篇博文主要是简单介绍敏捷软件开发,重点集中在主

敏捷软件开发VS传统软件工程

敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同,相对于"非敏捷",更强调程序员团队与业务专家之间的紧密协作.面对面的沟通(认为比书面的文档更有效).频繁交付新的软件版本.紧凑而自我组织型的团队.能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中"人"的作用. 本文将介绍敏捷软件开发的历史背景与发展,

全新的跨平台app软件开发工具——Lae软件开发平台

Lae是一款运行于windows的界面开发工具,具有所见即所得.开发跨平台.UI布局自由.机制简单.维护容易等诸多优点,可以开发同时运行在windows.Linux.MacOX.iOS.Android等系统平台的软件,windows桌面工具软件.管理软件.游戏界面;  linux系统桌面工具软件.管理软件.游戏界面; Mac OSX系统上桌面工具软件.管理软件.游戏界面:安卓系统的APP软件.2D游戏:iOS系统上的APP软件.2D游戏. 感兴趣的朋友请搜索知乎上的Lae软件开发平台介绍,或加入

怪不的软件开发这么挣钱,原来是有这么多职位

说起软件开发,现在是无人不知,无人不晓.好多人可能以为软件开发就是做一样工作的,其实不然,软件开发也分很多种类型,很多方向.做为一个过来人,简单介绍一些常见的开发方向. 1. 桌面程序:Java.C++.C#.VB.C均可. 现在大家办公使用的还是桌面程序占多数,不管是OA,ERP等等,都是通过PC来操作,桌面程序开发是一个重要的方向.只要PC还在,桌面程序开发就会一直存在. 2. 网站服务器端开发:JSP(Java语法).PHP.ASP(C#语法).Web App框架等 互联网发展的一个重要部

对软件开发中uml建模的理解和图形整理(一)

由于uml(统一建模语言)在开发中经常会用到,特别是在软件开发中的OOAD阶段,因此要理解和使用uml显得尤为重要.在uml开始之前,咱先回顾一个OOAD.OOP的主要特征. OOAD:根据面向对象的方法学来对软件系统进行分析和设计的过程.它包括OOA 分析阶段和OOD设计阶段.其中分析阶段主要解决"What to do?"的问题,而设计阶段主要解决"How to do?"的问题.具体来说就是:在OOA分析阶段咱要做的主要工作就是建立对业务问题域的视图(建立模型).

让你提前认识软件开发(46):首先是为人编写程序,其次才是计算机

第3部分 软件研发工作总结 首先是为人编写程序,其次才是计算机 "首先是为人编写程序,其次才是计算机",这是软件开发的基本要点,软件的生命周期贯穿于产品的开发.测试.生产.发布.用户使用.版本升级和后期维护等长期过程中,只有易读.易维护的软件代码才具有生命力. 在实际的软件开发过程中,可能是由于工作很忙的原因,很多开发人员只注重实现程序的基本功能,而忘记了编程规范,因此写出来的代码只能让计算机看懂,人要看懂很不容易.更有甚者,有些项目组为了赶进度,明确要求组员以实现产品功能为主,代码能

【转载】软件开发启示录——迟到的领悟

作者: John Sonmez  来源: IDF实验室博客  发布时间: 2013-10-20 15:47 转自(http://blog.idf.cn/2013/09/4-things-i-wish-i-would-have-known-when-i-started-my-software-development-career/) 我的软件开发生涯开始于15年前. 但是直到最近的5年,我才真正开始看到自己在软件开发领域的巨大进步. 这里有一些感悟是我希望能够在我进入软件开发领域时所知道的事情,如

软件开发质量管理的一些思考

PMBOK里关于质量管理主要有3个过程: 制定质量管理计划 质量保证(QA) 质量控制(QC) 书看了5-6次,还是发现比较抽象,难以理解. 实际项目中,如何才能合理的考虑各种资源制约,更好的执行质量管理呢? 一般的正规流程大致如下: 需求分析-> 客户评审与确认-> 概要设计->内部评审-> 详细设计->内部评审->编码-> 代码审查->单体测试 -> 集成测试->问题修复-> 代码评审-> 测试确认-> alpha测试-&g