RSS
热门关键字:
当前位置 : 主页>编程开发>软件工程>列表

什么是软件工程?

来源:我要研发网 作者: 时间:1970-01-01 点击:



   软件工程(Software Engineering,简称为SE)是一门研究用工程化方法构建和维护有效、实用和高质量软件学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。

  在现代社会中,软件应用于多个方面。典型软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。同时,各个行业几乎都有计算机软件应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会发展,使得人们工作更加高效,同时提高了生活质量。 字串2

  软件工程师是对应用软件创造软件人们统称,软件工程师按照所处领域不同可以分为系统分析员,软件设计师,系统架构师,程序员,测试员等等。人们也常常用程序员来泛指各种软件工程师。

字串2

   软件工程(SoftWare Engineering)框架可概括为:目标、过程和原则。

字串7

   (1)软件工程目标:生产具有正确性、可用性以及开销合宜产品。正确性指软件产品达到预期功能程度。可用性指软件基本结构、实现及文档为用户可用程度。开销合宜是指软件开发、运行整个开销满足用户要求程度。这些目标实现不论在理论上还是在实践中均存在很多待解决问题,它们形成了对过程、过程模型及工程方法选取约束。

字串3

   (2)软件工程过程:生产一个最终能满足需求且达到工程目标软件产品所需要步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次说明、每一模块接口定义。详细设计产生程序员可用模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行程序代码。确认活动贯穿于整个开发过程,实现完成后确认,保证最终产品满足用户要求。维护活动包括使用过程中扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。 字串8

  (3)软件工程原则是指围绕工程设计、工程支持以及工程管理软件开发过程中必须遵循原则。

字串3

  一、软件工程概述

字串9

  概念:应需而生

字串1

  软件工程是一类工程。工程是将理论和知识应用于实践科学。就软件工程而言,它借鉴了传统工程原则和方法,以求高效地开发高质量软件。其中应用了计算机科学、数学和管理科学。计算机科学和数学用于构造模型与算法,工程科学用于制定规范、设计范型、评估成本及确定权衡,管理科学用于计划、资源、质量和成本管理

字串3


字串3

  软件工程这一概念,主要是针对20世纪60年代“软件危机”而提出。它首次出现在1968年NATO(北大西洋公约组织)会议上。自这一概念提出以来,围绕软件项目,开展了有关开发模型、方法以及支持工具研究。其主要成果有:提出了瀑布模型,开发了一些结构化程序设计语言(例如PASCAL语言,Ada语言)、结构化方法等。并且围绕项目管理提出了费用估算、文档复审等方法和工具。综观60年代末至80年代初,其主要特征是,前期着重研究系统实现技术,后期开始强调开发管理软件质量。

字串6

  70年代初,自“软件工厂”这一概念提出以来,主要围绕软件过程以及软件复用,开展了有关软件生产技术和软件生产管理研究与实践。其主要成果有:提出了应用广泛面向对象语言以及相关面向对象方法,大力开展了计算机辅助软件工程研究与实践。尤其是近几年来,针对软件复用及软件生产,软件构件技术以及软件质量控制技术、质量保证技术得到了广泛应用。目前各个软件企业都十分重视资质认证,并想通过这些工作进行企业管理和技术提升。软件工程所涉及要素可概括如下: 字串3

  根据这一框架,可以看出:软件工程涉及了软件工程目标、软件工程原则和软件工程活动。 字串1

  目标:我眼里只有“产品” 字串4

  软件工程主要目标是:生产具有正确性、可用性以及开销合宜产品。正确性意指软件产品达到预期功能程度。可用性指软件基本结构、实现及文档为用户可用程度。开销合宜性是指软件开发、运行整个开销满足用户要求程度。这些目标实现不论在理论上还是在实践中均存在很多问题有待解决,它们形成了对过程、过程模型及工程方法选取约束。

字串6

  软件工程活动是“生产一个最终满足需求且达到工程目标软件产品所需要步骤”。主要包括需求、设计、实现、确认以及支持等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件体系结构,包括子系统、模块以及相关层次说明、每一模块接口定义。详细设计产生程序员可用模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行程序代码。确认活动贯穿于整个开发过程,实现完成后确认,保证最终产品满足用户要求。支持活动包括修改和完善。伴随以上活动,还有管理过程、支持过程、培训过程等。 字串1

  框架:四项基本原则是基石

字串6


字串7

  软件工程围绕工程设计、工程支持以及工程管理,提出了以下四项基本原则:

字串4

  第一,选取适宜开发范型。该原则与系统设计有关。在系统设计中,软件需求、硬件需求以及其他因素之间是相互制约、相互影响,经常需要权衡。因此,必须认识需求定义易变性,采用适宜开发范型予以控制,以保证软件产品满足用户要求。

字串4

  第二,采用合适设计方法。在软件设计中,通常要考虑软件模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适设计方法有助于这些特征实现,以达到软件工程目标。

字串9

  第三,提供高质量工程支持。“工欲善其事,必先利其器”。在软件工程中,软件工具与环境对软件过程支持颇为重要。软件工程项目质量与开销直接取决于对软件工程所提供支撑质量和效用。

