Here is a list of classic articles and books that have informed my thinking on software engineering.
This list does not include my list of (great) programming, philosophy or management books, but speaks more to understanding and managing software development on a higher level - as I believe most software endeavors succeed/fail before a line of code was written.
A note on learning:
Almost all I know and believe about software comes from experiences and observations in delivering software, but that does not discount the value in these tomes. I typically learn a fundamental principle by first observing a phenomenon in various environments, and then, when I come across a great study or article which clearly expresses and justifies the principle I get that “AHA!” moment where deep understanding is formed. E.g. seeing estimation inaccuracy occur 100s of times, and then reading Don Reinertsen’s description of variability in product developments gave me a big “AHA!”.
Too be honest, so much in software engineering isn’t obvious or intuitive and I initially miss the messages in books that were not pre-empted by my experiences (XP being a prime example).
Here goes:
Approach and principles:
- Managing the Development of Large Software Systems, Royce (1970) The paper that introduced waterfall gave a clear warning about its risk and showed (rudimentary) ways to introduce feedback
- The Mythical Man Month, Brooks (1975) *
- No Silver Bullet, Brooks (1986)
- The New New Product Development Game, Takeuchi&Nonaka (1986)
- Extreme Programming Explained: Embrace Change, Kent Beck (1999) *
- The Agile Manifesto (2001)
- Agile Software Development with Scrum, Schwaber&Beedle (2002) *
- Lean Software Development: An Agile Toolkit, Poppendiecks (2003)
- The Principles of Product Development Flow, Reinertsen (2009)
Building the right thing
- User Story Mapping, Patton (2014)
- The Lean Startup, Ries (2011) - to find out if we are building the right things often needs more than just detailed analysis, we need to experiment, but do it fast so that we don’t run out of time/money.
- Specification by Example, Adzic (2011)
- I need more on Interaction and User Experience design! **
Building the thing right
- Decomposing Systems into Modules, D.L. Parnas (1972)
- What is Software Design?, Reeves (1992)
- Refactoring, Fowler&Beck&Brant&Opdyke&Roberts (1999) - Code is design and design should be evolve
- Test Driven Development: By Example, Beck (2002) *
- Domain-Driven Design, Evans (2003) **
- Continous Integration, Fowler (2006)
- Clean Code, Martin (2008)
- Continuous Delivery, Humble (2010)
Being a professional developer
- Code Complete, McConnell (1993)
- The Pragmatic Programmer, Hunt&Thomas (1999)
- The Art of Unix Programming, Raymond (2003)
- The Software Craftsman, Mancuso (2014) **
People, teams, systems and environment (still have a lot of reading to do here!)
- Drive: The Surprising Truth About What Motivates Us, Pink (2011)
- The Five Dysfunctions of a Team: A Leadership Fable, Lencioni (2002)
- Peopleware, DeMarco&Lister (1987) **
- Leading Self-Directed Work Teams, Fisher (1993)
- Out of the Crisis, Deming (1982) **
- An Introduction to General Systems Thinking, Weinberg (1975) **
- Biomatrix: A Systems Approach to Organisational and Societal Change, Dostal (2005)
*Books I have to read again, because I didn’t realise their significance when I read it, and therefore didn’t absorb the content.
**Books I have only skimmed that are still on my must-read.
You are welcome to share this post on Twitter or follow me!