标题：软件项目设计开发与管理
图书信息
书名：不是三维——软件项目的设计、开发与管理  作者：何小朝 著
出版社：电子工业出版社
ISBN：978-7-121-10484-8
出版日期：2010年4月
定价：39.80元
开本：16开
页码：308页
宣传语
勤于思考，丰富经验，精通技能，做合格的软件人才。
内容简介
本书从软件与三维实物的本质性不同出发研究软件生产方法论。今天，软件生产中许多传统问题并没有得到质的改善，以“爆炸”形容的技术发展的实质究竟是什么？先进管理模式下的管理现状如何？本书首先深入分析以上问题，指出软件的本质及其至今不能实现工业化生产的内在原因。接着，从软件设计，测试与管理三个方面，体系化地介绍了作者长年实践中总结的有效实用方法；最后从软件本质出发，提出了全新的先进软件生产模式与方法——代码驱动生产（Code Driving Production），并指出这将是适合软件本质的新途径。
作
者简介
何小朝，1972年生，工学博士，北京大学计算机系博士后，第一届中国软件业十大杰出青年候选人，第十六届世界计算机大会电子商务大会数据管理分会主席，中国航空史研究会会员，科技部中小企业创新基金评审专家。作者1992年起从事软件的设计、开发与管理工作，涉及信息系统、嵌入式系统及工业设计与生产等领域。曾任北京北大青鸟信息工程有限责任公司总工程师，北京青鸟天桥科技股份有限公司公安事业部副总经理，北京青鸟华光科技有限公司技术管理部部长、总工程师，大唐微电子科技有限公司高级项目经理等职。自2002年起，在北美从事软件系统分析与设计工作近七年之久，现任北京安德尔国际软件有限公司总经理，董事，北美PPMC技术总监，北京先进数通科技有限公司BI事业部首席架构师等职。迄今为止，共负责、参与大中型软件开发项目20多项，在国内外发表科技论文20余篇，被美国EI《工程索引》检索6篇。
本书特点
从技术与管理两个层面研究软件生产方法论。
深入分析软件飞速发展的本质及技术与管理现状，指出软件与三维实物的本质性不同是其至今不能实现有效工业化生产的内在原因。
结合作者多年经验，从设计、实现、测试与管理多个角度全面介绍具体的有效实用方法与技术内容。
强调代码是软件的核心，指出软件无法完全可视化表达。
从软件本质出发，提出以实现为中心的"代码驱动生产"（Code Driving Production）模式、理论与方法，它不同于以设计为中心的传统方法。
序
无论技术发展多快，与电子、机械产品的规范化生产相比，软件开发的实际状况却一直不尽人意，被称为“黑箱技术”。这本书从软件与三维实物的本质性不同这个全新角度出发，从技术与管理两个层面，深入分析现状，研究软件生产方法论，并给出相应的实用方法与工具介绍。
这里，我想先谈谈软件生产的现状。今天，软件的应用已经覆盖各行各业，几乎无处不在，无论什么领域，一定或多或少的存在着软件设计与开发工作，本书作者称之为“软件生产”。应该说，与很多年以前相比，软件技术的发展更新速度飞快，成果显著！在开发工具、支撑环境、分析设计方法、软件工程理论与软件管理方法等各个方面都有众多的革新内容。
在实践中，不难发现，技术进展虽然软件开发的效率与质量大大提高，但要使其实现如传统工业那样的标准化与工业化，仍然感到困惑、困难，甚至还是无从下手。很多组织虽然不断引进新的技术与方法，但软件生产中的许多传统问题却依然存在并且没有得到质的改善；在软件生产管理中，开发者与管理者的不协调比任何其它行业都明显；在软件生产理论研究中，研究者与实践者的脱节也比任何其它领域都严重。
在软件开发、设计与管理的实践中，人们总是自然地产生对更优方法的需求与渴望，于是对不断出现的新生理论、管理模式、方法与工具感到兴奋异常，继而学习、使用，却又一次次产生困惑与疑问！这究竟是怎么回事呢？
作者何小朝曾参与过很多项目与产品开发，他本人也接触过一些国际先进的软件组织与著名的资深专家，并与如KDE创始设计师这样的专家一起工作过，有许多经验、体会与感触。作者曾告诉我，在多年的工作与生活中，他深深感到：“大千世界，卧虎藏龙”，平凡世界中隐藏者无数的“大侠”！因而他希望能将自己的体会、观点与同行们共享，希望能与大家在许多方面进行讨论，也希望能为大家提供支持与帮助。
书中，作者分析了经过多年的飞速发展后，软件生产依然存在的主要问题，指出软件业飞速发展的本质以及软件生产至今不能实现如机械电子产品那样有效工业化的内在原因，并总结了软件界的两个矛盾：管理者与开发者的矛盾；研究者与实践者的矛盾。在其方法论篇，作者先结合多年经验体系化地介绍了长年实践中总结的实用软件生产方法，其中包括：软件设计方法论，软件测试方法论，软件管理方法论等，旨在对现有的生产实践作出实际的指导与帮助；最后则从软件本质出发，提出了新的现代软件生产模式、理论与方法——代码驱动生产（Code Driving Production），并指出这将是适合软件本质特征的新途径。
本书立意新颖，发人深省，其内容丰富、全面而又实用，我愿意向各位推荐这本书，希望能为广大读者带来帮助与启发。
承继成
北京大学教授，欧亚科学院院士
2009年12月
前言
上世纪初，伟大的物理学家爱因斯坦提出了具有划时代意义的相对论，其全新的时空理念直到今天都很难被人们以常规的形象思维所理解，而爱因斯坦认为，人们不能正确理解世界本质的根本原因是由于：人类的理解能力无法超脱三维空间范围的限制，正如我们无法想象在四维或多维空间的一个球体的形状一样。
现代软件行业的概念、方法、工具出现速度之快是非常惊人的，几乎所有的同行每天都在不停地学习新的东西。我相信其中有相当一部分人是期望能从新的方法中找到解决该行业多年需要解决的众多难题的好途径，如设计的规范化问题，管理的有效性问题，开发的重复性问题等。
然而，我也相信，当我的同行们怀着期待的心情对这些新的理论与方法不断学习与尝试后，他们发现——虽然大量可视化开发工具与众多应用支撑环境的出现，使现代应用软件开发者基本摆脱了过去那种将最大精力放在界面、通讯及大量数据管理的状态，而能集中力量开发自己的核心业务内容；然而，往往在一个具体的项目或具体的企业中，又有众多的原本令人兴奋不已的新方法、新理论，甚至是那些成功者的宝贵经验，却是那样难以真正起到预期的作用，甚至在有些情况下毫无作用，我想，这些可能主要存在于新的设计分析方法与管理方法和具体应用结合等方面。
软件开发工具不断更新，软件工程师们现在可以很轻松地构建复杂的图形用户界面（多年以前，图形用户界面是软件开发中工作量最大的部分之一），很方便地对数据进行管理，进行调试；同时，一些新软件开发支撑环境与体系构架的出现，如C/S结构，J2EE，DCOM，CORBA等，一方面使程序员可以摆脱RPC、Socket等底层的方法，轻松地开发网络化的信息系统，另一方面使复杂系统的构建效率与质量大大提高。近年来，软件行业在这些方面的发展的确产生了巨大的成效，并为大多数人所接受。
然而，软件行业在其它方面的革新内容对软件业的实际贡献，及在软件管理、设计、开发人员中的普及与实用程度，都远不如开发工具与环境的新内容那么明显与直接。
软件分析设计方法的革新主要体现在面向对象的技术与思想，数据与方法的封装、继承，多态及复用，使设计师们可以更加形象地用软件来描述客观事物及其相互关系与作用，这应该是一种非常伟大的创造，也在软件行业起到巨大的推动作用；然而，另一方面，虽然面向对象技术与思想的优势已为同行们所公认，但在实际工程中，除了大量使用面向对象的开发工具与语言以外，真正采用面向对象的思想来分析、设计系统、描述设计结果以完成实际项目的作法却远不如想象中那么普及。这是因为某些工程太简单而没有必要用到它，还是因为它太难以实用化，还是其它什么原因呢？
软件工程理论在不断在构造新的理想：软件的生产能象生产一部汽车，生产一台电视机或盖一座大楼一样，有标准的零件，标准的结构，标准的流程，标准的生产线，标准的组装……。理论家们充满了创造性的构想与信心，而大批一线的软件工程师们却对这种理想产生怀疑。
软件企业管理模式的革新也是大部分企业迫切的需求，先进的CMM出现了，其理论不断被人们所了解，大家都对那些已经获得某种CMM级别的企业产生了深切的崇拜与向往，并异口同声的宣布，“我们也要做！”但我们同时又发现，大量的软件企业在把CMM与自己企业的实际情况有机结合的道路上却遇到了令人头痛的困难与疑惑，这种困难与疑惑好像不仅仅是为接受新机制而“痛一时，利一生”那么简单。
问题出在哪里呢？为什么在软件工业化的道路上要达到电子、机械产品的程度会那么困难？多年来，作者也一直思考这个问题。
本文认为，“对一件事物解决方法的制定要基于正确了解该事物的本质。”那么，可能软件这个事物与传统其它产品的特征还是有着巨大的区别，这可能不只是量的区别，而是质的区别。
或许我们应该从这个角度重新审视一下过去采用与传统工业化类比的思想所得来的灵感、理想与方法。
这里，要首先感谢家人的支持！感谢长年在日本工作的好友郭果明与施文彪为我提供一些信息，同时，电工工业出版社的袁金敏编辑与顾惠芳老师也为本书的出版提出了许多宝贵的建议，在此一并衷心感谢！
何小朝
2009年12月
目录
序 11
前言 13
第一部分 现状与困惑 16
第一章 困难与困惑 16
1.1软件项目实施的困难 16
1.1.1漫长的维护期 16
1.1.2什么时候开始编码——生产过程控制 16
1.1.3开发周期的精确估算 17
1.1.4需求何时确定 17
1.1.5令人头痛的边缘问题 18
1.1.6鲁棒性 19
1.2飞速发展？——困惑 19
第二章 技术方法的抉择——软件设计师的困惑 21
2.1 引言 21
2.2 软件设计师的理想 22
2.2.1 什么是软件设计师 22
2.2.2 技术人员的理想 24
2.2 似有曙光——方法论 25
2.2.1技术进步带来希望 25
2.2.2软件技术方法综述 26
2.2.2.1可视化编程 26
2.2.2.2面向对象 28
2.2.2.3多层体系结构 30
2.2.2.4中间件 31
2.2.2.5统一建模语言——UML 32
2.2.2.6平台无关 32
2.2.2.7 Web Service与SOA 33
2.2.2.8 J2EE, .NET与MVC 34
2.2.2.9网格与云计算 34
2.2.2.10标准化 36
2.3现实！？ 37
2.3.1新技术手段的使用状况 37
2.3.1.1面向对象分析、设计方法 38
2.3.1.2设计结果的表示 39
2.3.1.3开发调试工具 40
2.3.1.4编程语言 41
2.3.1.5支撑环境 42
2.3.1.6 标准化 42
2.3.2困难没有得到本质解决 43
2.3.3许多人这样看 44
2.3.4痛一时，利一生？ 44
2.4 疑惑——方法的抉择 45
2.5方法到底解决了什么 47
2.5.1通用函数库、类库与框架的复用 47
2.5.2分层体系使生产集中于应用本身 49
2.5.2.1分层体系综述 49
2.5.2.2 软件行业的分层体系 50
2.5.3面向对象有机描述客观目标 51
2.5.4 “平台无关”是以“时间换空间” 53
2.5.5其它本质探讨 54
2.6常用有效技术方法简介 54
2.6.1 分析与设计的组织 55
2.6.2开发环境的选择 56
2.6.3编程 60
2.6.4文档的生成 61
2.6.5其它环节 62
2.7本章小结 62
第三章 如何有效地服务——技术管理者的烦恼 64
3.1 软件项目管理现状 64
3.1.1管理过多依赖个人经验 64
3.1.2管理规则很不成熟 65
3.1.3管理组与开发组不协调 66
3.1.4无通用规则可循，各有特色 67
3.1.5新方法的现实情况 68
3.2软件项目管理的几个具体问题 68
3.2.1文档的管理问题 68
3.2.2设计文档的作用到底是什么？ 69
3.2.3过程控制问题 70
3.2.3.1软件过程模型简介 70
3.2.3.2现状 71
3.2.4测试的问题 71
3.2.5需求制定的问题 72
3.3管理者的希望与困惑——CMM 72
3.3.1 CMM简介 72
3.3.2 PSP/TSP 74
3.3.3 CMM应用现状 75
3.3.4 CMM的困惑 75
3.4 究竟怎么回事？ 76
3.5本章小结 76
第二部分 软件的本质—不是三维 78
四、理想与现实——科学与工程的碰撞 78
4.1软件工程的理想——生产线与复用 78
4.2工程实践——与理想模式的距离 79
4.2.1软件是数字化社会的主体 79
4.2.2软件生产业的主体是什么？ 80
4.2.3软件生产工程实践现状 80
4.2.3.1系统软件与支撑软件生产较规范 80
4.2.3.2应用软件生产主体处于手工业阶段 80
4.2.3.3软件生产业主体处于手工业阶段 81
4.3“飞速发展”的本质 81
4.4本章小结 82
五、不是三维——软件的本质 83
5.1三维空间——人类形象思维的局限 83
5.2传统产品简析 83
5.2.1传统产品——三维实体 83
5.2.2传统产品的核心——设计输出 84
5.2.3传统产品生产模式——生产线 84
5.3软件产品简析 84
5.3.1软件是一种特殊的产品 84
5.3.2二维可视化设计语言能力分析 85
5.3.3软件无法完全可视化表达 87
5.3.4软件产品的核心——代码 87
5.3.5一个有趣的问题 88
5.4软件的本质——不是三维 88
5.5本章小结 89
第三部分 软件生产方法论----实践与研究 90
六、设计与开发 91
6.1引言 91
6.1.1 构件化生产与自动化的探讨 92
6.1.1.1 软件构件化生产简介 92
6.1.1.2 关于UML与构件化生产 93
6.1.1.3 软件构件化生产探讨 94
6.1.2 实用技术方法涉及的内容 94
6.2应用系统架构设计 95
6.2.1 什么是架构 95
6.2.2 几种常见架构模式 96
6.2.2.1单机应用系统（Standalone） 96
6.2.2.2客户机/服务器（Client/Server）结构 97
6.2.2.3 多服务结构（SOA） 103
6.2.2.4 企业数据交换总线 105
6.2.3 实践中的系统架构设计 106
6.2.3.1 两层，三层还是四层 106
6.2.3.2四层以上的多层体系 109
6.2.3.3服务器集群 111
6.2.3.4同构系统聚合 114
6.2.3.5调度系统 115
6.2.3.6异构系统集成 116
6.2.3.7数据存放与访问 117
6.3系统分析与设计 119
6.3.1 软件分析与设计的内容 119
6.3.2 系统整体结构的软件描述 120
6.3.3 整体代码框架搭建 124
6.3.4 系统公共库设计 124
6.3.5 接口设计 125
6.4代码编制与调试 127
6.4.1 程序结构搭建 127
6.4.2 多线程/多进程程序设计 130
6.4.2.1 什么时候采用多线程/多进程 130
6.4.4.2 技术要点 131
6.4.3 编辑 133
6.4.4 编译 134
6.4.5 调试 136
6.4.5.1打印语句，DEBUG开关与出错处理 137
6.4.5.2 gdb与dbx 137
6.4.5.3多线程/多进程程序调试 138
6.4.5.4 内存异常，智能指针与valgrind 141
6.4.6 类型安全 146
6.4.7 跨平台程序设计 147
6.4.7.1 字序问题 147
6.4.7.2 32位与64位 148
6.4.7.3 编码问题 149
6.4.8开源软件代码 150
6.5面向对象——正确理解与使用 151
6.5.1何时使用面向对象 152
6.5.2如何使用面向对象 153
6.5.2.1合理分析与设计对象关系 153
6.5.2.2使用成熟设计模式 158
6.6设计的结束与输出 159
6.6.1实效的制度化，而非教条的制度化 159
6.6.2强化设计结束准则 159
6.6.3设计阶段的输出文档 160
6.7 本章小结 161
七、软件测试——质量保证的重要环节 162
7.1测试技术综述 162
7.1.1测试的阶段 162
7.1.2测试的种类 163
7.1.3常用的测试工具 163
7.1.3.1代码测试工具 163
7.1.3.2 功能测试工具 164
7.1.3.3 性能测试工具 164
7.1.3.4测试管理工具 164
7.1.3.5 其它辅助测试工具 165
7.1.4测试步骤 165
7.2 软件测试中几个实用问题 166
7.2.1 手工测试 166
7.2.1.1 程序员自编程测试 167
7.2.1.2 测试人员手工测试 169
7.2.2自动化测试 169
7.2.3测试用例的制定 169
7.2.4关于测试驱动开发 171
7.2.5测试时间估算 172
7.2.6测试人员的素质 173
7.3对测试标准的探讨 174
7.3.1软件BUG的分布特征 175
7.3.2测试标准的制定原则 175
7.3.3测试人员的困惑——测试标准如何实施？ 176
7.4软件测试的本质探讨与工业化生产 177
7.5本章小结 178
八、软件项目管理方法论 180
8.1软件项目管理的产生 180
8.2软件项目管理的作用与地位——为研发服务 181
8.3软件项目管理的内容 181
8.4软件项目管理的实用方法 182
8.4.1软件规模划分 182
8.4.2软件类型划分 184
8.4.3软件项目实施的阶段划分 185
8.4.4软件项目的最初需求确定 186
8.4.5软件项目实施的资源确定 187
8.4.6软件生产过程 188
8.4.6.1软件生产过程的传统理解 188
8.4.6.2实践中的软件生产过程 190
8.4.7软件生产过程控制 194
8.4.8设计与编程的分界点 195
8.4.8.1什么时候开始编程？ 195
8.4.8.2 编码过程中的设计工作 197
8.4.9测试与研发的交流 198
8.4.10文档的生成与管理 199
8.4.10.1文档的生成 199
8.4.10.2文档的管理 199
8.4.11用软件进行软件项目管理 200
8.5软件生产过程中的实用工具 200
8.5.1软件配置管理系统 200
8.5.2软件缺陷追踪系统 201
8.6国外软件项目管理简析 203
8.6.1欧美国家软件项目管理模式 203
8.6.2最为特色的模式——日本软件项目管理 205
8.7本章小结 206
九、用软件管理软件 208
9.1 引言 208
9.2管理系统功能分析 209
9.2.1问题的提出 209
9.2.2 CMM规范 209
9.2.3策略 210
9.2.4实现管理的要素 210
9.2.5关键方法 211
9.3实用系统设计 212
9.3.1系统组成与总体构架 212
9.3.2 软件开发的计划与进度管理 214
9.3.3 评分系统 214
9.3.4 界面示例 214
9.4管理系统再分析 215
十、新一代软件生产方法论探索——代码驱动生产 217
10.1 原则与依据 217
10.1.1以质为本，以实践为依据 217
10.1.2不能以类推法制定软件生产理论框架 218
10.1.3软件生产方法论应包括现有成果 218
10.2软件生产技术回顾 219
10.2.1概述 219
10.2.2传统软件工业化生产技术分析 220
10.2.2.1基于构件的工业化生产思想再剖析 220
10.2.2.2可视化方法再分析 222
10.2.2.3复用是辅助手段，不是生产主体 223
10.2.2.4复用经验永远无法取代创新设计 223
10.2.2.5 构件组合无法创造完整软件系统 224
10.2.2.6 编码完成只是很少一部分工作 224
10.2.2.7程序员自由空间是软件开发的重要内容 225
10.2.2.8相当数量的设计需要融合在编码中 226
10.3先进软件生产方法分析 226
10.3.1设计思维过程分析 226
10.3.1.1设计思维的过程 226
10.3.1.2从思维特征出发看软件生产困难 228
10.3.2 先进软件生产方法应有的特征 229
10.3.2.1代码框架制作是先进软件生产的重要内容 229
10.3.2.2设计思维的代码表达类似于艺术表达 229
10.3.2.3人工编码不可能完全摆脱 230
10.3.2.4需求的难以捉摸无法用技术手段改进 230
10.4代码驱动生产的定义与内容 231
10.4.1软件“工业化”生产的新涵义 231
10.4.2代码驱动生产的要素 232
10.4.2.1构件技术是代码框架的生产手段 232
10.4.2.2返工与往复的常态化 232
10.4.2.3代码描述设计思维的标准化 233
10.4.2.4没有过硬编码技能的设计师不合格 234
10.4.3代码驱动生产的组成内容 235
10.5软件生产模型——代码为核心的星形模型 236
10.5.1传统软件生产顺序模型 236
10.5.2以代码为核心的星形模型 237
10.6代码驱动生产运行机制（Code Driving Prodution） 239
10.6.1代码驱动生产运行机制综述 239
10.6.2代码驱动需求分析 241
10.6.3代码驱动设计开发 242
10.6.3.1传统设计理念再分析 242
10.6.3.2代码驱动设计 245
10.6.3.3代码驱动开发 249
10.6.4代码驱动测试 249
10.7软件过程——“代码框架”上的并行协作 252
10.7.1软件过程的两个要素 252
10.7.2软件生产平台——“代码框架” 252
10.7.3并行协作的软件过程 253
10.7.3.1常态与非常态迭代 253
10.7.3.2并行协作 254
10.7.4生产过程迭代再探 258
10.7.5代码核心与文档弱化 258
10.8 其它讨论 259
10.9本章小结 260
后记 261
参考文献 264