What is “over-engineering” as applied to software?

2019-01-21 23:16发布

I wonder what would be a good definition of term "over-engineering" as applied to software development. The expression seems to be used a lot during software design discussions often in conjunction with "excessive future-proofing" and it would be nice to nail down a more precise definition.

19条回答
Lonely孤独者°
2楼-- · 2019-01-21 23:31

Over-engineering is simply creating a product with greater functionality, quality, generality, extensibility, documentation, or any other aspect than is required.

Of course, you may have requirements outside a specific project -- for example, if you forsee doing future similar applications, then you might have additional requirements for extendability, dependent on cost, that you add on to the project specific requirements.

查看更多
\"骚年 ilove
3楼-- · 2019-01-21 23:34

Contrary to popular belief, over-engineering is really a phenomena that appears when engineers get "hubris" and think they understand the user.

I made a simple diagram to illustrate this:
alt text

查看更多
狗以群分
4楼-- · 2019-01-21 23:41

When your design actually makes things more complex instead of simplifying things, you’re overengineering.

More on this at:

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

查看更多
倾城 Initia
5楼-- · 2019-01-21 23:41

The beauty of Agile programming is that it's hard to over engineer if you do it right.

查看更多
Explosion°爆炸
6楼-- · 2019-01-21 23:42

Over-engeneering means architecting and designing the applcation with more components than it really should have according to the requirements list.

There is a big difference between over-engeneering and creating an extensible applcaiton, that can be upgraded as reqirements change. If I can think of an example i'll edit the post.

查看更多
SAY GOODBYE
7楼-- · 2019-01-21 23:43

Contrary to most answers, I do not believe that "presently unneeded functionality" is over-engineering; or it is the least problematic form.

Like you said, the worst kind of over-engineering is usually committed in the name of future-proofing and extensibility - and achieves the exact opposite:

  • Empty layers of abstraction that are at best unnecessary and at worst restrict you to a narrow, inefficient use of the underlying API.
  • Code littered with designated "extension points" such as protected methods or components acquired via abstract factories - which all turn out to be not quite what you actually need when you do have to extend the functionality.
  • Making everything configurable to "avoid hard-coding", with the effect that there's more (complex, failure-prone) application logic in configuration files than in source code.
  • Over-genericizing: instead of implementing the (technically uninteresting) functional spec, the developer builds a (technically interesting) "business rule engine" that "executes" the specs themselves as supplied by business users. The net result is an interpreter for a proprietary (scripting or domain-specific) language that is usually horribly designed, has no tool support and is so hard to use that no business user could ever work with it.

The truth is that the design that is most easily adapted to new and changing requirements (and is thus the most future-proof and extensible) is the design that is as simple as possible.

查看更多
登录 后发表回答