    <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 #12</title>
        <link>https://members.accu.org/index.php/articles/1152</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, #1 - Feb 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/c116/">141</a>
<br />

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

                    -                        <a href="https://members.accu.org/index.php/articles/c182+116/">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 #12</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 06 February 2002 13:15:49 +00:00 or Wed, 06 February 2002 13:15:49 +00:00</p>
<p><strong>Summary:</strong>&nbsp;<p>Recipe for a program</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="informaltable">
<table border="1" cellspacing="0">
&lt;colgroup&gt;
&lt;col&gt;&lt;/colgroup&gt;
&lt;tbody&gt;
<tr>
<td>
<div class="literallayout">
<p><span class="bold"><b>Ingredients</b></span><br>
1 bunch programmers (preferably fresh)<br>
1-2 tsp language<br>
1 target platform<br>
1 project manager<br>
1 pinch luck<br>
1 sachet dehydrated training<br>
Various industry buzzwords<br>
<br>
<span class="bold"><b>Instructions</b></span></p>
</div>
<p>Marinade programmers in training. Add the language, target
platform and season with project manager. Stir briskly until well
mixed. Add buzzwords to taste. Sprinkle evenly with luck and leave
to cook in a hot software oven until deadline. Remove, tip onto
wire tray and allow to cool before handing on to customer</p>
</td>
</tr>
&lt;/tbody&gt;
</table>
</div>
<p><img src="/var/uploads/journals/resources/pete_goodliffe_pip12_instant.png" align=
"right">Sadly there is no magic formula or simple recipe for
creating software. A system can be built in a number of different
ways, with no one way necessarily better than another. I know at
least four recipes for sponge cake (available on request). They
vary depending on whether you want a fatless or an eggless cake,
for example, and also on the method you want to prepare with.
Software engineering is a bit like that. There is no one recipe.
There are different ingredients that you may choose to feed the
development process, and different methods to follow. Likely as not
they will each produce a slightly different cake; different in
terms of features, structure, stability, extensibility,
maintainability, and more.</p>
<p>If we are software engineers we should be able to predictably
(and to some extent reproducibly) create software by following a
defined procedure. In this article we'll investigate some of the
&quot;recipes&quot; for creating software, compare, contrast and criticise.
These recipes describe the software life cycle, the phases of
development ranging from the very beginning (conceptualising the
software) to its very end (decommissioning it).</p>
<p>We programmed a ZX spectrum differently from a palmtop PDA, and
that differently from a mainframe stock control system with a high
capacity web interface. We program differently alone than we would
in working in a pair, and differently than we would in a 50-strong
world-wide project team. Differences in target platform and
development team (and their levels of experience) will shape the
choice of &quot;recipe&quot;. Programming is much more than just edit,
compile, link, and run.</p>
<p>So what are these recipes?</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e46" id="d0e46"></a>Recipes: the
how and the what</h2>
</div>
<p>There are two subtly different aspects to investigate. If we
build software using a &quot;recipe&quot; we are employing some <i class=
"firstterm">development process</i> and also a programming
<i class="firstterm">methodology</i>. The two are separate and
connected. The process describes the steps taken to construct
software. Most software construction is not a one-person job; the
process also explains how to get a number of people to build a
coherent whole. Or at least, it should attempt to.</p>
<p>The methodology is an underlying technology for dissecting,
building, and then gluing the software together. It will quite
likely be influenced by the choice of development process, but
needn't be. It's more likely to be influenced by a target
language<sup>[<a name="d0e59" href="#ftn.d0e59" id=
"d0e59">1</a>]</sup>.</p>
<p>We'll in turn look at methodologies then development processes.
The following is not a textbook description of these topics. If you
want or need that you can look it up easily enough.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e65" id="d0e65"></a>Programming
methodologies</h2>
</div>
<p>A programming methodology is how a solution is decomposed and
then modelled by the target language. We have to &quot;model&quot; a solution
since useful systems can't be entirely held in the mind of a single
developer at once. Perhaps the only breed of program that could is
the infamous &quot;hello world&quot; program, and its not particularly useful
anyway.</p>
<p>The methodologies shape how we split a project up into
manageable pieces. Since it shapes the design of the system it will
therefore have a part in influencing the design process used.</p>
<p>The different language methodologies fall into two main camps:
<i class="firstterm">imperative</i> languages and <i class=
"firstterm">declarative</i> languages. Imperative (or procedural)
languages allow you to specify the explicit sequence of steps to
follow to produce the program's output. Declarative languages
describe relationships between variables in terms of inference
rules (functions) and the language executor applies some fixed
algorithm to these rules to produce the result.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e80" id="d0e80"></a>Structured
programming</h3>
</div>
<p>Booch describes OO programming as &quot;a method of implementation in
which programs are organised as co-operative collections of
objects, each which represents an instance of some class, and whose
classes are all members of a hierarchy of classes united via
inheritance relationships.&quot; [<a href="#Booch">Booch</a>]. It is
another imperative methodology.</p>
<p>This is very much a data-centred model. We think about the life
of the data and how it moves about, rather than the sequence of
steps that need to be taken to get the job done. 'Objects' (the
data) have behaviour (they do things) and state (which changes when
they do things). This is implemented at language level by methods
on classes of objects.</p>
<p>OO programming started with Simula around 1970, and is recently
popularised with C++ and Java. One of the few 'pure' OO programming
languages is Smalltalk. These days there are many other OO
languages. A number are structured languages with fashionable OO
'bolt-ons'.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e92" id="d0e92"></a>Functional
programming</h3>
</div>
<p>This is a declarative programming methodology based on typed
lambda-calculus, a more mathematical model of programming. You work
with values, functions and functional forms. Functional programs
are generally compact and elegant, although seldom compiled. They
are therefore reliant on a language executor. The program's
performance is governed by this executor - they can be quite slow
and memory-hungry<sup>[<a name="d0e97" href="#ftn.d0e97" id=
"d0e97">2</a>]</sup>.</p>
<p>The structured and OO methodologies are far more popular in
mainstream use than any declarative languages, although that
doesn't diminish the usefulness of this breed of programming. They
have different strong points and uses.</p>
<p>Common functional programming languages are Lisp (although it
does contain non-functional elements), Scheme, ML, and Haskell.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e105" id="d0e105"></a>Logic
programming</h3>
</div>
<p>This is another declarative methodology, in which you provide
the executor with a set of axioms (rules) and a goal statement. A
set of built-in inference rules (over which the programmer has no
control) are applied to determine whether the axioms are sufficient
to ensure the truth of the goal statement. The program execution is
essentially the proof of the goal statement.</p>
<p>The best known logic programming language is Prolog.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e112" id="d0e112"></a>Development
processes</h2>
</div>
<p>There are as many processes as there are people who feel like
inventing them. Generally they are slight evolutions of a few basic
models. Here are some of the basic models. Some of these are very
closely related, as you will see.</p>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e117" id="d0e117"></a>Ad hoc</h3>
</div>
<p>It's a starting point, but really an anti-process. Here there is
no process, or it is undocumented. Everybody works to their own
agenda, and hopefully something useful will drop out the end.</p>
<p>If an organisation doesn't know how it builds software then it's
in an unforgivable state. Even if it's a small organisation who
think theydo not need it. There is no guarantee the software will
be delivered on time, since there's no accountability. Who can
guarantee that all the features will be implemented?</p>
<p>A lot of 'open source' software is created using this chaotic
method<sup>[<a name="d0e126" href="#ftn.d0e126" id=
"d0e126">3</a>]</sup>. If you have an infinite number of monkeys
and an infinite number of computers you might eventually get a
program out - however it isn't feasible to wait the requisite
infinite amount of time. Even back of napkin designs are a step
towards a more formal, predictable development process.</p>
<p>This case is anarchy. Individual employees may work hard and may
eventually produce something of value, however this outcome cannot
be seriously relied upon. The team is likely to be very
inefficient, and will probably never deliver anything of value.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e132" id="d0e132"></a>Waterfall</h3>
</div>
<p>The 'waterfall' is the classic software development lifecycle.
It is much criticised for its simplicity (or even for being old
fashioned), however practically every other development process is
in some way based on it. It is modelled after a more conventional
engineering life cycle, and was described by W.W. Royce in 1970
[<a href="#Royce">Royce</a>].</p>
<p>It is a simple idea; the development process is broken up into a
number of stages, which run one after the other. This is likened to
a waterfall because of the steady irreversible flow from one stage
to another. Just as water always flows downward toward the river,
the development always flows downward through the stages toward
release.</p>
<p>This is the traditional waterfall illustration:</p>
<div class="c3"><img src=
"resources/pete_goodliffe_pip12_waterfall.png" align=
"middle"></div>
<p>You can see the five standard stages. These are described in the
<span class="bold"><b>Stages of development</b></span> sidebar.
Once a stage is successfully completed progression is made via some
&quot;gating process&quot; (usually a review meeting) to the next stage. The
output of most stages is a document; a requirements specification,
a design specification, or some such. If the review finds an error,
it is generally fed back up-stream setting that stage back
again.</p>
<p>Following this model you can't easily backtrack to make changes;
its like a salmon expending massive amounts of time and energy
swimming back upstream. This means that the process is not helpful
when changes are made late in the development process. The
requirements must be fixed before system design, and it is
difficult to accommodate too many alterations after the process is
underway. Generally problems at the design stage are not discovered
until system testing.</p>
<p>In its favour, though, it is simple to manage and is the basis
for most other development models.</p>
<div class="sidebar">
<p class="title c4">Stages of development</p>
<p>The waterfall model describes five of stages in the life of a
software process.</p>
<div class="orderedlist">
<ol type="1">
<li>
<p><span class="bold"><b>Requirements analysis</b></span>. First,
the requirements of the &quot;to be developed&quot; software are established.
This scopes its goals, the services it will provide, and what
constraints it needs to work within. Often this step is preceded by
a feasibility study to kick the project off, or feasibility is done
as part of this stage. The feasibility study asks 'will this
project work,' 'should we develop this software,' and 'what are the
alternatives?'</p>
</li>
<li>
<p><span class="bold"><b>Design and specification</b></span>. The
established requirements flowing from first stage are converted
into software or hardware requirements. The software requirements
are then transformed into a form that can be readily translated
into computer programs, perhaps by splitting into separately
developed components.</p>
</li>
<li>
<p><span class="bold"><b>Implementation</b></span>. This is where
the programs are created. Each program, or subcomponent is a unit,
and is 'unit tested'. The unit test ensures each unit meets its
specification as defined in previous step.</p>
</li>
<li>
<p><span class="bold"><b>Integration and testing</b></span>. All
units are combined and the whole system is tested. When
successfully tested, it is considered complete.</p>
</li>
<li>
<p><span class="bold"><b>Maintenance</b></span>. The product is
delivered. We should never presume software is 'finished' when it
ships; it is na&iuml;ve to do so. The largest phase of the software
life cycle is 'maintenance'. There will be bugs to be fixed,
unnoticed requirements that need to be accommodated, evolution of
the existing requirements, and other product support in the
field.</p>
</li>
</ol>
</div>
</div>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e185" id="d0e185"></a>SSADM</h3>
</div>
<p>Although this sounds like development only partaken by
consenting adults, it actually stands for Structured Systems
Analysis and Design Methodology. It is a structured and rigorous
method following the waterfall approach. It covers analysis and
design, not implementation and testing. It is a well defined &quot;open&quot;
standard, heavily used in UK government organisations. SSADM
consists of five main steps (each subdivided into many other
procedures), which for our purposes are self-descriptive: (i)
Feasibility study, (ii) Requirements analysis, (iii) Requirements
specification, (iv) Logical system specification, and (v) Physical
design.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e190" id="d0e190"></a>Prototyping</h3>
</div>
<p>Despite there being many years of research and experience in
software development processes, the waterfall is still a standard
reference model since it has a clear logic to it - it is not right
to perform implementation before requirements analysis or any
design work. However, with the waterfall it has been hard to
evaluate the entire system until the waterfall is complete.</p>
<p>It is also hard to show what is being developed to a customer
until the integration phase has completed and the system is in a
ready state. The prototyping approach attempts to work around this
limitation. It helps to explore and evaluate implementation as
development progresses, and to refine unknown or ambiguous
requirements.</p>
<p>The essence of the prototyping process is to create a number of
(possibly throw-away) prototypes of the system under development.
Each prototype is evaluated, shown to the customer, and the
feedback is used to shape the next prototype. This continues until
enough is known to develop and deploy the 'real' product.</p>
<p>We see an analogy with other industries here. If you were
developing a new car you'd create many prototypes until you hit on
exactly the right design. We aim to do the same with our software.
However, there is an important difference that must be observed.
When building a car, the major cost is in the production, not the
development. It works the other way around with software. You can
make multiple copies of the code for free, the development is the
costly part. For this reason the prototyping cycle needs to be
controlled, it can't be repeated an unlimited number of times.</p>
<p>The prototypes are developed quickly in very high-level
languages. The use of automated tool support can speed prototype
production immensely. The prototypes are proofs of concept, so
efficiency, stability, or a complete feature set are not primary
concerns. For this reason, prototyping works best for systems with
an emphasis on the user interface.</p>
<p>The danger with prototyping is the temptation to release the
inefficient, quickly developed, not fully thought out prototype
code. This is especially true when a project is running out of time
and the 'real' development might not get done in time. It needs
very careful management to work.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e205" id="d0e205"></a>Iterative and
incremental</h3>
</div>
<p>All the recent 'advances' on the waterfall approach are broadly
variations on a theme. The improvement is performing development in
an 'iterative and incremental' manner. That is many trips
(iterations) round a small development lifecycle run back to back
(incrementally), adding more and more functionality to the system
until it is complete. Each single run of a 'mini lifecycle' tends
to follow the waterfall model. Each of the phases of the waterfall
therefore gets executed more than once. At each iteration end is a
'software release'.</p>
<p>Incremental development is neither a top-down nor bottom-up
approach. During each iteration of the process the system grows and
subsequent design work can be done based on the proof of validity
of the existing design and implementation. There is a parallel to
prototyping here, but we're not so focused on quick hacks that work
as 'proof of concepts'. With this approach each stage is less
complex and easier to manage - and process progress is more easily
monitored; you know how much of the system is built and
integrated.</p>
<p>This kind of process works better for projects whose
requirements are less understood at the start - it is more
resilient to change and saves lengthy re-design and
re-implementation of the entire system that you'd encounter in the
waterfall approach.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e214" id="d0e214"></a>Spiral</h3>
</div>
<p>The spiral model, proposed by Barry Boehm in 1988 [<a href=
"#Boehm">Boehm</a>], is an example of this. The development process
is modelled as a spiral. It starts in the centre and fans outwards
towards the later stages of</p>
<div class="c3"><img src=
"resources/pete_goodliffe_pip12_spiral.png" align="middle"></div>
<p>he process. We start working on a very rough notion of the
system, becoming more detailed over time as we enter later stages
of the spiral. Each 360 degree turn of the spiral sees us go
through a single 'waterfall'.</p>
<p>Features are defined and implemented in order of decreasing
priority; the most important facilities are created as soon as
possible. This is a way of managing risk, it is safer because as
you inch nearer to the ship date you can be sure that the majority
of the system is complete. In fact, it is very pragmatic common
sense approach. Engineers will not be spending 80% of their time on
the trifling (but fun) 20% of the system.</p>
<p>Boehm's spiral is split into four quadrants which describe four
distinct phases: (i) objective setting (where specific objectives
for this phase are identified), (ii) risk assessment and reduction
(the key risks are identified, analysed and information is sought
to reduce these risks), (iii) development and validation
(appropriate model is chosen for next phase of development), and
(iv) planning (the project is reviewed and plans drawn up for the
next round of the spiral).</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e229" id="d0e229"></a>Others</h3>
</div>
<p>There are a great many other processes we could look at; they
are all very similar to those above, and yet distinct. There are
several modified waterfalls (for example with overlapping phases,
or waterfalls with subprojects, each managed as waterfalls). There
is the <i class="firstterm">evolutionary prototyping</i> approach
where you start with an initial concept, design and implement an
initial prototype, then iteratively refine the prototype until it
is acceptable, complete and release this, perhaps planning to
include some throw away prototypes in the process.</p>
<p>In <i class="firstterm">staged delivery</i> development we
follow a sequential process up to the architectural design, and
then implement the separate components showing them to the customer
as each is completed, going back to previous development steps if
needed. <i class="firstterm">Evolutionary delivery</i> is
essentially a cross between evolutionary prototyping and staged
delivery.</p>
<p><i class="firstterm">Rapid Application Development</i> (RAD)
emphasises user involvement, small development teams, and makes
heavy use of prototyping and automated tools. In a slight twist on
other processes the development time frame is established up front
and considered immovable. Then as many features as feasible are
incorporated into the design to accommodate the deadline - some
features may be sacrificed.</p>
<p>The much-hyped <i class="firstterm">extreme Programming</i> is
like some of above, with emphasis on developing tests up front,
remaining flexible and nimble, and focusing on the customer. There
is a lot of wisdom in placing such emphasis on testing. A lot of
its other maxims receive more debate.</p>
</div>
<div class="sect2" lang="en">
<div class="titlepage">
<h3><a name="d0e254" id="d0e254"></a>Enough,
already!</h3>
</div>
<p>If you've read this far and not got bored yet then you're doing
well. Finally, and perhaps more importantly, what are the key
points to draw out from all this? The 'professional' software
developer should have a working understanding of processes and
methodologies, but anyone can get this from the right books. How do
we apply this to our work to the best of our abilities?</p>
<p>With all these processes there are some common threads that we
should observe. The phases described in the <span class=
"bold"><b>Stages of development</b></span> sidebar are present in
each. The processes really only differ in the length and relative
positioning of the stages. Each of these activities is vital to the
production of good quality software. The better processes ensure
that testing is not left as an afterthought at the end of
development, but it carried out continuously and monitored
throughout the development process.</p>
<p>It's hard to compare or evaluate these processes and
methodologies. Which is best? Which will ensure a high quality
product is shipped on time and to budget? There is no answer,
because those are not the right questions. Which process is
suitable depends on the project and the culture of your company. If
you have 20 programmers who know nothing of object oriented
development and only know C, trying to build an OO C++ product is
clearly a stupid idea.</p>
<p>We can see two extremes, the anarchy of the ad hoc method
against a strict dictatorship of a rigid process. In the latter any
experimentation that could yield a more elegant architecture is
discouraged. The user's real requirements may never filter down to
a developer since it's lost in a wall of bureaucracy, the
programmer just codes to a spec that's passed on to him.</p>
<p>The most flexible approach is somewhere in between. You do need
to know the process you're working to and where it's defined. For
effective development it is necessary to be ordered and have a
process. However, the experienced programmer knows the value of the
process, and its faults too. They know how to work with it, and
when to step outside it. Good programmers don't just program. They
understand their recipes and how to adapt them as appropriate. This
is where the science is still part art.</p>
<p>New methodologies spring up (or rather evolve) from time to
time. They tend to arrive with a big fanfare and a spurt of
fireworks, and they are claimed to be the silver bullet, the
panacea that will make development better for our children and our
children's children. Sadly, it's never the case. When it comes down
to it, no matter what lifecycle you follow, the programming team is
only as good as its programmers. If there is no intuition, no
class, no experience and no drive present, then no matter what the
lifecycle is you won't reliably produce good code. You might be
better able to track how far behind schedule you are, though.</p>
</div>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e272" id=
"d0e272"></a>Conclusion</h2>
</div>
<p>Building software in teams is like crime; it's better when it's
organised. Every now and again one man alone can pull off something
spectacular. However, that is the exception. The process needs to
be defined and understood, and carried out by team members with
appropriate skills to stand a chance of working well. Otherwise
you'll end up with software that's criminal.</p>
<p>We need to use proven development processes and established
design methodologies to allow us to build software that meets
expectations against a backdrop of timescales, budgets, and
changing requirements.</p>
<p>Naturally, this isn't the only essential element to building
software. It's just another one. Building software is hard - and
we've just looked at another way to make it easier. There are many
other contributory factors, some quite subtle. These even include
pizza and stock options.</p>
<div class="bibliography">
<div class="titlepage">
<h2><a name="d0e281" id="d0e281"></a>References</h2>
</div>
<div class="bibliomixed"><a name="Booch" id="Booch"></a>
<p class="bibliomixed">[Booch] Grady Booch. <span class=
"citetitle"><i class="citetitle">Object Oriented Analysis and
Design With Applications</i></span>, 2nd Edition. 1994,
Bejamin/Cumings. ISBN: 0-8053-5340-2.</p>
</div>
<div class="bibliomixed"><a name="Royce" id="Royce"></a>
<p class="bibliomixed">[Royce] W. W. Royce. <span class=
"citetitle"><i class="citetitle">Managing the Development of Large
Software Systems</i></span>. Proceedings of IEEE WESCON. August
1970.</p>
</div>
<div class="bibliomixed"><a name="Boehm" id="Boehm"></a>
<p class="bibliomixed">[Boehm] Barry Boehm, <span class=
"citetitle"><i class="citetitle">A Spiral Model of Software
Development and Enhancement IEEE computer</i></span>, vol 21 #5 May
1988</p>
</div>
</div>
</div>
<div class="footnotes"><br>
<hr class="c5" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e59" href="#d0e59" id=
"ftn.d0e59">1</a>]</sup> However, it is by no means impossible to
build 'structured' code in an 'object-oriented' language, in the
same way it is possible to write hateful code in any language.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e97" href="#d0e97" id=
"ftn.d0e97">2</a>]</sup> This is not a problem solely encountered
by declarative languages (for example Java has an executor: the
JVM). However, comparatively less development has gone into the
declarative breed of language executors.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e126" href="#d0e126" id=
"ftn.d0e126">3</a>]</sup> And there, perhaps, it doesn't matter so
much since there's no paying customer, and no formal set of
requirements - a lot of open source software is developed because
the programmer feels like it. However, applying these principles to
open-source work will yield better programs.</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
