第 1 部分 个人软件工程 1 软件开发的比喻 ................................................................................................. 2 1.1 什么是软件 .......................................................................................................... 2 1.1.1 软件不是被制造出来的 ........................................................................... 3 1.1.2 软件不会磨损 ........................................................................................... 3 1.1.3 大多数软件都是定制化的 ....................................................................... 3 1.1.4 软件可以很容易升级 ............................................................................... 4 1.1.5 软件不是一个独立的实体 ....................................................................... 4 1.2 与其他领域的相似性 ........................................................................................... 4 1.2.1 程序员像艺术家一样 ............................................................................... 4 1.2.2 程序员像建筑师一样 ............................................................................... 5 1.2.3 程序员像工程师一样 ............................................................................... 6 1.2.4 程序员像工匠一样 ................................................................................... 7 1.2.5 究竟是艺术家、建筑师、工程师还是工匠 ........................................... 7 1.3 软件工程 .............................................................................................................. 8 1.3.1 一个正式的定义 ....................................................................................... 9 1.3.2 项目规模 ................................................................................................. 10 1.3.3 软件工程的问题 ..................................................................................... 12 1.4 软件匠艺 ............................................................................................................ 13 1.4.1 教育 ......................................................................................................... 13 1.4.2 学徒阶段 ................................................................................................. 14 1.4.3 软件熟练工 ............................................................................................. 15 1.4.4 大师级工匠 ............................................................................................. 15 1.4.5 软件匠艺的不足 ..................................................................................... 16 目录 XXI 1.5 通往**编程的道路 ......................................................................................... 16 1.6 获取更多信息 .................................................................................................... 17 2 生产力 ............................................................................................................. 18 2.1 什么是生产力 .................................................................................................... 18 2.2 程序员生产力与团队生产力的比较 ................................................................. 19 2.3 工时和实际时间 ................................................................................................ 20 2.4 概念复杂性和范围复杂性 ................................................................................. 21 2.5 预测生产力 ........................................................................................................ 22 2.6 度量指标,以及我们为什么需要它们 ............................................................. 23 2.6.1 可执行文件大小度量指标 ..................................................................... 24 2.6.2 机器指令度量指标 ................................................................................. 24 2.6.3 代码行数度量指标 ................................................................................. 25 2.6.4 语句数量度量指标 ................................................................................. 25 2.6.5 功能点分析 ............................................................................................. 26 2.6.6 McCabe 圈复杂度度量指标 ................................................................... 26 2.6.7 其他度量指标 ......................................................................................... 27 2.6.8 度量指标的问题 ..................................................................................... 28 2.7 我们怎样才能每天写出 10 行代码 ................................................................... 29 2.8 估计开发时间 .................................................................................................... 30 2.8.1 估计小型项目的开发时间 ..................................................................... 30 2.8.2 估计中型项目和大型项目的开发时间 ................................................. 31 2.8.3 估计开发时间的问题 ............................................................................. 32 2.9 危机模式项目管理............................................................................................. 33 2.10 如何提高工作效率 ........................................................................................... 34 2.10.1 合理选择软件开发工具 ....................................................................... 34 2.10.2 管理开销 ............................................................................................... 36 2.10.3 设置明确的目标和里程碑 ................................................................... 37 2.10.4 练习自我激励 ....................................................................................... 37 2.10.5 集中注意力,消除干扰 ....................................................................... 38 2.10.6 如果你觉得无聊,那么就做点别的事情 ........................................... 39 2.10.7 尽可能自立 ........................................................................................... 39 XXII 编程**之道(卷 3):软件工程化 2.10.8 识别何时需要帮助 ............................................................................... 40 2.10.9 克服士气低落 ....................................................................................... 40 2.11 获取更多信息 ................................................................................................... 41 3 软件开发模型................................................................................................... 42 3.1 软件开发生命周期............................................................................................. 42 3.2 软件开发模型 .................................................................................................... 45 3.2.1 非正式模型 ............................................................................................. 46 3.2.2 瀑布模型 ................................................................................................. 47 3.2.3 V 模型 ..................................................................................................... 49 3.2.4 迭代模型 ................................................................................................. 50 3.2.5 螺旋模型 ................................................................................................. 52 3.2.6 快速应用程序开发模型 ......................................................................... 54 3.2.7 增量模型 ................................................................................................. 56 3.3 软件开发方法论 ................................................................................................ 57 3.3.1 传统的(预测型)方法论 ................................