COMPUTER SCIENCE · AN OVERVIEW · CHAPTER 7

软件工程

SOFTWARE ENGINEERING

第 6 章给了我们“写程序”的语言——本章讨论如何把一个大型软件系统当作工程来建造:研究软件工程的目标,就是找到一些原则来指导软件开发过程,进而生产出高效可靠的软件产品。

《计算机科学概论》(第 13 版) J. Glenn Brookshear | 大学一年级 · 教学页
生命周期 · 瀑布/增量/迭代 · 模块化 · 耦合与内聚 · UML · 设计模式 · 质量保证 · 文档 · 人机界面
软件工程:从蓝图到系统
CHAPTER 7 · LEARNING MAP

本章学习地图

每节末尾附“本节小结”;每节配 2 道课堂选择题(A/B/C/D),共 16 题,参考答案见页面底部。

小节核心问题关键概念
7.1 软件工程科学大型软件的开发为什么需要“工程化”?实践派 · 理论派 · 协作与沟通
7.2 软件生命周期软件从诞生到退役经历哪些阶段?开发-使用-维护循环 · 需求分析 · 设计 · 实现 · 测试
7.3 软件工程方法学用什么过程模型组织开发?瀑布模型 · 增量/迭代 · 原型 · 开源 · 敏捷/XP
7.4 模块化如何把大系统拆成易处理的单元?耦合 · 内聚 · 信息隐藏 · 组件与接口
7.5 行业工具分析与设计阶段用什么建模?数据流图 · 数据字典 · UML · 设计模式
7.6 质量保证如何系统地提升软件质量?帕累托法则 · 基本路径测试
7.7 文档软件包为什么少不了文档?用户文档 · 系统文档 · 技术文档
7.8 人机界面界面好坏如何度量?GOMS:目标/操作/方法/选择规则
7.9 软件所有权和责任使用软件的法律边界在哪里?软件许可 · 知识产权
一条主线:写程序 ≠ 造系统——第 6 章给了我们“写程序”的工具,本章教我们“造系统”的方法。开发大型系统所面对的问题,并非只是编写小程序所面对问题的放大
7.1 THE SOFTWARE ENGINEERING DISCIPLINE

7.1 软件工程科学

软件工程 software engineering:计算机科学的分支,致力于寻找指导大型复杂软件系统开发的原则——目标是生产出高效可靠的软件产品。

Practitioners
实践派
工作指向开发直接应用的技术。值得注意的是:实践派以前提出的许多方法已经被其他方法代替,新方法本身也可能随时间被淘汰——技术在快速更替。
Theorists
理论派
致力于探寻软件工程的基础原理和理论,为将来构建更稳定的技术而努力。理论派的进展一直很缓慢,但价值持久。
Not Just Scaling Up
不只是小程序的放大
开发大型系统所面对的问题并非只是编写小程序所面对问题的放大:参与的人多了、生命周期长了、需求还会不断变化——量变引发质变。
Collaboration & Communication
协作与沟通
协作可以减小单个程序员需要完成的任务的大小和复杂度;但迭代开发中的协作需要与单独开发不同的技能,成功协作依赖参与者之间的有效沟通
为什么两个层面都需要?我们这个社会已经沉迷于计算机系统及其相关软件——银行、医院、交通都运行在软件之上。实践派解决“今天怎么造”,理论派回答“明天能不能造得更可靠”,两方面的需求都是巨大的。
本节小结 · 7.1

软件工程 = 寻找指导大型复杂软件系统开发的原则;研究在实践派(直接应用技术)与理论派(基础原理)两个层面进行。

大型软件的问题不是小程序问题的简单放大;协作与有效沟通是团队开发成功的关键。

