《实践者的研究方法》—— 导读

前  言

如果有这样一款计算机软件,它能满足用户的需求,能在相当长的时间内无故障地运行,修改起来轻松便捷,使用起来更是得心应手,那么,这款软件必定是成功的,它切实改善了我们的生活。但是,如果有这样一款软件,它令用户失望,错误频出,修改起来困难重重,使用起来更是举步维艰,那么,这必定是一款失败的软件,它使我们的生活一团糟。谁都希望开发出优秀的软件,为我们的生活带来便利,而不是把自己陷入失败的深渊。要想使软件获得成功,在设计和构建软件时就需要有规范,需要采用工程化的方法。

自本书第1版问世以来的近35年中,软件工程已经从少数倡导者提出的一些朦胧概念发展成为一门正规的工程学科,已被公认为是一个值得深入研究、认真学习和热烈讨论的课题。在整个行业中,软件工程师已经代替程序员成为人们优先选择的工作岗位,软件过程模型、软件工程方法和软件工具都已在全行业的所有环节成功采用。

尽管管理人员和一线专业人员都承认需要有更为规范的软件方法,但他们却始终在争论应该采用什么样的规范。有许多个人和公司至今仍在杂乱无章地开发着自己的软件,甚至即使他们正在开发的系统要服务于当今最为先进的技术,状况也仍是如此。许多专业人员和学生并不了解现代方法,这导致他们所开发的软件质量很差,因而造成了严重的后果。此外,有关软件工程方法真实本质的争论一直持续进行着。软件工程的地位问题已成为一门对比研究课题。人们对软件工程的态度已经有所改善,研究工作已取得了进展,不过要成为一门完全成熟的学科,我们还有大量的工作要做。

我们希望本书能够成为引导读者进入正在走向成熟的软件工程学科的入门读物,和以前的7个版本一样,第8版对学生和专业人员同样具有很强的吸引力。它既是软件专业人员的工作指南,也是高年级本科生和一年级研究生的综合性参考书。

第8版中包含了许多新的内容,它绝不只是前一版的简单更新。这一版不仅对内容做了适当的修改,而且调整了全书的结构,以改进教学顺序;同时更加强调一些新的和重要的软件工程过程和软件工程实践知识。此外,本书进一步加强了“支持系统”,为学生、教师和专业人员提供了更为丰富的知识资源。

篇章结构

本书共39章,分为五个部分。这种划分有利于那些无法在一个学期内讲完全书内容的教师灵活安排教学。

第一部分“软件过程”给出了有关软件过程的各种不同观点,讨论了所有重要的过程模型,还涉及惯用过程和敏捷过程在指导思想上的分歧。第二部分“建模”给出了分析方法和设计方法,重点讲解面向对象方法和UML建模,同时也介绍了基于模式的设计以及基于WebApp和移动App的设计。第三部分“质量管理”介绍了有关质量管理的概念、规程、技术和方法,使得软件团队能够很好地评估软件质量,评审软件工程工作产品,实施软件质量保证规程,并正确地运用有效的测试策略和战术。此外,这一部分还讨论了形式化建模和验证方法。第四部分“管理软件项目”介绍了与计划、管理和控制软件开发项目的人员有关的问题。第五部分“软件工程高级课题”讨论了软件过程改进和软件工程的发展趋势。

第8版沿用了前面几个版本的做法,在各章中都提供了大量的辅助阅读信息,包括一个虚拟软件团队在工作中遇到困难时展开的对话,还包括对各章相关知识给出的补充方法和工具。

第8版中五个部分的划分有利于教师根据学时和教学要求安排课堂内容。在一个学期内可以安排一个部分的内容,也可以安排多个部分的内容。软件工程概论课程可以从五个部分中选择若干章作为教材。侧重分析和设计的软件工程课程可以从第一部分和第二部分中选取素材。面向测试的软件工程课程则可以从第一部分和第三部分中选取素材,还应加上第二部分中的一些内容。侧重管理的课程应突出第一部分和第四部分的内容。我们用上述方式组织第8版的内容,意在给教师提供多种教学安排的选择。但无论如何选择这些内容,都可以从“支持系统”中获得补充资源。

