软件开发中的日常工作量及其对估算的影响


11

我坚信,软件开发中的日常工作量(即使应该忽略不计)相对较小,而且应该相对较小,这是软件估算的基本问题。

让我描述一下我如何得出这个结论,并告诉我该论证是否存在严重缺陷:

  1. 可以高精度估计的只是例行工作,这意味着以前已经做过。涉及研究和创造力的所有其他类型的工作都无法真正估计,至少不能以+/- 20%的准确度估算。

  2. 软件开发就是要避免重复的任务。它的基本原则之一是干燥(不要重复自己)。每当程序员发现自己在做重复的工作时,就该找到避免这种重复的抽象了。这些抽象可能很简单,例如将重复的代码提取到函数中或放入循环中。它们也可能更复杂,例如创建特定领域的语言。无论如何,实施它们都将涉及研究(以前有人做过吗?)或创造力。

从这两点我得出以上结论。

实际上,我已经想了好一阵子了,为什么在其他所有有关软件评估的讨论,博客文章或文章中都没有提到这种关系。太理论了吗?我的假设错了吗?还是太琐碎了-但是,为什么我所知道的大多数开发人员都相信他们可以以+/- 20%或更高的精度进行估算?


7
诸如内核之类的领域之外的所有软件开发中,有99%已经完成了数千次。太多的开发人员只想以一种新奇的方式来做所有事情,一遍又一遍地重新发明同样的旧问题。
弯曲

@Bent:所以您是说软件开发主要是复制粘贴?我知道许多开发人员都是以这种方式工作的,并且经常发现它会导致无法维护的代码。但这是一个不同的故事。即使有人以这种方式工作,他也必须弄清楚要复制的内容以及从何处复制。我也将这视为研究工作。
Frank Puffer

1
@rwong:使用库当然是有意义的。但是,在库中找到正确的功能以及正确的使用方式要么是研究工作(如果lib是抱怨的,并且/或者您不太了解它),要么是微不足道的(如果您知道该功能)。根据我的经验,您所说的“胶水代码”通常很复杂。实施它不是必需的例行工作。
Frank Puffer

1
@ JohnR.Strohm:我没有读过这些具体的书,但是熟悉COCOMO的基础知识-但是从未在实践中使用过。我也读过DeMarco的其他两三本书。您能否暗示与我的问题有关的具体内容是什么?
Frank Puffer

2
需要Boehm的“软件工程经济学” @FrankPuffer进行软件评估。德马科的书并不落后。简短的回答是:如果您完全熟悉软件对其进行总体评估所必须执行的操作,那么您就足以将其视为相对常规的了。
约翰·斯特罗姆

Answers:


11

在任何给定的项目上,这可能都是正确的。但是,如果您多年来为不同公司从事多个类似项目,则可能会发现自己几乎可以多次解决“基本”相同的问题,而只是稍有不同。

例如,我已经写了很多次数据访问层,现在我更喜欢“长手”,而不是使用当月流行的ORM。对于我来说,用已知的解决方案来处理“常规问题”比在第三方组件中发现和解决新问题更快,更容易。

显然,我可以编写自己的ORM来简化重复代码,而无需在其他人的系统中添加未知的怪癖,但是该代码属于我当时所工作的公司,而其他开发人员会发现它与任何其他第三方ORM。

同样,以我的经验,大多数编程都是业务流程的自动化,尽管每个业务都喜欢认为自己的流程是唯一的。实际上,事实并非如此。

并不是说估算很容易!这比较容易,但是我发现这些天的估计问题是由于需求不足而不是编码所花费的时间。

需求通常分为三类:

  1. 模糊,细节留给开发人员。

“让我成为一个网站,它必须很酷并出售我的小部件”

这些往往是最容易估计的,因为当发生严重的意外问题时,您可以简单地将需求更改为功能上等效的东西,并避免出现问题。

  1. 非常具体

“使标题背景颜色为#ff1100”

