“这个网站相当简单,所有你需要做的就是完成X,Y,Z。你看起来应该是技术很好,所以,我相信,你不需要花费太多时间就能把它搭建起来。”
我时不时的就会收到这样的Email。写这些邮件的人几乎都是跟技术不沾边的人,或正在研究他们的第一个产品。起初,当听到人们这样的话,我总是十分的恼怒。他们在跟谁辩论软件开发所需要的时间?但后来我意识到,即使我自己对自己的项目预测要花去多少开发时间,我也是一筹莫展。如果连我自己都做不好,我何必对那些人恼怒呢?
真正让我郁闷的不是他们预估的错误。问题在于他们竟然认为自己可以做出正确的估计。作为开发人员,我们经常会发现,在软件开发的问题上,一个外行人会很自然的把复杂的事情估计的很简单。
这并不是为我们的愤怒找借口。但这引起了另外一个有趣的问题:为什么我们天生的预测复杂性的能力在遇到编程问题时会失灵?
为了回答这个问题,让我们来认识一下我们的大脑如何估计事情的。有些事情对于一些没有经验的人也很容易预估正确,但有些事情则不然。
我们来想想观看一个人弹吉他。即使你从来没有弹过吉他,在观看了一场弹奏《玛丽有只小羊羔(Mary had a Little Lamb)》的吉他表演后,你也能大概推测出这很简单,一个人不需要太高的技术就能演奏出来。同样,当观看了有人演奏D大调的《卡农(Pachabel’s Canon)》后,你也很容易推测出,这很复杂,需要很长时间的练习才能演奏的出来。
为什么我们能够很迅速准确的预估这两首曲子的复杂性呢?这是跟我们用来判断一个事情简单和还是复杂的方法有关的。我们的大脑有一些现成的模式来完成这些事情,首先一个就是根据速度。这种情况下,大脑会辨别每秒钟演奏的东西。根据每秒钟演奏了多少东西,我们很容易有一个直观的判断曲子的复杂度。因为用吉他演奏一首歌是一种物理过程,一种感官上的活动,我们的大脑很容易依此来推测速度,继而转换成复杂度。
我们还有另外一个天生的推测依据:体积。想想把一个帐篷和一栋公寓放在一起对比。即使一个人从来没有学过建筑学,他也能告诉你通常设计和建造一个帐篷会比设计和建造一栋公寓要简单。为什么?因为我们天生的会使用物理体积作为事物复杂性的一个指标。
当然。上面说的这两种逻辑分析并不是总是100%的有效。但大多数情况下,人们就是这样干,而且很成功。大多数情况中,我们在对物理过程评估时,我们的大脑会对物理事物进行有效的关联,不需要依赖之前的经验。
现在让我们来谈谈软件。当一个不懂技术的人试图对软件开发时间进行评估时,有两个很基本的直观指标在辅助他们:以体积为指标的复杂度和以速度为指标的复杂度。但他们没有意识到,软件跟他们想象的不一样。软件本质上不是有形物质。没有体积和速度。它的极小的组成部分可能会时不时的在电脑屏幕上闪现。正因为如此,当面对开发一个web应用时(或任何类型的软件),我们的基本直观感觉失效了。
这第一点,速度,很显然根本不可能被外行人拿来对软件进行评估。于是很自然的,他们倾向于使用体积指标进行评估。要么是根据描述文档的页数,要么是根据软件的功能用例数或特征数。
有时候,这种评估手段确实有效!当面对一个静态网站,没有特别的设计要求,外行人很容易用这种方法估计出开发时间。但是,通常情况下,对于软件开发,体积并不能真实有效的反映复杂度。
不幸的是,对于软件的复杂度,唯一有效的推测方法是依据经验。而且还不是时时都好用。作为一个程序员,我知道,根据我之前开发过的相似的功能特征,我可以估计出现在的这些功能特征各自要多少开发时间。然后,我把总时间加起来,这就得到了完成整个项目需要的大致时间。然而,事实情况中,每个项目在开发过程中都遇到二、三个瓶颈。这些瓶颈会肆意的消耗程序员的大量时间,你在遇到它们之前根本不会有所预见。它们会拖住整个项目,致使工期延后数周甚至数月。
这些是没有经验的人在评估复杂度时不会理解的。他们不明白在其他事情上都很灵的方法,为什么放到软件开发上就不灵了。所以,下一次当你听到有人说“我想你几天时间就能把它开发出来”时,不管是谁说的,都不要懊恼。深呼吸一下,告诉他这篇文章的地址,自己该干什么还干什么。
外行人的判断,容易过分:过分复杂(惧怕)或过分简单(轻视)
呵呵,我第一家公司的老板娘就对我说过:她的某某朋友一个星期就开发出了一个软件,说我的工作效率低什么的。当初我很郁闷,但是现在谁给我说我弄的慢,直接无视!
曾经有个广告公司的老板让我一个星期开发一整套售楼系统
在这样的人手下干,要么变成精英,要么神经!
别说外行人,经验缺乏的开发者也时常过分简单的估计了工作.
真说到心里去了 感觉有道光直射心坎
隔行如隔山,说得很好。
即使是同一行,也最讨厌不懂装懂神马的了
文中的这种外行其实还是非常好说服的,你和他讲,他一般都能理解,因为他自己知道自己不懂。
最要命的就是那些似懂非懂,以前我们给北京公信部做一个项目,那里一个主任,整天做的最多的事,就是上网,当时他想着把各种流行的互联网元素都嵌入到项目中(甚至包括google wave,好讽刺),但是他因为懂一些,对于一些工作量,自己也做了评估,但你却没有办法说服他,他对自己的经验很有自信。
赞同!似懂非懂,却又大把自认为正确的理由最是难缠!
我女朋友看了我的编的程序想当然的说这个很容易
所谓不知者无罪!!!!能有什么办法呢?现在好多人就那样,不懂装懂
不是不懂装懂,是脑海中想当然的简易。(*^__^*)
同感啊
因为不了解,所以不能体会其中。。
所以,下一次当你听到有人说“我想你几天时间就能把它开发出来”时,不管是谁说的,都不要懊恼。深呼吸一下,告诉他这篇文章的地址,自己该干什么还干什么。
我想另一个切入点是:外行人会用“演奏家多久能练好这个曲子”,万万想不到应该用“作曲家多久能写出这个曲子”來當基準。我们是作曲家不是演奏家。
太对了,程序员不是工人,而是设计师和工程师,他们在不完美的技术环境中,为模糊混乱多变的需求和期望进行设计,不仅要美、还要好用、还要好维护、低成本,最最关键的,必须在有限的时间内完成。因此,上一定规模的软件的复杂性可能要远远超过大部分的非软件项目。
比喻的真好
悲催的啊,不懂技术的人永远看不到这篇文章。
所以,应该去考虑“懂技术的人要让不懂技术的人觉得一切都不是很容易实现”。
下一次当你听到有人说“我想你几天时间就能把它开发出来”时,不管是谁说的,都不要懊恼。深呼吸一下,自己该干什么还干什么!
那种人,如果不能说服他,就离他远一些!
他们会认为上月球很容易,因为在一张1米高的桌子上面再放一张1米高的桌子就变成两米了,以些类推,只要给你足够的桌子,他就上去了.不过,他是不会摆桌子的,摆桌子的人是你
这篇文章应该推荐给客户让他们看看,这的确是很现实的事情。。。。
应该改一下,不是”不懂技术的人不要对懂技术的人说这很容易实现”,而是”不去实现的人不要对实现的人说这很容易实现”
我发现一个有趣的事情 在自己估算工作量时 容易把复杂问题想简单 把简单问题想复杂 最后发现所有的问题都不简单也不复杂 都是中等时间
如果任务是:请实现一个循环队列,或者请打印出用户列表,这种我们做了上百遍的东西,肯定一下就知道难易。
如果是:做一个像**一样的网站,也是可能估计的
但是很多时候是,做一个像**的网站,但是我们可能需要***功能,这种基本上就难说了。
预测软件开发周期是最不靠谱的事
坑爹的预测开发周期,不懂技术的还来参合
这个话题很有意思,同行的人,不论男女老少,工作时间长短,多多少少都会有此感受,也许曾是一刹那而已!
是的,最最讨厌这话了!!
我是比较厌烦那些所谓的需求人员或者产品经理轻易地说出一句:这个应该很容易的才对。结果这个东西做了一个周后他才发现自己说错话了。
懂技术的人会根据以前的经验判断现有需求的开发时间,如果对现有的需求不做充分的了解,很容易犯经验主义错误,而且还固执的认为自己的预判时间是正确的。
程序员写的文章,你感觉对于那些外行来说有用吗?难道他们心里真的不明白编程的复杂性吗?他们的真正意思是让你按时交差,并不是不懂编程的复杂性,就算不懂又有什么大不了的,重要的是期限,作者还傻呵呵地解释,真以为人家看了就会理解你呀,真有点阿Q精神。
作者写了篇稿子给那些外行看,然后自己干自己的,就好比鸵鸟遇到危险把头埋沙子里就以为没事了一样,殊不知在那些人眼里其实这很幼稚.
当然我支持程序员,但是希望大家明白一个道理,人在江湖身不由己,如果不服你就把他们干掉或拒绝承接项目,自己做产品经理,不然老实干活。要不你就不停地跳槽,祈祷自己遇上个好领导,好客户.
外行还真没有资格来预估一个项目的开发周期,因为外行用户只能看到界面,想当然的认为很容易,其实界面只占一个项目的10分之一。
而且就算预估了开发时间,遇到瓶颈和其他一些情况等不确定因素是不好确定的,而且再加上一些用户根本就不清楚一些问题的复杂程度,这会引出另一篇文章,为什么看起来很简单的网站需要一大堆顶尖高手去完成。
这就好比某些刚学了几天或者自认为会点程序的人都觉得百度不复杂,因为在他们看来百度不就是一句select查询语句加模糊查询就做出来了吗?其实百度里面的分词搜索技术和网页排名技术还有分布式查询缓存等技术不是一个外行或自认为很懂的人能想得到的。
所以说外行真的没资格来评估软件开发时间。
真说到心里去了 感觉有道光直射心坎
这让我想到了当coder评估自身时避免妄自菲薄的方法就是从资源的稀缺程度来衡量
草民给一个国企做的项目也是这样的 客户自信满满 觉得什么都好实现 ……..自己的逻辑和设计都混乱不堪 给的钱还少 还妄图系统具备各种时髦的功能 更可笑的是 这个系统就五个人用 蛤蛤
这种活你们也接。。明显的坑
唉 说的都是泪啊
“这个很简单”…… 你行你上。
相当贴切。
太对了,收藏!!!
最长见的是估算工作量时根本不把需求分析,调试,测试,开发文档编写算在内,就好像我接到需求就啪啪啪啪敲完立马提交生产上线似的
干嘛告诉他真话,把他的项目拖上几年就好了。
说得很好 站着说话不腰疼的人最烦人
外行人会看这个???
大赞,干技术就是有脾气,搞的不爽了 弄死你
不懂技术的人不要对懂技术的人说这很容易实现
http://www.vaikan.com/im-sure-it-will-only-take-you-a-few-days-to-code/
日常复杂度推测依据是:可见的规模(体积+速度),但是软件复杂度不可测,原因就是不可见的规模和风险。
至理箴言
不经巨大的困难,不会有伟大的事业。
外行指挥内行 那就是瞎鸡巴乱搞。特别是一些公司的老板非技术出身,很多都是瞎鸡巴指挥。难以沟通。这些公司不倒闭,员工只能每天承受阵痛。
太简单了,外行人靠的是抽象思维,模糊的不确定的,问题依照半个大脑的条件执行的话,确实是比较简单。
而内行人被各种规矩以及冰冷的硬件,外部各种因果限制着,自然无法发挥。
其实我也知道很简单,但是这个规矩和硬件不行,而且还有所要求的效果等等这就不简单了~~
作为新手看这个文章非常的有用啊。。。