Software Design
- Principles of software design
- Cost of fixing bugs
- The knowledge transfer dilemma
- Code smell
- The danger of complexity
Design Principles
- Broken windows
- Screaming monkeys
- DRY
- Single responsibility
- Separation of concern
- Least astonishment
- SOLID
Case Studies
- GSM/GPRS system
- 3-tier client-server-backend system
- Credit-card processing batch system
Design Patterns
- Patterns and anti-patterns
- Singleton
- Template method
- Decorator
- Composite
- Builder
- and more...
Refactoring
- What it is
- Tools
- Extract variable/method/class
- Pull/push members
- Renaming
- and more...
Clean Code Basics
- What it is
- How to do it
Comments and Formatting
- How to deal with comments
- General advice
- Different categories of comments
Meaningful Names
- Naming matters
- What about encodings
Functions
- Function size
- Return policy
- Side effects
- Parameters
Classes
- Class size
- What is a cohesive class
- Open-closed principle
- Loosly coupled classes
- Class organization
Data Structures
- Data structures vs. objects
- Law of demeter
Error Handling
- Return codes
- Null returning
- Null arguments
- The exception debate is over
- Assertions
Unit Testing
- Test FIRST
- Clean tests
- The given-when-then idiom
- Intro to Spock
System Architecture
- Separation of concern
- Constructions vs. usage
- Dependency injection
Build Tools
- Overview of build tools
- Repositories
- Proxies
- Work flow
Continuous Integration and Deployment
- What is Continuous Integration (CI)
- How is it related to clean code
- CI servers
- What is Continuous Deployment (CD)