The past couple of weeks have shown that Usable Software Design is an interesting topic to many people. From exploring it, to exchanging ideas and even applying the principles behind it, I think we live very interesting times.
Here’s a brief account on what happened:
Johan Martinsson applied the principles of Usable Software Design with a team. They came up with a very compelling team agreement:
Usable Software Design means to us that
- It is written for developers to read
- It is easy to find where to modify the code
- Any modification has a minimal ripple-effect
- It is easy AND fast to validate that we did the right thing
- We don’t have to do similar modifications in several places
You can read the whole story on his blog post Usable Software Design – A Federating Concept.
The Usable Software Design meeting of the Software Development Gang took place last week. The Gang is a closed group of advanced developers from Europe, counting about 20 people at this moment, invitation-only. We plan to gather every 3 months to discuss specific topics related to innovation in software development. This time, the group picked the topic of usable software design as the most interesting, and it turned out there’s a lot of work to do about it.
Many ideas were exchanged in the meeting, and here are some of them:
- A challenge to design usability is that we are missing a simple way to infer the dynamic behavior of software from its static representation. We can either make the design map the features (using namespaces, packages, or annotations) or we can keep running the software to get live feedback (if I’m correct, Smalltalk did this)
- Ease of navigation is mandatory for usable software design. Adi and Peter “CodeCop” Kofler have done some work to document “navigation smells“, code structures that make navigation difficult.
- Removing clutter is important for usability because it allows better understanding of code. For example, extracting everything that’s not core domain into libraries that are plugged in the main application. This is not a new idea, it’s used in domain driven design and in hexagonal architecture, but we identified it as an important part of usability as well.
- Usability requires modularization and clearly defined module interfaces. This includes: a clear API of any module (including libraries) and clear contracts. REST microservices seem better at this than the alternatives. On a personal note, I feel that using microservices shows that we failed as an industry at modularization using libraries. We should be able to design modules, define clear APIs and contracts and deploy them either as a library or service – whatever fits best.
- We might be missing types. Software design requires different types of design entities who have their own constraints. Think about MVC – there are at least three types of design entities (model, view and controller), each with their own constraints (don’t add business logic in the controller, only navigation logic). Yet, we’re representing all as classes. Shouldn’t we have a “model” (or “domain”) keyword that specifies a type of design entity that has capabilities and constraints? And, of course, the ability to create new types of such entities? Most design errors that I’ve seen had one major problem: too few constraints. One thing I’ve learned from code retreats is this: Constraints are cool! They help us focus and avoid many problems.
We discussed many more ideas related to development tools and linking requirements to code, and we’ll continue working on them bit by bit.
In addition to this meeting, many conversations happened on LinkedIn and google groups about Usable Software Design. This is very much a work in progress, so it’s great to see so many smart people contributing with ideas and constructive criticism. Please don’t hesitate to join the conversation.
I plan to discuss much more about Usable Software Design in the next few months. The first step is I TAKE Unconference 2015, where I will have a talk and a workshop on the topic. See you there!
Image attribution: https://farm4.staticflickr.com/3246/2941549171_b13ae3da48_o.jpg