Chapter 1 概论
软件工程是为了经济地获得能够在实际机器上有效运行的可靠软件而建立和使用的一系列完善的工程化原则
软件工程三要素
方法:–项目计划与估算、软件系统需求分析、数据结构、系统总体结构的设计等
工具:为软件工程方法提供了自动的或半自动的软件支撑环境 。–把软件工具集成起来,建立起称之为计算机辅助软件工程(CASE)的软件开发支撑系统。CASE将各种软件工具、开发机器和一个存放开发过程信息的工程数据库组合起来形成一个软件工程环境。
过程:将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的
–定义方法使用的顺序
–定义要求交付的文档资料
–定义为保证质量和适应变化所需要的管理
–定义软件开发各个阶段完成的里程碑
软件工程原则
抽象:抽取事物最基本的特性和行为,忽略非基本的细节,采用分层次抽象,自顶向下、逐层细化的办法控制软件开发过程的复杂性
信息隐蔽:将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。这就是信息封装,使用与实现分离的原则,使用者只能通过模块接口访问模块中封装的数据。
模块化:模块是程序中逻辑上相对独立的成分,是独立的编程单位,应有良好的接口定义。如C语言程序中的函数过程,C++语言程序中的类。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统
确定性:软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。这有助于人们之间在交流时不会产生误解、遗漏,保证整个开发工作协调一致。
一致性:整个软件系统(包括程序、文档和数据)的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致
完备性:软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审
可验证性:开发大型的软件系统需要对系统自顶向下、逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性
软件生命周期
计划时期:问题定义、可行性研究
开发时期:需求分析、总体设计、详细设计、编码、单元测试、集成测试、确认测试、系统测试
运行时期:运行与维护
Chapter 2 软件过程及其建模
可行性分析=》需求分析=》概要设计=》详细设计=》编码=》测试=》交付=》维护
过程
什么是过程?针对一个给定目标的一系列操作步骤。课本:可以将一组有序的任务称为过程,它涉及获得、约束和资源使用的一系列步骤,用于产生某种想要的输出
软件开发过程
按照项目的进度、成本和质量限制,开发和维护满足用户需求的软件所必需的一组有序的软件开发活动集合。
•在按任务性质,软件开发活动可分为二种形式
技术活动
- 对软件项目实施开发,产生软件产品
- 例如,需求分析,概要设计,编码,单元测试等等
管理活动
- 对软件项目中的人、产品和过程等实施管理的活动
- 例如,制订软件项目计划,软件配置等等
生命周期
生命周期定义:涉及产品构建的这种过程称为生命周期。因为软件开发过程描述了软件产品从概念到实现、交付、使用和维护的整个过程,因此有时候把软件开发过程称为软件生命周期
软件过程模型
瀑布模型
原型模型
增量模型
螺旋模型
敏捷开发模型
• Extreme Programming (XP) (极限编程)
–极限编程(XP)是于1998年由Smalltalk社群中的大师级人物Kent Beck首先倡导的,是敏捷方法中最主要的流派
• Crystal (水晶法)
• SCRUM(并列争球法)
• Adaptive Software Development(ASD) (自适应软件开发)
• Feature Driven Development(FDD) (特征驱动软件开发)
• Pragmatic Programming(实用编程)
优点:
•采用简单计划策略,不需要长期计划和复杂模型,开发周期短
•在全过程采用迭代增量开发、反馈修正和反复测试的方法,能够适应用户经常变化的需求
•注重市场快速反应能力,客户前期满意度高
缺点:
•注重人员的沟通,忽略文档的重要性,若项目人员流动大太,给维护带来不少难度
•对编码人员的经验要求高,若项目存在新手比较多时,老员工比较累
适用范围
•项目经常发生变更
•高风险的项目实施
•开发人员可以参与决策