十年软件速成手册
Good Software Takes Ten Years. Get Used To it.
By Joel Spolsky
Saturday, July 21, 2001
看一下这张小图:
[来源: Iris Associates]
这张图显示的是Lotus Notes从1989年诞生起一直到2000年每年的安装数量。实际上,Notes 1.0发布时已经开发了有5年时间了。不难发现,人们是过了n长一段时间后才觉得Notes是个好东东,才开始掏腰包的。从1984年写下第一行代码算起,一直到图里高高上扬的那部分曲线,11年过去了。这段时间里,Ray Ozzie[1]和他的伙计们可没在St Barts[2]里喝pina coladas[3],他们一直忙着写代码呐。
我和你唠叨这事是想告诉你对于严肃的软件来说这不是什么新鲜事。Oracle的RDBMS[4]现在都22年了。Windows NT是12年前开始开发的。Microsft Word当然是最老的了;我记得上高中时见过DOS上的Word 1.0(我是个老家伙了吧?那是1983年。)
有经验的软件人对此已经不觉得有啥大惊小怪的了。你写了产品的第一版,有那么几个用户,他们虽然喜欢,但是还有那么多的功能尚未加进来,跑得又慢。不管咋样,一年过后,你得把2.0做出来。每个人都对2.0, 3.0, 4.0里该有些什么功能争论不休,因为要做的重要的事情还真不少。我记得写Excel的那些日子里我们有那么多必须的功能: Pivot表[5],3-D表格,VBA[6],数据访问。当新版最终发布时,人们争先恐后的购买。还记得Windows 3.1吗?它当然是需要支持长文件名的,它也需要内存保护,需要即插即用,还得有几百万个与我们日常使用息息相关的重要功能 - 但是没有时间去实现了,于是这些功能不得不留到Windows 95。
但是这只是头十年。再往后,没有人能再想出一个真正需要的新功能了。你还有什么需要是Excel 2000或者Window 2000满足不了的吗?对于Office组里的我的那些朋友们我满怀尊敬,不过我还是忍不住要说:大概从1995年起, Office就没有一个新增的功能是有用的。那以后有很多所谓的“功能”是加上了,比如骂声一片的Office助手[7]和文件自动改名,这些功能烦的人们够呛,现在O'Reilly靠出版如何关掉这些功能的书就能赚得盆满钵满。
是啊,好软件得花很长时间去写。但是写完了就是写完了。哦,当然,你可以每一两年攒出一个新版本来,琢磨着再捞点升级的钱。但最终人们会问:“功能用的好好的,修修补补个啥劲?”

