30-Minute Exercise to Become a Better Programmer
I believe that motivation is really important. That’s why from time to time I read books about time management (as they motivate me to be focused and continue evolve my TM-system) and books about software craftsmanship. The other day I finished one of this kind of books - “Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman”. This book motivated me to think carefully what I want to invest my time in.
Also, it coincided with my 25th birthday and, of course, the new year is coming in a few days. As you can imagine, all this stuff pushed me to reflect on my skills and in the end I came up with a learning plan for the next year.
The reason I’m writing about it here is as it was one of the things authors of the book advise. Personally, I think it’s an excellent idea. Sharing it with everyone gives me a huge boost of motivation to finish everything I set out.
One of the things the authors advise I found really useful is making a list of all your skills, group and evaluate them. Having this kind of list is a great help for choosing what needs to be learnt next, what areas of the craft I lack experience in. Also, being a fan of mindmap I decided to make a mindmap instead of a list.
I split all my skills into four groups. Two of them are very pragmatic and contain technologies and tools I use at work. The rest are fundamental knowledge about programming – computer science and all kinds of design patterns. It’s worth to mention that I didn’t conduct any serious research; the map is not full list of technologies or skills I obtained over the years. The point of the exercise is not creating a comprehensive list of everything you know but rather giving you’re a high-level overview of your professional knowledge. I marked all skills from 1 to 5:
- 1 - I have understanding of a subject but I haven’t had a lot of practical experience.
- 5 - Fluent. Rarely check API documentation. Contributed to open source projects, wrote a few posts about the topic.
When I first looked at my map I realized how badly I suck in computer science. The second thing that showed up is my lack of unix skills. Some tools that I use every day (e.g. zsh) are still puzzling. It needs to be fixed.
In addition, I don’t feel myself as comfortable working with ruby as I feel when I write java or groovy. I definitely need to spend some time making it 5.
Books are the easiest and, in my view, the most efficient way to gain information about any subject. You can watch screencasts and read blog posts but your knowledge will remain shallow until you read a good book about the subject. One piece of advice I also found useful is to alternate pragmatic and fundamental books. Though I’ve had a reading list for a few years already I didn’t categorize books as fundamental or pragmatic. When I think about it right now I find it really useful. Reading classical books will pay off in a long run. But you shouldn’t stop learning new cool things that can be useful tomorrow, that’s where pragmatic books come to play.
Looking at my mindmap I decided that improving my Ruby skills is probably the most important thing right now. I picked a very practical book that can help a little bit - “Rails AntiPatterns”. To work on CS knowledge I chose a wonderful book I wanted to read for some time “Types and Programming Languages”.
You may say that making that mindmap didn’t pay off as I could make similar decisions without it. That’s true, but what I like is that I made these decisions consciously.
I’d like to recommend this method to everyone Just make a list or a mindmap of all your skills. Don’t spend days recalling all technologies your worked with. This is not the point of this exercise. The important part is to give you a high level picture of what you know and what you’d like to become better at.
Sometimes plans are quite different from realities. This is true especially in IT induestries. Usually when a client starts to present their plan, they have a really great vision. However when comes to the budget, the client runs into difficult.