    <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 #15</title>
        <link>https://members.accu.org/index.php/journals/1191</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>


        <h2>Journal Articles</h2>


<div class="xar-mod-head"><span class="xar-mod-title">CVu Journal Vol 14, #4 - Aug 2002 + Professionalism in Programming, from CVu journal</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/journals/">All</a>

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

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

                     &gt;                         <a href="https://members.accu.org/index.php/journals/c113/">144</a>
                    (17)
<br />

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

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

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

                                            <a href="https://members.accu.org/index.php/journals/c113-182/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/journals/c113+182/">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 #15</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 06 August 2002 13:15:54 +01:00 or Tue, 06 August 2002 13:15:54 +01:00</p>
<p><strong>Summary:</strong>&nbsp;<p>The outer limits</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><img src="/var/uploads/journals/resources/goodliffe.png" align="right">I like sweeping
generalisations and tenuous metaphors. Sue me. I've also been doing
my research. I reckon there are over 40 churches in the city I live
in. Now each one of these is subtly different; different types of
people go to each, they do different things. They have different
concerns and ways of working. They exist in different areas.
However they're all doing roughly the same thing (or should
be).</p>
<p>What on earth has this got to do with programming? Well by a
somewhat tenuous link, software development works in pretty much
the same way. Not in that we all file into a building every Sunday
morning (well, most of us don't). Perhaps to outsiders we do both
appear to engage in bizarre rituals and invoke arcane rites to get
our own way with things that are out of the control of normal human
beings.</p>
<p>But what I'm really trying to drive at here is that there is no
single way to program, no one methodology that solves all problems.
There is no one programming language. There are different classes
of problems to be solved in many, many different arenas. In this
article we'll investigate this, discover some of the common domains
we program in, see how they differ, and learn what the particular
problems and challenges are for each.</p>
<p>Some of these arenas overlap. That's natural. Nothing's ever
quite as clear cut as you'd imagine. The following descriptions are
necessarily general, since each of these are big fields with lots
of variation within. Nonetheless, this should give you a flavour of
what's going on out there.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e33" id="d0e33"></a>Applications
programming</h2>
</div>
<p>This is what most non-techies would think of when you mention
the word programming. It's probably the broadest category we'll
consider here.</p>
<p>It is programming 'applications' - self-contained programs - for
single user workstation-like computers. In this world of
development the focus is on end-users and how they use their
desktop machines. Almost exclusively these days it will be
<i class="firstterm">Win32</i> programming. Win32 is the Microsoft
unified API for its 32 bit operating systems (Windows 95, Windows
NT, upwards to Windows XP and whatever other daftly named 32-bit
OSes they care to release in the future).</p>
<p>There are many common languages for this kind of work; our
familiar C and C++ are in there. We also see common use of Visual
Basic and Delphi, plus a number of libraries and frameworks like
MFC, and Qt. Although recently you hear a lot about Linux
programming, that's still not where the applications work is these
days.</p>
<p>Modern application level programming has come on a long way in
recent years. We now have rich environments to work in, threading
support, good user interface libraries, and facilities for network
transparency, for example. There is much more operating system
support provided making applications programming easier, but also
meaning there's a lot more to learn as you get started.</p>
<p>With all this extra support available we have seen the bar
raised on what a 'good' application is. What was acceptable
application behaviour a few years ago is not today. People expect
standard interfaces and look-and-feel, good responsiveness, and
feature packed programs (even if they will only use a fraction of
the features available). The huge 'professional' applications
marketed today are the result of large development teams, with
groups within them specifically focusing on usability issues.</p>
<p>As the times change we are also seeing more of a move towards
webbased systems, applications that run on browsers. This cuts into
the enterprise or distributed programming arenas (described below)
somewhat.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>Desktop applications like web browsers, spreadsheets, etc.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>This tends to be the same kind of machine you are doing the
development on (more often than not an x86 Windows PC).</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>Normally the same workstation you run the program on. Modern
IDEs (Integrated Development Environments) create comfortable
working environments for the programmers, bringing the editor,
compiler, debugger, and help systems together in a single unified
point-and-click interface.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>Users expect high quality programs that conform to standard
interface principles. More features than anyone knows what do with
are order of the day, so much so that new product revisions these
days tend to introduce more features (and bugs) than any problems
they might solve. This appears to be what the market demands.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e76" id="d0e76"></a>Systems
software</h2>
</div>
<p>Figuratively speaking our applications sit on top of rich system
libraries. If applications programming receives a lot of support
from the underlying system then someone's got to supply an
underlying system: this is 'systems programming'.</p>
<p>It is generally for workstation machines too, as above, but not
aimed at the end-users so much. This concerns a lot of the low
level logic that interacts with the computer at a very basic level,
and also middle-level support frameworks that don't interface
directly to hardware, but provide important services to the
system.</p>
<p>The kinds of work in this arena are: writing device drivers
(controlling devices such as printers, storage media, output
devices, etc), writing common shared libraries and utilities for
managing scarce resources, implementing the actual operating
systems controlling the computer, and providing components such as
filing systems and network stacks. Even compilers and installation
tool suites can come under this heading. Each requires a different
approach and presents its own subtle set of challenges.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>Device drivers, a window manager, or a graphics subsystem.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>As for applications programming.</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>Often very similar, too. Writing devices drivers and operating
system components can tend to screw with the computer and make your
system unstable, so it's not uncommon to develop on one machine,
and run the code on a second system. C is by far the most common
language in this arena, although some library level work is done in
C++ these days.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>The key issue to deal with for all these system components is
they must be very stable, since they are foundational blocks of the
entire computing environment. Whilst an application might crash and
have a chance to save work and gracefully recover, a device driver
rarely has such a luxury; it is required to work all the time that
it is running. This could be an awfully long time, so even small
memory leaks will be a major problem. The code will be required to
be efficient, both in terms of space and speed, and will need to be
appropriately tailored to the particular operating environment.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e110" id="d0e110"></a>Embedded
programming</h2>
</div>
<p>Computer technology is showing up everywhere in our daily lives,
whether we're aware of it or not. Consumer electronics products are
requiring more and more software for control, operation and
management. More often than not this software is invisible to the
device's user.</p>
<p>Embedded software developers work under tight constraints. A
user interface (in the commonly understood sense) may not exist; in
fact there may be no direct interaction with a user at all. Usually
there's not much memory, and the code is running on slow
processors. Embedded systems are designed to do one job, and to do
it reliably. Consumer electronics is built down to the lowest price
possible, meaning there isn't a lot of bells and whistles available
to use, and you have to shoehorn a lot of software into the
available device space.</p>
<p>It should appear as if the software is not there, the embedded
device should just work. All the time. Failure is rarely an option
in this kind of work. Contrast this to a desktop computer - it's a
general-purpose machine. It has to be able to word process, play
movies, browse websites, read email, do your accounts, etc. As
users we've been conditioned to accept the odd crash and bit of
instability here and there. Embedded work is a totally different
ballpark.</p>
<p>A good example of this is the modern car industry. We see
vehicles manufactured with several embedded systems, controlling
all sorts of things. However, the users (in this case the driver
and/or passengers) don't have to be at all aware that there are any
microprocessors whirring away under the bonnet. They expect the car
to just work. When an engine management system fails, the users
become acutely aware of the software! Think also about mobile
phones. They are obviously computer driven devices, but not many
consumers think of them as a computer.</p>
<p>An embedded system is basically a combination of a small
computer and either a real-time operating system, or a simple
controlling program. It will have direct control over the hardware
on the device. Embedded systems are usually developed for specific
purposes. In general, embedded systems have only one piece of
software running on them, no highly complex threaded programming
environments are used.</p>
<p>You might consider that programming applications for hand held
devices like PDAs is embedded-level or applications-level work,
depending on where you stand.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>Control software for washing machines, hi-fis, mobile
phones.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>Small custom-made devices with very limited resources.</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>Since you work with custom made devices, the tool chain is also
often custom made. Frequently it's not very advanced at all,
compared to the relative luxury of the applications programmer. (As
the market broadens we are seeing improvements here.) The code is
developed in a <span class=
"emphasis"><em>cross-compilation</em></span> environment, where
target platform is different from host compilation environment.
(Clearly you can't compile C on a washing machine. Yet.)</p>
<p>We write specialised software for each specific device. Almost
universally embedded programming uses C, apart from really low
level work which tends to use assembler. C++ is making inroads into
this area, and ADA has also been used.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>There are all sorts of problems you can encounter, largely
depending on whether you are working with a commodity &quot;off the
shelf&quot; embedded platform or building your own. There are issues of
real-time programming (for example, timely handling of hardware
events and interrupts), direct hardware interfacing, and
controlling peripheral connections, plus tedious low-level concerns
like byte endianness and physical memory layout.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e155" id="d0e155"></a>Distributed
programming</h2>
</div>
<p>Distributed programming develops systems that comprise of more
than just the one computer. The World Wide Web is effectively a
huge distributed system with information being stored on many
computers across the world, and applications being available
remotely via your web browser (for example, eBay and Hotmail). It's
not all about web browsers, though. Working with and designing
distributed systems brings in whole world of new problems.</p>
<p>You might need to 'distribute' a system for a number of reasons.
Perhaps some types of computer are more suited to particular tasks
than others. Perhaps the system is in high demand, and you can
share the workload out among many machines on a network to improve
performance. Perhaps there are physical location restrictions for
certain machines that mandate you must distribute the system.</p>
<p>Effectively, you design a system that comprises a number of
programs on different machines that all work together as a cohesive
whole. The RC5 and SETI screensaver projects are excellent examples
of this kind of work. Each machine in the system is designated a
particular task (or tasks), each task is developed for its target
machine, and then brought together in the final system.</p>
<p>These disparate parts need to be glued together somehow; each of
the programs need to be able to effectively call functions on
remote machines as if they were locally linked to their code. This
is known as <i class="firstterm">remote procedure call</i> (RPC),
and such facilities are provided by a number of available <i class=
"firstterm">middleware</i> technologies. These act as brokers for
data transfer between machines, they describe how you discover and
talk to services on other machines and how you publish your
services for other programs to call. There are security issues
(whose allowed to call who?), network latency issues (what happens
if a remote function call takes too long?), considerations for
balancing synchronous remote function calls with asynchronous
calls, and more.</p>
<p>Some of these middleware systems employ object-oriented
technologies, some take more of a procedural approach. The
middleware is simply &quot;connectivity software&quot; and allows some degree
of platform neutrality. As long as the middleware runs on a given
platform, the calling code shouldn't care what that platform is -
it could be a ZX spectrum for all we care - you will call functions
on it in the same way. Of course, in the design of a distributed
system you will select the appropriate hardware for each task. It's
doubtful you'll see any ZX spectrums knocking about!</p>
<p>Commonly used middlewares are CORBA, the Java RMI and
Microsoft's DCOM. Using these we split the system between user
interface elements, the 'business logic' (real workhorse code), and
any storage required (e.g. a database and query engine). These days
the user interface will often involve a web front end.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>Online purchase system, splitting work between frontend
applications (web interface, in-shop kiosk, and/or phone ordering
system), business logic (manages stock control, implements ordering
system, and separate secure billing) and the shared storage.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>Many different computer systems connected via a middleware,
almost always sitting on top of standard networking protocols.</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>Many and varied. This will depend on languages used, the nature
of each computer in the system and the type of middleware employed.
Often remotely callable interfaces are defined in some from of
<i class="firstterm">interface definition language</i> (IDL) and
'compiled' to an implementation language representation that
provides all the calling glue and provides hooks for each function
implementation to be slotted in to.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>Correct split of services between computers, and of the
communications involved. This can severely affect the &quot;scalability&quot;
of a distributed system. What works for a few transactions a day
may not work efficiently for 100 transactions a minute. This sees a
real need to design carefully. You also have to deal with computer
availability and deal gracefully if one of the computers in the
system becomes unavailable.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e204" id="d0e204"></a>Enterprise
programming</h2>
</div>
<p><span class="emphasis"><em>Enterprise</em></span> is one of
those cheesy buzzwords floating around at the moment, more
management speak than any programmer dialect. An enterprise is
literally a business organisation. So enterprise programming is
providing systems for entire companies, gluing all their separate
systems together to form a unified cohesive whole. Enterprise
programming almost always means the development of large
distributed systems.</p>
<p>They'll commonly be deployed on a company intranet (internal
network), and join the different 'departments' of the business
together to improve workflow. The systems may or may not be
customer facing. Once the organisation is running a computer system
it's generally not too hard to have automated customer interaction.
Perhaps an enterprise system will need to interface to other
companies' systems too, for example to track the delivery status of
goods.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>System for an entire company, managing its normal business
operations.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>A tailored distributed system.</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>As for distributed systems. We'll probably be working with huge
data stores, perhaps various database technologies from previous
internal systems ('legacy systems' in manager speak). XML is all
the rage here.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>As for distributed systems.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e238" id="d0e238"></a>Numerical
programming</h2>
</div>
<p>This kind of work involves scientific, highly technical tasks
making heavy use of mathematics. This is another highly specialised
area, which requires writing applications specifically targeted at
particular numerical problems. The programs are often aimed at
supercomputers, the fastest type of computer, capable of massive
number crunching operations. Although we're still living in times
where the 'fastest' type of computer is changing from year to year,
these are very expensive platforms, employed for specialized
applications that require immense amounts of mathematical
calculations.</p>
<p>Weather forecasting, for example, requires a supercomputer (or
perhaps a gift of prophesy!). We also see supercomputers used for
animated graphics, fluid dynamic calculations, and other areas that
require highly complex mathematical investigation and calculation.
A supercomputer is not a mainframe. The latter is a high
performance computer designed to execute as many programs as
possible concurrently, often used as a centralised computing
resource in a business setting. A supercomputer channels all its
power into executing a few programs as fast as possible. There are
a number of different supercomputer architectures exploiting
different technological advances, each requiring different
algorithmic approaches to fully exploit their power.</p>
<p>This kind of work requires high performance algorithms to get as
many calculations done as possible, to really capitalise on the
performance of the computing platform. It is common to make use of
carefully designed, heavily optimised numerical libraries, and to
make explicit use of parallel processing, designing this into the
computational algorithms and processes. This will involve both task
and data parallelism, either performing many similar tasks on many
CPUs at once, or pipelining the algorithm, performing different
parts of it on different CPUs.</p>
<div class="variablelist">
<dl>
<dt><span class="term">Typical products:</span></dt>
<dd>
<p>Fields involving highly complex mathematical investigation, for
example nuclear energy research or petroleum exploration.</p>
</dd>
<dt><span class="term">Target platform:</span></dt>
<dd>
<p>Often supercomputers.</p>
</dd>
<dt><span class="term">Development environment:</span></dt>
<dd>
<p>Although there is work on advancing numerical programming
support in C++, and some of this kind of work is performed in C, a
lot of numerical programming is done in Fortran.</p>
</dd>
<dt><span class="term">Common problems/challenges:</span></dt>
<dd>
<p>Crafting efficient algorithms to really exploit the power of the
supercomputer.</p>
</dd>
</dl>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e272" id=
"d0e272"></a>Conclusion</h2>
</div>
<p>Of course there are other areas than these, some pretty well
defined, others more ephemeral. I can think of <i class=
"firstterm">safety critical systems</i> as one example.</p>
<p>There is a commonality we can observe: each of these different
development realms requires fundamental design decisions to be made
to suit software to them. Applications level code is not generally
suited to an embedded environment, or a workstation application
design may not scale when applied to a distributed system. This
means that software developers tend to specialise in particular
fields, and learn to think in particular patterns that suit their
'world'. Understanding the very real concerns of each environment
will make you a more flexible and mature programmer.</p>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
