如何避免低估复杂性

2023-11-10 08:59
文章标签 避免 复杂性 低估

本文主要是介绍如何避免低估复杂性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参与软件项目的人会说,软件开发与理解复杂性有关。

什么是复杂性?
复杂性很容易在高层次上定义,但是当人们要求精确定义时,人们会变得模糊。 让我们看看是否可以量化问题,然后再回来进行定义。 复杂

假设我们需要开发一个50,000行代码1 (方案A )的项目,假设每天有10条代码生产线2 ,则该项目将需要5,000个工作日来开发。 即使我们很慷慨,并且假设每个开发人员每天有50条代码生产线,但该项目仍需要1000天的开发时间。

现在,使用该开发的代码,并让一个开发人员重新输入它(场景B )。 开发人员每天可能至少可以编写1000行代码,而进入整个程序只需要大约50天的时间。

97.5%的项目是解决问题,而不是编写代码

在方案A中,我们不知道要编写哪几行代码,因此要花时间来确定:

  • 实际要求是什么
  • 如何将需求分解为高级设计
  • 如何将高级设计转换为编程语言和库
  • 代码缺陷在哪里

尽管我们95%的时间花在弄清楚要写哪几行代码上似乎是令人吃惊的,但稍作反思就会使我们确信情况确实如此。 我们错误地认为项目失败是因为没有足够的时间来编写代码,但是实际上,问题是我们不知道要编写什么代码行。

项目不会因为没有足够的时间来编写代码而失败

复杂性从何而来?

既然我们已经量化了花费在解决复杂性上的时间是多少,它来自哪里? 复杂性来自团队资源,他们不了解如何解决他们面临的问题。 遇到问题时,团队必须考虑如何解决。

如果项目中有足够的时间来解决它,那么复杂性就不是问题。 当您需要解决问题并且没有预算时间时,复杂性就是一个问题。 项目之所以迟到,主要是因为两个原因:

  1. 时间不足
    • 您没有使用正式的估算技术并低估了项目
    • 您可以使用正式的估算,而主管人员则可以根据项目中要解决的问题来确定交货日期
      • 了解为什么高级管理人员宣布的截止日期导致灾难
  2. 需求不足
    • 您估计团队的技能水平有足够的时间来解决问题,但是您并没有所有要求

时间不足

很清楚为什么时间不足会导致项目失败,但是这里有一些具体的统计数据。

如果高管拒绝正式的商业估算:

由于业务原因而拒绝估算会导致生产率下降15%,质量下降21%

如果高管们要求的项目截止日期过于激进:

日程安排压力过大导致生产率下降16%,质量下降23%

需求不足

当您低估需求复杂性时,就会发生第二种情况。 定期启动仅收集一部分需求的项目。 项目开始后,会有一个疯狂的破折号来捕捉缺少的需求,即范围爬升(请参阅Shift Happens )。

项目计划通常基于最初的一组需求,并且当您发现缺少需求时,不会对项目截止日期进行调整。

无法估计需求变更以计划进度导致生产力下降16%和质量下降22%

为什么我们低估了需求的复杂性

人类被低估了复杂性。 例如,假设客户说他们想要一辆汽车,我们都知道汽车是什么,对吗?

看以下汽车:

质量,两张车图片

显然,这些汽车并不相同,建造它们所需的成本和时间也不相同。 抽象地,我们都了解汽车是什么,我们可以对此进行一般性讨论。 但是,当我们开始深入研究细节时,有许多问题需要回答,例如:

  • 汽车需要走多快?
  • 它需要坐几个人?
  • 您想要哪种燃油经济性?
  • 需要哪些安全功能?

在急于启动项目的过程中,我们跳过了需求流程,而许多问题都没有得到回答。 但是在某个时候,开发人员需要这些信息,以便他们可以解决他们的问题,并且需要收集需求。 项目经常会因为没有预算时间来收集足够的需求而导致时间用光。

技巧与复杂性

解决复杂问题所需的时间与团队的技能水平之间存在明显的权衡。 如果您从未见过问题,那么它很复杂,但是一旦您解决了问题,便总能看到解决方案。

迷宫

就像这里显示的迷宫一样,第一次可能需要花费大量时间来找出解决方案。 之后,您将直接进入解决方案而没有死胡同。

当收集需求时,分析师对领域的了解越多,他们错过需求或需求不一致的可能性就越小。 这消除了需求不一致的可能性,并增加了捕获足够的需求以启动项目的可能性。

当开发人员具有该领域的经验时,他们将花费更少的时间将需求分解为高级设计。 当他们对所使用的语言和库有经验时,他们可以将高级设计转换为低级设计并更快地编写代码。

因此,成功的软件项目认识到复杂性等于团队要找出他们不是主题专家的任何东西所需要的时间。