超级快,而且容易估算。但!需求必然会发生变化。“嗯,别想了,试试其他红色”或“等等!我的意思只是在那一页上!” 因此,“直到我对标题颜色满意为止”的实时范围与编码估计无关

  1. 模糊,假设的细节

“给我一个网站,(就像facebook一样)”

这里有许多未阐明的假设,“当然,您将需要一个不同的徽标”,“它应该具有无限滚动”,“必须可扩展到10亿用户!” 有效地控制估计。开发人员要么考虑所有内容,然后将估算值提高到超出预期的“ 1 meeelion工时”,要么他们认为/假定仅需要基本功能,而给出的估算值太低。“哦,一两个星期,我想你只是想把Facebook放在iframe中,对吗?”

有经验的编码非常快,但是设计要求(通常)是硬性要求,并且越来越多地推向非编码器。通过敏捷方法,可以通过将责任转移到“业务”而不是开发人员上来提高编码速度。


我完全同意您所写的关于需求不足的内容,但这是另一回事。在回答的第一部分中,您说自己经常使用众所周知的技术,以使大部分工作变得常规化。您故意没有附加抽象。根据您使用的技术,这可能会在短时间(2-5年)内很好地起作用。但是您可能会注意到,您没有像其他竞争对手那样改进自己的流程。此外,其他稍后将维护您的代码的开发人员可能会遇到问题。
Frank Puffer

显然,它不像我从不使用第三方的东西。关键是,如果您知道如何使用工具X已经完成某件事,那么估算就很容易
Ewan

在这种情况下,不仅估计而且实现也变得容易。如果您的整个项目都是这样,那么您很幸运。但是以我的经验,这仅发生在小型项目中。我参与的所有较大的项目(> 10天)都需要一些新概念或新技术,而这正是导致大多数工作的原因,使得标准工作的工作量可以忽略不计。
Frank Puffer

让我们不要陷入“谁是最好的程序员”的大战。我要说的是,您要做的事越多,而新的事就越少。如果您所有的项目都要求大多数功能都要求使用新技术...这似乎很奇怪
Ewan

@Ewan“概念或技术”。对我而言,第一个倾向于与业务规则和/或设计师想要的东西有关。这不仅仅是关于新技术。
Izkata

6

为什么我知道的大多数开发人员都相信他们可以以+/- 20%或更高的精度进行估算?

因为我们估计我们对问题的耐心远远超过实际问题。

如果我要为反弹的球设置动画,我可以在上面花一天,一周,一个月或一年的时间,但仍可以播放一个反弹球的动画。希望我花的时间越多,效果会越好,但在某种程度上我很可笑。

我为使球弹起而付出的努力是时间的函数,该时间是合理的。如果我的技能水平不高,我可能会得到一个只是坐在那里的球。但是,当截止日期到来时,我应该让截止日期延长还是至少让屏幕上出现一个球?Waterfall坚持要球弹跳,所以日程表拖延了。敏捷说只要把球传出去。至少我们会发现人们对弹跳有多大的兴趣。因此质量下降。

我试图确保我的球反弹,但是当截止日期临近时,生产一个静态球总比什么都没有要好。因此,在讨论替代方案之前,我根据在问题上花费的合理时间来估算时间。有时球只是不会反弹。有时候没关系。消失一个月不行。


好点,所以基本上您说的是,估算应该基于某个功能对客户(或产品所有者)的价值。我个人喜欢这种方法,但是根据我的经验,即使在敏捷的环境中,这也不是通常理解软件估计的方式。一个缺点是,通常您没有有关功能客户价值的信息。另一个缺点是,它无法处理不会直接导致客户可见的功能的工作包。
Frank Puffer

@FrankPuffer我不同意敏捷方法不能明确说明这一点。尤其是SCRUM甚至不要求开发人员进行估算,直到该功能的价值如此之高以至于实际上计划将其完成,即只是按时进行估算。敏捷方法特别适合于此:首先确定具有最高业务价值的功能,然后对其进行评估,然后再进行处理,并查看实际花费了多长时间。重复冲洗泡沫。经过几个循环后,您将对估算与实际开发时间有个很好的了解。
RibaldEddie '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.