Shipping code fast is key to delivering a successful software product. First-mover advantage is critical in many domains, and with the easy availability of cloud infrastructure, open source components, and CI/CD practices and tools, it's never been more possible to go fast.
However, increasing speed at the cost of everything else ("move fast and break things") is untenable beyond a certain point. When shortcuts are taken, tech debt accumulates, slowing development over time. Furthermore, the occasional bug or incident must be tolerable -- a non-starter in domains where availability is paramount, e.g. cloud infrastructure, or application security products.
This seems at first glance like a fundamental tradeoff, but doesn't have to be: if processes and tools evolve to support rapid development, we can maintain quality while shipping on time. The key is being extremely deliberate with our testing efforts and continuously optimizing them for efficiency.
In this book, we introduce four Test Lean principles that can enable you to deliver high quality software:
Complete automation over manual testingDeployments and infrastructure should be fully automated and transparentAny engineer on the team should be able to deployAutomated quality gates (static analysis, security scans, passing tests) should be kept relevantBreak builds to uphold standardsConstant reevaluation of pipeline speed and quality gate relevanceNo manual testingNo manual gatekeeping (except for code review)Early error detection over end-to-end testingQuality cannot be "tested in"Testing must be interleaved with developmentAn ensemble of testing techniques is more effective and efficientAll developers are involved in writing and maintaining testsMonitoring and recovery over exhaustive testingTesting only increases MTBF, which cannot increase availability beyond a certain pointReducing MTTR via monitoring is required for high availabilityExhaustive testing isn't a cost efficient way to increase qualityIncreasing confidence in delivery over bug findingNo amount of testing can show that a system is free of bugs. However, the purpose of testing in a commercial software environment is not to produce flawless software, but to increase confidence in delivery: to give us assurance that our software can not only evolve correctly, but work correctly in the hands of real users.To that end, we employ methods and tools to build bug free software, but are willing to compromise rigor when that would impede delivery.