作为程序员,我们经常被问到“要花多长时间”?

情况几乎总是这样:


要求不清楚。没有人对所有含义进行深入分析。
新功能可能会破坏您在代码中所做的某些假设,并且您会立即开始考虑可能需要重构的所有内容。
从过去的工作中您还有其他事情要做,您将不得不做出一个将其他工作考虑在内的估算。
“完成”的定义可能尚不清楚:什么时候完成?就像刚刚完成编码一样“完成”,或者像“用户正在使用它”那样“完成”?
不管您对所有这些事情有多了解,有时您的“程序员的骄傲”都会使您付出/接受比您最初预期的时间短。特别是当您感觉到截止日期和管理层期望的压力时。

其中许多都是组织或文化问题,这些问题不容易解决,但最终,现实是您被要求估计,他们希望您能给出合理的答案。这是你工作的一部分。你不能简单地说:我不知道。

结果,我总是最终给出估计,后来我意识到自己无法实现。它发生了无数次,我始终保证不会再发生。但是确实如此。

您确定和提供估计的个人流程是什么?您发现什么技术有用?

评论

另请参见如何解释很难估计更大的软件项目所需的时间?如何学习做出更好的估计?让非程序员了解开发过程,如何做才能更好地估计项目需要多长时间?

如果要求不是很明确,则可以估算出50%的误差范围(范围更大)。如果明确要求,则可以估计20%的误差范围。对我有用的另一个好的策略是将项目分成多个阶段。这种方法更容易估算,您只需要估算第一阶段。当您要估计下一阶段时,您会对项目有更好的了解。另外,您和承包商之间的信任应该更好。我也总是写我的假设和前提条件。绝对不要写“它可以在IE8或更高版本上运行”。

塞尔吉奥:“结果,我总是最终给出估计,后来我意识到自己无法实现。这已经发生了无数次,我始终保证不会再发生。但是确实如此。”您今天感觉有多少改善?

@ r.pankevicius老实说,我只是停止提供估算值:rclayton.silvrback.com/software-estimation-is-a-losing-game

我认为,“估计”和“最后期限”之间的细微差别也很重要。估算不是一项承诺,因此,较小的错误应该不会有太大问题。如果有人对此感兴趣,我在这里写了一篇冗长的博客文章:marcgg.com/blog/2015/08/27/deadlines-estimates-software-startup

#1 楼

从务实的程序员那里:从旅途的人到大师:


当被要求估价时该说些什么

你说“我会回头给你。”

如果您减慢该过程并花一些时间来执行我们在本节中描述的步骤,则几乎总是可以获得更好的结果。在咖啡机上给出的估算值(像咖啡一样)会再次困扰您。


在本节中,作者建议采用以下过程:


确定所需的精度。根据持续时间,您可以用不同的精度引用估算值。说“ 5至6个月”与说“ 150天”不同。如果您稍微推迟到第7个月,那么您还是很准确的。但是,如果您进入第180或210天,就没那么多了。
请确保您了解所要询问的内容。确定问题的范围。
对系统进行建模。模型可以是心理模型,图表或现有数据记录。分解该模型,并从各个组件建立估计。为每个值分配值和误差范围(+/-)。
根据模型计算估算值。
跟踪估算值。记录有关您要估计的问题,您的估计值和实际值的信息。
要包括在您的估计中的其他内容包括:开发和记录需求或对需求规格的更改,创建或更新设计文档和规格,测试(单元) ,集成和接受),使用更改创建或更新用户手册或自述文件。如果两个或两个以上的人一起工作,则将产生通信(电话,电子邮件,会议)和合并源代码的开销。如果任务很长,请在选择交货日期时考虑其他工作,休假(节假日,假期,病假),会议和其他头顶任务等事情。


评论


这也是McConnells的“软件估算的艺术黑手党”的重要组成部分。切勿随手可得。

– Paul Nathan
2010-09-3 17:35

我强烈推荐麦康奈尔的书。如果可能的话,请任何需要您估算的人进行估算测验:codinghorror.com/blog/2006/06/…您可以将其作为游戏来展示,但这通常有助于传达信息。

– Paddyslacker
2010年9月3日于20:57

您总可以说“我会尽快回复您”。如果有人说“好,我需要一个答案”,然后说“如果我现在给您一个答案,那将是一个谎言。我现在没有足够的信息。这对我们双方都不利于我做出某些事情当场。”

