程序员有时会故意过分复杂化代码吗?[关闭]


26

在stackoverflow上似乎出现了很多次,人们(尤其是程序员)倾向于使问题的解决方案变得过于复杂,以至于解决方案比原始问题复杂得多?我无论如何都不是专家,但是很多时候我尝试使用最可行的最简单的解决方案(很显然这并非在任何地方都可行),但是我在建议人们认为工作上的简单解决方案方面取得了很大的成功忽略更复杂的解决方案?

对于程序员来说,这是正常的事情吗?....或者我只是在考虑正确的角度而已。


5
1.是的,我有时认为。2.是的,至少某些程序员至少在某些时候过度使他们的代码复杂化,至少在某些时候是有意的。3.案件结案。
Job

3
您是否曾经有人对您大喊:“您应该想到这一点!” 当您错过了最初的需求收集中没有提到的某些需求时?这就是导致某些事情变得不必要的复杂性的原因。
JB金

Answers:


18

显然,一些程序员渴望通过编写一些没人能理解的极其复杂的代码来展示自己的聪明之处。其他程序员则以如此高的水平开火,解决方案的复杂性是自然而然的演变。

我见过的最糟糕的代码是其中包含超过2000行代码的方法。毫无疑问,这段代码很复杂,但是它也很糟糕。

我认为一个好的程序员可以避免过于复杂的代码。这包括避免强迫设计模式适合真正不需要它的解决方案的诱惑。它还包括避免使用上帝对象,魔术按钮,过早优化,过早泛化以及其他反模式。

我不断地重构并寻找机会简化我的解决方案,因为复杂性的增长是有机的。像许多其他有机物一样,如果我们希望它继续可用,则必须对其进行修剪和修剪。我讨厌与过于复杂的解决方案进行交互,因为随着复杂性的增加,破坏代码的可能性也随之增加。

我认为可读性是代码维护中最重要的元素,过于复杂的解决方案几乎总是会降低可读性并增加维护成本。


32

我已经看到很多代码,它们比实际需要的要复杂得多,并且几乎总是出于以下三个原因:

1)由于过早的概括或试图预测从未出现的未来需求而进行了过度设计

2)开发人员想学习/试验他们以前从未使用过的新设计模式或技术,并且即使过分地想也想尝试一下。他们之所以这样做,是因为它使工作变得更加有趣,并且他们可以学习新的东西。

3)添加了功能和错误修复,但是当时未正确重构现有代码。它可能只是一小部分重复操作,也可以是将另一个标志参数附加到方法上,但是所有这些结果加在一起。有效地,添加了hack,并且由于所有代码的气味,所有事情变得很复杂不会很快。这是最常见的情况,通常是由于不知道更好或没有时间压力。


我害怕第二名。有了经验(和成熟度?),我现在倾向于克制自己……而是在家进行实验:)
Matthieu M.

我看到有人这样做1所有的时间,他们最终为自己创造的5倍多的工作
盟友

11

这绝对是平常的事。正如大多数书籍所说,优秀的开发人员知道如何保持简单。使用刚刚发现的新技术或“超酷”框架过于复杂,这太容易了,因此您开始寻找使用它的方法,而不是从问题的角度思考。

正如马丁·福勒(Martin Fowler)所说,那些学习新技术的人短期内会遇到以“技术”为驱动力的解决方案。


4
-1:正如大多数书籍所说,一个好的开发人员知道如何保持简单。-你绝对是对的。但是随后您暗示滥用新技术是使代码过于复杂的最大原因。你错了。相信我,这里有很多过于复杂的代码,它们与滥用新技术无关。
Jim G.

我到底在哪里暗示它是“代码过度复杂化的最大原因”?当然是一个问题,“嘿,我刚刚学习了模式X,可以在其中应用它”-Patternitus。吉姆,你真的在​​我口中说了几句话。
Martin Blore

4
“我把这封信比平时更长,只是因为我没有时间把它缩短。” -Blaise Pascal在这里也很适用。“复杂”通常是匆忙,懒惰或无能的编码的标志。
条例草案

