应用于软件的“过度工程”是什么?

时间:2009-06-16 12:19:35

标签: terminology definition

我想知道应用于软件开发的术语“过度工程”的定义是什么。在软件设计讨论中,这个表达似乎经常与“过度的未来证明”结合使用,并且很难确定更精确的定义。

19 个答案:

答案 0 :(得分:50)

与大多数答案相反,我不相信“目前不需要的功能”是过度工程化的;或者它是问题最少的形式。

就像你说的那样,最糟糕的过度工程通常是以未来发展和可扩展性为名 - 并且完全相反:

  • 空的抽象层最多是不必要的,在最坏的情况下会限制您对底层API的狭隘,低效使用。
  • 代码散落着指定的“扩展点”,例如受保护的方法或通过抽象工厂获得的组件 - 当你必须扩展功能时,这些都不是你真正需要的。
  • 使一切都可以配置为“避免硬编码”,结果是配置文件中的(复杂的,容易出错的)应用程序逻辑比源代码中的更多(复杂,容易出错)应用程序逻辑。
  • 过度泛化:开发人员不是实现(技术上无趣的)功能规范,而是构建一个(技术上有趣的)“业务规则引擎”,它“执行”业务用户提供的规范本身。最终结果是一个专有(脚本或特定于域)语言的解释器,通常设计可怕,没有工具支持,很难使用,没有业务用户可以使用它。

事实是,最容易适应新的和不断变化的要求的设计(因此是最具前瞻性和可扩展性的)是尽可能简单的设计。

答案 1 :(得分:24)

与普遍看法相反,过度工程实际上是一种现象,当工程师得到“狂妄自大”并认为他们理解用户时就会出现这种现象。

我做了一个简单的图表来说明这一点:
alt text

答案 2 :(得分:19)

在我们考虑过工程设计的情况下,它一直在描述那些设计得如此通用的软件,以至于它忽略了它最初设计要执行的主要任务,因此不仅仅是难以使用,但基金上不聪明。

答案 3 :(得分:14)

对我来说,过度工程化包括任何你不需要的东西,以及你不会知道你需要的东西。如果你发现如果要求以某种方式改变,某个功能可能会很好,那么你可能会过度工程化。基本上,过度工程违反了YAGNI

答案 4 :(得分:8)

Joel on Software的讨论以

开头
  

为尚未存在的想象未来问题创建广泛的类层次结构,是一种过度工程,因此是坏的。

并与示例进行讨论。

答案 5 :(得分:8)

这个问题的敏捷答案是:每一段代码都没有对所请求的功能做出贡献。

答案 6 :(得分:2)

如果你花了很多时间考虑问题的可能后果,最终干扰解决问题本身,那么你可能会过度工程化。

“最佳工程实践”与“现实世界适用性”之间存在良好平衡。在某些时候,你必须决定,即使某个特定的解决方案从工程的角度来看可能不是那么“纯粹”,它也可以做到这一点。

例如:

如果您正在设计一个高中团聚一次性使用的用户管理系统,您可能不需要添加对令人难以置信的长名称或时髦字符集的支持。设定合理的最大长度并进行一些基本的消毒应该就足够了。另一方面,如果您正在创建一个将为数百个类似事件部署的系统,您可能希望在此问题上花费更多时间。

这完全取决于手头任务的适当努力程度。

答案 7 :(得分:2)

我担心精​​确的定义可能不可能,因为它高度依赖于上下文。例如,对一个显示闪闪发光的小马的网站进行过度设计要比核电站控制系统容易得多。冗余,过多的错误检查,高度仪表化的测井设施都是过度设计的一个闪闪发光的小马应用程序,但不适用于核电站控制系统。我认为你能做的最好的事情就是在你为应用程序的目的而为你的功能应用过多的开销时感觉到。

请注意,我会区分镀金和过度工程。在我看来,镀金创造了一些没有被要求且永远不会被使用的特征。过度工程更多的是通过对代码进行编码检查或对简单任务使用过多的设计来为应用程序构建多少“安全性”。

答案 8 :(得分:1)

我的粗略定义是“提供满足要求规范所需的功能”

答案 9 :(得分:1)

对我而言,任何可以为代码添加更多脂肪的东西。肉将是任何代码将根据规范完成工作,脂肪将是任何代码,将以增加更多复杂性的方式膨胀代码。程序员可能一直期待未来的功能扩展;但它仍然很胖。

答案 10 :(得分:0)

免责声明#1:我是一名大学生。我不知道代码。我一直在读这个网站。这是我的第一篇文章。

有趣的是,我的老板刚刚告诉我,我过度设计了一个新的软件产品,我们正计划进行指导(目标市场人力资源部门)。所以我来到这里查找这个词。

他们希望现在可以出售一些东西,重新使用现有的工具。如果它不允许我们谈论的一些灵活性,我会情不自禁地坐下来思考,减少注册,降低保留率。主要是,有一个猴子可以使用的高度可视化的UI。

他说我们可以计划未来的阶段来改进产品,尤其是用户界面。我们当前的客户正在等待我们仍未做的“未来改进”。他们需要它,真正需要它。

我正在辞职,所以我没有退缩。

但我的定义是.............确保它尽可能少,尽可能便宜,并且仍然可以通过你说的那样。除此之外是过度工程。

免责声明#2:这个网站帮助我完成了下一个工作,实现了一个更可配置的软件。

答案 11 :(得分:0)

我认为您的问题的最佳答案可以在this other qestion

中找到

答案 12 :(得分:0)

  

当你的设计实际上使事情变得更复杂而不是简化事物时,你就是过度工程。

更多相关内容:

http://www.codesimplicity.com/post/what-is-overengineering/

答案 13 :(得分:0)

这与我对"The simplest approach is always the best approach"的有争议的编程意见有关。

答案 14 :(得分:0)

过度工程只是创建一个功能,质量,通用性,可扩展性,文档或任何其他方面的产品。

当然,您可能在特定项目之外有要求 - 例如,如果您预见到将来会使用类似的应用程序,那么您可能会根据成本增加对项目特定要求的可扩展性要求。

答案 15 :(得分:0)

过度生成意味着根据需求列表构建和设计具有比实际应具有的更多组件的应用程序。

过度使用和创建可扩展应用程序之间存在很大差异,可以根据需求的变化进行升级。如果我能想到一个例子,我将编辑帖子。

答案 16 :(得分:0)

Quoting from here:“......当你实际需要它们时,实施一些事情,永远不要预见你需要它们。”

答案 17 :(得分:0)

我认为它们与Gold plating相同并被Golden hammer击中:)

基本上,您可以坐下来花费太多时间尝试完美设计,而无需编写一些代码来查看其工作原理。任何敏捷方法都会告诉你不要事先做好所有设计,只是创建设计块,实现它,重复设计,重新设计,再去等等......

答案 18 :(得分:-1)

敏捷编程的美妙之处在于,如果你做得对,就很难过度工程。