Main illustration: Jason Yim
Clear guiding principles are the best way to scale a team while keeping them aligned. Without a set of principles, organizations begin to fracture.
One team heavily believes in Big Design Up Front, another follows Lean start-up, a third tries to instil PRINCE-2, and before you know it your process is a patchwork quilt of all sorts of conflicting ways to build software.
Principles are a way of encoding successes, helping to repeat the behaviors that led to positive outcomes and avoid the previous behaviors that led to mistakes. At Intercom, we push ourselves to share and refer to our principles a lot. We also update them every 1-2 years to ensure they’re still representing our best ideas and still guiding us to results we want.
“Everyone who works on our product inherits the three top-level principles and then also the principles appropriate to their domain”
We have three top-level principles for how we build software, five product design principles, and five engineering principles. The idea is that everyone who works on our product inherits the three top-level principles and then also the principles appropriate to their domain.
We hope you find them useful as you consider the sort of behaviors you want to codify and encourage in order to ensure your own future success.
Note: no principle is a truism. The opposite of a principle should itself be a principle, so things like “Build good software,” “Don’t ship bugs,” “Great design matters,” and so on are, in my opinion, bad principles, because no company would ever adopt the opposite one. As such, if you’re tempted to ⌘C and ⌘V a principle here, take a moment to consider all the alternatives you’re saying no to.
1. Start with the problem
Start by deeply understanding the problem we’re solving. Continually evolve this understanding, and persistently return to it to ensure you haven’t veered off course.
2. Think big, start small, learn fast
Think ambitiously, but know that big things have small beginnings. Always try to find the smallest coherent solution. Starting small enables you to ship sooner. Find a way to quickly learn whether or not you’ve solved the problem.
3. Deliver outcomes
Shipping is the beginning, not the end. Plan to iterate, fight for adoption, and keep pushing to have customer and business impact.
Product design principles
Product design principles are intended to help us make decisions when faced with competing options that seem valuable along different dimensions.
1. Connected, modular systems
2. Opinionated by default, flexible under the hood
We optimize our designs to feel simple and opinionated by default, but progressively reveal power and flexibility.
3. Follow fundamentals
We favor established best practices and avoid overly clever, non-standard design patterns.
4. Make it feel personal
Our designs reflect that we’re connecting real people, not entries in a database.
5. What you ship is what matters
Our deliverable is not the design file. We take pride and ownership of what we ship.
Engineering principles provide guidance on day-to-day technical decision making and insight into how previous decisions have been made. They describe how we behave when we excel as engineers.
1. Shape the solution
We never blindly execute on requirements defined by others. We deeply understand the value of our work, and help design solutions which efficiently deliver that value.
2. Be technically conservative
3. Build in small steps
4. Keep it simple
Complexity is the enemy of our ability to move quickly. We will trade off performance, financial cost, and perfect abstraction in order to keep a solution simple.
5. Work with positivity, pride and love
Software engineering isn’t just about the cold logic of computers. It is an inherently collaborative discipline where great things are only built by high functioning groups of humans.