相关资源

学生资源

本书为学生提供的各种学习资料包括:在线学习中心提供的各章学习指南,实践测验,题解以及多种在线资源(软件工程检查单、一套正在演化的微型工具、综合案例研究和工作产品模板等)。此外,1000多种网络参考文献可供学生更深入地探究软件工程问题,还有500多篇可下载的参考文献,这些都为读者提供了关于高级软件工程课题的更为详尽的信息。

教师资源

本书为教师提供的各种教学资料包括:在线(也可下载)教师指南,由700多个PPT组成的教辅资源和试题库。当然,学生资源(如微型工具、网络参考文献及可下载参考文献)和专业人员资源也可供教师使用。

在本书的教师指南中,我们为各种类型的软件工程课程提出了建议,介绍了与课程配合开展的软件项目、部分问题的题解和许多有用的教学辅助工具。

专业人员资源

本书为产业界专业人员(也包括在校学生)提供的各种资料包括:软件工程文档和其他工作产品的大纲和模板,一套有用的软件工程检查单,软件工程工具目录,综合性网络资料以及用于软件工程过程具体任务划分的“通用过程模型”。

由于有了在线支持系统的配合,使得本书既有内容上的深度,又有一定的灵活性,这些优势是传统的教科书所无法比拟的。

布鲁斯·马克西姆(Bruce Maxim)为这一版贡献了新的力量,他不仅具备丰富的软件工程知识,还带来了新的内容和洞见,这些对于读者来说将是十分宝贵的。

目  录

前言

第1章 软件的本质

1.1 软件的本质

1.1.1 定义软件

1.1.2 软件应用领域

1.1.3 遗留软件

1.2 软件的变更本质

1.2.1 WebApp

1.2.2 移动 App

1.2.3 云计算

1.2.4 产品线软件

1.3 小结

习题与思考题

扩展阅读与信息资源

第2章 软件工程

2.1 定义软件工程学科

2.2 软件过程

2.2.1 过程框架

2.2.2 普适性活动

2.2.3 过程的适应性调整

2.3 软件工程实践

2.3.1 实践的精髓

2.3.2 通用原则

2.4 软件开发神话

2.5 这一切是如何开始的

2.6 小结

习题与思考题

扩展阅读与信息资源

第一部分 软件过程

第3章 软件过程结构

3.1 通用过程模型

3.2 定义框架活动

3.3 明确任务集

3.4 过程模式

3.5 过程评估与改进

3.6 小结

习题与思考题 

扩展阅读与信息资源

第4章 过程模型

4.1 惯用过程模型

4.1.1 瀑布模型

4.1.2 增量过程模型

4.1.3 演化过程模型

4.1.4 并发模型

4.1.5 演化过程的最终评述

4.2 专用过程模型

4.2.1 基于构件的开发

4.2.2 形式化方法模型

4.2.3 面向方面的软件开发

4.3 统一过程

4.3.1 统一过程的简史

4.3.2 统一过程的阶段 

4.4 个人过程模型和团队过程模型

4.4.1 个人软件过程

4.4.2 团队软件过程

4.5 过程技术

4.6 产品和过程

4.7 小结

习题与思考题

扩展阅读与信息资源

第5章 敏捷开发

5.1 什么是敏捷

5.2 敏捷及变更成本

5.3 什么是敏捷过程

5.3.1 敏捷原则

5.3.2 敏捷开发战略

5.4 极限编程

5.4.1 极限编程过程

5.4.2 工业极限编程

5.5 其他敏捷过程模型

5.5.1 Scrum

5.5.2 动态系统开发方法

5.5.3 敏捷建模

5.5.4 敏捷统一过程

5.6 敏捷过程工具集

5.7 小结

习题与思考题

扩展阅读与信息资源 

第6章 软件工程的人员方面

6.1 软件工程师的特质

6.2 软件工程心理学

6.3 软件团队

6.4 团队结构

6.5 敏捷团队

6.5.1 通用敏捷团队

6.5.2 XP团队

