This is a thread about good software design.

— Because we need more of it, not less —

🧵👇
A fundamental characteristic of good software is its ability to change.

You can also call this "flexibility."

You want your software to be flexible, to bend under pressure.

This means that you can handle —with relative simplicity— any changes that come your way.

👇
Software is not static:

▫️Ideas evolve
▫️Complexity increases
▫️Users become more sophisticated
▫️Competitors show up
▫️Libraries get deprecated
▫️New technology becomes available
▫️Team members go. Others come

Change is the only constant you'll have to face at every step.

👇
Knowing the inevitability of change, always ask yourself:

— How long would it take to reverse this decision?

If the answer scares you, you should get back to the drawing table.

You want to ensure there's always a way to reverse course.

👇
A good design that provides the necessary flexibility is also called a "reversible design" (because you can reverse any major decision you made. Duh!)

Achieving reversibility is about abstractions, decoupling, reducing duplication, among other good practices.

👇
Finally, building flexibility into your code comes at a cost. You need to find the proper balance and decide how much you want to invest in your future.

(Hi YAGNI folks!)

As a rule of thumb, try to stay away from the extremes: neither too much nor too little flexibility.
You can follow @svpino.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled: