软件工程心得体会

读软件工程案例教程有感

对于学习软件工程这门课程,我认为有许多东西要学习。其实在我看来学习这门课程的精髓是学习一种方法。是一个如何去分析和处理问题的过程,应该说其范畴已经远远不止局限于该门课程,成为了一个综合的一个能够解决问题的思想集合。读完软件工程案例教程这本书,我觉得自己受益匪浅。

整本书的内容逻辑很清晰明了,由浅入深循序渐进,首先我就大概描述下我们所学的内容,第一章是从整体分析软件工程这门学科的发展和所处的社会环境,接着后面的几章深入分析了软件开放过程和模式、软件项目管理、计算机工程、需求分析、结构化分析建模以及基于UML面向对象分析建模和测试等。 对于这本书我主要对需求分析和测试比较感兴趣,在这我要着重的谈一些自己的心得体会以及自己的看法。

一.需求分析

1.1需求分析的重要性

一款成功的软件是建立在成功的需求分析之上的,而高质量的需求来源于用户与开发人员之间有效的沟通与合作。当用户有一个问题可以用计算机系统来解决,而开发人员开始帮助用户解决这个问题,沟通就开始了。由此我们可以看出需求分析的重要性。

需求获取可能是最困难、最关键、最易出错及最需要沟通交流的活动。对需求的获取往往有错误的认识:用户知道需求是什么,我们所要做的就是和他们交谈从他们那里得到需求,只要问用户系统的目标特征,什么是要完成的,什么样的系统能适合商业需要就可以了,但是实际上需求获取并不是想象的这样简单,这条沟通之路布满了荆棘。首先需求获取要定义问题范围,系统的边界往往是很难明确的,用户不了解技术实现的细节,这样造成了系统目标的混淆。

其次是对问题的理解,用户对计算机系统的能力和限制缺乏了解,任何一个系统都会有很多的用户或者不同类型的用户,每个用户只知道自己需要的系统,而不知道系统的整体情况,他们不知道系统作为一个整体怎么样工作效率更好,也不太清楚那些工作可以交给软件完成,他们不清楚需求是什么,或者说如何以一种精确的方式来描述需求,他们需要开发人员的协助和指导,但是用户与开发人员之间的交流很容易出现障碍,忽略了那些被认为是"很明显"的信息。最后是

需求的确认,因为需求的不稳定性往往随着时间的推移产生变动,使之难以确认。为了克服以上的问题,必须有组织的执行需求的获取活动。

1.2需求分析的原则

(1)需求分析必须能够表达和理解问题的数据域和功能域。数据域包括数据流、数据内容和数据结构,而功能域反映上述 3 方面的控制信息。

(2)需求分析要把一个复杂问题按功能进行分解并逐层细化。通常,软件系统要处理的问题如果太大、太复杂就很难理解,若划分成几部分,并确定各部分间的接口,就可完成整体的功能。在需求分析过程中,软件系统的用户需求中的数据、功能和行为都应细化。

(3)需求建模。模型可以帮助系统分析人员更好地理解软件系统的数据、功能和行为,这些模型是软件工程中下一阶段进行系统设计的基础。

1.3需求分析的注意事项

(1)确定详细的需求,否则经费就算不准。经费估计错误的原因多为:用户需求频繁变动、遗漏重要需求、与用户交流不够、需求规格说明书质量低劣、需求分析不充分等。

(2)在编写需求规格说明书之前,应明确要解决的问题。在试图解决问题之前,要保证已考察了全部可替代的方案。要搞清哪地方有问题,真正的问题出在哪里。这样,在编写需求规格说明书时做到有的放矢,把存在的问题暴露出来。

(3)立即确定需求,并记录下该需求的背景。没有明确问题,就进行下一步的设计,想回避矛盾,可能会带来更大的问题。用户不确定需求,软件设计人员自己决定需求,将会带来严重的问题。为了避免将来可能出现的问题和软件工程项目能够尽快地进入到下一个阶段的系统设计中,要尽可能迅速地把用户需求确定下来。任何决定总比没有决定要好。

(4)一旦在需求规格说明书中发现问题,立即改正。如果把存在的问题拖延到系统设计阶段去改正,就可能要花数倍的时间和精力才能纠正同一错误。

(5)在众多用户需求中确定各个需求的优先顺序,并确定可能存在的子集,以便为软件设计、实施和项目管理等后续阶段提供有利条件。

(6)需求分析时,不要进行系统设计的工作。需求分析的主要目的是确定软件系统的外部特征,充分反映软件系统应有的面貌,便于让软件设计人员根据

用户需求,去全面地考虑软件系统的体系结构、算法等。在需求分析阶段要集中精力解决用户需求存在的问题,尽可能避免产生遗留问题。

