It was few months ago more than a year ago (22nd of February 2013 in my Trello card, Ideas column), when I came up with the thought of developing a training about how to write good code. At that time I was doing a lot of thinking about how to best use my one extra free day, as I started to work part time. The idea to use part of this time to develop trainings came rather naturally as I was already teaching and coaching colleagues about good code and also holding trainings about good unit tests in ISDC and for some of their clients. I also realized that holding trainings was a really enjoyable experience for me, so the fit was quite perfect.
What I intended with this kind of course is to express and explain, how all the best practices from the object oriented design world are structured in my mind. It is about how my links and connections among these various design principles and patterns results in the code I write. During my previous coaching sessions, I realized that explaining my vision helped more than just presenting the theoretical concepts. It helped both to get to a better understanding of their usefulness and in writing better code. The Code Design training was born from this desire: put in a clear map all the patterns, principles and practices, and present them using code examples from real projects to any team from any company.
The entire training is structured around of the idea of designing code that embraces change. Code that is easy to change. Code that is inexpensive to change. Code with predictable effects of change. Changeable code. Change is the leitmotif of my training. What I want to teach is how to drive all the design decisions to minimize the effect of change. That is why this is not an Object Oriented Design training. It is not only about that. It is a Code Design training that focuses on minimizing the cost of change. Because, at the end of the day, the most important benefit quality code is the low cost of change.
I have started to actually work on developing this training somewhere in October 2013 and I worked regularly in my free days left from the regular part time job. I have taken an interactive approach. First I have put on paper the main ideas and topics I wanted to teach. Then I have defined the learning objectives and I have also summarized what would one learn from this course. Next was to put on paper a draft script for the entire course. After that I have enriched this draft in an iterative way, by identifying materials that would lead to reaching the learning objectives. I have gathered concepts, examples, explanations and ideas from my favorite books, like: Clean Code: A Handbook of Agile Software Craftsmanship or Code Complete: A practical handbook of software construction, and others that I have read along the years. It ended up to be a selection of concepts and examples from these books structured, interpreted and explained in my own way shaped by my own experiences of writing code and explaining it to others. At some point the training lessons got the shape I was looking for. Each lesson was targeting roughly one or more of the objectives. In the end the training lessons are:
- Part 1: Good Code Design and Design Patterns
- Lesson 1: Why Code Quality and Code Design
- Lesson 2: Clean Code
- Lesson 3: Separation of Concerns
- Lesson 4: Design Patterns
- Part 2: Object Oriented Design Principles and Practices
- Lesson 5: Object Oriented Design Principles
- Lesson 6: Dependency Injection
- Lesson 7: From Principles and Patterns to Practices
- Lesson 8: Application Infrastructure
Somewhere along the way I have started to think more seriously about another important stakeholder in this: the companies that would ask me to hold this training for their employees. I have made a commercial offer for the training, which details the outcomes, the benefits and the costs of the training. I have also considered more carefully how I would customize the training for different needs. The training lessons are built in such way that they can be taught individually and still bring value, or only a part of them can be selected into a shorter version of the course for an audience that doesn’t need to go through all the subjects. Having the offer done, I have sent it through my contacts, to some companies in Cluj. I have got good feedback, which encouraged me even more to dedicate more time and energy to developing the training.
Once I had the course script complete enough, I have started to build the training materials: power point slides, exercises, code samples, and to select videos which can contribute to the learning experience.
Tomorrow is the first time I will hold it as an internal company training, for Wirtek. A company here in Cluj, which shows high desire to increase the quality of their services by investing in people. In a way I am glad it happened that the first run of the training is not in the company I regularly work for, because it is in a new context, which makes it a better test for me and for the training itself. I am quite confident that it will go well, and that it will help them, because I have put a lot of effort, energy and thought in it. I’m looking forward to a great day tomorrow!
UPDATE: I have published a presentation page with the full format of the entire course here.