Q1软件工程这门学科的研究目标是?
A编写尽可能多的代码
B找到指导软件开发过程的原则,生产出高效可靠的软件产品
C设计更快的计算机硬件
D为每个程序员分配固定任务
答案 B。研究软件工程的目标就是找到指导软件开发过程的原则,进而生产出高效可靠的软件产品。
Q2关于软件工程研究中的“实践派”与“理论派”,下列说法正确的是?
A实践派提出的方法永远不会过时
B理论派的进展十分迅速
C实践派开发直接应用的技术,理论派探寻基础原理,两方面都有巨大需求
D两派研究的内容完全相同
答案 C。实践派的许多方法已被代替(A 错),理论派进展一直很缓慢(B 错),两者分工不同但都有巨大需求。
7.2 THE SOFTWARE LIFE CYCLE

7.2 软件生命周期

软件生命周期 software life cycle:软件从需求分析、设计、开发、测试、部署到维护和退役的全过程——软件工程最基础的概念。

周期是个整体:开发 → 使用 ⇄ 维护

软件一旦开发完成,就进入“使用—维护”循环,一直持续到软件生命结束。点击圆环上的节点查看各阶段说明。

开发DEVELOP 使用USE 维护MAINTAIN 红色虚线: 维护修改后再投入使用
为什么会进入维护阶段?① 使用中发现了错误(需要修复);② 软件应用中发生的变化需要在软件中做相应的修改(适应性变更);③ 上一次修改中的变更导致软件中其他地方出现了问题(连锁反应)。

传统的开发阶段:四步走

1 · Requirements Analysis
需求分析
指定系统要提供的服务、确认服务条件、定义外界与系统的交互方式。与利益相关者协商权衡,成果写入软件需求规格说明(SRS)。
2 · Design
设计
为预期系统的构建制订计划——软件系统的内部结构(模块划分、数据组织、接口约定)在设计阶段建立。
3 · Implementation
实现
程序的实际编写、数据文件的创建和数据库的开发——把设计图纸变成可以运行的代码。
4 · Testing
测试
传统上等同于调试程序,并确认最终产品是否与软件需求规格说明文档相一致。
利益相关者(stakeholder):将来的使用者,还有其他有关联的人(如法律上或财务上相关的人)。软件需求规格说明(software requirements specification,SRS)是各方达成的书面协议——目的是指导软件开发,为日后可能产生的分歧提供解决方法。
一个诚实的现实:即使有现代的质量保障技术,大型软件系统仍然会有错误——许多错误可能在软件的整个生命周期内都检测不出来。消除这种错误是软件工程的目标之一。
软件生命周期:开发、使用、维护的循环
本节小结 · 7.2

软件一旦开发完成就进入“使用—维护”循环直至退役;维护由三类原因触发:发现错误、环境变化、修改引发新问题。

传统开发四阶段:需求分析(要做什么,成果是 SRS)→ 设计(建立内部结构)→ 实现(写程序、建数据文件和数据库)→ 测试(对照 SRS 确认产品)。

Q3软件生命周期中,软件一旦开发完成就进入的持续循环是?
A设计—测试循环
B使用—维护循环
C编码—调试循环
D分析—设计循环
答案 B。软件一旦开发完成,就进入使用和维护的周期,这个周期一直持续到软件生命结束。
Q4传统的软件开发生命周期中,四个主要步骤的正确顺序是?
A设计 → 需求分析 → 测试 → 实现
B需求分析 → 设计 → 实现 → 测试
C实现 → 测试 → 需求分析 → 设计
D需求分析 → 实现 → 设计 → 测试
答案 B。先搞清楚“要做什么”(需求分析),再计划“怎么造”(设计),然后动手写(实现),最后对照需求确认(测试)。
7.3 SOFTWARE ENGINEERING METHODOLOGIES

7.3 软件工程方法学

方法学 methodology:组织软件开发过程的总体策略——不同时代、不同项目适用不同模型。

模型English核心思想形象比喻
瀑布模型waterfall model以严格的顺序进行需求分析、设计、实现和测试像瀑布一样只能向一个方向“流动”
增量模型incremental model先交付功能有限的简化版本,再以递增方式不断添加功能并测试扩建:把前期版本扩展成更大的版本
迭代模型iterative model逐步构建和改进软件系统来实现最终产品打磨:反复改进每个版本
敏捷方法agile method增量基础上早期快速实现,响应需求变更,降低对严格需求分析和设计的强调轻装快跑:每天重复小周期