6.6 社交媒体的影响

6.7 软件工程中云的应用

6.8 协作工具

6.9 全球化团队

6.10 小结

习题与思考题

扩展阅读与信息资源

第二部分 建模

第7章 指导实践的原则

7.1 软件工程知识

7.2 核心原则

7.2.1 指导过程的原则

7.2.2 指导实践的原则

7.3 指导每个框架活动的原则

7.3.1 沟通原则

7.3.2 策划原则 

7.3.3 建模原则

7.3.4 构建原则

7.3.5 部署原则

7.4 工作实践

7.5 小结

习题与思考题

扩展阅读与信息资源

第8章 理解需求

8.1 需求工程

8.2 建立根基

8.2.1 确认利益相关者

8.2.2 识别多重观点

8.2.3 协同合作

8.2.4 首次提问 

8.2.5 非功能需求

8.2.6 可追溯性

8.3 获取需求

8.3.1 协作收集需求

8.3.2 质量功能部署

8.3.3 使用场景

8.3.4 获取工作产品

8.3.5 敏捷需求获取

8.3.6 面向服务的方法

8.4 开发用例

8.5 构建分析模型

8.5.1 分析模型的元素

8.5.2 分析模式

8.5.3 敏捷需求工程

8.5.4 自适应系统的需求

8.6 协商需求

8.7 需求监控

8.8 确认需求

8.9 避免常见错误

8.10 小结

习题与思考题

扩展阅读与信息资源

第9章 需求建模:基于场景的

方法

9.1 需求分析

9.1.1 总体目标和原理

9.1.2 分析的经验原则

9.1.3 域分析

9.1.4 需求建模的方法

9.2 基于场景建模

9.2.1 创建初始用例

9.2.2 细化初始用例

9.2.3 编写正式用例

9.3 补充用例的UML模型

9.3.1 开发活动图

9.3.2 泳道图

9.4 小结

习题与思考题

扩展阅读与信息资源

第10章 需求建模:基于类的方法

10.1 识别分析类

10.2 描述属性

10.3 定义操作

10.4 类–职责–协作者建模

10.5 关联和依赖

10.6 分析包

10.7 小结

习题与思考题

扩展阅读与信息资源

第11章 需求建模:行为、模式和Web /移动App

11.1 生成行为模型

11.2 识别用例事件

11.3 状态表达

11.4 需求建模的模式

11.4.1 发现分析模式

11.4.2 需求模式举例:执行器–传感器

11.5 Web /移动App的需求建模

11.5.1 多少分析才够用

11.5.2 需求建模的输入

11.5.3 需求建模的输出

11.5.4 内容模型

11.5.5 WebApp和移动App的交互模型

11.5.6 功能模型

11.5.7 WebApp的配置模型

11.5.8 导航建模

11.6 小结

习题与思考题 

扩展阅读与信息资源    

第12章 设计概念   

12.1 软件工程中的设计   

12.2 设计过程   

12.2.1 软件质量指导原则和属性   

12.2.2 软件设计的演化    

12.3 设计概念    

12.3.1 抽象    

12.3.2 体系结构    

12.3.3 模式    

12.3.4 关注点分离    

12.3.5 模块化    

12.3.6 信息隐蔽    

12.3.7 功能独立    

12.3.8 求精   

12.3.9 方面  

12.3.10 重构   

12.3.11 面向对象的设计概念 

12.3.12 设计类    

12.3.13 依赖倒置    

12.3.14 测试设计   

12.4 设计模型    

12.4.1 数据设计元素   

12.4.2 体系结构设计元素   

12.4.3 接口设计元素   

12.4.4 构件级设计元素   

12.4.5 部署级设计元素    

12.5 小结    

习题与思考题    

扩展阅读与信息资源   

第13章 体系结构设计    

13.1 软件体系结构   

13.1.1 什么是体系结构    

13.1.2 体系结构为什么重要    

13.1.3 体系结构描述    

13.1.4 体系结构决策    

13.2 体系结构类型    

13.3 体系结构风格    

13.3.1 体系结构风格的简单分类    

13.3.2 体系结构模式    

