软件工程
1
三要素:过程,方法,工具
程序代码表现形式:源代码,可执行代码
软件:指令的集合,数据结构,软件描述信息
软件 neq 程序,开发软件 neq 编些程序
应用软件 系统软件 支撑软件
正确性,可靠性,健壮性,有效性,安全性,可维护性,可移植性,可重用性,可理解性,可信性,持续性,可用性,互操作性
软件工程:将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护,即将工程化方法应用于软件
软件过程:沟通,策划,建模,构建,部署
2
软件过程模型:瀑布,增量,迭代,原型,螺旋,基于构建的过程模型,UP模型
瀑布:需求分析 概要设计 详细设计 编码实现 集成测试 确认测试
需求易于定义,不易变动的软件系统
与软件生命周期一致,每个活动结束后需要评审,相邻活动存在因果关系,简单一目了然,易理解掌握、应用管理
需求分析:定义软件需求,产出软件需求模型、文档,软件确认测试计划
概要设计:软件总体架构,集成测试计划,产出设计模型,概要设计文档
详细设计:模块内部细节,单元测试计划,产出详细设计模型,详细设计文档
编程实现:编写代码,单元测试、调试,产出经过单元测试的源代码
集成测试:组装,测试
确认测试:测试是否满足用户需求,产出确认测试报告
局限:需求确定,缺乏变通
改进:反馈和回溯
增量模型:渐进快速交付,并行开发,需要软件需求可确定、不宜变化
迭代模型:每次迭代完成部分可确定的需求,是一完整过程,实和需求难导出、不易确定、持续变化的
管理复杂,迭代次数不确定
原型模型:原型作为交流载体和媒介,用户参与到开发中,持续渐进导出需求,适合需求难导出、不易确定、持续变化
螺旋模型:制定计划,风险分析,实施工程,客户评估。适合需求不明确,开发风险高,需求变化大的,管理复杂
统一过程模型:初始阶段(需求初步分析,指定计划评估风险),细化阶段(深入需求分析,核心设计,构建原型验证框架),构建阶段(编码。集成测试,用户文档),交付阶段(用户培训,部署后测试)
工作流:技术类:业务建模,需求,分析设计,实现,测试,部署。管理类:项目管理,配置与变更更管理,环境
需求模糊技术风险高,需高文档化,团队,长期维护。降低风险,架构设计,清晰的流程框架。流程复杂,小项目或者敏捷需求响应慢
敏捷开发:以代码为中心,快速轻巧主动应对需求变化,持续、及时较复可运行的软件系统(轻便、轻巧)
个体和交互,可以工作的软件,客户合作,响应变化
尽早和持续地交付,欢迎需求变化,不断较复,用户和开发人员一起工作,积极主动的人承担项目开发,面对面交谈,可运行软件为首要标准,长期恒定的开发速度,优秀的技能和良好的设计,简单化,自组织团队,反思调整
极限编程:计划,隐喻,小型发布,简单设计,测试,重构,结对编程,代码集体拥有,持续集成,每周40小时,现场用户,编码标准
测试驱动开发
scrum 方法:开发活动由工作单元组成,测试和文档编制贯穿,工作任务称作一个冲刺 来源于待定项中定义的需求,例会时间短,交付演示软件
创建软件产品订单库,筛选最应该实现的需求,冲刺周期,评审
3
建模:能表现出软件所转换的信息,使转换发生的架构和功能,用户要求特性,转换发生时系统的行为
层次:客户角度,技术方面
需求模型,设计模型
利益相关方:从软件系统中受益,或与软件系统相关的人、组织、系统。用户,客户,系统,开发者
软件需求:用于解决现实世界问题时,表现出的功能和性能方面的要求。利益相关方对其的功能、质量、运行环境、交付进度题除的期望和要求
功能性需求:完成的功能,外部可见的行为和效果
质量需求:外部质量属性(性能、可靠性、易用性),内部质量属性(可扩展性,可维护性,可理解性)
约束性需求:成本、进度、技术选型、遵循标准
需求:隐式性,隐晦性,多源性,易变性,领域知识相关性,价值不均性
需求的质量要求:有价值,正确,完整,无二义,可行,一致,可追踪,可验证
需求的重要性:价值所在,开发的基础、前提,验收的标准、依据
需求工程的方法:抽象(理解和抽象软件需求),建模(需求模型,自然语言、建模语言),分析(策略,手段)
聚合和组合:部分对象是否可以为多个整体对象所共享
UML:统一标准化,可视化。用来可视化、描述、构造、文档化软件密集型系统
用例视点(用例图,系统的功能,从外部用户角度),结构视点(包,类,对象,构建,系统的构成),行为视点(状态,活动,通信,顺序),部署视点(部署图,软件制品、运行环境)
工具:文档撰写,建模工具,原型开发工具,需求分析管理工具,配置管理工具
制品:需求模型,需求文档(概述,功能性需求,质量需求,约束性需求,优先级),软件原型
确认:再用户和客户的角度,确保软件需求的正确性
验证:判断文档、模型是否准确刻画了要求
4
需求从何而来:开发的动机,利益相关方的诉求
获取方法:访谈和会议(召开,走访),调查问卷(设计问卷,对谁调查,如何利用),现场观摩(业务工作流程,细节),分析业务资料(收集,阅读,分析),软件原型(展现交互,用户确定需求是否被正确理解、发现问题,沟通的媒介),群体化方法(互联网上的群体参与到获取需求中)
定义欲解决的问题:调研、论证、寻找有意义价值的问题
基于软件问题的解决方案:为问题解决提供有效途径
导出功能性需求:与利益相关方交互
构思:工程师充当利益相关方的角色
非功能性需求(质量、约束性)
鉴别、发现真正有意义的需求
初步描述:自然语言(不具体,不准确,有二义,不直观),原型(直观,可展示操作,无法描述具体细节),用例图(执行者:外部实体。用例:功能,执行者与系统的业务交互动作序列。边:包含(是子功能),扩展(功能更多),继承。边界框。)
制品:原型,用例模型(可视图形符号),需求文档(自然语言)
评审:中肯,合理,完整,必要,溯源,准确,正确,一致
可行性:技术,设备,进度,成本,商业,社会
5
分析软件需求:精化、分析,确定优先级,需求模型,发现缺陷,需求规格说明书
交互图:对象间的消息传递,分析如何交互协作
顺序图强调消息时间序,纵向时间轴,横向消息传递(同步,异步,自,返回为虚线,创建与销毁,带延迟)
通信图强调对象的合作,节点为对象,连接器可标示多条消息,方向靠近消息的小箭头表示,有序号
语义上等价
类图:类构成,静态组成结构,节点是类,边是类间关系(关联,依赖,继承,实现,聚合,组合)。
属性表示:可见性(+
公开,-
私有,#
保护),多重性,约束(可更改性,顺序性,唯一性,静态性)
方法表示:约束(查询,多态,并发,异常)
接口:供给,需求
依赖:语义上有关系,一个对象变化会导致另一类对象相应修改,使用、追踪、精化、实现、派生
对象图:对象在运行过程中的瞬时快照,链接是类图中关联边的实例化,继承、依赖无法表示,是静态瞬时快照
状态图:实体在事件刺激下的反应式动态行为,和导致的状态变化
动作:在边上,活动:在状态中
分析和确定需求:重要性(核心,外围)、优先级(重要性、实际需要来确定)、次序
分析、建立用例交互模型:分析描述用例如何通过一组对象之间的交互来完成。分析确定所设计的对象和类,分析确定对象间消息传递,绘图
分析类:边界类(系统的边界,与执行者交互,交互控制,外部接口,交互图最左或最右侧),控制类(任务的主要协调者,分解任务),实体类(具体功能,控制类右侧)
消息名称:交互意图,接收方的职责任务
一个用例至少构造一个交互图
分析类模型建立步骤:确定分析类(外部执行者也是),分析类职责(服务,消息和职责一一对应),分析类属性(保存什么信息,消息参数等),分析类间关系,绘制分析类图
需求文档:遵循规范,图文并茂,完整,共同参与,简练,一致
输出:原型,模型,文档
评审:完整,正确,准确,一致,多余,可追踪,文档规范,图符规范,表述可读,图表一致
6
软件设计:软件需求(前提),制约因素(考虑,资源、技术),解决方案
设计元素:设计类,软构建,子系统。在编码实现时都有对应物
软构建:功能独立,接口标准化,可复用,可组装。类库,动态链接库等
质量要求:正确,充分,优化,简单
体系结构设计:分层,模块
用户界面设计:直观,友好,易操作,设计元素由设计类表示
详细设计:数据设计,接口设计,类设计,算法设计
抽象原则:体系结构->类设计->算法设计。过程抽象,数据抽象,逐步求精
模块化、高内聚、低耦合(权衡):每个模块实现单一功能
内聚:模块内各成分彼此结合的紧密程度
偶然性内聚:完成一组功能二结合在一起,关系松散
功能性内聚:是一整体,完成单个功能
耦合:模块间相关程度
信息隐藏:只提供对外接口,不提供实现细节
关注点分离:对概念、任务、目标的某部分的聚焦
重用:封装,接口,继承,多态
可追溯、架构、数据设计和功能设计同等重要,接口,迭代
面向对象优势:高度抽象自然过渡,多种形式和粗粒度的重用,系统化设计,支持扩展和变更
单一职责原则:每个类一个职责
开闭原则:类对扩展开放,对修改封闭,通过扩展来增加需求
里氏替换原则:父类性质在子类仍成立 或 父类出现的地方均可用子类替代且反之不行
接口隔离原则:大接口拆分成小的
依赖倒置原则:高层类不依赖底层类接口,抽象类不依赖具体实现类
最少知识原则:只和与自己存在耦合的类进行交互
输出:设计模型,设计文档
缺陷:未满足要求,质量低下,不一致,不够详尽
评审:文档规范,制品可理解,内容合法,质量水平,满足需求,优化性
管理:变更管理,追溯管理,基线管理
7
软件体系结构:从高层抽象刻画组成软件系统的设计元素和之间的逻辑关联
构件(实际存在的物理模块,分离,替换,配置,复用)、连接件(表示连接和交互)、约束(高层次元素向低层次元素发请求,每个层次可替换)
构件实现和构件的接口分离
逻辑视图:要素及关系,关注构成(包图,类图)
运行视图:特定时刻的具体情况,同步、并发等(活动图)
开发视图:代码组织及其形式,对应逻辑视图的模块(包图,构件图)
物理视图:软构建的部署和连接,物理机器和连接(部署图,工件:相对独立的物理实现单元)
包:有逻辑关联的uml模型元素、模型图、其他包。配置管理的基本单元
软件模型的组织单元,模型管理的基本单元,高层结构的组成元素,访问控制的基本手段
包图:包间的构成、依赖,描述软件系统的高层结构
构件图:结点为构件、类、包,关系为构成、依赖
部署图:描述性(逻辑布局,节点为一组计算资源,工件在节点内,边时通信连接),实例性(具体运行环境、系统配置的物理部署情况)
设计风格
分层:按抽象级别的顺序,顶层面向用户提供交互界面,底层提供基础、公共技术服务,中间层业务处理
对下层:服务请求,对上层:事件信息。低耦合,可替换,可复用,标准化
管道与过滤:每个步骤封装在一个过滤器构件中,相邻过滤器以管道连接,数据源,数据汇
有数据流特征的软件需求,独立更新过滤器,适合数据处理、批处理,不适合交互式、事件驱动的
黑板:黑板保存状态数据,知识源根据黑板评价自身可应用性、进行部分求解,控制器更新状态数据、选择知识源
灵活升级,独立重用,容错、健壮,适合识别、自然语言处理、问题规划,不适合交互性强、简单确定性强的
MVC:模型(业务逻辑处理),视图(呈现数据),控制器(接获处理结果,选择适当视图)
三者分离,适合web、桌面、多种视图的,不适合小型、实时性高、界面简单的系统
SOA 风格:软构件抽象为服务,需要注册登记。服务间松耦合定义,支持异构服务间交互,适合分布式系统
消息总线风格:一组软构件+一条消息总线。适合异步、高并发,不适合有数据一致性要求,低延迟交互
C/S 风格:数据处理能力强,适合高性能交互,有安全要求,不适合面对大量不可知用户、跨平台。成本高设计复杂,维护升级移植困难
B/S 风格:缺点:动态页面处理、安全性。适合互联网应用,不适合性能、交互性要求高的
体系结构设计:明确系统、构件、关键类的职责划分、协作关系。全局性、基础性技术问题。非功能性需求重要
承上启下,定型质量
知道详细设计,详细设计是要素的局部设计、遵循体系结构设计、只能实现不能更改
初步:辨识核心功能、基础性功能、支持功能、难度大风险高的功能、用户满意度影响大的功能。选择结构风格
重用开源、已有软件
精化:公共基础设施、服务,设计元素(职责、协同,子系统、构件、关键设计类)
部署、整合、优化
评审:满足、优化、可扩展、可追踪、详尽
输出:软件模型(UML 包图、部署图等),软件文档
8
交互:人机交互,接口访问
人机交互:文本,图形化界面,语音,手势。关键:满意度,方便,直观。用户特征、获得反馈、满意度作为评审以据
静态元素、动态元素(与运行状态、业务逻辑相关,不允许用户修改)、输入元素、命令元素(激活后端业务处理、刷新页面)
窗口、对话框:对象类。静态和动态元素:类属性。输入:类属性。命令:类方法。
确定设计元素、操作,建立跳转关系(确定主界面),精化
输出:用户界面原型,UML 模型(顺序图,类图)
评审:操作习惯,风格一致,美观,合理协调,与 UML 模型一致,元素之间一致
9
细化、精化,获得高质量,面向现实(可直接编码和程序设计)的设计模型 ,更加关注“实现”
用例设计、类设计、数据设计、子系统和软构件设计,文档化和评审软件
活动图:实体为完成某项功能,执行的操作序列,存在并发和同步
活动点:计算过程。决策点:活动决策。边:控制流、信息流。并发控制。泳道:划分区域,对一个对象或者一个线程负责
用例设计:交互图分析类转化为用例实现的设计类
设计类图(一致)
优化和评审:重用,合并,重组
类设计:界面类、关键设计类、设计类的优化。确定可见范围、精化类间关系(自然抽象,强内聚,松耦合)、精化属性方法(聚合:指针引用,组合:实际元素)
状态图、活动图。
评审:简单性、自然醒、信息隐藏、强内聚、松耦合
输出:类图,活动图,必要的状态图(可选)
数据设计:无冗余,可追踪,效率,贯穿,完整性
永久数据:数据文件,数据库
子系统设计:内部结构,协作关系
构件设计:元素,写作
设计整合、设计验证(正确,优化,充分,不一致,冗余)
设计文档(引言,约束和原则,设计方案,实施指南)
面向对象设计模式:
创建型:分离创建和使用,客户程序不再关心创建的逻辑(单例:一个类只有一个实例,提供全局访问点。)
结构型:设计如何组合类和对象,获得更大结构(代理:代理控制原对象的访问,提交请求->给对象进行处理。)
行为型:描述模式,并且描述通信模式,设计者关注联系方式,不再关注控制流(观察者:订阅机制)
10
软件实现:编码,测试,调试
语言:提供语法、语义、语用。极其语言,汇编语言,结构化程序设计语言,面向对象,描述性
选择:应用领域,遗留软件系统的交互,特殊功能及需求,平台
原则:易读,易改,复杂度,重用,容错性,和文档、模型的一致性
缺陷:标识符,类型,严重程度,症状,优先级,状态,发现者、时机,源头,原因。预防,容忍,发现,修复
11
测试:运行或模拟软件,发现缺陷
代码走查:人工,开发阶段(完成后),发现逻辑、设计问题,人工经验、部分场景
静态分析:自动化工具扫描,开发阶段(持续集成),检测结构缺陷、规范违规,全面扫描、受限于规则集
测试:人工或自动化,集成后发布前,验证功能正确性、性能,依赖测试用例、部分场景
测试:输入数据、前置条件、测试步骤、预期输出
单元测试:对过程、函数、方法、类测试,白盒
集成测试:模块之间的接口,黑盒。自顶向下,自底向上
确认测试:软件的功能、性能,是否满足需求,黑盒
回归测试:验证是否退化,最好自动化
原则:避免测试自己代码、自己开发组开发的程序
白盒:根据内部工作流程,检查是否按内部工作流程运行,覆盖。
语句覆盖,判定覆盖(每个分治),条件覆盖(每个判定条件获得各种可能),判定/条件覆盖,条件组合覆盖,路径覆盖
流图:刻画控制结构,不涉及过程细节。判定点、结合点、过程块。不含复合条件
黑盒:功能、性能。可并行,与实现无关
等价类划分法(有相同特征),边界值分析法
输出:测试计划,报告,缺陷
部署
运行环境:上下文,基础服务功能,计算能力
部署:收集,打包,安装,配置,发布,运行环境
单机、分布式
容器:视图隔离,资源可限制,独立文件系统的进程集合
维护和演化
故障、服务变化、运行环境变化
纠正、完善、适应、预防
同步性,周期长,费用高,难度大
逻辑老化:满意度、质量下降,变更成本上升。重构
项目管理
过程管理(过程定义,软件度量,计划,跟踪,风险)、人员管理(团队建设沟通,机制,风险)、产品管理(质量,配置,需求,风险)