动手试一试:瀑布 vs 敏捷(极限编程)

点击“推进一步”,同时观察两种开发方式的节奏差异:瀑布一大步一大步单向流动;XP 每天重复“非正式需求分析、设计、实现和测试”的小周期。

两种模型都尚未开始
WATERFALL MODEL
瀑布模型:单向、大步
1需求分析(一次性完成)
2设计(冻结后才动工)
3实现(全部代码一次写完)
4测试(最后才见真章)
EXTREME PROGRAMMING
极限编程:每天一个小周期
第 1 个增量
需求设计实现测试
第 2 个增量
需求设计实现测试
第 3 个增量
需求设计实现测试
第 4 个增量
需求设计实现测试
点击“推进一步”开始演示。注意左侧瀑布模型每步跨越大,右侧 XP 每一步都在完整地走完一个小周期。

原型开发与开源开发

原型开发 prototyping:构建并评估预期系统的非完整版本(称为原型)的过程。

Evolutionary Prototyping
演化式原型开发
用于增量模型:把原型不断扩展、添砖加瓦,逐步发展为最终的完整系统——原型保留并长大。
Throwaway Prototyping
抛弃式原型开发
用于迭代性更强的情况:原型只用于探索与评估,完成后丢弃,让最后的设计有一个全新的实现——原型是“草稿纸”。
Open-Source Development
开源开发
软件的源代码公开:任何人都可以查看、使用、修改和分发。鼓励协作和共享,社区成员可为软件的开发、改进和维护做贡献——Linux、Python 都是著名的开源成果。
Agile & Extreme Programming
敏捷方法与极限编程
敏捷方法在增量的基础上早期快速实现、响应需求变更,降低对严格需求分析和设计的强调;极限编程(XP)是其典型例子:团队同处一地自由交换想法、相互协作。
增量 vs 迭代:两个概念不同却紧密相关——增量模型包含一个基本的迭代过程,而迭代模型也可以增量地增加功能。两者都常常借助原型开发的趋势。
本节小结 · 7.3

瀑布 = 严格顺序;增量 = 扩展前期版本;迭代 = 改进每个版本;敏捷 = 早期快速实现 + 响应变更;原型开发有演化式(原型长成系统)与抛弃式(用完即弃)两种归宿。

开源开发以公开源代码促进社区协作;没有放之四海皆准的模型——选择取决于项目规模、需求稳定性和团队文化。

Q5强调以严格顺序进行需求分析、设计、实现和测试、只能向一个方向“流动”的开发模型是?
A增量模型
B迭代模型
C瀑布模型
D敏捷模型
答案 C。瀑布模型之所以得名,正是因为它跟瀑布一样只能向一个方向流动——严格顺序、不走回头路。
Q6把原型发展为最终完整系统的过程称为?
A抛弃式原型开发
B演化式原型开发
C瀑布式原型开发
D极限编程
答案 B。演化式:原型保留并不断扩展为最终系统;抛弃式:原型评估完就丢弃、全新实现——两者恰好相反。
7.4 MODULARITY

7.4 模块化

模块化 modularity:把软件分割成多个易于处理的单元(模块),每个单元仅承担整个软件的一部分职责。命令式范型中模块表现为函数;面向对象范型中以对象作为基本模块要素。

耦合与内聚:模块设计的两条标尺

概念English含义设计目标
耦合coupling模块或组件之间的依赖程度。控制耦合:两个模块之间移交执行控制;数据耦合:模块之间的数据共享(如全局数据 global data——可被整个系统所有模块使用的数据项)最小化
内聚cohesion模块内部各部分的关联程度。逻辑内聚:部分元素实现逻辑上相似的活动;功能内聚:所有部分都聚焦于某一活动的性能最大化

