Principled Speed

I joined Sigstr fairly early on its journey, and for the first time, I was at a place early enough to help set the philosophy and direction of the engineering group.

We had a VP at the time who was very big on principles, and forced us to stop and think about them from time to time.

Looking back, those principles I helped set and wrote down are one of the prouder moments of my career.

And I wouldn’t have done this with Robert’s guidance and push.

These principles also accurately reflect where we were at Sigstr at the time - geared around speed of delivery, experimentation, and trying to build a learning culture.

I also remember some painful scars around a few of these principles …

Here’s what I wrote down at the time, feel free to use it yourself.

I fully intend to copy-and-paste it as a starter kit should I be in that position again.

Team Engineering Principles

This is a living document. More will be added over time. Last updated: 8/27/18

  • Prefer boring over novel or clever.
  • Assume code is broken until proven otherwise.
  • Assume all input is malicious.
  • Premature optimization is the root of all evil.
  • When choosing a technology, pick the one you’re most comfortable with delivering business value in a timely fashion. When in doubt, or when needing to break tie, pick ones that more than one person on the team knows.
  • Don’t write your own logger. Concentrate on building things that deliver core business value and rely on libraries and third parties for commodity items as much as possible.
  • Everything should be able to be rolled back - whether through API versions, or more regularly, through feature flagging.
  • Once code has been reviewed, it is every team member’s job to get that code deployed into production as fast as possible.
  • Smaller is better - in tickets, in pull requests, in deployments, in services (maybe: Use bounded contexts and #team-platform principles as your guide here).
  • Smaller, more frequent deploys are encouraged.
  • One way or another, you’re going to be testing your code - either manually locally, in staging and in production, or through automated tests. It’s better for everybody involved - you, your coworkers, the business, our customers - if that testing is automated.
  • That said, automated tests do not replace actual confirmation that our work is correct.
  • Related to the above, when fixing a bug, write a failing test case first.
  • What we hand off to QA or UAT or customers is - to the best of our knowledge and efforts to confirm - correct and ready to be in production.
  • If a PR has no tests, a reviewer has every right to reject said PR at their discretion.
  • Work with empathy - for your coworkers, for your future self and for our customers.
  • First you make it work, then you make it fast, then you make it pretty.
Chris Vannoy @v