01软件工程概述
- 软件产品:通用产品和定制化产品
- 软件工程的基本关注点:质量、成本、创新、时间
- 用户期望:产品质量 & 个性化
- 软件开发的几个阶段:玩具阶段、尝试阶段、原型阶段、产品阶段
- 软件危机
- 工程特点
02软件开发技能-软件演化与配置管理
- 软件演化对软件工程的影响
- 配置管理:版本管理、系统构建、变更管理、发布管理(配置管理是软件开发能力成熟的基本要求)
①版本管理:意义、术语(代码线、基线、主线)、主要任务、集中式与分布式版本控制系统及其各自优势
②系统构建:主要功能(概述,分别介绍了构建脚本功能、开发、构建、部署功能、持续集成功能)
03个人开发技能-代码质量
- 代码问题报告:bug、vulnerability、code-smell举例、问题总结
- 代码质量:含义、几个方面(代码风格、代码逻辑、代码设计等)
- 代码风格
- 代码逻辑:
- 控制代码复杂度:控制代码长度、控制嵌套语句的层数
- 控制代码重复率:提取公共部分进行方法或类封装;提取抽象类或接口;使用模板类或模板方法
- 高质量子程序:承担单一而明确的职责(功能内聚);良好的子程序命名;控制子程序的长度;仔细考虑子程序的参数(不要把参数用作工作变量)
- 防御式编程:基本思想是子程序不应该由于传入错误的数据(由外部接口或其他子程序传入)而被破坏; 程序员可以决定自己的程序逻辑但无法决定用户或其他子程序提供什么样的输入; 但仍要竭尽所能保护自身程序的正确运行
注:消除深层嵌套的代码实例未打印
- 防御编程:
应对不可控的外部输入:
- 断言:用断言处理不应该发生的状况
- 错误处理代码:用错误处理代码来处理预期会发生的情况
错误处理的更高层次的考虑:
- 异常:将代码中的错误或异常事件传递给调用方代码的一种手段
- 错误处理代码:
隔栏机制:让隔栏部分处理不干净的数据,而让内部代码处理干净的数据,这样大部分的代码无需再担负检查错误数据的任务。
04个人开发技能-测试驱动的开发
- 单元测试:
测 单个方法/函数 ; 对象行为;
要点:是开发者的测试; 应该尽可能自动化; 隔离依赖
好的单元测试:状态无损;基本单元;可重复;覆盖性;独立性;自动化
四阶段:建立;执行;验证;拆卸
- 依赖和测试替身
- 测试用例选取策略:划分测试; 基于指南的测试
- 交叉测试
- 测试先行:具备可行性;精确的程序规格说明;方便衡量开发进度;提高测试效率
- 测试驱动的开发
05软件过程与团队合作-软件过程与敏捷开发
- 基本的软件开发活动:
- 规格说明(需求)
- 设计和实现
- 确认(测试)
- 演化(维护)
- 软件过程:敏捷 vs 计划驱动
- 过程模型:
- 瀑布模型:属于计划驱动,规格说明、开发、确认和演化是独立的过程阶段
- 增量式开发:可以是计划驱动或敏捷的,常见为二者的混合,规格说明、开发和确认等活动不是分离的而是交织在一起的
增量式开发比瀑布模型的三个优势:
①降低了实现需求变更的成本,交织瀑布模型,重新分析和修改文档的工作量要少很多。
②在开发过程中更容易得到客户对于已开发的开发工作的反馈意见,客户可以对演示版本进行评价,并可以看到已经实现了多少需求,客户通常会感觉从软件设计文档中判断项目进度会很难
③即使并未将所有的功能包含在其中,也使得在早期向客户交付和部署有用软件成为可能,与瀑布模型相比,客户可以更早的使用软件并从中获得价值。
- 统一过程模型:预定义多个开发阶段,每个阶段包含多次迭代,每次迭代都包含多个开发活动
- 敏捷过程特点:客户需求(场景故事)驱动; 认识到有效的计划都是短期的 ;迭代地开发软件同时强调构造活动(设计与实现交织) ;频繁交付可运行的软件增量; 根据变化进行适