动手试一试:感受一下耦合的代价

点击“切换设计”,观察两种模块布局:左边模块互相纠缠,右边各管各的。数数连线——连线越多,改一处要担心的地方就越多。

同样的 6 个模块,不同的依赖结构
设计 A:高耦合
14 条依赖
改任何一个模块,都可能波及全部其他模块

信息隐藏与组件

Information Hiding · Design Goal
信息隐藏 · 化身一:设计目标
限制软件系统指定部分信息的使用,阻止模块的动作对其他模块产生不必要的依赖或影响——设计层面体现为最大化内聚、最小化耦合
Information Hiding · Implementation Goal
信息隐藏 · 化身二:实现目标
编码层面落实为使用局部变量、应用封装(第 6 章面向对象的封装)、使用定义明确的控制结构
Component
组件
软件的一个可复用的单元:一个写得好的组件,可以在未来的系统里原封不动地再次使用。
Interface
接口
一个抽象的概念:定义一组功能或方法但不包含具体实现,规定不同软件组件之间的交互方式——模块只知接口、不知内部,这正是信息隐藏的落地。
本节小结 · 7.4

好设计的口诀:模块间低耦合(控制耦合/数据耦合),模块内高内聚(功能内聚优于逻辑内聚);全局数据是数据耦合失控的典型。

信息隐藏有两个化身:设计目标(高内聚低耦合)与实现目标(局部变量、封装、明确的控制结构);组件通过接口松散协作。

Q7模块或组件之间的依赖程度称为?
A内聚
B耦合
C封装
D继承
答案 B。模块之间的依赖程度叫耦合(coupling);模块内部各部分的关联程度才叫内聚(cohesion)——方向恰好相反。
Q8关于模块化设计,下列哪种做法是应当追求的?
A模块间高耦合、模块内低内聚
B模块间低耦合、模块内高内聚
C尽量多使用全局数据
D让每个模块承担尽可能多的职责
答案 B。模块间耦合应最小化、模块内部绑定程度应最大化;全局数据让所有模块纠缠在一起,应当克制使用。
7.5 TOOLS OF THE TRADE

7.5 行业工具

行业工具是软件开发的分析与设计阶段使用的建模技术和符号系统——先把系统“画”清楚,再动手建造。

较老的工具:数据流图与数据字典

Dataflow Diagram
数据流图
表示从数据流分析中获得的信息:箭头表示数据路径,椭圆表示数据操控发生的位置,矩形表示数据源和数据存储。
Data Dictionary
数据字典
整个软件系统中出现的数据项的中央信息库:标识符、有效条目的构成、存储位置、引用位置。目标:增强利益相关者与工程师的沟通、确立全系统一致性(常能借此发现冗余和矛盾)。

统一建模语言 UML:用例图一例

参与者 actor (如:病人) 拟建系统(大矩形框) 预约挂号 查询病历 缴费 椭圆 = 用例(use case),线 = 参与者与用例的交互
一个医院系统的用例图示意:火柴人(参与者)在系统边界之外,椭圆(用例)在边界之内。
Unified Modeling Language
统一建模语言 UML
基于面向对象范型思想发展而来的标准化建模语言,用于对软件系统进行可视化、描述和文档化,帮助开发者和设计者表达系统的结构、行为和交互。
Use Case Diagram
用例图
描述系统功能及其与用户(或其他系统)的交互,重点在于用户需求:大矩形框 = 拟建系统;椭圆 = 用例;火柴人 = 参与者。
Class Diagram
类图
描述系统中的类及其属性、方法和类之间的关系:矩形框表示类,线表示关联

设计模式:前人的好答案