字串3

  第四,重视开发过程管理软件工程管理,直接影响可用资源有效利用,生产满足目标软件产品,提高软件组织生产能力等问题。因此,仅当软件过程得以有效管理时,才能实现有效软件工程。 字串8

  这一软件工程框架告诉我们,软件工程目标是可用性、正确性和合算性;实施一个软件工程要选取适宜开发范型,要采用合适设计方法,要提供高质量工程支撑,要实行开发过程有效管理软件工程活动主要包括需求、设计、实现、确认和支持等活动,每一活动可根据特定软件工程,采用合适开发范型、设计方法、支持过程以及过程管理。根据软件工程这一框架,软件工程学科研究内容主要包括:软件开发范型、软件开发方法、软件过程、软件工具、软件开发环境、计算机辅助软件工程(CASE) 及软件经济学等。

字串8

  作用:高效开发高质量软件

字串1

  自从软件工程概念提出以来,经过30多年研究与实践,虽然“软件危机”没得到彻底解决,但在软件开发方法和技术方面已经有了很大进步。尤其应该指出是,自80年代中期,美国工业界和政府部门开始认识到,在软件开发中,最关键问题是软件开发组织不能很地定义和管理软件过程,从而使一些开发方法和技术都起不到所期望作用。也就是说,在没有很定义和管理软件过程软件开发中,开发组织不可能在软件方法和工具中获益。

字串3

  根据调查,中国现状几乎和美国10多年前情况一样,软件开发过程没有明确规定,文档不完整,也不规范,软件项目成功往往归功于软件开发一些杰出个人或小组努力。这种依赖于个别人员上成功并不能为全组织软件生产率和质量提高奠定有效基础,只有通过建立全组织过程改善,采用严格软件工程方法和管理,并且坚持不懈地付诸实践,才能取得全组织软件过程能力不断提高。

字串7


字串6

  这一事实告诉我们,只有坚持软件工程四条基本原则,既重视软件技术应用,又重视软件工程支持和管理,并在实践中贯彻实施,才能高效地开发出高质量软件字串2

  二、软件工程七条基本原理

字串2

  自从1968年提出“软件工程”这一术语以来,研究软件工程专家学者们陆续 提出了100多条关于软件工程准则或信条。 美国著名软件工程专家 Boehm 综合这些专家意见,并总结了TRW公司多年开发软件经验,于1983年提出了软件工程七条基本原理。 字串5

  Boehm 认为,着七条原理是确保软件产品质量和开发效率原理最小集合。 字串3

  它们是相互独立,是缺一不可最小集合;同时,它们又是相当完备字串9

  人们当然不能用数学方法严格证明它们是一个完备集合,但是可以证明,在此之前已经提出100多条软件工程准则都可以有这七条原理任意组合蕴含或派生。 字串5

  下面简要介绍软件工程七条原理:

字串6

  1 用分阶段生命周期计划严格管理 字串6

  这一条是吸取前人教训而提出来。统计表明,50%以上失败项目是由于计划不周而造成。在软件开发与维护漫长生命周期中,需要完成许多性质各异工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行计划,然后严格按照计划对软件开发和维护进行管理。 Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。 字串7

  2 坚持进行阶段评审

字串7

  统计结果显示: 大部分错误是在编码之前造成,大约占63%; <2> 错误发现越晚,改正它要付出代价就越大,要差2到3个数量级。 因此,软件质量保证工作不能等到编码结束之后再进行,应坚持进行严格阶段评审,以便尽早发现错误。 字串7

  3 实行严格产品控制 字串1

  开发人员最痛恨事情之一就是改动需求。但是实践告诉我们,需求改动往往是不可避免。这就要求我们要采用科学产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段文档或代码随之相应变动,以保证软件一致性。

字串8

  4 采纳现代程序设计技术

字串3

  从六、七时年代结构化软件开发技术,到最近面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进技术即可以提高软件开发效率,又可以减少软件维护成本。 字串9

  5 结果应能清楚地审查

字串8


字串2

  软件是一种看不见、摸不着逻辑产品。软件开发小组工作进展情况可见性差,难于评价和管理。为更地进行管理,应根据软件开发总目标及完成期限, 尽量明确地规定开发小组责任和产品标准,从而使所得到标准能清楚地审查。 字串1

  6 开发小组人员应少而精

字串9

  开发人员素质和数量是影响软件质量和开发效率重要因素,应该少而精。 字串5

  这一条基于两点原因:高素质开发人员效率比低素质开发人员效率要高几倍到几十倍,开发工作中犯错误也要少多; 当开发小组为N人时,可能通讯信道为N(N-1)/2, 可见随着人数N增大,通讯开销将急剧增大。

字串2

  7 承认不断改进软件工程实践必要性

字串2

  遵从上述六条基本原理,就能够较地实现软件工程化生产。但是,它们只是对现有经验总结和归纳,并不能保证赶上技术不断前进发展步伐。因此,Boehm提出应把承认不断改进软件工程实践必要性作为软件工程第七条原理。根据这条原理,不仅要积极采纳新软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新 软件技术效果,也可以用来指明必须着重注意问题和应该优先进行研究工具和技术。