要是没有领会这个十年法则,就会在生意上犯不少要命的错误。
错误一:快速膨胀。这个Internet泡沫时代的错误已经被仔仔细细的摧残过了,我就不再落井下石了。但是这里有一个重要的发现: 这些正试图创造软件的泡泡公司们没有足够时间打磨他们的软件。我喜欢举的例子是desktop.com - 他们的东西大有前途 - 如果能坚持做上十年的话。但是,他们满脑子想的都是“做好卖掉,赚它一票”,人浮于事又挥霍无度,每十分钟就想再套点风险投资,十年的软件可经不起这么折腾。他们发布的1.0版,就像所有的新生事物一样,真的不是一般的烂,没人能想象这东西能用起来。也许,descktop.com 8.0版会酷毙了的, 不过我们没有机会知晓了。
错误二:吹破牛皮。发布1.0版产品的时候,你一定要低调。让那些早期的用户去发现它。如果你过分大张旗鼓的话,人们看到你真正做的东西,他们会觉得你的产品平淡无奇。Desktop.com是一个例子,Marimba和Groove也是:他们头一天就吹啊吹的,结果人们停下来搂一眼看看有啥热闹可凑,但是正如所有的1.0产品一样,味同嚼蜡。现在可能有100万个人从1996年以后就再也没有看过Marimba,他们就是觉得那烂玩意儿就是个能下载Java小程序的列表框,随便谁四个月一通攒巴都弄出来。
1.0保持低调意味着你得靠着少量的销售额来维持生计。也就是你得紧巴巴的过日子,也就是说你雇不起几个员工 - 这个在软件开发早期可真的是个好点子。因为如果一开始,你只能养活起一个程序员的话,你的软件架构就会相当的一致,相当的高明。不会像由几百个程序员脑子里冒出来的几十个有冲突的想法堆成的一大坨代码, 那得推翻了从头再写(Netscape就是这么做的,来源:Netscape推翻重写决策的辩护者)。
错误三:相信互联网时间。大概在1996年,纽约时报首先注意到了Netscape的浏览器每六个月左右就发布一次,比人们习惯了的像微软这类公司的2年升级周期要快很多。这引起了对于“互联网时间”的迷信 - 在这里“生意跑得蹭噌快”。听起来真好,不过还是醒醒吧。软件并没有比以前创建的更快,只是发布的更频繁罢了。在一个新软件产品的早期,要增加的东西有很多 - 即使你每六个月发布一次也能每次都给用户带来一些很棒的功能。你可以这么做。但是你写代码的速度并不比以前快。(这里我得表扬一下微软得IE浏览器组,从IE3.0到4.0他们的开发速度估计比业界标准快10倍左右。当然这和互联网时间没啥关系,起作用的原因是他们是一支久经沙场的梦幻队伍,在微软15年的商业软件开发经验是他们的制胜法宝。)
错误四:软件彻底完成后凭升级包再也赚不到钱了。一点行业黑幕:早些年(80年代末),个人电脑行业增长的很快,几乎所有的软件都是卖给新用户的。通常微软要等到新用户数量不再增长,大量已有用户都买的是升级包的时候, 这才松口 - 把他们原来要价500美元的升级包降价为30美元。这么一来:大部分卖出去的升级包通常是完整版价格的50%~60%。不过麻烦又来了,你敲破脑袋也憋不出哪怕是一个新功能了,于是你把Office助手加进来,然后又把它踢出去,并且两次都收钱 - 用户们就不太买你的账了。这时候你就琢磨着当初要是只卖给他们一年的许可证多好啊,然后把软件做上续订功能,然后来年即使你一点功能都没增加也能光明正大的从他们口袋里掏钱了。这可是个聪明帐:如果你的升级包卖100美元,华尔街就认为它值100美元。但是你要是一年的许可证只卖30美元,然后你说未来十年每年都有持续的30美元盈利,华尔街的精明的会计师们闷头算啊, 这可就是200美元啊。一不小心,恭喜恭喜, 股价翻倍了。(顺便提一下,SAS正是这样收费的。他们每年大约有97%的用户续订。)
像微软这样升级软件带来的问题是,用户不买帐。微软从90年代早期就开始推销这种基于订阅的软件销售方式,但是每次都是撞了大大的一鼻子灰。“购买就是拥有,不想要新功能就不升级” - 人们一旦有了这个想法,这对那些想靠升级软件挣钱的公司情况可就不妙了。
错误五:打哪指哪。这让我想起了Mozilla,三年了,这个该死的软件还没露面,我一年前就嘲笑过他们了。他们的网站上总有一张过时的图表说他们计划2001年第四季度要发布。由于他们的进度计划一点都不靠谱,我不知道他们是怎么凭空得到这个发布时间的。哦,人家这可是互联网时间里软件开发的状况。
我有点离题了?是的,软件就是得花10年写就;也没离题 - 你要是十年里什么都不发布,你早就挂了。在你拿着遥遥无期的十年后的盈利开始算这些年的帐之前,你手里一个子儿都没有。更为不妙的是, 在那些攥着钱的分析师眼里任何产品过了五年就没啥赚头了,所以比起你的事业,他们更愿意投资一亿美刀的毛绒兔宝宝。
无论如何,“10年磨一剑,做出好软件”是假定至少8年的时间里,你都能从用户那里得到高质量的反馈,你还要抄袭很多竞争对手的创新之处,你得吸收手底下那帮家伙的好点子 - 他们可是认为1.0版有点前途才过来为你工作的。但是一开始别在超级碗[8]上大做广告,因为软件还没好到那个地步 - 不管你有多聪明。
错误六:升级过于频繁(又叫Corel[9]综合症)。一开始,当你增加新功能时还没有太多激动地用户,你就可以每6个月发布一次新版,人们会满心欢喜。这样升级五六次后,你就得慢下来,否则你的客户们就会停止升级了。他们不会跟着升级是因为: 1)怕麻烦; 2)不想花那冤枉钱。一旦他们跳过了一次升级,他们就开始打小算盘了,“我说,不要你那些最新最酷的功能好像天也没塌下来”。我自己用Corel PhotoPaint5.0都5年了。我知道,这软件到处都是算错边界(off-by-one)的bug,但是我知道所有的这些bug - 我每次都把选中的那部分图片向右移一个像素来补偿一下, 这样就可以消除这个bug了。

