《2021-2022年收藏的精品资料软件工程资料.doc》由会员分享,可在线阅读,更多相关《2021-2022年收藏的精品资料软件工程资料.doc(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一选择题:1软件工程学的提出是由于软件生产中的软件危机引起的,软件工程学的目的应该是最终解决软件生产的使软件工程化的问题。2软件危机通常是指在计算机软件开发和维护中所产生的一系列严重的问题,这些问题中相对次要的因素是软件性能。3软件危机是软件产业化过程中出现的一种现象,如:软件需求增长难以满足;软件开发成本提高;软件开发进度难以控制;软件质量不容易保证。4造成软件危机的主要原因是:软件本身特点,缺乏好的开发方法和手段。5软件工程方法学研究内容包含软件开发技术和软件工程管理两部分,其期望达到的最终目标是软件开发工程化。6瀑布模型把软件生命周期分为八个阶段:问题定义、可行性研究、软件需要分析、系统
2、总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三大阶段:计划阶段;开发阶段和运行阶段7从结构化的瀑布模型看,在它的生命周期的八个阶段中,需求分析阶段出错对软件的影响最大。8在结构性的瀑布模型中,需求分析阶段定义的标准将成为软件测试中的系统测试阶段的目标。9软件工程的出现主要是由于软件危机的出现。10软件工程方法学的目的是:使软件生产规范化和工程化,而软件工程方法得以实施的主要保证是软件开发工具和软件开发环境。11软件工程方法学中重要的内容之一是软件工程管理,它包含软件管理学和软件工程经济学,它要达到的目标是以基本的社会经济效益为基础,工程化生产软件。12软件工程方法中最普遍应用
3、的方法之一是结构化生命周期方法(SLC方法),包括:严格定义需求;划分开发阶段;规范文档格式。13结构化分析方法是一种预先严格定义需求的方法,它在实施时强调分析对象的数据流。14软件开发的结构化生命周期方法将软件生命周期划分为计划阶段;开发阶段和运行阶段。15进行需求分析可使用多种工具:数据流图(DFD);判断表;判定树和数据字典。16在软件的需求分析中,开发人员要从用户那里解决的最重要的问题是要让软件做什么。17软件需求分析阶段的工作,可以分为四方面:对问题的识别、分析与综合、编写需求分析文档以及需求分析评审。18在结构化分析方法中,用以表达系统内数据的运动情况的工具是数据流图。19软件设计
4、将涉及软件的结构、过程和模块的设计,其中软件过程是指模块的操作细节。20模块的独立性是由内聚性和耦合性来量度的,其中内聚性是模块的功能强度。21在软件开发过程中常用图作为描述工具。DFD就是面向数据流分析方法的描述工具。在一套分层DFD中,如果某一张图中有N个加工,则这张图允许有0N张子图。在一张DFD图中,任意两个加工之间有且仅有一条数据流。在画分层DFD时,应注意保持父图与子图之间的平衡。DFD中从系统的输入流到系统的输出流的一连串连续变换形成一种信息流,这种信息流可分为事件流和控制流两大类。22软件设计中划分模块的一个准则是高内聚低耦合。两个模块之间的耦合方式中,内容耦合的耦合度最高,非
5、直接耦合的耦合度最低。一个模块内部的内聚种类中,功能内聚的内聚度最高,偶然内聚的内聚度最低。23黑盒测试是从用户观点的测试,白盒测试是从开发人员观点的测试。24为了把握软件开发各个环节的正确性和协调性,人们需要进行确认和验证工作。确认的目的是想证实在一给定的外部环境中软件的逻辑正确性,它包括需求规格说明确认和用户确认。验证则试图证明在软件生存期各个阶段,以及阶段间的逻辑协调性、完备性和正确性。25一般来说,与测试数据无关的文档是项目开发计划。26根据国家标准GB8566-8计算机软件开发的规定,软件的开发和维护分为八个阶段,单元测试在编码阶段完成。单元测试(编码阶段);集成测试(设计阶段);确
6、认测试(需求分析阶段)。27在设计测试用例时,划分等价类是用得最多的一种黑盒测试方法。在黑盒测试方法中,等价划分方法设计测试用例的步骤是:(1)根据输入条件把数目极多的输入数据划分成若干个有效等价类盒若干个无效等价类。(2)设计一个测试用例,使其覆盖尽可能多尚未覆盖的有效等价类,重复这一步,直至所有有效等价类均被覆盖。(3)设计一个测试用例,使其覆盖仅一个尚未覆盖的无效等价类,重复这一步,直至所有无效等价类均被覆盖。在实际应用中,一旦纠正了程序中的错误后,还应选择部分或全部原先已经测试过的测试用例,对修改后的程序重新测试,这种测试称为回归测试。28单元测试在实现阶段进行,它所依据的模块功能描述
7、和内部细节及测试方案应在详细设计阶段完成,目的是发现编程错误。 集成测试所依据的模块说明书和测试方案应在概要设计阶段完成,它能发现设计错误。确认测试应在模拟的环境中进行强度测试的基础上进行,测试计划应在需求分析阶段完成。29软件测试阶段的基本任务应当是根据软件开发各阶段的文档资料和程序的内部结构,精心设计一批“高产”的测试用例,利用这些测试用例执行程序,找出软件中潜藏的各种错误和缺陷。 30测试用例不仅要选用合理的测试输入数据,还需要选用不合理的测试输入数据,这样能更多地发现错误,提高程序的可靠性。对于不合理的测试输入数据,程序应拒绝执行,并给出相应的提示。31动态测试指通过运行程序发现错误。
8、对软件产品进行动态测试时使用黑盒测试法和白盒测试法。32静态测试指被测试程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。33黑盒测试依据软件需求规格说明,检查程序是否满足功能要求。因此,黑盒测试又称为功能测试或数据驱动测试。34白盒测试以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检查内部数据结构和运行状态是否有错,程序的语句和条件与预期的状态是否一致。白盒测试又称为结构测试。35在基本路径测试中,独立路径是指包括一组以前没有处理过的上层调用模块的一条路径。从程序图来看,一条独立路径是至少包含有一条测试输入数据的边的路径。37软件测试的目的是发现
9、软件错误。38软件测试用例主要由测试输入数据和测试的预期结果两部分组成。39与设计测试用例无关的文档是项目开发计划。40软件测试是软件质量保证的主要手段之一,测试的成本已超过软件开发成本的30%以上。因此,提高测试的有效性非常重要。41“高产”的测试是指用适量的测试用例发现被测试程序尽可能多的错。42如果想要进行成功的测试,为其设计测试用例主要依赖于测试人员的经验。43使用白盒测试方法时,确定测试数据应根据程序的内部结构和指定的覆盖标准。44在用逻辑覆盖法设计测试用例时,有语句覆盖、分支覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖和路径覆盖等。其中路径覆盖是最强的覆盖准则。45在设计测试用例时
10、,等价类划分是用得最多的一种黑盒测试方法。46在黑盒测试中,着重检查输入条件的组合的测试用例设计方法是因果图法。47单元测试将根据在详细设计阶段中产生的规格说明进行。48集成测试计划是在概要设计阶段制定的。49确认测试计划是在需求分析阶段制定的。50软件的集成测试最好是由不属该软件开发组的软件人员承担,以提高集成测试的效果。51从已发现故障的存在到找到准确的故障位置并确定故障的性质,这一过程称为调试。52统计资料表明,软件测试的工作量占整个软件开发工作量的40%50%。53软件测试计划是一些文档,它们描述了对于预定的测试活动将要采取的手段。54IBM公司的统计资料表明,使用静态测试的方法最高可
11、以查出在测试中查出的全部软件错误的70%。55黑盒测试方法的优点是可发现实现功能需求中的错误。56白盒测试方法的优点是可按软件内部结构测试。57等价类划分完成后,就可得出等价类表,它是确定测试用例的基础。58由因果图转换出来的判定表是确定测试用例的基础。59软件测试的目的是发现软件的错误。为了提高测试的效率,应该选择发现错误的可能性大的数据作为测试数据。使用白盒测试方法时,确定测试数据应根据程序的内部逻辑和指定的覆盖标准。与设计测试数据无关的文档是项目开发计划。软件的集成测试工作最好由承担,以提高集成测试的效果。60测试过程需要三类输入:软件配置、测试配置和测试工具。对测试结果进行结果分析,出
12、错则排错,通过数据出错率进行可靠性分析。61程序的三种基本控制结构是顺序,条件,循环。它们的共同点是只有一个入口和一个出口。结构化程序设计的一种基本方法是逐步求精法。软件测试的目的是发现程序中的错误。软件调试的目的是找出错误所在并改正之。62(1) 对可靠性要求很高的软件,例如操作系统,由第三者对源代码进行逐行检查。代码审查 (2) 已有的软件被改版时,由于受到变更的影响,改版前正常的功能可能发生异常,性能也可能下降。因此,对变更的软件进行测试是必要的。回归测试 (3) 在意识到被测试模块的内部结构或算法的情况下进行测试。白盒测试 (4) 为了确认用户的需求,先做出系统的主要部分,提交给用户试
13、用。原型63软件测试方法可分为黑盒测试法和白盒测试法两种。 黑盒测试法是通过分析程序的功能来设计测试用例的方法。除了测试程序外,它还适用于对需求分析阶段的软件文档进行测试。白盒测试法是根据程序的内部逻辑来设计测试用例的方法。除了测试程序外,它也适用于对软件详细设计阶段的软件文档进行测试。白盒法测试程序时常按照给定的覆盖条件选取测试用例。判定覆盖比语句覆盖严格,它使得每一个判定的每一条分支至少经历一次。判定/条件覆盖既是判定覆盖,又是条件覆盖,但它并不保证使各种条件都能取到所有可能的值。多重条件覆盖比其他条件都要严格,但它不能保证覆盖程序中的每一条路径。单元测试一般以白盒法为主,测试的依据是模块
14、功能规格说明。64集成测试也叫做组装测试或联合测试。通常,在单元测试的基础上,将所有模块按照设计要求组装成为系统。子系统的集成测试特别称为部件测试,它所做的工作是要找出子系统和系统需求规格说明之间的不一致。需要考虑的问题是:在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失; 一个模块的功能是否会对另一个模块的功能产生不利的影响;各个子功能组合起来,能否达到预期要求的父功能;全局数据结构是否有问题;单个模块的误差累积起来是否会放大。65软件测试中常用的静态分析方法是引用分析和接口分析。接口分析用于检查模块或子程序间的调用是否正确。分析方法(白盒方法)中常用的方法是路径测试方法。非分析方法
15、(黑盒方法)中常用的方法是等价类方法和因果图方法。因果图方法根据输出对输入的依赖关系设计测试用例。66等价类划分是一种典型的黑盒测试方法方法,也是一种非常实用的重要的测试方法。使用这一方法,完全不考虑程序的内部结构。用所有可能输入的数据来测试程序是不可能的,只能从全部可供输入的数据中选择一个子集进行测试。等价类是指某个输入域的集合,在该集合中,各个输入数据对于揭露程序中的错误是等效的。67黑盒测试方法的缺点是不可测试软件的特定部位和无法测试未实现功能需求的软件的内部缺陷。68白盒测试方法的缺点是不能发现功能需求中的错误和无法检验软件的外部特性。二判断题(1) 用黑盒法测试时,测试用例是根据程序
16、内部逻辑设计的。()(2) 尽量用公共过程或子程序去代替重复的代码段。()(3) 测试是为了验证该软件已正确地实现了用户的要求。()(4) 对于连锁型分支结构,若有n个判定语句,则有2n条路径。()(5) 尽量采用复合的条件测试,以避免嵌套的分支结构。()(6) GOTO语句概念简单,使用方便,在某些情况下,保留GOTO语句反能使写出的程序更加简洁。()(7) 发现错误多的程序模块,残留在模块中的错误也多。()(8) 黑盒测试方法中最有效的是因果图法。()(9) 在做程序的单元测试时,桩(存根)模块比驱动模块容易编写。()(10) 程序效率的提高主要应通过选择高效的算法来实现。()三应用题1.
17、求一组数组中的最大数, 数组表示为A(n) ,n1,2n的自然数。(10分) 请画出程序流程图(4分) 请画出该算法的N-S图(3分) 请用PAD图来表示该算法(3分) 答案: 2、某银行计算机储蓄系统的工作流程大致如下:储户填写的存款单或取款单由业务员键入系统,如果是存款则系统记录存款人的姓名、住址(或电话号码)、身份证号码、存款类型、存款日期、到期日期、利率及密码(可选)等信息,并印出存款单给储户;如果是取款而且存款时留有密码,则系统首先核对储户密码,若密码正确或存款时未留密码,则系统计算利息并印出利息清单给储户。请用数据流图描绘本系统的功能。并画出系统的E-R图。DFD图:ER图: 3、
18、试用N-S图和PAD表示下面程序流程图,并计算它们的McCabe复杂性度量.(基本路径测试法的环复杂度)。(10%)解答:4、某培训中心要研制一个计算机管理系统。它的业务是:将学员发来的信件收集分类后,按几种不同的情况处理。1)如果是报名的,则将报名数据送给负责报名事务的职员,他们将查阅课程文件,检查该课程是否额满,然后在学生文件、课程文件上登记,并开出报告单交财务部门,财务人员开出发票给学生。2)如果是想注销原来已选修的课程,则由注销人员在课程文件、学生文件和帐目文件上做相应的修改,并给学生注销单。3)如果是付款的,则由财务人员在帐目文件上登记,也给学生一张收费收据。要求:1).对以上问题画
19、出数据流程图。(8分)2).画出该培训管理的软件结构图的主图。(8分)四计算例题:1如图所示的程序有三条不同的路径。分别表示为L1(ab)、L2(acd)、L3(ace),或简写为ace、abd、abe及acd。根据判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖和路径覆盖等五种覆盖标准,写出满足相应覆盖标准的最小测试用例组。解:判定覆盖:x = 90, y = 90路径覆盖:x = 90, y = 90x = 50, y = 50 x = 50, y = 50x = 90, y = 70 x = 90, y = 70条件覆盖:x = 90, y = 90条件组合覆盖:x = 90, y =
20、90x = 50, y = 50x = 90, y = 70x = 80, y = 70x = 90, y = 30x = 70, y = 90x = 70, y = 90x = 30, y = 90判定-条件覆盖:x = 90, y = 90x = 70, y = 70 x = 50, y = 50x = 50, y = 50 x = 80, y = 70x = 50, y = 50 x = 70, y = 902下面是快速排序算法中的一趟划分算法,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V
21、i的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ): int Partition ( datalist &list, int low, int high ) /在区间 low, high 以第一个对象为基准进行一次划分,k返回基准对象回放位置。int k = low; Element pivot = list.Vlow; /基准对象for ( int i = low+1; i = high; i+ ) /检测整个序列,进行划分if ( list.Vi.getKey ( ) pivot.getKey( ) & + k != i ) Swap ( list.Vk, li
22、st.Vi );/小于基准的交换到左侧去Swap ( list.Vlow, list.Vk );/将基准对象就位 return k; /返回基准对象位置 (1) 试画出它的程序流程图; (2) 试利用路径覆盖方法为它设计足够的测试用例(循环次数限定为0次,1次和2次)。解:(1) (2)3设要对一个自动饮料售货机软件进行黑盒测试。该软件的规格说明如下: “有一个处理单价为1元5角钱的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”、“雪碧”或“红茶”按钮,相应的饮料就送出来。若投入的是2元硬币,在送出饮料的同时退还5角硬币。” (1) 试利用因果图法,建立该软件的因果图; (2) 设
23、计测试该软件的全部测试用例。解:(1) (2)4如果对一个长度为100000条指令的程序进行集成测试期间记录下面的数据:a. 7月11日:集成测试开始,没有发现错误。b. 8月2日:总共改正了100个错误,此时MTTF=0.4h。c. 9月1日:总共改正了300个错误,此时MTTF=2h。(1)估计程序中的错误总数。(2)为使MTTF达到10h,必须测试和调试这个程序多长时间?解:(1)因为:所以:得K=1000,ET=350。所以程序中的错误总数约为250个。(2)设MTTF=10则: 由可靠性累积曲线EC (t) = ET (1-e-K1 t ),得 100 = 350 (1-e-160K
24、1) 300 = 350 (1-e-320K1) 因此,3-3*e-160K1 = 1-e-320K1 2 = 3*e-160K1- e-320K1 设 x = e-160K1 有 x2 3x + 2 = 0解得 x1 = 2,x2 = 1, K1 = ln(x1)/(-160) = - 0.693/160 =0.00433。因为ln(x2)/(-160) = 0,舍去代入:340 = 350 (1-e-K1 t ) = 350(1-e-0.00433 t ) 350e-0.00433 t = 10 t = (ln(35)/0.00433= 821 (小时) 因此求得为使MTTF = 10,测
25、试和调试该程序需要花费821小时。五软件工程心得体会 (一)纸上得来终觉浅,觉知此事要躬行理论知识用于指导实践,亲身体验才能领悟软件工程的妙用。虽然软件工程这门课程没有安排实验课时,课后却要花费大量的时间去实践。我感觉到学习这门课花费了大量的时间思考,从而换取了宝贵的经验。学习软件工程的过程是痛苦的,它已经不单纯是一种思想,而是处世的态度。开发软件必须严谨求实,脉络清晰,还需要那么一点点敬业精神,牺牲部分休息娱乐的时间。运用工程学的思想开发软件,就要跳出原本只注重编程的狭隘圈子,从宏观上把握软件的生命周期,强调整体性与协调性,不能任意妄为。特别是需求分析、总体设计和详细设计阶段的工作,更要做到
26、细致、准确,为后期工作做好铺垫。(二)吾生也有涯,而知也无涯学习永无止境,在以后还需加强的方面有:1分工合作:起初,对软件工程处于一知半解的状态,分工比较混乱。在划分模块后明确了各自分工,渐渐形成良性循环。团队合作十分重要,争议固然存在,但通过讨论、协商,群策群力,在不断磨合中能够达成一致与默契。团队成员中能力各有高下,互相尊重,各取所长,不宜妄自菲薄。组长多加协调,组员积极配合,才能合作愉快。2学习能力:学习能力体现在能尽快接受新的知识,顺应变化,学为所用。树立终身学习的理念,摸索有效的学习方式。MSDN的中文网站就是我学习的得力助手,给予我很多帮助。此外,在开小组讨论会时,大家各抒己见,也
27、开阔了我的思路。3有关系统:文档不够详尽,导致标准不统一。模块集成时,做出来的半成品与原本的设计方案有出入。调试时出现了一些小问题,而个别次要的模块还未开发。设计仍有不太合理处,需要进行完善性维护。六软件工程的三段论起源及发展趋势软件工程(Software Engineering,简称为SE)是针对软件这一具有特殊性质的产品的工程化方法。软件工程涵盖了软件生存周期的所有阶段,并提供了一整套工程化的方法,来指导软件人员的工作。一、软件工程定义“工程”是科学和数学的某种应用,通过这一应用,使自然界的物质和能源的特性能够通过各种结构、机器、产品、系统和过程,成为对人类有用的东西。因而,“软件工程”就
28、是科学和数学的某种应用,通过这一应用,使计算机设备的能力借助于计算机程序、过程和有关文档成为对人类有用的东西。 软件工程的成果是为软件设计和开发人员提供思想方法和工具,而软件开发是一项需要良好组织,严密管理且各方面人员配合协作的复杂工作。软件工程正是指导这项工程的一门科学。软件工程在过去一段时间内已经取得了长足的进展,可以说在软件的开发和应用中起到了其应有的作用。高质量的软件工程可以保证软件工业中生产的软件是高质量的产品、用户满意的产品。但是,对软件工程的界定,总是存在一定的差异。软件工程应该包括哪些知识?这里我们引用 IEEE在软件工程知识体系指南(SEWBOK:Guide to the S
29、oftware Engineering Body of Knowledge 2004Version)中的定义,它是这样定义软件工程的:1)软件开发、实施、维护的系统化、规范化、质量化的方法的应用,也就是软件的应用工程2)对上述方法的研究。IEEE的软件工程知识体系指南(SWEBOK)中界定了软件工程的10个知识领域(KAs:Knowledge Areas)即软件需求(Software requirements)、软件设计(Software design)、软件构建(Software construction)、软件测试(Software testing)、软件维护(Software maint
30、enance)、软件配置管理(Software configuration management)、软件工程管理(Software engineering management)、软件工程过程(Software engineering process)、软件工程工具和方法(Software engineering tools and methods)和软件质量(Software qualITy)。这10个知识领域的每个知识领域还包括很多子领域。二、软件工程起源的三段论这里的三段论是指从时间角度看软件工程起源的三个阶段。本世纪中期软件产业从零开始起步,在短短的50年的时间里迅速发展成为推动人类社
31、会发展的龙头产业。随着信息产业的发展,软件对人类社会性越来越重要。软件发展的五十年历史中,人们对软件的认识经历了一个由浅到深的过程。第一个写软件的人是Ada(Augusta Ada Lovelace),在1860年代他尝试为Babbage(Charles Babbage)的机械式计算机写软件。尽管失败了,但他将永远载入了计算机发展的史册。1950年代,软件伴随着第一台电子计算机的问世诞生了。以写软件为职业的人也开始出现,他们多是经过训练的数学家和电子工程师。1960年代美国大学里开始出现授予计算机专业的学位,教人们写软件。 软件发展的历史可以大致分为如下的三个阶段:第一个阶段是1950年代到1
32、960年代,是程序设计阶段,基本是个体手工劳动的生产方式。这个时期,一个程序是为一个特定的目的而编制的,软件的通用性很有限的。软件往往带有强烈的个人色彩。早期的软件开发没有什么系统的方法可以遵循,软件设计是在某个人的头脑中完成的一个隐藏的过程。而且,除了源代码往往没有软件说明书等文档,因此这个时期尚无软件的概念,基本上只有程序、程序设计概念,不重视程序设计方法,主要是用于科学计算,规模很小、采用简单的工具(基本上采用低级语言),硬件的存储容量小、运行可靠性差。 第二阶段是1960年代到1970年代,是软件设计阶段,小组合作生产方式。在这一时期软件开始作为一种产品被广泛使用,出现了“软件作坊”。
33、这个阶段,基本采用高级语言开发工 具,开始提出结构化方法。硬件的速度、容量、工作可靠性有明显提高,而且硬件的价格降低。人们开始使用产品软件(可购买),从而建立了软件的概念。程序员数量猛增,但是开发技术没有新的突破 ,软件开发的方法基本上仍然沿用早期的个体化软件开发方式,软件需求日趋复杂,维护的难度越来越大,开发成本令人吃惊地高,开发人员的开发技术不适应规模大、结构复杂的软件开发,失败的项目越来越多。第三个阶段是从1970年代止今,为软件工程时代 ,是工程化的生产方式。这个阶段的硬件向超高速、大容量、微型化以及网络化方向发展,第三、四代语言出现。数据库、开发工具、开发环境、网络 、分布式、面向对
34、象技术等工具方法都得到应用 。软件开发技术有很大进步,但未能获得突破性进展,软件开发技术的进步一直未能满足发展的要求。软件的数量急剧膨胀,一些复杂的、大型的软件开发项目提出来了,在那个时代,很多的软件最后都得到了一个悲惨的结局。很多的软件项目开发时间大大超出了规划的时间表,一些项目导致了财产的流失,甚至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大,在软件开发中遇到的问题找不到解决的办法,使问题积累起来,形成了尖锐的矛盾,失败的软件开发项目却屡见不鲜,因而导致了软件危机。 软件危机指的是在计算机软件的开发和维护过程中所遇到的一系列严重问题。概括来说,软件危机包含两方面问题
35、:一、如何开发软件,以满足不断增长,日趋复杂的需求;二、如何维护数量不断膨胀的软件产品。落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。最为突出的例子是美国IBM公司于1963年1966年开发的IBM360系列机的操作系统。难怪该项目的负责人Fred Brooks(F?D?希罗克斯)在总结该项目时无比沉痛地说:“正像一只逃亡的野兽落到泥潭中作垂死挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难,程序设计工作正像这样一个泥潭一批批程序员被迫在泥潭中拼命挣扎,谁也没有料到问题竟会陷入这样的困境。” IBM360操作系统的历史教训已成为软件开
36、发项目中的典型事例被记入历史史册。由于软件危机的产生,迫使人们不得不研究、改变软件开发的技术手段和管理方法。从此软件生产进入软件工程时代。1968年北大西洋公约组织的计算机科学家在联邦德国召开的国际学术会议上第一次提出了“软件危机”(software crisis)这个名词。同时,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程(software engineering)这个概念,从此一门新兴的工程学科-软件工程学-为研究和克服软件危机应运而生。“软件工程”的概念是为了有效的控制软件危机的发生而被提出来的,它的中心目标就是把软件作为一种物理的工业产品来开发,要求“采用工程化的
37、原理与方法对软件进行计划、开发和维护”。软件工程是一门旨在开发满足用户需求、及时交付、不超过预算和无故障的软件的学科。软件工程的主要对象是大型软件。它的最终目的是摆脱手工生产软件的状况,逐步实现软件开发和维护的自动化。我们要求工程目标能在一定的时间、一定的预算之内完成。软件工程是针对软件危机提出来的。从微观上看,软件危机的特征正是表现在完工日期一再拖后、经费一再超支,甚至工程最终宣告失败等方面。而从宏观上看,软件危机的实质是软件产品的供应赶不上需求的增长。自从软件工程概念提出以来,经过几十多年的研究与实践,虽然“软件危机”没得到彻底解决,但在软件开发方法和技术方面已经有了很大的进步。尤其应该指
38、出的是,自80年代中期,美国工业界和政府部门开始认识到,在软件开发中,最关键的问题是软件开发组织不能很好地定义和管理其软件过程,从而使一些好的开发方法和技术都起不到所期望的作用。也就是说,在没有很好定义和管理软件过程的软件开发中,开发组织不可能在好的软件方法和工具中获益。三、软件工程内容的三段论这里的三段论是指从内容角度看软件工程的三段理论。软件工程是为克服软件危机而提出的一种概念,并在实践中不断地探索它的原理,技术和方法。在此过程中,人们研究和借鉴了工程学的某些原理和方法,并形成了软件工程学。软件工程的目标是提高软件的质量与生产率,最终实现软件的工业化生产。既然软件工程是“工程”,那么我们从
39、工程的角度看一下软件项目的实施过程,如图1所示。客户的需求起动了一个软件项目,为此我们需要先规划这个项目,即完成项目计划,然后根据这个项目计划实施项目,项目实施的依据是需求,这个需求类似工程项目的图纸,开发人员按照这个图纸生产软件即设计、编码,在开发生产线上,将开发过程的半成品,通过配置管理存储和管理,然后进行必要的集成和测试,直到最后提交给客户。在整个开发过程中需要进行项目跟踪管理。软件工程活动是“生产一个最终满足需求且达到工程目标的软件产品所需要的步骤”。这些活动主要包括开发类活动、管理类活动和过程类活动,这里将它定义为“软件工程的三段论”,或者“软件工程的三线索”。一段论是“软件项目管理
40、论”,二段论是“软件项目开发论”,三段论是“软件过程改进论”。这个三段论可以用一个三角型表示, 如图2,它们类似于相互支撑的三角形的三个边。我们知道三角形是最稳定的,要保证三角形的稳定性,三角形的三个边必不可少,而且要保持一定的相互关系。其中:开发过程是软件人员生产软件的过程,例如需求分析、设计、编码、测试等,相当于生产线上的生产过程。管理过程是项目管理者规划软件开发、控制软件开发的过程,相当于生产线上的管理过程,管理过程是伴随开发过程进行的过程。过程改进相当于对软件开发过程和软件管理过程的“工艺流程”进行管理和改进,如果没有好的工艺生产不出好的产品,它包括对开发过程和管理过程的定义和改进。为
41、了保证软件管理、软件开发过程的有效性,应该保证这些过程的高质量和过程的持续改进。为此我在软件工程的系列教程书中分三册,以案例贯穿讲述了软件项目管理过程、软件项目开发过程、软件过程改进。传统工业中知名的生产方式可算是“手工作坊式”生产方式。过去的一段时间里,甚至到现在,中国软件业中还有一部分公司的开发方式与之类似。公正地说,以此方式还是成就了好多成功的应用开发项目,甚至可以说此法支撑起了软件开发的初期事业。但是,在我们的“作坊”里还有太多的项目失败,例如开发周期的不可控制、项目结果为用户所不认可、项目最终的严重亏损,这种失败的惨痛出乎我们的意料,以至于我们无所适从。再加上技术人员、资金严重匮乏的
42、困扰,软件开发管理举步维艰。作坊式的软件企业中,很多方法、规则都是装在开发人员的脑子里面的,往往会因为一两个开发骨干走了,就造成整个公司的瘫痪。赌注完全押在这一两个人的身上,资本投入风险很大,如果研发骨干另谋高就,公司投资就将全部付之流水,作坊式的运作模式严重阻障了软件企业的成长。让软件工程成为真正的工程,就需要软件项目的开发、管理、过程等方面规范化、工程化,工艺化,机械化。软件开发过程中脑力活动的“不可见性”大大增加了过程管理上的困难。因此软件工程管理中的一项指导思想就是千方百计地使这些过程变为“可见的”以及事后可以检查的记录。只有从一开始就在开发过程中严格贯彻质量管理,软件产品的质量才有保
43、证。否则,开发工作一旦进行到后期,无论怎样通过测试和补漏洞,都会无济于事。四、软件工程的发展状况和趋势软件工程的研究热点是随着软件技术的发展而不断变化的。即便在软件工程的领域内,研究热点也在不断转移。以往软件工程一直不能像其他产品一样,做到标准化,但是,随着技术条件的不断成熟,相应标准的出台,软件人员已经开始重视这方面的工作。实际上可以将许多软件工作分成许多部件去构造。很有可能今后的软件队伍会分为两个部分,一部分专门从事评估,另一部分专门从事集成,集成的对象是软构件。软构件的开发与运用刚刚开始。在一些公共领域,例如软件的用户界面,通用软构件的使用已经屡见不鲜。然而,对于各行各业的专业领域来说,
44、领域构件的开发和使用还是基本处于空白状态。这一工作的进行,一方面意味着各行各业对本专业领域内的知识形态加以归纳整理,然后以最新的软件形式表达出来。如果全面铺开,就是一件规模浩大的社会工程,需要各行各业的领域专家和软件专家通力合作才能完成。如果软件生产的“构件-集成”格局的趋势成为现实,各种应用领域里的构件的设计与生产将开辟出一个十分广阔的新天地,产生出巨大的市场需求,而且软构件的使用可以渗透到符合软构件标准规范的所有系统中,在软件开发过程中人们开始研制和使用软件工具,用以辅助进行软件项目管理与技术生产,人们还将软件生命周期各阶段使用的软件工具有机地集合成为一个整体,形成能够连续支持软件开发与维
45、护全过程的集成化软件支援环境,以期从管理和技术两方面解决软件危机问题。此外,人工智能与软件工程的结合成为80年代末期活跃的研究领域。基于程序变换、自动生成和可重用软件等软件新技术研究也已取得一定的进展,把程序设计自动化的进程向前推进一步。在软件工程理论的指导下,发达国家已经建立起较为完备的软件工业化生产体系,形成了强大的软件生产能力 。软件标准化与可重用性得到了工业界的高度重视,在避免重用劳动,缓解软件危机方面起到了重要作用。五、结束语在现代社会中,软件应用于多个方面。同时,各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。这些应用促进了经济和社会的发展,使得人们的工作
46、更加高效,同时提高了生活质量。随着现代信息技术的飞速发展,软件产品的规模也越来越庞大,而软件开发规模也导致开发队伍的逐渐增大,如果没有规则,每个人都有自己的一套方式,甚至有的人有几套方式。这样,当几个人在一起开发软件的时候,最终的结果就只能是一片混乱。这就意味着我们迫切地需要一种管理规范来规范每个软件人员的工作,使每个项目组成员按照约定的规则准时完成自己的工作。而软件工程,就是这样一套用于软件的团队开发、以提高软件质量和程序员工作效率为目的的规范。首先,我们要注意到,其他工业领域里的工程的建设目标(比如建设一座桥梁)以及工程在整个工期内所处的环境是相对固定的。而软件工程则不然。众所周知,许多软件项目(例如MIS)的用户往往说不清楚自己的需要是什么。不仅如此,由于技术进步,由于软件的使用改变了用户的工作环境,由于用户周围环境的变迁,由于用户自身对软件的功能和使用软件带来益处的认识的加深,软件工程的建设目标在工程进行期间就会不断地变更。另外,传统工业能够在相当短的时期内建立起一套与供应商无关的部件分解体系以及与之相应的、受到全社会承认的工业标准,从而形成了严密而有效的社会分工体系。而对于软件产业来说,在很长的时期里,每一项开发工作几乎都要从头做起。软件部件的重复利用处于很低的水平。开发者很少能