Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
newsletter.beginner.dev
Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
1–10 of 49 posts
Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#2Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#3Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#4A good example of this would be avg's teardown of the Juicero, in which IIRC he described it as under-engineered despite it's expensive ultra durable components. The rationale being that rather than build a design suitable for the purpose of squeezing juice out of bags they built a machine that was specced for a much more demanding task, thus driving up costs and wasting materials. The implication being if they'd spent more time or care engineering it they wouldn't have poorly engineered over-specced components.
Perhaps a preferred term should be "well engineered" or "poorly engineered". A well engineered thing is something that is well suited in a number of different dimensions, including product capability, business needs, cost (and its impact to end users in terms of price), etc. That sometimes means ugly code, it sometimes means technical debt, but it always implies elegance at a higher level than just the code or components, but an elegance that encompasses a wholistic understanding of the context in which that code exists.
In the software world some examples of poor engineering might be using kubernetes for a small internal app that could run well on a single VM or container. Or, in a different context NOT using kubernetes for the exact same app, but in an organization where k8s is standardized, thus creating more inconsistency and driving up organizational complexity in order to reduce local complexity.
Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#5Realistically you should engineer for the problem you have or can reasonably expect you are going to have pretty soon. You can solve future problems in the future. I'm also not saying to write horrible unmaintainable code, but don't try to abstract away complexity you don't actually have yet. Abstractions and where to separate things should become apparent as you build the system, but it's really hard to know them until you are actually using it and see it come together.
Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#6Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#7But given the choice of over- vs. under-engineering, overshooting a modest amount absorbs the inevitable scope creep more readily.
Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#8Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#9If what you are building will be public, then: "over-engineer the concept, under-engineer the implementation". When you over engineer the concept, you start thinking about what might come next, you start seeing different applications on top of your solution. But deliver only what's needed now.
if what you are building is fully internal: "under-engineer, move as fast as you can so you have an idea how well to under-engineer next rewrite of the system"
Re: Striking the Right Balance: Over-Engineering vs. Under-Engineering Software
#10I appreciate the attempt to carve a positive definition of over-engineering. However I think most people will disagree that there are any pros to it as their definitions tend to be quite negative.
While I tend to agree that anticipating future needs is best avoided, there are situations where it can be done successfully. It’s good to recognize that these situations are rare before considering it. When building a system for a project where you have literally built the same thing before more than once and the team you’re working on lacks the experience to understand or appreciate the complexity of the problem, this is one area where you can get away with what appears like, “anticipating future needs,” but to you is, “solving the problem that will come up before it’s a problem.” There are times where you can avoid learning a lesson the hard way (again).
Update However one must also be mindful to avoid chasing ghosts. It can be detrimental to progress to anticipate problems you’ve encountered before as, “the same as,” ones you’re facing now or to imagine they are there. Always good to pause and get a rubber duck session going to bounce your ideas off of before heading into the weeds.