《软件工程方法与实践》—— 导读

前  言

软件工程包含一系列软件开发的基本原理、方法和实践经验,用来指导人们进行正确的软件开发。软件工程强调从工程化的原理出发,按照标准化规程和软件开发实践来引导软件开发人员进行软件开发和实践活动,并进行过程改进,促进软件企业向标准化和成熟化的方向发展。软件工程是一门理论与实践相结合的学科,更注重通过实践来理解原理和方法。为此,我们结合多年的软件工程教学和项目开发经验,通过5个项目实例,从不同的角度、利用不同的方法学来循序渐进地介绍软件开发过程中所涉及的原理、方法和技术。本书的另一个特色是从问题的角度引导学生根据自己的体会来讨论软件开发过程中的问题,进而理解软件工程的概念和原理,总结出一些有效的方法和实践经验。

编写思想

本书强调以问题为引导的软件工程所涉及的概念和方法,进而讨论具体的过程及其优缺点,并结合具体案例进行解析,让学生对问题产生的原因和新方法的提出有更深入的理解,还支持学生进行深入阅读。
我们将传统的结构化方法学和面向对象方法学分开介绍,这有利于学生理解二者的本质区别,厘清其分析与设计模型的不同特点,从而针对不同的项目来选择不同的开发方法学和过程。从结构化到面向对象的路线也便于学生逐步接受软件开发的思想和本质。
结构化方法学。重点讨论开发过程、原理和方法,这些都可以推广到面向对象的开发范型中。最后通过胰岛素输送这一高要求系统案例介绍如何将这些方法应用到实践中。
面向对象方法学。重点讨论面向对象分析模型和设计模型的构建,强调它们之间的关系,抓住面向对象模型开发的要点,通过UML建模语言来描述分析和设计模型,进一步加深学生对面向对象模型本质的理解,同时也清楚其适用的情况。最后通过POS机这一复杂系统案例帮助学生掌握面向对象分析与设计的主要思想。
本书还注重本科生研究性教学实践,针对现代软件开发方法—敏捷方法,重点介绍结对编程,在帮助学生理解结对编程思想的同时,分析其中存在的问题和解决方法,结合系统需求进行设计、实现与测试。通过这一过程可达到研究性教学的目的,也可将结对编程作为学期项目。

组织结构

本书分为四个部分,共14章内容。第一部分“软件工程基础”(第1~4章)主要从软件危机引出软件工程的基本概念和基本原理,介绍软件开发的工程化思想和开发过程等。第二部分“结构化分析、设计与测试”(第5~9章)针对传统结构化的软件开发方法学,主要介绍其基本概念、分析与设计过程、分析与设计模型、软件测试原理和技术、高要求系统的分析与设计方法等。第三部分“面向对象分析、设计与测试”(第10~12章)将介绍面向对象方法学的基本概念、用例分析模型及其设计过程、面向对象分析与设计模型、面向对象的实现以及测试技术。第四部分“软件维护与项目管理”(第13、14章)主要介绍软件维护策略与方法、软件项目管理概念与原理、软件成本估算以及项目计划与管理。

案例

由于本书分别介绍了传统的结构化方法学和面向对象方法学两大体系,因此专门选择了适合不同方法学的具有代表性的案例进行研究,以便读者能够深入理解其各自的优势。这些案例中既有简单常见的应用系统,如面对面结对编程系统和ATM系统;也有比较实用的系统,如POS机系统;还有一些稍微复杂的系统,如分布式结对编程系统和胰岛素输送系统。这些系统由简单到复杂,循序渐进,引导学生逐步理解系统的开发过程和关键问题。
面对面结对编程系统是一个辅助学生进行结对编程和学习的系统,该系统支持角色交换、信息统计和相容性分析等功能,克服了编程过程中的一些不便,如交换位置、相互干扰等。同时,该系统采用一台主机支持结对,还具有节约实验室建设费用等优点。
POS机系统是电子收款机系统的简称,通过计算机来处理销售和支付信息。该系统包括计算机终端、条码扫描仪、现金抽屉、票据打印机等硬件以及支持系统运转的软件,能够为不同服务的应用程序提供接口。收银员通过条码扫描仪读取的或键盘输入的商品条码号来记录商品信息,系统自动计算销售总价。收银员通过系统能够处理支付,包括现金支付、信用卡支付和支票支付。经理通过系统能够处理顾客退货。
ATM系统即自动柜员机系统,能够自动处理银行储户的各种业务,如取款、存款、转账、查询、修改密码等。ATM软件系统使客户能够直接访问银行计算机完成交易,无需银行工作人员的介入。
分布式结对编程系统支持跨地域的结对编程或学习。为了支持异地结对者像在本地一样方便地工作,系统通过文本、音频和视频进行交流。系统与集成开发环境进行集成,包括VC++、Eclipse等开发环境。系统支持角色交换,但通常不严格遵循“驱动者”和“领航者”的角色,所以分布结对编程的工具应该允许合作者很容易地访问控制键盘。
胰岛素输送系统是关于人体胰腺操作(一种体内组织)的仿真,其目标是帮助那些糖尿病患者控制血糖水平。该系统用于监控血糖浓度,根据需要输送正确剂量的胰岛素,对安全性的要求非常高。

