2017-2-3
软件开发最初始是规模较小的程序,编写者和使用者是同一个人。
软件工程面对的问题:
1、产品很多时候根本不是用户想要的。
2、开发成本和进度难以估计。前期的估算到后期演变为指数级都常见。为了时间或成本进度而权宜之计常常影响产品质量。
3、软件产品的质量靠不住。软件质量保证技术如审查、测试因为主观或客观原因没有完全运用。
4、软件常常是不可维护的。缺乏乏文档资料。
软件危机的原因:软件本身的属性;开发和维护的方法不科学。
属性:
12软件不同阶段进行修改的成本差异巨大。越前成本越低。
软件是程序、数据以及相关文档的集合。程序是能完成预定功能和性能的可执行的指令序列。数据是程序能处理信息的数据结构。文档是开发使用和维护程序所需要的图文资料。
软件工程的中心课题是控制复杂性。把问题分解,各个部分是可理解的,各个部分保持简单的通信关系。这种方式不能降低整体复杂性,但是可变成可管理的。如何协作,明确规定每个人的责任和相互通信的方法,标准和规章。
软件工程师常常缺乏应用领域的相关知识。产品经理。
开发人员应该少而精,素质高。
软件工程包括技术和管理两方面,是技术和管理紧密结合的工程学科。所谓的管理就是通过计划、组织和控制,合理配置和使用资源达到既定的目标。
传统的方法是一个阶段一个阶段的顺序推进。前一个阶段的完成是后一个阶段的前提和基础。需要严格的管理复查才算结束。需要高质量的文档资料。优点是有条不紊,保证质量,提高可维护性,极大的提高成功率。缺点是当规模庞大,以及对软件需求模糊或随时间变化需求往往难以沿用。
传统方法是强调自顶向下顺序完成各个阶段的任务,一开始对于整体有相当明确的定义,然而人类的认知是一个渐进的过程。人的认知需要在继承已有的知识基础上,经过多次反复才能逐步深化,人的认知深化过程包括了从一般到特殊的演绎过程,也包括了特殊到一般的归纳思想。
面向对象的基本原则是尽量模仿人类的习惯,使开发软件的方法和过程接近人类认知世界,解决问题的方法和过程,从而使描述问题的问题空间与实现解法的解空间在结构上一致。
面向对象将数据和行为结合。
面向对象的方法是一个主动反复迭代的演化过程,面向对象的类即为特殊到一般的归纳思想,通过继承建立的等级体系即为一般到特殊的演绎过程。
面向对象的优点是促进了软件复用重用。面向对象的特点:抽象,继承,封装,多态性。
2017-2-4
软件生命周期:
1、软件定义时期
需求分析,定义解决的问题,定义目标系统,产品需求说明书。产品经理职责。
2、软件开发时期
总体设计是在较抽象的高层次上进行分析和设计问题。一个系统应该是由若干个规模适中的模块按合理的层次结构组织而成,总体设计需要确定系统由哪些模块构成以及模块间的关系。以较为抽象的概括方式提出了解决问题的方法。
详细设计是把总体设计的方案具体化。详细的规格说明。模块设计,详细的设计模块,确定模块功能的算法和数据结构。
编码和单元测试。
综合测试。集成测试和验收测试。集成测试是把通过了单元测试的模块按照某种策略组织起来,在装配过程中进行测试。验收测试是对需求分析阶段确定的系统交由用户进行测试验收。
3、软件维护时期
提出维护需求,分析维护需求,提出方案,确定方案,修改设计,修改程序,测试程序,复查验收。实际上是压缩和简化的软件工程。
常见的软件模型:
1、瀑布模型
需求分析验证、规格说明验证、设计验证、编码验证、综合测试、维护。
优点:强迫开发人员用规范的方法,每个阶段都被验证,每个阶段提交高质量文档,软件维护有基础。
缺点:在产品交付用户以前,用户只能通过文档了解产品是怎样的。事实证明,当用户开始接触一个软件,在头脑中关于该软件应该做什么的想法或多或少的会变化,当初提出的需求不完全适用了。要求用户不经过实践就完全提出准确完全的需求是不切实际的。瀑布模型完全依赖文档规格说明,可能导致最终的软件产品不是用户想要的。
2、快速原型模型
快速建立可以运行的原型,它所完成的功能往往是产品所有功能的子集。让用户使用,提出修改意见以后迅速迭代,再次使用。一旦用户认为原型系统可以完成工作,即开始编写文档,并根据文档进行开发。原型系统是通过与用户交互得到验证的。
采用瀑布模型和快速原型模型,目标都是一次把满足所有需求的产品提供给用户。
3、增量模型
把软件看作一系列的增量进行设计、编码、集成和测试。如第一个构件完成软件的最核心功能,之后的构件不断累加。增量模型逐步的分批提交产品。构件规模适中。
在实际工作中,增量模型的设计需要更加开放的设计,这是非常困难的。有构件无法集成在一起的风险。最好的是能在实现构件之前就完成所有的分析设计工作。
4、螺旋模型
适用于开发大规模的软件项目。项目越大,风险越大,进行风险分析必要性越大。螺旋模型是风险驱动的,管控风险也是异常困难的事情。
使用原型来降低风险,增加了风险分析过程的快速原型模型。
最佳实践建议:
1、迭代开发,线性开发不适用,一方面不可能开发大复杂的系统,同时需求常常变更。因此需要通过一系列细化和渐进反复过程得到有效解决方案的迭代方法。
2、管理需求。确定系统需求是一个连续的过程。
3、使用基于构件的体系结构。构件是功能清晰的模块或子系统。
4、可视化建模。模型是为了理解事物而对事物进行的抽象,可视化图形更易理解。
5、验证软件质量。质量评估贯彻开发过程,全员参与。
6、控制软件变更。修改都是可接受和可跟踪的。
迭代和渐增的思路。
敏捷过程:
1、可以工作的软件胜过面面俱到的文档。
2、客户合作胜过合同谈判,满足用户不断变更的需求。
3、响应变化胜过遵循计划。计划有灵活性和可塑性。
4、优先致力于构建开发团队,包括成员和交互方式,再根据需要配置项目过程和工具。
极限编程是敏捷过程中最有名的。极限指的是把好的开发实践运用到极致。广泛运用于需求模糊且经常变动的场合。
特点:
1、客户作为开发团队的成员。客户与开发紧密配合,客户负责确定需求,回答问题,验收。
2、短交付周期。两周一次迭代,交互目标系统可工作的版本,不断演示迭代生成的系统获得反馈意见。
3、结对编程,测试驱动开发。先有好的测试方案然后再编程,所有的测试工作完成了才算工作完成。
4、集成所有。程序代码归所有人所有,任何人都有修改代码的权利,全体成员对所有代码负责。
5、持续集成。多次集成系统,随着需求的变更,不断回归测试。
6、可持续开发速度,能维持长期稳定的速度,开放的工作空间,全体成员在开放场所工作,随时自由交流讨论。
7、及时调整计划。计划是灵活和循序渐进的。
8、重构。代码重构是在不影响系统行为的前提下,重新调整和优化系统的内部结构,降低复杂性,消除冗余,增加灵活性,提高性能。不要过分依赖重构,前期重设计。
面对变化和不确定性更加快速敏捷,能快速持续迭代渐增。
2017-2-5
分层,面对复杂的系统,比较好的方法是分层次的描述系统。分层的描述方式是从抽象到具体的过程逐步深入了解一个复杂的系统。
首先用系统流程图描述系统总体概貌,表明系统的关键功能。然后分别把关键功能扩展为适当的详细程度,画在单独的空间。
系统流程图:数据在系统各个部件之间的流动情况。部件(程序、文档、数据库、人工过程等)
数据流图:描述信息流和数据从输入移动到输出的过程总所经受的变换。考虑数据的起点和终点,考虑数据存储,任何改变数据的操作是处理。只描述数据在软件中的流动和被处理的逻辑过程。只需考虑系统必须完成的逻辑功能,不用考虑具体实现。
状态转换图:通过描述系统的状态以及引起系统状态转换的事件来表示系统的行为。
按照形式化的程度,可以把软件工程使用的方法划分为非形式化,半形式化和形式化三类。自然语言来描述需求规格说明是非形式化方法,数据流图或实体联系图来建立模型是半形式化方法。描述系统性质是基于数学基础的则是形式化方法。 自然语言描写规格说明书可能出现矛盾,二义性,含糊,不完整,抽象层次混乱的问题。 2017-2-6 总体设计,设计软件结构,确定由哪些模块构成以及模块间的关系。模块处于黑盒级别。 总体设计阶段产生逻辑模型,分析物理实现方案以后根据最优方案实现。 设计软件结构:通常程序的一个模块完成一个适当的子功能,应该把模块组织成良好的层次系统,顶层模块调用下层模块,下层调用更加下层,最下层的完成具体功能。
2017-2-7 具有独立功能,与其他模块之间没有过多的相互作用的模块极为模块独立。独立的模块易于测试和维护,错误传播范围小。评判模块独立有两个定性标准度量,内聚和耦合。耦合衡量不同模块之间互相依赖(连接)的紧密程度。内聚是模块内元素结合紧密程度。 低耦合便于研究、测试维护任意模块不需要对其他的模块了解太多。由于模块间的联系简单,因此错误传播范围小。一个模块与另外的模块完全无关就是无耦合。数据耦合:模块间通过参数传递数据。控制耦合:模块间传递的信息包括控制信息。数据耦合是低耦合,控制耦合是中等程度的耦合,增加了系统的复杂情况。控制耦合往往是多余的,把模块适当的分解往往可以用数据耦合取代。 总体设计基本目的是用抽象概括的方式确定系统如何完成预定的任务。
2017-2-10 面向对象的基本原则和思想,尽可能模仿人类的思维方式,模仿人是怎么认识世界和解决问题的方法和过程,描述问题的问题空间和实现解法的解空间在结构上尽可能一致。 客观世界的问题是由客观世界的实体以及实体之间的相互关系构成的。客观世界的实体既有静态的属性,又有动态的行为。 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!