达到卓越

译者:jiing

作者:周思博(Joel Spolsky) 2005三月25日,星期一

约耳谈软体的一部份,http://www.joelonsoftware.com

在二千年的三月,我架了这个站并以有点不可靠的声明说:「大部份人以为你要有个点子才能建立成功的软体公司,他们错了。」:

常见的信念是:当你建立一个软体公司时,目标是找到一个简洁的点子能解决某些之前尚未被解决的问题,然后实作它,并赚点钱。我们都称此为「建立一个较佳的捕鼠陷阱(build- a-better-mousetrap)」的信念。但是软体公司的真正目标,应该是将资本转换成可以使用的软体。

过去五年我已经实际地测试了此理论。我和Michael Pryor于2000年九月开创的公司所用的公式可以被总结为四大步骤:

最佳工作条件→ 最佳程式员→ 最佳软体→ 利润!

这是相当合宜的公式,尤其因为我们在开创Fog Creek时的实际目标是去建立一个我们会想要工作的软体公司。在那些日子里我曾经声明:好的工作条件(用夸张的说法就是「建立世上最好的软体开发人员会想要工作的公司」)会产生利益,就像巧克力导致肥胖,或是电视游戏里的卡通性爱会导致黑社会式的滥杀一样的自然。

不过今日我只想要回答一个问题,因为如果这部份不是真的,我的整个理论会崩解。问题是,谈论关于有「最佳的程式员」是否有意义?程式员之间的差异是否大到需要特别在意呢?

rs1.jpg

或许这对我们而言很明显,不过对许多人而言,这个假设仍需被证明。

数年前,一家较大的公司正考虑买下Fog Creek,而当我一听到那家公司的CEO说,他不是真的同意我雇用最佳程式员的理论时,就知道这绝不可行。他用了一个圣经的隐喻:「你只需要一个大卫王,和一支只要能遵守秩序的军队」。他的公司的股价迅速地从20跌到5元,所以我们不接受那个提议是一件好事,不过这并不能归咎于对大卫王的盲目崇拜。

习于抄袭的商业记者及大公司都是倚赖收超额报酬的管理顾问,由顾问来帮忙思考甚至咀嚼他们的食物等等。在那个世界中的传统智慧,似乎把减少程式员的花费视作最重要的事。

在某些其它的工业中,便宜比好更重要。WalMart藉由销售便宜的产品,而非好产品而变成地球上最大的公司。如果WalMart试着销售高品质的货物,他们的花费会上升,而且他们整个便宜的优势会丧失。例如如果他们试着销售一个能禁得起严格测试(如在洗衣机一直洗)的短管袜,他们必须使用各种昂贵的元件(比如棉花),于是袜子的单价就会上升。

那么,为何软体产业内没有低成本供应商(就是尽可能雇用最廉价程式员的人)的空间呢?(提醒我去询问Quark整个「全部解雇再雇用低薪新人」的计划是如何进行的。)

这里是原因:复制软体是免费的。那代表程式员的花费是分散在你销售的所有软体备份之上。就软体而言,可以增进品质而不会增加每个售出单位的成本。

基本上,设计的附加价值高于它所增加的成本。

或者,概略地说,如果你试着从程式员上省钱,就会做出蹩脚的软体,而且根本省不到那么多的钱。

同样的原理可套用到娱乐产业。虽然布莱德彼特要求很高的薪水,请他来拍你最新的巨片还是值得的。因为薪水可以由仅因布莱德是这么红而去看电影的数百万人分摊。

或者,换个方式套用它。虽然安洁丽娜裘莉要求很高的薪水,请她来拍你最新的巨片还是值得的。因为薪水可以由仅因安洁丽娜是这么红而去看电影的数百万人分摊。

不过我尚未证明任何事。「最佳的程式设计师」是什么意思?不同的程式员所生产的软体品质真的有如此大的变异吗?

让我们以一般古老的生产力来开始吧。要量测程式员的生产力相当困难;几乎任何你想得到的尺度(除错的原始码行数,功能点,命令列引数的数目)对[The_Joel_on_Software_Translation_Project:测量|游戏本身都毫无意义],而且很难在大型专案上取得具体的资料,因为很少会让二个程式设计师去做同一件事。