13.3.3 组织和求精    

13.4 体系结构考虑要素   

13.5 体系结构决策   

13.6 体系结构设计    

13.6.1 系统环境的表示   

13.6.2 定义原型    

13.6.3 将体系结构细化为构件    

13.6.4 描述系统实例    

13.6.5 WebApp的体系结构设计  

13.6.6 移动App的体系结构设计    

13.7 评估候选的体系结构设计  

13.7.1 体系结构描述语言   

13.7.2 体系结构评审    

13.8 经验学习   

13.9 基于模式的体系结构评审    

13.10 体系结构一致性检查    

13.11 敏捷性与体系结构    

13.12 小结    

习题与思考题    

扩展阅读与信息资源    

第14章 构件级设计    

14.1 什么是构件    

14.1.1 面向对象的观点    

14.1.2 传统的观点    

14.1.3 过程相关的观点    

14.2 设计基于类的构件    

14.2.1 基本设计原则    

14.2.2 构件级设计指导方针   

14.2.3 内聚性    

14.2.4 耦合性    

14.3 实施构件级设计    

14.4 WebApp的构件级设计   

14.4.1 构件级内容设计    

14.4.2 构件级功能设计   

14.5 移动App的构件级设计    

14.6 设计传统构件    

14.7 基于构件的开发   

14.7.1 领域工程    

14.7.2 构件的合格性检验、适应性修改与组合    

14.7.3 体系结构不匹配    

14.7.4 复用的分析与设计    

14.7.5 构件的分类与检索    

14.8 小结    

习题与思考题    

扩展阅读与信息资源    

第15章 用户界面设计    

15.1 黄金规则    

15.1.1 把控制权交给用户    

15.1.2 减轻用户的记忆负担    

15.1.3 保持界面一致    

15.2 用户界面的分析和设计    

15.2.1 用户界面分析和设计模型    

15.2.2 过程    

15.3 界面分析    

15.3.1 用户分析    

15.3.2 任务分析和建模   

15.3.3 显示内容分析   

15.3.4 工作环境分析    

15.4 界面设计步骤    

15.4.1 应用界面设计步骤    

15.4.2 用户界面设计模式    

15.4.3 设计问题    

15.5 WebApp和移动App的界面设计    

15.5.1 界面设计原则与指导方针   

15.5.2 WebApp和移动App的界面设计工作流   

15.6 设计评估   

15.7 小结    

习题与思考题    

扩展阅读与信息资源    

第16章 基于模式的设计    

16.1 设计模式   

16.1.1 模式的种类  

16.1.2 框架    

16.1.3 描述模式    

16.1.4 模式语言和模式库    

16.2 基于模式的软件设计   

16.2.1 不同环境下基于模式的设计    

16.2.2 用模式思考    

16.2.3 设计任务   

16.2.4 建立模式组织表    

16.2.5 常见设计错误   

16.3 体系结构模式    

16.4 构件级设计模式    

16.5 用户界面设计模式    

16.6 WebApp设计模式    

16.6.1 设计焦点    

16.6.2 设计粒度    

16.7 移动App模式    

16.8 小结    

习题与思考题    

扩展阅读与信息资源    

第17章 WebApp设计    

17.1 WebApp设计质量    

17.2 设计目标    

17.3 WebApp设计金字塔    

17.4 WebApp界面设计    

17.5 美学设计    

17.5.1 布局问题    

17.5.2 平面设计问题   

17.6 内容设计    

17.6.1 内容对象    

17.6.2 内容设计问题    

17.7 体系结构设计    

17.7.1 内容体系结构    

17.7.2 WebApp体系结构    

17.8 导航设计   

17.8.1 导航语义  

17.8.2 导航语法   

17.9 构件级设计   

17.10 小结   

习题与思考题    

扩展阅读与信息资源   

第18章 移动App设计    

18.1 挑战   

18.1.1 开发因素   

18.1.2 技术因素   

18.2 开发移动App    

18.2.1 移动App质量    

18.2.2 用户界面设计    

18.2.3 环境感知App    

18.2.4 经验教训   

