Programmers have big egos. It’s not like it’s a big secret or something; we’re used to being right, and it can be very difficult for us to admit when we’re wrong. And, God help you if you ever have to say:
I don’t know.
If you say that, no one will ever respect you again, and you’ll never get a job offer or a promotion, right?
Sarcasm aside, I think, on some level, a lot of programmers may really believe that not knowing something is an unforgivable sin. But, in reality, uttering these three words should be a call to action. If you don’t know something, then you should find it out, right? Sounds simple. But we’ve been conditioned (by crappy teachers or well-meaning, but misguided, interviewers) to believe that we are supposed to be able to recall everything we’ve ever learned, even though this is clearly impossible.
When you’re working on a project, sure, you can remember a lot of details about the various classes and modules that your project uses, but these are things that are passively memorized through repeated use. And when you see something novel that you don’t recognize, you look it up. I hope you’ll forgive me if I’m over-generalizing, but I think this is frankly obvious to anyone whose ever held a programming job for more than a few months.
And yet, as programmers, we’re bombarded with offers to be “certified,” by Microsoft or Sun or whoever else. A large portion of a certification exam consists of memorizing the names of framework classes and methods or memorizing the location of configuration options in your web server or other software. I honestly can’t think of anything less indicative of actual programming and development skill, except maybe having a lot of experience playing video games (something that I seem to see rather frequently on resumes, actually).
On the other hand, I will say that certification is a good alternative to a college education if you just need you get your foot in the door somewhere, though it’s certainly no substitute for real experience. The college-educated shouldn’t think that a diploma is an alternative to real experience either, because it’s not.
But what’s the problem with rote memorization? It probably won’t hurt you, and it might even help you, right?

Bloom's Cognitive Domain
You might recall from your primary education something about Bloom’s Taxonomy of Educational Objectives; I can remember a poster of the skills in his “cognitive domain” hanging in my elementary school English classroom. The whole idea behind his taxonomy is that there’s a hierarchy of reasoning skills. At the lowest level is “remember,” i.e. the ability to recall specific facts. For example, perhaps you recall that the Magna Carta was issued in the year 1215. Moving up the tree, we have “understand” and “apply.” These levels might lead us to ask, “What did the Magna Carta say?” and “How did it change life in England?” At the top of the tree, we have “analyze,” “evaluate” and “create.” Here the questions could be very open-ended: “What are some problems with the Magna Carta?” or “How would you write your own version of the Magna Carta?”
So, here’s the problem with rote memorization as it pertains to software development (sadly, we don’t have time to discuss rote memorization as it pertains to medieval English legal documents). Rote memorization is at the very bottom of the cognitive tree, and nearly all of software development is done at the higher levels. The kinds of skills that can be assessed by testing if someone knows the name of .Net’s buffered string class are absolutely the most basic programming skills you could assess. You’d be just as well asking someone what the syntax is for an if statement. Moreover, the context-aware tab-completion in most IDEs has pretty much eliminated the need to recall exact class or method names while you’re writing code.
Unfortunately for the certification exam writers, the higher cognitive levels are very subjective. We’re talking here about asking questions like, “Is this function good?” or “What are some problems with this code?” In trivial cases, there may be “correct” answers to these questions, but most of the time, there’s room for differences of opinion and discussion. And, a lot of times, it’s more important that you approach the problem in an intelligent way than that you get the “right” answer. I know there’s a (deserved) backlash against the whole Interview 2.0 thing, but I do think that the idea of asking questions with no clear answer during interviews definitely has merit.
I guess the bottom line is that we are all ignorant of a great many things and it’s OK to be ignorant, because ignorance is an easily correctable condition. When you think about it, ignorance is the default state for everyone. Perhaps you know nothing about functional programming. Perhaps you never learned assembly language. In my case, I’m a total noob at networking; I understand the basics, but that’s about it. But you don’t remedy ignorance with memorization, you remedy it with clear understanding and application of concepts.
Unless you specifically go out of your way to correct your ignorance, you’ll always stay that way. And the only kind of ignorance that’s unforgivable is willful ignorance, actively refusing to find out things you don’t know.
September 23rd, 2008 | Tags: college, experience, frameworks, functional programming, gaming | Comments (2)