1. 软件生存周期
- 软件:包含程序、数据及相关文档
- 软件工程:涉及到软件开发、维护、管理等多方面的原理、工具与环境 。最终的目的是开发高质量的软件。
- 目的:提高软件生产率、提高软件质量、降低软件成本。
文档作用:
- 提高软件开发过程的能见度
- 提高开发效率,便于发现错误和不一致性;
- 作为开发人员在一定阶段的工作成果和结束标志;
- 记录开发过程中的有关信息,便于协调以后的软件、开发、使用和维护;
- 提供对软件的运行、维护和培训的有关信息,便于相关人员和用户之间的协作、交流和了解;
- 便于潜在用户了解软件的功能、性能,为选购提供选择依据。
2. 软件生成周期模型
(1)瀑布模型(Waterfall Model)
按软件生成周期为序来制定的开发模型,适合需求明确的模型,但缺乏灵活性。
原型模型的概念
在短时间先开发一个很简易的原型版本。
(2)演化模型(Evolutionary Model)
基于原型模型,对需求缺乏准确认识的情况下,根据用户使用过程中提出的意见和建议对原型不断重复改进,缺点是要对用户要求加以控制。
(3)增量模型(Incremental Model)
基于原型模型,把需求先划分多个模块,每个模块可进行增量开发。
(4)螺旋模型(Spiral Model)
适合风险比较大的项目,加入了风险分析。
(5)喷泉模型(Fountain Model)
以用户需求为基础,适用于面向对象开发。开发要重复多次。
(6)统一过程(Unified Process)
用例和风险驱动,以架构为中心。
(7)敏捷方法(Agile Development)
尽可能早地、持续地对有价值的软件的交付,强调是快速、时效性高,不强调文档。
(1)结构化方法
自上向下逐层分解。
(2)面向对象开发方法
面向对象分析、设计与实现,适合比较复杂的项目模型。
(3)Jackson方法
面向结构的开发方法。
(4)原型化方法
需求不清晰、业务不确定的情况。
二、软件需求分析
(1)可行性分析
(2)需求分析
三、软件设计
(1)软件设计的原则
- 抽象:内聚(模块内的交互程度)、耦合(模块间的交互程度),希望高内聚、低耦合;
- 模块化
- 信息隐蔽
- 模块独立
(2)内聚和耦合
内聚类型:
- 功能内聚:最强的内聚,完成一个单一功能;
- 顺序内聚:前一个功能的输出是后一个功能的输入;
- 通信内聚:所有处理元素集中在一个数据结构的区域上;
- 过程内聚
- 暧时内聚(时间内聚):同时执行的动作组合在一起
- 逻辑内聚
- 偶然内聚:功能间没有任何联系
耦合
非直接耦合:模块间没有直接关系,模块间不传递任何信息。
四、软件测试
1. V模型
2. 软件测试的过程
(1)单元测试、模块测试
一般使用白盒测试(知道内部结构和程序流等)
(2)集成测试
黑盒测试,按系统设计说明书进行测试。
(3)确认测试
黑盒测试,检查软件的功能、性能和其他特征是否与用户的需求一致。
(4)系统测试
墨盒测试,把软件放在实际的硬件和网络环境中进行测试,主要测试软件的非功能需求和质量属性是否得到满足。
3. 黑盒测试与白盒测试
- 语句覆盖:被测程序的每个语句至少执行一次(最弱的覆盖标准)。
- 判定覆盖:判定条件(if)至少获得一次真、假值。
- 条件覆盖:每个判定语句中的每个逻辑条件的各种可能值至少满足一次。
- 路径覆盖:覆盖所有可能的程序运行路径。
- 判定/条件覆盖:同时满足判定和条件覆盖。
- 条件组合覆盖:……
4. 测试原则与注意事项
(1)测试原则
- 尽早测试、测试应贯穿在开发的各个阶段;
- 测试工作应避免由开发者承担;
- 设计测试方案的时候,不仅要确定输入数据,还要根据系统功能确定预期的输出结果;
- 设计测试用例时,要输入不合理的数据或条件;
- 测试程序中要检验程序是否做了该做的事、还要确认不要多做了事情;
- 测试要有计划,测试计划、测试用例作为文档的一部分保存;
- 测试用例精心设计 ,便于重复使用。
(2)测试注意事项
- 发现错误较多的模块,在纠正错误后,遗留的错误也比较多;
- 测试的目的是为了发现错误,而不是验证程序没有错误;
- 通过软件测试不可能完全发现错误;
- 不可能保证程序100%没问题;
- 测试工作由开发方负责,从需求阶段提出;
- 开发时将质量也构建进产品;
- 测试人员与开发人员要密切合作;
- 软件测试的目的不仅要找出缺陷,还要随时提供质量相关信息。
五、软件运行与维护
软件维护类型:
- 正确性维护:更正程序错误。
- 适应性维护:使用软件适应新技术变化或管理需求变化。
- 预防性维护:为了改进应用软件的可靠性和可维护性,为了适应未来的软硬件的变化,主动增加预防性的功能。
- 完善性维护:扩充功能和改善性能。
六、程序员职业素养
1. 软件工程基本原理
- 用分阶段的生命周期计划严格管理,将复杂问题简化处理;
- 坚持进行阶段评审;
- 严格的版本管理;
- 采用现代程序设计技术,但不追求最新技术;
- 审查记录;
- 开发小组人员少而精;
- 知识管理。
2. 软件工程的最终目标
- 正确性
- 可用性
- 可靠性
- 友好性
- 可读性
- 健壮性:不合理的数据操作可以检查、纠正、提示;
- 效率
- 可移值性
3. 程序员的职业素养
- 有团队精神和较强的沟通能力
- 文档与知识管理
- 版本管理
- 编码规范
- 测试体系