软件工程(Software Engineering,简称为SE)是一门研究用工程化方法构建和维护有效
、实用
和高质量
软件
学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。
在现代社会中,软件应用于多个方面。典型
软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。同时,各个行业几乎都有计算机软件
应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会
发展,使得人们
工作更加高效,同时提高了生活质量。 字串2
软件工程师是对应用软件创造软件
人们
统称,软件工程师按照所处
领域不同可以分为系统分析员,软件设计师,系统架构师,程序员,测试员等等。人们也常常用程序员来泛指各种软件工程师。
软件工程(SoftWare Engineering)
框架可概括为:目标、过程和原则。
(1)软件工程目标:生产具有正确性、可用性以及开销合宜
产品。正确性指软件产品达到预期功能
程度。可用性指软件基本结构、实现及文档为用户可用
程度。开销合宜是指软件开发、运行
整个开销满足用户要求
程度。这些目标
实现不论在理论上还是在实践中均存在很多待解决
问题,它们形成了对过程、过程模型及工程方法选取
约束。
字串3
(2)软件工程过程:生产一个最终能满足需求且达到工程目标
软件产品所需要
步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次
说明、每一模块
接口定义。详细设计产生程序员可用
模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行
程序代码。确认活动贯穿于整个开发过程,实现完成后
确认,保证最终产品满足用户
要求。维护活动包括使用过程中
扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。 字串8
(3)软件工程
原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循
原则。
一、软件工程概述
概念:应需而生
字串1
软件工程是一类工程。工程是将理论和知识应用于实践
科学。就软件工程而言,它借鉴了传统工程
原则和方法,以求高效地开发高质量软件。其中应用了计算机科学、数学和管理科学。计算机科学和数学用于构造模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量和成本
管理。
字串3
字串3
软件工程这一概念,主要是针对20世纪60年代“软件危机”而提出
。它首次出现在1968年NATO(北大西洋公约组织)会议上。自这一概念提出以来,围绕软件项目,开展了有关开发模型、方法以及支持工具
研究。其主要成果有:提出了瀑布模型,开发了一些结构化程序设计语言(例如PASCAL语言,Ada语言)、结构化方法等。并且围绕项目管理提出了费用估算、文档复审等方法和工具。综观60年代末至80年代初,其主要特征是,前期着重研究系统实现技术,后期开始强调开发管理和软件质量。
字串6
70年代初,自“软件工厂”这一概念提出以来,主要围绕软件过程以及软件复用,开展了有关软件生产技术和软件生产管理
研究与实践。其主要成果有:提出了应用广泛
面向对象语言以及相关
面向对象方法,大力开展了计算机辅助软件工程
研究与实践。尤其是近几年来,针对软件复用及软件生产,软件构件技术以及软件质量控制技术、质量保证技术得到了广泛
应用。目前各个软件企业都十分重视资质认证,并想通过这些工作进行企业管理和技术
提升。软件工程所涉及
要素可概括如下: 字串3
根据这一框架,可以看出:软件工程涉及了软件工程
目标、软件工程原则和软件工程活动。 字串1
目标:我
眼里只有“产品” 字串4
软件工程
主要目标是:生产具有正确性、可用性以及开销合宜
产品。正确性意指软件产品达到预期功能
程度。可用性指软件基本结构、实现及文档为用户可用
程度。开销合宜性是指软件开发、运行
整个开销满足用户要求
程度。这些目标
实现不论在理论上还是在实践中均存在很多问题有待解决,它们形成了对过程、过程模型及工程方法选取
约束。
软件工程活动是“生产一个最终满足需求且达到工程目标
软件产品所需要
步骤”。主要包括需求、设计、实现、确认以及支持等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件体系结构,包括子系统、模块以及相关层次
说明、每一模块接口定义。详细设计产生程序员可用
模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行
程序代码。确认活动贯穿于整个开发过程,实现完成后
确认,保证最终产品满足用户
要求。支持活动包括修改和完善。伴随以上活动,还有管理过程、支持过程、培训过程等。 字串1
框架:四项基本原则是基石
字串6
字串7
软件工程围绕工程设计、工程支持以及工程管理,提出了以下四项基本原则:
第一,选取适宜开发范型。该原则与系统设计有关。在系统设计中,软件需求、硬件需求以及其他因素之间是相互制约、相互影响
,经常需要权衡。因此,必须认识需求定义
易变性,采用适宜
开发范型予以控制,以保证软件产品满足用户
要求。
字串4
第二,采用合适
设计方法。在软件设计中,通常要考虑软件
模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适
设计方法有助于这些特征
实现,以达到软件工程
目标。
字串9
第三,提供高质量
工程支持。“工欲善其事,必先利其器”。在软件工程中,软件工具与环境对软件过程
支持颇为重要。软件工程项目
质量与开销直接取决于对软件工程所提供
支撑质量和效用。
字串3
第四,重视开发过程
管理。软件工程
管理,直接影响可用资源
有效利用,生产满足目标
软件产品,提高软件组织
生产能力等问题。因此,仅当软件过程得以有效管理时,才能实现有效
软件工程。 字串8
这一软件工程框架告诉我们,软件工程
目标是可用性、正确性和合算性;实施一个软件工程要选取适宜
开发范型,要采用合适
设计方法,要提供高质量
工程支撑,要实行开发过程
有效管理;软件工程活动主要包括需求、设计、实现、确认和支持等活动,每一活动可根据特定
软件工程,采用合适
开发范型、设计方法、支持过程以及过程管理。根据软件工程这一框架,软件工程学科
研究内容主要包括:软件开发范型、软件开发方法、软件过程、软件工具、软件开发环境、计算机辅助软件工程(CASE) 及软件经济学等。
字串8
自从软件工程概念提出以来,经过30多年
研究与实践,虽然“软件危机”没得到彻底解决,但在软件开发方法和技术方面已经有了很大
进步。尤其应该指出
是,自80年代中期,美国工业界和政府部门开始认识到,在软件开发中,最关键
问题是软件开发组织不能很
地定义和管理其软件过程,从而使一些
开发方法和技术都起不到所期望
作用。也就是说,在没有很
定义和管理软件过程
软件开发中,开发组织不可能在
软件方法和工具中获益。
根据调查,中国
现状几乎和美国10多年前
情况一样,软件开发过程没有明确规定,文档不完整,也不规范,软件项目
成功往往归功于软件开发组
一些杰出个人或小组
努力。这种依赖于个别人员上
成功并不能为全组织
软件生产率和质量
提高奠定有效
基础,只有通过建立全组织
过程改善,采用严格
软件工程方法和管理,并且坚持不懈地付诸实践,才能取得全组织
软件过程能力
不断提高。
字串6
这一事实告诉我们,只有坚持软件工程
四条基本原则,既重视软件技术
应用,又重视软件工程
支持和管理,并在实践中贯彻实施,才能高效地开发出高质量
软件。 字串2
二、软件工程
七条基本原理
自从1968年提出“软件工程”这一术语以来,研究软件工程
专家学者们陆续 提出了100多条关于软件工程
准则或信条。 美国著名
软件工程专家 Boehm 综合这些专家
意见,并总结了TRW公司多年
开发软件
经验,于1983年提出了软件工程
七条基本原理。 字串5
Boehm 认为,着七条原理是确保软件产品质量和开发效率
原理
最小集合。 字串3
它们是相互独立
,是缺一不可
最小集合;同时,它们又是相当完备
。 字串9
人们当然不能用数学方法严格证明它们是一个完备
集合,但是可以证明,在此之前已经提出
100多条软件工程准则都可以有这七条原理
任意组合蕴含或派生。 字串5
下面简要介绍软件工程
七条原理:
1 用分阶段
生命周期计划严格管理 字串6
这一条是吸取前人
教训而提出来
。统计表明,50%以上
失败项目是由于计划不周而造成
。在软件开发与维护
漫长生命周期中,需要完成许多性质各异
工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行
计划,然后严格按照计划对软件
开发和维护进行管理。 Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。 字串7
2 坚持进行阶段评审
统计结果显示: 大部分错误是在编码之前造成
,大约占63%; <2> 错误发现
越晚,改正它要付出
代价就越大,要差2到3个数量级。 因此,软件
质量保证工作不能等到编码结束之后再进行,应坚持进行严格
阶段评审,以便尽早发现错误。 字串7
3 实行严格
产品控制 字串1
开发人员最痛恨
事情之一就是改动需求。但是实践告诉我们,需求
改动往往是不可避免
。这就要求我们要采用科学
产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段
文档或代码随之相应变动,以保证软件
一致性。
4 采纳现代程序设计技术
从六、七时年代
结构化软件开发技术,到最近
面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进
技术即可以提高软件开发
效率,又可以减少软件维护
成本。 字串9
5 结果应能清楚地审查
字串8
字串2
软件是一种看不见、摸不着
逻辑产品。软件开发小组
工作进展情况可见性差,难于评价和管理。为更
地进行管理,应根据软件开发
总目标及完成期限, 尽量明确地规定开发小组
责任和产品标准,从而使所得到
标准能清楚地审查。 字串1
6 开发小组
人员应少而精
开发人员
素质和数量是影响软件质量和开发效率
重要因素,应该少而精。 字串5
这一条基于两点原因:高素质开发人员
效率比低素质开发人员
效率要高几倍到几十倍,开发工作中犯
错误也要少
多; 当开发小组为N人时,可能
通讯信道为N(N-1)/2, 可见随着人数N
增大,通讯开销将急剧增大。
7 承认不断改进软件工程实践
必要性
字串2
遵从上述六条基本原理,就能够较
地实现软件
工程化生产。但是,它们只是对现有
经验
总结和归纳,并不能保证赶上技术不断前进发展
步伐。因此,Boehm提出应把承认不断改进软件工程实践
必要性作为软件工程
第七条原理。根据这条原理,不仅要积极采纳新
软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新
软件技术
效果,也可以用来指明必须着重注意
问题和应该优先进行研究
工具和技术。
字串8
面向方面
编程(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程
另外一个重要发展。这里
方面指
是完成一个功能
对象和函数
集合。在这一方面相关
内容有泛型编程(Generic Programming)和模板。
字串4
参考
胡崑山,《中国软件产业发展现状与人才需求》,2003年9月1日, http://software.ccidnet.com/pub/article/c372_a62973_p1.html
三、软件工程
目标与常用模型
字串9
软件工程
目标是提高软件
质量与生产率,最终实现软件
工业化生产。质量是软件需求方最关心
问题,用户即使不图物美价廉,也要求个货真价实。生产率是软件供应方最关心
问题,老板和员工都想用更少
时间挣更多
钱。质量与生产率之间有着内在
联系,高生产率必须以质量合格为前提。如果质量不合格,对供需双方都是坏事情。从短期效益看,追求高质量会延长软件开发时间并且增大费用,似乎降低了生产率。从长期效益看,高质量将保证软件开发
全过程更加规范流畅,大大降低了软件
维护代价,实质上是提高了生产率,同时可获得很
信誉。质量与生产率之间不存在根本
对立,
软件工程方法可以同时提高质量与生产率。
软件供需双方
代表能在餐桌上谈笑风生,归功于第一线开发人员
辛勤工作。质量与生产率
提高就指望程序员与程序经理。对开发人员而言,如果非得在质量与生产率之间分个主次不可,那么应该是质量第一,生产率第二。这是因为:(1)质量直接体现在软件
每段程序中,高质量自然是开发人员
技术追求,也是职业道德
要求。(2)高质量对所有
用户都有价值,而高生产率只对开发方有意义。(3)如果一开始就追求高生产率,容易使人急功近利,留下隐患。宁可进度慢些,也要保证每个环节
质量,以图长远利益。 字串3
软件
质量因素很多,如正确性,性能、可靠性、容错性、易用性、灵活性、可扩充性、可理解性、可维护性等等。有些因素相互重叠,有些则相抵触,真要提高质量可不容易啊!
软件工程
主要环节有:人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试、维护等,如图1.1所示。 字串8

软件工程模型建议用一定
流程将各个环节连接起来,并可用规范
方式操作全过程,如同工厂
生产线。常见
软件工程模型有:线性模型(图1.2),渐增式模型(图1.3),螺旋模型,快速原型模型,形式化描述模型等等 [Pressmam 1999, Sommerville 1992]。 字串7

最早出现
软件工程模型是线性模型(又称瀑布模型)。线性模型太理想化,太单纯,已不再适合现代
软件开发模式,几乎被业界抛弃。偶而被人提起,都属于被贬对象,未被留一丝惋惜。但我们应该认识到,“线性”是人们最容易掌握并能熟练应用
思想方法。当人们碰到一个复杂
“非线性”问题时,总是千方百计地将其分解或转化为一系列简单
线性问题,然后逐个解决。一个软件系统
整体可能是复杂
,而单个子程序总是简单
,可以用线性
方式来实现,否则干活就太累了。线性是一种简洁,简洁就是美。当我们领会了线性
精神,就不要再呆板地套用线性模型
外表,而应该用活它。例如渐增式模型实质就是分段
线性模型,如图1.3所示。螺旋模型则是接连
弯曲了
线性模型。在其它模型中都能够找到线性模型
影子。 字串7
字串2
套用固定
模型不是程序员
聪明之举。比如“程序设计”与“测试”之间
关系,习惯上总以为程序设计在先,测试在后,如图1.4(a)所示。而对于一些复杂
程序,将测试分为同步测试与总测试更有效,如图1.4(b)所示。

不论是什么软件工程模型,总是少不了图1.1中
各个环节。本书擗开具体
软件工程模型,顺序讲述人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试,以及维护与再生工程。其中程序设计部分以C /C语言为例。 字串3
四、软件体系结构和工具
选择
字串5
软件体系结构表示了一个软件系统
高层结构,主要特点有:1)软件系统结构是一个高层次上
抽象,它并不涉及具体
系统结构(比如B/S还是C/S),也不关心具体
实现。2)软件体系结构必须支持系统所要求
功能,在设计软件体系结构
时候,必须考虑系统
动态行为。3)在设计软件体系结构
时候,必须考虑有现有系统
兼容性、安全性和可靠性。同时还要考虑系统以后
扩展性和伸缩性。所以有时候必须在多个不同方向
目标中进行决策。 字串5
当前已经有一些关于规范化软件体系结构,比如:ISO
开放系统互联模型、X Window系统等等。软件系统
结构通常被定义为两个部分:一个是计算部件。另一个就是部件之间
交互。如果把软件系统看成一幅图
话,计算部件就是其中
节点,而部件之间
交互就是节点之间
弧线。部件之间
连接可以被认为是一种连接器,比如过程调用、事件广播、数据库查询等等。正确
体系结构设计是软件系统成功
关键。 字串9
我们理解了软件工程
重要性以后,我们没有相应
工具,我们也很难很
完成一个系统。在需求分析和设计阶段,我们需要什么样
工具呢?
当然最
是基于UML
CASE工具。当前比较流行
就是Rose,它是一个很
分析和建立对象和对象关系
工具。在具体编码
时候,我们需要版本控制工具,MS
SourceSafe就是一个很
版本管理工具和项目管理工具。具体
开发工具当然很多,但是如果你是一个对VC侵淫了多年
程序员,你一定会选择它,因为它会让你感到什么是真正
面向对象
编程,而你在用VB,PowerBuilder,Delphi时很少会有同样
感受。至于数据库模式构建,我一向是采用Sybase
S-Design,更
工具就不知道了。
字串4
另外需要注意
是,我们需要建立文档编写
若干模板,以便开发人员按照这个模板编写规范
技术和说明文档。帮助文档可以用微软
HTML Help Workshop(hhw.exe)制作,你也可以编译成.chm格式,它打包了文本和图形,只有一个文件,使用和分发比较方便。最后,如果开发人员不是集中在一个地方
话,最
建立一个邮件列表,开发人员可以通过邮件系统讨论开发中
各项事宜。 字串9
国外大
软件公司和机构一直在研究软件开发方法这个概念性
东西,而且也提出了很多实际
开发方法,比如:生命周期法、原型化方法、面向对象方法等等。下面介绍几种流行
开发方法:
1、结构化方法
字串5
结构化开发方法是由E.Yourdon 和 L.L.Constantine 提出
,即所谓
SASD 方 法, 也可称为面向功能
软件开发方法或面向数据流
软件开发方法。Yourdon方法是80年代 使用最广泛
软件开发方法。它首先用结构化分析(SA)对软件进行需求分析,然后用结构化设计(SD)方法进行总体设计,最后是结构化编程(SP)。它给出了两类典型
软件结构(变换型和事务型)使软件开发
成功率大大提高。 字串2
Jackson方法是最典型
面向数据结构
软件开发方法,Jackson方法把问题分解为可由三种基本结构形式表示
各部分
层次结构。三种基本
结构形式就是顺序、选择和重复。三种数据结构可以进行组合,形成复杂
结构体系。这一方法从目标系统
输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整
程序结构图。这一方法对输入、输出数据结构明确
中小型系统特别有效,如商业应用中
文件表格处理。该方法也可与其它方法结合,用于模块
详细设计。 字串6
3、 面向问题
分析法 字串8
PAM(Problem Analysis Method)是80年代末由日立公司提出
一种软件开发方法。 它
基本思想是考虑到输入、输出数据结构,指导系统
分解,在系统分析指导下逐步综 合。这一方法
具体步骤是:从输入、输出数据结构导出基本处理框;分析这些处理框之间
先后关系;按先后关系逐步综合处理框,直到画出整个系统
PAD图。这一方法本质上是综合
自底向上
方法,但在逐步综合之前已进行了有目
分解,这个目
就是充分考虑系统
输入、输出数据结构。PAM方法
另一个优点是使用PAD图。这是一种二维树形结构图,是到目前为止最
详细设计表示方法之一。当然由于在输入、输出数据结构与整个系统之间同样存在着鸿沟,这一方法仍只适用于中小型问题。
4、原型化方法
字串8
产生原型化方法
原因很多,主要随着我们系统开发经验
增多,我们也发现并非所有
需求都能够预先定义而且反复修改是不可避免
。当然能够采用原型化方法是因为开发工具
快速发展,比如用VB,DELPHI等工具我们可以迅速
开发出一个可以让用户看
见、摸
着
系统框架,这样,对于计算机不是很熟悉
用户就可以根据这个样板提出自己
需求。 字串7
开发原型化系统一般由以下几个阶段:
(1) 确定用户需求
字串5
(2) 开发原始模型
字串4
(3) 征求用户对初始原型
改进意见 字串9
(4) 修改原型。 字串6
原型化开发比较适合于用户需求不清、业务理论不确定、需求经常变化
情况。当系统规模不是很大也不太复杂时采用该方法是比较
。
当前计算机业界最流行
几个单词就是分布式、并行和面向对象这几个术语。由此可以看到面向对象这个概念在当前计算机业界
地位。比如当前流行
两大面向对象技术DCOM和CORBA就是例子。当然我们实际用到
还是面向对象
编程语言,比如C 。不可否认,面向对象技术是软件技术
一次革命,在软件开发史上具有里程碑
意义。
字串1
随着OOP(面向对象编程)向OOD(面向对象设计)和OOA(面向对象分析)
发展,最终形成面向对象
软件开发方法OMT (Object Modeling Technique)。这是一种自底向上和自顶向下相结合
方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象
数据结构。所以OMT彻底实现了PAM没有完全实现
目标。不仅如此,OO技术在需求分析、可维护性和可靠性这三个软件开发
关键环节和质量指标上有了实质性
突破,基本地解决了在这些方面存在
严重问题。
综上所述,面向对象系统采用了自底向上
归纳、自顶向下
分解
方法,它通过对对象模型
建立,能够真正建立基于用户
需求,而且系统
可维护性大大改善。当前业界关于面向对象建模
标准是UML(Unified Modeling Language)。
字串8
这里我们需要谈一下微软
MSF(Microsoft Solutions Framework)
框架,它简单
把系统设计分成三个阶段:概念设计、逻辑设计和物理设计。概念设计阶段就是从用户
角度出发可以得到多少个对象,并且以对象为主体,画出业务框架。逻辑设计阶段就是对概念设计阶段
对象进行再分析、细分、整合、删除。并建立各个对象
方法属性以及对象之间
关系。而物理设计实际上就是要确定我们实际需要
组件、服务和采用
框架结构、具体
编程语言等。MCF整个结构比较清楚是基于对象开发
一个比较
可操作
框架系统。
字串3
6、可视化开发方法
字串4
其实可视化开发并不能单独
作为一种开发方法,更加贴切
说可以认为它是一种辅助工具,比如用过SYBASE
S-Design
人都知道,用这个工具可以进行显示
图形化
数据库模式
建立,并可以导入到不同
数据库中去。当然用过S-Design
人不一定很多,但用过VB,DELPHI,C Builder等开发工具
人一定不少,实际上你就是在使用可视化开发工具。
当然,不可否认
是,你只是在编程这个环节上用了可视化,而不是在系统分析和系统设计这个高层次上用了可视化
方法。实际上,建立系统分析和系统设计
可视化工具是一个很
卖点,国外有很多工具都致力于这方面产品
设计。比如Business Object就是一个非常
数据库可视化分析工具。
字串6
可视化开发使我们把注意力集中在业务逻辑和业务流程上,用户界面可以用可视化工具方便
构成。通过操作界面元素,诸如菜单、按钮、对话框、编辑框、单选框、复选框、 列表框和滚动条等,由可视开发工具自动生成应用软件。
六、怎样培养软件工程
思维与方法
作为软件开发人员
一个通病是在项目初期
时候,就喜欢谈论实现
细节,并且乐此不疲。我们更喜欢讨论如何用灵活而简短
代码来实现一个特定
功能,而忽略了对整个系统架构
考虑。所以作为一个开发人员,尤其是一个有经验
开发人员,应该把自己从代码中解脱出来,更多
时候在我们
脑子里甚至暂时要放弃去考虑如何实现
问题,而从项目或产品
总体去考虑一个软件产品。
字串3
以下是我个人
一些经验: 字串2
1.考虑整个项目或者产品
市场前景。作为一个真正
系统分析人员,不仅要从技术
角度来考虑问题,而且还要从市场
角度去考虑问题。也就是说我们同时需要考虑我们产品
用户群是谁,当我们产品投放到市场上
时候,是否具有生命力。比如即使我们采用最
技术实现了一个单进程
操作系统,其市场前景也一定是不容乐观
。 字串7
2.从用户
角度来考虑问题。比如一些操作对于开发人员来讲是非常显而易见
问题。但是对于一般
用户来说可能就非常难于掌握,也就是说,有时候,我们不得不在灵活性和易用性方面进行折中。另外,在功能实现上,我们也需要进行综合考虑,尽管一些功能十分强大,但是如果用户几乎不怎么使用它
话,就不一定在产品
第一版
时候就推出。从用户
角度考虑,也就是说用户认可
才是
,并不是开发人员觉
才
。
3.从技术
角度考虑问题。虽然技术绝对不是唯一重要
,但是技术一定是非常重要
,是成功
必要环节。在产品设计
时候,必须考虑采用先进
技术和先进
体系结构。比如,如果可以采用多线程进行程序中各个部分并行处理
话,就最
采用多线程处理。在Windows下开发
时候,能够把功能封装成一个单独
COM构件就不作成一个简单
DLL或者是以源代码存在
函数库或者是对象。比如能够在B/S结构下运行并且不影响系统功能
话就不一定要在C/S下实现。
字串2
字串8
4.合理进行模块
分割。从多层模型角度来讲,一般系统可以分成用户层、业务层和数据库层三部分。当然每以部分都还可以进行细分。所以在系统实现设计
时候,尽量进行各个部分
分割并建立各个部分之间进行交互
标准。并且在实际开发
时候,确实有需要
话再进行重新调整。这样就可以保证各个部分齐头并进,开发人员也可以各施其职。
5.人员
组织和调度。这里很重要
一点是到考虑人员
特长,有
人喜欢做界面,有
人喜欢做核心。如果有可能要根据人员
具体
情况进行具体
配置。同时要保证每一个开发人员在开发
时候首先完成需要和其他人员进行交互
部分,并且对自己
项目进度以及其他开发人员
进度有一个清晰
了解,保证不同部分
开发人员能够经常进行交流。 字串7
6.开发过程中文档
编写。在开发过程中会碰到各种各样
问题和困难,当然还有各种各样
创意和新
思路。应该把这些东西都记录下来并进行及时整理,对于困难和问题,如果不能短时间解决
,可以考虑采用其他
技术替代,并在事后做专门
研究。对于各种创意,可以根据进度计划安排考虑是在本版本中实现还是在下一版本中实现。
字串1
7.充分考虑实施时可能遇到
问题。开发是一回事情,用户真正能够使用
它又是另外一回事情。比如在MIS系统开发中,最简单
一个问题就是用户如果数据输入错误
时候,如何进行操作。在以流程方式工作
时候,如何让用户理解自己在流程中
位置和作用,如何让用户真正利用计算机进行协作也是成败
关键。
以上是我个人
一点体会,实际上,作为一个软件开发人员,我也喜欢看到问题就坐在计算机前面直接编码,但是我确实认为软件工程对于我们系统开发
指导作用是巨大
。作为软件工程
拥戴者,下面我简单结合自己
开发经历介绍基于软件工程
开发方法、编程规范和工具使用等方面
问题。 字串9
国外很多项目
开发都是基于一些图形化
东西来做
,他们
目
是尽量少写代码甚至不写代码。代码能够通过图形化
方式自动生成,这样
一个
处就是如果用户
需求变化或者业务逻辑发生变化,我们需要做
就是对图形表示
调整,然后重新自动生成代码,这也就是国外开发很注重对项目
概念和逻辑分析
原因。
字串8
他们
重点是把业务规则和需求用图形化
方式表现出来,然后通过CASE工具自动生成代码。所以当国人还在不停
开发一个又一个
MIS工具
时候,国外已经把很多精力放到了CASE工具
制作上。
字串8
我们很多公司人员忙着写具体业务过程
相关代码,而国外很多都把精力放到对不同应用,不同行业
模型
建立和共性
提取上。所以,他们做出来
东西就相对具有很强
灵活性和扩展性,而我们是用户
需求稍微有一点变化,就要忙着改代码,甚至改体系结构。 字串4
另外,因为他们注重模型
建立,所以在建立其他应用
时候,能够借鉴原先
模型,在高层次上做调整和优化,同时能够有效
提取原有系统中可以被使用
部分。所以我们应该从以代码为核心
软件开发模式转化到以模型为中心
、基于CASE
开发上来。
字串2
关于协作与个人英雄主义
社会进步
一个很明显
现象就是社会分工越来越细,软件
开发也不例外。为什么在软件开发
今天已经不能出现象裘伯君这样
软件英雄
原因也在这里,单凭个人之力,我们也许穷尽有生之年也开发不出象Windows这样
操作系统。 字串1
因为,当前软件行业
壁垒无非就是两个,一个就是以技术创新取胜,你模仿
了其中
界面,但是你没有办法实现其中
核心功能。结果是你只能购买其技术核心,而你作一些边角工作。不举别
例子,比如VB这样
开发工具,其核心部分是它和第三方提供
COM控件或者是DLL函数库,你所做
就是一个整合
工作。
字串2
第二个就是以细致取胜,也就是说功能很多而且做
很精致,即使技术本身不是很复杂,你真要想做出一个这样
东西来没有一两年
工夫是不可能
。而真等你做出来了,它
新版本也早已经推出。真正能够在市面上叫得想、经得起考验得产品都是具有这两方面
特点。 字串8
这两方面
特点决定了你一个人绝对是不可能胜任
,也许你可以独立
完成技术创新,但是你绝对不可能一个人实现所有这些纷繁复杂
功能。所以,这个时代需要创新
英雄,也更需要人与人之间
协作。
字串8
当今
软件发展已经不是一个人可以包打天下
年代。软件开发
管理、系统体系结构
设计、模块之间
衔接、核心算法
实现、灵活界面
制定、软件再开发接口
实现都需要专门
人来做。而把这些有效
集成显然就需要有效
利用软件工程
思想和方法。所以,真正
软件英雄绝对不再是写着别人看不懂代码
程序员,而是整个体系结构
分析、设计、标准制定、协调人员。
字串2
八、我们是否需要软件工程 字串8
有一点大家可以达成共识
就是,如果一个象Windows这样
操作系统,不进行全面
规划,不采用软件工程
思想和方法,是绝对搞不出来
。 字串9
Windows
成功不在于它在进程管理和调度,文件系统、内存管理、界面设计等方面有多少成功
创新,它
成功最大
一点就是把所有
技术能够合理
整合起来,并集中到一个Window操作系统特有
框架结构中去。 字串5
字串5
更为重要
是,Windows
每一项技术创新都能够有效
整合到Windows框架中去,比如COM、XML等技术,通过ActiveX、DCOM等技术使Windows从桌面操作系统发展成为一个基于网络
操作系统。
字串1
OLE2技术把整个Office中相关
软件进行了有效
整合,显然,这里我们可以把Office
设计和WPS
设计进行比较,客观
讲,WPS对中国用户来说实在也是一个很
产品。但是从整个系统设计概念上来讲,Office显然要比WPS高一个层次,它能够把WORD,EXCEL,POWERPOINT,ACCESS有效
整合在一起,使我们所有办公相关
文档、图表、数据库、演示变成了一个一体化
东西。而且通过宏调用,用户可以自己定制用户界面并编制适当
模板,单是这个二次开发功能就不是WPS现在所能及项背
,当然限于当前用户
水平还很少有人使用二次开发
功能。
从微软产品系列可以看到软件工程
作用,微软
所有产品都有一个整体
框架结构,比如Office软件,通过OLE技术进行有效
通讯和联系。比如Visual系列开发工具,提供了相似
开发界面使用户学会一种开发工具以后能够很容易
学习其他
开发工具。比如SQL SERVER和ACCESS,尽管它们适用
范围不同,但是它们表现给用户
界面,特别是在查询和分析上表现了高度
一致性。 字串1
更值得一提
是,因为设计结构
合理性,因为在开发前期作了很多分析和调研,考虑了扩展性和伸缩性,微软
系列产品能够很快
利用新
技术并采用统一
结构形式表现出来。比如当网络成为计算机发展
主流
时候,几乎微软所有
工具都能够快速
支持基于网络
开发和应用。 字串6
相比之下,我们国内很多公司
产品很少具有连续性,往往是新
一个产品完全重起炉灶,和老
产品没有半点关系。这就是我们在设计产品
时候,没有很
进行抽象和概念、逻辑设计,造成
结果是从旧
产品中提取不出一些有用
、共性
东西为后来
产品所使用。
当然,很多开发人员从心里也承认一个大
系统确实需要软件工程
依托,但是一个小
工程项目是否就可以仓促上马呢?答案是否定
。所谓麻雀碎小,五脏俱全。无论是大项目、还是小项目。它们作为一个项目,都需要有一个需求分析、系统结构建立、设计、编码、测试等阶段。这是任何一个项目都不可缺少
。
字串9
往往可以看到很多大公司
IT部门
人员都在不停
作各种各样
报表,当各个部门提出一种新类型
报表
时候,就从数据库中提取相应
数据并画出业务人员所需要
样式结构,很少是提供了一个通用
模板,当然提供高层API接口进行这种操作
就更少了。这样不可避免
使开发人员陷入一些琐碎
报表编制工作。而造成这个局面
很重要
一个原因就是没有在系统开发
前期进行很
调研、需求分析和系统体系结构
设计。
字串6
这里就我们开发过
一些小型软件项目来谈一些开发
总结和体会,一般来说,小型软件项目功能比较单一,而且模块与模块之间
衔接不是很多,同时对开发周期要求比较短。
字串3
小项目虽然看起来比较简单,所以很多开发人员容易犯一些错误,记得我们在开发一个基于Internet
有偿服务系统
时候,有三个开发人员:一个负责前端界面
编写,一个负责数据通讯协议和实现(基于TCP基础上
应用协议),一个负责对数据库数据
查询、整理和提取。我们在开发
时候没有认真地进行项目实际前途和工作量
估计。没有认真地估计项目难度,比如对于通讯中多用户并发访问时
多线程问题和缓存处理问题,用户批量请求处理
实现复杂度问题等等。三个人之间
接口也是在开发中休息
时候,口头定义一下。结果发现有不严密
地方(比如在通讯服务器端是用VC编写
,开发人员是通过stream来传送数据
,客户端是用Delphi编写,在接收数据
时候发现数据不准确,后来研究发现VC利用CSocket在传送数据流
时候对数据进行了自己定义
格式化,结果服务器端数据发送模块只
重写),而且其中关于一个接口双方
理解不同,然后又返工重新修改。最后到系统基本完成
时候没有一份较正式
文档。然后因为有人毕业离开这个项目,然后他编写
模块需要升级,新
接收
人不得不花很多时间去阅读他
源代码。 字串6
所以在开发小项目
时候也必须要建立合理
模式:而所谓合理
模式就是软件工程告诉我们
在开发一个项目
时候所需要
五步曲:获取需求、需求分析、设计、编码、测试。 字串1
1.理解用户真正
需求。在进入正式开发之前,必须先从用户处获取准确
需求。在这上面花费相当时间是很必要
。 字串7
我们软件项目可以大致分为专用软件和通用软件两大类。对于专用软件,一般用户对于软件要完成哪些功能已经有了一个比较清楚
轮廓,而且往往在开发合同中已经大致地规定了。
字串6
但是,开发合同上规定
只是一个大概
框架,在进入开发之前必须与用户进行比较具体
交流和讨论,了解清楚用户心目中
产品究竟是什么样子,这里最
就采用原型化
方法作出一个简单
框架给用户看。 字串2
对于通用软件,在开发之前必须做一定
市场调查工作,一方面是从经济效益考虑,调查产品
潜在市场有多大,一方面是从技术
角度,了解清楚潜在用户对软件
各种技术上
要求,另一方面是确定我们软件
定位,即我们软件具体是为哪一些用户群体服务
。然后对该群体用户现有硬件配置,软件配置,网络使用情况,数据库使用情况,计算机熟悉程度做一定
调研,根据调查
统计结果决定即将开发
软件
一些技术指标。
字串1
2.需求分析。需求分析需要做
事情有:高层构思、确立系统目标、划分业务领域、现行业务分析、建立业务模型(Enterprise Model)、信息需求分析、用户视图规范化、数据元素标准化与一致性控制。 字串9
在了解用户
需求之后,将需求用一种模型来表示,就是需求分析,一般我们可以面向对象
方法,通过分析用户需求,用类、类之间
各种关系来表示整个系统。
为了讨论软件运行
流程,可以采用UML
Use Case图。在系统分析
时候需要明确应用域(application domain)
范围,然后明确我们系统需要做什么。同时我们需要决定用什么方法来完成需求
获取,这在很大程度上影响了需求分析
做法。
字串1
例如可以采用Use Case来表示用户需求,那么从各种序列图中选出相互交互
各个实体,就是一个个类。另外分析需要与设计过程相衔接。分析过程
内容是用对象和对象之间
关系来表示整个系统和系统
流程
,并不设计具体实现,如采用什么编程语言,在什么操作系统平台上运行等等。这些具体实现是在设计阶段来完成
。 字串5
面向对象方法
优点是分析、设计、编码过程表示法统一,能比较
衔接。现在很多CASE工具并不区分分析和设计
阶段。但是,这并不意味着开发就可以对分析和设计不加区分,如何用
辅助设计(case)工具还是开发人员
事情。 字串6
3.设计过程。设计阶段
工作包括对分析模型进行必要
修改,同时可能需要对某些类结构做一些修改,确定用户表示层(也就是通俗所说
界面定义)、用户服务层、业务逻辑层、数据库服务层和具体数据库所需要做
工作。同时需要确定使用
体系结构(比如B/S还是C/S)和开发工具(如VB,VC,VI,C Builder,DELPHI,PowerBuiler等等)
字串8
4.编码。进入编码工作之后,依然可能会发现前面分析或设计阶段
某些错误,这时应返回到前面
阶段进行必要
修改。同时在编码前规定编码
风格并在开发过程中保持一致
风格。
字串5
5.测试。测试是系统投入使用前最关键
一个步骤。即使是小项目也应该严格地进行测试。就实际上就是一个把错误留给自己还是留给客户
问题。
最后,我们知道软件项目主要是由开发人员完成
,所以对人员
合理安排和配置也很重要,一般在开发过程中,需要有一位项目负责人,负责分析、设计和协调
工作。另外需要几个程序员完成不同层
代码(比如用户服务层、业务逻辑层、数据库服务层等等)。 字串6
同时需要有一个文档整理人员随时整理系统开发过程中相关
文档。如果条件可能
话,要配置一个测试工程师,专门进行代码
测试工作,当然如果条件不允许
话,也可以由开发人员交叉测试。这里需要注意
是,对于项目负责人而言,协调几个人
工作比自己完成一段编码更重要。
由于协调上出了漏洞,可能导致很大
问题,所以项目负责人必须随时监控各开发人员
工作,包括内容是否与要求发生偏差,进度是否滞后等等。同时必须给每个开发人员明确
任务书。具体开发时每个开发人员必须非常明确自己
任务,这些任务应该采用明确
文档来表示。每个开发人员需要清楚自己所做
工作在整个系统中处于什么地位,这样就有可能会发现设计模型中
漏洞,避免了各人
代码编写完毕之后又要修改
后果。
九、我国软件工程发展
现状 字串5
很多国内搞计算机
专家都认为:国内
软件研发过程,个人色彩比较浓。过分地依靠个人无法形成产业规模,而没有规模就谈不上产业化了。 字串7
不管怎么样,我们大家还是先要来看一看国内软件厂商到底提供给我们多少有震撼力
软件产品,从技术和利润
角度讲,软件系统最核心
部分还是操作系统、编译系统然后就是开发平台之类
东西,接下来就是一些应用系统,比如图形开发、游戏开发、企业应用、网站建设、杀毒、网络工具等等。 字串4
操作系统以中科院为中心,做了一个COSIX,这个本质上是一个UNIX系统,UNIX最初
源代码是公开
,尽管COSIX是一个被称为中国
操作系统并是UNIX系列
(IX就代表UNIX系列),但是其中到底有多少独创
技术成分我们暂时还不知道,但有一点可以肯定,它现在
市场覆盖率绝对不大,而且能否在上面运行各种各样
编译系统、数据库、群件和应用系统可能还需要进一步测试。然后就是对硬件平台
支持也需要进一步完善。 字串4
然后就是轰轰烈烈
Linux系统,Linux是遵守GNU标准
操作系统,中国有很多家公司推出了自己
Linux并且还有汉化
Linux,这就有比较疑惑
一点,为什么不在Linux上构架一个类似UNICODE这样
东西,而只做汉化这么本地化
产品呢?不知道是眼光还是市场
问题了。 字串2
MIS系统、财务软件是中国软件行业
重头戏,它们彻底
暴露了中国软件开发无序和重复低效劳动
一面。教育软件在某一种层面上看就是电子题库,当然也有优点,比如加入了多媒体教学(可视化程度不错)和所谓寓教于乐
特点,但是从本质上说还是题库。杀毒软件据说是中国软件
骄傲,由中国权威机构评测是达到了世界领先水平,但是
象还没有得到国际权威机构
认可。游戏软件就不用提了,国内业界能够流行
游戏软件成功
秘诀众所周知,不是技术和创意,实在是归功于我们悠久
历史。字处理软件和排版软件客观
说国内
也做
不错,但是从系统
扩展性和体系结构上说和MS和Adobe相比,差距也放在那里。其实这种现状
原因很简单,一个是我们缺少创新
能力,另一个就是我们欠缺软件工程
概念,系统开发前期
需求分析、设计没有做
或者做
不够
。
字串6
当然,我们很少怀疑自己
技术能力,我们很多时候认为这是地理环境和经济环境
原因造成了中国软件业现在
局面。当然中国软件开发人员绝对可以算是优秀
,但是想想我们软件行业龙头企业到底有多少有技术创新和专利技术呢?姑且不论这个,实际上把一个操作系统分解开来,比如文件系统、进程管理和调度、IO调度等等,也许我们可以实现其中某一块
内容,但是如何把它们合理
整合起来绝对是一个涉及到软件工程
问题。 字串1
作为一个开发人员,我们已经习惯了自己那一套编程模式,而且我们
这种习惯也不自觉
影响着新
开发人员。所以在头脑中建立一个软件工程
作用,从某种角度上讲,要比会几种开发语言、几个编程技巧实在是重要
多。
举一个例子来说,我们也许可以写MFC中
几个类或者是用自己
类扩展MFC,但是我们又有几个人真正去认真分析和考虑MFC架构
设计和原理呢?扪心自问,我们又有多少人能够设计出MFC这样
框架系统呢?下面就我们
题目谈一些相关
话题。 字串9
十、我有一个梦 字串1
毋庸质疑
是,计算机
发展和人类
历史相比甚至和其他很多科技产品相比都是非常短
,从第一台计算机
研制成功到现在也没有百年
历史,但是计算机及其相关技术
发展却绝对可以说是最快
。抛开硬件
发展(硬件
发展基本上是按照摩尔定律来
,每18个月,机器
速度性能都要提高一倍),单从软件
发展来说,从体系结构来讲,我们经历了从主机结构到文件服务器结构,从客户服务器系统到基于Internet
服务器浏览器结构
体系结构
变化。从编码
角度来讲,我们经历了从最开始
机器代码到汇编代码,从高级程序语言到人工智能语言,从专用
程序设计语言到通用
程序设计语言。从开发工具来讲,我们经历了从分离
开发工具(有代码编辑器,中间代码生成器和连接器)到集成
开发系统,从最简单
单行命令式调试器到方便灵活
多功能
调试器。
字串4
但是,今天所有
软件厂商和软件开发人员依然会想起当年
黑人人权运动领袖马丁?路德?金曾经说过
一句名言我有一个梦想。是
,所有
开发人员依然怀着梦想,希望能够有一个万能
系统开发
框架和方法,只要我们沿着这个框架,我们将能开发出适合所有领域
应用系统,于是,我们在念书
时候把这个希望投到了一门课上,这么课就是软件工程。但是当我们在学完这门课
时候,我们依然没有找到这么一个框架甚至连接近这么一个框架
东西也没有碰到。
不管我们认为软件工程可能是多么
虚无,但是所有学工科并且有逻辑头脑
人都坚信理论对实践
指导意义,因为有了爱因斯坦及其许多伟大
科学家关于能量和质量方面
理论以后,我们才造出了原子弹。但是,遗憾
是软件工程并不是一个具体
理论,它更象一门抽象
科学。软件工程是一种方法论,而不是一种具体
摸
着,看
见
产品。它告诉我们在设计一个系统
时候,我们需要进行可行性研究、计划制订、需求分析、系统设计、编码、测试、维护等等。并且对这些过程中应该做什么提出了一个指导性
东西。但是没有任何专家和标准委员会保证只要按照这些标准,我们
系统肯定会顺利完成。而且事实上,软件开发针对
领域是如此之多并不没有一种对所有领域适用
万能框架。 字串9
字串4
不管认为软件工程已经到了非常成熟
阶段还是认为软件工程依然是一个搞不懂
黑箱子,软件工程确实已经经历了三个不同
阶段。第一个阶段是软件结构化生产阶段,以结构化分析与设计、结构化评审、结构化程序设计以及结构化测试为特征。从80年代中期,软件生产开始进入以过程为中心
第二阶段,以提出过程成熟模型CMM、个体软件过程PSP和群组软件过程TSP为标志。第三个阶段就是以软件过程、面向对象和构件重用三把斧头出现
软件工业化生产阶段。 字串6
言归正传,我们还是回到我们
文章标题上来,我们在开发
时候是兵马未动、粮草先行还是摸着石子过河。兵马未动、粮草先行当然意味着我们在开发
时候先不忙着编写代码做程序,我们先要制订一个关于开发
方法。这点就象元数据(metadata)
概念,元数据并不定义数据,它是对数据
说明,也就是通常所说
关于数据
数据。我们设计
时候也是这样,定义开发
标准,如何进行开发、怎样开发。摸着石子过河就意味着我们先不管什么理论,方法,科学
问题,我们先动手做起来,如果做
也算成功
话,那就可以按照这种模式来,实际上,在任何事情
最初,我们都是这样。从辨证唯物主义者
观点来说,就是从实践中来,然后升华到理论,再用理论来指导实践。记得一个笑话说:外国人搞软件工程是在一个黑屋子里面抓黑猫,不过到现在还是没有抓住,而中国人是在一个黑屋子里面,而里面连猫都没有,然后有人说,我已经抓到猫了。这个笑话一方面是说明直到现在,软件工程还是一个在继续探索、发展
过程,另一个侧面也说明中国搞软件工程摸不着边
局面。 字串8
实际上,不管有没有软件工程,不管是否存在一个万能
框架系统,我们
应用系统还是要做,各种各样
软件还是要开发。说到底,软件系统是因为有需求才存在
。有了应用域才有了软件存在
意义。很多时候,我们可以看到国外有各种各样
软件和创新,而我们没有,我们更多
是模仿和一些重复
功能相近
软件
原因就是因为我们没有这方面
需求,这也正解释了为什么ERP系统能在国外开展
很
,而在国内失败多于成功
原因。一方面当然是因为我们
企业按照市场经济发展
时间还不长,另一方面是我们
企业确实也没有这方面
需求。 字串7
发展方向 “敏捷开发”(Agile Development)被认为是软件工程
一个重要
发展。它强调软件开发应当是能够对未来可能出现
变化和不确定性作出全面反应
。
字串2
敏捷开发被认为是一种“轻量级”
方法。在轻量级方法中最负盛名
应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应
是“重量级方法”
存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法
例子比如CMM/PSP/TSP。
字串8
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
