有一次看到来自Instagram用户findheart的话:
程序员是一个懂得享受生活的群体。每几个月或者几周,他们就会庆祝一个叫“Deadline Eve”的节日。在这一天晚上准备大量的食品饮料,通宵达旦地工作,并互相致以“下个milestone绝逼不再拖延”的美好祝愿。
我从这个笑中含泪的小段子看到了程序员的一个特点:乐观。
是的,你没看错,乐观,就是乐观。
程序员是我见过的最乐观的一群人,这也是我作为一个程序员回顾自己的开发生涯时发现的一个秘密。
要知道,程序员的生活充满未知:未知的项目,未知的语言,未知的框架,未知的工具,未知的进度,未知的天坑,未知的Bug,未知的交付日期,未知的绩效评估,未知的KPI……
So,在这种茫然四顾一切皆不可知的环境中生活,你要是不乐观,你绝对扛不住,你根本不可能见到明天的太阳。因为,未知会产生恐惧,这是人之天性,恐惧堆积多了人就会崩溃。而伟大的程序员,坚韧的程序员,不可思议的程序员,拥有超强耐受力的程序员,倍受蹂躏仍踯躅前行的程序员,不但奇迹般地在这个非人的环境里存活了下来,还每天乐乐呵呵屁颠屁颠的,这不是乐观是什么?还能有哪个群体如此乐观吗?
看,项目估算就这么简单
当程序员在白色的电脑屏幕上写下“printf(“Hello World!”)”时,他确信,只要按下CTRL+R或者点击运行按钮,黑黑的命令行窗口就会对他们说“Hello World!”。
是的,就是这个样子。当你写下“Hello World”这句骇人听闻的咒语,电脑绝不会用“Goodbye World……”这句更震撼人心的话来回应你。
我们程序员面对的世界是0、1世界,简单而直接。我们在软件开发的世界里徜徉得越久,就越容易受到这种逻辑思维潜移默化的影响。我们崇尚简单,讨厌复杂,无论是在数字世界,还是现实生活。
程序员喜欢看到确定的、可预知的结果,而我们的世界里却有这么多的不确定性,我们的办法就是只往好处看,只青睐那些我们把握得住的东西。
:Begin //请注意,此处的Begin为用于goto跳转的标签
当我们*评估项目进度时,我们会先采取大事化小小事化了的策略,然后把那些人见人爱的小家伙一一拎出来,乐不滋滋地给他们分时间,这个4小时,那个3.5……OK,很快我们就觉得胸有成竹,一切尽在掌握,吧啦吧啦我的魔仙棒,傲娇地转上一圈再伸臂一点,整个项目大概需要4个人月,预留一些时间比如1个人月应对随时可能出现的天外来客,我们有8个人,啊哈,半个月哦不,2周半搞定!
大家伙分头行动,哼哧吭哧咣叽咣叽开搞了。
第一周的时候,我们报告说:“工作正在有序进行,一切都在掌握之中。”
第二周的时候,我们报告说:“出了点儿小意外,但加两个晚上班儿就可以追回进度,我们可以搞定。”
第三周的时候,我们报告说:“又出了点儿小意外,你知道,软件开发就是这样,惊喜不断。不过我们周六和周日已经摆平了意外,我们很快就可以搞定了。”
第四周的时候,我们报告说:“嗯,情况比我们想象的复杂,在集成时遇到了不明状况,整个团队搞了一个通宵才搞定,结果第二天没办法干活,所以,进度比预期的要晚一些,不过,请相信我们,很快就可以搞定了。
第五周的时候,我们报告说:“这周肯定可以搞定了,相信我们的能力。”
第六周的时候,整个团队都一脸黑线在加班……
第七周的时候,我们报告说:“系统集成完成啦,第一个Beta版本可以内测了。这虽然比我们预期的时间晚了一点点,不过,我们的内测版本堪称完美,几乎不可能出现Bug。”
……
第十周的时候,整个团队都在加班加点改Bug,人人一脸黑线外加两个青肿的眼袋,每当焦虑万分的老板询问上线时间时,项目经理都会说“快了快了,就这两天就搞定了。”
等到第十四周要结束的时候,版本终于发布了。
皆大欢喜啊。
老板已经被这群猴子逼疯了,心里恨得要冒火,还得咬着牙说:“兄弟们辛苦了,你们的努力大家有目共睹。”
我们报告说:我们发布的版本质量很高,容易上手,用着也方便,用户一定会满意。相比之下,少许的延期是值得的。
goto Begin
好吧,项目估算简单吗?
你看过《人月神话》了吗?
“一切管理理论都是扯淡,哪一种也不适用我们的团队,因为我们这些程序员是独一无二的,都有着与众不同的个性,我们必须找到自己的项目管理方法。并且,我们现在的团队已经在我们独特的管理模式下运转良好,完全不必要引入学习成本那么高的控制手段,况且那样对大家也是一种刺激,觉得公司不信任大家,这会大大的降低士气。毫无疑问,我们现在的团队士气高昂,必须要保持……”
这可能是某个项目经理说的话,我不记得了。他最终的结论是:“虽然这次项目Delay了,但是下次,绝逼不会了!我们一定有办法控制进度。”
看到了吧,这就是我们的乐观。它生动地告诉我们什么是真正的乐观:即便无数次实践已经证明我们的估算和调控手段不靠谱,我们还是会信誓旦旦地在下一个项目来临时许下“绝逼不会延期”的诺言。
这很简单,两天搞定
程序员群体的乐观是由一个一个个体的乐观汇聚而成的。
有多少次我们被问到这个问题需要多久解决时,我们都说出类似“两天搞定”的话……
有多少次我们看着同事深陷泥沼无法自拔完工无望时,我们说出“要是我早就搞定啦”之类的话……
有多少次我们要学习未知的技术并把未知的技术应用到未知的业务上最终交付给客户一个可用的系统时,我们都会天真的从我们既往的经验池里抓几枚硬币来撒撒,然后说出“大概需要半个月”这样的结果……只有程序员,彪悍的程序员,无所畏惧的程序员,敢于乐观地面对未知的一切拍拍脑袋给出一个确定的工期。
……
这都是因为我们程序员倾向于把事情想得简单,在我们这些崇尚简单的程序员眼里,即便你秉持着不惮以最低的效率来评估的原则,也会给出一个最终看来还是乐观的估计。
这让人绝望吗?
No!恰恰相反,这正是我们程序员之所以为程序员的一个关键特征,惟其如此不能活也!
没什么难的,不过如此嘛
万事开头难。很多事情只要我们突破了最初的障碍,后面就会顺风顺水势如破竹。对程序员来讲,这种规律很容易被强化,因为,我们有太多机会学习新技术新框架新业务,而大多数的语言和框架,写一个万能的“Hello World”就入门了!
这种学习新技术的感觉,和开车类似。我学会开车后,一直没有上路跑过,提车后犹豫了几天,总觉得城市里路况复杂,很多车不管红绿灯总在强抢黄三秒,行人又乱闯,电动摩托总是突然呼啸而过,左转右转与直行同时被允许,想多了总觉得自己不能应付这种状况,就在考虑要不要请个陪练陪着我上路跑几天。后来因为着急上牌,没办法就直接上路了,早上五点多起来,从家开到了车管所,办完手续后又战战兢兢地开回了家。这是第一次单独一个人上路,没磕没碰没撞没出事儿,居然!好吧,成功的经验会让你找到自信,于是后来我就敢上路了:怕啥,就那样嘛。
程序员的情况与此类似。比如你让一个C++程序员去开发一个AndroidApp,他可能只需要两个星期就能学会Java和Android开发,做出一个DEMO。然后呢,跨过门槛,一切障碍都不存在了,前面都是坦途,没什么能阻碍这个程序员解放全人类的伟大理想了。
这种体验的不断重复使我们由衷地相信好的开始是成功的一半,所以,当我们哪怕仅仅做出一个小小的DEMO程序,也会兴高采烈的发布我们的结论:啊,我们已经突破了关键技术,从已有的DEMO来看,技术上的问题不再是问题了。
当然事实并非如此。前路险滩无数,泥沼遍布,暗坑随处都是,当你迈出第一步,欣喜地以为天下独握我手一切尽在掌握的时候,那些你难以预料的艰难险阻也已悄然出发,快速向你围拢过来。
我开车还没超过100公里,就遭遇了第一次交通事故,和保险公司打了回交道。作为程序员,你说难题已被攻破技术上已经没有风险,其实仅仅是你过于乐观了,真正的旅途还未开始,让你挠头的事儿还未到来。就是这样。
当然,程序员是乐观的,他们说,无论前路如何,只要逢山开道遇水搭桥见佛杀佛见鬼杀鬼即可通关,天塌了有个儿高的顶着呢,项目黄了有项目经理扛着呢,公司关门了大不了换个地方再战江湖,爷有手艺,到哪儿混不来一碗饭吃……
好吧,我们就是如此乐观。如果你要和程序员打交道,一定要谨记此点,他们的职业习惯使得他们倾向于把事情简单化,只看好的一面,未知的风险他们会一笑而过。所以,你要有预期,他们常常前半程轻轻松松高歌猛进,后半程心情沉重步履维艰。