–安迪·莱斯特(Andy Lester)
2010-10-8 22:14

@AndyLester-很多情况下,如果您现在不给出答案,那么其他人会选择将项目和金钱带走,或者最终将责任归咎于您,因为您错过了一个估计而您一无所有做。很烂,这是错误的,但是不幸的是,这是现实。

–乔里斯·蒂默曼斯
2011-11-17 14:24

@ThomasOwens我从不对合同使用“船上射击”的估计,但是在合同阶段之前,我确实使用了这些估计。在客户投入宝贵的时间来深入研究微小的细节之前,我必须给出某种数量级的命令-如果他们认为要付的钱比我乐观的直觉要少几个数量级,甚至没有意义。开始。

–乔里斯·蒂默曼斯
2011年11月17日下午14:51

#2 楼

软件评估是软件工程中最困难的一项任务-紧随其后的是需求启发。

有很多创建它们的策略,所有策略都基于首先获得良好的需求。但是当您的后背靠墙而他们拒绝为您提供更多详细信息时,请假装:


仔细查看您的要求。
进行假设以填充根据您对他们想要的东西的最佳猜测得出的差距
写下所有假设
让他们坐下来阅读并同意您的假设(或者,如果幸运的话,让他们屈服)并给您真正的要求)。
现在您有详细的要求,可以从中估算。

就像我妈妈小时候曾经威胁说:“快点挑些衣服,否则我会去挑给你!”

评论


我问了有关您的第三点的后续问题。 developers.stackexchange.com/questions/132970 / ...

–k0pernikus
2012年2月2日于13:24

编写好的需求需要多长时间?

–mmehl
16年11月8日在22:20

#3 楼

我为一个坚决想要准确估算的人做过开发。我们确定的效果很好,是这样的:


我花了所有的时间进行估算。约占我账单的20-25%。
我对任务做了非常详细的检查。没有从臀部射击。我进入代码,弄清楚需要更改哪些行,它将影响程序的其他部分,我必须进行多少测试才能确保一切正常。我会以.1小时(6分钟)为单位估算每件作品。
我将每项任务的估算结果以及详细的分解结果发送给他。

20-25%的计费声音就像很多一样。

但是他要我改变XYZ,以为这需要2个小时左右。在1个小时的详细估算中,我确定将花费8.5个小时。因此,他将决定是否值得支付8.5小时的报酬。如果不是这样,那么他比我节省了7.5个小时(如果我不加估算就可以节省成本)。

如果他确实想投资8.5个小时,我所做的详细工作

我发现,使用这种方法,我能够按时甚至提前完成大多数任务,而不必高估。因为时间如此之细,所以我可以早点知道我是否滑倒。如果我遇到障碍,那么3个小时后我就能确定我的8.5个小时的任务要花12个小时,我可以在更多时间过去之前与他讨论此事,以便他在担心成本的情况下可以重新评估和修改该功能。

他是在喝酒吗?不,我把它看成是让他把钱花在他看到最大收益的地方。而且我很高兴获得估算的经验,这是我一直以来最糟糕的。

评论


这听起来像是一种非常适当的技术。实际上,当您为自己的公司做估算时,估算时间也将作为薪水的一部分支付。但是,我担心的问题是,大多数组织都希望对更大的任务进行估算,而不是可以用.1小时的时间段表示的任务。感谢您的回答。 (您是来自软件开发板专家的Kyralessa吗?)

–塞尔吉奥·阿科斯塔(Sergio Acosta)
2010-09-29 6:05

是的,同一个。

– Kyralessa
2010-09-29 13:32

@SergioAcosta的重点是您使用分析/估计时间将任务分解为较小的块。恕我直言,这是最好的答案。

– NimChimpsky
2015年8月7日在7:40



因此,如果这是一个5个月的项目,则应该估算一个月或更长的时间。经理们可能不会接受:)

– Darius.V
16年7月13日在4:46

@ Darius.V,您说的很对。在这种情况下,客户对特定功能的决定是“是”或“否”,而不是整个项目的总体决定。如果不进行整个项目,则此技术无疑更具挑战性,这取决于总体估算。另一方面,如果您为一个项目预算六个月,但该项目实际上可能要花费一年,您是否宁愿在六个月之后还是两三个之后就找到预算?