@Bill有趣的是,从业务角度来看,这是对更复杂的代码的一个很好的论点-如果您付给固定的金额来实现某件事,并且花费额外的时间重构或缩短它,除非可以这样做第一次(谁可以?)对您来说,使已经在工作的代码变得不太复杂本质上是一种惩罚。
迈克尔

10

我不认为这对所有程序员来说都是正常的,但是我肯定已经看到很多程序员这样做。

我认为有些人认为有些人认为制作一件非常简单的事情“太容易了”,而这并不是他们技能的良好展示。因此,尽管这可能不是解决当前问题的最佳解决方案,但他们必须制定一个大型且复杂的解决方案,即说“看看我能做什么!”。


1
那就是我的看法。IE浏览器是否太简单,不值得使用?

@Mercfh我不明白这个观点。解决方案的难易程度与它的有效性有什么关系?
GSto 2011年

我在评论他的评论时说“是的,我同意”,有时程序员会认为“哦,如果太简单了,那就不是很好”。

7

我已经看到程序员经常编写几行代码来完成他们不知道该语言已经内置的任务。这不是完全有意的,但可以避免。


我见过程序员为每个字符串副本编写了一个循环。从未使用过对标准库函数的调用。(更糟糕的是,平台副本已优化为一次读取一个单词。)
BillThor 2011年

7

这取决于您所谓的“简单”。有些人将高度重构的代码视为“复杂”的,因为有更多的代码和多个调用图。但是,此代码更“简单”,因为它更容易进行更改。

我经常发现,大型功能在您需要进行更改之前看起来“简单”,然后很快变得复杂。

换句话说,在许多情况下,旁观者认为简单。


2
+1:太多的程序员不考虑这一点
Luca

5

问题是,如果您不能清楚地看到简单的解决方案(这是与同事进行讨论的地方),或者您过早归纳了概括。

换句话说,您对高级库函数进行了简单的循环,因为您认为无论如何您都将在下一个项目中使用它(除非您不会采用这种确切的形式)。这样做时间太长,您将拥有一个非常简单的核心,非常复杂的应用程序。

您可能还会发现您需要非常健壮的代码,并且所有健壮性默认情况下都使其变得复杂。不过,我认为这不是您的问题。


4

在某些情况下,提供干净/简单的解决方案可能只是很复杂。

有一些我不记得或无法找到的报价单:“一旦编写了所有需要编写的代码,代码就不完整,而只有剩下的要删除的代码才完成”

缺乏清晰度将阻碍人们清除所有多余物的能力。


4
另一个相关的引文是:“我会写一封简短的信,但没有时间。”
user16764 2011年

3
无法完美地实现完美,而重新获得者则可以完美地实现。”(“看来,达到完美无非是要添加更多的东西,而不是添加更多的东西。没有更多的东西可以删除了。”)–法国飞行员,诗人和工程师Antoine Marie Roger Vicomte deSaint-Exupéry,1939年(摘自Terre des Hommes(《风,沙和星星》一书))。
约尔格W¯¯米塔格

谢谢,看来我不知道真正的来历:-)很好。
Stephen Bailey

3

最好的工程师可以解决真正复杂的问题,并将其变成易于实施和易于理解的解决方案。听起来很简单,但是没有像这样的工程师/开发人员。实际上,没有像这样的人存在。实际上,大多数人的行为恰恰相反。它们处理简单的问题,使它们复杂到无法识别的程度。仅以我们的政客为例,他们可以设法解决简单的问题,并将其变成彻底的混乱。程序员在这方面没有什么不同。


3
哎哟! 我本来想给您+1,但后来我看到您对政治的类比,这充其量是很薄弱的。//是的-政治中存在很多混淆,浪费的动作,挥手和特殊利益,因此,帐单可能变得过于复杂。但是,过度复杂化是混淆,​​运动浪费,挥手和特殊兴趣的副产品。不是根本原因。
Jim G.

无论出于何种原因,对于该国的许多问题,都有非常简单的解决方案,但政客们选择使问题变得比他们需要的更难。我们认为这是由于金钱,权力或投票的缘故,但我也认为这很大程度上取决于能力。在这种情况下,我的立场是坚实的。
Dunk