Adapter Pattern
适配器模式
解决通过预制模块构建软件时经常出现的问题:就像电源转换插头,让接口不兼容的模块协同工作——不修改已有模块,只加一个“转接层”。
Decorator Pattern
装饰者模式
设计系统的手段:所设计的系统依据当时的情况完成相同活动的不同组合——像给咖啡加奶加糖,功能按需叠加而不改动原有结构。
设计模式的目标不只是“解决问题”:反复出现问题的识别、设计模式的创建和分类是一个不断进步的过程;目标还包括能在软件生命周期的后期提供灵活性的高质量方案——因此耦合最小化和内聚最大化的原则在设计模式的发展中起着重要作用。
本节小结 · 7.5

老工具:数据流图(箭头/椭圆/矩形)+ 数据字典(数据项的中央信息库);新主流:UML——用例图抓用户需求,类图画类与关联。

设计模式 = 反复出现的设计问题 + 预先开发的解决方案;适配器解决接口不兼容,装饰者支持功能按需组合,好模式服从低耦合高内聚。

Q9在 UML 的用例图(use case diagram)中,“参与者”(actor)通常用什么图形表示?
A矩形
B椭圆
C火柴人
D箭头
答案 C。参与者用火柴人表示;拟建系统用大矩形框,用例用椭圆——上面的医院系统示意图正是这样画的。
Q10用来解决“通过预制模块构建软件时接口不兼容”问题的设计模式是?
A装饰者模式
B适配器模式
C瀑布模式
D原型模式
答案 B。适配器模式就像电源转换插头,让接口不兼容的预制模块能够协同工作。
7.6 QUALITY ASSURANCE

7.6 质量保证

软件故障、成本超支、错过截止时间等现象的激增,对软件质量控制的方法提出了要求。

Scope of Quality Assurance
质量保证的范围
早期关注点集中在去除实现过程中产生的编程错误;如今的范围远超调试过程,分支包括软件工程过程的改进、培训课程的开设以及标准的制定
Basis Path Testing
基本路径测试
开发出一组测试数据,保证软件中的每条指令都能对这组测试数据至少执行一次——让每一行代码都被“踩”过,不给错误留死角。

帕累托法则:把火力集中在 20% 上

帕累托法则(Pareto Principle,又称二八法则/80-20 法则):很多情况下,约 80% 的结果由 20% 的原因造成。在软件工程中:对一个集中区域施加作用,往往就能明显改变结果。

20% 的模块
其余 80% 的模块
80% 的错误集中在这里
20%
测试策略的含义:先找出错误最集中的少数模块重点测试,投入产出比最高。
本节小结 · 7.6

质量保证的范围早已超出调试:还包括软件工程过程的改进、培训课程的开设以及标准的制定。

帕累托法则指导我们把测试火力集中在错误高发的少数区域;基本路径测试保证每条指令至少执行一次。

Q11帕累托法则(80/20 法则)在软件工程中的含义是?
A80% 的代码由 20% 的程序员编写
B对一个集中区域施加作用,往往就能明显改变结果
C80% 的时间用于编码,20% 用于测试
D软件中 80% 的错误无法修复
答案 B。帕累托法则在软件工程中的表述就是:通过对一个集中区域施加作用,往往就可以明显地改变结果。
Q12基本路径测试(basis path testing)的目标是?
A测试数据越多越好,没有上限
B只测试用户最常用的功能
C开发一组测试数据,保证软件中的每条指令至少执行一次
D让每条指令的执行时间最短
答案 C。基本路径测试要开发一组测试数据,保证软件中的每条指令都能对这组数据至少执行一次。
7.7 DOCUMENTATION

7.7 文档

文档是最终软件包的一个重要部分——软件文档有 3 种用途,因而可以划分为 3 类。

文档类型English用途读者 / 术语风格
用户文档user documentation解释软件的特性,并描述如何使用软件给软件用户阅读,采用应用方面的术语
系统文档system documentation描述软件的内部构成,便于在生命周期内维护软件维护人员;主要部分是系统中所有程序的源代码版本
技术文档technical documentation描述软件系统应该如何安装和维护安装/维护人员;台式机领域它与用户文档的界限比较模糊(用户常常也是安装维护者)
本节小结 · 7.7

