复杂点无回报。你怎么称呼


13

作为软件开发人员,我的主要任务之一是控制复杂性。

但是,在某些项目中,有时候复杂度级别变得如此之高,以至于达到某种“无回报”的地步。超过这一刻,您将永远不会比需要从头重写所有内容的时间更短地将项目恢复到可接受的复杂度。

这个时刻在程序员方言中是否有名字(类似于戈德温巨魔定律)?

- 编辑 -

对不起,如果我不清楚。我认为这个“时刻”没有正式名称,或者不是一个严肃的指标。我正在考虑xkcd中“鲍尔默峰”的精神。


1
我在您对问题要点的定义中看到了一个争议:...在更少的时间内,您需要从头开始重写所有内容,这意味着要重写项目的人足够好,或者至少比那些要重写项目的人好。首先造成了混乱;)
mojuba 2011年

1
我认为,在名称上没有达成共识的原因之一是它取决于谁在看代码。对于一个开发人员来说,看起来无可救药的复杂性或难以维护的事情,对于另一个开发人员而言似乎是非常合理的。在严重的情况下,我只是编译为带有“ ms”前缀的DLL,并说它来自Microsoft。

1
也许这样做可以:技术债务事件视界
PeterAllenWebb,2011年

Answers:


20

与其说是复杂性,不如说是可维护性问题。

这种现象被称为“技术债务”,一旦达到临界水平,该项目便即将破产。

这是你的意思吗?


感谢您的回答。我知道“技术部门”的概念。每个项目都有某种技术债务。我的意思是:当债务变得如此之高以至于您宁愿将项目丢给垃圾并重新开始时,您怎么称呼它?
Thibault J

3
我喜欢您所说的“技术破产”。它表明,就像在真正的破产中一样,您必须仔细查看哪些部分是可挽救的,哪些应该保留。也许真正需要的只是一些债务重组:)
Jaap

2
@Thibault J:我不认为该刻有一个特定的术语。更重要的是要意识到您是在那段时间之前还是快乐地生活还是不幸地过了这段时间。

1
@ Developer Art:...意识到,如果您在那个时间之前还是快乐的或者不幸地超越了它 -我认为这是对要点进行良好定义的关键:一个超出要点的项目是没有工程师可以做到的自愿接管。
mojuba

3
我喜欢“技术破产”一词。我也将使用您的定义。
Thibault J

16

“过度复杂点”在英语中称为:

哦,我的上帝,这是什么?

麻烦的是,这可能适用于实际上很简单的事物,但是以一种可怕的方式实现,使您有相同的反应。

因此,很难将非常复杂的东西与非常可怕的东西区分开。

但是:所有软件实际上倾向于发生的过程是这样的:

第1步:制定良好的规格,进行良好的设计,实施出色的东西。大家开心。

在第1步结束时,开发人员祝贺自己的设计具有出色的优雅性,并愉快地思考:“我在这里拥有美好的遗产,供他人日后添加,这将是美好的,世界将是一个美好的世界。更好的地方。”

第2步:进行一些更改,添加一些东西,包括新功能。步骤1中的体系结构使此过程相当轻松。[但是,糟糕的是,“关键因素”有所增加。]

在第2步结束时,开发人员祝贺自己的设计具有出色的优雅性,然后走开了开心的想法:“亲爱的,我很聪明,在第1步中做了所有这些津贴。这很好。我拥有美好的遗产在这里供其他人将来添加东西,这将是美好的,世界将变得更加美好。”

步骤3:进行更多的更改,添加更多的内容,添加更多的新功能,更改很多内容,实际上是在听用户反馈。

在第3步结束时,开发人员祝贺自己的设计具有出色的优雅性,并走了相当开心的想法:“该架构非常好,可以轻松进行如此多的更改。但是我有点不开心关于X,Y和Z,现在可以清理一点,但是!!!啊啊!!!我非常聪明,可以在步骤1中分配所有这些津贴。其他人将来会添加东西,这将是美好的,世界将变得更加美好。”

步骤4:与步骤3相同。

在第4步结束时:开发人员认为:“这些东西太好了,很难维护。它确实需要进行一些认真的更改。我真的不喜欢这样做。它需要重构。我想知道老板是做什么的会说,当我告诉他,这需要6周的时间,在此结束时,用户什么都看不到...但是通过这样做,我将再有5年的可口未来改装范围.... hmmm ..是时候去酒吧喝啤酒了。”

