zoukankan      html  css  js  c++  java
  • 关于软件开发“估算很难”的各种看法

    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 个字符,然后倒着找第一个空格,从倒着找到的第一个空格处换行,接着对剩下的字符重复上面的操作。

    算法:image (PHP?)

    结果:image

    很快,有人出来指摘:这个算法遇到等于或者超过 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:)

    我试了,可以:image,就像那个让客户买 Word 的建议一样,学 Vim 吧。

    Haskell:11 行,没有类库,函数语言也没办法。

    另外关于软件估算,其实还有一篇很形象、直观的文章,《从旧金山到洛杉矶的旅行》。

  • 相关阅读:
    预习笔记 多态 --S2 4.3
    织梦CMS标签生成器
    socketCluster 使用
    JS工具库之Lodash
    socketcluster 客户端请求
    AngularJS自定义指令directive:scope属性 (转载)
    angularjs报错问题记录
    Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
    angularJS中directive与controller之间的通信
    AngularJs Type error : Cannot read property 'childNodes' of undefined
  • 原文地址:https://www.cnblogs.com/jonyzhu/p/2480730.html
Copyright © 2011-2022 走看看