三类文档:用户文档(怎么用)、系统文档(内部怎么构成,源代码是其主体)、技术文档(怎么安装和维护)。

文档不是附属品而是软件包的重要组成部分——没有文档的系统几乎无法维护;写文档的对象是“人”,不同读者需要不同的术语和详略。

Q13描述软件的内部构成、便于在生命周期内维护软件的文档是?
A用户文档
B系统文档
C技术文档
D需求文档
答案 B。系统文档描述软件的内部构成以便维护,其主要部分是系统中所有程序的源代码版本。
Q14关于用户文档(user documentation),下列说法正确的是?
A主要部分是源代码版本
B给软件用户阅读,采用应用方面的术语
C描述软件如何安装
D只写给程序员看
答案 B。用户文档解释软件特性、描述如何使用,写给软件用户看,因此采用应用方面的术语。
7.8 HUMAN-MACHINE INTERFACE · 7.9 SOFTWARE OWNERSHIP

7.8 人机界面 · 7.9 软件所有权和责任

系统界面的设计可能会成为判定一个软件工程项目是否成功的最终决定因素。

GOMS:把“好用”变成数字

G · Goal
目标
用户想要完成的任务,如“删除文本中的某个字”。
O · Operator
操作
基本动作,如单击鼠标按键、按键盘上的键。
M · Method
方法
完成目标的一系列操作组合,如“双击选中 + 按删除键”。
S · Selection Rule
选择规则
实现同一目标的两种方法之间如何选择的规则。

GOMS 把使用界面的动作分析成基本步骤序列,给每个步骤分配精确的时间段后求和——比较两个界面完成相似任务所需的时间。点击“计算并比较”试试:

任务:删除文本中的一个字
界面 A:双击选中 + 删除键
移动鼠标到目标字1.10 s
双击(选中该字)0.40 s
按下删除键0.20 s
总计 ? s
界面 B:逐个按退格键
移动光标到字后1.35 s
按退格键 × 2(删两个字符)0.80 s
确认结果0.30 s
总计 ? s
GOMS 的用途:不需要真实用户测试,先把两个设计放在纸面上算一遍。

7.9 软件所有权和责任

Software License
软件许可
软件所有者与软件产品用户之间的一份法律协议:授予用户使用产品的特定权限,而不转移知识产权的所有权。这些协议非常详细地解释了双方的权利和义务——在安装和使用某一软件产品之前,仔细阅读和理解软件许可中的条款是非常重要的。
本节小结 · 7.8 / 7.9

GOMS(Goal/Operator/Method/Selection rule)把界面操作拆成基本步骤并计时求和,从而在纸面上比较不同界面设计。

软件许可是法律协议:授予使用权而不转移知识产权;安装使用软件前应仔细阅读许可条款。

Q15人机界面度量模型 GOMS 中,字母 M 代表?
AMachine(机器)
BModule(模块)
CMethod(方法)
DMemory(记忆)
答案 C。GOMS = Goal(目标)、Operator(操作)、Method(方法)、Selection rule(选择规则)。
Q16关于软件许可(software license),下列说法正确的是?
A授予用户特定使用权,但不转移知识产权所有权
B购买软件即获得其全部知识产权
C只适用于开源软件
D安装软件前无需阅读许可条款
答案 A。软件许可授予用户使用产品的特定权限,知识产权仍归所有者;安装使用前仔细阅读条款非常重要。
ANSWER KEY

课堂练习参考答案(共 16 题)

先独立完成上面的练习,再来这里核对——错题对应的小节值得回看一遍。

