Last year Erik Dietrich wrote a great piece called How Developers Stop Learning: Rise of the Expert Beginner.
Just in case, here’s a quick summary.
Dietrich’s main point is that some beginners reach a point of complacency with their expertise long before they ever reach the “expert” level on the Dryfus Model of Skill Aquisition. This results in many over-confident programmers writing production applications and often leaving the team before they have to suffer for their mistakes.
He has a great little graphic to explain what he means:
I think Dietrich has an excellent point, yet it isn’t really a problem I see in my role as a TA at the Flatiron school. I think, instead the bigger question raised is “What is an Advanced beginner to do?”
I have been working as a rails developer for about a year now. I have a fair grasp of the basics; I feel I can be productive on most rails projects without too much of a ramp-up; I can pick up new languages with relative ease; I’m slowly developing my personal style as a programmer.
I still have a long way to go.
One of the most prominent traits of an expert beginner is extensive breadth and a lack of depth. As a guy who loves “shiny” things, I am faced with a problem. I tend to pick up new technologies before I have truely mastered the ones I get paid to know.
I’ve posed the following question to myself: how do I level up from here?
The options seem endless. A year ago, I only wanted to build web apps, now I want to try writing a VM, a compiler, or a language.
That is only the tip of the iceberg. The more I learn, the more I realize I don’t know. I feel overwhelmed because I want to do everything.
So what is an advanced beginner to do?
I’ve decided to set a series of high level learning objectives, followed by goals that will give some amount of concrete accountability to them. The Web is where I am least comfortable and will likely have the biggest impact on my career going forward, so that is where I’ve decided to focus.
Objectives
- Gain a deep understanding of TCP/IP
- Learn how to effectively use WebSockets
- Become comfortable with the DOM apis
- Understand Event Handling
I almost put a line about learning Functional Reactive Programming in the list above, but I think it is a good example of me trying to ‘pre-maturly optimize’ my knowledge for problems I don’t have yet. That being said, FRP is really freaking cool.
Below I’ve sketched out some projects to help me reach these goals.
Projects
- Build a web application using at least one major JavaScript framework, currently leaning towards Ember.js.
- Write a simple webserver in Ruby from scratch.
- Read TCP/IP Network Administration.
- Read The Definitive Guide to HTML5 WebSocket.
- Build an interactive browser game using JavaScript.
Readers, what do you think? Is there something I should add, subtract or expand on? Let me know on twitter!