18.3 移动App设计的最佳实践   

18.4 移动开发环境   

18.5 云   

18.6 传统软件工程的适用性   

18.7 小结   

习题与思考题    

扩展阅读与信息资源    

第三部分 质量管理

第19章 质量概念    

19.1 什么是质量    

19.2 软件质量    

19.2.1 Garvin的质量维度    

19.2.2 McCall的质量因素    

19.2.3 ISO 9126质量因素   

19.2.4 定向质量因素    

19.2.5 过渡到量化观点    

19.3 软件质量困境    

19.3.1 “足够好”的软件    

19.3.2 质量的成本    

19.3.3 风险    

19.3.4 疏忽和责任   

19.3.5 质量和安全   

19.3.6 管理活动的影响    

19.4 实现软件质量   

19.4.1 软件工程方法   

19.4.2 项目管理技术    

19.4.3 质量控制    

19.4.4 质量保证    

19.5 小结    

习题与思考题    

扩展阅读与信息资源    

第20章 评审技术  

20.1 软件缺陷对成本的影响    

20.2 缺陷的放大和消除   

20.3 评审度量及其应用  

20.3.1 分析度量数据   

20.3.2 评审的成本效益    

20.4 评审的正式程度    

20.5 非正式评审    

20.6 正式技术评审    

20.6.1 评审会议  

20.6.2 评审报告和记录保存  

20.6.3 评审指导原则   

20.6.4 样本驱动评审    

20.7 产品完成后评估    

20.8 小结    

习题与思考题   

扩展阅读与信息资源   

第21章 软件质量保证    

21.1 背景问题    

21.2 软件质量保证的要素    

21.3 软件质量保证的过程和产品特性

21.4 软件质量保证的任务、目标和度量    

21.4.1 软件质量保证的任务   

21.4.2 目标、属性和度量  

21.5 软件质量保证的形式化方法  

21.6 统计软件质量保证   

21.6.1 一个普通的例子    

21.6.2 软件工程中的六西格玛   

21.7 软件可靠性    

21.7.1 可靠性和可用性的测量  

21.7.2 软件安全   

21.8 ISO 9000质量标准   

21.9 软件质量保证计划   

21.10 小结    

习题与思考题    

扩展阅读与信息资源    

第22章 软件测试策略   

22.1 软件测试的策略性方法    

22.1.1 验证与确认  

22.1.2 软件测试组织    

22.1.3 软件测试策略——宏观   

22.1.4 测试完成的标准    

22.2 策略问题    

22.3 传统软件的测试策略  

22.3.1 单元测试   

22.3.2 集成测试  

22.4 面向对象软件的测试策略    

22.4.1 面向对象环境中的单元测试  

22.4.2 面向对象环境中的集成测试    

22.5 WebApp的测试策略    

22.6 移动App的测试策略    

22.7 确认测试   

22.7.1 确认测试准则   

22.7.2 配置评审  

22.7.3 α测试和β测试  

22.8 系统测试  

22.8.1 恢复测试    

22.8.2 安全测试    

22.8.3 压力测试 

22.8.4 性能测试  

22.8.5 部署测试   

22.9 调试技巧    

22.9.1 调试过程    

22.9.2 心理因素    

22.9.3 调试策略    

22.9.4 纠正错误    

22.10 小结    

习题与思考题  

扩展阅读与信息资源  

第23章 测试传统的应用软件    

23.1 软件测试基础    

23.2 测试的内部视角和外部视角    

23.3 白盒测试

23.4 基本路径测试    

23.4.1 流图表示    

23.4.2 独立程序路径    

23.4.3 生成测试用例   

23.4.4 图矩阵   

23.5 控制结构测试    

23.6 黑盒测试   

23.6.1 基于图的测试方法   

23.6.2 等价类划分  

23.6.3 边界值分析   

23.6.4 正交数组测试   

23.7 基于模型的测试    

23.8 文档测试和帮助设施测试 

23.9 实时系统的测试 

23.10 软件测试模式    

23.11 小结   

习题与思考题   

扩展阅读与信息资源 

第24章 测试面向对象的应用   