我所倚赖的资料来自耶鲁大学教授史丹利.艾圣斯特( Stanley Eisenstat)。每年他会教授一门需要密集编程的课程CS 323,编写程式占了课堂作业的很大部份。共约五次的编程作业每个费时约二周。作业对于大学课程而言是非常严格的:实作Unix命令列shell,实作ZLW档的压缩器,等……。

由于有太多学生问这门课有多少功课要做,以致艾圣斯特教授开始要求学生回报花在每个作业上的时间。他持续了好几年谨慎地收集这些资料。

我花了一些时间在玩味这些资料:它是我所知道唯一让数十名学生在相同时间用相同技术做相同作业的资料集。这在进行实验进行时相当难以控制。

我对这资料做的第一件事是计算十二个作业中的每一个所用时数的平均值、最小值、极大值和标准差。结果如下:

 Project| Avg Hrs| Min Hrs| Max Hrs| StDev Hrs   

—|—|—|—|—
CMDLINE99 | 14.84 | 4.67 | 29.25 | 5.82
COMPRESS00 | 33.83 | 11.58 | 77.00 | 14.51
COMPRESS01 | 25.78 | 10.00 | 48.00 | 9.96
COMPRESS99 | 27.47 | 6.67 | 69.50 | 13.62
LEXHIST01 | 17.39 | 5.50 | 39.25 | 7.39
MAKE01 | 22.03 | 8.25 | 51.50 | 8.91
MAKE99 | 22.12 | 6.77 | 52.75 | 10.72
SHELL00 | 22.98 | 10.00 | 38.68 | 7.17
SHELL01 | 17.95 | 6.00 | 45.00 | 7.66
SHELL99 | 20.38 | 4.50 | 41.77 | 7.03
TAR00 | 12.39 | 4.00 | 69.00 | 10.57
TEX00 | 21.22 | 6.00 | 75.00 | 12.11
ALL PROJECTS | 21.44 | 4.00 | 77.00 | 11.16

你在此注意到最明显的事是变异很大。最快的学生比平均的学生快三倍或四倍,而比最慢的学生快上十倍。标准差非常之大。于是我想,嗯,或许这些学生正在乱写作业。我不想含括花费四小时在作业上但却无法产生一个可运作程式的学生。所以我限缩资料,只含括在第一个四分位(quartile)分数等级…也就是程式码品质在前百分之二十五的学生。我应该提及在艾圣斯特教授课当中的分数等级是完全客观的:他们被以程式码通过多少自动测试的公式化计算,只此而已。编程风格不佳或迟交并没有扣分。

无论如何,这里是第一个四分位级的结果:

 Project| Avg Hrs| Min Hrs| Max Hrs| StdDev| Hrs   

—|—|—|—|—|—
CMDLINE99 | 13.89 | 8.68 | 29.25 | 6.55
COMPRESS00 | 37.40 | 23.25 | 77.00 | 16.14
COMPRESS01 | 23.76 | 15.00 | 48.00 | 11.14
COMPRESS99 | 20.95 | 6.67 | 39.17 | 9.70
LEXHIST01 | 14.32 | 7.75 | 22.00 | 4.39
MAKE01 | 22.02 | 14.50 | 36.00 | 6.87
MAKE99 | 22.54 | 8.00 | 50.75 | 14.80
SHELL00 | 23.13 | 18.00 | 30.50 | 4.27
SHELL01 | 16.20 | 6.00 | 34.00 | 8.67
SHELL99 | 20.98 | 13.15 | 32.00 | 5.77
TAR00 | 11.96 | 6.35 | 18.00 | 4.09
TEX00 | 16.58 | 6.92 | 30.50 | 7.32
ALL PROJECTS | 20.49 | 6.00 | 77.00 | 10.93

没有什么差别!第一四分位的标准差几乎完全相同。事实上当你仔细地观察资料,会发现时间与分数间显然并无可察觉的相关性。下面是其中一个作业的典型散布图…我选择于2001年时指派给学生的作业COMPRESS01,也就是Ziv- Lempel-Welch 压缩的实作。选择的原因是因为它的标准差接近于整体的标准差。

HrsVsScore.png

时间对分数的散布图

在此没什么可以看的,不过那就是重点。工作品质和所花费的时间是没关系的。

我针对此点询问艾圣斯特教授,而他指出另一件事:因为作业要在固定时间内交出(通常是半夜),而迟交的惩罚有很大的影响,很多学生在专案完成前便停了。换句话说,部份由于公布作业和交作业期限间的时数是有限的,所以学生花在这些作业的最长时间有其下限。如果学生有无限的时间来做专案(比较符合工作的世界),散布值可能只会更高。

