边开火边移动

作者:周思博(Joel Spolsky)
译:Paul May 梅普华
编辑:Ing Yong Chuan 吴勇撰
January 6, 2002
A part of Joel on Software, http://www.joelonsoftware.com

我总会有时候什么事都做不了。

我当然还是会去上班,不过却是到处闲逛,每10秒就收一次信,逛逛网站,甚至做些付信用卡帐单之类不用动脑的事。什么都做就是没法子进入状况回来写程式。

bored-tetris.gif

这种不事生产的毛病通常一发作就是一两天。不过在我职场生涯中也曾有过几个星期没有产出的情况。就像别人所说的一样,我没有进入状况。我定不下心来。我不知道自己在干啥。

每个人的情绪都会波动;有些人波动较少,而其他人会比较明显甚至完全失常。不过无生产力的时期似乎和忧郁情绪有关。

这让我想到,有些研究者声称人基本上_是无法_ 控制自己吃什么,因此节食绝对不可能持久,最后一定会回到自然的体重。或许对身为软体开发人员的我来说,同样无法控制自己的生产力,只能接受自己有时快有时慢,并且祈祷平均起来的生产力还能让自己不会失业。

bored-onion.gif

真让我受不了的是,从我做开发工作以来,平均每天只有两三个小时能有效率地写出程式。当我暑假在微软实习时,另一个实习生告诉我他每天只有12点到5点在做事。做五个小时(还要扣掉午餐时间)的事,而他的小组却很 崇拜 他,因为他的成果还是比一般人多很多。我也发现一样的情形。当我发现大家都非常努力工作,而每天只有两三个小时效率的我却还是组里产出最多的人,不禁令人有点内疚。这或许就是Peopleware和极限程式作业(XP,eXtreme Programming)坚持不加班而且每周只应工作40小时的原因吧,他们很确定这样并不会降低团队的效率。

不过一天「只有」两三小时有工作并不是问题,真正困扰我的是那些_什么都没做_ 的日子。

这件事我想了又想。我尝试回想我职场生涯中最有效率的时候。极可能是在微软把我放到一间漂亮豪华的新办公室,里头有着如画般的大片窗景(美丽的石头庭园,里面满是盛开的樱桃树)。那时候每件事都很顺利。在几个月内我马不停蹄地写出Excel Basic的详细规格,非常厚的一份文件,巨细糜遗地叙述一个庞大的物件模型和程式开发环境。过程中完全没有停顿。有一次不得不去波士顿参加MacWorld,我还是带着手提电脑坐在哈佛商学院的漂亮阳台上,继续写着视窗类别的文件。

当你进入状况后,要继续维持并不算太难。我的一天通常都是这样子的:(1) 上班(2) 看信看网页等等(3) 决定应该吃过午饭后再做事(4) 吃完午饭回来 (5) 看信看网页等等(6) 终于决心该开始干活(7) 看信看网页等等(8) 再度下定决心_真的_ 该开始做事(9) 把该死的编辑器叫出来然后 (10) 不断地写程式直到突然发现已经下午7点半了。

第8步和第9步之间似乎有点问题,因为我不是每次都能顺利跨越鸿沟。

bike-trip.jpg

对我来说,要开始本身就是_唯一_ 的难题。静者恒静。我脑袋里有些东西重得不得了,很难很难加速,不过一旦全速运转就不必费心维持。就像要骑车来一趟横跨美国的自助脚踏车旅行一样。当你骑上车要开始时,根本无法想像要花多少力气,不过一旦开始骑就发现实在是轻而易举。

或许这就是生产力的重点: 开始做吧 。或许配对程式作业所以有效,是因为把两个人排在一起作业,自然会强迫彼此开始。

ARMY-wee.JPG

当我还在以色列当伞兵时,有位路过的将军给我们讲了一小段关于策略的课。他告诉我们,在步兵作战时只有一种策略:边开火边移动。你要一边开火一边朝敌人挺进。开火让敌人抬不起头,不能向你开火。(这就是士兵喊「掩护我」的意思。也就是说「对敌人开火逼他低头,这样我冲过街时敌人就不能向我开火」这招的确有用。)移动让你攻占地盘并且更逼近敌人,这时候射击更容易打中目标。如果你不移动,敌人就能控制局势,这可不怎么好。另外如果你不开火,敌人就会对你开火把你钉在原地。

这件事我一直记得。我也注意到由空中缠斗到大规模的海军演习,几乎所有军事策略都是由边开火边移动的概念延出来的。我又花了15年才了解这也是在生活中成功的方法。每天你都得前进一点点。你的程式不好有错还是没人要,这全都没关系。只要你一直进行,持续的写程式并修正错误,时间就会站在你这边。当竞争者对你开火的时候要注意。他们可能只是想逼你忙着应付,让你不能继续前进。

想想看微软所推出资料存取策略的历史吧。ODBC,RDO,DAO,ADO,OLEDB,还有最新的ADO.NET - 全部都是新生的!难道这些技术都是非要不可的吗?还是一个年年都在重新发明资料存取的无能设计团队的杰作呢?(这很可能是真正的答案。) 不过最终的结果却刚好成为火力掩护。它让竞争者别无选择,只能用尽所有时间进行移植和升级,没有时间去写新功能。仔细看看软体业界。成功的公司对大公司的依赖最少,不需要花所有工夫追随并重新实作,然后去修那些只出现在Windows XP上的问题。而跌跌撞撞的公司都花太多时间去揣测微软未来的方向。大家都担心.NET的出现,认为有绝对必要所以决定针对.NET重写整个架构。事实上微软是在对你开火,而且只是让他们前进并阻碍你们的掩护火力,因为这就是游戏规则,朋友。你想支援Hailstorm吗?SOAP呢?RDF怎么样? 你支援这些东西是因为客户需要?还是因为有人对你开火而觉得应该有所反应呢?大公司的业务团队很了解火力掩护这一套。他们会去跟客户说「没错,你不一定要买我们的东西。要买就要买最好的。不过记得你买的产品一定要支援(XML /SOAP / CDE / J2EE),否则你就会被绑住了。」然后当小公司试图接触这个客户时,这个听话的技术总监就会像鹦鹉一样说「你们支援J2EE吗?」 尽管J2EE不会真正带来收入,他们还是得耗尽所有的时间加上J2EE,结果完全没机会让产品产生区别。这是个勾选项目,会去做只是因为需要有个项目打勾表示你也有,不过没有人会用也没有人需要。而这就是掩护火力。

对我们这种小公司来说,边开火边移动有两个意义。你必须争取时间,另外每天都得要前进。你迟早会赢的。我昨天整天只是把FogBUGZ的配色改善了一点点。这并不要紧。东西会愈来愈好。我们的软体每天每天都会变得更好,而且客户会愈来愈多,这就够了。在我们变成Oracle这种规模的公司前都不用管什么伟大的策略。我们只要每天早上来公司,想办法要自己打开编辑器就好了。

editing.gif

这些网页的内容为表达个人意见。
All contents Copyright 1999-2002 by Joel Spolsky。All Rights Reserved.