24.1 扩展测试的视野

24.2 测试OOA和OOD模型   

24.2.1 OOA和OOD模型的正确性  

24.2.2 面向对象模型的一致性   

24.3 面向对象测试策略   

24.3.1 面向对象环境中的单元测试  

24.3.2 面向对象环境中的集成测试    

24.3.3 面向对象环境中的确认测试    

24.4 面向对象测试方法   

24.4.1 面向对象概念的测试用例设计含义    

24.4.2 传统测试用例设计方法的可应用性    

24.4.3 基于故障的测试    

24.4.4 基于场景的测试设计    

24.5 类级可应用的测试方法    

24.5.1 面向对象类的随机测试   

24.5.2 类级的划分测试    

24.6 类间测试用例设计    

24.6.1 多类测试    

24.6.2 从行为模型导出的测试   

24.7 小结   

习题与思考题   

扩展阅读与信息资源   

第25章 测试WebApp  

25.1 WebApp的测试概念   

25.1.1 质量维度   

25.1.2 WebApp环境中的错误   

25.1.3 测试策略   

25.1.4 测试计划   

25.2 测试过程概述    

25.3 内容测试   

25.3.1 内容测试的目标   

25.3.2 数据库测试   

25.4 用户界面测试    

25.4.1 界面测试策略   

25.4.2 测试界面机制    

25.4.3 测试界面语义    

25.4.4 可用性测试    

25.4.5 兼容性测试    

25.5 构件级测试    

25.6 导航测试   

25.6.1 测试导航语法   

25.6.2 测试导航语义?   

25.7 配置测试    

25.7.1 服务器端问题   

25.7.2 客户端问题    

25.8 安全性测试    

25.9 性能测试    

25.9.1 性能测试的目标    

25.9.2 负载测试    

25.9.3 压力测试   

25.10 小结    

习题与思考题  

扩展阅读与信息资源    

第26章 测试移动App    

26.1 测试准则    

26.2 测试策略    

26.2.1 传统方法适用吗    

26.2.2 对自动化的要求    

26.2.3 建立测试矩阵   

26.2.4 压力测试   

26.2.5 生产环境中的测试    

26.3 与用户交互的各种情况  

26.3.1 手语测试  

26.3.2 语音输入和识别    

26.3.3 虚拟键盘输入  

26.3.4 警报和异常条件    

26.4 跨界测试    

26.5 实时测试问题   

26.6 测试工具和环境 

26.7 小结   

习题与思考题   

扩展阅读与信息资源    

第27章 安全性工程  

27.1 安全性需求分析    

27.2 网络世界中的安全性与保密性   

27.2.1 社交媒体   

27.2.2 移动App    

27.2.3 云计算    

27.2.4 物联网  

27.3 安全性工程分析   

27.3.1 安全性需求获取    

27.3.2 安全性建模    

27.3.3 测度设计   

27.3.4 正确性检查    

27.4 安全性保证  

27.4.1 安全性保证过程    

27.4.2 组织和管理   

27.5 安全性风险分析    

27.6 传统软件工程活动的作用    

27.7 可信性系统验证    

27.8 小结    

习题与思考题   

扩展阅读与信息资源  

第28章 形式化建模与验证  

28.1 净室策略    

28.2 功能规格说明   

28.2.1 黑盒规格说明    

28.2.2 状态盒规格说明    

28.2.3 清晰盒规格说明   

28.3 净室设计    

28.3.1 设计细化    

28.3.2 设计验证    

28.4 净室测试    

28.4.1 统计使用测试  

28.4.2 认证    

28.5 重新思考形式化方法    

28.6 形式化方法的概念   

28.7 其他争论    

28.8 小结    

习题与思考题    

扩展阅读与信息资源    

第29章 软件配置管理   

29.1 软件配置管理概述   

29.1.1 SCM场景  

29.1.2 配置管理系统的元素   

29.1.3 基线    

29.1.4 软件配置项   

29.1.5 依赖性和变更管理   

29.2 SCM中心存储库    

29.2.1 一般特征和内容    

29.2.2 SCM特征    