– Kyralessa
16 Dec 26 '16:33

#4 楼

在会议上,我们经常被要求提供“估算”,在会议上我们对他们想做的事情有非常广泛而广泛的想法。我总是说:“如果您今天想得到一个答案,那是一年和一百万美元。如果您想给我更多详细信息并花一些时间来复习它们,那么我可以为您优化这些数字。”

他们几乎总是明白这一点。

评论


当他们说太多的时候,我假装思考了一分钟然后说:“你是对的!那是18个月200万”。

–Cyber​​Fonic
17年12月3日在23:19

#5 楼

这取决于估算的目的。

对于业务案例的初始,高级估算,关键是:


速度。无论使用哪种方法,都必须快速。关键是利益相关者不确定是否值得进行该项目-这就是为什么他们需要业务案例的数字。如果业务案例可靠,则不需要您的估计。这些项目大部分都不会继续进行,因此,重要的是不要花费太多精力来提供估计。
给出范围。扩大范围。您没有时间分析需求,与利益相关者进行研讨会,验证假设。估计值的接收者范围很广,“软件项目天生就很复杂且有风险-如果您要进行适当的估计,则需要给我更多细节和更多时间”。给出一个单一数字或一个狭窄范围的问题是,在进行任何实际分析之前,它会通过设定期望值而使您陷入困境。

我发现最好的技术是选择一个具有“感觉”的可比项目“ 相同。 “感觉”是完全主观的-但是根据这种估计,我的经验告诉我您不会找到客观的测量结果。然后提供广泛的范围。我读过一些书,说-50%到+ 100%的范围是好的,但这取决于许多因素。

有关详细的低水平估算:


您需要基线。如果基线不稳定,那么估算就没有意义。
最好自下而上。获取详细的工作细分,估计每个组件,然后将其汇总成更大的数量。我发现在这里规划扑克是一种很棒的技术。
文档意外情况。弄清楚添加任何意外事件(如果有)的位置。是否将其添加到每个订单项?还是整个估算?还是要承担特定的风险?还是没有?
陈述您的假设。在给定的时间范围内尽可能多地进行验证。
明确说明估算中包括和排除的内容。例如,是否包含评论?是否包括技术延迟?


#6 楼

那些从艰难的道路中学到了一些建议。


要求不清楚。没有人对所有含义进行深入分析。


此时不要做估计。没有人估计不知道敌人人数就能赢得一场战斗的人数。估算是在侦查之后做出的。除非您已经与这个敌人战斗过。


这项新功能可能会破坏您在
代码中所做的某些假设,并且您会立即开始考虑所有可能的事情
必须重构。


这是您的责任,除非您希望其他人对此领域有专门知识。


您需要根据过去的任务来做其他事情,并且必须
做出一个将其他工作也考虑在内的估算。


与上述相同,即使是意外情况也是如此。由您旁边的slob团队伙伴创建的工作几乎没有一个测试过程,这会导致您的代码出现故障,导致您无法提前完美预测。这是天气预报。


'done'的定义可能不清楚:何时完成?
'done'就像刚刚完成编码一样,或称为'done'就像“用户正在使用
”中一样?


在这里了解用户端要求,像用户一样思考。如果他们认为某人“被完成”,则不要做他们的同事所做的事情,因为他们认为某些基本功能具有准系统工作流,而这些工作流是准用户无法容忍的。从用户的角度考虑它,因为这就是您通常估算的所有客户。估算完整的用户端需求,而不是准系统技术需求。并意识到,您的客户要求估算的信息在这里是完全不准确的,他们是如何措辞和理解您所说内容的技术方面的。


无论您多么有意识地了解所有这些内容,有时候您的
“程序员的骄傲”使您付出/接受的时间比您原本认为可能需要的时间短。特别是当您感觉到期限和管理期望的压力时。


不要这样做!您听起来像是一个自我激励的勤奋的人,也许是一个容易屈服的人。

这里的问题是这样的:假设您和Joe为同一任务进行了时间估算(但是在两个独立的任务之间)员工,一次也不知道这两个估算值。您勇敢地估计,“一周”。您认为可以,您每周工作超过100个小时以上,无偿加班。现在您要迟到三天。

同时,乔估计需要5个月的时间。您认为这很荒谬,您认为可以在一星期内完成。乔工作多少?一周10个小时? ...除了他准时完成了5个月的时间。

