June 1st, 2022 update

“When it comes to mastering a skill, time is the magic ingredient” — Robert Greene.

Hello again, my fellow phronesis-seekers.

As I step into the final month of Q2, I’d like to give a quick update about what’s to come for this next update of solidbook.

Next update scheduled for end of Q2

In the next update of the book, we cover Object Design (with Tests), Design Patterns, and Design Principles. In it, we strive to balance hands on exercises and projects with the regular no-nonsense, as-jargon-less-as-possible, non-pretentious, straight-to-the-point theory.

I’ve been digesting, practicing, and writing about object design since January this year. I intend to release these next three sections of the book by the end of June. That’s soon!

What’s next

Object & Responsibility Driven Design

Wow. What an illuminating, powerful, and humbling topic to learn as a software designer. Object Design (and the design method titled Responsibility-Driven Design) may very well be one of the most important subjects I’ve ever studied. It’s foundational to… nearly everything about software design.

If you’re on the front-end, Responsibility-Driven Design is the key to the first door towards understanding how to compose a reasonable client-side architecture.

More generally, RDD gives us a powerful understanding of the tactical patterns behind Domain-Driven Design, when to use design patterns, and why we have certain design principles.

However, one of my favourite parts of RDD is that it gives us an incredible frame of reality for how and when to write tests using the mockist version of TDD (ie: with test doubles — stubs, and mocks).

We cover all this and more in the upcoming Part V: Object-Oriented Design With Tests.

Design patterns

Design patterns are critical to the story of object design and RDD.

We use RDD to invent objects that adopt the roles necessary to meet the functional and non-functional requirements. While functional requirements are relatively straightforward to implement, what about non-functional ones? How do we invent the correct objects for these?

First, it starts by understanding what non-functional requirements are. While I recommend reading my recent article, non-functional requirements are about system-level properties — the behavior of the system as a whole (like maintainability, audit-ability, testability, scalability, speed, understandability).

The best way to make sense of this is to consider NFRs as two categories: evolution-based (making code easier to evolve) *or *execution-based (changing the performance qualities).

This is where design patterns come in.

Design patterns themselves are just generic blueprints of roles with predetermined responsibilities and collaborations. With distinct benefits and tradeoffs, we can get system level properties like speed, performance, or portability with the usual tradeoff of added complexity.

That’s how it’s done.

If you’ve completed reading the Part IV: Test-Driven Development Basics section, you’ll know that we can definitely solve a lot of functional design challenges by merely TDD-ing our way through them using the Transformation Priority Premise. However, it is highly unlikely that we’ll be able to meet a non-functional design challenge with TDD alone — this is where we need design. RDD and design patterns.

Knowing design patterns, we can actually work backwards. Pick a design pattern (or several of them) that we know gives us the properties we need and then integrate them into our designs.

In Part VI: Design Patterns, we learn about design patterns and practice developing this unique ability to design for non-functional requirements.

Design principles

Once we know how RDD and proper object-oriented design works, we immediately understand a lot of different design principles.

We suddenly know that objects should “tell, don’t ask”. They should “only speak to neighbours”. And we should “program against a contract/interface, not a concretion/implementation”.

If we revisit the famous SOLID principles but look at them through the lens of RDD, we improve our understanding even more.

Put bluntly, many of these design principles exist just to keep us from violating the laws of object-oriented design.

Design principles — like all abstractions — are shortcuts. Shortcuts to understanding. In this case, shortcuts to understanding the laws of good design. They keep our game on point the same way that gloves and chalk keeps professional bowlers and pool players on point, but they aren’t to be confused with real design ability. As you know, wisdom is achieved through action. That’s why we do the work first.

In Part VII: Design Principles, we learn the most important design principles so that we can keep our designs steady as we go.