I found those images great analogy to how, we not-so-humble programmers learn: languages, design, frameworks. (All images by Chris Jordan). For the sake of discussion let’s use learning a language, as an example. This can be however extended to anything.
First, we read, or hear about that new cool language. So we grab some introductory book, or attend a presentation on it. After a day or two, one might say confidently to himself: It’s great, my hello world runs flawlessly and I’m proud of myself.
Life’s good. I know the syntax, I know how the syntax for while loop looks like, I know all the primitives in the language, and I even know how to use those fancy features like delegates, although I don’t understand why they put it there. They’re obviously useless! Well, nevermind – I’m a pro.
That’s the level at which we think we know all there is to know about the language. Like with the picture above. All we see, is woman’s breasts. That’s the level where we concern ourselves with issues like how to create a class, what’s the difference between public and internal method, and what the heck is the difference between class and structure?
Then comes the first actual project where we can use the skills and knowledge we’re so confident to posses, and eager to put into practice. At that point we might discover things like, that those delegates can actually be put into some good use. They can be passed around as parameters to other methods, and they do the magic that enables me to double-click a button and have the method-stub generated that would be executed when a user click the button during runtime.
At this point we begin to realize, that maybe there’s more to that picture than just breasts. We concern ourselves with questions like, how to make that piece of code more reusable, how the Dispose pattern works, and what the heck are those Attributes?
Then, after some time and few projects done, few books read, and few long debugging sessions we come to realize: I know nothing except the fact of my ignorance. That’s the point when we know that delegates allow for decoupling of classes, Attributes among other things are used for meta-programming and classes and structs are oceans apart (or at least as far, as heap form the stack). That’s the point when we concern ourselves with things like manageability, loose dependencies, programming for interfaces rather than implementation etc. That’s the point when we no longer see breasts. We see things as they really are.