This data is not completely scientific. There’s probably some cheating. Some students may overreport the time spent on assignments in hopes of gaining some sympathy and getting easier assignments the next time. (Good luck! The assignments in CS 323 are the same today as they were when I took the class in the 1980s.) Other students may underreport because they lost track of time. Still, I don’t think it’s a stretch to believe this data shows 5:1 or 10:1 productivity differences between programmers.

此资料并不完全是科学的。其中可能有点作弊的成分。某些学生可能会多报写作业的时间以获取同情,好在下次获取较简单的作业(祝好运!今天CS323的作业和我在1980年代修课时完全相同。)其它的学生可能低报了,因为他们忘了追踪时间。尽管如此,相信这些资料显示出程式员间出现5:1或10:1生产力差距,在我看来并不算是种曲解。

不过,等等,还有更多!

如果程式员间的唯一差异是生产力,你可能想说可以用五个平庸的程式员来取代一个真正的好程式员。这显然是行不通的。原因是Brooks的法则:「对一个延迟的软体专案增加人力会使它更迟。」一个好的程式员在单一工作上工作并没有协调或沟通的花费。五个程式员在同一件工作上工作必须协调和沟通。那会花费很多的时间。尽可能使用最小的团队有额外的效益;人月真的是神话迷思啊

不过,等等,仍还有更多!

用很多平庸的程式设计师而非一群好的程式设计师,真正的问题在于无论他们工作多久,永远没法子像伟大程式设计师做得那么好。

五个Antonio Salieris(译:电影阿玛迪斯中害死莫扎特的宫廷乐师)不能谱出莫札特的安魂曲(Mozart’s Requiem)。甚或,即使他们工作一百年也一样。