(7)对于复杂的软件系统,要从多种视角进行需求分析。根据软件系统的本质,切合实际地组织多种视角的需求。例如,可从根据用户的类型,或根据响应的类型,或根据对象的软件工程案例教程类型,或根据系统的模式等视角来组织用户需求。通过多个视角来研究用户需求问题,把可得到的不同的“投影”组合起来形成完整系统的描述。当试图从整体观点来描述软件系统发生困难,或者有可能发生错误,或者很有可能遗失软件系统的某些特性。而从不同的视角来 描述软件系统,因为每个视角限制了研究的范围并能够将注意力集中于此,所以很容易保证所研究的问题是真正完整的。

(8)重视形式化方法,但不放弃自然语言。为了用户需求表达的精确性和方便用户的可理解性,一个好方法是把自然语言的表达与形式化规格说明并立,互相对照,而且在一般情况下,先用自然语言写出,再给出它的形式模型。

(9)用户需求中不应存在“待确定”的条款。如若有这种需要,应同时说明:何时由谁来解决该问题。

1.4用户需求的类型

需求分析是从用户最初的非形式化需求到满足用户要求的软件产品的映射过程。它实际上是一个对用户意图不断进行揭示和判断的过程,其目的在于细化、精化软件的作用范围,确定拟开发软件的功能和性能、约束、环境等。可将用户的需求分为两大类:功能性需求和非功能性需求。

(1)功能性需求。功能性需求主要说明了系统各功能部件与环境之间的相互作用的本质,即拟开发软件在职能上实际应做到什么。一般来说,它是用户最主要的需求,通常包括系统的输入、系统能完成的功能、系统的输出以及其他反应。在功能性需求中还应包括备选功能的定义识别。

(2)非功能性需求。非功能性要求主要从各个角度对所考虑的可能的解决方案起约束和限制作用。

1.5需求分析的方法

在软件工程中,常用的需求分析方法有面向数据流的结构化分析方法(简称 SA)和面向对象的分析方法(简称 OOA)。此外,还有以用户为中心的需求分析

方法。这些方法都采用图文结合的方式,可以直观地描述软件的逻辑模型。这里仅介绍结构化分析方法和以用户为中心的需求分析方法。

2.软件测试

2.1软件测试概述

软件本身无形态,它是复杂的知识高度密集的逻辑产品,其中不可能没有错误。软件实施工程过程中必须伴随着软件质量保证的活动,而软件测试是主要活动之一。在开发软件的过程中,人们使用了许多保证软件质量的方法分析、设计和实现软件,但难免还会在工作中犯错误。这样,在软件产品中就会隐藏许多错误和缺陷。对于规模大、复杂性高的软件更是如此。在这些错误中,有些是致命的错误,如果不排除,就会导致生命与财产的重大损失。

2.2软件测试的目的

测试的目的是“说明程序能正确地执行应有的功能”,还是“表明程序没有错误”?基于不同的立场,存在着两种完全不同的测试目的。从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可以接受该产品。而从软件开发者的角度出发,则希望测试成为表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,确立人们对软件质量的信心。因此,他们会选择那些导致程效概率小的测试用例,回避那些易于暴露程序错误的测试用例。同时,也不会刻意去检测、排除程序中可能包含的副作用。显然,这样的测试对完善和提高软件质量毫无价值。因为在程序中往往存在着许多预料不到的问题,可能会被疏漏,许多隐藏的错误只有在特定的环境下才可能暴露出来。如果不把着眼点放在尽可能查找错误这样一个基础上,这些隐藏的错误和缺陷就查不出来,会遗留到运行阶段中去。如果站在用户的角度,替他们设想,就应当把测试活动的目标对准揭露程序中存在的错误。在选取测试用例时,考虑那些易于发现程序错误的数据。

2.3软件测试的原则

(1)应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。由于原始问题的复杂性、软件的复杂性和抽象性、软件开发各个阶段工作的多样性,以及参加开发各种层次人员之间工作的配合关系等因素,使得开发的每个环节都可能产生错误。所以不应把软件测试仅仅看成是软件开发的一个独立阶段,

而应当把它贯穿到软件开发的各个阶段中。在需求分析阶段就应该制订测试计划,以保证每个需求,每个设计单元都是可测试的,便于测试。坚持在软件开发的各个阶段的技术评审,这样才能在开发过程中尽早发现和预防错误,把出现的错误克服在早期,杜绝某些隐患,提高软件质量。

(2)测试用例应由测试输入数据和与之对应的预期输出结果这两部分组成。测试以前应当根据测试的要求,选择在测试过程中使用的测试用例(Test Case)。测试用例主要用来检验程序员编制的程序,因此不但需要测试的输入数据,而且需要针对这些输入数据的预期输出结果。如果对测试输入数据没有给出预期的程序输出结果,那么就缺少了检验实测结果的基准,就有可能把一个似是而非的错误结果当成正确结果。

