现在是下午五点。我已经在这段代码上工作了好几个小时,一次一行地琢磨着实现方案。这个过程真的非常痛苦。有些时候,代码会从我的大脑很自然地滑落到我的指尖,可是今天不是这样。
我的任务是为这个类增加一个新功能。我认为这简直太『容易』了。『这个类就是我写的,因此说,想出一个扩展它的办法应该毫无难度。』 就这样,在我享用完美味的午餐之后,便坐了下来开始着手编程。
刚开始一切进展顺利 - 对于新功能如何融入这个类,我已有了一个大致的思路。然而,随着实现工作的越加具体和深入,我发觉自己原本模糊的思路越加不完善。一些函数无法有效获取数据。我编写了一个左右边界测试,使得这个类变得非常脆弱且易于引发错误。当我在此基础之上添加新的功能时,单元测试总是失败。
在接下来的几个小时里,我就像是掉进了一个深不可测的兔子洞中,甚至到最后,我几乎连自己编写的代码都无法正确辨识了。我在本地代码与原有代码之间来回切换,试图找出它们之间的差异以及我究竟修改了哪些地方。在我的大脑中,关于代码应该如何运行或者我希望代码如何运行的基本心理模型早已不复存在。事情似乎已经降级为我与我的计算机之间的战争。『编译呀,该死的,赶快编译!』
现在已是下午五点 - 仅剩下一个小时就要回家了。我今天的工作也只剩下这个有待完成的功能。『我什么思路都没有,』 我这样想,『我只有一个小时时间用来理清这一堆混乱不堪的代码。』
我垂头丧气地从我的桌子旁边站了起来,头低低地垂着,朝着卫生间方向走去。我坐在马桶上,深深地吸了一口气 - 忽然间,我的灵感来啦!
就在一瞬间,我把所有事情全都搞清楚了。代码飞快地掠过我的大脑,我可以看到这个类、它的全部功能及其所有用例。我已经清楚地知道新功能的代码应该放在何处。对我来说,所有这一切是那样的清晰!
完事后(记着返回工作之前,一定要洗手!),我迅速回到自己的座位上开始敲击代码。我的手指已经无法跟上代码出现在我大脑中的速度。当我的手指不停地敲击时,键盘似乎出现了松动。我和我的计算机已经不再是敌人 - 我们是亲密的伙伴,我们正围绕着一个共同的目标一起工作。
三十分钟之后,代码成功地完成了编译。单元测试全部顺利通过。我把这项新功能的需求特性逐一运行了一遍,每一项都符合要求。『我完成了这个不可能完成的任务,我已经搞定了!』
当我从编程高潮回归正常状态时,我有了一个唯一必然的结论: 我经历过的最高效的编程体验不是发生在键盘前,而是在马桶上 。
现在我不打算说,马桶真有架构代码的神奇魔力(尽管我认为这真是一项伟大发明)。可是,我想说的是,如果你离开你的电脑,并且从一个更高层次的角度开始思考,绝大多数看似琐碎的编程任务将会变得十倍以上的容易。无论是去一趟卫生间,在公园里散一会儿步,或者只是在你办公室的厨房里坐一坐,几乎任何一项远离你电脑的活动,都会使你重新回归清晰的头脑,让你再一次看清一片森林。
许多程序员总是对不愿意离开他们的桌子。他们认为除 IDE 之外的任何时间花费都是一种浪费行为,或者担心招致他人的轻视。『他为什么不坐在自己的桌前工作呢?难道他想被降级,』 经理们经常这样说。
我认为,这一逻辑不仅完全违背常理,而且最终效果往往事与愿违。给程序员支付薪水不是为了让他们坐在一张桌子旁边,眼睛不停地盯着屏幕,或者不停地编写代码。程序员的真正目标就是为最终用户创建功能,而这些活动只是通向这一目标的步骤而已。如果离开你的桌子,可以让你的功能创建工作变得更加快速高效,那么,这就是我们应该做的事情。
总之,正当你编程的时候,不要别忘了去趟卫生间。
作者: Brian.S.Lam ,视频游戏爱好者、软件工程师 & 超低产博客作者。
原文: Programming on the Toilet
感谢:Qingniu 帮助审阅并完成校对。