目  录

前言
第一部分 软件工程基础
第1章 软件工程概述
1.1 引言
1.2 什么是软件
1.2.1 软件的定义与特性
1.2.2 软件技术的演化
1.3 什么是软件工程
1.3.1 软件危机
1.3.2 解决软件危机的途径
1.3.3 软件工程的定义
1.4 软件工程的基本原理与基本原则
1.4.1 基本原理
1.4.2 基本原则
1.5 软件工程开发方法学
1.5.1 结构化开发方法学
1.5.2 面向对象开发方法学
1.5.3 重型软件工程与轻型软件工程
1.6 小结
习题
第2章 软件过程
2.1 引言
2.2 什么是软件过程
2.2.1 软件过程的定义
2.2.2 软件过程框架
2.3 软件产品与过程
2.4 软件生存周期
2.5 软件工程活动
2.6 小结
习题
第3章 软件过程模型
3.1 引言
3.2 什么是软件过程模型
3.3 传统的软件过程模型
3.3.1 瀑布模型
3.3.2 增量模型
3.3.3 螺旋模型
3.4 面向对象模型
3.4.1 构件集成模型
3.4.2 统一过程模型
3.5 小结
习题
第4章 敏捷软件开发方法
4.1 引言
4.2 敏捷软件开发过程
4.2.1 敏捷过程
4.2.2 敏捷开发原则
4.3 Scrum开发过程
4.3.1 Scrum的特点
4.3.2 Scrum模型与过程
4.4 极限编程
4.4.1 什么是极限编程
4.4.2 极限编程的要素
4.5 结对编程
4.5.1 什么是结对编程
4.5.2 结对编程的优势分析
4.5.3 结对编程的分类
4.5.4 结对编程的方式
4.6 小结
习题
第二部分 结构化分析、设计与测试
第5章 软件需求分析
5.1 引言
5.2 什么是软件需求
5.3 需求分析过程
5.4 会谈技术
5.4.1 非正式会谈
5.4.2 正式会谈
5.5 调查技术
5.5.1 确定调查内容
5.5.2 可靠可信分析
5.6 场景分析技术
5.7 小结
习题
第6章 结构化分析
6.1 引言
6.2 结构化分析模型
6.3 面向数据流的建模方法
6.3.1 数据流建模方法
6.3.2 实例分析
6.4 面向数据的建模方法
6.4.1 数据建模方法
6.4.2 实例分析
6.5 面向状态的建模方法
6.5.1 状态建模方法
6.5.2 实例分析
6.6 规格说明书编写示例
6.7 小结
习题
第7章 结构化设计
7.1 引言
7.2 软件设计过程
7.3 软件模块化设计
7.4 软件结构
7.5 结构化概要设计
7.5.1 数据流模型
7.5.2 数据流设计方法
7.5.3 实例分析
7.6 概要设计文档编写示例
7.7 详细设计
7.8 结构化详细设计
7.9 详细设计文档编写示例
7.10 编码实现
7.10.1 编码语言
7.10.2 编码风格
7.11 小结
习题
第8章 结构化软件测试
8.1 引言
8.2 软件测试的目的和原则
8.3 软件测试的基本过程
8.3.1 单元测试
8.3.2 集成测试
8.3.3 确认测试
8.3.4 系统测试
8.4 测试用例设计
8.5 黑盒测试技术
8.5.1 等价类划分
8.5.2 边界值分析
8.5.3 错误推测
8.5.4 因果图
8.6 白盒测试技术
8.6.1 逻辑覆盖
8.6.2 路径覆盖
8.6.3 循环路径测试策略
8.7 集成测试技术
8.7.1 集成策略
8.7.2 性能测试
8.7.3 实例分析
8.8 调试技术
8.8.1 调试过程
8.8.2 调试策略
8.9 软件测试文档
8.9.1 软件测试计划文档
8.9.2 集成测试文档
8.10 小结
习题
第9章 高要求系统的分析与设计
9.1 引言
9.2 什么是高要求系统
9.3 高要求系统的需求分析
9.3.1 风险需求描述
9.3.2 安全性描述
9.3.3 信息安全描述
9.3.4 软件可靠性描述
9.3.5 胰岛素输送系统完整的需求描述
9.4 形式化描述方法
9.4.1 软件过程中的形式化描述
9.4.2 接口描述方法
9.4.3 行为描述
9.5 高要求系统的设计
9.6 高要求系统的开发
9.7 系统验证
9.7.1 可靠性验证
9.7.2 安全性保证
9.7.3 信息安全评估
9.8 小结
习题
第三部分 面向对象分析、设计与测试
第10章 面向对象分析
10.1 引言
10.2 面向对象模型
10.3 UML
10.3.1 UML的组成
10.3.2 UML的视图
10.4 面向对象分析过程
10.5 用例驱动分析
10.5.1 用例建模分析
10.5.2 开发活动图
10.5.3 开发泳道图
10.6 领域与业务建模
10.6.1 识别业务类和领域类
10.6.2 业务类图
10.6.3 识别属性和操作
10.6.4 开发协作图
10.6.5 开发包图
10.6.6 逻辑架构
10.7 系统行为建模
10.7.1 系统顺序图
10.7.2 建立操作契约
10.7.3 建立顺序图
10.7.4 系统状态图
10.8 POS机系统案例分析
10.9 分布式结对编程系统分析
10.9.1 项目概述
10.9.2 功能描述
10.9.3 逻辑分析与建模
10.10 小结
习题
第11章 面向对象设计
11.1 引言
11.2 面向对象设计模型
11.3 构件设计
11.3.1 构件设计的步骤
11.3.2 构件设计的原则
11.4 并发性设计
11.5 设计模式
11.5.1 基于职责的设计
11.5.2 常见的设计模式
11.6 面向对象详细设计
11.6.1 模型精化
11.6.2 逻辑架构精化设计
11.6.3 分层设计
11.6.4 类操作设计
11.7 方法设计
11.8 精化设计
11.9 数据存储与持久性设计
11.10 部署设计与构件图
11.11 小结
习题
第12章 面向对象实现与测试
12.1 引言
12.2 面向对象实现
12.3 POS机系统实现
12.4 分布式结对编程系统实现
12.5 面向对象测试
12.6 面向对象测试策略
12.7 测试驱动开发
12.7.1 什么是测试驱动开发
12.7.2 测试驱动开发的步骤
12.7.3 编写测试程序
12.7.4 代码重构
12.8 小结
习题
第四部分 软件维护与项目管理
第13章 软件维护
13.1 引言
13.2 软件的可维护性
13.3 软件维护的类型
13.4 软件维护方法
13.5 提高软件的可维护性
13.5.1 结构化维护与非结构化维护
13.5.2 提高软件可维护性的技术途径
13.6 小结
习题
第14章 软件项目管理
14.1 引言
14.2 软件项目组织
14.3 软件过程管理
14.3.1 软件过程度量
14.3.2 软件过程改进
14.3.3 软件项目度量
14.4 软件项目风险管理
14.4.1 风险识别
14.4.2 风险预测
14.4.3 风险管理
14.5 软件配置管理
14.5.1 基本概念
14.5.2 软件配置管理过程
14.6 软件项目估算
14.6.1 软件项目资源
14.6.2 软件规模度量
14.6.3 估算管理
14.7 分解技术
14.7.1 基于问题分解的估算
14.7.2 基于过程分解的估算
14.8 经验估算技术
14.8.1 专家类比推断
14.8.2 中级COCOMO估算模型
14.9 软件质量管理
14.9.1 软件质量保证
14.9.2 软件质量度量
14.10 项目进度管理
14.10.1 项目进度管理计划
14.10.2 进度安排
14.10.3 进度跟踪管理
14.11 小结

