Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8165
  • 博文数量: 2
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-30 22:12
文章分类

全部博文(2)

文章存档

2008年(2)

我的朋友
最近访客

分类: 项目管理

2008-12-20 23:22:15

 

软件工程是一门研究如何有效开发软件的学科,矛盾永远是事物发展的根本动力,软件工程这一学科的产生,是随着软件危机的产生而产生,在计算机发展的早期,软件的独立性相对不高,软件的发展跟随硬件的发展而发展,因此,当时人们如果需要计算机发挥某些功能,往往自己编写针对某一具体问题的程序,这就造成了软件的“手工作坊”式开发,到了后期,人们对计算机软件的需求越来越高,因为软件是计算机的灵魂,开始了软件独立发展,迅速发展的时代,这个时候,由于大规模地开发软件,作坊式生产的弊端就表现出来了,此被人们成为“软件危机”,它大大地制约了软件的发展:

1.对软件开发的进度和成本估计不足;

2.用户对软件不满意;

3.软件存在质量问题;

4.软件通常是不可维护的;

5.所开发的软件缺乏必要的文档资料;

6.软件产品在计算机产品的成本比重在增加;

7.软件产品供不应求。


而后,北大西洋公约组织的成员在联邦德国开会,一致认为需要借鉴工程学的方法,把系统的、规范的、可量化的一套“方法、工具、过程”用于指导软件开发的实践——软件工程学。

因此,我们可以认为,作为一名合格的软件工程师,应当具备两个方面的能力:首先,是软件工程的“战略统帅”能力,能够站在一个全局的高度,审视和把握软件开发的主要脉络,认识问题的最有效方式,是从抽象到具体,毛主席说过,“立足全局、照顾局部、把握重要关节。”将主要的架构整理出来;其次,是数据结构及算法的“战术素养”,开发软件最终都会落实到编码上,如何高效地组织代码,使用合理的、高效的数据结构和算法来编写代码,是实质上提高软件质量的基本保证,因此,要具备战略和战术两个层面上的知识,才能正确地指导软件开发。


现代软件开发主要分为两大类方法:一是结构化范型;二是面向对象范型

结构化范型是较传统的方法学,它一大特点就是人为地分离了数据和行为,分别研究数据和行为,以建立模型,最终确定软件的设计。

从方法角度看,结构化范型依照以下步骤严格执行,并在每一阶段备有详尽的文档,每一阶段的成果是下一阶段的开始:

生命周期

1.问题定义;

2.可行性分析;

3.需求分析;

4.总体设计;

5.详细设计;

6.编码和单元测试;

7.集成测试;

8.维护;

从过程的角度看,软件开发有快速原型模型,增量模型,瀑布模型,喷泉模型,螺旋模型,极限编程,敏捷开发,RUP方法。

软件工程一书讲的最多的,也就是如何从方法的角度来理解开发:

分析阶段(问题定义、可行性分析、需求分析阶段):

问自己三个问题:

1.我要解决什么问题?

2.这个问题有行得通的解决办法吗?技术可行,经济可行,操作可行

3.为了解决问题我该做什么?


可通过shell语言建立快速原型模型验证用户需求,或者通过对现有系统的分析,导出系统流程图描述信息在系统中的流动情况,通过数据流图(四要素:原点/终点,动态数据流,静态数据存储,处理)和数据字典建立功能模型;通过实体联系图建立数据模型,为需要数据库支持的软件做好准备;通过状态图描述软件运行过程和状态,建立行为模型。


设计阶段(总体设计、详细设计):

问自己两个问题:

1.概括地说,系统该如何实现?

2.详细地描述问题是怎么被处理的?


总体设计分成系统设计和结构设计两个方面

系统设计:

1.设想几种实现系统的方案;

2.筛选出合理方案;

3.遴选最佳方案;

结构设计:

为了使软件的整体架构可读性和可维护性好,我们采用了模块化、抽象,模块独立,逐步求精,信息隐藏和局部化等启发式规则,功能分解,并从模块独立性导出两个概念:耦合与内聚,好的设计被认为是松耦合高内聚的


耦合表达模块间的联系程度,分为五种:

数据耦合,控制耦合,特征耦合,公共环境耦合,内容耦合

