Recursive Learning
There’s an interestingly recursive nature to learning programming. As part of my ongoing project to build my programming skills to a higher level, I would like to learn Node and modern JavaScript frameworks/libraries like React and Redux. So, that’s my starting point: What do I need to do to learn these new technologies?
Except that conventional wisdom holds (and I agree) that it makes more sense to become very comfortable with vanilla JavaScript before jumping to a framework. This makes a lot of sense, actually: A framework is a powerful tool, but at the end of the day it is compiling down to JavaScript—if I don’t understand the strengths and weaknesses of JavaScript, I won’t understand the problems that these frameworks were built to solve or the trade-offs they make. And I won’t be able to learn them nearly as well.
So, I’m off to learn vanilla JavaScript. Time to read books like Crockford’s JavaScript: The Good Parts and Eloquent JavaScript.
Except …
To effectively learn JavaScript at a high level, I really should have a text editor that I’m deeply familiar with. Sure, I've gotten by with the core functionality in Sublime Text—syntax highlighting, tab settings, and simple macros have been very helpful for the projects I've worked on so far. But I know there’s a lot more to learn. Before I invest time in learning JavaScript more deeply, I really should dive into the program and figure out its more advanced features. Doing so will let me take full advantage of Sublime, and will save me significant time in the long run as I learn JavaScript.
Except (and I’m sure you’re sensing a pattern), if I’m going to invest time in learning the features of a text editor, it’s probably worth learning the text editor that best fits my needs and working style. That could be Sublime Text, but it might well not be—there are many excellent text editors out there, and the little bit of time I've spent with Sublime doesn't guarantee that it’s the right fit for me.
[Much research later] OK, I've now decided that Vim is the text editor I’m going to invest in learning. (I’ll probably have more about why in a separate post.) Time to read books like Practical Vim and Modern Vim and invest in setting up a good .vimrc configuration file.
Except, Vim famously relies entirely on keyboard navigation, so it’s essential to be an excellent touch typist. In fact, Practical Vim literally has a chapter titled “Learn to Touch Type, Then Learn Vim”, which states “if you have to look down to find keys on the keyboard, the benefits of learning Vim won’t come fast. Learning to touch type is imperative.”
Now, I can touch type—I doubt I would have pumped out the volume of writing I've produced over the years if I couldn't. But I’ll admit that my current typing skill is closer to “serviceable” than to “excellent”. I’m generally fine with alphabetic characters and simple punctuation—the vast majority of what I was typing in a non-programming context. And, while my accuracy isn't great (maybe 95%), it is high enough that I rarely need to pause my writing to correct typos: By the time I have a typo to correct, there’s probably also a spelling error to fix or some other non-typo edit to perform, so the typo doesn't cause an extra context switch from writing to revising.
But programming changes that analysis considerably. When coding, it’s no longer the case that I’m spending nearly all my time dealing with alphabetic characters and a small handful of common punctuation marks (like “,.;’ and :). Instead, I’m constantly typing numerals and characters such as [{$! — that is, characters that I’m not nearly as accurate on. What’s more, I’m also not in a situation where I make nearly as many spelling errors: nearly everything I type when programming either a short, common word like “let”, “function”, or “New”, or is a long function or variable name that can be auto completed in my text editor. This means that fixing the occasional typo is not longer a matter of fixing one more minor error when I've already paused to fix a few spelling errors; instead, the typo is likely the only reason to pause the forward momentum of coding at all.
The bottom line is clear: I need to improve my typing accuracy and speed if I’m going to learn to make full use of Vim.
So, let me pause here for just a minute. I’m learning to type more accurately … so that I can learn Vim better … so that I can have a text editor I’m effect with … so that I can learn vanilla JavaScript better … so that I can learn more modern frameworks … so that I can build the sort of tools, apps, and projects that I want to build. Whew! I feel vaguely like an old fashioned Sierra or Lucas Arts adventure-game hero, who has to achieve a long string of seemingly unrelated tasks just to take one step closer to their alleged main quest.
(Mind you, I’m definitely not complaining. Each step may be one further removed from my ultimate goal, but each one is connected. And—even more importantly—each one is valuable, in and of itself. Each one will build my skills, and make me more capable in the long run. In fact, having the luxury to go down these sorts of recursive rabbit trails is one of the big reasons I want to devote myself to full-time learning for a bit, rather than learning in the context of needing to deliver a finished product on a tight timeline.)
All of that was a long way of saying this: I'm currently spending a lot of time getting (much, much) better at typing. More details on what I'm doing and what progress I've made to come.