1
@吉姆 是的,我同意你的观点……在我看来,政治解决方案中的许多问题都是政客,他们声称有一个简单的解决方案(他们的解决方案!)对一个真正复杂的问题却没有一个简单的解决方案。
迈克尔

2

就我个人而言,我从来没有刻意尝试使某个软件变得更复杂。但是,我已经完成了一些工作,并认为“哇,那太复杂了”,然后回到原处进行重构。某些人可能会看到此消息,只是认为它有效且足够好,因此无法对其进行重构。


1

据称一个聪明人说过,你应该使事情尽可能简单,但不要简单。同样的可能适用于代码。有时您必须使用某种被认为是复杂的技术(递归可能是一个很好的例子,它经常使初级程序员感到害怕)。

但是,总的来说,我认为复杂的代码通常是有机的。用简单的代码解决了一个简单的问题,然后扩大了范围并修改了代码,而没有过多的思考,随着时间的流逝,您会获得尝试覆盖新问题但实际上旨在解决其他问题的代码。它变成了各不相同的逻辑拼凑而成的被子。这样的代码通常看起来比问题所需的要复杂得多,但是之所以如此,是因为当时每个小的更改似乎都是使代码工作的最简单方法。

我不认为大多数开发人员会故意使代码变得复杂(尽管您确实会炫耀谁会使用某种技术来证明自己的技能),但我认为如果不进行积极地维护和重构,代码就可以通过这种方式获得成功。 。


令人惊讶的是,有多少系统以一个真正真正简单的内核开始,该内核几乎可以满足要求,但在许多不同方面都存在不足,然后最终增加了很多复杂性来应对许多差距,而如果设计稍微复杂一些,这些差距可以避免。考虑一下C的整数类型的简单设计以及它们所伴随的一些奇异复杂的规则。如果每种类型都有一个“应该推广”的选项,则名义上类型的数量将增加一倍(尽管与限定词之类的方法没有真正的区别volatile),但是……
超级猫

...本来可以大大简化促销/平衡规则。添加到promotable int中的不可促销的无符号short会产生一个不可促销的无符号short,无论是否与short一样大int。将promotable unsigned short添加到promotable int将产生一个int。添加相同大小的已签名和未签名的内容,或添加不同大小的不可促销的内容,将是错误的。预先增加了一点点复杂性,而下游的怪异案例消失了。
2015年

1

尚未提出的另一个原因是,人们可能会使交付的解决方案过于复杂,以确保您以后需要他们的服务来支持这些解决方案。换句话说:为了工作安全。


不确定为什么会这样,我遇到了一个人编写的超大型项目,该人创建了自己的框架,并且每小时仅从事此项目的工作就获得报酬。如果雇主惹恼了他,那么整个产品线将被搞砸。另一个开发人员要花几个月的时间才能完全理解代码,而“全知”的编码器要花几分钟才能更新他的意大利面条。
SSH

0

也许是经典错误的问题?

30.开发人员镀金。

开发人员对新技术着迷,有时会急于尝试他们的语言或环境的新功能,或者创建自己的实现,以实现他们在其他产品中看到的功能(无论产品是否需要)。设计,实施,测试,记录和支持功能所不需要的工作会延长计划进度。

  • Steve McConnell,快速发展。

0

是的,有时我们会使代码过于复杂以娱乐自己。大多数情况下,尽管人们认为代码过于复杂来自项目的无知或初级参与者。


1
-1将问题归咎于初级开发人员的高级开发人员可能不理解自己或他人工作的动机。如果初级开发人员很难遵循您的代码,那么它太复杂了。
布兰登

我要说的是,如果Jr开发人员发现代码难以理解,那就是代码的味道,实际上可能是代码太复杂了,但是您在这里使用的范围很广。实际上,这种代码味道可能只是存在,因为Jr开发人员需要帮助来理解一种先进的技术,而不是指责该技术本身。
P. Roe

-1

是的...而且我付出了太多的代价。

我的白板现在在最上方有一个星号声明,内容为

“如果这不简单,那是不正确的”

...每次我在白板上制作原型时,它总是引起我的注意。

这确实对我有用,因为我的复杂设计确实变得更加简单,这可以转化为更简洁的代码。

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.