|Think about Loose Coupling|
[..] the great figure of the [creation] story is Eve. She is everything that I respect in a person: irrepressibly curious, courageous, undaunted by authority. Most of all, she is intent upon personal growth, determined to fulfill not just some but all of her promise.
The main virtues of Perl programming, as everybody should be aware of, are Laziness, Impatience, and Hubris. Larry Wall has explained all of them in the Camel Book, and I agree on the contribution that those habits bring to the completion of a programmer's task.
One virtue that has been neglected, at least in official books, is curiosity. As DeMarco notes, in Christian countries, curiosity is believed to be the mother of all vices, and people are encouraged to stick to the corpus of knowledge that has been officially blessed by some authority, be it the Church, the government or some academic big shot. Individual deviation from the universal laws of science is frown upon, and the ones who practice such unorthodoxy are fingered as "nosy."(*)
Yet every major advance in science and technology was the result of some rule being broken by somebody who didn't believe the limits set by the authorities. From Galileo to Einstein, we owe the improvement of our current knowledge to somebody who defied the common view.
However, I don't want to talk about heroic behavior. Even without facing the wrath of the Inquisition or the contempt of the established scientific community, curiosity is a valuable asset that tells a good programmer from a mediocre one.
Let me spend some words about my personal experience. Sorry if I appear to be self celebratory, but I should better start from something I am familiar with. I have worked in IT for 18 years, as a programmer first and then as a designer and analyst. I especially enjoyed my experience as a programmer, and I have created many applications and tools, each time building on past experience but always trying to improve what I did previously. People who know my programs and my occasional stunts 1 have said nice words about my works and have called me "guru," "wizard," "computer tamer," and similar appreciative names. When they compare me with my younger peers, they tend to agree on the concept that I have a better insight on the problems, and that my code is of fairly good quality. When such comments arise, there is always somebody who asks me "how did you learn that?"
That's a really good question. A difficult one, actually, given the general expectation of the questioner that I am going to disclose the truth about a legend that I attended some magic class where I learned how to spell computers into obedience. They are surprised, and somehow disappointed when I explain that most of my practical knowledge comes from curiosity.
So, how have I learned what I know? There was regular school, of course, but many of those who came out from the same classes that I attended don't seem to face problems the same way I do, and their code is not as rich as mine.
The difference, I explain to the skeptics, comes from my attitude towards life, and technology in particular. Whenever a subject appeals me, I want to know as much as possible about it, so I read voraciously books and articles, listen to talks, make experiments on my own, linking together what I am learning until every piece of information has its own place in the drawers of my brain. Books play an especially important role in this schema. I read reference manuals as if they were detective stories, while many of my colleagues just skim through them until they find what they need to solve today's problem and then forget about it. Sometimes, one of them asks "how do you do this and that?" and I point out at the solution in the very book that is gathering dust in front of them, and then they wonder how come I read about that thing, which I never used before and as far as they knew I was not going to need. Well, this is exactly the point, isn't it? Curiosity - scientific curiosity - is the ability of find interest in things that are not interesting yet. It is the same origin of social curiosity, when we get to talk about some idle subject that has nothing exciting. In the case of scientific curiosity, though, there is a second stage, when the the person links together all things learned, to transform trivia into valuable information.
Now I want to dispel the idea that I think of myself as a supernatural being who can turn water into wine. I am a professional analyst and developer who has learned the value of organized knowledge and I believe that my strength in problem solving activities lies in my ability to link together my previous knowledge to current facts. I also realize that it doesn't appear so easy to the untrained eye. Common users who struggle to find useful data in a spreadsheet will look at me in amazement when I type a formula with VLOOKUP or COUNTIF in it, or when I filter a huge text file with a Perl one-liner. I don't feel special at all, but I recognize that others look at me as if I were an alien, and I believe that the basic difference between my approach and theirs is just curiosity.
Also, I recognize immediately other people blessed by the same gift - this is one of the reasons why I like PerlMonks, BTW :) - and I tend to associate with them.
Curiosity alone is not enough to improve someone's skills. It must be associated with memory, so you can retain what you have seen, heard, and read. I found that the two things are related. You remember better things that interest you, while you forget - or don't pay attention altogether to - things that don't make you curious.
Therefore, curiosity is selective. You may be curious about statistics phenomena and feel totally indifferent to physics, or the other way around. But once you have gone through the motions of being "nosy" in a particular subject, you attack the next one with a well established strategy, and you manage to conquer the unexplored territory fairly quickly.
You may have noticed that I was talking in terms that sounded almost military - attack, conquer, strategy - and this gives me the start to talk about my early training in curiosity and memory. It began when I was 14. No, I didn't join the Army, but I learned chess, and for many years, beyond my study hours, I submitted my brain to the voluntary torture of playing blindfold chess and enjoying reading things like this one without the support of a chessboard 2.
This training in chess was a sort of mental gymnastics that put me into the habit of analyzing and thinking in an organized way. I discovered later that programming and chess analysis have something in common, the same frame of mind, but I will leave this for some other day. What I was about to point out is that, for the uninitiated, the above thing does not look any clearer than
Before I learned Perl, this code looked like line noise to me. Today I can read it and understand it, and I can also see at a glance that there is an error (see this node to know why). Non only that, but I read books, articles, and online discussions about these things, and I am sometimes even able to give advice. When I discovered Perl, I was curious about its brevity and effectiveness, and I wanted to explore it more thoroughly. Within a few weeks, I was slowly abandoning the C language as my favorite tool creator for system administration. One year later, I was using C only to do small maintenance of existing tools. Whenever that maintenance became too heavy, I rewrote the tool in Perl. It was much quicker and easier to maintain. So here I am, programming Perl to fulfill my curiosity 3. Which is not exhausted yet. I am still curious about new things and improved things. Even when people think I have nothing more to learn, I feel alive and kicking as long as I am still able to learn something new.
I have been thinking about this subject for a long time, and now I believe it is time to share my thoughts with more people who might recognize themselves in the same paradigm. Your contribution will be welcome 4.
(*) Update Most of the referred paragraph may sound as if I am quoting DeMarco verbatim. I would like to stress that I am just taking his initial point and extending it with my own words. Thanks to adrianh for pointing out the possible misunderstanding.
_ _ _ _ (_|| | |(_|>< _|