字串8

  面向方面编程(Aspect Oriented Programming,简称AOP)被认为是近年来软件工程另外一个重要发展。这里方面指是完成一个功能对象和函数集合。在这一方面相关内容有泛型编程(Generic Programming)和模板。

字串4

  参考

字串5

  胡崑山,《中国软件产业发展现状与人才需求》,2003年9月1日,      http://software.ccidnet.com/pub/article/c372_a62973_p1.html

字串4

  三、软件工程目标与常用模型

字串9

  软件工程目标是提高软件质量与生产率,最终实现软件工业化生产。质量是软件需求方最关心问题,用户即使不图物美价廉,也要求个货真价实。生产率是软件供应方最关心问题,老板和员工都想用更少时间挣更多钱。质量与生产率之间有着内在联系,高生产率必须以质量合格为前提。如果质量不合格,对供需双方都是坏事情。从短期效益看,追求高质量会延长软件开发时间并且增大费用,似乎降低了生产率。从长期效益看,高质量将保证软件开发全过程更加规范流畅,大大降低了软件维护代价,实质上是提高了生产率,同时可获得很信誉。质量与生产率之间不存在根本对立,软件工程方法可以同时提高质量与生产率。

字串8

  软件供需双方代表能在餐桌上谈笑风生,归功于第一线开发人员辛勤工作。质量与生产率提高就指望程序员与程序经理。对开发人员而言,如果非得在质量与生产率之间分个主次不可,那么应该是质量第一,生产率第二。这是因为:(1)质量直接体现在软件每段程序中,高质量自然是开发人员技术追求,也是职业道德要求。(2)高质量对所有用户都有价值,而高生产率只对开发方有意义。(3)如果一开始就追求高生产率,容易使人急功近利,留下隐患。宁可进度慢些,也要保证每个环节质量,以图长远利益。 字串3


字串9

  软件质量因素很多,如正确性,性能、可靠性、容错性、易用性、灵活性、可扩充性、可理解性、可维护性等等。有些因素相互重叠,有些则相抵触,真要提高质量可不容易啊!

字串1

  软件工程主要环节有:人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试、维护等,如图1.1所示。 字串8

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

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


字串2

  套用固定模型不是程序员聪明之举。比如“程序设计”与“测试”之间关系,习惯上总以为程序设计在先,测试在后,如图1.4(a)所示。而对于一些复杂程序,将测试分为同步测试与总测试更有效,如图1.4(b)所示。

字串5

  不论是什么软件工程模型,总是少不了图1.1中各个环节。本书擗开具体软件工程模型,顺序讲述人员管理、项目管理、可行性与需求分析、系统设计、程序设计、测试,以及维护与再生工程。其中程序设计部分以C /C语言为例。 字串3

  四、软件体系结构和工具选择

字串5

  软件体系结构表示了一个软件系统高层结构,主要特点有:1)软件系统结构是一个高层次上抽象,它并不涉及具体系统结构(比如B/S还是C/S),也不关心具体实现。2)软件体系结构必须支持系统所要求功能,在设计软件体系结构时候,必须考虑系统动态行为。3)在设计软件体系结构时候,必须考虑有现有系统兼容性、安全性和可靠性。同时还要考虑系统以后扩展性和伸缩性。所以有时候必须在多个不同方向目标中进行决策。 字串5

  当前已经有一些关于规范化软件体系结构,比如:ISO开放系统互联模型、X Window系统等等。软件系统结构通常被定义为两个部分:一个是计算部件。另一个就是部件之间交互。如果把软件系统看成一幅图话,计算部件就是其中节点,而部件之间交互就是节点之间弧线。部件之间连接可以被认为是一种连接器,比如过程调用、事件广播、数据库查询等等。正确体系结构设计是软件系统成功关键。 字串9

  我们理解了软件工程重要性以后,我们没有相应工具,我们也很难很完成一个系统。在需求分析和设计阶段,我们需要什么样工具呢?

字串4

  当然最是基于UMLCASE工具。当前比较流行就是Rose,它是一个很分析和建立对象和对象关系工具。在具体编码时候,我们需要版本控制工具,MSSourceSafe就是一个很版本管理工具和项目管理工具。具体开发工具当然很多,但是如果你是一个对VC侵淫了多年程序员,你一定会选择它,因为它会让你感到什么是真正面向对象编程,而你在用VB,PowerBuilder,Delphi时很少会有同样感受。至于数据库模式构建,我一向是采用SybaseS-Design,更工具就不知道了。

字串5


字串4

  另外需要注意是,我们需要建立文档编写若干模板,以便开发人员按照这个模板编写规范技术和说明文档。帮助文档可以用微软HTML Help Workshop(hhw.exe)制作,你也可以编译成.chm格式,它打包了文本和图形,只有一个文件,使用和分发比较方便。最后,如果开发人员不是集中在一个地方话,最建立一个邮件列表,开发人员可以通过邮件系统讨论开发各项事宜。 字串9

  五、软件开发方法综述

字串2

  国外大软件公司和机构一直在研究软件开发方法这个概念性东西,而且也提出了很多实际开发方法,比如:生命周期法、原型化方法、面向对象方法等等。下面介绍几种流行开发方法:

字串4

  1、结构化方法