猜猜谁被认为是公驴?是的,你。乔看起来像是一位伟大的工作者,您现在似乎不可靠。没关系,您可以在乔花费的大约7%的时间内获得甚至更好的结果。重要的是,您比一周的估计时间少了3天。

切勿在更严格的估算方面出错。更宽松的估算结果有误。在您的公司中有一种声誉,它并不是基于估计的长度而几乎不取决于估计的准确性。估计时间太长,很容易就很准确,您将有更多的时间来解决问题并更好地解决问题。估计值太短,根本没有呼吸空间,您要么拼命遇到它,要么被拧紧。

评论


这是一个很好的答案,它为我提供了有关如何估计和考虑事物的非常有用的见解,谢谢

–timmz
16年4月17日在21:37

我读这个答案5年已经太晚了。我曾经和我的前任老板吵架,谴责我因为14天的估计而缺勤3天。

–k0pernikus
1月22日19:01

#7 楼

“两个星期!”

认真地。我的第一时间估计总是两个星期。因为我有某种怪异的心理障碍,使我认为一切听起来都需要两个星期。

我尝试解决这个问题,尝试真正地思考我认为需要多长时间,尝试找出所有潜在的故障点和位,这些位和位看起来对我来说太黑框了,无法准确估计。并尝试认识到,如果我的回答是“两周!”,那我可能会失败。

我所学过的每一个好经理几乎都学会了识别“两周!”。作为回答,需要轻度的口头皮条回应。

评论


大概这就是为什么大多数团队都会进行2周的冲刺:)

– Cristian E.
16-09-14在7:30

#8 楼

有一个博客条目概述了如何保存以前的估算结果的准确性,然后下次您对某人说“将是两个星期”时,您可以查看以前的历史记录并查看它的历史记录实际上是您上次说“要两个星期”才花的时间。

我自己还没有尝试过,但是我想看看我的估计有多准确。

评论


Joel的Fogbugz对此进行了进一步介绍,并使用基于证据的计划为您分析了您的数据。即,每个开发人员输入他们认为每个任务将花费的时间,然后输入该任务花费的时间,并确定每个开发人员的估算值是否准确,以得出完成日期的概率曲线。

–克里斯·巴克特(Chris Buckett)
2010-09-26 19:49

是的,然后进行一些GDD-标尺驱动开​​发并破坏一切

–克劳迪·康斯坦丁
17年5月5日在15:53

#9 楼

这取决于组织以及估算的使用方式。

如果估算只是为了提供何时准备的总体思路,我通常可以根据自己的经验进行快速估算。通常,我会在估计中包括任何不确定性或可能的变化,以及这些变化如何影响系统的其他区域以及所需的回归测试的范围。

如果该估计用于合同或其他目的,在需要更精确的时间安排的情况下,我会进行全部工作。这是一项更多的工作,需要对系统的设计和更改进行更深入的思考,但是更加准确,尤其是对于较大的工作。

无论哪种情况,持续的通信都是关键。如果您确实遇到了意外情况,请立即将其告知,而不要等到最后期限。如果要求不明确,请确保记录您对要求以及计划提供的功能的理解。这对于您所做的任何假设也很有帮助。至于相互竞争的优先事项,当一项工作碰到另一项工作时,请清楚这将如何影响时间表。

评论


+1需要持续进行的沟通。 IMO,这是敏捷模型中最有用的部分。

–斯科特·韦尔登
2015年9月23日下午5:37



这是第一个得体的答案,这仅仅是因为它是迄今为止唯一强调“持续交流”的答案(我在读自上而下)。其他人似乎都认为估算沟通是一次性事件。那是不好的建议,而且对这些事情的处理方法也很差。这个答案是很好的建议。

–亚当·卡梅伦(Adam Cameron)
17年4月4日在8:04

#10 楼

估计什么?小任务或完整的解决方案。

我很少做,但是我只是猜测,添加一点,让经理添加一点,然后放入一个范围内,并在旁边加一点说明上面是一个猜测。

小任务-规划扑克我发现工作得很好(不是很完美,一些1pt任务花了更长的时间,一些5pt任务花了几分钟,但一切都变得平稳了)最后)。

评论


耶计划扑克!

– Sean McMillan
2011年8月9日17:56

#11 楼

