David Farley
Surprises, misunderstandings, and mistakes are normal in software development because it is an exercise in exploration and discover, so we need to focus on learning to protect ourselves from the missteps that we wil inevitably make along the way. (Farley 2022, 47)
Errors introduced in coding or design were often not discovered until after the development team had rolled off the project and handed maintenance on to some production support team. Extreme Programming (XP) and its application of TDD and CI spun this on its head, placing testing front and center in the development process. This reduced the feedback loop to seconds, giving almost instant feedback on mistakes that, in turn, could, when done well, eliminate whole classes of bugs that, in the absence of TDD, often made it into production. (Farley 2022, 64)
Continuous delivery is a high-performance, feedback-driven approach to development. One of its cornerstones is the idea that we should produce software that is always ready for release into production. This is a high standard and demands a very high frequency and quality of feedback. (Farley 2022, 65)
The independence of microservices is a significant benefit, but also a significant complication. Microservices are, by definition, independently deployable units of code. That means that we don’t get to test them together . (Farley 2022, 66)
One of the defining characteristics of high-performing teams in software development is their ability to make progress and to change their minds, without asking for permission from any person or group outside of their small team. (Farley 2022, 74)
Striving to be able to work incrementally then is also striving for higher-quality systems. If your code is hard to change, it is low quality, whatever it does. (Farley 2022, 79)
Being sceptical and checking our ideas is work, but it is the only way to make real progress rather than proceeding on guesswork, supposition, and hubris. (Farley 2022, 88)
Working so that our software is always in a releasable state, the idea at the heart of CD is an idea that maximizes the feedback that we can get on the quality of our work and one that strongly encourages us to work in smaller steps. This, in turn, means that we are pretty much forced to work iteratively and incrementally. (Farley 2022, 97)
Whatever the time pressure, writing bad code is never a time-saver! (Farley 2022, 106)
The code in a module is short enough to be readily understood as a stand-alone thing, outside the context of other parts of the system, even if it needs other parts of the system to be in place to do useful work. (Farley 2022,106)
Being “idiomatic in language X” is less valuable and less important than high-quality in design. Knowing the abtruse details of “API Y” does not make you a better software developer; you can always look up the answer to that kind of question! (Farley 2022, 108)
If our tests are difficult to write, it means that our design is poor. We get a signal, immediately. (Farley 2022, 109)
For any given test or evaluation, I should expect, given the same version of the software under test, to see the same results every time I run it, however many times I run it, and whatever else is going on when I run it. (Farley 2022, 112)
The real root cause of a lack of determinism in computer systems is concurrency. (Farley 2022, 113)
A system is not modular if the internal workings of adjacent modules are exposed. (Farley 2022, 116)
The most scalable approach to software development is to distribute it. Reduce the coupling and dependencies between teams and their products to the degree that each team can, independently, create, test, and deploy their work with no reference to another team. (Farley 2022, 117)
We know that just adding more people to a team does not make that team go faster. (Farley 2022, 119)
So if we want our organizations to be able to scale up, the secret is to build teams and systems that need to coordinate to the minimum possible degree, we need to decouple them. Working hard to maintain this organizational modularity is important and one of the real hallmarks of genuinely high-performing, scalable organizations. (Farley 2022, 119)