I originally wrote this as a series of posts in 2014 after working deeply with multiple Ruby applications. I decided to break out the content from my old blog into this more structured format with an independent life cycle. It’s been editted a bit to read more like a short book instead of a series of posts. I’ve not changed the technical content though. That means the examples and referenced libraries (like Virtus) are outdated. However the concepts discussed in this work are still valid, important, and ultimately useful any programmer who can internalize and act on these concepts.

I don’t intend to rewrite this edition since it is frozen in time. It is my thoughts, as best as I could put them, on software design. This work primarily focuses on applications but they’re only a small section of the wider spectrum of deployment pipelines, automation, and infrastructure. Those facets are not represented here. My opinions on software architecture have changed slightly since the writing but that hasn’t changed my adherance to the principles expressed in this work. I still apply them every day and that made me a better programmer.

If you’re more a a visual learner than I suggest you watch the video of my talk “Rethinking Application Architecture”. It covers all the same high level concepts with minimal code examples. You can get plenty of code examples and more technical context from the following chapters.

Good luck out there and happy shipping!

Adam Hawkins, 2018