<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>View from the Acropolis</title>
	
	<link>http://blogs.designingpatterns.com/acropolis</link>
	<description>A high level look at the theory and practice of software engineering</description>
	<pubDate>Fri, 19 Sep 2008 21:39:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="viewfromtheacropolis" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://blogs.designingpatterns.com/acropolis/feed/" /><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://blogs.designingpatterns.com/acropolis/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Characteristics of a Good Software Documentation Pipeline</title>
		<link>http://blogs.designingpatterns.com/acropolis/2008/07/31/characteristics-of-a-good-software-documentation-pipeline/</link>
		<comments>http://blogs.designingpatterns.com/acropolis/2008/07/31/characteristics-of-a-good-software-documentation-pipeline/#comments</comments>
		<pubDate>Thu, 31 Jul 2008 19:13:51 +0000</pubDate>
		<dc:creator>tony</dc:creator>
		
		<category><![CDATA[software documentation]]></category>

		<category><![CDATA[code comment]]></category>

		<category><![CDATA[code documentation]]></category>

		<category><![CDATA[comment]]></category>

		<category><![CDATA[documentation]]></category>

		<category><![CDATA[documentation generation tool]]></category>

		<category><![CDATA[documentation pipeline]]></category>

		<category><![CDATA[doxygen]]></category>

		<category><![CDATA[javadoc]]></category>

		<category><![CDATA[rdoc]]></category>

		<category><![CDATA[technical documentation]]></category>

		<guid isPermaLink="false">http://blogs.designingpatterns.com/acropolis/?p=5</guid>
		<description><![CDATA[My previous entry discussed software documentation standards and the importance of establishing one for a software development group.  This is not sufficient to ensure that a group produces quality software documentation, however.  A documentation creation and publishing pipeline also must be built to support the standard.  Such a pipeline transforms software documentation [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.designingpatterns.com/acropolis/2008/07/26/gold-standard-for-technical-documentation/">My previous entry</a> discussed software documentation standards and the importance of establishing one for a software development group.  This is not sufficient to ensure that a group produces quality software documentation, however.  A documentation creation and publishing pipeline also must be built to support the standard.  Such a pipeline transforms software documentation created by programmers into formatted documents, such as web pages, and then publishes these documents on one or more repositories.  A pipeline must satisfy a number of requirements in order for a group to derive the greatest benefit from creating documentation while expending the least effort and minimizing developer pain, which is crucial to ensuring wholehearted compliance with and peer enforcement of the standard.</p>
<p>The heart of a documentation pipeline is a tool or series of tools that read software documentation and generate formatted documents; these tools are called <a href="http://en.wikipedia.org/wiki/Documentation_generator">documentation generators</a>.  Such a tool might process a Ruby source file containing a class and generate a web page listing all of the class&#8217; methods and displaying each method&#8217;s comments.  Different documentation generation tools support different languages; in general, the more popular a language, the more tools will be available for it.  Some tools, such as <a href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>, support a number of programming languages while others, such as <a href="http://rdoc.rubyforge.org/">RDoc</a>, focus on only a single language, Ruby in this case.  If a tool focuses on only one language, it likely will provide much better support for that language than does a more general tool.  <a href="http://rdoc.rubyforge.org/">RDoc</a>, for instance, is the only tool that supports Ruby&#8217;s metaprogramming constructs.  When a group works with several languages, using the optimal tool for each language must be weighed carefully against using one tool for multiple languages.  This is a very nuanced decision that should be made separately for each language and that depends on how tightly coupled the language&#8217;s code is with that of the other languages, how long it will take for the developers to master the language&#8217;s optimal tool, and how much benefit the language&#8217;s optimal tool offers over a multi-language tool.  If a group maintains a code base that has different languages calling into each other, then I recommend using a single tool that can handle all of these languages and that preferably can understand the relationships across the language boundaries.  At a prior employer I worked in a group that maintained a system written in C, C++, Fortran 77, and Fortran 95, and a documentation tool that could have understood the inter-language relationships would have been very valuable.  <a href="http://rdoc.rubyforge.org/">RDoc</a>, for example, provides this functionality for C and Ruby; although its purpose is to document Ruby code, it can parse C and understands the C/Ruby calling conventions, allowing it to document properly libraries consisting of both C and Ruby, which are common.</p>
<p>Aside from generating documents from code and comments, most widely-used documentation generation tools also define a markup language that can describe elements of the software documentation.   A key characteristic of such a markup language is its expressiveness, particularly whether the markup can describe all program elements properly.  Beyond being able to describe common elements like lists, headings, and emphasis, the markup also should be able to describe code constructs like method parameters, return values, and possible exceptions.  While markup is not needed to generate basic documents, it greatly increases the expressiveness of the documentation and enhances the information conveyed by the generated documents.  Describing elements with markup allows document formatting to be tweaked to display the elements in special ways, such using a particular color for method parameters.  Without expressive markup, developers often use primitive markup in order to format documentation properly.  <a href="http://rdoc.rubyforge.org">RDoc</a>, for instance, does not offer markup for parameters and return values, and so <a href="http://www.designingpatterns.com">my company</a> simulates such markup by using the less descriptive markup for headings and lists.  Not only is the required markup longer, more painful to write, and duplicated throughout our code base, <a href="http://rdoc.rubyforge.org">RDoc</a> does not understand the elements properly and so cannot generate optimal documents with them.</p>
<p>Another important characteristic of a documentation generation tool&#8217;s markup language is how easily it can be understood, modified, and written.  XML and HTML, for instance, are very verbose (since each tag must be closed), and I find that the tags obscure the content.  Such complicated languages also are difficult to write correctly and so are painful for developers to use to write comments.  By contrast, there are a variety of <a href="http://en.wikipedia.org/wiki/Markdown">markdown</a> languages that are easier to read and write (wikis often use markdown languages for this reason).  It is vital that marked up comments be legible as text, since programmers working directly with the source code must be able to read them.  This also is an important consideration if the package-level documentation is distributed as text files (for example, <a href="http://rdoc.rubyforge.org">RDoc</a> transforms a README that I maintain into <a href="http://configtoolkit.rubyforge.org/">beautiful HTML</a>, but the text file remains very easy to read).</p>
<p>A defining characteristic of a documentation generation tool is the format of the documents that it generates.  At a minimum, it should be able to generate web pages, since web pages can be viewed on virtually every platform, provide a plethora of stylistic options, make cross-references very easy to follow (via links), and can be searched easily.  Additionally, if the web pages are published on the public internet, they will be indexed by search engines and so will advertise the software.  Finally, web pages easily can be proofread by developers before releasing documentation.  It is crucial that the default look of the web pages be as aesthetically pleasing and as readable as possible, so that the documents will be a pleasure to read.  The look also should be customizable, so that the group&#8217;s developers can tweak it, and so that developers around the world can craft better looks.  In addition to being more usable, appealing web pages are strong positive reinforcement for developers writing documentation.  The tool also should generate cross-reference links to the appropriate documents for class names, method names, modules, and other source code entities, as such links make documentation much easier to use.  The tool additionally should be able to link methods to syntax-highlighted source code, allowing readers to browse the source easily in the context of the documentation.  Finally, the tool should be able to generate and embed class diagrams.  <a href="http://java.sun.com/j2se/javadoc/">Javadoc</a>, <a href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>, and <a href="http://rdoc.rubyforge.org">RDoc</a> are examples of tools that offer all of these features.</p>
<p>Depending on the readers of a group&#8217;s software documentation, it may be desirable to publish documentation in other formats besides web pages.  Some UNIX programmers, for instance, prefer to read software documentation on the command-line, and so tools exist for this such as man for UNIX utilities, <a href="http://perldoc.perl.org/perldoc.html">perldoc</a> for Perl scripts and libraries, <a href="http://docs.python.org/lib/module-pydoc.html">pydoc</a> for Python libraries, and <a href="http://rdoc.rubyforge.org/">ri</a> for Ruby libraries.  Windows programmers, on the other hand, often read software documentation in Windows Help, and so many tools can generate documents in this format.  In order to make the documentation as usable as possible, the pipeline should generate all applicable output formats from a single documentation source, either with one tool or a series of tools.  <a href="http://java.sun.com/j2se/javadoc/">Javadoc</a>, <a href="http://www.stack.nl/~dimitri/doxygen/">Doxygen</a>, and <a href="http://rdoc.rubyforge.org">RDoc</a> all can generate documents in multiple formats.</p>
<p>After generating documents, a pipeline must publish them to at least one repository in order to allow developers to view them.  The nature of this repository will, of course, depend on the document format.  At a minimum, however, it should allow developers to search the documents.  In addition, it should be accessible from wherever the developers will work; if developers log into a corporate system from home and code, for instance, then they also should be able to access the documentation repository from home.  Depending on the software&#8217;s release cycle, the repository may need to store multiple versions of documentation, tracking different versions of the software.  Lastly, it must be kept up to date, so that developers always can trust that it reflects the code base faithfully.  This should be automated in order to eliminate human error and in order to save developers yet another chore when moving code.  A prior employer ran a scheduled job that generated documentation nightly from the production code.  At <a href="http://www.designingpatterns.com">Designing Patterns</a>, our build system generates and publishes documentation when releasing new versions of our open-source packages.</p>
<p>While it may take some work to establish, a good documentation pipeline will justify the effort by increasing programmer productivity and happiness, positively reinforcing the documentation standard.</p>
<div class="addthis"><a href="http://www.addthis.com/bookmark.php" onclick="window.open('http://www.addthis.com/bookmark.php?pub=designingpatterns&amp;url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2F2008%2F07%2F31%2Fcharacteristics-of-a-good-software-documentation-pipeline%2F&amp;title=Characteristics+of+a+Good+Software+Documentation+Pipeline', 'addthis', 'scrollbars=yes,menubar=no,width=620,height=520,resizable=yes,toolbar=no,location=no,status=no'); return false;" title="Bookmark using any bookmark manager!" target="_blank"><img src="http://s3.addthis.com/button1-bm.gif" width="125" height="16" border="0" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?a=tPZAWfnFfD4:tT67bGxOn_U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.designingpatterns.com/acropolis/2008/07/31/characteristics-of-a-good-software-documentation-pipeline/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gold Standard for Software Documentation</title>
		<link>http://blogs.designingpatterns.com/acropolis/2008/07/26/gold-standard-for-technical-documentation/</link>
		<comments>http://blogs.designingpatterns.com/acropolis/2008/07/26/gold-standard-for-technical-documentation/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 03:26:49 +0000</pubDate>
		<dc:creator>tony</dc:creator>
		
		<category><![CDATA[software documentation]]></category>

		<category><![CDATA[code comment]]></category>

		<category><![CDATA[code documentation]]></category>

		<category><![CDATA[documentation]]></category>

		<category><![CDATA[documentation generation tool]]></category>

		<category><![CDATA[package documentation]]></category>

		<category><![CDATA[software documentation standard]]></category>

		<category><![CDATA[standard]]></category>

		<category><![CDATA[technical documentation]]></category>

		<guid isPermaLink="false">http://blogs.designingpatterns.com/acropolis/?p=4</guid>
		<description><![CDATA[We are told throughout our educations and careers that writing documentation about our software for other programmers, software documentation, is critically important.  Though virtually every software engineer pays lip service to its importance, many fail to create proper documentation for their projects due to lack of interest, lack of time, or lack of direction. [...]]]></description>
			<content:encoded><![CDATA[<p>We are told throughout our educations and careers that writing documentation about our software for other programmers, software documentation, is critically important.  Though virtually every software engineer pays lip service to its importance, many fail to create proper documentation for their projects due to lack of interest, lack of time, or lack of direction.  Documentation is as important as design, implementation, and testing in constructing quality software, however, and inadequately documented software is poor software.  It therefore follows that groups producing poorly documented software are fundamentally flawed.  Establishing a documentation standard and a documentation creation and publishing pipeline is part of setting a group&#8217;s technical direction.  The standard ensures that the developers prioritize creating documentation and the pipeline ensures that excellent documentation is generated as efficiently and painlessly as possible, which in turn positively reinforces the group&#8217;s documentation standard.</p>
<p>The first kind of software documentation that a standard should mandate is code documentation, or comments in source code.  There are two kinds of code comments:</p>
<ol>
<li>Comments discussing the intention of a piece of code, where this is not obvious from the code itself</li>
<li>Comments describing an interface (class, function, or method), particularly its inputs and outputs</li>
</ol>
<p>I write such comments after finishing a module, while reviewing the code, because I have found that comments written while a module is being developed need to be revised constantly during the development, wasting time.  Aside from just creating documentation, this process actually improves the code itself.  Writing the first kind of comment forces re-examination of tricky code and often leads to simplification and clarification of such code.  Writing the second kind of comment forces rethinking of interfaces, in particular whether an interface really is necessary, desirable, and well-expressed; I frequently remove methods, alter argument lists, or change names while documenting code.  In addition, documenting an interface&#8217;s inputs often reveals potential error conditions.  Both types of commenting greatly increase the speed at which other programmers can understand and modify code and so directly contribute to a group&#8217;s efficiency, repaying the original time investment to write the comments.  Interface documentation is particularly important in this regard, because it often can prevent the interface from being invoked incorrectly, saving debugging time.  Comments also make it much easier to maintain code without the original author being present, which is crucial given that people change jobs very frequently (US citizens change jobs roughly <a href="http://www.bls.gov/NLS/nlsfaqs.htm#anch41">once every two years</a>) and that open source code may be used and modified by programmers from all around the world.</p>
<p>The second kind of software documentation that a standard should mandate is package and library level documentation.  README files distributed with packages and websites describing libraries are this kind of documentation (<a href="http://configtoolkit.rubyforge.org">this README</a> is a concrete example for an open-source package that I maintain).  While code documentation should be exhaustively complete and can discuss low-level details, package documentation only should discuss important, high-level concepts.  It should <strong>not</strong> duplicate code documentation.  Each method in a class should be commented, for instance, but package documentation discussing the class should review just the class&#8217; main features and the methods that need to be called in the class&#8217; most common use cases.  In fact, package documentation should be organized around a series of examples that both illustrate what the package can do and quickly teach the reader its basic functionality.  Such examples make the package easier to use, since the reader may not need to look at the source code for common  use cases, and also serve as excellent advertisement for the package&#8217;s features, making it more likely that the package will be used.  This is especially important for open-source software, as excellent package-level documentation distinguishes such software from the competition and also can be indexed by search engines.</p>
<p>Good programmers always will create documentation, even in the absence of any support.  One group that I worked in had no documentation standard, for instance, and some developers still documented their work.  There are a couple of problems with such a group&#8217;s documentation, however.  Firstly, without a documentation standard, different developers inevitably will document differently and to different degrees.  While inconsistent documentation is better than no documentation, it does hinder the creation and use of a documentation repository.  Time will be lost as developers are forced to switch between documentation styles throughout the day.  Secondly, some developers inevitably will create insufficient documentation, dragging down the group&#8217;s efforts and creating an environment in which poorly documented software is acceptable (the <a href="http://en.wikipedia.org/wiki/Fixing_Broken_Windows">broken windows effect</a>).  Parts of the system will not be documented at all, emasculating a documentation repository as developers will not be able to trust that it always has the information that they need.  In my prior group, for instance, many developers never bothered to use the doxygen repository because it was incomplete and instead always went directly to the source code.</p>
<p>In order to establish a documentation standard, a group&#8217;s management must classify software documentation as a mandatory deliverable for every project, and project planners always need to budget time for it.  Management also must instruct developers and team leaders to enforce the standard during code reviews and should evaluate programmers partially on the basis of the documentation that they produce.  The group&#8217;s technical leadership, moreover, should outline requirements, evaluate and purchase products, and ask developers to write tools for an efficient documentation creation and publishing pipeline for the standard.  This will ensure that the group gets the greatest bang for the buck from creating documentation.  Also, as even good programmers often do not enjoy writing documentation (viewing it as a necessary evil), an excellent pipeline is a carrot that helps to ensure acceptance of and compliance with the documentation standard.  I will discuss what constitutes a good pipeline in my <a href="http://blogs.designingpatterns.com/acropolis/2008/07/31/characteristics-of-a-good-software-documentation-pipeline/">next article</a>.</p>
<div class="addthis"><a href="http://www.addthis.com/bookmark.php" onclick="window.open('http://www.addthis.com/bookmark.php?pub=designingpatterns&amp;url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2F2008%2F07%2F26%2Fgold-standard-for-technical-documentation%2F&amp;title=Gold+Standard+for+Software+Documentation', 'addthis', 'scrollbars=yes,menubar=no,width=620,height=520,resizable=yes,toolbar=no,location=no,status=no'); return false;" title="Bookmark using any bookmark manager!" target="_blank"><img src="http://s3.addthis.com/button1-bm.gif" width="125" height="16" border="0" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?a=qkEzEpdwdF0:88m2lBXx7n0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.designingpatterns.com/acropolis/2008/07/26/gold-standard-for-technical-documentation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Welcome to the Acropolis</title>
		<link>http://blogs.designingpatterns.com/acropolis/2008/04/30/welcome-to-the-acropolis/</link>
		<comments>http://blogs.designingpatterns.com/acropolis/2008/04/30/welcome-to-the-acropolis/#comments</comments>
		<pubDate>Wed, 30 Apr 2008 20:52:03 +0000</pubDate>
		<dc:creator>tony</dc:creator>
		
		<category><![CDATA[theory]]></category>

		<category><![CDATA[patterns]]></category>

		<guid isPermaLink="false">http://blogs.designingpatterns.com/acropolis/2008/04/30/welcome-to-the-acropolis/</guid>
		<description><![CDATA[Welcome to Designing Patterns and welcome to View from the Acropolis!  I will use this blog to discuss high level patterns in software engineering, with the goal that readers be able to apply these patterns in order to produce higher quality work more efficiently.  By patterns, I do not mean design patterns; or rather, design patterns [...]]]></description>
			<content:encoded><![CDATA[<p>Welcome to Designing Patterns and welcome to <a href="http://blogs.designingpatterns.com/acropolis">View from the Acropolis</a>!  I will use this blog to discuss high level patterns in software engineering, with the goal that readers be able to apply these patterns in order to produce higher quality work more efficiently.  By patterns, I do not mean design patterns; or rather, design patterns are a specific example of the more general idea.  Patterns simply are recurring concepts, in whichever context they appear.  Recognizing, formalizing, classifying, and applying patterns has utility far beyond object-oriented design or even software engineering.  From my experience working at a large software company, I believe that many programmers fail to appreciate the patterns in their work and thus never judge those patterns according to fundamental design principles, missing existing negative patterns, failing to apply beneficial patterns, and so producing lower quality output than they otherwise would.  For example, most professional programmers appreciate that putting common code into functions is an excellent pattern, because it avoids duplication, a core software engineering principle.  Many of these programmers do not understand that similar patterns must apply to every aspect of their work, including build systems, program logic, data, documentation, and configuration.  They do not realize, for instance, that their build system is based on the recursive build system pattern,  a negative pattern that relies on duplication in order to function properly, either building the same object multiple times or having the same dependency information encoded into multiple places within the makefiles.  They are annoyed when their recursive build system breaks because they failed to duplicate the dependency information in one place, but they do not realize that the problem is not their incorrect updating of the makefiles, but rather that they have based their build system on a negative pattern.  Pattern recognition, formalization, classification, and application underlies software engineering, and the extent to which a software engineer actively internalizes and applies patterns determines the quality of his work.</p>
<p>Software is an abstraction of the operation of very complicated machines, and so programming, more than most other disciplines, demands that its practitioners think abstractly, which in turn requires recognizing and thinking in patterns.  One excellent example of this is learning new programming languages.  One&#8217;s first programming language always is the hardest to learn.  During this process, one&#8217;s mind does not have a store of patterns with which to interpret the new language, with which to understand and differentiate programming concepts and language concepts.  Instead, programming initially is a series of magical formulas, which, given proper application and the right phase of the moon, produce the right output.  For example, when learning C, pointers often are introduced simply as syntax allowing a function to modify its arguments.  Such formulas are not properly patterns at all, since they cannot be applied outside of their native context.  As one executes work with the language and begins to understand some theory, however, one starts to generalize the magical formulas into patterns and, armed with these, develops the ability to work and thrive in new contexts with the language.  Understanding the relationship between pointers and pointees in C (indirection), for instance, allows one to work competently with C&#8217;s memory allocation facilities and to do things like construct a binary search tree.  Learning a second language accelerates this process because understanding the patterns underlying it allows one to factor out common patterns in the two languages, which likely have far more general application.  An understanding of C&#8217;s pointers might become an understanding of value and reference semantics after learning Java, for example.  Applying the patterns of one language to learning another also helps one learn the new language much more quickly than one would have otherwise, as the new language&#8217;s patterns are highlighted by the old language&#8217;s patterns.  I learned Ruby several weeks ago, and I found it very useful to compare every new aspect of Ruby with C++, even though Ruby and C++ are very, very different languages.  Understanding C++ helped me to understand the concepts underlying Ruby programming.  My learning process can be seen in <a href="http://www.designingpatterns.com/wiki/index.php/Ruby">this Wiki page</a>, which I updated with my observations while studying the language; it consistently compares and contrasts Ruby with C++.</p>
<p>Most programmers probably would agree with the above assertion, that recognizing and formalizing patterns is the key to software engineering, and that failure usually is a result of not grasping a particular pattern.  Many, however, use patterns passively; that is, they apply them in the contexts in which they were taught to but do not generalize them to new contexts or formalize new patterns.  That is, they see patterns as little more than magical formulas.  They equally happily put common code into functions in order to avoid duplication and create build systems that rely on duplication simply because they were told to do so, never stopping to judge and classify each pattern.  They apply canned design patterns in specific situations, but do not really understand that the underlying principles that make a particular pattern advantageous (looser class coupling, for instance) must be embodied by patterns in other contexts as well.  These failures of understanding, while apparent in whatever work a programmer produces, become painfully obvious in a large software system where a programmer must apply patterns embodying good principles at multiple abstraction levels in order to be successful.  Cyclical dependencies, for instance, do not cause much damage in a small system but, when the patterns applied to a large software system result in cyclical link dependencies among dozens of libraries or cyclical operational dependencies among dozens of machines, they create a maintenance nightmare.</p>
<p>Whatever one is doing, whether learning a language, implementing a module, designing a class hierarchy, creating configuration files, drafting requirement specifications, or architecting a system, one constantly must step back and assess one&#8217;s work in order to discern the patterns that underlie the work.  After recognizing and formalizing the patterns, judge them according to good design principles.  When others offer criticism of one&#8217;s work, assess the criticism in light of its patterns, and if necessary, change the work and your understanding of its patterns at the same time.  When one notices a problem in a system, do not simply correct the problem but instead probe into what allowed it to exist in the first place.  When someone asks for help, do not simply answer their question but instead try to explain the pattern underlying the answer and the principles that you use to judge the pattern.  When working on something that feels wrong, seek to understand what aspects of the project violate beneficial patterns or manifest negative patterns.</p>
<p>I am passionate about programming, and I want to improve.  I have no doubts that continually formalizing and applying patterns will make me a stronger programmer.  This blog, by forcing me to commit patterns to virtual paper, will help me do to so.  Hopefully, others will learn from my experience.  In addition, as I have benefited greatly from learning from others, I also want this blog to stimulate discussion, so that the understanding of others will improve my own.</p>
<div class="addthis"><a href="http://www.addthis.com/bookmark.php" onclick="window.open('http://www.addthis.com/bookmark.php?pub=designingpatterns&amp;url=http%3A%2F%2Fblogs.designingpatterns.com%2Facropolis%2F2008%2F04%2F30%2Fwelcome-to-the-acropolis%2F&amp;title=Welcome+to+the+Acropolis', 'addthis', 'scrollbars=yes,menubar=no,width=620,height=520,resizable=yes,toolbar=no,location=no,status=no'); return false;" title="Bookmark using any bookmark manager!" target="_blank"><img src="http://s3.addthis.com/button1-bm.gif" width="125" height="16" border="0" /></a></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?a=5M2-ZxwJPXY:l-nJ2ai1E1g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ViewFromTheAcropolis?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blogs.designingpatterns.com/acropolis/2008/04/30/welcome-to-the-acropolis/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
