杀不死的人狼——我读《人月神话》(四)

<<= 上一节 四、没有银弹,或人狼杀不死 人狼这个动物很奇怪,皮肉坚实还是自疗系的,所以要么砍它不动,要么杀它不死。这种动物如同习得(传说中的)金钟罩功夫,刀枪不入,水火不怕。也如同金钟罩有罩门一样,人狼对银没有免疫,因此如果做一颗银弹就能穿透它,进而杀了它。 所以人们总是说一物克一物,大象怕老鼠,总有对付它的法子。但如果你设定了一个自圆已说的悖论,那除了否定悖论本身没有意义,也就没有解它的法子了。同样的道理用在“ ...

杀不死的人狼——我读《人月神话》(三)

<<= 上一节 三、《人月神话》是预言了未来还是控制了未来? 事实是:我们现在的很多工程知识,——无论是从书上看到的,还是从实践中体验到的——大多未曾脱离《人月神话》之所言。 我在开篇中说《人月神话》“是一本可怕的书”。然而我认为真正的可怕之处在于:如今只要论及工程(且不要让人认为是离经叛道),那么所讲述的一定是Brooks的这样的经验以及由此推出的观点,或者在不违背这些经验和观点上的一些具体的实作方法!我们全然不顾书中所言是现象,还是本质的推论,或者只是现象归结的一个(未必正确的)答案。 ...

杀不死的人狼——我读《人月神话》(二)

