I’ve come to realize something today:
I think of myself as a worse programmer than I actually am.
I don’t get as much code written as I would like. I run into a wall a lot of the time when trying to get something done, and it feels a little like I’m running up against the edge of my own competence. I know I’m no expert, nor even “proficient” in the Dreyfus model, but I might be better than I tend to think when I have those moments of incompetence.
I’ve realized that one of the biggest problems I have with making progress on my own projects is figuring out how I want to build them — to some extent, even figuring out what I want them to do. Once I have a clear idea of some piece of functionality that needs to be built, I tend to build it; once I know how I want to organize the architecture, I put it together; once I have a theory for the project’s concept, I design it. Reverse those steps, and you’ve got a path from concept to completion.
The biggest problem for me is, apparently, developing that theory for the project’s concept. When working on a fairly clear-cut project, such as when doing something for a client who has more than a vague notion of what (s)he wants, everything flows easily, but a lot of the time the vague notion is mine, and it’s up to me to come up with something clear-cut from there.
I’ve never been a cubicle-based developer. My information technology related dayjob employment has always been focused on things like network administration, data center support, and on-site client system recovery. I have not had a straight-up development job, per se, though I have done a fair bit of lightweight development for clients (Web development, software tool maintenance, integration, and actual — le gasp! — consulting). It occurs to me that if I had at some point had a desk-and-beige-box, cubicle-embedded, corporate development job I’d probably have a more positive view of my own programming skills.
In a cube farm, doing development scut-work, expanding the code base of some Enterprisey bloatware system by working on some micromanaged little segment of it, I would have realized much sooner that I do seem to have the ability to churn out code to meet the well-defined goals set before me — and do a better job of it if I understand how it fits into the big picture. In short, while I’ve spent a long time rating myself somewhere around the level of a low-level Advanced Beginner in the Dreyfus model, I think I might actually land squarely in the Competent category. It’s just difficult to see that from where I’m marooned on the far fringes of development, well outside the kind of programming work most developers do.
Maybe tomorrow I’ll change my mind, but for now it looks like I’ve suffered under a delusion that is the diametrical opposite of the Dunning-Kruger effect.
I’ve been thinking about the Dreyfus model of skill acquisition a lot lately (I blame Andy Hunt, and his book Pragmatic Thinking & Learning). It is in part because of this fact that I’ve come to realize that my own cognitive bias in the case of rating my development skills lands me squarely in the self-underestimating camp.
Now I just need to spend a few more days thinking about it to make sure my epiphany is not just a flash of ignorance, rather than insight. If it turns out this realization is not, itself, a misperception, I then need to start working on believing it. Long habit of belief in my own relative incompetence will be difficult to break.