Continuous Design (Model-Minded Development)

I’ve become quite interested in how teams of developers collaborate to build software.

One thing I’ve noticed is that senior software developers can walk up to a whiteboard and give an impromptu talk on how their software works, explaining both the details and the broad strokes. Most importantly, they connect the specifics of this system to general architecture patterns, domain models, design patterns, development patterns, or programming styles.

If you’re a developer, you want to be that chalk-talk ready person. If you’re a team lead, you want a whole team of them. And if you’re a manager, you want to grow them as quickly as possible.

It’s surprising that modern software development processes do not focus on this aspect, instead focusing on delivering business value in the short term (weeks or months). Maybe that short-term focus on delivery is the best path to grow such developers over the long term, but I’m skeptical. I think it’s more likely that we must balance short-term and long-term objectives, and if we relentlessly focus on delivery then we get fewer chalk-talk developers.

I’ve been working on answering questions like these:

My belief is that the use of models is central to answering the questions. We use models to amplify our own cognitive abilities and to coordinate our actions with others.

Models do not always get the attention they deserve for a few reasons:

When I see chalk-talk developers explain how they solved a problem, I see them explaining how they wove together models of the problem domain and of the solution, reusing existing ones and innovating when necessary. The arguments they make have the form “you can see this solves the problem because …” and rely on elements in the models, not line 463 of a particular file of source code.

In many ways my ideas and beliefs here are nothing new – we’ve been talking about using models in software development as long as we’ve been coding, but attention to the topic waxes and wanes. Good modeling ideas are often discarded when the technology that carried them becomes unpopular.

In an effort to separate the durable good ideas about modeling from the transient carriers of them, I’ve coined the term Model-Minded Development and have re-used the term Continuous Design.

Model Minded Development generalizes across DDD, Design Patterns, architecture, TDD, and coding styles. The defining characteristic of senior software developers is their facility with Model Minded Development as it enables them to operate at an advanced level.

Essays

My essays in IEEE Software have been on the topic of Continuous Design. I suggest you look at this short summary, which explains the big picture and how the essays relate.

Talks

I’ve given a few talks on this topic and for now they are the best expression of the ideas. Start with these:

If you are still interested, this older talk pulls in more angles from psychology to motivate why models are helpful.

These are generated based on tags in the postings.