Comments by Scott Thompson and Elaine Ashton prompt an early Part II.

*Curiosity* is an essential trait for the programmer.  In all seriousness, 
if you don't have a deep desire to find out how things work - in 
particular, software - this may not be the field for you.  Principally 
because our tools are rarely so perfect at encapsulation that they 
completely hide the underlying mechanism, therefore, it is necessary to 
understand the underlying mechanism and to want to get at it.

Now, I have to qualify and explain that statement.  Take for example, a 
modern automobile. It successfully encapulates the principles of internal 
combustion engines such that a driver who doesn't want to know any more 
about it than "Put gas in when this light goes on and take it to a service 
station if any other light goes on" doesn't have to.  The automobile has 
shielded the driver from having to know about spark plug gapping, timing 
advances, that sort of thing (not that plenty of owners don't get mileage 
out of knowing those things anyway).

In computer programming, the C compiler manages to do the same thing; most 
people don't need to dig below the level of C source any longer to find a 
problem.  (It wasn't always so; up to 10 years ago I used to have to go 
into the machine code generated by a compiler on occasion because there was 
a slight chance that the compiler had erred.)  For the most part, the Perl 
programmer can make the same claim.  But what of the edifices we construct 
with our high-level languages?  By and large, applications rarely 
encapsulate perfectly; there's always a need or substantial advantage to be 
gained from ferreting about under the hood.  In the last 10 years, this 
need has only increased, in my opinion; I see more complex applications 
coming to market in much shorter development cycles, and  as a result a 
product is more buggy, less complete, and less properly documented than one 
from the year before.  No matter how professional the product, somehow I 
always end up relinking shared libraries, editing header files, writing 
Perl 'glue', or some other kind of tinkering to get it to do what I want.

The need to delve into the workings of software is so pervasive that it was 
encasulated long ago in an acronym that's also geekspeak: UTSL, standing 
for "Use The Source, Luke".  Telling someone to UTSL is also recognizing 
that the source code itself is the ultimate authority on how it works and 
sometimes nothing else can answer a particular question.

So we work in an imperfect field that requires that we often tear things 
apart to make progress.  How should a beginner leverage this 
information?  Firstly, as I said, realize that if you don't have a desire 
to find out how things work *just for the sake of it*, you may not have fun 
being a programmer.  I know the obvious retort is, "I just want to get my 
job done," but as I've been explaining, getting this job done usually 
requires so much inquisitiveness that you'd better enjoy it.

Secondly, want to understand *everything*.  Even if you leave some parts 
until later because they're less interesting or less relevant, strive to 
understand an entire process from top to bottom.  It's amazing how often 
there's useful information hidden inside some part that you thought was 
perfectly encapsulated.  Or that helps you understand higher levels: 
learning how CPUs are constructed helps to understand why assembler is the 
way it is, which helps to understand how higher-level languages are 
constructed and why things like stacks and heaps are so important.

Thirdly, devour good examples of code that are just within or just beyond 
your current understanding.  They'll both broaden and deepen your expertise 
as you see other ways of doing things you already know how to do, and are 
forced to research new topics.

Finally, understand that the learning can never, ever, end.  You'll know 
that you're in the right place if this comes as good news.


Hmmm... FWIW, (c) 2001, Peter Scott

Reply via email to