必读网 - 人生必读的书

TXT下载此书 | 书籍信息


(双击鼠标开启屏幕滚动,鼠标上下控制速度) 返回首页
选择背景色:
浏览字体:[ ]  
字体颜色: 双击鼠标滚屏: (1最慢,10最快)

人月神话

_9 弗雷德里克·布鲁克斯(美)
首先,仅对核心程序设定规模目标是不够的,必须把所有的方面都编入预算。在先前
的大多数操作系统中,系统驻留在磁带上,长时间的磁带搜索意味着它无法自如地运用在程
序片段上。OS/360 和它的前任产品Stretch 操作系统和1410-7010磁盘操作系统一样,是
驻留在磁盘上的。它的开发者对自由、廉价的磁盘访问感到欣喜。而如果使用磁带,会给性
能带来灾难性的后果。
在为每个单元设立核心规模的同时,我们没有同时设置访问的目标。正如大家能想到
的一样,当程序员发现自己的单元核心未能达到要求时,他会把它分解成链接库。这个过程
本身增加了程序整体的规模,并降低了运行速度。最重要的是,我们的管理控制系统既没有
度量,也没有捕获这些问题。每个人都汇报了核心的大小,都在目标范围之内,所以没有人
发现规模上的问题。
幸运的是,OS/360 性能仿真程序投入使用的时间较早。第一次运行的结果反映出很大
的麻烦。Fortran H,在带磁鼓的Modal 65 上,每分钟模拟编译5条语句!嵌入的例程显示
- 56 -
----------------------- Page 69-----------------------
控制程序模块进行了很多次磁盘访问。甚至使用频繁的监控模块也犯了很多同样的错误,结
果很类似于页面的切换。
第一个道理很清楚:和制订驻留空间预算一样,应该制订总体规模的预算;和制订规
模预算一样,应该制订后台存储访问的预算。
下一个教训十分类似。在每个模块分配功能之前,已编制了空间的预算。其结果是,
任何在规模上碰到问题的程序员,会检查自己的代码,看是否能将其中一部分扔给其他人。
因此,控制程序所管理的缓冲区成为了用户空间的一部分。更严重的是,所有的控制模块都
有相同的问题,彻底影响了系统的稳定和安全性。
所以,第二个道理也很清晰:在指明模块有多大的同时,确切定义模块的功能。
第三个更深刻的教训体现在以上的经验中。项目规模本身很大,缺乏管理和沟通,以
至于每个团队成员认为自己是争取小红花的学生,而不是构建系统软件产品的人员。为了满
足目标,每个人都在局部优化自己的程序,很少会有人停下来,考虑一下对客户的整体影响。
对大型项目而言,这种导向和缺乏沟通是最大的危险。在整个实现的过程期间,系统结构师
必须保持持续的警觉,确保连贯的系统完整性。在这种监督机制之外,是实现人员自身的态
度问题。培养开发人员从系统整体出发、面向用户的态度是软件编程管理人员最重要的职能。
空间技能
空间预算的多少和控制并不能使程序规模减小,为实现这一目标,它还需要一些创造
性和技能。
显然,在速度保持不变的情况下,更多的功能意味着需要更多的空间。所以,其中的
一个技巧是用功能交换尺寸。这是一个较早的、影响较深远的策略问题:为用户保留多少选
择?程序可以有很多的选择功能,每个功能仅占用少量的空间。也可以设计成拥有若干选项
分组,根据选项组来剪裁程序。任何一系列特殊选项被合并在一起进行分组时,程序需要的
空间较少。这很像小汽车。如果把照明灯、点烟器和时钟作为整个配件来标明价格,则成本
会比单独提供这些选择所需要的成本低。所以,设计人员必须决定用户可选项目的粗细程度。
在内存大小一定的情况下进行系统设计时,会出现另外一个基本问题。内存受限的后
果是即使最小的功能模块,它的适用范围也难以得到推广。在最小规模的系统中,大多数模
- 57 -
----------------------- Page 70-----------------------
块被覆盖(overlaid),系统的主干占用的空间,会被用作其他部分的交换页面。它的尺寸
决定了所有模块的尺寸。而且将功能分解到很小的模块会耗费空间和降低性能。所以,当可
以提供20 倍临时性空间的大型系统使用这些模块时,节省的也仅仅是访问次数,仍然会因
为模块的规模引起空间和速度上的损失。这样后果其实是——很难用小型系统的模块构造出
非常高效的系统。
第二个技能是考虑空间-时间的折衷。对于给定的功能,空间越多,速度越快。这一
点在很大的范围内都适用。也正是这一点使空间预算成为可能。
项目经理可以做两件事来帮助他的团队取得良好的空间-时间折衷。一是确保他们在
编程技能上得到培训,而不仅仅是依赖他们自己掌握的知识和先前的经验。特别是使用新语
言或者新机器时,培训显得尤其重要。熟练使用往往需要快速的学习和经验的广泛共享,也
许它应该伴随特别的新技术奖励或者表扬。
另外一种方法是认识到编程需要技术积累,需要开发很多公共单元构件。每个项目要
有能用于队列、搜索和排序的例程或者宏库。对于每项功能,库至少应该有两个程序实现:
运行速度较快和短小精炼的。上述的公共库开发是一件重要的实现工作,它可以与系统设计
工作并行进行。
数据的表现形式是编程的根本
创造出自精湛的技艺,精炼、充分和快速的程序也是如此。技艺改进的结果往往是战
略上的突破,而不仅仅是技巧上的提高。这种战略上突破有时是一种新的算法,如快速傅立
叶变换,或者是将比较算法的复杂度从n2 降低到n log n。
更普遍的是,战略上突破常来自数据或表的重新表达——这是程序的核心所在。如果
提供了程序流程图,而没有表数据,我仍然会很迷惑。而给我看表数据,往往就不再需要流
程图,程序结构是非常清晰的。
很容易就能找到重新表达所带来好处的例子。我记得有一个年轻人承担了为IBM650 开
发精细的控制台解释器的任务。他发现用户交互得很慢,并且空间很昂贵。于是,他编写了
一个解释器的解释器,使得最后程序所占的空间减少到不可思议的程度。Digitek 小而优雅
的Fortran 编译器使用了非常密集的、专业化的代码来表达自己,以至于不再需要外部存储。
- 58 -
----------------------- Page 71-----------------------
对这种表达方式解码会损失一些时间,但由于避免了输入-输出,反而得到了十倍的补偿。
2 1
(Brooks 和Iverson第六章结尾的练习以及Knuth 的练习--自动数据处理 包含了许多类
似的例子。)
由于缺乏空间而绞尽脑汁的编程人员,常常能通过从自己的代码中挣脱出来,回顾、
分析实际情况,仔细思考程序的数据,最终获得非常好的结果。实际上,数据的表现形式是
编程的根本。
- 59 -
----------------------- Page 72-----------------------
提纲挈领(The Documentary Hypothesis)
前提:
在一片文件的汪洋中,少数文档形成了关键的枢纽,每件项目管理的工作都围绕着它
们运转。它们是经理们的主要个人工具。
The hypothesis:
Amid a wash of paper, a small number of documents become the critical pivots around which
every project's management revolves. These are the manager's chief personal tools.
技术、周边组织机构、行业传统等若干因素凑在一起,定义了项目必须准备的一些文
书工作。对于一个刚从技术人员中任命的项目经理来说,这简直是一件彻头彻尾令人生厌的
事情,而且是毫无必要和令人分心的,充满了被吞没的威胁。但是,在实际工作中,大多数
情况都是这样的。
慢慢的,他逐渐认识到这些文档的某些部分包含和表达了一些管理方面的工作。每份
文档的准备工作是集中考虑,并使各种讨论意见明朗化的主要时刻。如果不这样,项目往往
会处于无休止的混乱状态。文档的跟踪维护是项目监督和预警的机制。文档本身可以作为检
查列表、状态控制,也可以作为汇报的数据基础。
为了阐明软件项目如何开展这项工作,我们首先借鉴一下其他行业一些有用的文档资
料,看是否能进行归纳,得出结论。
计算机产品的文档
如果要制造一台机器,哪些是关键的文档呢?
目标:定义待满足的目标和需要,定义迫切需要的资源、约束和优先级。
技术说明:计算机手册和性能规格说明。它是在计划新产品时第一个产生,并且最后
- 60 -
----------------------- Page 73-----------------------
完成的文档。
进度、时间表
预算:预算不仅仅是约束。对管理人员来说,它还是最有用的文档之一。预算的存在
会迫使技术决策的制订,否则,技术决策很容易被忽略。更重要的是,它促使和澄清了策略
上的一些决定。
组织机构图
工作空间的分配
报价、预测、价格:这三个因素互相牵制,决定了项目的成败。
预测 报价
价格
为了进行市场预测,首先需要制订产品性能说明和确定假设的价格。从市场预测得出
的数值,连同从设计得出的组件单元的数量,决定了生产的估计成本,进而可以得到每个单
元的开发工作量和固定的成本。固定成本又决定了价格。
如果价格低于假设值,令人欣慰的循环开始了。预测值较高,单元成本较低,因此价
格能够继续降低。
如果价格高于预测值,灾难性的循环开始了,所有的人必须努力奋斗来打破这个循环。
新应用程序必须提高性能和支持更高的市场预测。成本必须降低,以产出更低的报价。这个
循环的压力常常是激励市场人员和工程师工作的最佳动力。
同时,它也会带来可笑的踌躇和摇摆。我记得曾经有一个项目,在三年的开发周期中,
机器指令计数器的设计每六个月变化一次。在某个阶段,需要好一点的性能时,指令计数器
采用触发器来实现;下一个阶段,成本降低是主要的焦点,指令计数器采用内存来实现。在
另一个项目中,我所见过的最好的一个项目经理常常充当一个大型调速轮的角色,他的惯性
降低了来自市场和管理人员的起伏波动。
- 61 -
----------------------- Page 74-----------------------
大学科系的文档
除了目的和活动上的巨大差异,数量类似、内容相近的各类文档形成了大学系主任的
主要资料集合。校长、教师会议或系主任的每一个决定几乎都是一个技术说明,或者是对这
些文档的变更。
目标
课程描述
学位要求
研究报告(申请基金时,还要求计划)
课程表和课程的安排
预算
教室分配
教师和研究生助手的分配
注意这些文档的组成与计算机项目非常相似:目标、产品说明、时间安排、资金分配、
空间分派和人员的划分。只有价格文档是不需要的,学校的决策机构完成了这项任务。这种
相似性不是偶然的——任何管理任务的关注焦点都是时间、地点、人物、做什么、资金。
软件项目的文档
在许多软件项目中,开发人员从商讨结构的会议开始,然后开始书写代码。不论项目
的规模如何小,项目经理聪明的做法都是:立刻正式生成若干文档作为自己的数据基础,哪
怕这些迷你文档非常简单。接着,他会和其他管理人员一样要求各种文档。
做什么:目标。定义了待完成的目标、迫切需要的资源、约束和优先级。
做什么:产品技术说明。以建议书开始,以用户手册和内部文档结束。速度和空间说
明是关键的部分。
时间:进度表
资金:预算
- 62 -
----------------------- Page 75-----------------------
地点:工作空间分配
人员:组织图。它与接口说明是相互依存的,如同Conway 的规律所述:“设计系统的
组织架构受到产品的约束限制,生产出的系统是这些组织机构沟通结构的映射。1”Conway
接着指出,一开始反映系统设计的组织架构图,肯定不会是正确的。如果系统设计能自由地
变化,则项目组织架构必须为变化做准备。
为什么要有正式的文档?
首先,书面记录决策是必要的。只有记录下来,分歧才会明朗,矛盾才会突出。书写
这项活动需要上百次的细小决定,正是由于它们的存在,人们才能从令人迷惑的现象中得到
清晰、确定的策略。
第二,文档能够作为同其他人的沟通渠道。项目经理常常会不断发现,许多理应被普
遍认同的策略,完全不为团队的一些成员所知。正因为项目经理的基本职责是使每个人都向
着相同的方向前进,所以他的主要工作是沟通,而不是做出决定。这些文档能极大地减轻他
的负担。
最后,项目经理的文档可以作为数据基础和检查列表。通过周期性的回顾,他能清楚
项目所处的状态,以及哪些需要重点进行更改和调整。
我并不是很同意销售人员所吹捧的“完备信息管理系统”——管理人员只需在计算机
上输入查询,显示屏上就会显示出结果。有许多基本原因决定了上述系统是行不通的。一个
原因是只有一小部分管理人员的时间——可能只有20%——用来从自己头脑外部获取信息。
其他的工作是沟通:倾听、报告、讲授、规劝、讨论、鼓励。不过,对于基于数据的部分,
少数关键的文档是至关重要的,它们可以满足绝大多数需要。
项目经理的任务是制订计划,并根据计划实现。但是只有书面计划是精确和可以沟通
的。计划中包括了时间、地点、人物、做什么、资金。这些少量的关键文档封装了一些项目
经理的工作。如果一开始就认识到它们的普遍性和重要性,那么就可以将文档作为工具友好
地利用起来,而不会让它成为令人厌烦的繁重任务。通过遵循文档开展工作,项目经理能更
清晰和快速地设定自己的方向。
- 63 -
----------------------- Page 76-----------------------
未雨绸缪(Plan to Throw One Away)
不变只是愿望,变化才是永恒。
- SWIFT
普遍的做法是,选择一种方法,试试看;如果失败了,没关系,再试试别的。不管怎么样,
重要的是先去尝试。
1
- 富兰克林 D. 罗斯福
There is nothing in this world constant but inconstancy.
- SWIFT
It is common sense to take a method and try it. If itfai ls, admit it frankly and try another. But
above all, try something.
1
- FRANKLIN D. ROOSEVELT
试验性工厂和增大规模
化学工程师很早就认识到,在实验室可以进行的反应过程,并不能在工厂中一步实现。
一个被称为“实验性工厂(pilot planet)”的中间步骤是非常必要的,它会为提高产量和
在缺乏保护的环境下运作提供宝贵经验。例如,海水淡化的实验室过程会先在产量为10,000
加仑/每天的试验场所测试,然后再用于2,000,000加仑/每天的净化系统。
软件系统的构建人员也面临类似的问题,但似乎并没有吸取教训。一个接一个的软件
项目都是一开始设计算法,然后将算法应用到待发布的软件中,接着根据时间进度把第一次
开发的产品发布给顾客。
返回书籍页