Google-apps
Hoofdmenu

Post a Comment On: C0DE517E

"Over-engineering (the root of all evil)"

11 Comments -

1 – 11 of 11
Blogger Unknown said...

Great article! (feeling the pain right now)

one minor thing: " ... chances are that now many of your programmers are very familiar with this system" i guess you meant UNfamiliar?

October 27, 2016 at 9:58 AM

Blogger DEADC0DE said...

Thanks for the correction & the compliments. Fixed.

October 27, 2016 at 12:34 PM

Blogger Changmin said...

It's so great!! Thanks a lot~

October 27, 2016 at 7:47 PM

Blogger okoz said...

Wonderful article!

My favorite part,

"I don't believe that you can create systems that are extremely wide, where you have both extremely high-level concerns and extremely low-level ones, jack-of-all-trades."

I recently had this realization and being able to stop constantly thinking that there is a "best" generic solution has been very freeing.

October 28, 2016 at 7:54 AM

Blogger Unknown said...

Good article, there should definitely be more discussion around how to become aware of over-engineering and how to avoid it.

As you mentioned OE is more pronounced in junior developers. I feel for more experienced developers, OE is often a symptom of what The Mythical Man-Month described as the Second System Effect.

"The second-system effect proposes that, when an architect designs a second system, it is the most dangerous system they will ever design, because they will tend to incorporate all of the additions they originally did not add to the first system due to inherent time constraints. Thus, when embarking on a second system, an engineer should be mindful that they are susceptible to over-engineering it." (https://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_second-system_effect)

November 6, 2016 at 8:18 AM

Blogger jul said...

Hum, the article left me flabbergasted with is definition of over-engineering that totally is a symptom of the problem in so called Computer Science.

Over engineering used to describe how in front of not yet totally discovered physical law (hence hard science) how aeronautical industry was applying factor of safety.

For instance if a resistance for a pressure of x N/M² was expected for an element, it would be applied a «safety factor» of 1.5, namely designed to stand a 1.5 * x pressure higher than the expectation. Just in case we made a mistake of 40% in the modeling.

The S in computer Science is totally close to the S in BS: the over-engineering in CS would be to make server able to handle 1.5 times the connections/sec more than expected.

The definition here of over engineering are about decision made without prior knowledge, nor even close to the real situation data or feedback from actual situations. It is not even close to over-engineering, it is alter-engineering or religion at best.

The truth is in CS there no modeling, no thinking, no math involved. Just «artistic» intuition applied for building stuffs in some academic ways even when we have hard evidence it does not work.

The article is all about in its premise, development and conclusion about the lack of rigor and science in CS.

Which, weirdly enough by a very lucky «two wrongs may make a right» does make a point. But in a very twisted way.

November 15, 2016 at 12:16 PM

Anonymous Anonymous said...

Very good article indeed. I do want to add something related to the "Premature Optimisation is the root of all Evil":
http://ubiquity.acm.org/article.cfm?id=1513451
This marvellous article touches the topic of the misusage of that statement and how something taken out of context (historical context) can do more harm then good.

November 20, 2016 at 3:03 PM

Blogger DEADC0DE said...

Julien - computer science is different than engineering in the physical world because CS is deterministic, so you can't build redundancies like you can in mechanical engineering - I agree with you that "over-engineering" is maybe not the best term as that had some positive connotations in some realms, but I think it's very clear to programmers.

Regarding your critique of computer science, I think you mean "software engineering", really, the two things are different. CS is math, no more and no less, in my opinion, one of the purest forms of maths as it deals with the logic and formalisms that define maths itself (at least if you're not a Platonist) among other, more "mundane" things (like algorithmic complexity and so on). CS has no problems at all, it's perfectly sound and perfectly rigorous.

Software Engineering is indeed more soft and squishy, but it's not BS, or at least, it -shouldn't- be. It should be a science like all other soft sciences, based on people and their behaviors. Unfortunately often it isn't and it's taught dogmatically without any solid experimental backing, I agree. But there are lots of people that are doing good work to improve that, to be fair.

November 29, 2016 at 11:50 AM

Anonymous Merlyn said...

> I don't have a universal methodology for evaluating return on investment ... [once cost/benefit known]

It's task/domain-specific, as you pointed out.

Maybe decide big-picture prioritization weights up front, and get everyone on the same page with them. Reassess them or figure out exceptions to them if and when needed.

Then, instead of individuals having to make hard calls while coding and solo, could decide in a prioritization/triage meeting.

I assume the duration between "time to first identifying a task" and "time to having to ship code" is long enough that the cost/benefits can actually be assessed and escalated, as you implied by "the costs and benefits of a given choice are understood".

... says the Project Manager in me

May 18, 2018 at 10:16 PM

Anonymous Anonymous said...

The last point about humans being more important than technology is extremely important. The economics of human psychology are far more difficult to evaluate than even the already opaque costs of engineering practices.

If there's such a strong drive for over-engineering and clean code, to the point where we recognize it as a problem, we should ask ourselves if the real benefits are simply different from the touted benefits.

Suppose you have a codebase that is considered "ugly" yet it simply does the job, problems are fixed with relative ease and spending effort on cleaning it up would be economically irrational.

Nevertheless, this is the codebase that every developer dreads to touch, that gives them a feeling of unease, that scratches their pride, their ego. This is the codebase that makes developers feel worse about their job and about their company and it'll be one of the points of consideration when they decide to switch jobs.

Since these are all fundamentally *irrational* reasons, they cannot be countered by rational arguments as presented in this blog post. Letting your developers do some cleanups, refactorings and re-designs (*their* choice, *their* pain points) can be very beneficial to morale, while by any "hard" metrics they are a complete waste of time.

March 30, 2019 at 9:24 AM

Anonymous zenfrog said...

I experience exactly what Anonymous just said.
I feel the uneasiness of dealing with bad written code, even when it does the job. I think my ego just needs some gratification in cleaning it up, and doing it actually is very beneficial.
Nonetheless I'll think more next time trying to figure out if I'm being overkill or not in my design.

March 12, 2020 at 7:20 AM

You can use some HTML tags, such as <b>, <i>, <a>

Comment moderation has been enabled. All comments must be approved by the blog author.

You will be asked to sign in after submitting your comment.
Please prove you're not a robot