2002年12月,我加入一家濒临破产的公司。25岁,头衔只是软件工程师。公司在烧钱,下一款产品必须在1月上线——离我入职大约一个月。
2003年1月,Demo发布了。那是一款手机HTML浏览器,内置数据包压缩功能。它能渲染HTML,播放标签链接的MIDI文件,运行简单的背景动画。我用Java写的。服务器端是PHP。没人做服务端压缩,于是我也接了——还是用Java,通过localhost从PHP调用。结构很奇怪,但截止日期是真的。
我记得有点生气。但我记得更清楚的是,比生气多得多的快乐。我交付了东西,用了一个月。就这样,我开始独自设计东西。不是计划好的。只是:总得有人做,而其他人没动。
第一件不是计划的事
23年后回头看,有件事我当时没意识到:我没有责任。我是个有截止日期的初级工程师。如果Demo失败,公司会垮得更快——但失败不归我承担。这让交付变得容易。
那第一个月之后,我再也没遇到过真正硬的截止日期。至少在我负责的项目上没有。我只回答"尽快",然后尽力兑现。2005年我成了CTO。工作没变轻,责任来了。但我没想到的是:我代码的形状没变。
我继续独自写东西。继续独自扎进最深的部分。组织架构在我周围重组,但在最底层——当某件事必须真正跑起来时——我还是在那里,写着。
生产力和问责制不容易共存。我25岁学会的形状——因为没人做所以自己写——在头衔改变之后,反复出现。
一个我没意识到是形状的形状(2003-2005)
数据包压缩工具之后,我为手机建了一个音乐分发平台。那是运营商计费的时代。功能机。电梯和隧道里会断连。
运营商有一条计费规则,教会我一件事——我20年后才用语言表达。
规则是:用户设备确认下载完成前,不要计费。
流程是这样的:
• 用户点击"购买"
• 手机开始下载(用HTTP Range,因为连接会断)
• 服务器分块传输
• 设备完成后,发送隐藏完成信号
• 然后服务器计费
如果火车进隧道,用户不被收费。服务器持续保持工作,只要设备还在线。最终要么下载完成我们计费,要么没完成我们承担成本。
20年后,我会这样表述这条规则:没人知道工作何时完成。但当它完成时,我想准确报告。所以我让用户等待——作为交换,我尽可能重试,直到有结果。
