    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: Professionalism in Programming #14</title>
        <link>https://members.accu.org/index.php/articles/1174</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Professionalism in Programming, from CVu journal + CVu Journal Vol 14, #3 - Jun 2002</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c184/">Journal Columns</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c182/">Professionalism</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c77/">CVu</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c114/">143</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c182-114/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c182+114/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;Professionalism in Programming #14</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 03 June 2002 13:15:52 +01:00 or Mon, 03 June 2002 13:15:52 +01:00</p>
<p><strong>Summary:</strong>&nbsp;<p>There and Back Again</p></p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e22" id="d0e22"></a></h2>
</div>
<div class="blockquote">
<blockquote class="blockquote">
<div class="literallayout">
<p>Two roads diverged in a yellow wood,<br>
And sorry I could not travel both<br>
And be one traveller, long I stood<br>
And looked down one as far as I could<br>
To where it bent in the undergrowth;<br>
(Robert Frost [<a href="#Frost">Frost</a>])</p>
</div>
</blockquote>
</div>
<p><img src="/var/uploads/journals/resources/guru.png" align="right">It's good every now
and again to step back and look at where you are. It's not too
introspective (as long as you don't do it too often). I'm presuming
that if you're reading this you aspire to be a more professional
programmer. To do this you need to know where you are <span class=
"bold"><b>now</b></span>, and where you <span class=
"bold"><b>want</b></span> to be. Then you can start to work out how
to get there.</p>
<p>We all stand somewhere on a scale between programming novice and
guru. It can certainly be a pretty hard call to determine 'where'
you are, and the distinction can be somewhat arbitrary. Still, we
could try to imagine this scale as a road. It starts off a thin but
well marked out track at the novice end - the first steps of
learning are relatively clear (at least as you look back at them).
There a number of good textbooks, types of course to take, places
to get programming experience.</p>
<p>As you gain more experience and understanding there are more
areas you can investigate, and more ways to learn. The road
branches and fans out. The choices proliferate. In your programming
'career' there will be a myriad of choices and directions you can
take, different specialisations and new technologies to learn
about.</p>
<p>We're all somewhere on this road to guruship. What makes it more
interesting is this fact that it's not just the one place we're all
headed. It would be boring if we all knew exactly the same thing,
anyway...</p>
<p>Whilst flirting with the danger of turning this column into a
philosophy lecture, we'll ask &quot;What makes an expert?&quot; and &quot;How to
you get to be an expert?&quot; Perhaps the more pertinent question is,
&quot;How do you know when you're an expert?&quot; Or at the very least, &quot;How
do you know when you're no longer a novice?&quot; Expertise is a very
subjective quality, but the driving force here is the desire to
improve ourselves as programmers.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e47" id="d0e47"></a>The long and
winding road</h2>
</div>
<p>Programming is an interesting field. There are so many
subtleties to master, and conflicting forces to be able to balance.
One of the reasons that I love doing this so much is that there is
always a new challenge to overcome, some new technology to learn
and master.</p>
<p>You often hear talk of 'gurus', of experts in their fields. The
rocket scientists who seem to be able to hold so much disparate
information and arcane technical detail in their heads, and solve
the most incredibly complex problems, that they are held in
reverent awe. How many of us whish we were like that?
Honestly?<sup>[<a name="d0e54" href="#ftn.d0e54" id=
"d0e54">1</a>]</sup> Maybe being an expert is just growing long
hair and a beard, wearing sandals and speaking in some sort of
pseudo-technobabble that no normal mortal can understand. Or
perhaps that's just how to <span class="bold"><b>look</b></span>
like you're an expert.</p>
<p>So what <span class="bold"><b>does</b></span> make an expert?
Obviously, an expert is someone who excels in his or her particular
field. In 'programming' there are actually many different fields to
be an expert in; for example knowing a programming language
inside-out, knowing a platform technology intimately, understanding
a problem domain deeply, being able to craft exceptional
interfaces, and so on.</p>
<p>To just seek to become an expert for it's own sake is pretty
meaningless. I would suggest that expertise is just a function of
time spent studying, learning, developing and practising, mixed
with the appropriate personal characteristics. For this reason, we
should really be asking how to develop our skills <span class=
"bold"><b>where we are</b></span> and the rest will follow.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e73" id="d0e73"></a>How to make
programs and influence people</h2>
</div>
<p>The essential attributes of a good programmer are <span class=
"bold"><b>knowledge, experience, and character</b></span>. The
right mix of these leads to that exceptional type of person. We
need to aim to develop these traits.</p>
<p>Some of this will come with time. Most of it all comes with some
effort (i.e., you don't get to be 'good' for free, you have to work
at it). However, some of this can't be worked at and are just
traits of certain types of people. This shows us that at least some
aspects of &quot;guruship&quot; are nature not nurture.</p>
<p>Let's look at those three in a little more depth.</p>
<p><span class="bold"><b>Knowledge</b></span> Learn. Simple as
that. What's your field? What do you know now? What do you want to
know? Does it focus around a programming methodology or a language?
A technology? A market segment? Think carefully here, and don't
narrow yourself into a single narrow niche, otherwise your view can
become very shallow.</p>
<p>What matters is more than just understanding the details of a
given subject, although undoubtedly that's important. Often the
technical knowledge is the easy part, it's knowing how to use it
that makes the difference. This leads on to the other two
points&hellip;</p>
<p><span class="bold"><b>Experience</b></span> Practise. Try things
for fun. Discover new technologies and use them. Keep going, keep
playing, keep working. This is a clincher, really. You need to have
been doing something, and doing it well, and doing it for long
enough to know that you're doing it well.</p>
<p><span class="bold"><b>Character</b></span> A good programmer has
a number of key qualities, for example: intelligence, humility, and
a curiosity that drives you to find better programming solutions.
That investigative, inquisitive mindset is seen in all good
programmers. Communication is important; if you can't communicate
you can be an adequate programmer, but not a good engineer -
programming is <span class="emphasis"><em>all</em></span> about
communication. The programmer needs to be able to cooperate
effectively. They have creativity and discipline. They are careful,
for example always placing code in a repository, don't rush out
quick hacks, and think before typing. They have a logical,
methodical approach and are able to think at the right level of
abstraction (not cluttered by language details, but able to
incorporate them into work).</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e102" id="d0e102"></a>How to get
there</h2>
</div>
<p>So how do we get &quot;there&quot; (wherever it is)? How do we improve
ourselves? I'll fire out some suggestions here. Perhaps some will
speak more to you than others. Mull them over.</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Get your head down, enjoy learning, enjoy working, absorb what
you're doing.</p>
</li>
<li>
<p>Discover the standard tomes for the subjects you're working on.
How do you find them? Ask people who will know. Read ACCU book
reviews.</p>
</li>
<li>
<p>Read books on software engineering to get a good view of the
whole subject.</p>
</li>
<li>
<p>Make sure you know where to find out what you'll need to
know.</p>
<p>No one knows everything, but do you know where to go for
information? Which books, websites, newsgroups, magazines are
relevant?</p>
</li>
<li>
<p>Get a good understanding of algorithms and data structures (read
good books on this).</p>
</li>
<li>
<p>Know your tools. Know your language. Know what you can really do
with your compiler and get to understand the frightening-looking
programming tricks that you don't use (and may never use). If you
at least understand them your knowledge and outlook are
enriched.</p>
</li>
<li>
<p>Have outside interests that you can use as a frame of reference
for technological knowledge. If all you know is programming you are
a very two dimensional person, and will not be able to slot what
you do into the context of the Real World.</p>
</li>
<li>
<p><span class="emphasis"><em>Always</em></span> write clear,
self-documenting code.</p>
</li>
<li>
<p>Understand how to make trade-offs. Know the &quot;rules&quot; and when to
break them (e.g. <span class="emphasis"><em>this class needs to
have a large interface because&hellip;</em></span>).</p>
</li>
<li>
<p>Be able to debug, diagnose faults, drill down to find their
cause. Be able to use appropriate tools, debuggers, etc, but more
importantly your <span class="bold"><b>mind</b></span>.</p>
</li>
<li>
<p>Be able to test correctly. Know how to write exhaustive test
harnesses to catch potential problems before they become
issues.</p>
</li>
<li>
<p>Get better at communication. Better at writing specifications,
and interpreting them.</p>
</li>
<li>
<p>Study great programs that other people have written.</p>
</li>
<li>
<p>Learn the theory, do the practice.</p>
</li>
<li>
<p>Find out different ways of working, don't stick to what you
know. Learn other languages, operating systems, paradigms. Learn
scripting languages.</p>
</li>
<li>
<p>Learn assembly language. Really! If you know how what's going on
at the lowest level you have a better frame of reference for the
rest of the OS, and a much more realistic view of the whole system.
This means know how to program for real, not just 'read a book on
assembly'. This point is often written off as a 'old man's
approach' but it has a lot of merit.</p>
</li>
<li>
<p>Seek to be mentored by someone you admire. This is excellent.
It's a big step of humility to ask for this, but a good mentorship
will develop you incredibly.</p>
</li>
<li>
<p>When you are ready, mentor someone yourself - it helps to
challenge and stretch you, solidifies your knowledge, and sharpens
your ability to explain technical detail in depth.</p>
</li>
<li>
<p>Have a 'high level' view and a 'low level' view (i.e.,
program/module versus algorithm/code).</p>
</li>
<li>
<p>Be able to give names to things (there is great power in a name,
and greater power in naming it; this power can be easily abused).
It matters. Check with others that your names are appropriate.</p>
</li>
<li>
<p>Admit you don't know it all.</p>
</li>
<li>
<p>Know your limitations. In many ways this the hardest point here.
Think about it carefully. What are you capable of? What are you
learning but not able to do yet? In many cases you don't know you
have a limitation until you work through it. A thoughtful
understanding of your limitations can lead you to more focused
personal development or more careful and correct programming.</p>
</li>
</ul>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e184" id="d0e184"></a>Keeping
up</h2>
</div>
<p>Another important aspect to developing as a programmer is
keeping yourself up to date. Most programming fields move at a
rapid pace. Having learnt the ropes at one point doesn't mean you
know it all for life. The cutting edge moves on and if you don't
keep a view of it you'll stagnate. What we do now may not make any
sense in 5-10 years time.</p>
<p>You're walking down the road towards a moving destination. Now
that's not exactly helpful, and can be quite frustrating, but it
makes the journey great fun.</p>
<p>It is <span class="bold"><b>our own</b></span> responsibility to
keep our skills up to date, no one else's. Read the latest books.
Subscribe to the appropriate magazines and periodicals. Write about
what you know and seek criticism (C Vu, anyone?). Go to conferences
(the ACCU conference, anyone?). Keep up with the industry news,
from websites, newsgroups and print publications. Most of all, use
what you know on modern projects using current tools and
development environments.</p>
<p>This industry moves fast. What it means to be an expert one day
is different from the next, let alone in a month or a year's
time.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e198" id="d0e198"></a>Skills of a
'programmer'</h2>
</div>
<p>It can be argued that the worst programming languages are those
that need 'gurus' to understand them, so we shouldn't need to be
gurus. However, a programmer in the complete sense isn't just a
code monkey. A programmer is:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>a designer,</p>
</li>
<li>
<p>a detective (they need to be a problem solver),</p>
</li>
<li>
<p>a craftsman (seeing code as art, with balance and aesthetics,
understanding the place of the artistry within the
engineering/mechanics of putting a program together - experts
appreciate the elegance of a well crafted program),</p>
</li>
<li>
<p>a communicator, and</p>
</li>
<li>
<p>a team player.</p>
</li>
</ul>
</div>
<p>An experienced programmer should be able to perform the
following tasks:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>write small programs from scratch in given language,</p>
</li>
<li>
<p>write large programs from scratch using standard libraries
facilities and other third party libraries,</p>
</li>
<li>
<p>do this with more than one language,</p>
</li>
<li>
<p>write clear, self-documenting code,</p>
</li>
<li>
<p>start working on existing codebases comfortably and
sensitively,</p>
</li>
<li>
<p>write complete test harnesses, perform proper testing and
validation, with appropriate debugging,</p>
</li>
<li>
<p>add a self-contained &quot;module&quot; of functionality to a system,</p>
</li>
<li>
<p>maintain code and fix bugs, and</p>
</li>
<li>
<p>architect new programming solutions.</p>
</li>
</ul>
</div>
<p>They have a complete overview of development/deployment process
and understand where they fit into their development team/company,
knowing exactly their roles and responsibilities.</p>
<p>With more responsibility comes the need to lead and manage the
generation of large systems, to be able to create specifications
for these large systems, and coordinate the programming sub-tasks,
ensuring they fit together properly. They can develop their skills,
and also understand the skills of other programmers - working with
them appropriately.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e253" id="d0e253"></a>Experts
again</h2>
</div>
<p>Given all this, we'll ask again what makes an expert. Above all
else, expertise is acclaimed, not self-proclaimed. It is
essentially a <span class="emphasis"><em>recognised</em></span>
characteristic. It's somewhat meaningless to claim to be an expert
unless other experts in the field recognise you as such. If your
field has no other experts then you're in an enviable position and
probably able to command a lot of respect and make a lot of money
whilst having all the technical skills of a charlatan witch
doctor.</p>
<p>How do you know when you're there? It's when other people tell
you!</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e263" id="d0e263"></a>Homework</h2>
</div>
<p>As ever, I'm after responses. What are people's views on the
following subjects?</p>
<div class="variablelist">
<dl>
<dt><span class="term">Certification</span></dt>
<dd>
<p>It is worth it? What value does it give you, and does it
<span class="emphasis"><em>really</em></span> help you develop as a
programmer and more than other personal development routes.</p>
</dd>
<dt><span class="term">University/college courses</span></dt>
<dd>
<p>just how capable a programmer do they make you?</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e284" id=
"d0e284"></a>Conclusion</h2>
</div>
<div class="blockquote">
<blockquote class="blockquote">
<div class="literallayout">
<p>I shall be telling this with a sigh<br>
Somewhere ages and ages hence:<br>
Two roads diverged in a wood and I -<br>
I took the one less travelled by,<br>
And that has made all the difference.<br>
(Robert Frost [<a href="#Frost">Frost</a>])</p>
</div>
</blockquote>
</div>
<p>At points we may have strayed too near to bar-room philosophy
here. Never mind. What we've established is that life is a journey.
Learning is a journey. Moving from being a novice programmer to a
'guru' (whatever that means) is a journey.</p>
<p>We should be not just aiming to become experts, but actively
seeking to develop skills and character at the place on the road we
currently stand. There's a lot to being a programmer, and it's not
necessarily all about programming.</p>
<p>It's only when you're recognised as an &quot;expert&quot; and it appears
that you're &quot;there&quot; that you realise how much you don't know, and
that there's so much further to go.</p>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e299" id="d0e299"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Frost" id="Frost"></a>
<p class="bibliomixed">[Frost] The Road Not Taken. Robert Frost
(1874-1963)</p>
</div>
</div>
<div class="footnotes"><br>
<hr class="c3" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e54" href="#d0e54" id=
"ftn.d0e54">1</a>]</sup> <span class="emphasis"><em>Not</em></span>
everyone, I'm sure. But an awful lot of people secretly wish they
were gurus, and like it when people think (rightly or wrongly) that
they are.</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
