    <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 #8</title>
        <link>https://members.accu.org/index.php/articles/1121</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 13, #3 - Jun 2001</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/c120/">133</a>
<br />

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

                    -                        <a href="https://members.accu.org/index.php/articles/c182+120/">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 #8</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 06 June 2001 13:15:46 +01:00 or Wed, 06 June 2001 13:15:46 +01:00</p>
<p><strong>Summary:</strong>&nbsp;<p>The Programmer's Toolbox</p></p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e22" id="d0e22"></a></h2>
</div>
<p>To be a productive workman you need a good set of tools. A
plumber has a collection of items in his toolbox that will support
him in whatever task he encounters. Not only the existence, but
also the <span class="emphasis"><em>quality</em></span> of these
tools is a vital issue: a good craftsman is only as good as his set
of tools. If our plumber has a set of dodgy compression valves
there will be water everywhere, no matter how good he is.</p>
<p>The same is true of programming. If we want to do a good job, we
need to be backed up by an appropriate kit of tools. Tools in which
we have confidence, know how to use and which are fit for the jobs
we will encounter.</p>
<p>In the past few columns we have covered a number of issues that
relate to some particular tools. Here we will broach the subject of
<span class="emphasis"><em>software tools</em></span> as a whole.
Programming is a field that simply cannot do without tools. From
day to day we use tools without much of a thought for them. We can
take our compiler for granted in much the same way we take a tin
opener for granted - it is fine whilst it works, but as soon as it
goes wrong (or we need to open an odd shaped tin) we are stuck, no
matter how fancy the tin opener is. A cheap, basic tin opener that
works is better than some pretentious contraption that does
not.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e36" id="d0e36"></a>Why bother with
tools?</h2>
</div>
<p>So we cannot get by without using a certain number of software
tools<sup>[<a name="d0e41" href="#ftn.d0e41" id=
"d0e41">1</a>]</sup> in order to create programs. Other tools we
can get by without, but they still have a genuine use. In order to
improve our productivity, quality, and therefore professionalism,
it is good to pay a little attention to what tools we are using and
what they really do.</p>
<p>Some help you write code. Some help you write good code. Some
pretend to write code for you.</p>
<p>If you understand how your tool works, and which tool to use for
which job, you are better able to produce code that has no nasty
surprises, and produce it more quickly. We need to be clear in our
minds <span class="emphasis"><em>why</em></span> we actually use
tools: tools do not do our work for us - they help us to do it.
This is a reason why I am generally wary of &quot;wizard&quot; generated code
- do you honestly understand all of the pages of code the wizard
has generated and are you able to safely extend it? If not, can you
really have confidence in what the tool is doing?</p>
<p>Different tools have different focuses, ranging from a very
specific task (e.g. calculate the bit rate of an mpeg stream based
on a couple of input parameters) to the scope of an entire project
(e.g. a collaborative project management environment). Some tasks
are naturally more tool-able than others.</p>
<p>Programmers have wildly varying attitudes towards using and
selecting tools. In use, some just plug away at a tool until it
does something like what they want and just stick with that. (Just
because you've run it without generating an error does that mean
the tool has done <span class="emphasis"><em>exactly</em></span>
what you wanted?) Some programmers, on the other hand, carefully
read the documentation to find out exactly what can be done. What
is the right approach?</p>
<p>Some programmers encounter a lengthy task and laboriously do it
by hand, others write a tool in a scripting language to do the job
automatically, others spend hours searching for a pre-written tool
to do the job for them. What is the right approach?</p>
<p>Part of becoming a more 'professional' programmer is
understanding that balance, and being able to make the distinction.
It is true that everyone is different and everyone works
differently. But if you saw someone converting their C code into
assembler by hand on a day-to-day basis, you might begin to
question their sanity.</p>
<p>Different tools work in different ways, and obviously the
platform and environment they fit into play a huge part in this.
Command line Unix tools are very different from highly graphical
Windows-based utilities, but that does not make them any the less
useful (in fact, it can make them an awful lot more powerful). A
thorough understanding of your development platform enables you to
get the most from the tools you use. Do you prefer all the tools
glued together (in a monolithic GUI that takes forever to set up
just as you like it), or packaged as discrete command line entities
(with complicated and disparate interfaces that are not easy to
understand)? This to a large extent will depend on your mindset and
prior experience. I would challenge each of us to try working the
other way on a reasonably sized project to fully understand pros
and cons<sup>[<a name="d0e65" href="#ftn.d0e65" id=
"d0e65">2</a>]</sup> of each.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e69" id="d0e69"></a>Using
tools</h2>
</div>
<p>It is important to understand the platform you are working on
and what it can do for (or with) you. One huge benefit of command
line Unix tools is in their use as filters when &quot;piped&quot; together -
splicing small individual tools together to make a larger utility.
If you do not know much about this, I urge you to read up on
it<sup>[<a name="d0e74" href="#ftn.d0e74" id="d0e74">3</a>]</sup>.
Understanding the power of the tools and how they inter-operate
brings significant benefits.</p>
<p>Even just knowing the general sorts of tools that exist, where
you can find them and what you can expect from them will make you
better prepared to use a tool. It will help you be able to make the
choice between searching for a tool for a particular task, writing
it yourself or (if it is a truly one off, fairly short task) doing
it by hand. Being ready to try a new tool and to take the time to
learn how to use it is beneficial. You might need to find new tools
if you start a new project/platform, you have a new problem to
solve, or your old tools become deprecated.</p>
<p>Reading the manuals and supporting documentation for your tools
may pay for itself at the end of the day. Do you even know where to
find full documentation on each tool you use? GUI tools give the
impression of never hiding esoteric functionality because all the
options are available in a dialogue box - you do not need to read
the docs. In experience this is not quite how it works, though.</p>
<p>Finally, tools seem to develop at an incredible rate. In this
industry technology changes fast. Some tools develop at a much
faster rate than others. It is important to understand what is
going on with the tools that we use - so that we do not get out of
date, and therefore have a possibly buggy and unsupported toolkit.
But this should be done cautiously - not necessarily chasing the
latest version blindly. The bleeding edge can be painful!</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e84" id="d0e84"></a>What
tools?</h2>
</div>
<p>Over the years various tools have been developed to scratch
particular itches, the needs that often cropped up. When a task has
had to be done many times, then you can bet someone has written a
tool for it. Most of these are available for the software engineer
to use (thank goodness for the internet!).</p>
<p>Having access to the source code for your tools can be
instrumental in diagnosing problems that you encounter, allowing
you to work out exactly what the tool does and how it behaves. This
might be a deciding factor in your choice of some tools. However,
the factor that will most likely affect whether you'll adopt a
particular tool is how well it fits into your personal development
practice, followed by the cost, how configurable it is (does it
enforce a working style that you do not like), is it easy to use,
is it well documented, is it reliable and does it have a proven
track record?</p>
<p>Exactly what comprises your toolkit will depend on your line of
work. The available tools for embedded platforms are rarely as rich
as for desktop machines. However, we'll consider some of the more
common components below. Some are obvious, some perhaps not so.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e93" id="d0e93"></a>Source code
editor</h3>
</div>
<p>Perhaps the most obvious tool we use. Also perhaps the most
fundamental tool - the programmer will spend most of their time
using this piece of software. But that is why it should be very
carefully chosen. The One True Source Editor is an age old debate
which does not need stirring here, but you should use a source
editor that you find comfortable and does what you require. Just
because an editor is embedded in your visual IDE does not mean that
it is the best editor for your purposes. On the other hand, you may
find that having it integrated is an incredible boon. For source
editing, I personally require at least the following from my source
editor:</p>
<div class="itemizedlist">
<ul type="disc">
<li>
<p>Syntax colouring (with support for <span class=
"emphasis"><em>many</em></span> languages)</p>
</li>
<li>
<p>Simple syntax checking (e.g. highlighting mismatched braces)</p>
</li>
<li>
<p>Good incremental search facilities</p>
</li>
<li>
<p>Macro recording</p>
</li>
<li>
<p>Highly configurable</p>
</li>
<li>
<p>Works across every platform that I use.</p>
</li>
</ul>
</div>
<p>My requirements and choice of editor may not be yours.</p>
<p>e.g. vim, emacs, IDE editors, UltraEdit</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e124" id="d0e124"></a>Compiler</h3>
</div>
<p>The next most taken for granted tool. What else can convert our
source code into machine code? Since we use this tool so
pervasively, is not it important that we are sure how to use it? Do
we really know all the options that it has? Do we understand what
level of optimisation we require, and how that might change our
code?<sup>[<a name="d0e129" href="#ftn.d0e129" id=
"d0e129">4</a>]</sup> It is true that in many places of work there
is a specific <span class="emphasis"><em>buildmaster</em></span>
who ensures that tools in the build process are used correctly, but
that is not an excuse to be unfamiliar with the compiler.</p>
<p>As another example, do you compile with all warnings switched
on? There really is no excuse not to (perhaps only if you are
maintaining legacy code that is already full of warnings). The
warnings highlight potential errors and (when removed) give you
extra confidence in your code. Also, is the compiler ISO standard
[<a href="#ISO">ISO</a>] compliant by default? Does it have any
non-standard extensions, and do you know what they are and how to
avoid them?</p>
<p>Often we use a &quot;cross compiler&quot; when writing code for an
embedded environment. This simply means that the target platform is
different from the development one (after all, it is hard to run
visual C++ on a washing machine).</p>
<p>The compiler is often considered a single part of a larger
development tool chain, including the linker, assembler, debugger,
profiler, simulator and other object-file manipulators.</p>
<p>e.g. gcc, Visual C++, Borland C++ builder</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e147" id="d0e147"></a>Debugger</h3>
</div>
<p>The availability of a good quality debugger and understanding
how to use it can save hours of development time chasing surprising
behaviour. It allows you to investigate paths of execution in your
code, break into it, investigate variable values, set breakpoints
and generally dissect your running program. It is an order of
magnitude more sophisticated than using <tt class=
"function">printf</tt> statements!</p>
<p>e.g. gdb, ddd, IDE debuggers</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e157" id="d0e157"></a>Profiler</h3>
</div>
<p>Used when code runs unacceptably slowly. The profiler times
sections of running code and identifies potential bottlenecks. This
tools is invaluable for optimisation and will prevent you from
speeding up code that is only run once in a blue moon.</p>
<p>e.g. gprof, IDE profilers</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e164" id="d0e164"></a>Code
validators</h3>
</div>
<p>Code validators come in two varieties, static and dynamic. The
former can be run over code in a similar way to a compiler, to
identify possible problem areas in the code. Lint is a good example
of such a program - performing static checking for a series of
common coding errors in C. A lot of this kind of functionality
tends to be built into modern compilers, but there are still a
number of very valuable tools available to complement this.</p>
<p>Dynamic validators modify the code as it is compiled, and then
perform checking at run time. Memory allocation/bounds checkers are
an example of this - ensuring that all dynamically allocated memory
is freed appropriately, and that array accesses do not occur out of
bounds. Again, the value of these types of tools cannot be stressed
- they can save hours of legwork finding obscure bugs. They can be
much more useful than a debugger in some situations.</p>
<p>e.g. Lint, Insure++, MemProf</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e173" id="d0e173"></a>Build
environment</h3>
</div>
<p>The tools that comprise the build environment are more than just
the compiler and linker. The kind of tools that are used are the
&quot;make&quot; build tool, or the build portions of your IDE. They automate
the compilation process. Many Unix open source projects use the
autoconf/automake tools to simplify the build environment.</p>
<p>e.g. make, IDE build tools, automake/autoconf</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e180" id="d0e180"></a>Fault
tracking</h3>
</div>
<p>A good shared database allowing colleagues to log, query,
assign, reply to, and fix faults is essential to ensuring the
quality of a product. Without something like this we cannot ensure
that we have addressed every issue that has cropped up. Capturing
and storing this information is useful when looking back over code
at a later date.</p>
<p>e.g. Bugzilla, Matrix</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e187" id="d0e187"></a>Software
components/libraries</h3>
</div>
<p>Yes, these are tools! Reusing software components and finding
libraries that do what we need prevents us from having to reinvent
the wheel.</p>
<p>e.g. STL, Boost, Rogue Wave libraries</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e194" id="d0e194"></a>Source
navigation tools</h3>
</div>
<p>There is a whole field of tools to help you delve into and
understand code, either presenting it in some graphical map, or
enabling you to search/navigate through the code base. This can be
especially useful on large code bases or when entering a project
that is well established.</p>
<p>Good example of such tools are LXR, SNiFF+, the McCabe toolset
and the venerable ctags.</p>
<p>We should also consider Unix source level tools such as diff,
which allows us to compare differences in files (to see how it has
been modified by someone else, for example) and grep for searching
for information in files, plus locate/find to discover where in the
build tree files are. (Naturally there are GUI equivalents on most
platforms.)</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e203" id="d0e203"></a>Source control
and project management</h3>
</div>
<p>We will not dwell on source control tools here, since we covered
it in the previous column [<a href="#Goodliffe7">Goodliffe7</a>].
Management and work collaboration tools may be fundamental to a
company is method of working allowing you to report and track work
against the schedule, possibly encompassing fault tracking.</p>
<p>e.g. CVS et al. MS Project, Achievo</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e213" id="d0e213"></a>Source
generation</h3>
</div>
<p>There are a number of tools that exist in order to generate code
for us. Some of them, as I mentioned earlier, do not necessarily
fill me with confidence. However, in the past I have written Perl
scripts to generate code automatically. Having written the
generator I trusted the code generated.</p>
<p>There are a number of other interesting code generators. For
example, Yacc is a Unix LALR(1) parser generator. You use it to
generate code to parse well formed input (by defining the input
grammar). It spits out a C parser with hooks that you can write.
Bison is a similar tool.</p>
<p>There is a class of code generation tools that help you design
user interfaces, and then spit out the workhorse backend code.
These are especially used for complex GUI toolkits like MFC. I am
inclined to think that if the library needs a tool to do so much
legwork, it implies the library is fundamentally broken in the
first place.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e222" id="d0e222"></a>Documentation
tools</h3>
</div>
<p>Documentation is invaluable to code that is well engineered.
Documentation needs to be read as well as written. Good online help
systems (backed up by a quality bookshelf) are
critical<sup>[<a name="d0e227" href="#ftn.d0e227" id=
"d0e227">5</a>]</sup>. The use of manuals, understanding how to web
search well, as well as reading appropriate newsgroups and FAQs all
contribute to your pool of available knowledge.</p>
<p>We also need to be able to write good documentation. We
mentioned code documentation tools in a previous article [<a href=
"#Goodliffe5">Goodliffe5</a>]. We also need a good document
processor (word processor or some such).</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e236" id="d0e236"></a>Testing
toolchain</h3>
</div>
<p>Appropriate testing is vital to producing reliable, high quality
software. It is often neglected - and largely because it is &quot;too
much work&quot;, distracting attention away from the important task of
writing code. This is one of the most dangerous threats to good
software engineering. There are tools that help automate unit
testing. This brings a host of advantages (we'll talk about this in
a later column). Good testing is one of the tenets of the Extreme
Programming movement.</p>
<p>As well as automated testing, tools can be available for the
generation of test data or test cases, and for simulation of the
target platform, perhaps with options to simulate particular error
conditions (low memory, high load, etc).</p>
<p>e.g. Jtest</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e245" id="d0e245"></a>Others</h3>
</div>
<p>And naturally there are many more tools we use, for example OO
analysis/design tools to help us compose object oriented systems,
tools for evaluating code metrics and to investigate the quality of
our code There are also scripting languages with which we can write
other tools as needed (a little Unix shell goes a long way, but
understanding the right language for the right job is an essential
bit of background knowledge for the aspiring professional
programmer).</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e250" id=
"d0e250"></a>Conclusion</h2>
</div>
<p>It is enlightening for us to evaluate the set of tools that we
use. Do we really know how to use our current tools? Are there any
other tools we really require? Are we fully using the ones
available to us?</p>
<p>At the end of the day, a tool is only as good as its user. The
maxim bad workman blames his tools contains a lot of truth. A poor
programmer will produce poor code no matter how many tools they
have used. In fact, sometimes tools help provide spectacularly
worse code. Fostering a professional, responsible attitude towards
our toolbox will make us better programmers.</p>
<div class="sidebar">
<p class="title c3">Software References</p>
<p><span class="bold"><b>Editors</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Vim</span></dt>
<dd>
<p><a href="http://www.vim.org/" target=
"_top">http://www.vim.org/</a></p>
</dd>
<dt><span class="term">Emacs</span></dt>
<dd>
<p><a href="http://www.gnu.org/software/emacs/" target=
"_top">http://www.gnu.org/software/emacs/</a></p>
</dd>
<dt><span class="term">UltraEdit</span></dt>
<dd>
<p><a href="http://www.ultraedit.com/" target=
"_top">http://www.ultraedit.com/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Compilers</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">gcc</span></dt>
<dd>
<p><a href="http://www.gnu.org/software/gcc/" target=
"_top">http://www.gnu.org/software/gcc/</a></p>
</dd>
<dt><span class="term">Visual C++</span></dt>
<dd>
<p><a href=
"http://msdn.microsoft.com/vstudio/technical/documentation.asp"
target=
"_top">http://msdn.microsoft.com/vstudio/technical/documentation.asp</a></p>
</dd>
<dt><span class="term">Borland C++ Builder</span></dt>
<dd>
<p><a href="http://www.borland.com/bcppbuilder/freecompiler/"
target=
"_top">http://www.borland.com/bcppbuilder/freecompiler/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Debuggers</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">gdb</span></dt>
<dd>
<p><a href="http://www.gnu.org/software/gdb/" target=
"_top">http://www.gnu.org/software/gdb/</a></p>
</dd>
</dl>
</div>
<div class="variablelist">
<dl>
<dt><span class="term">ddd</span></dt>
<dd>
<p><a href="http://www.gnu.org/software/ddd/" target=
"_top">http://www.gnu.org/software/ddd/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Profilers</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">gprof</span></dt>
<dd>
<p>On Unix, man gprof</p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Code validators</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Lint</span></dt>
<dd>
<p><a href=
"http://lclint.cs.viginia.edu/,%20http://www.gimpel.com/lintinfo.html"
target="_top">http://lclint.cs.viginia.edu/,
http://www.gimpel.com/lintinfo.html</a></p>
</dd>
</dl>
</div>
<div class="variablelist">
<dl>
<dt><span class="term">Insure++</span></dt>
<dd>
<p><a href="http://www.parasoft.com/products/insure/index.html"
target=
"_top">http://www.parasoft.com/products/insure/index.html</a></p>
</dd>
</dl>
</div>
<div class="variablelist">
<dl>
<dt><span class="term">MemProf</span></dt>
<dd>
<p><a href="http://people.redhat.com/otaylor/memprof/" target=
"_top">http://people.redhat.com/otaylor/memprof/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Build environment</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">make</span></dt>
<dd>
<p>For GNU make <a href="http://www/gnu.org/software/make/" target=
"_top">http://www/gnu.org/software/make/</a></p>
</dd>
</dl>
</div>
<div class="variablelist">
<dl>
<dt><span class="term">autoconf/automake</span></dt>
<dd>
<p><a href="http://sources.redhat.com/autobook" target=
"_top">http://sources.redhat.com/autobook</a>, <a href=
"http://www.gnu.org/software/automake/" target=
"_top">http://www.gnu.org/software/automake/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Fault tracking</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Bugzilla</span></dt>
<dd>
<p><a href="http://www.mozilla.org/projects/bugzilla/" target=
"_top">http://www.mozilla.org/projects/bugzilla/</a></p>
</dd>
<dt><span class="term">Matrix</span></dt>
<dd>
<p><a href="http://www.matrix-one.com/" target=
"_top">http://www.matrix-one.com/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Libraries</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Boost</span></dt>
<dd>
<p><a href="http://www.boost.org/" target=
"_top">http://www.boost.org/</a></p>
</dd>
<dt><span class="term">Rogue Wave</span></dt>
<dd>
<p><a href="http://www.roguewave.com/" target=
"_top">http://www.roguewave.com/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Source navigation</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">LXR</span></dt>
<dd>
<p><a href="http://lxr.linux.no/" target=
"_top">http://lxr.linux.no/</a></p>
</dd>
<dt><span class="term">SNiFF+</span></dt>
<dd>
<p><a href="http://www.windriver.com/products/html/sniff.html"
target=
"_top">http://www.windriver.com/products/html/sniff.html</a></p>
</dd>
<dt><span class="term">Ctags</span></dt>
<dd>
<p><a href="http://ctags.sourceforge.net/" target=
"_top">http://ctags.sourceforge.net/</a></p>
</dd>
<dt><span class="term">McCabe toolset</span></dt>
<dd>
<p><a href="http://www.mccabe.com/" target=
"_top">http://www.mccabe.com/</a></p>
</dd>
<dt><span class="term">diff, grep, locate, find</span></dt>
<dd>
<p>On Unix, man diff, man grep, man locate, and man find</p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Source control and project
management</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">CVS</span></dt>
<dd>
<p><a href="http://www.cvshome.org/" target=
"_top">http://www.cvshome.org/</a></p>
</dd>
<dt><span class="term">Achievo</span></dt>
<dd>
<p><a href="http://www.achievo.com/" target=
"_top">http://www.achievo.com/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Source generation</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Yacc</span></dt>
<dd>
<p>On Unix, man yacc</p>
</dd>
<dt><span class="term">Bison</span></dt>
<dd>
<p><a href="http://www.gnu.org/software/bison/" target=
"_top">http://www.gnu.org/software/bison/</a></p>
</dd>
</dl>
</div>
<p><span class="bold"><b>Testing</b></span></p>
<div class="variablelist">
<dl>
<dt><span class="term">Jtest</span></dt>
<dd>
<p><a href="http://www.parasoft.com/products/jtest/" target=
"_top">http://www.parasoft.com/products/jtest/</a></p>
</dd>
</dl>
</div>
</div>
</div>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e509" id="d0e509"></a>References</h2>
</div>
<div class="bibliomixed"><a name="ISO" id="ISO"></a>
<p class="bibliomixed">[ISO] ISO Standard X3J16/96-0225 WG21/N1043.
International Standard for Information Systems - Programming
Language C++.</p>
</div>
<div class="bibliomixed"><a name="Goodliffe7" id="Goodliffe7"></a>
<p class="bibliomixed">[Goodliffe7] Pete Goodliffe. Professionalism
in Programming #7: Practising safe source. <span class=
"citetitle"><i class="citetitle">C Vu</i></span>, Volume 13 No 2.
ISSN: 1354-3164.</p>
</div>
<div class="bibliomixed"><a name="Goodliffe5" id="Goodliffe5"></a>
<p class="bibliomixed">[Goodliffe5] Pete Goodliffe. Professionalism
in Programming #5: Documenting Code. <span class=
"citetitle"><i class="citetitle">C Vu</i></span>, Volume 12 No 6.
ISSN: 1354-3164.</p>
</div>
</div>
<div class="footnotes"><br>
<hr class="c4" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e41" href="#d0e41" id=
"ftn.d0e41">1</a>]</sup> By 'tools' we mean small programs used as
'utilities' in our development work. Programs to build programs -
if that is not too philosophical.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e65" href="#d0e65" id=
"ftn.d0e65">2</a>]</sup> It seems to me that a lot of GUI tools are
less flexible, more expensive versions of command line tools.
They're not all bad, though!</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e74" href="#d0e74" id=
"ftn.d0e74">3</a>]</sup> man bash is a good place to start, search
for &quot;Pipelines&quot;.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e129" href="#d0e129" id=
"ftn.d0e129">4</a>]</sup> It is important - it will affect how
surprisingly the code runs in the debugger.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e227" href="#d0e227" id=
"ftn.d0e227">5</a>]</sup> Good systems support is something we all
dream of, too.</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