时间: 2024-09-15 13:57:04

《软件工程方法与实践》—— 导读的相关文章

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

《深入理解Scala》——第1章,第1.4节与JVM的无缝集成

1.4 与JVM的无缝集成 深入理解Scala Scala的吸引力之一在于它与Java和JVM的无缝集成.Scala与Java有很强的兼容性,比如说Java类可以直接映射为Scala类.这种紧密联系使Java到Scala的迁移相当简单,但在使用Scala的一些高级特性时还是需要小心的,Scala有些高级特性是Java里没有的.在Scala语言设计时已经小心地考虑了与Java无缝交互的问题,用Java写的库,大部分可以直接照搬(as-is)到Scala里. 1.4.1 Scala调用Java 从S

《深入理解Scala》——第2章,第2.1节学习使用Scala交互模式(REPL)

第2章 核心规则深入理解Scala 本章包括的内容: • 使用Scala交互模式(Read Eval Print Loop 简称REPL) • 面向表达式编程 • 不变性(Immutability) • Option类 本章内容覆盖了每个新Scala开发者都需要知道的几个主题.本章不会深入到每个主题里,但是会讲到可以让你自己去接着探索的程度.你将学会使用REPL,学会如何利用这个工具做软件的快速原型开发.然后我们会学到面向表达式编程,并从另一个视角来看控制结构是怎么回事.在此基础上,我们来研究不