根据您今天所知道的内容提出一个范围。使用“不确定度锥”来提供围绕您最初的猜测的范围。

每周计算剩余的工作量,然后根据您所知道的进行重新估计。一旦您有足够的样本量来确定每周要完成的工作量,请为剩余的剩余量提供90%的置信区间,以便随着项目的进展和剩余的工作量(通常是希望的)缩小(通常) )缩小。

#12 楼

信心十足地。我无法告诉您有多少次我在与客户进行初次会谈时,在给出估算时不表现出专业精神。即使您是凭空吹牛,也要确保始终保持一些估计。就是说,要小心不要估计自己陷入困境。不同的事情需要花费大量的时间,精力和资源。这是一个好方法:


他们:要花多少钱?

我:这取决于您要我做什么。通常,我在$ X左右开始这种项目。


#13 楼

有时候,评估对您和您的团队来说是一个巨大的挑战,尤其是当我们谈论软件项目评估时。

一旦我们决定分享我们的经验和我们对软件评估过程的知识,并定义了四种不同的类型估计数:

服务估计
特征估计
分量估计

当然,这些类型是不同的。棒球场通常被称为“猜测”。因此,这是一个大致的数字或范围,可以大致了解成本,并有助于潜在客户确定他们是否希望进一步讨论。

通常,客户在项目开始时需要一个大概的数字。我们的建议是:对项目的讨论和提供概要数字仅是迈向获得组件估算的好步骤(这是灵活的,可以在整个开发过程中使用组件类型估算。在重新评估时无需从头开始估算)您要添加,删除或替换功能,服务等)。

每个人都应谨记软件开发估算所带来的风险:低估,高估,总的重大故障情况等。

您可以在我们的博客上阅读更多!

http://blog.lemberg.co.uk/project-management/software-estimation-process/

希望这些信息对您有帮助!

#14 楼


我总是最终给出估计,后来我意识到自己无法实现。它发生了无数次,我一直保证不会再发生。


听起来好像是在要求您做出承诺,而不是估计。这些是不同的事情,但是,如果您能够可靠地履行承诺,那将真正帮助您提高信誉和职业生涯。

基于我大约10年的经验提供的一些建议:


始终提供一个范围(即上限和下限)。这将传达您的不确定性水平
如果不确定性非常大,请推迟(例如1天进行分析,然后提供更小的范围)
如果任务太大,则将其中断并为每个零件提供范围


#15 楼

首先,如果将一些任务分配给我,我会将其分解为子任务。我将估计每个子任务的时间,并且可能通过子任务我可以找到有问题的区域,因此我将能够预测需要多长时间

但是所有的计划仍然只能在一定程度上有所帮助。仅当您开始编码时,您才能找到确切的问题

#16 楼

如果您为同一位老板或客户执行许多项目,则可以尝试以大笔的复杂性来估算,而不是几周或几个月,可能以T恤尺寸来估算。确定一些过去的项目,并为它们分配大小S,M,L,XL。然后问自己:听起来哪个项目与范围相似?然后,您无需回答“ 2个月”,而可以回答“对我来说像L的声音”(或您对项目的校准结果)。

这很容易理解,而且显然这些猜测还有很多不确定性。

然后,当需求发生变化时,您可以说“变化使它听起来更像是XL”。

评论


这是很聪明的(如果允许使用它):我更喜欢采用类似的方法,但只是对时间值进行概括,所以我会回答“这将需要一周左右的时间”或“这将是一个问题天”之类的东西,并且在项目要超过一个月并且需要适当估算时避免回答

–爱德华多
18年4月25日在14:18

#17 楼

有点晚了,但是当我入伍时,我们被指示使用PERT来确定估计值。它确实需要您所在领域的经验和手头的任务。在维护和修理电子设备(复杂的无线电设备和卫星通讯设备)时确定估计的完成时间时,它的准确性出奇地准确。在日常维护过程中,任何数量的东西都可能是错误的或发现并需要修复的,这些信息是正确的。这些估计很重要,因为其他单位在收到通讯设备之前可能无法使用。我使用过的一个免费的在线PERT计算器

评论


此链接免费在线PERT计算器不再起作用。

–krokodilko
18 Mar 3 '18 at 13:16

@krokodilko我建立了一个新的PERT工具,该工具更适合此处的软件估计:estimates.rokkincat.com。

– s语
19年7月26日在22:05