Over the last year, I've been referring to my engineering principles quite regularly. I thought it would be worth writing them down here.
Define the Problem first
To identify a good solution, you must first be clear about the problem. Working on a solution without a problem can introduce complexity with little or no value. For best results, start with the business/user problems.
By having a clearly defined problem statement, we can validate possible solutions. By working in small increments, we can validate our idea early to avoid wasted effort. (Fail fast)
Keep it simple
Work in small increments, Take the most minor, most straightforward step possible so that you can learn something before taking the next step. What is the smallest step/s we can take to validate this hypothesis?
Tight Feedback Loops
Work closely with designers, optimise for tight feedback loops and short iteration cycles. The sooner you can get real users testing your solutions, the better.
Understand this happens at multiple levels, and you have multiple loops in play at any time. Keep them tight and fast.
As engineers, we trade in complexity every day. It's not always possible to avoid complexity entirely. We can minimise it by insisting any complexity introduced has to demonstrate it will add more user/business value, keeping unnecessary tech/requirements away from your code. Be boring.
Assumptions hide complexity - The best way to remove assumptions is to break a task down into smaller delivery units and make sure you have clear acceptance criteria for them. Keep breaking it down till there are no assumptions of concern.
Embrace the unknown
While this might seem at odds with removing assumptions, it's closely connected. By Acknowledging what we don't know, we remove assumptions from the process. We can then dedicate time to understanding and solving those problems in isolation.
Last responsible moment
Technology changes at a relentless pace, be it the external landscape or your internal stack. On big projects, it's often tempting to do some work up front to figure out the best solution. In reality, it's better done as close to the actual work to ensure the solutions are relevant.
To operate at scale, it's often necessary to separate concerns and have clear boundaries so people work independently. The risk is the pieces built-in isolation won't work in unison. You can mitigate this risk by always combining the different parts as often as possible.
As engineers, we never stop learning, which means there is always room for improvement. Actively seek it out and challenging assumptions around the status quo. It's vital that engineers feel empowered to bring about change.
I will try to keep this list up to date. Did I miss anything obvious? What are your engineering principles?
Please let me know on Twitter.