Simple and Easy
We generally want simple software and focus on this, but we also want easy software which is less focused on
Simple → Complex
is the dimension that describes how irregular and interconnected a system is.
Simple systems can be broken down into smaller pieces that are understandable in isolation.
If you make changes to one of those pieces, you don’t have to fear unexpected ramifications in parts not directly connected to what you’re operating on.
Complex systems are the exact opposite: you’ll need to keep in mind a lot of things and tread carefully.
Easy → Hard
is the dimension of how much energy and time it takes to successfully execute something.
Easy things generally require less preparation and can be done reliably even by inexperienced individuals.
hard stuff requires more effort and not everybody gets it right all the time.
complex things tend to be hard, while simple things tend to be easy
But this can shift very quickly
Building Abstraction
Every time you build an abstraction, you encapsulate a given amount of complexity, making it easier to use
abstraction makes it easy to use, but the complexity is hidden
Abstraction does not get rid of complexity or decrease it
abstraction is a step towards composing bigger systems without increasing complexity too much
With out abstraction, we would need to rewrite and write a lot to do stuff, this will lead to slow building of things and make things less economically viable
This is why we don’t write everything in assembly
Using higher level languages abstracts the assembly level language, but does not get rid of the complexity
none of these things further simplifies assembly code, but they do actively prevent it from exploding in terms of complexity
NOT ALL ABSTRACTION MANAGES COMPLEXITY
Abstraction is sometimes introduced just to make things easier.
ie introducing a new interface with the sole goal of making it easier to swap in and out a replacement for a componen
EASY IS BETTER THAN HARD
no reason to prefer hard over easy
The cheaper we can do it for, the more we can have, and the benefits compound over time
THE RULES OF ABSTRACTION
introducing abstraction has two main effects
Lowers difficulty by hiding some of the details. Fewer lines to write, fewer things to keep in mind and think about — or even to right out know.
Identifies a cohesive subsystem and draws a box around it. The box becomes then a tool that can be reused to build bigger systems, while keeping complexity down.
complexity management, is not trivial. It’s easier to lower difficulty rather than constrain complexity
easy software that encapsulates more complexity than it should.
Easy complexity
Causes all kinds of problems
called bloat
describing something that fails to manage complexity in a misguided effort to make things easy.
USING BLOATED TOOLS
being resource-hungry and needlessly slow.
Developers that over-rely on this type of tool get progressively caught in a form of lock-in where the tool removes them from the details of what they are doing (“the tool does it for me”), making them more productive, but at an unfair price
when you only approximately know one way of doing things, you will also be limited in the range of things you can do
This leads to finding fixes and hacks to make the tool work for the problem
Some will give up on the tool, after failures
Others will continue, but be affected with new releases that breaks their solution
choosing slow and unreliable tools will make you a slow, unreliable developer with a limited and quickly depreciating skill set.
when you can understand what you’re doing, troubleshoot problems, and in general be able to iterate quickly, then you will have a real opportunity for improvement.
NOT ALL BLOAT IS EVIL
the biggest number of that type of developers comes from different ecosystems where bloat is the result of hostile design
A reliable environment is a fundamental prerequisite for building competence.
important prerequisite is a feedback loop that allows you to quickly gauge the result of your actions.
Using bloated frameworks will prevent you from understanding the details of what you’re doing and cause your software to inherit bad traits such as slowness and unreliability,
It doesn’t matter how easy you try to make things: complexity is an almost radioactive source of difficulty.
Focus on value over time
Last updated