I am a big fan of NetObjectives training and their books. Their website offers a plethora of resources surrounding lean, agile, kanban and plenty of technical topics to support these frameworks and methodologies.
I was introduced to this book through a 1 hour free webinar that they held – Essential Skills for the Agile Developer Webinar. I attended the webinar because many of my teammates were trying to adjust from creating Big Design Up Front (BDUF) to developing and delivering the code in stages and evolving the design.
One of the main focuses of this books is identify what the authors call “Trim Tabs”. According to the book, they are “structures on airplanes and ships that reduce the amount of energy needed to control the flaps on an airplane or the rudder of a ship.” This relates to software development and design by identifying the corresponding trim tabs that we can utilize to provide the most understanding with the least investment. Additionally, these trim tabs allow the flexibility to easily change or refactor code at a later time. To me, this is the missing link that most architects/software developers fail to understand when migrating away from BDUF.
The book is broken up into 3 sections:
1. The Core Trim Tabs
-Programming By Intention: Taking a breadth first approach to breaking down a programming problem, the going back to filling in the details.
-Separate Use from Construction: Creating something separately from using it.
-Design Tests Up Front: Defining “test” aka what needs to happen call a feature complete
-Shalloway’s Law and Shalloway’s Principle: Preventing and removing redundancy.
-Encapsulate That!: Bundling logic and restricting access to allow for easier changes in the future.
-Interface Oriented Design: Separate responsibilities from implementation.
-Acceptance Test-Driven Development (ATDD): Move testing before development to reduce rework and waste.
2. General Attitudes
-Avoid Over- and Under-Design: finding the right balance with design.
-Continuous Integration: Integrating often to reduce feedback and avoid merging pain.
3. Design Issues
-Commonality and Variability Analysis: Identifying the correct entities within the problem domain.
-Refactor to the Open-Closed: What is open-closed and how to get there.
-Needs versus Capabilities Interfaces: Discover how to discover strong interfaces.
-When and How to Use Inheritance: How to properly use inheritance.
None of these concepts are new. Most software developers have learned about them or used them in the past. These concepts are also not specific to agile and are equally good practices that all developers should know and utilize, even on waterfall projects. My favorite part about this book is the thorough explanation of each topic, along with detailed snippets of code and/or examples for the reader to follow along with. One of the largest problems I have when I would explain these concepts to developers in the past was not having useful explains to help them understand the theory. I found this book to be a consolidated list of topics every developers should know and implement and is organized in such a way as to be read through or used as a reference. I would high recommend Essential Skills for the Agile Developer to all developers and definitely to anyone who is trying to transition from waterfall to agile development.