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 videos and getting started guides for just about anything you might want to learn. But...do you really want to “know” how to program, or do you want to be able to make cool stuff?
Knowing is only half the battle!
So…what advice does the software engineering industry have for programmers who want to advance their skills?
The traditional advice that I have always heard has been to do side projects. There are a lot of great reasons to do side projects: learning new paradigms, broadening your perspective, and building your resume...but after reading about deliberate practice I think that it is also important to be mindful of the habits we are building.
If you are not careful about picking your side project, you can end up (often intentionally) choosing a project that is outside your knowledge, skill, or time constraints. If you are lite on any of these three, then you have can created an environment that is ripe for short-cuts. For example, you may skimp on proper abstraction and design while you are focused on learning a new language. You may be making great strides with the syntax…but you might also be codifying bad habits as you try to "just get something showing on the screen".
By “codify”, I mean committing to habit or building “muscle memory”. To put it in fancy programmer words: Encoding explicit procedural instructions into implicit declarative
These are conflicting goals!
In the example above you want to learn the language, but you may also want to hit a project milestone before bedtime. Best practices (and in my experience: unit tests and dependency injection) are among the first things to go. Another thing to consider is that there can be meaningless overhead or overlap with skills that you don’t care to practice. Making time for side projects is tough, so why dilute your results?
If you are not careful then I believe that scrappy programming can strengthen bad habits. That doesn't mean that you should avoid them all together, the benefits are too great, but I do think you should be careful not to let your habits slip.
Want to hear more about this subject? Check out the Coding Blocks episode on the subject: Coding Blocks #78: Deliberate Practice for Programmers
Soft skills are as critical as technical skills for a software engineer. No one works in isolation. Each person has to deal with teammates, colleagues, managers, etc. Therefore team interpersonal skills are essential too. Soft skills include things like good communication, honesty, teamwork, integrity, organization, empathy, etc.