步骤5:需要进行大量更改。

在第5步中,开发人员互相说:“这段代码很烂。谁写的?他们应该被枪杀。它太可怕了。我们必须重新编写它。”

步骤5是致命的。在这里,关键因素变得非常糟糕,以至于代码不能再进行更多更改,而需要进行一些大更改。

步骤5的麻烦是希望将其丢弃并重新开始。这是致命的原因是“网景因素”。去谷歌它。公司此时处于DIE状态,因为重新开始意味着您从大约50%的假设而不是事实,150%的热情而不是知识,200%的傲慢而不是谦卑开始(“这些家伙是如此笨拙!”)。并且您引入了一堆新的错误。

最好的办法是重构。一次更改一点。如果架构有点累,请修复它。添加,扩展,改进。逐渐。在此过程的每个步骤中,都要进行测试,测试和更多测试。像这样的增量更改意味着10年后,当前和原始代码就像祖父斧头(“它有10个新的头部和3个新的手柄,但仍然是祖父的斧头”)。换句话说,没有太多共同之处。但是,您是逐步而谨慎地从旧变到新的。这样可以降低风险,并且对于客户来说,可以减少烦恼因素。


我敢打赌,如果您缩短步骤,您将获得更多投票。
Codism 2011年

我必须补充说,大多数企业不为此预算,因此重构总是太少太迟。要管理系统不断增加的熵,就要从第一天开始,为每一项工作分配预算(10%-20%)用于内部管理。这不是错误修正预算。预算支出由工程而不是管理,市场营销或销售决定。它仅用于排除开发产生的熵,并且随着产品接近使用寿命而减少支出。
mattnz

同意 管理层一直想修剪这种东西。有时您可以将其隐藏起来(将开发预算增加20%,以便进行任何操作,并在需要重构时-做到这一点)。
quick_now 2011年

1
在某些情况下,您确实无法重构。如果您有多个依赖于同一个糟糕的界面或数据库的不同的业务应用程序,那么您就不能很好地修复基础内容,而又不破坏依赖于糟糕基础的所有其他应用程序。在这一点上,您确实很困惑。
约翰·克罗马蒂

2

我同意,这一刻很难识别,可以通过适当的流程来避免。但是,问题在于如何称呼它。在实际经济学中,有一个“收益递减”的概念:在这一过程中,增加一种资源的投入会降低单位的整体利润。这当然适用于编码,甚至诸如抽象,重用之类的好东西也具有减少收益的观点。特定于编程的通用术语是“过度设计”。对于喜欢这样做的人,我喜欢乔尔(Joel)的术语“ 建筑宇航员 ”。


1

好的代码经常被误认为是带有新工具的新团队可以更便宜,更快,更可靠地完成它,只是发现

  • 复杂性在于非文档要求
  • 新工具比Flash网站承诺的更难使用
  • 新团队并不像他们以前认为的那样“热”。

可能您所描述的时间确实到达了一些代码库(我曾经这样认为)。我从来没有亲身经历过旧代码导致项目瘫痪或重写代码以保存项目的案例。

在这种情况下,我不包括使用度量来识别特定的有问题的模块或设计,然后将其剔除并更换的情况。


好吧,我已经看到项目如此艰巨,以至于他们的维护预算是最初开发预算的三到四倍。无论如何,我要寻找的术语不是“正式的”和严肃的事情,而是诸如xkcd中的“鲍尔默峰”之类的东西。对不起,如果我不太清楚。
Thibault J

但是它是怎么变得如此动摇的呢?如果是由于复杂的需求,糟糕的管理,过分乐观的工程师而导致的,为什么要改写它呢?
马腾兹

因为团队改写的内容与一开始撰写的内容不同?
Thibault J

1

这种理论上的“时刻”的真正问题在于,只有在事实发生之后才被人们认识。除非您的同事是精神病患者,否则对代码库的每次提交都必须相信这是对代码库的改进。只是回头看看随之而来的混乱,您可以看到您已经过去了这一“时刻”。

但我喜欢我们可以给它起个名字。您可以说:“绅士”,吸引了您的其他开发人员,“我们越过了可维护性Hellespont。给您的妻子发短信,让她知道您暂时不会再见到她了。”