字串5

  结构化开发方法是由E.Yourdon 和 L.L.Constantine 提出,即所谓SASD 方 法, 也可称为面向功能软件开发方法或面向数据流软件开发方法。Yourdon方法是80年代 使用最广泛软件开发方法。它首先用结构化分析(SA)对软件进行需求分析,然后用结构化设计(SD)方法进行总体设计,最后是结构化编程(SP)。它给出了两类典型软件结构(变换型和事务型)使软件开发成功率大大提高。 字串2

  2、面向数据结构软件开发方法 字串9

  Jackson方法是最典型面向数据结构软件开发方法,Jackson方法把问题分解为可由三种基本结构形式表示各部分层次结构。三种基本结构形式就是顺序、选择和重复。三种数据结构可以进行组合,形成复杂结构体系。这一方法从目标系统输入、输出数据结构入手,导出程序框架结构,再补充其它细节,就可得到完整程序结构图。这一方法对输入、输出数据结构明确中小型系统特别有效,如商业应用中文件表格处理。该方法也可与其它方法结合,用于模块详细设计。 字串6

  3、 面向问题分析法 字串8

  PAM(Problem Analysis Method)是80年代末由日立公司提出一种软件开发方法。 它基本思想是考虑到输入、输出数据结构,指导系统分解,在系统分析指导下逐步综 合。这一方法具体步骤是:从输入、输出数据结构导出基本处理框;分析这些处理框之间先后关系;按先后关系逐步综合处理框,直到画出整个系统PAD图。这一方法本质上是综合自底向上方法,但在逐步综合之前已进行了有目分解,这个目就是充分考虑系统输入、输出数据结构。PAM方法另一个优点是使用PAD图。这是一种二维树形结构图,是到目前为止最详细设计表示方法之一。当然由于在输入、输出数据结构与整个系统之间同样存在着鸿沟,这一方法仍只适用于中小型问题。

字串5


字串8

  4、原型化方法

字串8

  产生原型化方法原因很多,主要随着我们系统开发经验增多,我们也发现并非所有需求都能够预先定义而且反复修改是不可避免。当然能够采用原型化方法是因为开发工具快速发展,比如用VB,DELPHI等工具我们可以迅速开发出一个可以让用户看见、摸系统框架,这样,对于计算机不是很熟悉用户就可以根据这个样板提出自己需求。 字串7

  开发原型化系统一般由以下几个阶段:

字串6

  (1) 确定用户需求

字串5

  (2) 开发原始模型

字串4

  (3) 征求用户对初始原型改进意见 字串9

  (4) 修改原型。 字串6

  原型化开发比较适合于用户需求不清、业务理论不确定、需求经常变化情况。当系统规模不是很大也不太复杂时采用该方法是比较

字串6

  5、面向对象软件开发方法

字串9

  当前计算机业界最流行几个单词就是分布式、并行和面向对象这几个术语。由此可以看到面向对象这个概念在当前计算机业界地位。比如当前流行两大面向对象技术DCOM和CORBA就是例子。当然我们实际用到还是面向对象编程语言,比如C 。不可否认,面向对象技术是软件技术一次革命,在软件开发史上具有里程碑意义。

字串1

  随着OOP(面向对象编程)向OOD(面向对象设计)和OOA(面向对象分析)发展,最终形成面向对象软件开发方法OMT (Object Modeling Technique)。这是一种自底向上和自顶向下相结合方法,而且它以对象建模为基础,从而不仅考虑了输入、输出数据结构,实际上也包含了所有对象数据结构。所以OMT彻底实现了PAM没有完全实现目标。不仅如此,OO技术在需求分析、可维护性和可靠性这三个软件开发关键环节和质量指标上有了实质性突破,基本地解决了在这些方面存在严重问题。

字串9

  综上所述,面向对象系统采用了自底向上归纳、自顶向下分解方法,它通过对对象模型建立,能够真正建立基于用户需求,而且系统可维护性大大改善。当前业界关于面向对象建模标准是UML(Unified Modeling Language)。

字串8

  这里我们需要谈一下微软MSF(Microsoft Solutions Framework)框架,它简单把系统设计分成三个阶段:概念设计、逻辑设计和物理设计。概念设计阶段就是从用户角度出发可以得到多少个对象,并且以对象为主体,画出业务框架。逻辑设计阶段就是对概念设计阶段对象进行再分析、细分、整合、删除。并建立各个对象方法属性以及对象之间关系。而物理设计实际上就是要确定我们实际需要组件、服务和采用框架结构、具体编程语言等。MCF整个结构比较清楚是基于对象开发一个比较可操作框架系统。

字串9


字串3

  6、可视化开发方法

字串4

  其实可视化开发并不能单独作为一种开发方法,更加贴切说可以认为它是一种辅助工具,比如用过SYBASES-Design人都知道,用这个工具可以进行显示图形化数据库模式建立,并可以导入到不同数据库中去。当然用过S-Design人不一定很多,但用过VB,DELPHI,C Builder等开发工具人一定不少,实际上你就是在使用可视化开发工具。

字串1

  当然,不可否认是,你只是在编程这个环节上用了可视化,而不是在系统分析和系统设计这个高层次上用了可视化方法。实际上,建立系统分析和系统设计可视化工具是一个很卖点,国外有很多工具都致力于这方面产品设计。比如Business Object就是一个非常数据库可视化分析工具。