29.3 SCM过程   

29.3.1 软件配置中的对象标识    

29.3.2 版本控制    

29.3.3 变更控制    

29.3.4 影响管理    

29.3.5 配置审核   

29.3.6 状态报告    

29.4 WebApp和移动App的配置管理    

29.4.1 主要问题    

29.4.2 配置对象    

29.4.3 内容管理    

29.4.4 变更管理    

29.4.5 版本控制    

29.4.6 审核和报告    

29.5 小结    

习题与思考题    

扩展阅读与信息资源    

第30章 产品度量    

30.1 产品度量框架    

30.1.1 测度、度量和指标    

30.1.2 产品度量的挑战    

30.1.3 测量原则    

30.1.4 面向目标的软件测量    

30.1.5 有效软件度量的属性    

30.2 需求模型的度量    

30.2.1 基于功能的度量    

30.2.2 规格说明质量的度量    

30.3 设计模型的度量    

30.3.1 体系结构设计的度量    

30.3.2 面向对象设计的度量  

30.3.3 面向类的度量——CK度量集    

30.3.4 面向类的度量——MOOD度量集   

30.3.5 Lorenz和Kidd提出的面向对象的度量  

30.3.6 构件级设计的度量    

30.3.7 面向操作的度量    

30.3.8 用户界面设计的度量    

30.4 WebApp和移动App的设计度量    

30.5 源代码的度量   

30.6 测试的度量    

30.6.1 用于测试的Halstead度量   

30.6.2 面向对象测试的度量    

30.7 维护的度量    

30.8 小结    

习题与思考题   

扩展阅读与信息资源    

第四部分 管理软件项目

第31章 项目管理概念   

31.1 管理涉及的范围   

31.1.1 人员   

31.1.2 产品    

31.1.3 过程    

31.1.4 项目   

31.2 人员 

31.2.1 利益相关者   

31.2.2 团队负责人    

31.2.3 软件团队   

31.2.4 敏捷团队   

31.2.5 协调和沟通问题    

31.3 产品   

31.3.1 软件范围    

31.3.2 问题分解    

31.4 过程   

31.4.1 合并产品和过程    

31.4.2 过程分解   

31.5 项目   

31.6 W5HH原则    

31.7 关键实践    

31.8 小结    

习题与思考题   

扩展阅读与信息资源    

第32章 过程度量与项目度量   

32.1 过程领域和项目领域中的度量    

32.1.1 过程度量和软件过程改进    

32.1.2 项目度量    

32.2 软件测量    

32.2.1 面向规模的度量    

32.2.2 面向功能的度量    

32.2.3 调和代码行度量和功能点度量    

32.2.4 面向对象的度量    

32.2.5 面向用例的度量    

32.2.6 WebApp项目的度量   

32.3 软件质量的度量    

32.3.1 测量质量    

32.3.2 缺陷排除效率    

32.4 在软件过程中集成度量    

32.4.1 支持软件度量的论点   

32.4.2 建立基线    

32.4.3 度量收集、计算和评估   

32.5 小型组织的度量    

32.6 制定软件度量大纲    

32.7 小结    

习题与思考题    

扩展阅读与信息资源    

第33章 软件项目估算    

33.1 对估算的观察    

33.2 项目计划过程   

33.3 软件范围和可行性    

33.4 资源   

33.4.1 人力资源    

33.4.2 可复用软件资源   

33.4.3 环境资源  

33.5 软件项目估算    

33.6 分解技术    

33.6.1 软件规模估算    

33.6.2 基于问题的估算    

33.6.3 基于LOC估算的实例    

33.6.4 基于FP估算的实例    

33.6.5 基于过程的估算    

33.6.6 基于过程估算的实例    

33.6.7 基于用例的估算    

33.6.8 基于用例点估算的实例    

33.6.9 调和不同的估算方法    

33.7 经验估算模型   

33.7.1 估算模型的结构   

33.7.2 COCOMOⅡ模型    

33.7.3 软件方程   

33.8 面向对象项目的估算   

33.9 特殊的估算技术  

33.9.1 敏捷开发的估算   

