本书阐述软件工程经济学的基本原理和分析方法,包括COCOMO模型分析,多目标决策分析,软件生命周期定量模型,软件项目的工程经济学基础,软件生命周期成本估算方法,以成本效益分析、边际分析、风险分析为基础的决策方法以及软件成本估算技术等。本书使用了大量案例,深入浅出、概念清晰,较好地结合了理论与实践。
本书适合作为大学高年级本科生和低年级研究生的软件工程经济学基础课程的教材,也可供广大软件从业人员参考。
第一部分动机与背景
第1章案例研究1:ScientificAmerican预订处理系统
1.1原有系统
1.2编程解决方案:自顶向下逐步求精
1.3编程方案:结果
1.4经济学编程方法
1.5经济学编程方法的结果
1.6综合讨论
1.7问题
第2章案例研究2:市内校区考勤系统
2.1编程方面
2.2经济学方面
2.3人际关系方面
2.4得到的教训
2.5综合讨论
2.6问题
第3章软件工程目标
3.1引言
3.1.1分而治之
3.1.2本章内容
3.2软件工程:定义
3.3软件趋势:成本
3.4软件趋势:社会影响
3.5目标的复杂性
3.6例子:WEINBERG的实验
3.7软件工程方法的复杂性
3.8软件工程目标结构
3.9软件工程的GOALS方法
3.10问题
第二部分软件生命周期:定量模型
第4章软件生命周期:阶段与活动
4.1引言
4.2瀑布模型
4.3瀑布模型的经济学基本原理
4.3.1前提A:所有过程子目标都是必要的
4.3.2前提B:顺序地处理子目标
4.3.3背离顺序方法:原型折中方法
4.4瀑布模型的精化
4.4.1增量开发
4.4.2先遣人员
4.4.3软件经济学意义
4.5详细的生命周期阶段定义
4.6详细的阶段/活动定义
4.7软件工作分解结构(WBS)
4.8软件维护
4.9问题
第5章基本COCOMO模型
5.1引言
5.1.1一些估算公式和问题
5.1.2COCOMO模型的版本
5.2定义与假设
5.3开发的工作量和进度
5.3.1基本COCOMO模型的工作量和进度公式:组织型模式
5.3.2项目轮廓
5.4阶段分布
5.5正常项目轮廓
5.6雷利(Rayleigh)分布
5.7插值法
5.8基本软件维护量估算
5.9问题
第6章基本COCOMO模型:开发模式
6.1引言
6.2基本工作量和进度公式
6.3软件开发的三种COCOMO模式
6.3.1组织型模式
6.3.2半独立型模式
6.3.3嵌入型模式
6.3.4总结
6.4对基本COCOMO工作量和进度公式的讨论
6.4.1COCOMO数据库
6.4.2工作量公式:估算与实际
6.4.3工作量公式:模式间的比较
6.4.4工作量公式:与其他模型的比较
6.4.5进度公式:估算与实际
6.4.6进度公式:与其他模型进行比较
6.5工作量与进度的阶段分布
6.5.1百分比分布
6.5.2表的使用
6.5.3基本项目轮廓
6.5.4劳动力分布曲线与雷利分布
6.5.5最后的观点
6.6问题
第7章基本COCOMO模型:活动分布
7.1引言
7.2按阶段的活动分布
7.3基本COCOMO案例研究:Hunt国家银行EFT系统
7.4绘制基本的项目组织系统图
7.4.1通用的软件项目组织系统图
7.4.2组织系统图裁剪指南
7.4.3示例:Hunt国家银行EFT项目
7.4.4其他阶段的组织系统图和决策
7.5基本COCOMO阶段与活动分布的讨论
7.5.1雷利曲线比较
7.5.2阶段/活动分布
7.6基本COCOMO的局限
7.7问题
第8章中等COCOMO模型:产品级估算
8.1引言
8.1.1中等COCOMO成本驱动因子属性
8.1.2本章预览
8.2中等COCOMO模型:软件开发工作量估算
8.2.1标称工作量换算公式
8.2.2软件开发工作量乘数
8.2.3工作量和进度的阶段与活动分布
8.3定价示例:微处理器通信软件
8.4管理示例:降低完成成本
8.4.1问题
8.4.2解决方案1:降低项目规模
8.4.3其他可能的解决方案
8.4.4其他的候选项
8.4.5解决方案的选择
8.5年维护工作量的调整估算
8.5.1不能用于维护阶段的成本驱动因子:SCED
8.5.2修正过的工作量乘数:可靠性要求
8.5.3修正过的工作量乘数:现代编程规范
8.6示例:微处理器通信软件的维护
8.7内插值和外插值
8.8估算改编现有软件的影响
8.8.1改编需考虑的因素
8.8.2COCOMO改编估算公式
8.8.3COCOMO改编估算公式的基本原理
8.8.4改编估算:注意事项
8.9对中等COCOMO工作量公式的讨论
8.9.1中等COCOMO估算与实际的对比
8.9.2中等COCOMO标称工作量估算公式与实际的比较
8.9.3加权的交付源指令度量标准
8.10问题
第9章中等COCOMO:组件级估算
9.1引言
9.2组件级估算表(CLEF)
9.3对改编的软件采用CLEF
9.4事务处理系统(TPS)示例:基本开发估算
9.4.1TPS描述
9.4.2前端处理器(FEP)软件子系统
9.4.3事务处理器(TP)软件子系统
9.4.4TPS操作系统软件的开发估算
9.5TPS组件级维护估算与阶段分布
9.6问题
第三部分软件工程经济学基础
第三部分A成本效益分析
第10章性能模型与成本效益模型
10.1性能模型
10.1.1示例
10.1.2综合讨论
10.2最佳性能
10.2.1示例
10.2.2综合讨论
10.3敏感性分析
10.3.1示例
10.3.2综合讨论
10.4成本效益模型
10.4.1示例
10.4.2综合讨论
10.5问题
第11章生产函数:规模经济
11.1示例
11.2综合讨论:定义
11.3离散的生产函数
11.4软件开发的基本生产函数
11.5规模经济与规模不经济
11.6大型软件项目的规模不经济
11.7应对规模不经济的最好方法
11.8问题
第12章可选方案的选择:决策标准
12.1示例:最大化可用预算
12.2最小化性能需求
12.3最大化效益/成本比
12.4最大化效益-成本差额
12.5复合选项
12.6综合讨论
12.7问题
第三部分B多目标决策分析
第13章净值与边际分析
13.1示例
13.2综合讨论:边际分析
13.3举例说明
13.4在处理净值与利润时的一些注意事项
13.5信息处理产品的价值
13.6问题
第14章现在与未来的支出与收入
14.1示例:过分简单的成本分析
14.2利息计算
14.3现值计算
14.4一系列现金流的现值
14.5租借与购买分析的总结
14.6综合讨论:现值概念与公式的总结
14.7现值特征
14.8对利率或贴现率的敏感性
14.9现值分析应用于软件工程
14.10问题
第15章品质因素
15.1示例:软件包选择
15.2净值分析
15.3品质因素分析
15.4综合讨论:软硬件选择的加权和分析-案例研究
15.5案例研究:活动描述
15.6案例研究:评价函数的问题
15.7案例研究:权重与级别的问题
15.8案例研究:总结
15.9已交付系统能力(DSC)品质因素
15.10DSC品质因素的轮廓
15.11重新考虑TPS示例
15.12加权和与DSC品质因素的比较
15.13问题
第16章目标作为约束条件
16.1示例:TPS选项A的失效模式
16.2系统可靠性与可用性
16.3品质因素评价
16.4把目标表述成约束条件
16.5目标作为约束条件:可行集和成本价值等值线
16.6综合讨论:有约束条件的决策问题
16.7软件工程应用
16.8数学优化技术
16.9数学优化技术的能力与局限性
16.10问题
第17章系统分析与约束优化
17.1示例
17.2综合讨论
17.3问题
第18章处理不可协调与不能量化的目标
18.1示例:TPS选项B:开发专用操作系统
18.2内部开发与供应商开发相比较时要考虑的事项
18.3描述方法
18.4综合讨论:不可量化标准
18.5不可量化标准的描述方法
18.6混合量化标准与不可量化标准的描述方法
18.7在描述与解释多变量数据时的一些注意事项
18.8问题
第三部分C处理不确定性、风险与信息的价值
第19章处理不确定性:风险分析
19.1示例:操作系统开发选项
19.2完全不确定性的决策规则
19.3主观概率
19.4总的讨论:完全不确定性情况下的决策规则
19.5信息的价值
19.6主观概率的应用
19.7效用函数
19.8软件工程的含义
19.9问题
第20章统计学决策理论:信息的价值
20.1示例:原型方法
20.2完全信息的期望价值
20.3应对不完全信息
20.4示例
20.5贝叶斯公式
20.6最大化原型的净期望价值
20.7总的讨论:完全信息的期望价值
20.8不完全信息的期望价值
20.9信息的价值过程
20.10在软件工程中应用信息的价值过程
20.11信息的价值决策指南
20.12通过信息的价值方法避免缺陷
20.13信息的价值:最后的简要总结
20.14问题
第四部分软件成本估算技术
第四部分A软件成本估算方法与过程
第21章软件成本估算中的七个基本步骤
21.1步骤1:建立目标
21.1.1目标与阶段,或理解级别
21.1.2估算的含义
21.1.3相对与绝对估算
21.1.4慷慨的与保守的估算
21.1.5总的方针
21.2步骤2:计划所需的数据与资源
21.3步骤3:准确说明软件需求
21.4步骤4:尽可能详细地做出估算
21.4.1有关软件规模估算
21.4.2PERT计算规模
21.4.3为什么人们会过低估算软件规模?
21.5步骤5:采用多种独立的方法和资源
21.6步骤6:比较与迭代估算
21.6.1乐观/悲观现象
21.6.2顶梁柱现象
21.6.3一些有用的评价问题
21.7步骤7:跟进
21.8问题
第22章可选择的软件成本估算方法
22.1算法模型
22.1.1线性模型
22.1.2乘法模型
22.1.3分析模型
22.1.4表格模型
22.1.5复合模型
22.1.6算法模型总的优缺点
22.2专家判断
22.2.1小组一致方法:Delphi
22.2.2一个Delphi/小组会议软件成本估算实验
22.2.3宽带Delphi方法
22.3通过推理来进行估算
22.4帕金森估算
22.5价格策略估算
22.6自顶向下估算
22.7自底向上估算
22.8各种方法的总结比较
22.9问题
第四部分B详细COCOMO模型
第23章详细COCOMO:概述与运用描述
23.1引言
23.1.1模块-子系统-系统层次
23.1.2阶段敏感的工作量乘法
23.1.3详细COCOMO过程
23.2软件分层估算表
23.3软件分层估算表过程
23.4详细COCOMO示例:学生工作信息系统
23.4.1项目概述
23.4.2估算步骤
23.5进度调整计算
23.5.1进度调整过程
23.5.2示例
23.6讨论
23.6.1工作量的阶段分布
23.6.2阶段分布:一个极端的例子
23.6.3详细COCOMO的其他组成部分
23.6.4COCOMO模型体系的概述
23.7问题
第24章详细COCOMO成本驱动因子:产品属性
24.1RELY:要求的软件可靠性
24.1.1级别与工作量乘数
24.1.2与RELY级别相对应的项目活动的差异
24.1.3与项目结果相比较
24.1.4讨论
24.1.5软件可靠性生产函数
24.2DATA:数据库规模
24.2.1级别与工作量乘数
24.2.2与项目结果的比较
24.2.3讨论
24.3CPLX:软件产品复杂性
24.3.1级别与工作量乘数
24.3.2与项目结果相比较
24.3.3讨论
24.4问题
24.5进一步研究的主题
第25章详细COCOMO模型成本驱动因子:计算机属性
25.1TIME:执行时间约束
25.1.1级别与工作量乘数
25.1.2与项目结果进行比较
25.1.3讨论
25.1.4IBM-FSD数据库中的生产率变动范围
25.2STOR:主存储器约束
25.2.1级别与工作量乘数
25.2.2与项目结果相比较
25.2.3相关数据与研究的讨论
25.3VIRT:虚拟机的易变性
25.3.1级别与工作量乘数
25.3.2与项目结果相比较
25.3.3讨论
25.4TURN:计算机周转时间
25.4.1级别与工作量乘数
25.4.2与项目结果的比较
25.4.3讨论
25.5问题
25.6进一步研究的主题
第26章详细COCOMO成本驱动因子:人员属性
26.1ACAP:分析员能力
26.1.1级别与工作量乘数
26.1.2示例
26.1.3与项目结果的比较
26.1.4讨论
26.2AEXP:应用经验
26.2.1级别与工作量乘数
26.2.2与项目结果相比较
26.2.3讨论
26.3PCAP:程序员能力
26.3.1级别与工作量乘数
26.3.2与项目结果的比较
26.3.3讨论
26.4VEXP:虚拟机经验
26.4.1级别与工作量乘数
26.4.2与项目结果相比较
26.4.3讨论
26.5LEXP:编程语言经验
26.5.1级别与工作量乘数
26.5.2与项目结果相比较
26.5.3讨论
26.6人员属性的总的讨论
26.6.1属性等级:人员能力
26.6.2属性级别:人员经验
26.6.3对软件人员属性的相关研究
26.6.4数据收集与分析要考虑的因素
26.7问题
26.8进一步研究的主题
第27章详细COCOMO成本驱动因子:项目属性
27.1MODP:现代编程规范的应用
27.1.1级别与工作量乘数
27.1.2与项目结果相比较
27.1.3讨论
27.1.4MPP使用的GUIDE调查
27.1.5MPP与软件工作程序化
27.2TOOL:软件工具的使用
27.2.1级别与工作量乘数
27.2.2与项目结果的比较
27.2.3讨论
27.2.4软件工具生产函数
27.2.5未来的软件工具类别
27.3SCED:开发进度约束
27.3.1级别与工作量乘数
27.3.2与项目结果的比较
27.3.3讨论
27.3.4相关的数据和研究
27.4问题
27.5进一步研究的主题
第28章COCOMO模型中没有包含的因素
28.1应用类型
28.2语言级别
28.3其他规模度量:复杂性、实体和说明
28.3.1复杂性度量
28.3.2程序实体的数量:例行程序、报表、输入、输出、文件
28.3.3说明书元素的数量
28.3.4用源指令计算规模:RADC数据库
28.4需求的易变性
28.5人员连续性
28.6管理质量
28.7用户接口质量
28.8文档的数量
28.9硬件配置
28.10安全性和保密性约束
28.11进一步研究的主题
第29章COCOMO模型评价
29.1引言
29.1.1COCOMO模型校准/评价过程
29.1.2统计分析
29.1.3本章预览
29.2COCOMO模型项目数据库
29.3COCOMO模型估算与实际:开发工作量
29.4COCOMO模型估算与实际相比较:开发进度
29.5COCOMO模型估算与实际相比较:阶段分布
29.6COCOMO模型估算与实际相比较:活动分布
29.7其他软件成本估算模型
29.7.11965SDC模型[Nelson,1966]
29.7.2TRWWolverton模型[Wolverton,1974]
29.7.3PutnamSLIM模型[Putnam,1978;Putnam-Fitzsimmons,1979]
29.7.4Doty模型[Herdandothers,1977]
29.7.5RCAPRICES模型[Freiman-Park,1979]
29.7.6IBM-FSD模型[Walston-Felix,1977]
29.7.71977Boeing模型[Blackandothers,1977]
29.7.81979GRC模型[Carriere-Thibodeau,1979]
29.7.9Bailey-BasiliMeta模型[Bailey-Basili,1981]
29.8按模型标准对COCOMO模型的评价
29.9根据特定配置环境裁剪COCOMO模型
29.9.1校准COCOMO模型的标称工作量等式
29.9.2校准常量
29.9.3校准软件开发模式
29.9.4重新校准软件开发模式时的注意事项
29.9.5合并、排除或增加成本驱动因子属性
29.10进一步研究的主题
第四部分C软件成本估算与生命周期维护
第30章软件维护成本估算
30.1引言
30.2COCOMO软件维护模型
30.2.1定义
30.2.2软件维护工作量估算
30.2.3修改过的工作量乘数
30.3与项目结果相比较
30.4其他软件维护成本估算模型
30.4.1维护/开发成本比率
30.4.2人均维护卡片比率
30.4.3维护生产率比率
30.4.4与COCOMO数据相比较
30.5软件维护现象学(Phenomenology)
30.5.1软件维护生产函数
30.5.2软件维护动力学
30.5.3软件维护工作量按活动的分布
30.6软件维护项目数据
30.7问题
30.8进一步研究的主题
第31章软件生命周期成本估算
31.1引言
31.2软件移植成本估算关系
31.2.1定义
31.2.2移植成本估算关系
31.3软件移植估算与实际
31.4软件安装与培训成本估算
31.4.1定义
31.4.2安装与培训成本数据与模型
31.4.3推荐的估算过程
31.5软件开发的计算机成本估算
31.5.1现有数据与估算关系
31.5.2在COCOMO数据库中的计算机时间数据
31.5.3推荐的估算过程
31.5.4计算机时间分布
31.6软件文档数量
31.6.1文档等级
31.6.2文档工作量
31.7其他软件相关生命周期成本
31.8软件生命周期成本效益分析的一个示例
31.8.1PPI公司,设备管理系统
31.8.2现有软件系统的问题
31.8.3取代现有系统:可行性研究
31.8.4建议的中央设备管理与存货控制系统(CEMICS)
31.8.5CEMICS生命周期成本分析
31.8.6CEMICS生命周期成本效益分析
31.8.7CEMICS有形收益
31.8.8CEMICS无形收益
31.8.9CEMICS成本收益比较与风险分析
31.9进一步研究的主题
第32章软件项目计划与控制
32.1引言
32.1.1软件成本估算作为自我实现的预言
32.1.2软件成本估算与软件项目管理之间的优势互补
32.1.3本章预览
32.2软件项目计划与控制框架结构
32.3项目进度安排技术
32.3.1PERT图
32.3.2构造PERT图
32.3.3关键路径分析
32.3.4确定关键路径
32.3.5确定延迟开始与闲散时间
32.3.6涉及计划与控制的问题
32.3.7PERT图:变化与扩展
32.3.8甘特图
32.3.9甘特图与PERT图的比较
32.4详细的软件计划与控制:单元开发文件夹
32.4.190%综合症
32.4.2单元开发文件夹(UDF)
32.4.3UDF封面
32.5监控项目花费与进展:挣值系统
32.5.1在整体项目状态监督与控制中的问题
32.5.2挣值概念与汇总任务计划表
32.5.3挣值汇总报告
32.5.4讨论
32.6软件项目计划与控制示例
32.7构造软件成本数据库
32.8软件计划与控制总结性的讨论
32.9问题
第33章提高软件生产率
33.1引言
33.1.1提高软件生产率的重要性
33.1.2与软件成本估算的关系
33.1.3开发生产率与生命周期生产率的关系
33.1.4软件生产率与人类经济学
33.1.5软件生产率中的主要可控因素
33.2非编程选项:软件包
33.2.1软件包特征
33.2.2软件包成本收益考虑
33.2.3软件包的优点
33.2.4商业软件包的特点
33.2.5软件包:做购买还是开发的决策时,需要考虑的特殊事项
33.2.6关于软件包的信息资源
33.2.7现有内部软件的改编
33.3非编程选项:程序生成器
33.3.1程序生成器的生产率优势
33.3.2快速原型与改良设计
33.3.3RP/ED方法的优点
33.3.4RP/ED方法的不足
33.3.5作为生产率度量的DSI/MM的应用
33.4软件生产率可控性:产品属性
33.4.1要求的可靠性
33.4.2数据库规模
33.4.3软件产品复杂性
33.4.4编程语言
33.4.5产品规模
33.5软件生产率可控性:计算机属性
33.5.1执行时间与主存储约束
33.5.2示例:一个过程控制系统
33.5.3资源控制
33.5.4放宽的性能要求
33.5.5虚拟机的易变性
33.5.6计算机周转时间
33.6软件生产率可控性:人员属性
33.6.1人员安置
33.6.2安置原则
33.6.3激励
33.6.4激励因素:一般原则
33.6.5激励因素:软件人员
33.6.6管理
33.6.7软件人员与生产率:总结
33.7软件生产率可控性:项目属性
33.7.1现代编程规范(MPP)
33.7.2MPP实现指南
33.7.3软件工具的使用
33.7.4期限约束
33.7.5需求易变性
33.7.6工作环境
33.8建立起软件生产率提高过程
33.9结论
第五部分附录
附录A软件成本数据收集表格与步骤
附录B软件工作目标结构
附录C缩写词表
参考书目
作者索引
主题词索引
工程经济学课程已成为硬件工程师教育的一个标准组成部分。但到目前为止,软件工程师却缺少相似的、适合的软件工程经济学课程。这样导致的结果就是,大多数软件工程师没有机会掌握并利用那些有重要意义的经济学概念、技术和案例,而这些恰恰对他们以后的职业生涯、对所编制软件的易用性和价值都有重要作用。
所以,本书的主要目标是为美国高年级本科生和一年级研究生,提供软件工程经济学的基础课程。即本书的两个目的是:
1. 易于学生学习。
2. 便于教师讲授。
我也努力使本书能够达到第三个目的:
3. 为这一领域的专业人士提供帮助。
因为这三类读者有一定的差异,所以我对学生、教师和熟练的软件工程师分别给出了指导,作为他们学习本书的起点。
本书的基本结构如图A所示。第一部分介绍背景、动机和软件工程目标框架等,为后续的内容打下基础。第二、三部分包括两个互相补充的主题:软件生命周期定量模型,应用于软件项目的工程经济学基础。第四部分详细讲述了软件生命周期成本估算的方法,它是以第二部分较简单的成本模型为基础,同时,又进一步支持第三部分的软件工程经济学的分析技术。
图A也显示了本书的每一部分所解决的基本问题。例如:第四部分不仅讲述了软件成本估算、理解影响软件成本因素问题,还探讨了像“如何利用这种理解来提高软件项目的可见性及控制,进而提高软件生产率?”这类问题。
图B显示了本书的每一部分中的章节。例如,图B显示了分等级的软件成本估算模型细节的逐级层次,这个模型通常称为COCOMO(COnstructive COst MOdel)。顶层是在第5章~第7章讲述的基本COCOMO(Basic COCOMO)模型,基本COCOMO模型是一个简单的公式,将软件项目的成本仅仅估算为已交付源指令规模的函数。接下来是中等COCOMO(Intermediate COCOMO)模型,在第8章和第9章介绍,它估算软件项目成本是规模和其他成本驱动属性(cost driver attribute)的函数,如人员经验与能力、计算机硬件约束、现代编程规范(modern programming practice)的使用程度等。第23章讲述了最精确、最详细的一层,那就是详细COCOMO(Detailed COCOMO)模型,并在第24章~第27章给出了其详尽的细节,它利用成本驱动属性,按每个阶段、每个子系统、每个模块分别估算软件产品的成本。
第24章~第27章详细解释了各种软件成本驱动因子属性是如何影响完成软件生命周期每一阶段所需工作量的。COCOMO模型不仅给出了估算公式,也给出了该模型为什么能得出这些结果的最好解释。第24章~第31章详细讨论了软件生命周期成本估算知识的前沿问题(frontier),并提出了需要进一步研究的广泛课题(agenda)的建议,以扩展我们在软件生命周期及其经济学方面的知识。
图A 本书的结构—主要讲述的问题
深深地感谢那些鼓励我,为我提供数据与意见的人们。真希望能把他们都列出来。
……
致学生
未来几年内,你将有机会在一间屋子里和一群人一起讨论,决定将要进行的一个重要的新软件工作需要用多长时间、花多少钱,这是一个好机会。这些人中,也许有一到两名对软件很了解,其他大多数都了解不深。这些人可能是高层经理、业务分析员、市场专家或生产线计划者之类的人员。总的说来,他们将根据边际投资回报率、成本收益率(cost-benefit ratio)、现值(present value)和风险暴露(risk exposure)之类的概念进行讨论,并做出决策。
图B 本书的结构—部分与章节
还有其他一些人,对这个项目很感兴趣,但不在这间屋子里。这包括将为你工作的、或同你一起从事软件工作的人员,还包括一些用户,那些不得不使用你们团队正准备生产的这个软件的用户。无论是否意识到,事实上,他们未来几个月甚至几年的命运,很大程度上依赖于你和其他非软件人员能在多大程度上对软件工作的范围、预算、进度做出实事求是的决策。
屋子里的非软件人员没法做出决策,因为他们对你所做的软件技术性权衡没什么感觉。所以对你来说,与他们交流、理解他们思考并做出决定所依据的经济学概念,就显得特别重要。如果你能做到这一点,你就有机会改变软件开发人员与面向业务人员之间那种敌对关系,把它变成一种能相互理解、承诺和信任的关系。
在这本书里,我们将尽量提供必要的概念与技术,使你既能从编程角度,又能从经济学的角度进行思考。除了这些概念的实际应用之外,希望你会发现它们具有相当的刺激性,就像当时我对计算机与信息处理领域提出一种新的见解时那样。我发现它们对说明如下问题有很大帮助:
* 为什么信息是有价值的?
* 为什么人们要采用软件产品?
* 人们如何决定需要什么样的信息处理产品?
* 为什么软件生命周期是这样的?
就像其他方面的研究一样,当我们更好地理解了软件工程领域为什么会存在,才能更好地在软件工程中进行实践。
致教师
在这里,我想说明以下三点:
1. 软件工程经济学对教师和学生来说都是一个具有刺激性的、内容丰富的主题。
2. 本书可用作软件工程经济学方面的教材,讲授一学期或一学年均可,也可以作为更通用的软件工程课程的辅助教材。
3. 软件工程经济学是一个有重要意义的、成果累累的研究领域。
首先,我想你会发现,软件工程经济学是一门有趣的、有价值的学科。微观经济学是一门精致的、清晰的、精确的学科。为什么这么多人需要计算机、软件和处理过的信息?风险和信息价值使得这个行业有令人鼓舞的前景。由于分析影响软件成本的因素很重要,所以目前出现了许多的软件工程指南并对软件生命周期产生了影响。
此外,我还认为每个人不必都把自己沉浸到行业的实践与术语中,去寻找软件工程经济学相关的例子与应用。当我还在USC时,对学校开发的各种计算机与软件应用,及学校对计算机与软件成本的关心程度(特别在学校经费紧张的时候)印象深刻。所以,本书尽量避免行业术语,尽可能多地包含面向大学的问题和实例,从而使本书采用的材料较为熟知。
本书的基本内容很适合一学期或一学年的课程。此课程的主要学习目标如下:
* 了解对软件成本影响最大的因素,并由此来确定估算的软件项目成本。
* 理解软件工程中的微观经济学的基本概念。
* 将经济学分析技术应用到软件工程决策中。
下表给出了在一学期内讲授本书的课程安排,时间显得有点紧:
周 书 的 章 节 主 题
1 1~ 4 软件生命周期:经济学观点
2 5~ 6 简单软件成本模型
3,4 7~ 9 中等软件成本模型:影响软件成本的因素
5 10~12 成本效益分析:生产函数、规模经济、方案选择
6 - 复习,期中考试
7 13~15 多目标决策分析:净值、现值、品质因素
8 16~18 多目标决策分析:约束、系统分析、不可量化目标
9 19~20 风险、不确定性和信息的价值
10 21~22 实用的软件成本估算技术
11 31~32 案例研究:软件生命周期成本分析与控制
12 - 期末考试
如果是第一次讲授软件工程经济学这门课,上述这些内容比较适合一个学年的课程安排,要使一个学期的教学效果令人满意,最好只安排讲授1~18章的内容,也能基本达到学习目标。
这门课程适合美国高年级的本科生和一年级的研究生,惟一的前提条件是学生基本熟悉编程过程(或上过相当于两年的计算机科学方面的课程)和一定的微积分基础。为练习软件成本估算模型,我强烈推荐使用有指数运算(Xy)功能的计算器。虽然为使没有计算器的同学也能运用这个模型,在书中我加进了很多曲线,但这毕竟不太精确,也不方便。
最后,我希望你能进一步深入研究软件工程经济学,研究软件开发过程自身具有的基本问题,如:
* 为什么软件开发成本这么高?
* 是什么因素使软件成本上升或下降,各因素之间如何相互作用?
* 是什么活动消耗了大部分的成本?
* 新的软件技术如何降低软件成本?
在本书的第四部分,我列举并分析了由63个软件项目的成本及其开发属性组成的数据库,试图回答以下这个问题:
“为使项目数据有助于以后其他项目估算和理解其软件成本,我们应该如何解释这些数据?”
本书所描述的成本模型,是回答上面这个问题的第一步,但还有待于进一步地去做大量有价值的研究。深入分析这63个项目的数据,就能进一步得到很多有价值的新观点。另外收集、分析更多的观察与实验数据,会得到更多这方面的见解。第四部分大多数章节的最后,都有“进一步研究的主题”一节,说明要阐明上述这个问题的一些最有前途的方向。希望你和你的学生能尝试一下。
致在职的软件工程师
可以想像在你的软件工程生涯中,已经形成了很多个人原则,来指导估算软件成本、进行软件产品和项目所需的决策。我相信这本书能帮助你利用他人的经验,校准自己的经验法则,能为你的软件成本估算、软件工程决策提供一些其他有用的技术。我也希望,你读这本书的过程是一次激动人心的、充满收获的经历,就像我当初看到,我所用到的各种表面上无关的技术和决策方针,而事实上就是经济学原则的一部分时那样。
可以根据个人兴趣与需要选择本书的某些部分阅读,而不是从头到尾地读一遍。以下是根据个人兴趣可以进行的选择。
* 如果主要想提高自己(或机构)估算软件开发成本的能力,那最好从第21章和第22章的软件成本估算方法开始看,接着再看第4章~第9章的软件生命周期和基本与中等COCOMO模型。
* 如果你还对估算软件维护成本或其他软件相关成本有兴趣,可阅读第30章、第31章。
* 如果你还对完成一个详细的软件成本估算模型有兴趣,并想对其加以裁剪,以适合自己的机构,阅读第23章、第29章。
* 如果你主要对特定软件属性(如,项目人员能力、现代编程规范的使用或语言级别等)对软件成本的影响有兴趣,请阅读第24章~第28章中的相应的内容。
* 如果你主要对提高软件经济学决策的分析能力有兴趣,请阅读第10章~第18章。
* 如果你主要对软件项目计划和控制技术有兴趣,请阅读第31章第6节和第32章。
然而,即使你只对某一方面的主题有兴趣,我还是推荐你阅读一下第1章~第3章的介绍性内容和第33章的提高软件生产率。这些章节提供了实现更有效的、更令人满意的和更具生产率的环境所需要的背景与方法,在这样的环境中我们能反复演练软件工程活动。