(3)程序员应避免检查自己的程序。测试工作需要严格的作风、客观的态度和冷静的情绪。自己测试自己的软件不容易发现错误,程序员应避免测试自己的程序。测试是一种“挑剔性”的行为,人们常常由于各种原因具有一种不愿否定自己工作的心理,认为揭露自己程序中的问题总不是一件愉快的事,这一心理状态就成为测试自己程序的障碍。心理状态和思维定式是测试自己程序的两大障碍,应由别人或另外的机构来测试程序员编写的程序。另外,程序员对软件规格说明理解错误而引入的错误则更难发现。如果由别人来测试程序员编写的程序,可能会更客观、更有效,并更容易取得成功。要注意的是,这点不能与程序的调试(Debugging)互相混淆,调试由程序员自己来做可能更有效。

(4)在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。合理的输入条件是指能验证程序正确的输入条件,而不合理的输入条件是指异常的、临界的、可能引起问题变异的输入条件。在测试程序时,人们常常倾向于过多地考虑合法的和期望的输入条件,以检查程序是否做了它应该做的事情,而忽视了不合法的和预想不到的输入条件。事实上,软件在投入运行以后,用户的使用往往不遵循事先的约定,使用了一些意外的输入,如用户软件工程案例教程 在键盘上按错了键或打入了非法的命令。如果开发的软件遇到这种情况时不能做出适当的反应,给出相应的信息,那么就容易产生故障,轻则给出错误的结果,重则导致软件失效。因此,软件系统处理非法命令的能力也必须在测试时受到检验。用不合理的输件测试程序时,往往比用合理的输入条件进行测试能发现更多

的错误。

小结 :经过一学期的软件工程的学习,深刻感到其重要性的同时也学到了不少的东西 ,将对我在今后的软件开发过程中起极大的作用。

 

第二篇:软件工程心得体会

软件工程心得体会

曾经看过一本书叫《道法自然》,内容略记得一二,但我最欣赏的是它的书名。软件设计没什么太神秘有东西,只要用心体会,其实一切都很自然。软件的设计之“道”,也不在于设计有多么的华丽、精巧,而在于其朴实、自然,最终达到“以无招胜有招”,进入一个全新的境界。

一、软件设计理论的层次

以我的拙见,软件设计领域中的各种概念,可以分为以下几个层次来进行理解:

1、软件设计的目的:重用性、扩展性。

这是最高的层次,是应对软件危机的需要。

2、设计原则:低耦合、高聚合。

各种软件设计的原则,如依赖倒置原则、单一职则原则、面向接口等,以及各种设计模式,其根本的目的其实只是为了降低耦合这么简单。因为只有低耦合才能更好的适应变化,更好的重用和扩展。

3、实现方法:运用设计模式封装变化、降低耦合。

设计模式只是用来“封装变化、降低耦合”的工具而已。它是面向对象设计时代的产物,其本质就是充分运用面向对象的三个特性,即:封装、继承和多态,进行灵活的组合运用。

二、关于耦合

1、耦合的粒度

耦合无论如何也是不可避免的。当我们实现接口、继承父类的时候,就会不可避免的产生耦合。耦合是有不同粒度的,我们解耦到什么粒度为止,我认为应以模块的重用粒度为准。尽量解除重用模块或对象之间的耦合。而重用模块之内的耦合,应属于聚合的范畴,所以不要盲目的去解耦,否则就陷入了误区。

2、解耦的原理

怎样才能解耦呢,或者说为什么各种设计模式能达到解耦的目的呢?我觉得有以下几个思路:

(1)将具体的东西抽象处理

(2)将分散的东西集中处理

而面向对象中的接口、继承正为我们提供了这样的一种机制。通过访问接口或基类或抽象类,而不是具体的实现类,从而与具体的实现类达到了解耦的目的。我们还可以设计一些控制类,像润滑剂一样,协调各实现类之间的访问,也可以达到耦的目的。

事实上,各种设计模式的基本思想也就是这样。创建型模式是为了解除创建对象时产生的耦合,实际上是解除对类称名的依赖,而结构型和行为型是为了解除对象属性或方法的直接调用。不管什么设计模式,都是将对具体实现类的访问提升为对接口、基类或用于协调的控制类的访问。

三、关于接口

这一节更具体,谈一谈接口,因为使用接口是软件设计的重要手段,但已经不属于“道”了~

1、接口与继承

接口描述的是对象某一个方面行为特征。使用接口与使用继承关系各有优缺点,使用子类继承可以继承父类的功能,体现了重用的精神。而接品更加灵活,因为它解除了子类与父类之间的高度耦合,它体现在灵活扩展的精神。

2、接口与纯虚类

理论上接口可以由纯虚基类实现类似的功能,那为什么还我们不去掉接口的概念,而直接使用虚类呢?

接口存在的理由就是它更加灵活,关系简单,易于理解。比如一个类可以实现十几个甚至几十个接口,但一般开发工具只支持单继承(由于多继承太容易导致混乱和冲突),如果要继承十几层,系统结构想必会无法理解了,我以为这是接口存在的最重要的原因。

如果接口和虚类继承结合使用,可以产生强大的威力,这也是许多设计模式的“杀手锏”。

以上算是总结一下自己的心得。肯定有不少片面之处,请各位指教。

相关推荐