33.9.2 WebApp项目的估算  

33.10 自行开发或购买的决策    

33.10.1 创建决策树    

33.10.2 外包    

33.11 小结    

习题与思考题    

扩展阅读与信息资源    

第34章 项目进度安排    

34.1 基本概念    

34.2 项目进度安排概述    

34.2.1 基本原则   

34.2.2 人员与工作量之间的关系    

34.2.3 工作量分配   

34.3 为软件项目定义任务集    

34.3.1 任务集举例    

34.3.2 主要任务的细化    

34.4 定义任务网络   

34.5 进度安排   

34.5.1 时序图   

34.5.2 跟踪进度  

34.5.3 跟踪面向对象项目的进展   

34.5.4 WebApp和移动App项目的进度安排    

34.6 挣值分析    

34.7 小结    

习题与思考题   

扩展阅读与信息资源    

第35章 风险管理    

35.1 被动风险策略和主动风险策略    

35.2 软件风险    

35.3 风险识别 

35.3.1 评估整体项目风险   

35.3.2 风险因素和驱动因子    

35.4 风险预测   

35.4.1 建立风险表   

35.4.2 评估风险影响   

35.5 风险细化  

35.6 风险缓解、监测和管理   

35.7 RMMM计划    

35.8 小结    

习题与思考题   

扩展阅读与信息资源   

第36章 维护与再工程   

36.1 软件维护  

36.2 软件可支持性    

36.3 再工程   

36.4 业务过程再工程    

36.4.1 业务过程    

36.4.2 BPR模型    

36.5 软件再工程    

36.5.1 软件再工程过程模型    

36.5.2 软件再工程活动    

36.6 逆向工程  

36.6.1 理解数据的逆向工程    

36.6.2 理解处理的逆向工程   

36.6.3 用户界面的逆向工程    

36.7 重构    

36.7.1 代码重构    

36.7.2 数据重构    

36.8 正向工程     

36.8.1 客户/服务器体系结构的正向工程   

36.8.2 面向对象体系结构的正向工程   

36.9 再工程经济学    

36.10 小结    

习题与思考题    

扩展阅读与信息资源   

第五部分 软件工程高级课题

第37章 软件过程改进  

37.1 什么是SPI  

37.1.1 SPI的方法    

37.1.2 成熟度模型    

37.1.3 SPI适合每个人吗  

37.2 SPI过程   

37.2.1 评估和差距分析  

37.2.2 教育和培训    

37.2.3 选择和合理性判定   

37.2.4 设置/迁移  

37.2.5 评价   

37.2.6 SPI的风险管理    

37.3 CMMI    

37.4 人员CMM    

37.5 其他SPI框架    

37.6 SPI的投资收益率   

37.7 SPI趋势    

37.8 小结  

习题与思考题    

扩展阅读与信息资源   

第38章 软件工程的新趋势    

38.1 技术演变   

38.2 关于纯粹工程学科的展望   

38.3 观察软件工程的发展趋势 

38.4 识别“软趋势”    

38.4.1 管理复杂性  

38.4.2 开放世界软件   

38.4.3 意外需求   

38.4.4 人才技能结合    

38.4.5 软件构造块    

38.4.6 对“价值”认识的转变    

38.4.7 开源   

38.5 技术方向    

38.5.1 过程趋势    

38.5.2 巨大的挑战    

38.5.3 协同开发    

38.5.4 需求工程    

38.5.5 模型驱动的软件开发    

38.5.6 后现代设计    

38.5.7 测试驱动的开发    

38.6 相关工具的趋势  

38.7 小结    

习题与思考题    

扩展阅读与信息资源   

第39章 结束语    

39.1 再论软件的重要性    

39.2 人员及其构造系统的方式   

39.3 表示信息的新模式    

39.4 远景   

39.5 软件工程师的责任  

39.6 写在最后  

索引  

在线资源

附录1 UML 简介

附录2 面向对象概念

附录3 形式化方法

参考文献

时间: 2024-10-29 11:32:20

《实践者的研究方法》—— 导读的相关文章

《深入理解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