小节题号答案一句话解析
7.1Q1B软件工程 = 找到指导开发的原则,生产高效可靠的软件。
7.1Q2C实践派做直接技术、理论派探基础原理,两方面需求都巨大。
7.2Q3B开发完成后进入“使用—维护”循环直至退役。
7.2Q4B需求分析 → 设计 → 实现 → 测试,顺序不能乱。
7.3Q5C瀑布模型严格顺序、单向流动,像瀑布一样。
7.3Q6B原型长成最终系统 = 演化式;用完丢弃 = 抛弃式。
7.4Q7B模块间依赖程度叫耦合;内部关联程度叫内聚。
7.4Q8B好设计追求低耦合、高内聚,少用全局数据。
7.5Q9C参与者 actor 用火柴人,用例用椭圆,系统用大矩形。
7.5Q10B适配器模式解决预制模块的接口不兼容问题。
7.6Q11B帕累托法则:作用于集中区域即可明显改变结果。
7.6Q12C基本路径测试保证每条指令至少被执行一次。
7.7Q13B系统文档描述内部构成,源代码是其主要部分。
7.7Q14B用户文档给用户看,采用应用方面的术语。
7.8Q15CGOMS = 目标、操作、方法、选择规则。
7.9Q16A许可授予使用权,知识产权仍归所有者。
答案速记
7.1 学科
B · C
7.2 生命周期
B · B
7.3 方法学
C · B
7.4 模块化
B · B
7.5 行业工具
C · B
7.6 质量保证
B · C
7.7 文档
B · B
7.8 / 7.9
C · A
CHAPTER 7 · SUMMARY

全章总结

软件开发是一个工程化的过程:找到原则来指导开发,进而生产出高效可靠的软件产品。

小节一句话总结关键术语
7.1 软件工程科学实践派做技术、理论派探原理;协作与沟通是关键practitioner · theorist
7.2 软件生命周期开发 → 使用 ⇄ 维护;需求分析/设计/实现/测试life cycle · SRS · stakeholder
7.3 方法学瀑布严格顺序;增量扩展、迭代改进;敏捷响应变化waterfall · agile · prototyping
7.4 模块化低耦合 + 高内聚 + 信息隐藏;组件通过接口协作coupling · cohesion · interface
7.5 行业工具数据流图/数据字典 → UML;设计模式复用好方案UML · design pattern
7.6 质量保证超出调试的范围;帕累托法则聚焦 20% 高发区Pareto · basis path testing
7.7 文档用户/系统/技术三类文档,各有读者与术语user/system/technical docs
7.8 人机界面GOMS 把界面操作拆成步骤并计时比较GOMS
7.9 所有权和责任软件许可授予使用权,不转移知识产权software license
下一章预告:第 8 章《数据抽象》——用栈、队列、树等结构组织数据,让算法在抽象的数据形态上工作。
GLOSSARY

本章术语表(中英对照)

重点名词双语对照 + 一句话释义;建议结课时自查一遍。

软件工程software engineering指导大型软件开发的原则体系
软件生命周期software life cycle从需求分析到退役的全过程
利益相关者stakeholder使用者及法律/财务相关的人
需求规格说明SRS各方达成的需求书面协议
瀑布模型waterfall model严格顺序、单向流动
增量模型incremental model逐版本扩展功能
迭代模型iterative model逐版本改进系统
原型开发prototyping构建评估非完整版本
开源开发open-source development源代码公开、社区协作
敏捷方法agile method快速实现、响应变更
极限编程extreme programming每日小周期的敏捷实践
模块化modularity把软件分割成易处理的单元
耦合coupling模块间的依赖程度
内聚cohesion模块内部的关联程度
信息隐藏information hiding限制指定部分信息的使用
组件component可复用的软件单元
接口interface规定交互方式,不含实现
数据流图dataflow diagram箭头=路径/椭圆=加工
数据字典data dictionary数据项的中央信息库
统一建模语言UML标准化的可视化建模语言
用例图use case diagram火柴人+椭圆描述交互
设计模式design pattern反复问题的预开发方案
帕累托法则Pareto principle80% 结果来自 20% 原因
基本路径测试basis path testing每条指令至少执行一次
系统文档system documentation内部构成,源代码为主体
GOMSGOMS目标/操作/方法/选择规则
软件许可software license授予使用权不移转产权
全局数据global data所有模块可用的数据项