About The Author
- Other Leanpub Books by Jason Roberts
- Pluralsight Courses
Introduction
- Why Keep Software Soft?
- Why Read This Book?
- Part 1: The Code
The SOLID Principles of OO Design
- The Single Responsibility Principle (SRP)
- The Open Closed Principle (OCP)
- The Liskov Substitution Principle (LSP)
- The Interface Segregation Principle (ISP)
- Dependency Inversion Principle (DIP)
Other Important Principles
- Keep It Simple Stupid (KISS)
- Don’t Repeat Yourself (DRY)
- You Aren’t Gonna Need It (YAGNI)
- Cohesion
- Coupling
- Law of Demeter (LoD)
Dependency Inversion Revisited
- Dependency Injection Containers
- An Example of Dependency Injection with Ninject
- Other Containers
- Why Use a Dependency Injection Container?
Some Useful Design Patterns
- Gateway
- Decorator
- Strategy
- Factory
- Chain of Responsibility
Readability - Writing Code for Humans
- Comments
- Naming Booleans
- Method Length
- Remove Unused Code
- Nesting
- Naming Variables and Parameters
- Whitespace
- Regions
- Magic Strings and Constants
An Introduction to Architectural Styles
- Client-Server
- Layered
- Message Bus
- Service Oriented Architecture
- Onion Architecture
- Event Sourcing
- Part 2: Testing
An Introduction to Unit Testing with xUnit.net
- Qualities of Good Unit Tests
- Testing Frameworks
- About xUnit.net
- Using xUnit.net
- Data Driven Tests
Test Driven Development
- Overview
- Example
- Practicing TDD
- Why TDD?
Faking It - Testing Code in Isolation
- Mock, Stub, Fake, Dummy, Test Double
- An Example of Faking
Auto Mocking
- Introducing Auto Mocking
- More About AutoFixture
- AutoFixture and xUnit.net Custom Attributes
Introduction to JavaScript Unit Testing
- Introducing QUnit
- Creating and Running QUnit Tests in Visual Studio 2012
- Creating and Running QUnit Tests in HTML
An Introduction to Automated Functional UI Testing for Web Applications
- Record-Playback Versus Coded Automation
- An Example of Coded AFUITs Using WatiN
- The Demo Application
- Creating the First Tests
- Refactoring the Tests
- Some Other Tools
An Introduction to Continuous Integration with TeamCity
- Build Pipelines
- Implementing a Build Pipeline in TeamCity
- Alternative CI/Build Servers
A Holistic View of Testing
- Types of Testing
- The Testing Pyramid
- What and Where to Test
- Testing Legacy Applications
- Part 3: People and Process
An Introduction to Agile Software Development
- Overview
- Agile Software Development in Practice
- Overarching Principles
Pair Programming and Code Reviews
- Formal Code Reviews
- Pair Programming
Time Management and Motivation
- Time Management
- Prioritisation With MoSCoW
- Prioritisation with Covey Quadrants
- Maintaining Energy with the Pomodoro Technique
- Maintaining Motivation with the Power of Three
Technical Debt
- Examples of Technical Debt
- Causes of Technical Debt
- Mindfulness of Creating Technical Debt
- Recording and Prioritising Technical Debt
- The Effect of Technical Debt on People and Organisations
Software Craftsmanship, Professionalism, and Personal Development
- Software Craftsmanship
- Beyond Craftsmanship - Into Professionalism
- Personal Development
What Programmers Want and What Your Manager Should Understand
- What Programmers Want Survey
- Challenging Work, Creative Solutions, Making a Difference
- Tools and Environment
- The Joel Test
- Appendices
Appendix A: Manifesto for Agile Software Development
Appendix B: Principles behind the Agile Manifesto
Appendix C: Testing Framework Attributes
Appendix D: Design Pattern List
- Creational Patterns
- Structural Patterns
- Behavioural Patterns