做一个10年计划。你一定要能生存10年,因为一年能卖10亿美元的软件都得花那么长的时间去写。别在第一版拖延太久,第一版就想大卖? 这样的美梦可以做, 但不要超过一分钟。
佳软若醇,历久弥香。
Good software, like wine, takes time.
-----
译注:
[1]Ray Ozzie: Notes的作者,现任微软软件总架构师。
[2]St Barts: 全称St. Barthelemy. 法属殖民地,是加勒比海上的一个小岛, 占地8平方英里. 风景优美.

[3]pina coladas: 椰林飘香, 一种鸡尾酒.
[4]RDBMS: 关系数据库管理系统。
[5]Pivot Table: 是一种用于综合报表内容的工具(en.wikipedia.org/wiki/Pivot_table)。
[6]VBA: Visual Basic for Applicatoin. Office里的脚本语言. Joel在微软当程序经理时编写了该语言的功能规范.
[7]paperclip: Office助手. 这个助手功能似乎很烦人。O'Reilly的《Window Vista Annoyances》里会教你如何关掉。
[8]Super Bowl: 超级碗, 美国职业橄榄球的最高赛事. 插播广告的费用很高.
[9]Corel: 加拿大Corel软件公司, 出品的软件有CorelDraw等。
[10]和SK讨论明确了一些段落; Carrie对一多半句子提出了修改意见, 在此感谢.











十年软件速成手册
翻译:

ppip 探花 | Blog
好文章,超过10年的软件呢?会怎么样?基本上就不动了?
不过似乎是这样的:)
04/17/2008
al_lea 进士
市场已经饱和,升级也没有空间,软件就只剩下一个相对平坦的维护期了;当然,软件也会退休(retire),比如很多游戏都随着平台的消失而消失了。
04/18/2008
linuxcity 童生 | Blog
好文章,翻译的很地道!
04/23/2008
魔法牙刷 童生
做一个10年计划。你一定要能生存10年,因为一年能卖10亿美元的软件都得花那么长的时间去写。别在第一版拖延太久,第一版就想大卖? 这样的美梦可以做, 但不要超过一分钟。
说的非常好,现在的互联网是那么多浮躁。看着youtube,facebook你也着急了。别忘了,他们现在还都在亏损。
04/23/2008
linuxcity 童生 | Blog
在中国做技术很惨,起的比鸡早挣得比什么少什么的,在国外就算你靠打工支持自己的一个项目也是可能的,在国内是不好熬的。可能这也是原因之一吧
04/23/2008
Bill 状元 | Blog
10年,一辈子做一个软件?
04/23/2008
al_lea 进士
Joel同学的FogBugz就是从2000年左右开始做,也8年了 - 持续盈利。从6.0开始就成了很有野心的东西了。
04/24/2008