|
- err towards not making decisions, especially ones you can't reverse
- only keep a policy if the benefit it brings exceeds its cost/waste
- hunt down slow-feedback loops. get to a YES/NO quickly
- talk to users, when you do, practice a healthy degree of skepticism
- have clear critical user journeys
- break down large CUJs into smaller ones
- measurements can be gamed so have a mix of quantitative and qualitative CUJs
- if you do measure CUJs, verify metrics are met
- finish features before starting new ones
- update backlog with current work-in-progress
- routinely work on bug fixes while doing feature work, especially of critical bugs
- if possible, reduce scope and/or extend deadlines if its overbearing
- start simple and iterate
- learn to say no
- don't multitask. if you must, limit it as much as possible
- use the best tooling, understand your tools: the underlying architecture, core language libraries, basic data structures and algorithms, loggers, debuggers, profilers
- replace hard to use libraries
- write fast and accurate tests. every commit should have tests.
- write fast and reliable builds. build every day
- make root cause analysis easy
- document your software. treat it like software
- use pair programming, especially between junior and senior engineers
- create an environment where team members can speak/share
- practice blameless postmortems
- practice conversation turn taking. explicitly ask quiet folks for input either in the meeting or later according to their comfort
- do synchronous face to face checkups
|