《深入理解Scala》——第1章,第1.3节静态类型和表达力

1.3 静态类型和表达力 深入理解Scala 开发人员中有一个误解,认为静态类型必然导致冗长的代码.之所以如此是因为很多继承自C的语言强制要求程序员必须在代码中多处明确地指定类型.随着软件开发技术和编译器理论的发展,情况已经改变.Scala利用了其中一些技术进步来减少样板(boilerplate)代码,保持代码简洁. Scala做了以下几个简单的设计决策,以提高代码表达力. • 把类型标注(type annotation)换到变量右边. • 类型推断. • 可扩展的语法. • 用户自定义的隐式转

《深入理解Scala》——第1章,第1.5节总结

1.5 总结 深入理解Scala 本章中,你学到了一些Scala的设计理念.设计Scala的初衷在于把不同语言中的多种概念融合起来.Scala融合了函数式和面向对象编程,尽管显然Java也已经这么做了.Scala精选其语法,极大地减少了语言中的繁冗之处,使一些强大的特性可以优雅地表达,比如类型推断.最后,Scala和Java能够紧密集成,而且运行在Java虚拟机上,这或许是让Scala变成一种实用选择的最重要的一点.几乎不花代价就可以把Scala用于我们的日常工作中. 因为Scala融合了多种概

《深入理解Scala》——第1章,第1.1节Scala一种混合式编程语言

第1章 Scala--一种混合式编程语言 Scala是一种将其他编程语言中的多种技巧融合为一的语言.Scala尝试跨越多种不同类型的语言,给开发者提供面向对象编程.函数式编程.富有表达力的语法.静态强类型和丰富的泛型等特性,而且全部架设于Java虚拟机之上.因此开发者使用Scala时可以继续使用原本熟悉的某种编程特性,但要发挥Scala的强大能力则需要结合使用这些有时候相互抵触的概念和特性,建立一种平衡的和谐.Scala对开发者的真正解放之处在于让开发者可以随意使用最适合手头上的问题的编程范式.

《深入理解Scala》——第2章,第2.2节优先采用面向表达式编程

2.2 优先采用面向表达式编程 深入理解Scala 面向表达式编程是个术语,意思是在代码中使用表达式而不用语句.表达式和语句的区别是什么?语句是可以执行的东西,表达式是可以求值的东西.在实践中这有什么意义呢?表达式返回值,语句执行代码,但是不返回值.本节我们将学习面向表达式编程的全部知识,并理解它对简化程序有什么帮助.我们也会看一下对象的可变性,以及可变性与面向表达式编程的关系. 作者注:语句VS表达式 语句是可以执行的东西,表达式是可以求值的东西. 表达式是运算结果为一个值的代码块.Scala

《深入理解Scala》——第2章,第2.3节优先选择不变性

2.3 优先选择不变性 深入理解Scala 编程中的不变性指对象一旦创建后就不再改变状态.这是函数式编程的基石之一,也是JVM上的面向对象编程的推荐实践之一.Scala也不例外,在设计上优先选择不变性,在很多场景中把不变性作为默认设置.对此,你可能一下子会不适应.本节中,我们将学到不变性对于判等问题和并发编程能提供什么帮助. Scala里首先要明白的是不变对象和不变引用(immutable referene)的区别.Scala里的所有变量都是指向对象的引用.把变量声明为val意味着它是个不变"引

《深入理解Scala》——第2章,第2.4节用None不用null

2.4 用None不用null深入理解Scala Scala在标准库里提供了scala.Option类,鼓励大家在一般编程时尽量不要使用null.Option可以视作一个容器,里面要么有东西,要么什么都没有.Option通过两个子类来实现此含义:Some和None.Some表示容器里有且仅有一个东西,None表示空容器,有点类似List的Nil的含义. 在Java和其他允许null的语言里,null经常作为一个占位符用于返回值,表示非致命的错误,或者表示一个变量未被初始化.Scala里,你可以用

《深入理解Scala》——第2章,第2.5节多态场景下的判等

2.5 多态场景下的判等 深入理解Scala 众所周知,为多态的面向对象系统定义合适的判等和散列方法是个特别难的过程.这是因为子类可能在整个过程中造成一些相当怪异的问题,尤其是当类型层次上有多个实体(concrete)级别的时候.一般来说,对于需要比引用判等更强的判等(译者注:比如需要判断对象内部数据)的类,最好避免多层实体类层次.这是什么意思呢?有些时候类只需要引用判等就够了.也就是说只要两个对象不是同一个实例就判为不等.但是如果我们需要判断两个不同实例是否相等,而且又有多层实体类层次(mul