字串6

  可视化开发使我们把注意力集中在业务逻辑和业务流程上,用户界面可以用可视化工具方便构成。通过操作界面元素,诸如菜单、按钮、对话框、编辑框、单选框、复选框、 列表框和滚动条等,由可视开发工具自动生成应用软件

字串9

  六、怎样培养软件工程思维与方法

字串8

  作为软件开发人员一个通病是在项目初期时候,就喜欢谈论实现细节,并且乐此不疲。我们更喜欢讨论如何用灵活而简短代码来实现一个特定功能,而忽略了对整个系统架构考虑。所以作为一个开发人员,尤其是一个有经验开发人员,应该把自己从代码中解脱出来,更多时候在我们脑子里甚至暂时要放弃去考虑如何实现问题,而从项目或产品总体去考虑一个软件产品。

字串3

  以下是我个人一些经验: 字串2

  1.考虑整个项目或者产品市场前景。作为一个真正系统分析人员,不仅要从技术角度来考虑问题,而且还要从市场角度去考虑问题。也就是说我们同时需要考虑我们产品用户群是谁,当我们产品投放到市场上时候,是否具有生命力。比如即使我们采用最技术实现了一个单进程操作系统,其市场前景也一定是不容乐观字串7

  2.从用户角度来考虑问题。比如一些操作对于开发人员来讲是非常显而易见问题。但是对于一般用户来说可能就非常难于掌握,也就是说,有时候,我们不得不在灵活性和易用性方面进行折中。另外,在功能实现上,我们也需要进行综合考虑,尽管一些功能十分强大,但是如果用户几乎不怎么使用它话,就不一定在产品第一版时候就推出。从用户角度考虑,也就是说用户认可才是,并不是开发人员觉

字串9

  3.从技术角度考虑问题。虽然技术绝对不是唯一重要,但是技术一定是非常重要,是成功必要环节。在产品设计时候,必须考虑采用先进技术和先进体系结构。比如,如果可以采用多线程进行程序中各个部分并行处理话,就最采用多线程处理。在Windows下开发时候,能够把功能封装成一个单独COM构件就不作成一个简单DLL或者是以源代码存在函数库或者是对象。比如能够在B/S结构下运行并且不影响系统功能话就不一定要在C/S下实现。

字串2


字串8

  4.合理进行模块分割。从多层模型角度来讲,一般系统可以分成用户层、业务层和数据库层三部分。当然每以部分都还可以进行细分。所以在系统实现设计时候,尽量进行各个部分分割并建立各个部分之间进行交互标准。并且在实际开发时候,确实有需要话再进行重新调整。这样就可以保证各个部分齐头并进,开发人员也可以各施其职。

字串7

  5.人员组织和调度。这里很重要一点是到考虑人员特长,有人喜欢做界面,有人喜欢做核心。如果有可能要根据人员具体情况进行具体配置。同时要保证每一个开发人员在开发时候首先完成需要和其他人员进行交互部分,并且对自己项目进度以及其他开发人员进度有一个清晰了解,保证不同部分开发人员能够经常进行交流。 字串7

  6.开发过程中文档编写。在开发过程中会碰到各种各样问题和困难,当然还有各种各样创意和新思路。应该把这些东西都记录下来并进行及时整理,对于困难和问题,如果不能短时间解决,可以考虑采用其他技术替代,并在事后做专门研究。对于各种创意,可以根据进度计划安排考虑是在本版本中实现还是在下一版本中实现。

字串1

  7.充分考虑实施时可能遇到问题。开发是一回事情,用户真正能够使用它又是另外一回事情。比如在MIS系统开发中,最简单一个问题就是用户如果数据输入错误时候,如何进行操作。在以流程方式工作时候,如何让用户理解自己在流程中位置和作用,如何让用户真正利用计算机进行协作也是成败关键。

字串3

  以上是我个人一点体会,实际上,作为一个软件开发人员,我也喜欢看到问题就坐在计算机前面直接编码,但是我确实认为软件工程对于我们系统开发指导作用是巨大。作为软件工程拥戴者,下面我简单结合自己开发经历介绍基于软件工程开发方法、编程规范和工具使用等方面问题。 字串9

  七、软件开发发展变化

字串8

  国外很多项目开发都是基于一些图形化东西来做,他们是尽量少写代码甚至不写代码。代码能够通过图形化方式自动生成,这样一个处就是如果用户需求变化或者业务逻辑发生变化,我们需要做就是对图形表示调整,然后重新自动生成代码,这也就是国外开发很注重对项目概念和逻辑分析原因。

字串8

  他们重点是把业务规则和需求用图形化方式表现出来,然后通过CASE工具自动生成代码。所以当国人还在不停开发一个又一个MIS工具时候,国外已经把很多精力放到了CASE工具制作上。

字串8


