InfoQ 翻译了一篇老外吐槽软件“估算”的文章,叫做《估算是一种,很难的东西,如影~随行~》。因为今天上午工作方面安排纷乱,心情烦躁,就以跟着起哄的心态看了看原文链接和论坛上的讨论。
作者先出了个题:写一个算法,将林肯的《葛底斯堡演说》全文排版在一个 1.5 英寸 * 8 英寸的书签纸上,要求每行 13 个字符断行(因为 Mono 字体是 1 英寸 10 个字符,书签纸左右各留 0.1 英寸空白,所以一行就是 13 个字符)。
让你估算一下,实现这个算法的时间,给出最差、适中、最好三个估算值。然后,自己动手实现一下算法,再将实际完成时间与你的估算做比较。
作者发现,最后实际完成时间落在自己估算范围内的人不多,于是感叹这么一个“简单”(手动5分钟就可以做完)、明确的需求,估算都这么难!
和国内的帖子一样,精彩的在 评论 里面,讨论集中在几个方面:
不确定的需求
“作为一个搞开发的,我经常被问到完成一个拼图要多久,可我连拼图的样子都没看到、是不是能够拼到一起都不知道!”— beager
“我已经把部署一个 WordPress 博客的时间估算从 5 分钟放余量到 2 周,可是最后经理把需求给我的时候,我发现有 20 多个页面、大量的自定义功能和插件需要部署和开发。我是不是又要 delay 了?!” – skiwigger
有人觉得不能坐以待毙,应该主动出击对 Business Owner 解释为什么拿不出估算:”对你的 Business Owner 说,现在要你给估算,就好像问你机票要多少钱,但是不告诉你什么时候飞、飞到哪里去、要不要商务舱!“ – TargetBoy
但是马上就有苦主反对 TargetBoy,说”你太高估你的 Business Owner 了!那帮功能紊乱的家伙!“ 接着底下就开始骂上了。
”很快,估算就变成‘砍进度’游戏了。而他们砍掉的,往往是让软件变得可维护的东西。” – beager
狂妄的需求
“我老板问我:开发一个微软 Word 那样的东西并且和 Word 兼容很难吗?我说:还不如直接让用户买 Word 更划算。老板诧异道:怎么会这样?!我:o.O ” – angrystuff
Boss:“为什么你三个月写不出来一个浏览器版本的 Office Word?!”
niloc132:“那么容易的话,你当微软是傻子啊!我要是那么牛逼,我就自己开公司了,还会在这里听你胡说八道?!”
“我一般这么回答:啊,这个要 (2 +/- 12 )个月,视我的工作时间和是否有其它的工作安排而定。”—grotgrot
开发人员的对策
逼着 lz 估算是吧,好~~~!
”别忘记 * 3!“ – hyperforce
”乘以 3 不够,乘以 PI。“ – wlievens
就事论事
当然,吐槽过后,正经事还是仔细估算然后实现这个算法来看看。下面就开始了。
马上,mightye 就给出了一段代码和运行结果,5 分钟写成的,看上去还不错。这个算法每次从头取 13 个字符,然后倒着找第一个空格,从倒着找到的第一个空格处换行,接着对剩下的字符重复上面的操作。
很快,有人出来指摘:这个算法遇到等于或者超过 13 字符的单词就挂了!
mightye 不紧不慢:需求里面没有说要处理 13 个以上字符的要求!所以我还是对的!(厉害)
当然,马上有人又指出 mightye 这样是不负责任的,作为一个码农,以需求没说为由不考虑字符超过 13 个以上的情况是在推卸责任,最后肯定是无法满足用户需求的。
我认为,这里有一个哲学问题出来了:究竟什么是需求?要不要做客户没有说的东西(尽管你凭经验可以预计到客户会需要)?
你想找个“是/否”的明确答案吗?那你就输了。(还是)我认为,敏捷思想那帮人聪明的地方就在于,不去找找个问题的直接答案,而是考虑“当客户改变需求的时候,我怎么样能够轻巧的实现?”,从而绕过了这个纠结人的问题。当然,必须在一个充分信任的环境中,由一队高手组成的团队才能做好。
还有人用“wordwrap”函数的,30 秒都不用就解决了。
我认为这提出了另外一个问题:手上没几个类库积累的就是苦啊!否则每次估算都从“零”开始。
下面开始了各种语言的代码竞赛:
Ruby:b = a.scan(/.{,12}\s|.+\z/)
Python:用了 13 行代码
C: 24 行代码
Shell: fold -sw 13 (这个可能是 Winner)
Python:类库引入后,情况改观,2行
import textwrap
print('\n'.join(textwrap.wrap(st, width=13)))
C#: 有 foreach 这种语句直接摘出单词来,18 行
Vim:Ctrl + v, :set textwidth=13, Shift-V, gq (这个太牛逼了,这是我心中的 Winner:)
我试了,可以:,就像那个让客户买 Word 的建议一样,学 Vim 吧。
Haskell:11 行,没有类库,函数语言也没办法。
另外关于软件估算,其实还有一篇很形象、直观的文章,《从旧金山到洛杉矶的旅行》。