我们尽量采取数据耦合,处于安全性考虑,不要使用特征耦合,限制公共环境耦合的复杂度,避免使用内容耦合


内聚表达模块内部的紧密程度,分为七种(由松到紧):

偶然内聚,逻辑内聚,时间内聚,过程内聚,通信内聚,顺序内聚,功能内聚

功能内聚是再好不过,最好不要有偶然内聚和逻辑内聚;

要么通过HIPO图,结构图设计软件结构并审核;要么利用上一阶段的数据流图,采用面向数据流的设计方法,找出数据流图或事务型变换型特征,从而划分边界(对于具有变换特征的数据流图:输入,处理和输出三个边界;对于具有事务型明显特征的数据流图:输入,事务中心,输出),并将其映射成为软件结构

详细设计:

通过系统流程图或NS盒图具体地描述准备采取何种方法(算法)来解决问题,为了使详细设计产生的成果易于理解,我们采用了结构化的设计方法——程序中只使用“循环、选择、顺序”三种结构,并单入单出,在此基础上,允许使用CASEUNTIL语句的成为扩展结构化程序设计,如果还允许BREAK语句,则称为修正结构化程序设计


实现阶段(编码和单元测试,集成测试)

编码时要注意一个问题——“可读性第一,效率第二”,把握一个原则——“简单即高效”(Simplicity is best

测试是一种破坏性检验,测试的目标是找出错误,因此好的测试是发现了软件错误的测试

测试分为单元测试和集成测试(子系统测试,系统测试,回归测试,验收测试)

单元测试每次只针对一个单独的模块;

子系统测试要对进行过单元测试的模块进行组装测试,有两种策略:自底向上或者自顶向下采用自底向上的测试策略是从底层模块开始向上测试,因此需要编写相应的驱动模块来代理上层调度模块,然后逐步以调用模块替换驱动模块逐级向上;采用自顶向下的测试策略则是从上层开始,先用桩模块代替底层模块,在上层模块测试无误后,用真实模块代替桩模块,然后逐级向下。实际测试过程中可能会综合运用两种方法,并采取增量和回归的方式进行测试(每加入一个模块就从头测起)

系统测试是指将整个系统组装好后进行测试。

验收测试是请用户测试,让用户在一个受控环境下的测试成为alpha测试,在真实环境中测试成为beta测试。最后发布release正式版

测试方法主要分为白盒测试和黑盒测试,其中白盒测试用于早期,黑盒测试用于后期

白盒测试深入到模块内部,深入了解模块实现细节并制定测试方案,方法分两大类:逻辑覆盖和控制结构测试

逻辑覆盖有五种:语句覆盖,判定覆盖,条件覆盖,语句/判定覆盖,条件组合覆盖;语句覆盖是指每条语句至少执行一次,判定覆盖是指判定的两个分支都要执行一次,条件覆盖是指各种条件都满足一次,各自侧重点不同。

控制结构测试是针对循环和选择结构进行的测试,不过在实际测试中,我们一般画出程序流程图,并通过计算边和节点的个数/判定个数来计算环形复杂度-节点+2或者判定+1

黑盒测试不需要知道模块实现细节,只测试输入与输出等接口特性,

首先采用划分等价类方法进行测试,比如某密码系统要求输入密码长度大于等于4小于等于20,那么在此范围内的数构成一个有效等价类,小于4的构成一个无效等价类,大于20的划分为一个无效等价类,并从三个类中各取一个数代表进行测试即可。

然后采用边界条件测试,取边界值进行测试

测试要有详尽的测试报告,有输入和预期的输出。

最后,根据测试报告进行调试。


以上是结构化范型,下面简要介绍面向对象范型

采用面向对象的设计是以对象为中心——“万物皆对象”,将数据和操作紧密结合起来,最大限度模拟现实情况,使问题空间和解空间保持一致,需要建立三个模型以描述要实现的系统——对象模型、功能模型和数据模型,对象模型采用统一建模语言描述,提取方法是通过问题描述中的名词来建立对象模型。

OO=objects+classes+inheritance+communicate with messages


阅读(1260) | 评论(0) | 转发(0) |
0

上一篇:狼——献给天下摩羯人

下一篇:没有了

给主人留下些什么吧!~~