字串8

  我们很多公司人员忙着写具体业务过程相关代码,而国外很多都把精力放到对不同应用,不同行业模型建立和共性提取上。所以,他们做出来东西就相对具有很强灵活性和扩展性,而我们是用户需求稍微有一点变化,就要忙着改代码,甚至改体系结构。 字串4

  另外,因为他们注重模型建立,所以在建立其他应用时候,能够借鉴原先模型,在高层次上做调整和优化,同时能够有效提取原有系统中可以被使用部分。所以我们应该从以代码为核心软件开发模式转化到以模型为中心、基于CASE开发上来。

字串2

  关于协作与个人英雄主义

字串1

  社会进步一个很明显现象就是社会分工越来越细,软件开发也不例外。为什么在软件开发今天已经不能出现象裘伯君这样软件英雄原因也在这里,单凭个人之力,我们也许穷尽有生之年也开发不出象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现在所能及项背,当然限于当前用户水平还很少有人使用二次开发功能。

字串8

  从微软产品系列可以看到软件工程作用,微软所有产品都有一个整体框架结构,比如Office软件,通过OLE技术进行有效通讯和联系。比如Visual系列开发工具,提供了相似开发界面使用户学会一种开发工具以后能够很容易学习其他开发工具。比如SQL SERVER和ACCESS,尽管它们适用范围不同,但是它们表现给用户界面,特别是在查询和分析上表现了高度一致性。 字串1

  更值得一提是,因为设计结构合理性,因为在开发前期作了很多分析和调研,考虑了扩展性和伸缩性,微软系列产品能够很快利用新技术并采用统一结构形式表现出来。比如当网络成为计算机发展主流时候,几乎微软所有工具都能够快速支持基于网络开发和应用。 字串6

  相比之下,我们国内很多公司产品很少具有连续性,往往是新一个产品完全重起炉灶,和老产品没有半点关系。这就是我们在设计产品时候,没有很进行抽象和概念、逻辑设计,造成结果是从旧产品中提取不出一些有用、共性东西为后来产品所使用。

字串1

  当然,很多开发人员从心里也承认一个大系统确实需要软件工程依托,但是一个小工程项目是否就可以仓促上马呢?答案是否定。所谓麻雀碎小,五脏俱全。无论是大项目、还是小项目。它们作为一个项目,都需要有一个需求分析、系统结构建立、设计、编码、测试等阶段。这是任何一个项目都不可缺少

字串9

  往往可以看到很多大公司IT部门人员都在不停作各种各样报表,当各个部门提出一种新类型报表时候,就从数据库中提取相应数据并画出业务人员所需要样式结构,很少是提供了一个通用模板,当然提供高层API接口进行这种操作就更少了。这样不可避免使开发人员陷入一些琐碎报表编制工作。而造成这个局面很重要一个原因就是没有在系统开发前期进行很调研、需求分析和系统体系结构设计。

字串7


字串6

  这里就我们开发一些小型软件项目来谈一些开发总结和体会,一般来说,小型软件项目功能比较单一,而且模块与模块之间衔接不是很多,同时对开发周期要求比较短。

字串3

  小项目虽然看起来比较简单,所以很多开发人员容易犯一些错误,记得我们在开发一个基于Internet有偿服务系统时候,有三个开发人员:一个负责前端界面编写,一个负责数据通讯协议和实现(基于TCP基础上应用协议),一个负责对数据库数据查询、整理和提取。我们在开发时候没有认真地进行项目实际前途和工作量估计。没有认真地估计项目难度,比如对于通讯中多用户并发访问时多线程问题和缓存处理问题,用户批量请求处理实现复杂度问题等等。三个人之间接口也是在开发中休息时候,口头定义一下。结果发现有不严密地方(比如在通讯服务器端是用VC编写开发人员是通过stream来传送数据,客户端是用Delphi编写,在接收数据时候发现数据不准确,后来研究发现VC利用CSocket在传送数据流时候对数据进行了自己定义格式化,结果服务器端数据发送模块只重写),而且其中关于一个接口双方理解不同,然后又返工重新修改。最后到系统基本完成时候没有一份较正式文档。然后因为有人毕业离开这个项目,然后他编写模块需要升级,新接收人不得不花很多时间去阅读他源代码。 字串6

  所以在开发小项目时候也必须要建立合理模式:而所谓合理模式就是软件工程告诉我们开发一个项目时候所需要五步曲:获取需求、需求分析、设计、编码、测试。 字串1

  1.理解用户真正需求。在进入正式开发之前,必须先从用户处获取准确需求。在这上面花费相当时间是很必要字串7

  我们软件项目可以大致分为专用软件和通用软件两大类。对于专用软件,一般用户对于软件要完成哪些功能已经有了一个比较清楚轮廓,而且往往在开发合同中已经大致地规定了。

字串6

  但是,开发合同上规定只是一个大概框架,在进入开发之前必须与用户进行比较具体交流和讨论,了解清楚用户心目中产品究竟是什么样子,这里最就采用原型化方法作出一个简单框架给用户看。 字串2

  对于通用软件,在开发之前必须做一定市场调查工作,一方面是从经济效益考虑,调查产品潜在市场有多大,一方面是从技术角度,了解清楚潜在用户对软件各种技术上要求,另一方面是确定我们软件定位,即我们软件具体是为哪一些用户群体服务。然后对该群体用户现有硬件配置,软件配置,网络使用情况,数据库使用情况,计算机熟悉程度做一定调研,根据调查统计结果决定即将开发软件一些技术指标。

