#灵感# 记录一下软件工程的相关基础知识。 按马哲的说法,不能光有实践,也需要相关理论。

目录
**定义:**软件工程涉及软件开发、维护、管理等多方面的原理、方法、工具和环境。此篇主要讲软件开发中的基本方法。
已知问题:旧的软件开发主要依赖于开发人员的个人技能、程序设计技巧,缺乏好的方法指导和工具辅助,又缺少相关文档,使得大量已有的软件难以维护。
解决方法:使用工程化的原则和方法来克服软件危机。
软件生存周期:
一个软件产品从孕育、成长、成熟到衰亡这个周期。(解决的问题是什么?是否值得解决?如何去解决这个问题(n个方案权衡利弊)? 设计解决问题的具体方法。测试、维护 )
软件生存周期模型:描述开发的主要阶段、定义每个阶段要完成的活动、规范每个阶段的输入和输出。提供一个框架,使用者可以把必要的活动映射到该框架中。
瀑布模型:适合软件需求很明确的软件项目的模型,以文档为驱动,各个活动依线性顺序连接。
演化模型:快速开发一个原型的基础上,根据客户的意见进行改进,重复这个过程,直到客户满意。任何功能一经开发就可进入测试。(类似的也称为原型模型)
螺旋模型:瀑布模型+演化模型。强调风险分析,适合庞大、复杂且高风险的系统。
喷泉模型:以用户需求为动力,以对象作为驱动的模型。适合于*++面向对象++*的开发方法。特点:多次迭代且各开发活动无明显分界。
再次发现问题的实质:缺乏管理软件过程的能力。
软件能力成熟度模型(CMM):CMM是对软件组织*++进化阶段++*的描述。将软件过程改进分为5个成熟度级别:初始级(杂乱的)、可重复级(有基本的项目管理过程)、已定义级(管理已文档化、标准化)、已管理级(有详细的质量度量标准)、优化级(不断持续地改进)。
软件工具:
辅助软件开发、运行、维护、管理等各活动的软件。
软件开发工具:需求分析、设计、概要设计、编码与排错、测试工具(静态测试、动态测试)。
软件维护工具:版本控制、文档分析、开发信息库、逆向工程、再工程。
软件开发环境:由软件工具集和环境集成机制构成。
集成型开发环境是一种把支持多种软件开发方法和开发模型的软件工具集成在一起的软件开发环境。
---------------·★₊˚☾.˖ 🤍 ·˖✶------------------------------·★₊˚☾.˖ 🤍 ·˖✶---------------
软件需求分析:
开发人员与用户之间广泛交流,形成一个一致的、清晰的、完整的需求说明。
软件需求包含3方面:功能需求(具体功能)、非功能需求(可靠性、性能等)、设计约束(一些限制条件)。
常用的分析方法:面向数据流的结构化分析方法、面向对象的分析方法、面向数据结构的分析方法。
软件设计:分概要设计和详细设计两个步骤。
概要设计:
(1)设计总体结构:将一个复杂的系统按功能划分成模块,确定每个模块的功能、确定模块之间的调用关系、确定模块之间的接口(模块之间传递的信息)、评价模块结构的质量。
(2)数据结构的设计。数据库的设计:概念设计(用E-R图表述数据模型)、逻辑设计、物理设计。
(3)编写设计文档(概要说明书、数据库设计说明书、用户手册)、评审。
详细设计:详细的算法设计,细化成很容易从中产生程序的图纸。
设计原则:抽象、模块化、信息隐蔽(A 模块对于B模块是不能访问的)、模块独立(高内聚、低耦合)。
A-结构化分析与设计方法:
面向数据流,有计划、有步骤地进行。"自顶向下,逐层分解"。
结构化分析的结果:
- 一套分层的数据流图,描述数据流从输入到输出的变换流程;
- 一本数据字典,描述数据流图中的每个数据流、文件以及组成数据流或文件的数据项。
- 一组小说明(加工逻辑),用来描述每个基本价格的加工逻辑。
结构化设计方法:将结构化分析得到的数据流图 映射成软件体系结构的一种设计方法。用"结构图"来描述软件系统的体系结构,基本组成成分有模块、调用、数据。
- 模块:有一定基本功能的程序语句,是程序的基本单元。
- 数据:用短箭头表示,空心代表传递数据,实心代表传递控制信息。
- 调用:一个模块指向另一个模块的箭头,表示前者调用了后者。
结构化程序设计方法:采用自顶而下、逐步求精的程序设计方法。使用3种基本控制结构来构造出程序,(顺序、选择、重复)这3种基本结构的共同点是单入口、单出口。
-A结束
B-面向对象分析与设计方法:
一种主要且实用的软件开发方法。以客观世界中的对象为中心,采用符合人们思维方式的分析、设计思想,其分析设计的结果也与客观世界的实际情况相接近,因此容易被人们所接受。
对象:是运行的实体,包括数据和作用在数据上的行为。一个对象把属性和行为封装成一个整体。
消息:对象之间进行通信。
多态:对象收到消息要给予响应。不同对象对同一消息有不同的响应,叫做多态。使用多态时,用户发送一个通用的消息,就可以调用不同的方法(比如支付时可以选择多个平台 )。
类:一组大体上相似的对象,是对对象的一种抽象。分析和设计时要把注意力集中在类上,只对类进行定义。类属性的不同赋值 = 对象实例。有些类之间存在一般 ~ 特殊 的关系。汽车类 vs 货车类。
继承:父类和子类之间共享数据和方法的机制。在一个已经存在的类上(父类)进行,把已存在的类作为自己内容并加入若干新内容形成(子类)。一个父类有多个子类,一个子类也可以有多个父类。
绑定:静态绑定在编译时产生,动态绑定和多态相联系,在运行时进行。
面向对象原则:单一责任原则、开关原则(软件实体是可扩展的,但不可修改的)、里氏替换原则、依赖倒置原则、接口分离原则(使用多个专门的接口比使用单一的总接口要好)。
面向对象分析:沟通客户基本需求、标识类、刻画类层次结构、表示类之间的关系、为对象行为建模(动态)、重复之前任务直至建模结束。
面向对象设计:识别类、定义属性、定义服务、识别关系、识别包。需要考虑实现问题。
面向对象编程:使用程序设计语言,将设计模型转化为具体的实现系统。一般用C++、Java等面向对象语言,也可以用非面向对象语言如C语言。
UML 统一建模语言:表达软件设计中的静态、动态信息。由3个要素组成:基本构造块、放置构造块的一些规则、运用于整个语言的一些公共机制。
UML词汇表有3种构造块:事物、关系、图。事物是对模型中有代表性的成分的抽象,关系把事物结合在一起,图聚集相关的事物。
事物:结构事物、行为事物、分组事物(包)、注释事物。
关系:依赖(一个影响另一个-------->)、关联(一种结构关系------------)、泛化(父子之间的关系 ------------)、实现(一个类元指定了由另一个类元保证执行的契约-------------
)。
图:是一组元素的图形表示。为了对系统可视化,可以从不同的角度画图,这样图是对系统的投影。UML2.0有13个图:类图(系统的静态设计视图)、对象图、用例图、序列图(以时间顺序组织)、通信图、定时图(时间约束条件)、状态图(一个状态机)、活动图、组件图(一组构件之间的组织和依赖)、部署图(展现结点的配置)、包图(类组织成包以及包之间的依赖关系)。
设计模式:描述一个问题的解决方案。有4个要素:模式名称、问题、解决方案、效果。
-B结束
软件测试:
测试的目的是发现各种错误和缺陷。
测试原则:应尽早且不断地进行测试、测试避免由原开发人员承担、设计测试方案时不仅要确定输入数据也要确定输出数据、设计测试用例时不仅要有合理的输入也要有不合理的输入、测试程序时不仅要检验程序做了该做的事情,也要检验是否做了不该做的事情,严格按照测试计划进行避免随意性、保存测试计划测试用例和测试结果。
测试过程:拟定测试计划、编制测试大纲、设计和生成测试用例(有输入和预期输出)、实施测试、生成测试报告。
静态测试:不在机器上运行。
动态测试:通过运行程序来发现错误。
黑盒测试:不考虑软件内部结构,只测试软件外部特性。
白盒测试:根据程序的内部结构和逻辑来生成测试用例,对++程序的路径和过程进行测试++。逻辑覆盖:语句覆盖< 判定覆盖< 条件覆盖< 判定+条件覆盖(每个条件的所有可能取值和每个判定的所有可能结果都至少出现一次)< 路径覆盖。
测试过程:单元测试、集成测试、【确认测试(检查是否与用户要求一样)、系统测试】(这俩顺序颠倒了?)。
软件维护:正确性维护(尚未发现的错误)、适应性维护、完善性维护、预防性维护。维护费用> 开发费用。在软件开发阶段要考虑可维护性。
软件项目管理:
成本估算、风险分析(在质量上达到什么程度即可满足要求?------哈哈哈哈哈哈,上班干活的毛病就是爱精益求精,实际上不符合管理学,再哈哈哈哈哈哈哈一下)、进度管理(常用的图像描述方法有甘特图、PERT图)
撒花,写完了,都是本宫一字一字敲(抄书)出来的。(¯`•¸•´¯)