让我们先从一些现象动身。我们的前提是,软件开发是一项智力密集型劳动。关于智力密集型劳动,我们看察到的现象是,个别的表示差别很大,团队的表示差别很大,组织的表示差别很大,国度的表示差别很大。那不象体力占次要的劳动,象百米王跑百米的速度也仅比我快50%。
但在棋类运动中,一个高手能够车轮战数位低手,并且毫无破例地将他们逐个击败!
那些智力运发动表示出的特征是,计算切确并且速度快。其行为很象东方不败。固然关于葵花宝典的传说良多,但最准确的描述只要一个字\"快\"。东方不败已经快到了吓人的地步。
就象卡斯帕罗夫已快到了深蓝的地步。
有一则关于物理学家玻尔的轶事,有一次玻尔在普林斯顿大学听两个年青传授演讲他们的工做功效。期间玻尔突然发言说,假设照你们的研究算下往,会得到一个很有意思的推论。成果两个年青传授回往计算了两天,公然得出了同样的结论。
玻尔是若何做到如许快的?
在软件开发中,我们同样重视到如许一种高手,他们能够天天写出一千行摆布的高操行代码。他们能够运用已有的一些软件包,敏捷完成一个新的产物。他们能够在很短的时间内,学会一项新的法式语言或是新手艺。他们表示出一种神异的速度。
在武侠小说中,所有的高手都有一些常人不克不及企及的表示。象张无忌学太极,用龙爪手击败龙爪手名家;乔峰用太祖长拳击败全国英雄;姑苏慕容以其人之道还治其人之身,令狐冲一剑剌瞎十几双眼睛等等。我认为,之所以他们能做到如许,关键是在于他们快。
快其实不意味着禁绝或操行差。
快与操行其实不矛盾。
高手的快,其实包罗着很高的操行在此中。假设你因为高手的快,就量疑其操行,那就相当于在问:东方不败出手那么快,会不会刺禁绝?东方不败其实不称心于刺死敌手,他会在敌手身上刺朵花。他把杀人酿成了艺术。准确来说,他实正的兴致不在杀人,而在于艺术。
退一步说,就算东方不败第一击有点误差,他稍做批改后,立即跟上的第二第三击,也会击中他想击中的处所。在武功差的敌手剑还没拨出来的时候,他已杀死对方并刺上了一朵花。
所以实正的软件高手,他其实不称心于他的代码能有效地工做了,他认为编程是艺术,并醒心于此中。
在低手能写出一个版本的时间里,他已经写出了第十版。其操行当然不成同日而语。就象一个九段棋手,在给定的时间里,他能计算十种可能,并将每种可能计算到100手之后,从中抉择一种最有利的下法。低手岂有苟全的时机?
高手写软件老是不断地在重构(refactoring)。
高手喜好迭代式开发。高手说,增量就是打补钉,迭代就是推倒重来。关于软件那种工具,写一遍它可能OK(做到那一点也不随便),写十遍就是一个伟大的产物,再多写一遍它就更伟大些。
高手快的窍门在于他很熟悉各类工具。高手看书很快,因为每一本新书里,值得他好都雅的新手艺只要一两章的内容。
他能敏捷看完,并准确领略那本书的中心思惟和价值。而关于一个新手,每句话都是新的,他都需要往理解,每一段例子,他都需要往试。
很少看到一种100%全新的手艺或理论。就象Java language specification里说的,Java没有利用任何新手艺,用的都是业界久经考验的手艺。
关于高手来说,那些手艺都是他所熟悉的。天然,很快他就从一个C++高手酿成了Java高手。假设一个编程新手学Java,学两年也不如一个高手学两个月的。高手学新工具快。
高手写代码速度快。统计成果说,人均每人月的有效代码速度可能是300至400行。
但那是业界均匀消费效率。关于高手来说,那个数字太低了。天天写300至400行是完全有可能的。因为在写代码时,所有常识都已具备,已经没有任何需要他多花时间的工作了。他以至很少需要Debug。
高手重用代码的才能很强,熟悉新的API的速度很快。