字串5


字串1

  2.需求分析。需求分析需要做事情有:高层构思、确立系统目标、划分业务领域、现行业务分析、建立业务模型(Enterprise Model)、信息需求分析、用户视图规范化、数据元素标准化与一致性控制。 字串9

  在了解用户需求之后,将需求用一种模型来表示,就是需求分析,一般我们可以面向对象方法,通过分析用户需求,用类、类之间各种关系来表示整个系统。

字串8

  为了讨论软件运行流程,可以采用UMLUse 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.测试。测试是系统投入使用前最关键一个步骤。即使是小项目也应该严格地进行测试。就实际上就是一个把错误留给自己还是留给客户问题。

字串5

  最后,我们知道软件项目主要是由开发人员完成,所以对人员合理安排和配置也很重要,一般在开发过程中,需要有一位项目负责人,负责分析、设计和协调工作。另外需要几个程序员完成不同层代码(比如用户服务层、业务逻辑层、数据库服务层等等)。 字串6

  同时需要有一个文档整理人员随时整理系统开发过程中相关文档。如果条件可能话,要配置一个测试工程师,专门进行代码测试工作,当然如果条件不允许话,也可以由开发人员交叉测试。这里需要注意是,对于项目负责人而言,协调几个人工作比自己完成一段编码更重要。

字串1


字串4

  由于协调上出了漏洞,可能导致很大问题,所以项目负责人必须随时监控各开发人员工作,包括内容是否与要求发生偏差,进度是否滞后等等。同时必须给每个开发人员明确任务书。具体开发时每个开发人员必须非常明确自己任务,这些任务应该采用明确文档来表示。每个开发人员需要清楚自己所做工作在整个系统中处于什么地位,这样就有可能会发现设计模型中漏洞,避免了各人代码编写完毕之后又要修改后果。

字串6

  九、我国软件工程发展现状 字串5

  很多国内搞计算机专家都认为:国内软件研发过程,个人色彩比较浓。过分地依靠个人无法形成产业规模,而没有规模就谈不上产业化了。 字串7

  不管怎么样,我们大家还是先要来看一看国内软件厂商到底提供给我们多少有震撼力软件产品,从技术和利润角度讲,软件系统最核心部分还是操作系统、编译系统然后就是开发平台之类东西,接下来就是一些应用系统,比如图形开发、游戏开发、企业应用、网站建设、杀毒、网络工具等等。 字串4

  操作系统以中科院为中心,做了一个COSIX,这个本质上是一个UNIX系统,UNIX最初源代码是公开,尽管COSIX是一个被称为中国操作系统并是UNIX系列(IX就代表UNIX系列),但是其中到底有多少独创技术成分我们暂时还不知道,但有一点可以肯定,它现在市场覆盖率绝对不大,而且能否在上面运行各种各样编译系统、数据库、群件和应用系统可能还需要进一步测试。然后就是对硬件平台支持也需要进一步完善。 字串4

  然后就是轰轰烈烈Linux系统,Linux是遵守GNU标准操作系统,中国有很多家公司推出了自己Linux并且还有汉化Linux,这就有比较疑惑一点,为什么不在Linux上构架一个类似UNICODE这样东西,而只做汉化这么本地化产品呢?不知道是眼光还是市场问题了。 字串2

  MIS系统、财务软件是中国软件行业重头戏,它们彻底暴露了中国软件开发无序和重复低效劳动一面。教育软件在某一种层面上看就是电子题库,当然也有优点,比如加入了多媒体教学(可视化程度不错)和所谓寓教于乐特点,但是从本质上说还是题库。杀毒软件据说是中国软件骄傲,由中国权威机构评测是达到了世界领先水平,但是象还没有得到国际权威机构认可。游戏软件就不用提了,国内业界能够流行游戏软件成功秘诀众所周知,不是技术和创意,实在是归功于我们悠久历史。字处理软件和排版软件客观说国内也做不错,但是从系统扩展性和体系结构上说和MS和Adobe相比,差距也放在那里。其实这种现状原因很简单,一个是我们缺少创新能力,另一个就是我们欠缺软件工程概念,系统开发前期需求分析、设计没有做或者做不够

字串5


字串6

  当然,我们很少怀疑自己技术能力,我们很多时候认为这是地理环境和经济环境原因造成了中国软件业现在局面。当然中国软件开发人员绝对可以算是优秀,但是想想我们软件行业龙头企业到底有多少有技术创新和专利技术呢?姑且不论这个,实际上把一个操作系统分解开来,比如文件系统、进程管理和调度、IO调度等等,也许我们可以实现其中某一块内容,但是如何把它们合理整合起来绝对是一个涉及到软件工程问题。 字串1

  作为一个开发人员,我们已经习惯了自己那一套编程模式,而且我们这种习惯也不自觉影响着新开发人员。所以在头脑中建立一个软件工程作用,从某种角度上讲,要比会几种开发语言、几个编程技巧实在是重要多。

