作者:Joel Spolsky

译者:Puncsky

总有些时候,我就是什么事都干不了。

当然了,我还是会去上班,走进办公室,磨磨洋工,每隔几十秒就查查电邮,上上网,甚至还做点儿不用动脑子的事情,比如付运通信用卡账单。但唯独没法回到写代码的状态。

这种毫无产出的异况通常会持续一两天,但在我作为软件开发者的职业生涯中,曾有数周持续如此,什么也干不了。正如他人所说,我百无聊赖、状态不佳、诸事不顺。

Tetris
诸事不顺的俄罗斯方块君

人人都会有情绪波动,有人来的平和、有人来得猛烈,甚至很崩裂。没有产出的状态似乎确实和低落的情绪有关。

这让我想到了,有研究者称,人们基本上是无法控制自己饮食的,所以任何节食的企图都注定夭折,体重也总是会波动回到正常水平。也许作为软件开发者,我真的是无法控制自己的产出,所以我不得不任其波动,只求快慢相抵,平均下来代码的行数足够让我有口饭吃。

Go read The Onion for a while.
来读读洋葱报吧

让人兴奋的是,自打第一份工作起,我就意识到,作为开发者,我平均下来每天只有两到三个小时的高效编程时间。当年我在微软暑期实习的时候,曾有个实习生告诉我,他实际上每天12点到、5点走。上班时间只有五小时,还包括吃午饭,但他的团队就是爱死他了,因为他仍能够顺利完成很多任务,远高出平均水平。我发现我也是这个状态,但难免稍感愧疚:其他人都好像是在忙忙碌碌的,我只不过每天花了两三个小时有效工作,却仍够久居团队中最有效率的成员之列。也许这正好解释了,为什么人件理论和极限编程一再坚持,要消灭加班,限定每周工作40小时,因为他们很清楚,这么做绝不会削减团队的产出。

一天“只”干两小时的活不是问题,什么都干不了才是问题。

我一度反复斟酌过这类问题。我想起了职业生涯产出最丰硕的时候,那时我刚搬到微软一间光鲜奢华的新办公室。透过大大的落地窗,可以俯瞰一隅石庭,遍布樱桃树一树一树的花开。万物勃发。几个月来,我马不停蹄地在打造Excel Basic的详细设计规格书——一大摞纸,涉及了庞杂的对象模型及编程环境的方方面面。我还真就没罢手过。甚至连参加麦金塔世界大会(MacWord),不得不去波士顿的时候,我也带着笔记本电脑,坐在哈佛商学院风景怡人的露台上,为 Window 类写文档。

一旦你进入状态,要顺势连轴转并不困难。通常我的一天是这样子的:(1)上班。 (2)查邮件、上网等。 (3)决定开始干活前还是先吃个午饭吧。 (4)午饭归来。 (5)查邮件、上网等。 (6)终于决定得开始干活了。 (7)查邮件、上网等。 (8)决定真的得开始干活了 (9)打开该死的编辑器,然后 (10)不停地写代码,无视时间流逝,直到已然晚上七点半。

我并非总能逾越步骤8和步骤9之间那条鸿沟,那里似乎混进了奇怪的bug。对我来说,开始干活正是唯一困难之处。静止的物体在不受外力的作用时会保持静止。我的脑海里有个笨重的东西,极其难以加速,但是一旦全速运转,保持状态则毫不费力。正如单车越野自驾游时,全副武装的单车——刚开始骑,很难想象得费多大劲儿才能蹬转它,但是一旦骑起来,轻轻松松地就感觉不到这些装备的存在了。

bike trip
单车之旅

也许这就是高产出的关键:马上开工。也许结对编程之所以成功,是因为你得安排某段时间编程,和另一个哥们一起,互相敦促对方开始。

Joel in the Army
阿兵哥Joel

我在以色列当伞兵时,曾有一位将军造访,给我们讲授战术战略,他说,步兵战术其实只有一种:开火中前进。向敌人开火的同时接近敌人,开火迫使对方低下头来,而无法向你开火。(这也是士兵们大喊“掩护我”的原因,这话的意思是“这边,在我冲过街道的时候,向我们的敌人开火,迫使其躲入掩体,而无法向我射击。”就是这样。)你冲锋陷阵,越接近敌人,就越可能击中目标。如果你不前进,换做对方争得先手,你将大事不妙;如果你不开火,换做对方向你开火,你将寸步难行。

我对此记忆深刻。我注意到,几乎所有的军事策略,上至空军空战、下至海军演习,都基于开火中前进的理论。又过了十五年,我才意识到,开火中前进也是人生中做事的法门。你应当每天前进一小步。代码弱爆了、有bug、没人要,没有关系的。只要你一直前进,只要你一直写代码修bug,滴水也能穿石。当你的竞争对手向你开火的时候,要小心了,他们的目的,是不是仅仅是为了让你疲于应付,止步不前?

想想微软的历任数据接入方案:ODBC、RDO、DAO、ADO、OLEDB,到现在的ADO.NET,反复翻新,技术上有必要吗?还是因为某个设计组实在太渣太坑爹,不得不他娘的每过一年就重造一遍数据接入技术?(事实上,可能还当真如此。)但其终极目的,说白了仅仅是一道火力掩护,竞争对手别无他法,只能疲于奔命地移植代码,耗掉他们本可以用于开发新功能的宝贵时间。仔细观察软件业的天下大势,那些做得好的公司对大公司依赖最少,自然不必把自己一个个软件开发周期,都耗费在跟风、重写、修那些仅仅在 Windows XP上出现的bug上面。那些垮掉的公司则花费了太多时间占卜微软未来的方向。有些人见了.NET就发怵,要按.NET来重写自己的整个架构,以为自己别无选择。看清楚了,哥们儿!微软这是在向你开火呢,这仅仅是道火力掩护,以便他们大步向前,而却让你止步不前,因为这,就是游戏规则。想要支持Hailstorm? SOAP? RDF? 你支持它的原因,是你的客户当真需要它呢,还是说谁在向你开火,你不得不做出反应呢?大公司的销售部门深谙火力掩护的道理,他们见到客户就说,“好的,您不必从我这买。从最好的供应商那买。我们只是想提醒您,下单前最好确认一下产品对(XML / SOAP / CDE / J2EE)的支持,否则您将会被他们的技术套牢。”然后,当一些小公司向这些客户推销的时候,那些听话的CTO们就会喋喋不休“你们支持J2EE吗?”于是,小公司们回去埋头用J2EE构建产品,尽管这并不能够真的促进销量,连他们出类拔萃的机会也搭进去了。其实,这不过是一个复选框(checkbox)功能——你做它仅仅是因为复选框告诉你你要做,但没人真正用它、或需要它。这,就是火力掩护。

开火中前进,对像我们这样的小公司而言,意味着两点:第一,你要争取足够的时间;第二,你要每天向步步向前。如此这般,胜利女神就会迟早站在你身边。昨天,我做成的事情仅仅是把 FogBUGZ 的配色方案改好看了一点点,可是这没有关系,只要软件总是在向好的方向发展就行。每一天,我们的软件越来越好,每一天,我们的客户越来越多,这才是真正重要的。除非到了Oracle这种公司的规模,我们甚至都没必要有什么宏韬伟略、深谋远虑。我们需要做的仅仅是,每早来到公司,拼死拼活,打开编辑器。