<<= 上一节 二、哪些是现象,哪些是答案,而哪些才是本质? Brooks在1961年至1964年间,主持与领导了被称为人类从原子能时代进入信息时代标志的IBM/360。十余年后,在1975年,他将历年来所写的有关软件工程和项目管理方面的文章汇集成书,这就是《人月神话》。无疑的,《人月神话》是Brooks十年中对IBM/360与操作系统OS360等项目的不断反思的结果。 而在我看到Brooks这些言论的时候,我并没有为它们所震惊。我所叹服的是Brooks在30年前便具有这样深远的思想。可以想见,对于30年前的黑暗时代,这些思想无疑是明灯和烛火。 (你有否打算用十年来思考一个问题呢? ...

杀不死的人狼——我读《人月神话》(一)

前言 在这与这段文字之前,我已经阅读过种种关于《人月神话》的文字。评论者既有刘天北这样的美食家,试图在书页中夹点胡椒面以慢慢品味,为了表现食客特有的风格,他的书页都比别人数得仔细。也有marktsen这样的速食者,试图几句话就打发了自己或者读者那漉漉的饥肠。 阅读这些文字给我带来的收获是:面对《人月神话》,除了表示五体投地的诚服,你既不能做正面言论(那是多余),也不能做负面言论(那是找事)。 这是一本可怕的书。 我大概花了三周的时间来细读这本书——也许很多人会说我应该花更多的时候或者读更多遍——不过,这不是重点。我在书中印证和找寻思想,并为这本书写下了数百个注释。 ...

关于做PDF的FAQ(一)~(四)

年前曾给在VeryCD活动的任真兄说过,要做一份文字来教大家做PDF。其中最主要的是做PDF的书签。现在07年的春节快过完了,想想这份文字不能再耽搁着,便决定来写写。 但是,我可能不能写成一份教材,因为那太费时间。因此,我决定写成一份FAQ。我想尽可能写得简单写,简单到你一做即会。——但要不要期望知道原理与过程,因为这份文档只是一个FAQ。 在开始之前先做一下说明,后文中的acrobat是指adobe acrobat。它是专做pdf的一个编辑工具,目前已经发布到acrobat 8。而后文中的reader,则是指读pdf文件的阅读器,并没有编辑功能,也已经发布到了reader 8。 ...

也说读书

常去周筠老师的博客上看,有时候便感叹啊:找到一个好的博客,比找到一个好的书店更有价值。因为什么呢?因为好的博客不但有好的文章,也有好的推荐。 我自己的博客里,少有推荐,便是自认没有荐者的眼光。所谓千里马常有,伯乐不常有。我做不成伯乐,便不去随便指认马的好劣。但周老师显然是好伯乐,因为我常常在她那里读到好文章。 今天读到的,是关于读书的文字。有文有荐。 读的时候,我却在想了,我实在不是读书人。周老师上千本的书是读了的,我呢,不算课本的话,百本怕也不到。 ...

从表达式到变量:一行scheme代码之所见

下面这行代码在scheme中是可以执行的,其结果值为12: ((if #f + *) 3 4) 在scheme中,一对括号表明过程调用。括号中的第一个参数是过程名,其余的则是过程参数。 那么,我们先看内层括号中的代码: (if #f + *) if是一个过程名,而不是语句。该过程相当于JavaScript或C中的三元表达式,或者其它语言中的一个if语句(的效果)。试以javascript来描述它的效果(以下语句中的字符串定义,只是语义上的含义,并不表明它是字符串): var q = '# ...

Qomolangma.V1.0的发布说明

一、Qomolangma 1.0 Final 一年以来,Qomo团队都在一种迷茫的、看起来没有方向的状态中工作。因为Qomo看起来缺乏必要的设计,以向每一个关心它的人解释以下的问题: Qomo到底是什么 Qomo有什么用 此前我已经说过,Qomo项目源出于另一个名为WEUI的商业项目。WEUI有着自己完整的架构和方向,由于需求决定设计,因此事实上WEUI的原始设计也是面向它原本的方向与需求的。我当然知道这样的需求目标和方向,但也同样知道:WEUI与Qomo有相似但不相同的方向。 所以,我无法把WEUI的架构搬到Qomo中去,也无法用WEUI的方式来解说Qomo的架构。我必须Qomo的前期工作中解决一个问题:如何让WEUI变成Qomo。 既然不能让一个旧架构为新目标服务, ...

Qomo项目中代码的一般性约定

一、变量声明的一般性方法 Qomo约定在全局空间进行变量声明时,应用var关键字来声明,而不应当省略(尽管语法上讲能这样做)。声明时的代码格式尽可能使用如下形式: var v1 = 1234; v2 = 'abcd'; 或为每行声明都保留var关键字,例如: var v1 = 1234; var v2 = 'abcd'; Qomo约定在函数内部声明局部变量进,使用var关键字时可以用如下省写形式: var v1 = 1234, // < ...

如何使用Qomo的Builder系统

1. Qomo的Builder系统 Qomo在Beta2之后,主要解决的一个问题就是Builder系统。在设计上,Qomo对Builder系统提出了非常严格(甚至是苛刻)的要求,其中包括: 使用Qomo自身的框架来实现 使用JavaScript来实现,而不要第三方的应用(例如.exe的压缩程序) 对既有的和将来的Qomo项目透明,无影响 深入到Qomo内核的、分层的、可分解的模块定制 编译的结果代码,与使用中的调试版本无差异 这些要求所主要表现的,就是Qomo的Builder可以定制,而且对使用者来说公开、透明。 由于JavaScript是解释执行的脚本, ...

2007年的几件事

一年前写了篇“2006年的几件事”(在这里),一年了,也该盘点一下,看看成绩,想想过失,规范一下07年的几件事。 06年的8件事,原本以为第一件第到四件可以松松搞定: 1. 把《石像的忆述》这篇小说写完,或者续写一部分。 2. 去西藏两次了,每次都没有游记出来。如果再不写,西藏的印象只怕是要沉淀到记忆里,再也浮不出一个泡了。有机会应该把《藏行路上》写出来。 3. 把澄心聊天室的代码改出来, ...

Qomolangma框架库(三):处理池与处理机

一、框架库:处理池与处理机 严格地说,Pool被译成“池”即可,只是在Qomo的TPool类中,所有放在“池”中的对象都是处理机(Machine),因此这个TPool被称为“处理池”类。 Pool的出现早在WEUI的时代,其目的是处理同步的、缓存的XmlHttp对象。因此,Machine也就在事实上只实现了“THttpGetMachine”。这个HttpGetMachine也能处理POST类型的HTTP请求,所以,严格地说,它应该名为“THttpMachine” ...

Qomo V1.0 final 发布~

终于写完了 V1.0 的全部代码~~也顺道整理了整个框架~终于可以发布final了。 ^.^ 正式版中的重大改进,包括: 新的命名空间和路径算法,终于可以声称支持“命名空间”了 完整的builder系统。支持连接(link)和压缩(compress)代码了 (体验版本的)组件系统及其系统 完整的性能分析和测试框架,载入器($import)的性能提高 在Qomo.js中, ...

再谈JavaScript时钟中的16ms精度问题.

上一篇BLOG中,通过测试我们发现 JavaScript的时钟是16ms的间隔. 对于IE来说,每次总会发生16ms的间隔;对于firefox来说,会存在0ms的间隔. 对于后者,我曾解释说:可能是Java使用了自己的时钟. 先说第二种情况,对于firefox中的js引擎,我尚未去看代码,因此我只说"可能",但后来hax来说,firefox的JS引擎仍是C写的,这才想起的确如此.所以这里先说,我前面关于firefox的问题的解释是错的. 再说16ms的问题. 我其实也怀疑,为什么是16ms,而不是其它的什么值呢? hax给了我很多信息.我这里来整理一下: ...

JavaScript时钟间隔的问题~

JavaScript中setTimeout()和setInterval()用于创建和管理时钟.但这个时钟的精度是多少,却没有什么资料来提及.在讨论具体的问题前,先说明一下setTimeout与setInterval在时钟间隔为0值的情况下的反应. 当用户置setTimeout(proc, 0)时 ,将让出CPU直到下一个时钟间隔再开始执行proc,而并非"在0ms后执行proc";当用户置setInterval(proc, 0)时,时钟不会被初始化. JavaScript要求至少以1ms为间隔创建时钟. 接下来,当interval值为1(或者其它很小的值)时,时钟将按一种"最小的" ...