字串8

  举一个例子来说,我们也许可以写MFC中几个类或者是用自己类扩展MFC,但是我们又有几个人真正去认真分析和考虑MFC架构设计和原理呢?扪心自问,我们又有多少人能够设计出MFC这样框架系统呢?下面就我们题目谈一些相关话题。 字串9

  十、我有一个梦 字串1

  毋庸质疑是,计算机发展和人类历史相比甚至和其他很多科技产品相比都是非常,从第一台计算机研制成功到现在也没有百年历史,但是计算机及其相关技术发展却绝对可以说是最快。抛开硬件发展(硬件发展基本上是按照摩尔定律来,每18个月,机器速度性能都要提高一倍),单从软件发展来说,从体系结构来讲,我们经历了从主机结构到文件服务器结构,从客户服务器系统到基于Internet服务器浏览器结构体系结构变化。从编码角度来讲,我们经历了从最开始机器代码到汇编代码,从高级程序语言到人工智能语言,从专用程序设计语言到通用程序设计语言。从开发工具来讲,我们经历了从分离开发工具(有代码编辑器,中间代码生成器和连接器)到集成开发系统,从最简单单行命令式调试器到方便灵活多功能调试器。

字串4

  但是,今天所有软件厂商和软件开发人员依然会想起当年黑人人权运动领袖马丁?路德?金曾经说过一句名言我有一个梦想。是,所有开发人员依然怀着梦想,希望能够有一个万能系统开发框架和方法,只要我们沿着这个框架,我们将能开发出适合所有领域应用系统,于是,我们在念书时候把这个希望投到了一门课上,这么课就是软件工程。但是当我们在学完这门课时候,我们依然没有找到这么一个框架甚至连接近这么一个框架东西也没有碰到。

字串9

  不管我们认为软件工程可能是多么虚无,但是所有学工科并且有逻辑头脑人都坚信理论对实践指导意义,因为有了爱因斯坦及其许多伟大科学家关于能量和质量方面理论以后,我们才造出了原子弹。但是,遗憾软件工程并不是一个具体理论,它更象一门抽象科学。软件工程是一种方法论,而不是一种具体着,看产品。它告诉我们在设计一个系统时候,我们需要进行可行性研究、计划制订、需求分析、系统设计、编码、测试、维护等等。并且对这些过程中应该做什么提出了一个指导性东西。但是没有任何专家和标准委员会保证只要按照这些标准,我们系统肯定会顺利完成。而且事实上,软件开发针对领域是如此之多并不没有一种对所有领域适用万能框架。 字串9


字串4

  不管认为软件工程已经到了非常成熟阶段还是认为软件工程依然是一个搞不懂黑箱子,软件工程确实已经经历了三个不同阶段。第一个阶段是软件结构化生产阶段,以结构化分析与设计、结构化评审、结构化程序设计以及结构化测试为特征。从80年代中期,软件生产开始进入以过程为中心第二阶段,以提出过程成熟模型CMM、个体软件过程PSP和群组软件过程TSP为标志。第三个阶段就是以软件过程、面向对象和构件重用三把斧头出现软件工业化生产阶段。 字串6

  言归正传,我们还是回到我们文章标题上来,我们在开发时候是兵马未动、粮草先行还是摸着石子过河。兵马未动、粮草先行当然意味着我们在开发时候先不忙着编写代码做程序,我们先要制订一个关于开发方法。这点就象元数据(metadata)概念,元数据并不定义数据,它是对数据说明,也就是通常所说关于数据数据。我们设计时候也是这样,定义开发标准,如何进行开发、怎样开发。摸着石子过河就意味着我们先不管什么理论,方法,科学问题,我们先动手做起来,如果做也算成功话,那就可以按照这种模式来,实际上,在任何事情最初,我们都是这样。从辨证唯物主义者观点来说,就是从实践中来,然后升华到理论,再用理论来指导实践。记得一个笑话说:外国人搞软件工程是在一个黑屋子里面抓黑猫,不过到现在还是没有抓住,而中国人是在一个黑屋子里面,而里面连猫都没有,然后有人说,我已经抓到猫了。这个笑话一方面是说明直到现在,软件工程还是一个在继续探索、发展过程,另一个侧面也说明中国搞软件工程摸不着边局面。 字串8

  实际上,不管有没有软件工程,不管是否存在一个万能框架系统,我们应用系统还是要做,各种各样软件还是要开发。说到底,软件系统是因为有需求才存在。有了应用域才有了软件存在意义。很多时候,我们可以看到国外有各种各样软件和创新,而我们没有,我们更多是模仿和一些重复功能相近软件原因就是因为我们没有这方面需求,这也正解释了为什么ERP系统能在国外开展,而在国内失败多于成功原因。一方面当然是因为我们企业按照市场经济发展时间还不长,另一方面是我们企业确实也没有这方面需求。 字串7

十一、软件工程发展方向

  “敏捷开发”(Agile Development)被认为是软件工程一个重要发展。它强调软件开发应当是能够对未来可能出现变化和不确定性作出全面反应

字串2

  敏捷开发被认为是一种“轻量级”方法。在轻量级方法中最负盛名应该是“极限编程”(Extreme Programming,简称为XP)。而与轻量级方法相对应是“重量级方法”存在。重量级方法强调以开发过程为中心,而不是以人为中心。重量级方法例子比如CMM/PSP/TSP。

字串8

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册