Riding Your Ride

In Building Microservices: Designing Fine-Grained Systems, Sam Newman writes:
The architecture of a real-world running system is never clean or pristine. If you want a “clean” architecture, by all means laminate a printout of an idealized version of the system architecture you might have had, if only you had perfect foresight and limitless funds. Real system architecture is a constantly evolving thing that must adapt as needs and knowledge change. The skill is in getting used to this idea.
Experience motivates the design and maintenance of software that adapts easily to change. And, sometimes experience allows us to be okay with putting things on the technical credit card when faced with demanding schedules. The implementation may be sub-optimal but functional for now, but with thought out interfaces, these implementations can be improved later without dependents knowing.
In an effort to develop and maintain skills, I read the following book over the last four quarters:
Designing Data-Intensive Applications introduces concepts underlying database systems and leads readers through the general implementation of complex distributed systems. As is typical for technical books, it is information dense, and it requires time and deliberate focus to examine concepts it details. I feel that I have read Designing several times as I have had to repeatedly reread sentences, sections, chapters, and parts with its many forward and backward references. Despite its frequent disruptions to the reading experience, I highly recommend software architects and engineers read Designing before they undertake the design and implementation of distributed software systems.
Prioritize the attainable over that which is merely possible. After all, as a famous proverb states, one in the hand is worth more than two in the bush.