When our options are unbounded, we freeze. Stand in front of a blank canvas with every type of brush and every kind of paint, and watch creativity die in the face of an endless expanse. Then limit to one brush. One color. A 1x1 canvas. The number of unknowns decreases. Do we paint the whole canvas in one, solid color? A bold, monochromatic slash? Do we attempt an intricate masterpiece that stretches the utility of our brush?
The limitations provide the ideas we need to find our way. When I'm lost, I search for new constraints.
Personal Constraints
When putting constraints on myself, I like to reference Steph Ango's thoughts on style. A personal style is a set of self-imposed constraints. We all have a style, whether we recognize it or not:
- I wear polo shirts, jeans, and black sneakers to work.
- Sunday through Thursday, I get in bed at 9:30PM.
- I record personal appointments in Google Calendar, tasks in TickTick, and notes in Obsidian.
When I wake up in the morning, I don't put active thought into what I'm going to wear — I pick from a limited set of clothes that match my style. I don't worry about missing appointments or how many tasks I have to do today. I know exactly where to go to find that information.
My style preserves energy. Now I can spend that energy on other things.
Group Constraints
Group constraints allow for asynchronous decision making. My team doesn't need me to be involved if the guidance is listed in our development standards. We don't need to meet if everyone is following the operating model — the work should speak for itself. We communicate when we need to collaborate.
If my team keeps coming back with the same questions, it isn't because they are poor listeners. It's because I haven't set the right constraints. I haven't been clear about what I do and don't want.
I often assess managers by how they handle constraints. Bad managers like to create constraints that give them control. They like to force decision making to become synchronous. When this type of constraint leads to poor results, rather than abandoning the constraint, a bad manager tends to blame the team.
Like personal style, a group constraint should lend itself to efficiency. If you feel like your team is in a flow state, you probably have the right constraints in place.
Design Constraints
When I introduce a design constraint, I'm also making a decision about what my system is going to be bad at. It can't be good at everything, or we'll never finish development — what can we remove? Design constraints tell developers what the vision is, such as file over app (similar to local-first software) or the infamous API Mandate set by Jeff Bezos. They make the mission abundantly clear. Changes to the system that fall outside of these constraints are quick to be rejected.
There are no meaningful design constraints that fit all systems. I like to collect constraints that have worked for other people, and see if they apply to the applications I'm working on. My current project — an enterprise knowledge management system — has several:
- Meta over Domain: Backend code should use metamodel abstractions over domain model definitions. This limits the scope of code change when the domain model evolves, which can happen often when pulling from multiple systems of record.
- Change over Object: Our database is an event store. History is a feature of the tool. Users can be spoken to in the language of objects, but our backend should speak in the language of events.
- Lifecycle over Use Case: We design experiences for the full process, not a single moment in time. What do we require to create a new object? When we edit four months later? When the changes made need to be audited? The user experience should respect all stages of the lifecycle.
- Agency over Agentic: We create features that increase user agency, then we consider introducing AI. Our human users should tell us what tasks they don't want to do — that's our opportunity to automate. AI is a solution, not a feature.
Note that this set of constraints is adjustable. I can introduce new constraints as time goes on, or remove them if they get in the way. A good design constraint serves the customer, a bad design constraint alters their experience in a negative way.
Wrapping Up
Constraints offer us direction, which leads to movement. If movement isn't happening, apply more constraints. Self-imposed constraints are just as valuable as those that occur naturally, and should be introduced and discarded with care. A good constraint eliminates the possibility of bad and costly decision making, which increases speed and preserves energy.
Impose limitations to increase the chance of success.