原文链接:
斜体为译者注 O(∩_∩)O 。第一次翻译,技术有限,求指错!
我碰到了大量的关于“软件工程”的争论之,太多太多了!令人蛋疼的是,虽然对于如何“正确”制作软件有非常多的观点,但是在长期争论中,很难抉择。我已经考虑和研究了很久关于为什么会出现这种情况。我认为我终于能够清晰的回答这个问题了!
如果软件学科是一门“科学”的话,那么科学的方法就不应该有那么多问题。但貌似又不行。有的人认为与其说他是一门“科学”,不如说他是一门“工程”。不过工程充其量也不过是应用学科。比如,在工程里,桥梁要经受现实中长期运作的考验,即便短期,也可以通过检测桥梁模型在模拟真实的环境的表现来进行评判。尽管仿真是真实世界的写照,但若想他们有用,仍然受限于现实世界。如果这桥的确悲剧了,毛病又不是出在结构或者原材料上,那在工程学上,你能喷这桥么?工程师的模型,必须严格的服从物理学和化学上的规则。所以,无论工程师愿意与否,他都已经被这些规则给绑架或者保护起来了。
但我们大多数情况下,软件设计中并没有这些(规则)。我们有一些要求,比如输入输出长什么样儿,运行时约束所决定了的给定操作系统所允许的最大时间。但事实上,还有很多很多的模糊的客观指标。
条条大路通罗马。但既然都可以通,走哪条呢?哪条最“好”呢?
在讨论中所涉及到的大多数的技术和模式通常都能够满足要求。因为他们都是图灵等价的。也就是说,他们在给定足够的时间和资源后,都有能力解决任何被明确指定的算法。只得强调的是,实际上你没办法区分他们的结果!因为他们都做到了!
有一些特例,例如人工智能。你没必要知道固定的答案。它的结果通常是根据一个连续的范围空间来判断的。在这些时候,不同的算法被比较以后进行了排序。比如,他的判断标准就类似于可以通过迷宫来检测小白鼠的智力。不过正是因为存在一个已知的更好的算法,所以我们没办法知道这到底是正确的(‘应该是最好的’),还是唯一的方法。它可能是我们所知道的最大程度了,除此之外,别无所知。在后面的解释中可以看出,我们并不能发现自己的无知之处。
在争论的过程中,有的观点可能进行得很慢,但他们并非讨论的关键所在。有人认为,越高级的开发者生产力导致了更慢的速度(或借助更强大机器),或者在几十年后芯片的速度已经足够满足要求,那么它(速度)就没有任何问题了。开发者的生产力很可能是一个重要的度量标准,但因为存在太多的因素,它还是很捉摸不定。下面我还是将回到生产力这个问题上来,因为他的确是一个非常重要的话题。
所以,如果物理工程学是真正的科学的话(应用科学更贴切),软件设计并不遵行相同的模式,那么软件设计到底是个什么东东?或许是数学。数学本身并不受限于物理世界。有的人发出了反对的声音,他们认为他是受限的。因为它假设了一个时空,而不是真实存在的时空。而他遵循的规则远比我们想象中来得奇怪。但出于实用性上的考虑,我们通常认为他是独立于物理,自然,生物等其他规则的。
数学最有用的地方在于他可以创建几乎不受限的模型。这些模型可以反映出自然中已经的规则,或者是数学家奇思妙想创造出的规则。数学有个奇妙的特性,他能通过另一个现实创造另一个世界。唯一的规则就是这些模型必须是内部一致的——他们不能否定其他模型自己的规则。(好吧,或许他也可以,但如果这样做了他们就没多大用处了,就好像一个程序总是崩溃一样)
软件并不像数学一样,或许是指的从某种定义上的数学。事实上我们可以通过软件创造另一个世界,就像游戏世界一样。游戏通过创造虚拟的现实来反应真实的世界供人们娱乐。在这虚拟世界里人们可以摆脱现实的束缚,而用一种充满希望的,有趣的方式。一个很流行的例子是《模拟人生》。这是一个模拟社会交互的游戏,而不是像很多典型的动作类游戏一样,仅仅机械的进行移动。
大多数的游戏都趋向于借鉴现实时间的某些方面和规则。因为游戏玩家更愿意买那些从某些方面有些联系的玩意儿。不过创造一个和现实世界大相径庭的世界也是行得通的。例如这些世界可以是违反地心引力的。事物都向上“掉”。或者时光可以反向的流动,横向流动,或突然碰到了其他的时间轴,等等等等。(就我所知,我看了太多次星际迷航,我爱死它了!‘其实我觉得蝴蝶效应这部电影更贴切他举的例子’)
曾经,我们也把玩一些固定的或静态的社会法则,经济法则。研究者们甚至通过“遗传算法”来进化模拟的生命模式,以求实验达尔文进化学说的自然选择。它包括了人造的食物,能量,有性繁殖和无性繁殖等等。唯一的缺陷就是这个虚拟时间的造物主是想象出来的(或者还有那些讨厌的充满局限性的计算机资源)。一旦他们清晰的定义了这些规则,他们就能通过这些规则来创造一个世界。他们创造这些规则,并融入到软件之中,按下“运行”键,然后坐下来静静的观察。如果你渴望当一个上帝的话,(编写一个)软件是目前的这个世界上最好的游戏。和你法律上的兄弟或者亲兄弟不一样,电脑不会抱怨你企图领导它。
通过这些,我想告诉大家,软件拥有几乎无尽的灵活性。这也就是我们几乎无法评判一个客观的软件的好坏原因。因为在软件中本身就没有客观的现实(法则)。这也是所有让我们头痛的争论的潜在因素。或许我们就像是医院中的一群疯子,争论我们之中谁才是真正的拿破仑。有的人认为缺乏客观的度量标准是因为我们尚且知之甚少,我们还没有学会如何进行度量和对什么进行度量。相反,问题就出在我们创造了那些我们自认为已经知道的东西。今天你是圣诞老人,明天你是埃及艳后。他们可以同时出现在文字感官中,就像玩一个RPG,或者一个抽象感官中,比如软件构造法则。
在软件设计中,可以通过许多的可行的设计来得到正确的答案。但是如果面临众多选择,哪个才是更好的呢?一个可能的回答是,“或许那根本就不重要”。一旦软件接受了输入,产生的输出,那么为什么我们要关心他是怎么做到的呢?如果一个黑盒可以工作,那么为什么我们要在意其内部的工作呢?
我们在意内部的工作是因为我们不得不维护(修复或修改)这些由其他人写的不同的程序代码。用我们的上帝模式来分析,如果上帝度假或者退休了,那么他的替代者就需要知道这个世界是怎么工作的,以便于维持他的运作。真正的上帝或许有无尽的理解力以致于他们可以快速的掌握全局。但人类天生就是理解力有限的。我们花费了大量的时间和金钱用于理解为什么这些东西会这样运作。
因此,如果我们遵循一些惯例使得A可以更轻松的理解B的工作,定是极好!但另一个问题接踵而至,是否这些惯例本身就比其他的要更好呢?约定俗成本身是有利于交流的,但是所有的约定都是等效的么?(明显不)
一旦这些惯例用于交流,我们就必须知道更多的东西,关于交流过程中,人类回答更好的问题。但看起来这本身就是跟内心世界相关的。如果我们的回答依赖人们内心中的一些知识的话,那么我们就也不能声称我们能够用客观的标准来衡量这些惯例了。因为内心世界本来就是被定义为主观的。另外,研究内心世界和研究客观世界比起来,仍然是一个不成熟的领域。再说了,大家的脑壳都是不一样的!A脑袋里所创建的真相和模式可能对于B脑袋来说一文不值。
或许当人类大脑被完全开发以后,我们就能知道到底它(内心世界)是怎么工作的了。那时计算机科学将渐渐变为一个很难的科学(分支)。不过就目前来说,心理研究院和软件研究院缺乏充分的合作。大多数心理学研究倾向于治愈或缓解这些大麻烦,抑郁症,精神分裂之类(‘可以理解成,心理学研究致力于解决病痛,而不是提前规避病痛。但你写代码一定要尽量的规避BUG,所以码农要高级点…’)。除非找到了宝藏,而它正是大多数研究追寻的东西。相较之下,“工业心理学”只会接受小改变。但想要回答一个大问题来说他需要的其实更多。
讽刺的是,如果我们大脑已经知道了如此之多,我们大可以用这些知识来建立电子版(‘可能是因为大脑中的信息交流是通过电流,所以说到电子版’),这将使得人类编写的程序大部分被淘汰。相信第一个模型将会侵占整个领域。但是基于过去的模式来看,不会过多久,他就会被山寨.
现在再让我们回到程序猿生产力上。这是第二个我们要关心黑盒的内部的原因。如果虚拟世界可以被创建,更改,快速的修复,那么公司可以节约钱并且使得经济更加的高效。因此,关注生产力技术是一个明显有用的努力。
问题在于好像在这个领域并没有完成太多研究。有的人声称用代码量来判断生产力,例如一个两千行的程序比一万行的程序更容易编写和维护。但是关于代码量是否可以代表生产力却引发了激烈的争论。比如,Perl代码通常很短小,但是大家都认为他太难读了。他也跟问题的领域相关。我从“聚集面向对象”的语言中见过一些的最好的短代码的例子,例如APL的衍生语言。但如果用他们来推断真实世界的情形就显得太儿戏了。
直接的关于生产力的研究是非常少的。比如研究员可以把很多程序猿关在很多个相同规格的不同房间里。每个房间都用不同的语言或者翻来,让我们来看看谁最先完成。但其实还有其他的问题。可以运行的代码不见得容易维护,许多语言和范例都标榜自己能够很容易的维护,并不是最初的产品交付。我们不能保持这个测试的科目处于游离状态长达数年时间。最终只是为了测试长期的可维护性。没有任何公司或者政府会允许一个真实的项目像这样运行。
我根据Edward Yourdon的研究建议发现,对于确定的开发者范例或者语言如果让码农最舒服,那么他就能最搞笑的工作。这表明为了得到最合适的生产力,最好是雇佣对于确立的语言或者工具的一系列志趣相投的,这个语言或工具的发烧友。
最主要的是经验科学在我们的领域中是极其缺乏的。在那种情况下,可用的计算机科学的书中有什么东西呢?他们会写一些本就已经存在的东西。
我们在软件中有很多通用的技术,方言,工具等等。大多数的学术著作都是关于它们的。比如:《布尔代数》《面向对象程序设计》《数据结构》《算法》《关系数据理论》《集合论》《类型论》。
但这些概念是科学么?让我们来剖析一下简单的一些问题,《布尔代数》。布尔代数是一个数学领域方言,他能处理布尔型的操作数和操作器。操作器通常就是我们说的,与或非。这可不是科学,是数学。
但几乎所有人都同意这是个有用的数学知识。关于这个唯一被广泛使用的逻辑上的第三个值(前两个当然是true,false),“nil”也就是“null”,他也被添加进了布尔的操作数。许多RDBMS用他来处理空值。但是它仍然更亲近与布尔代数。
可以注意到,硬件或许需要布尔状态,但软件并不是太需要他。在布尔硬件上运行的软件可以非常好的模拟类似空值的这种情况。软硬件匹配的话,速度会得到提升,但毕竟他们是不同的问题。我们也可以注意到在RDBMS中,使用空值在关系式古鲁回路中是存在很大争议的。
当理论上可以脱离布尔代数或者它的变种开发软件的时候,大多数人都认为它太难了。部分原因是因为没有人知道相关的其他选择。7值逻辑(Seven-value logic,不会翻译这个)也可以创建纯图灵的语言,但他实在是太古怪了,大家都不想使用他。没有竞争者的比赛获胜当然显得非常的轻松。但在其他领域,有很多可供选择的东西,他们彼此竞争。关联式和OOP就是一个例子。如果他们是竞争者,那么我们就需要更严谨的科学方法。仅仅经验之谈是不够的。他常常会发生冲突或者很难改变。
布尔代数只是数学而非科学。如果我们想把这个问题转换成科学的问题,那么我们就需要经验之谈,“布尔代数式的代码比X更短”。但是更短的代码不代表更好的代码,正如此前所述一样。有的人可能会为了其他的利益而写更长的代码。我们来看考虑一下身边的一些指标:
这个列表或许不是详尽完美的,但我们这里就不要纠结于找到一个完美得指标了。基本上他只是某种用于让软件问题转换为科学的东西。
如果你查阅计算机科学的文献的话,你通常不会看到太多被处理过的问题。除非是第一个(也就是列表中的第一个,性能),它看上去倒是用了很大篇幅来描述一些知识,这些知识预示着他是“科学”。举例来说吧,十九世纪七十年代,产生了很多关于是搜索,排序的算法,他用大O来表示他的性能。不过除此之外,在性能上他还是存在很大的空白。
大多数适计算机科学文献都适应一种模式——在典型的书或者是布尔代数的某些章节中。通常,这是他按照以下所描述的顺序和性质:
一本布尔代数将会描述基本的操作数和操作符,也会介绍更多的通过基本的操作符衍伸出的复杂的操作符。比如,他可能会展示基于与或非而衍伸出的异或和相等这两个操作符。(实际上,从根本上来看,只有一个是必须的,即“与非”,所有的其他的都可以单独从他推演而出)。
然后这本书可能还会介绍一些其他的例子,比如正规的逻辑和计算机算法领域。最后,他可能提出更深远的结论。比如逻辑上的第三个值(null),再比如他可能介绍或者直接给出关系代数的参照,还有一系列的理论。这些也都利用了布尔代数。
这可能是所有的有趣的东东,不过,他还是不是科学!他并不一定要受限于物质的或者真是的世界。这些被提出的实际的例子,都是缺乏根据的。除了性能以外,他们很少可以和其他事物进行比较。
在有的情况下,也会有多种选择,不过我们选择的是差的一些,而不是那些好的。比如书中所展现的模型的改变,是支撑作者所喜欢的范例或语言,同时他们却忽略了那些于他的观点相违背的。好的做法应该是很深入的,同时需要关注各个方面,你喜欢的,和你不喜欢的。理想的做法是让那些兼顾各个方面的专家和支持者来做。有个麻烦是可能好的做法会占据一大本书!总之,他最后是因为主观心理因素而结束的。完美的佐证是很少被揭露的。客观上来讲银弹是不存在的。
记得代数里面的序数么?你可以通过对-9进行开放来得到这个奇怪的东西。在我们所经历的世界中,虚数通常是没用的。但他在电子领域却举足轻重。特别是在在这领域中他有预测的能力。利用虚数数学,可以预测电子的表现。并且通过模型,预测的精确性是可以判断的。
有人会借此认为布尔代数同样拥有预测的能力,不过他的预测性较差而已。计算机回路使用布尔作为他的基本语言,所以布尔代数在这种情况下当然是有用的。不过在硬件之外,他和真实世界的联系就有点模糊了。
有人说只需要跟踪商业邮戳就可以知道包裹是否已经送到了。他不可能是部分到达。至少我们不会像那样来表达。量子力学告诉我们,在包裹移动的过程中不可能掌握他的实际位置。我们可以知道包裹已经静止下来了,但是没办法了解他是什么时候停下来的。因此,在现实情况中,他不是代数。我们所使用的代数,在人类对世界的认识来看,它是抽象的。它是不完全的抽象,但也足够在大多数时候使用了。从某种程度上来说,他和牛顿物理学(也就是经典物理学)相似。相对论和量子物理学已经被证明比牛顿抽象更加精确。虽然如此,牛顿物理学在绝大多数情况下已经足够了。布尔代数可能也是一样的:一个有用的谎言。
布尔代数是否潜移默化的在教育系统中影响着我们的思想呢?这就像是先有鸡还是先有蛋的问题。有一些遥远的部族认为不应该把时间看做是线性的。我们的线性观点可能会被我们的一些习惯所改变。例如时钟和日历。布尔代数可能已经直接或间接的做了某些相同的事情。
当我们在关系代数中提出复合型梯度的时候,和真实的世界的联系就变得更加的未知了(复合型梯度,类似于四维空间,五维空间等,真实世界无法表现出来的)。包括我在内的许多人都认为“关系”给我们造成了太大的阻碍。尽管有的人还是会使用OOP,然后仅仅通过动作类接口来完成所有的方法和数据的操作。(有的人认为OO和关系是完全不同的,不过我不回应。或许这将会是以后的一个精彩的争论话题。)
在所有的计算机科学的写作中,只有很少的一给了我们有用的,客观的工具来回答“哪一个更好”。鉴于完全图灵规则(之前提到过),预测能力并不是一个问题:他们都能够给出正确的答案。就像是当一名音乐学家和电影制作者一样:很多的音乐或情节都是被别人所要求的或者建议的。阿猫阿狗都可以给你提供例子和想法,困难的是如何精简它们,让你在对他们进行选择和利用它们进行工作的时候不要不知所措。
哪怕是最简单的事物也常常很难被确定。比如并没有人证明结构化的程序比“goto”语句更好,仍然没有码农想回到goto的“光辉岁月”里。在许多年以后,有人尝试发现一种可以表达出的原因。我认为我自己讨厌goto是因为缺乏缺乏码农间的一致性,也缺乏可视化的流程控制。对于大脑来说,块状缩进提供了一种在视觉上更富有信息量,更容易理解的方法。这是goto做不到的。(在大学毕业以后没多久我被强迫使用goto,因为公司不想为编译器升级的付钱,所以仍然在用60年代的版本)
不过,我还是不知道怎么处理流程控制的一致性。如果在争论中有这个话题的话,我不会声称我有客观的证据。或许使用goto有一些使他简单而且不用用文档记录的惯例和模式。文档是和内心,感觉相关的可视化线索。或许一个很好的基于goto的代码编辑器能够在goto分支上自动的增加下划线,以此来提供更好的视觉线索。甚至,有人认为goto有点像现在许多语言中的try/catch的风格。因此,goto的习惯毕竟不会完全的消失。(我也倾向于抱怨try/catch块以及他们的用法,但这不是本文的讨论范围)
总而言之,从各个立场上看,计算机科学非科学,软件工程非工程。
请别断章取义,我并不是认为他们全都没用。不是科学或者工程,并不就是说他们理所当然的就没用了。我的抱怨只是说他们误导了大家,或许是无心的,或许是有意的。
他们是约定,这约定是一个好的开端,尽管他们太多了,却没有客观的方式去评判他们。让我们回到那个上帝的分析上去吧,抛开那些其他的可以进行比较的东西。从那些瑕疵里很难创造出一个世界来。我对那些基于非经典物理学的游戏不太了解(他们或许只是碰巧违背了牛顿法则)。尽管想象一个跟我们所接触的东西相似的东西不是太困难,但让他保持一致性并且能够一起工作的话,却更加的困难。嗑药以后的那种虚幻感非常的酷,想要从虚幻世界东西里得到有用的东西是很难的。
在星际迷航中的一些片段中,轨道船受阻于星球或者着陆区附近的干扰场无法和地面的外出小队取得联系。但船仍然能发射他们的巨型相位仪光束到星球表面。如果他们能够发射镭射光束,那么他们理论上就可以使用它发射莫斯密码或者二进制信息。举例来说吧,SOS在摩斯密码中可能是“嘟嘟嘟嘟...”。相位仪从星球表面发出的信息和船上的传感器所接受的应该是相似的。
在电影中这些自相矛盾的东西无伤大雅,不过如果有人用这种矛盾的东西来创造一个世界并且尝试让他想模拟人生一样(只不过更高级而已)运作起来的话,这些矛盾体就会开始折腾了。在星际迷航中举的这个仿真的世界中,如果主角曾经发觉他们可以通过武器来传递摩斯密码的话,情节就变得太乏味和缺乏悬念了。作为一个虚拟的上帝,我们不会喜欢我们所创造的世界。他没有我们想要的输出(在这个例子中也就是娱乐性)。
如果我们不想在这个问题上过多争执,那么我们可能会选择一个我们所熟知的方言来避免得到我们所不期望的答案,例如美国西大荒。西大荒是一个真实的事物,所以只要我们遵守他的规则就不会出现真正奇怪的东西。比如无论是印第安人还是牛仔都不会创造一个终极武器,用大爆炸来肃清这块大陆(至少在模型中,几十年内是不可能的)。
说这个的目的和谈论计算机科学习语差不多。他们已经被实地检测了。迄今为止任何主要的矛盾和问题都已经被探索了,随着时间的推移,相对较小的麻烦已经渐渐被解决了。起码通过工作区被记录的情况来看,他们已经被我们更好的了解了。或许有一些创新的习语,通过新的,不同的方法来获取我们还没有发现的答案。不过在这一点上谁知道呢,谁又能说的准呢?
等等!你说,“难道实地检测不是科学的方法么?”除开产生的正确的输出,检测的大部分都还是通过我们的意念来的(还是主观的)。试图找到一个客观的解决方案又让我们的脑子回到了在迷宫中找一个不存在的出口的情况。我们也许可以检测在一定范围内怎样使用习语,不过却不能说他是最好的习语,更别说是最可能的了。
如果没弄明白习语,我们就不能说他是否是最好的或者最可能的那一个,因为习语的使用者根本就不明白他,在其他的问题上也是一样。“不明白”也就表明了要么是很差的使用者,要么是个差的习语。如果一个习语需要量子物理学的只是将两个数相加那么他可能并不会变得流行,尽管答案是正确的。哪怕我们知道明显的错误是可以被修复的。因为不会修复并不意味着完全不能被修复。当我们偶然发现问题时,他可以很容易被调整。我们只是无法发现我们的无知之处。这看起来是一个明显的陈述,但他有太大的分支了。
再来看一下星际迷航的分析,或许有许多方法都可以完善,比如外出小队可以频繁的切断和船体的联系用来保持情节的趣味性。但是第一次尝试将会带来其他的不一致性和意外的副作用。如果你需要一个可预见性的,可管理的虚拟世界的话,从相似的世界或者相似世界的方法进行复制将变得个更加容易,比如北大荒。比起已知的恐惧而言,未知的才是更加危险的。这些计算机科学书籍就是我们所知道的恐惧。
如果有人能够使一个新的习语完美化,通过找出BUG或者奇怪的东西,或者更了解他,那么他将加入到有用的习语王国中来。在我们的虚拟世界中,他提供了我们更多的选择。大量的方法也可以允许更多的人参加到这个大世界中来。因为这里有更大的机会让一个习语匹配人们的个性和认知方法。
GUI(图形用户界面)就是这样一个例子。他允许人们学习和使用计算机,因为他提供的虚拟的接口与大多数人通常使用的实际的按钮,实际的纸张形式以及文件夹相当。GUI不需要有工作的软件,有的人认为他比一个被很好优化过的,基于字符的接口需要更多的工作。但多数人还是认为他更加的让人感到舒服,因为GUI模拟了一个相似的习语。谁知道呢!或许模拟人生在某一天会取代GUI,作为一个更好的接口。房子可以折叠起来,人们可以文件化。我相信模拟人生的粉丝可以创造所有的操作系统和办公应用分析(可能只是某种残酷的微软式玩笑)。
| A | B
|------------------------------------ ...
1 | ifGoto(c5 > 7, a3) |
2 | menuKey("AXg6<enter>") |
3 | set(c9, "45.0") |
4 | set(e7, c9) |
5 | ...etc... |
对于编程,我见过习语的电子表。他可以允许会计和办事员编程业余的码农。Lotus 1-2-3版本都允许人们用已经存在的电子表习语来组织程序习语。这些习语是跟单元格,菜单和工作页相关的。比如在lotus中你可以用单元格引用,而不用写像表格一样的goto式的程序语句。(我不能说我发现他们的程序自身就非常的具有可维护性,但他仍然是一个有趣的现象)
假设相许就想单元格A1这样开始,下面对他如何进行翻译举的例子:
这个过程提供了一个完全图灵语言,他相应人们手动的操作,可以到达任何单元格,任何菜单的特性。他也是用单元格而不是变量,所以使用者不需要想码农哪样了解变量的含义。这是一个可重用的经典例子。
微软的电子表从来不会和会计,办事员分享相同的能力。因为他是用VB语句和变量,而不是单元格和菜单以及鼠标单击事件。也就是说,他没有受到手动操作电子表用例的世界的影响。
尽管微软的EXCEL程序很少被触及,微软还是从其他的一些方面赢得了这场电子表格大战,首先,他卖了一个好价钱,部分原因是因为他是捆绑销售的(‘流氓’)。其次,他家了更多的特性用于减少直接编程的工作。这得到了那些不喜欢编程的人的拥护。第三,lotus在从字符世界转到GUI时间的过度太晚了。单纯的巨大学习太过依赖字符UI惯例。这很难能够代表等价的鼠标操作。第四,lotus存在凡人的内存问题。单这对于lotus的专家来说不算什么。一旦用户使用大型程序,他们就很难在想转变到微软上去。不过他们常常被多数人(的反应)打败。
有人或许会说尽管对于操作电子表的人来说,电子表习语使得学习编程更加容易了,一旦不考虑学习曲线的话,电子表自己不能使电子表中央程序更好。可能只有非常少的程序员在他的有生之年可以掌握所有的范例(或者在他转向管理之前)。当然,可以学习所有的主要范例,但是改善他们却是另一件事了。对于大多数的程序员来说,掌握一个或者几个范例比学习很多东西都浅尝而止要更具有经济价值。最后,我们的思想仍然是衡量主要的因素。思想才是让软件充满力量还是束手束脚的东西,而不是外部世界。