复杂性,技能与时间的权衡

  • 对于分析师
    • 这是关于了解主题并确保收集足够的一致要求
  • 对于开发商
    • 这是关于了解高级设计的主题,以及了解实现的语言和库
  • 对于项目经理
    • 这是关于了解团队的能力,并确保为他们安排足够的时间来解决所有问题
  • 对于IT主管
    • 这是为了了解任何给定的项目团队都需要足够的时间来解决问题,而不需要冒行政压力来任意缩短项目

参考文献

  • 琼斯,雀跃。 评分和评估软件方法,实践和结果 。 2008。

翻译自: https://www.javacodegeeks.com/2016/08/avoid-underestimating-complexity.html

这篇关于如何避免低估复杂性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/381684

相关文章

如何来避免FOUC

FOUC(Flash of Unstyled Content)是指在网页加载过程中,由于CSS样式加载延迟或加载顺序不当,导致页面出现短暂的无样式内容闪烁现象。为了避免FOUC,可以采取以下几种方法: 1. 优化CSS加载 内联CSS:将关键的CSS样式直接嵌入到HTML文档的<head>部分,这样可以确保在页面渲染之前样式就已经加载和应用。提前引入CSS:将CSS文件放在HTML文档的<he

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

Qt: 详细理解delete与deleteLater (避免访问悬空指针导致程序异常终止)

前言 珍爱生命,远离悬空指针。 正文 delete 立即删除:调用 delete 后,对象会立即被销毁,其内存会立即被释放。调用顺序:对象的析构函数会被立即调用,销毁该对象及其子对象。无事件处理:如果在对象销毁过程中还涉及到信号和槽、事件处理等,直接 delete 可能会导致问题,尤其是在对象正在处理事件时。适用场景:适用于在确定对象已经不再被使用的情况下,并且不涉及异步处理或事件循环中的

理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump

文章目录 0. 概述1. 问题背景2. 问题分析3. 解决方案:手动释放资源4. 深入剖析:为什么手动调用 `reset()` 有效?5. 延伸思考:如何避免全局对象带来的问题?6. 总结 0. 概述 在编写 C++ 程序时,使用全局或静态对象有时可能会导致不可预期的崩溃(如 coredump)。这类崩溃通常源于对象的析构顺序、资源的管理方式,以及底层资源(如 IPC 通道或共

真实案例分享:零售企业如何避免销售数据的无效分析?

在零售业务的数据分析中,无效分析不仅浪费时间和资源,还可能导致错误的决策。为了避免这种情况,企业必须采取策略来确保他们的数据分析工作能够产生实际的商业价值。本文将通过行业内真实的案例,探讨零售企业如何通过精心设计的数据策略和分析方法,借助商业智能BI工具,避免销售数据的无效分析,确保每一次分析都能为业务增长提供有力的支持。 文章中提到的BI数据分析工具分享给大家—— https://s.fan

避免Java程序中NullPointerException的技巧和最佳实践

Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预防胜于治疗”,对于这么令人讨厌的空指针异常,这句话也是成立的。值得庆幸的是运用一些防御性的编码技巧,跟踪应用中多个部分之间的联系,你可以将Java中的空指针异常控制在一个很好的水平上。顺便说一句,这是Javarevisited上的第二个空指针异常的帖子。在上个帖子中我们讨论了Java中导致空指针异

引发蛀牙、避免蛀牙食物大全

引发蛀牙、避免蛀牙食物大全 引发蛀牙的食物大全: 糖果 糖浆 糖果棒 巧克力 碳酸饮料 果汁 口香糖 蜂蜜 蛋糕 甜点 薯片 脆饼干 果酱 果冻 蜜饯 蜜饯果干 避免蛀牙的食物大全: 高纤维蔬菜 水果 坚果 种子 高钙乳制品 高蛋白质肉类 高蛋白质鱼类 绿茶 水 蔬菜汤 鸡汤 酸奶 酸奶制品 奶酪 红薯 土豆 面包和全麦面包 芝士

Java - 通过枚举避免大量 if-else

文章目录 Java - 通过枚举避免大量 if-else前提背景枚举实现1、定义枚举2、代码优化 拓展: Java - 通过枚举避免大量 if-else 前提背景 最近写代码有一个方法需要根据不同的 key 值往 Map 集合里存储 url,代码如下: public static void getUrl(String key, Map<String, String

Kafka 为了避免 Full GC,竟然还在发送端设计了内存池,自己管理内存,太巧妙了...

一、开篇引出一个 Full Gc 的问题 在上一篇文章中,我们讲到了 Kafka 发送消息的八个流程,并且着重讲了 Kafka 封装了一个内存结构,把每个分区的消息封装成批次,缓存到内存里。 如下图所示: 上图中,整体是一个 Map 结构,Map 的 key 是分区,Map 的值是一个队列;队列里有一个个的小批次,里面是很多消息。 这样好处就是可以一次性的把消息发送出去,不至于来一条发送一条,

什么是回流与重绘,如何尽力避免

回流(reflow)和重绘(repaint)是浏览器渲染页面的两个不同过程。 回流概念(reflow) 当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来。这个过程就是回流(也叫重排)。【重新排列布局,即打碎重组】 重绘概念(repaint)