“每次对代码库的每次提交都是基于对代码库的改进这一信念。” 看来我们从未在同一家公司工作过:)
Thibault J

@ThibaultJ-也许您的同事是精神病患者?
丹·雷

@Thibault J:我相信每次提交都是以对代码库的改进为信念的。当然,这种信念有时研究不充分,没有根据。
David Thornley,

在我的上一份工作中,我认为没有人相信它是对代码库的改进,因此没有任何维护承诺。
Bobby Tables

有时项目的要求可能会发生足够的变化,以强制用新设计替换,但是仍然可能需要对旧版本进行更改。如果大多数以前使用旧版本的用户都将使用新系统并且不再需要旧版本,那么生产满足新系统不适合的少数人需求的版本可能是完全合理的,即使使得该系统对于不再需要它的人来说变得不可用。
超级猫2014年

-1

我不知道是否有名字,但如果没有名字,我建议称它为“熔解点”


或借用另一个核词:临界质量。
约翰·克罗马蒂

-2

这不是一个非常有趣的问题。

确实,这是微不足道的。

它是如此琐碎,以至于我们已经开发出许多应对方法。

  1. 瀑布方法。许多人花费大量时间来审查需求和设计文档,以确保管理复杂性。

  2. 敏捷方法。更少的人花更少的时间讨论可以立即解决什么人的问题并向他们发布软件的问题。管理复杂性是因为每个人都专注于发布某些东西。

任何人唯一一次为“复杂性”而挣扎是因为未能遵循该方法并正确地管理自己的时间。

  • 在瀑布方法中没有详细的监督。他们没有被迫在需求,体系结构,高级设计或详细设计审查中审查中间工作产品。

  • 在敏捷方法中,没有冲刺截止日期或适当的用例优先级。他们并不专注于尽快将某些内容发布给用户。

应该通过设定目标来限制复杂性。

进行复杂的搏斗意味着目标设定不正确或未得到适当奖励。

没有“转折点”。如果复杂性管理某种程度上是一个问题,那么组织上已经有些问题了。


1
我不明白这一点。一个运行良好的项目极不可能达到无回报的地步,但并非所有项目都运行良好。无论如何,一些运行不佳的项目都会成功,而其他项目则会由于各种原因而失败,有时会达到无法回报的复杂性,有时甚至会失败。
David Thornley,

@David Thornley:这是我的观点。“没有回报的复杂点”不存在。这只是陈旧的不良管理。无需复杂的名称或规则。复杂性只是管理不善的征兆。并不是很有趣。
S.Lott

@ S.Lott:我认为它存在,尽管在管理良好的项目中不存在。那里有大量管理不善的项目,其中一些将进入复杂事件范围,而有些则不会。我真的认为将所有糟糕的管理放在一起是没有用的。
David Thornley

@David Thornley:我认为很难将糟糕的管理(导致可怕的复杂性)与糟糕的管理(导致所有人退出)区分开。我看不出一种方法来判断一个项目会变得太复杂还是太迟了或没有能力。
S.Lott

@ S.Lott:但是,每个人都退出或遭受重大健康问题的项目与复杂性太多的项目之间是有区别的。失败的方式有多种,对它们进行分类可能很有趣甚至有用。
David Thornley

-2

对于(大型)项目和代码,存在可视化和监视复杂性增加风险的方法。当合理地希望使用它们时,就不需要为不返回点指定一个新名称。(openHPI上有一个相关的MOOC:https ://open.hpi.de/courses/softwareanalytics2015/ )

结构复杂性是一个普遍的设计问题-不仅是大型团队的软件设计。可视化是结构复杂性管理的第一步。矩阵和有向图也可以用于此目的。

降低结构复杂性的一些方法是http://www.buch.de/shop/home/suche/?fq=3540878890

  • 模块化
  • 避免反馈循环
  • 三角剖分

此外,还有公理化设计的概念:https:\ en.wikipedia.org \ wiki \ Axiomatic_design \通过这种概念,可以避免由于不必要的复杂性而引起的可靠性问题。

因此,有很多方法可用。最后,因为一个项目足够大,决定考虑它们总是决定性的。


这不能回答问题。
绿巨人
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.