I recently wrote about the differences between programming knowledge and skill in a previous post. In short: knowledge is what you understand, and skill is what you can do with it.
The internet is chock full of amazing information for just about anything you might want to learn. Things like videos, e-books, and getting started guides.
However, it is not enough to “know” a programming language, you need to be able to make cool stuff with it. Knowing is only half the battle!
So…what advice does the software engineering industry have for programmers who want to advance their skills?
The dangers of distracted practice
The traditional advice that I have always heard has been to do a side project. And for good reason! There are a lot of great reasons to do side projects but after reading more about deliberate practice I do think that it is important to be mindful of the downsides.
If you are not careful about picking your side project, you can easily (often intentionally) choose a project that is outside your knowledge, skill, or time constraints. If you are “lite” on any of these three, then you have created an incentive for short-cuts. An example here could be or skimping on proper abstractions while you are learning a new language. You may be making great strides in the language…but you might also be codifying bad habits.
By “codify”, I mean committing to habit or building “muscle memory”. To put it in more programmer friendly words: Encoding explicit procedural instructions into implicit declarative
The problem here is that there are mixed motivations behind the project.
In the example above: you want to learn the language, but you also want to hit a milestone in your project before the (metaphorical?) kids come home. Another thing to consider is that there can be meaningless overhead or overlap with the type of work that you don’t care to practice. Making time for side projects is tough!
Why dilute your results?
C’mon now, are side-projects really harmful?
If you’re not careful they can contribute to bad habit making – but the answer depends on your goal.
Let’s take a look at a hypothetical example:
If you are working on a small website as a way to catch up on .NET Core then any time you spend working with Docker or HTML is sideways to that goal. But maybe “learning .NET Core” isn’t your real goal, maybe your true goal is wider than that. However, if your only goal is to learn .NET Core then you are doing it in a distracted and ineffective manner.
Despite it being the traditional advice, side-projects are not a great way to improve individual skills. Stay tuned to the blog for an upcoming blog on a different approach: Deliberate Practice
After all, That’s how winning is done!