五个Jim Davis(无聊卡通猫的创造者,其中两成的笑话是有关于周一有多烂,剩下的是关于猫有喜欢义大利千层面(lasagna)和那些结尾警语!五个Jim Davis用尽余生来写喜剧,也永远写不出Seinfeld的纳粹汤厨桥段。

The Creative Zen team could spend years refining their ugly iPod knockoffs and never produce as beautiful, satisfying, and elegant a player as the Apple iPod. And they’re not going to make a dent in Apple’s market share because the magical design talent is just not there. They don’t have it.

创巨的Zen团队即使花费数年美化他们丑陋的iPod仿冒机,也永远做不出如Apple iPod般漂亮、令人满意而典雅的播放器。而他们也无法抢到Apple的市场占有率,因为神奇的设计天才并不在那里。他们没有这种人。

平庸者就是永远达不到天才随时能唱出的高音。能唱出莫札特午夜皇后(The Queen of the Night)中f6高音的女主唱少得像是快绝迹,而没有著名的f6就无法演出午夜皇后。

软体真的与艺术般的高音有关吗?「或许某方面是吧」你说:「不过我是在医药废弃业写应收帐款的使用者介面。」[说得不错](http://local.joelonsoftware.com/mediawiki/index.php /The_Joel_on_Software_Translation_Project:%E4%BA%94%E5%80%8B%E4%B8%96%E7%95%8C)。不过这里讲的是软体公司和以收缩胶膜包装的软体,而这种公司的成败直接取决于程式码的品质。

而且我们在过去的几年间,已经看过很多伟大软体的例子,那些真正的高音:平庸的软体开发者就是做不出来的东西。

回到2003年,Nullsoft推出了新版本的Winamp,在他们的网站有以下的注意事项:

  • 华丽的新外观!
  • 时髦的新特色!
  • 大部份的东西真的能动!

最后一项「大部份的东西真的能动!」让每个人笑了,而且他们很快乐并且对Winamp感到很兴奋,然后他们亲身使用它并告诉朋友,他们认为Winamp真是棒,全都是因为他们真的在他们的网站上写着「大部份的东西真的能动!」这不是太酷了吗?

如果你把一堆多余的程式员丢去Windows Media Player团队,他们会达到那种高水准吗?一千年也不会。因为在那个团队加入愈多人,就愈可能出现一个脾气真正坏的人,认为在你的网站上写「大部份的东西真的能动!」既不专业又不成熟。

更别提那个意见了:「Winamp 3:几乎和Winamp 2一样新!」

就是那种东西让我们爱上Winamp。

当美国线上时代华纳公司的猪头插手时,网站上这些有趣的东西就不见了。你可以想像他们就像阿玛迪斯里的Salieri一样愤怒、痛苦地啜泣着,试着打压所有可能吓到一位明尼苏达州的老妇人的创造性象征,而代价是可能会清除所有能让人们喜欢上这个产品的事物。

或者看一下iPod吧。你不能换电池。所以当电池坏了,真惨。买个新的iPod吧。事实上如果你将它送回工厂,Apple会换一颗电池,不过这得花$65.95。哦,真他妈贵。

为什么你不能更换电池呢?

我的理论是,因为Apple很重视他们美丽性感iPod上平滑无缝的完美表面,而那些在其它便宜烂货上所看到的恐怖电池盖,那些总是会断的电池门闩,那些塞满口袋棉线的缝隙和所有那些恶心东西,都会让它破坏无遗。iPod是我所见过消费电子产品中最无缝的。它很美。它让人感到美,就像平滑的河石。而一个电池门闩会让这整个河石般的效果荡然全无。

Apple made a decision based on style, in fact, iPod is full of decisions that are based on style. And style is not something that 100 programmers at Microsoft or 200 industrial designers at the inaptly-named Creative are going to be able to achieve, because they don’t have Jonathan Ive, and there aren’t a heck of a lot of Jonathan Ives floating around.

Apple基于格调做了一个决定,事实上,iPod充满着基于格调的决策。而格调并不是一百个微软的程式设师,或是名不符实的创巨(Creative)里二百个工业设计师所能达成的东西,因为他们没有Jonathan Ive,而外头能找到的Jonathan Ive并不多。

我很抱歉,我无法停止讨论iPod。那个漂亮的拇指滚轮及它小小的喀嚓声…….Apple花了额外的钱在iPod上装一个喇叭,好让拇指滚轮的喀嚓声听起来像是来自拇指滚轮。如果喀嚓声是由头戴式耳机来播放,他们就已经省下了好几分钱…几分钱!不过拇指滚轮让你感觉像是由你掌控。人们喜欢掌控的感觉。掌控的感觉让人们快乐。拇指滚轮平稳流畅地回应,并且对你的命令发出声音,这种事实会让你快乐。不像其它6,000种口袋型消费性电子废物,按下开关时开机要等很久,你必须等一分钟才知道是否有任何事发生。是你在掌控吗?谁知道?想想你拥有按开关马上就能用的行动电话是什么时候的事了?

风格。

快乐。

感情的吸引力。

这些是在软体产品和电影中,以及在消费性电子产品中造成大热门的原因。如果没有把这些东西做对,你或许可以解决问题,不过产品绝不会变成让公司里的每个人致富的头号产品,也不能让你们全都可以开着有风格的、快乐而且吸引人的车(像是法拉利Spider F-1),并且仍有足够的钱去在你自己的后院建造一个嬉皮士群居之会所(ashram)。

这不仅是「十倍多的生产力」的事。它是「一般生产力」的开发人员从未达到,但却能做出伟大软体的那种高水准。

令人难过的,这并不真的能套用于非产品性的软体开发。内部开发的软体很少会重要到需要雇用巨星。没人雇用桃莉巴顿(Dolly Parton)在婚礼上唱歌。这是为何令人满意的职业生涯(如果你是个软体开发者)大都在真正的软体公司里,而不要是某些银行里做IT工作。

现在的软体市场是某种赢家全拿(winner-take- all)的系统。制造MP3播放器的除了Apple外,没有别人赚钱。除了微软外,没有人由试算表或文字处理赚到钱。是的,我知道,他们做了反竞争的事才取得那种地位,不过那不并改变赢家全拿的事实。

成为第二名或是有个「够好了」的产品都是你无法承受的。它必须是引人注目地好,我的意思是好到让人们都注目它。从真正、真正、真正天才的软体开发者得到的赠品获得非凡卓越的唯一希望(译:意思是有天才不一定做得到,但是没有天才是万万不能)。以下就是整个计划:

最佳工作条件→ 最佳程式员→ 最佳软体→ 利润!

这些页面的内容代表个人的意见。

所有内容的版权© 1999-2006 by Joel Spolsky. 保留所有权利。