Stage 1: The opportunity
At first, you’re excited. Something shiny and new! You’ve always wanted to learn this new thing, a language perhaps, and whether through planning or circumstance, you finally have your chance.
Stage 2: Unwarranted optimism
So you Google for tutorials, work your way through one or two, buy a book, start a MOOC. The tutorial is fun, there’s an online REPL that lets you play around, and you feel like you’re making progress. There are annoyances, of course – unnecessary inconsistencies that test your fingers’ muscle memory, but you persist, and are ready to move on to your first project.
Stage 3: The pit of despair
Nothing makes sense. You try to extend your “Hello, World” code, and everything but the most trivial changes (e.g., changing the text to “Hola, Mundo”) explodes in an avalanche of incomprehensible error messages, stack traces, and random behavior. Or perhaps all error messages are swallowed, and code that worked in the tutorial presents you with a blank screen. Suddenly, minor differences that seemed silly but benign (“oh look, they specify strings differently from every other language”) begin to seem like land mines strewn in your path by a psychotic, angry language designer acting out revenge fantasies against high school bullies who would presumably be forced to use the language to code polynomial-time traveling salesman in a Russian prison. Even the simplest tasks are painful, and you begin to wonder if you’ve lost your coding chops, or if you ever had them at all.
Stage 4: Minimal competence
Slowly, through trial and (mostly) error, desperate pleas to coworkers, StackOverflow, and blog posts by fellow travelers, you start to accumulate discrete bits of knowledge. This is how you display data, this is how you communicate with the database, this is how you create an interface, this is how you override a method. You don’t really understand how any of it works, it’s just a growing collection of magical incantations that complete specific, necessary tasks. You may even get to be quite comfortable with some of them, and will probably start using them even in cases where they’re questionable, using a wrench to hammer in nails. It feels good to accomplish something, even if you know you’re not really doing it right. Debugging is an exercise in frustration, because you fundamentally don’t understand why anything works the way it does. Whether through a rational decision that one’s goals have been achieved, that time could be better spent elsewhere, that it’s too damn hard, or the tragically mistaken belief that expertise has been achieved, it’s pretty common for people to stop here.
Stage 5: The lightbulb
At some point, you’ve accumulated enough discrete pieces of information that you’re able to start drawing connections between them. This is the point at which you realize that you can take pieces of recipe A, mix with recipe B, and cook something up that won’t end in a call for delivery pizza or a trip to the emergency room. You start to intuit some of the underlying rules, and are able to move away from strict adherence to received knowledge. This is an uneven process – you may start to grok one area, while still being relatively baffled by another – but each step gives you the confidence to take the next, and you start to enjoy the process.
Stage 6: Expertise
After a while, you fully grasp the underlying model, and everything feels natural. It’s hard to remember what it was like not to intuitively understand how things worked, and you easily move between architecting, coding, and debugging. You usually don’t have to think about things consciously, in the same way that you don’t have to think about how to get from your house to the store – you know the way, and if there’s some road work, well, you can instantly weigh the different options and choose an optimal alternate route. At this point, the most difficult thing about a problem is the problem itself, not coaxing the system to support what you want it to do.
Stage 7: Eminence
You are now an expert, with years of experience under your belt. You’ve invested a tremendous amount of time and effort, and it’s paid off. You write blog posts on the subject, contribute to open source projects, and are the acknowledged expert among your peers. It becomes part of your identity, and it’s hard to believe you once did things any other way. And then one day, something new comes along. You know that it’s important, that it would be useful, that it could easily solve problems that your current tools struggle with, that it’s the wave of the future. At the same time, you can clearly see the effort, the time, the feelings of inadequacy and frustration, the need to depend on other people, etc., that would be involved to get to a reasonable level of expertise. And so you don’t. You close your eyes, stick with what you know, and inwardly curl up into yourself as you slowly die inside.