<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Basil Vandegriend: Professional Software Development &#187; software releases</title>
	<atom:link href="http://www.basilv.com/psd/blog/tag/software-releases/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.basilv.com/psd</link>
	<description></description>
	<lastBuildDate>Wed, 25 Jan 2012 13:23:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>My Definition of Done</title>
		<link>http://www.basilv.com/psd/blog/2009/my-definition-of-done</link>
		<comments>http://www.basilv.com/psd/blog/2009/my-definition-of-done#comments</comments>
		<pubDate>Mon, 26 Oct 2009 14:50:11 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[coding]]></category>
		<category><![CDATA[definition of done]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[software releases]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=450</guid>
		<description><![CDATA[I recently wrote about why you need a definition of done, and it only seems logical to follow this up by presenting what I use for a definition of done for developing software. I use two guiding principles as the basis for constructing my definition. Potentially releasable: Ideally the software can be released (or shipped) [...]]]></description>
			<content:encoded><![CDATA[<p>I recently wrote about <a href="http://www.basilv.com/psd/blog/2009/why-you-need-a-definition-of-done">why you need a definition of done</a>, and it only seems logical to follow this up by presenting what I use for a definition of done for developing software.</p>
<p>I use two guiding principles as the basis for constructing my definition.  </p>
<ol>
<li><strong>Potentially releasable</strong>: Ideally the software can be released (or shipped) once it is done. I've seen many people, particularly in the context of Scrum, use the similar term "potentially shippable".</li>
<li><strong>I would trust my life to my code</strong>: I just wrote an entire article on this titled <a href="http://www.basilv.com/psd/blog/2009/would-you-trust-your-life-to-your-code">Would You Trust Your Life To Your Code?</a></li>
</ol>
<p>These principles are deliberately idealistic in order to set high expectations and motivate <a href="http://www.basilv.com/psd/blog/2009/continuous-improvement-framework">continuous improvement</a> when I fall short of reaching them.</p>
<p>Different definitions of done can be created based on different levels or scopes. The two primary scopes are: </p>
<ol>
<li>Done for a feature / user story.</li>
<li>Done for a release.</li>
</ol>
<p>For this article I am using my definition of done for developing a feature (user story).</p>
<p>My definition of done is essentially a checklist with items grouped into categories. The lists of items and categories are <em>not</em> meant to dictate the process by which these items are done or the chronological order. For example, automated unit testing is listed in a separate category from coding but it is typically done at the same time or before-hand, if doing test-driven development.</p>
<p>Without further ado, here is my definition of done.</p>
<h3>Coding</h3>
<ol>
<li>Code meets functional requirements.</li>
<li>Code meets non-functional requirements. Typical ones include:
<ul>
<li>Performance (capacity, scalability)</li>
<li>Usability</li>
<li>Security</li>
<li>Maintainability</li>
</ul>
</li>
<li>Code is deployment-ready. This means environment-specific settings are extracted from the code base. A past article I wrote on <a href="http://www.basilv.com/psd/blog/2007/designing-for-deployability">designing for deployability</a> provides more context on this.</li>
<li>Code is <a href="http://www.basilv.com/psd/blog/2009/the-five-commandments-of-version-control">checked into version control</a>.</li>
<li>Code complies with coding &#038; architectural standards.</li>
<li>Code has been cleaned up. The goal is to ensure the code is easily readable and has a good design. In the past I have used the terms <a href="http://www.basilv.com/psd/blog/2007/why-you-should-polish-your-code">polishing code</a> and refactoring to describe this. Robert C. Martin's book <a href="http://www.amazon.ca/gp/product/0132350882?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0132350882">Clean Code: A Handbook of Agile Software Craftsmanship</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0132350882" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> provides the best explanation of this that I have seen. Achieving this goes a long way towards meeting the maintainability requirement.
</li>
<li>All TODO-style comments in the code have been addressed and removed.</li>
</ol>
<h3>Static Code Analysis</h3>
<ol>
<li>Code has been analyzed by static code analysis tools. The two primary tools I use for Java development are the <a href="http://www.eclipse.org/">Eclipse compiler</a> and <a href="http://findbugs.sourceforge.net/">FindBugs</a>. Other Java tools include <a href="http://pmd.sourceforge.net/">PMD</a>, <a href="http://checkstyle.sourceforge.net/">Checkstyle</a>, and <a href="http://wiki.architecturerules.org/index.php?title=Main_Page">Architecture Rules</a>.
</li>
<li>All errors and warnings found by the tools have either been corrected or have been suppressed with a comment indicating the reason for suppression.
</li>
</ol>
<h3>Testing</h3>
<ol>
<li>Automated unit tests are written. The tests should be <a href="http://www.basilv.com/psd/blog/2006/how-to-write-good-unit-tests">high quality</a> (e.g. not brittle).</li>
<li>Automated integration tests are written that verify interactions with external systems such as the application database or third-party application / web services.</li>
<li>Code coverage achieved by the automated tests is measured and sufficient coverage is achieved. I use <a href="http://cobertura.sourceforge.net/">Cobertura</a> for measuring code coverage. I do not like using only a numeric percentage coverage target as the sole definition of sufficient coverage, because this can encourage people to write poor-quality tests that merely execute the code rather than verify its correct behavior in order to meet the target. My true definition of sufficient coverage is that the tests execute <em>and verify</em> all code that could reasonably be incorrect. Having said this, I generally aim for at least 80% line (statement) coverage overall, and often achieve 90%+ coverage for individual classes. I am still debating what a reasonable target is for branch (conditional) coverage . I currently aim for at least 50% overall, but I have the feeling that a target of 75% would be better.
</li>
<li>Functional testing by someone other than the developer has been done. Ideally this testing will be done by the customer, involve exercising the complete feature being coded in the way that users would use it, and be fully automated. More frequently I have seen this testing done manually (especially for user interfaces) by business analysts or testers who act as proxies for the customer. The key idea is to have someone other than the developer do testing to validate the assumptions and interpretations made (often implicitly) by the developer.
<p>I use the vague term "functional testing" rather than the more common terms "system testing" or "user acceptance testing" because projects can differ dramatically in what is done for system or user acceptance testing. If acceptance testing is done in a waterfall fashion as a separate phase near the end of the project then it cannot be part of the definition of done for a feature (but it is still part of the definition of done for the release). So I use the term "functional testing" to indicate this potential differentiation. Ideally, based on lean principles, all testing including system and user acceptance testing should be done as part of the work on a feature and not artificially delayed till later.
</li>
</ol>
<h3>Reviewed</h3>
<ol>
<li>Design / approach has been reviewed by the technical lead / architect.</li>
<li>Detailed peer review / inspection has been done. If pair programming is being used then the peer review is automatically done at the same time as the coding. Otherwise, the reviewer should focus on issues that are less likely to be found by the static code analysis or automated testing. This can include items such as security holes, concurrency issues, and correctly meeting requirements.</li>
<li>Issues identified by reviewers have been resolved to the reviewer's satisfaction.</li>
</ol>
<h3>Other</h3>
<ol>
<li>Required documentation has been updated. This may include online help, user manual, or operations manual.</li>
<li>Build and deployment scripts and related configuration files have been updated.</li>
<li>No known defects are outstanding unless the customer has agreed to defer them, in which case they should be logged.</li>
<li>No known tasks related to the feature are outstanding.</li>
</ol>
<p>That concludes my definition of done. I would appreciate hearing about what you use for a definition of done. In particular, if there is anything you think should be added or removed from my definition please let me know via a comment below. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2009/my-definition-of-done/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Cyclic Incremental Growth in Software Systems</title>
		<link>http://www.basilv.com/psd/blog/2008/cyclic-incremental-growth-in-software-systems</link>
		<comments>http://www.basilv.com/psd/blog/2008/cyclic-incremental-growth-in-software-systems#comments</comments>
		<pubDate>Sun, 02 Nov 2008 13:28:57 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[maintenance]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[software releases]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=178</guid>
		<description><![CDATA[I recently read an interesting research paper titled <a href="http://users.ece.utexas.edu/~perry/work/papers/feast1.pdf">Metrics and Laws of Software Evolution - The Nineties View</a> by Lehman et al in the 1997 proceedings of the Software Metrics Symposium that discusses eight laws of software evolution. One set of graphs within the paper jumped out at me: they show the incremental growth of two systems over a series of releases. The graphs shared a common pattern: releases with higher than average incremental growth tended to alternate with one or more releases with lower than average growth. What are the implications of this commonly observed behavior for developing and using software? How can we use this pattern to our advantage? Read on to see my answers to these questions. ]]></description>
			<content:encoded><![CDATA[<p>I recently read an interesting research paper titled <a href="http://users.ece.utexas.edu/~perry/work/papers/feast1.pdf">Metrics and Laws of Software Evolution - The Nineties View</a> by Lehman et al in the 1997 proceedings of the Software Metrics Symposium that discusses eight laws of software evolution. One set of graphs within the paper jumped out at me: they show the incremental growth of two systems over a series of releases. The graphs shared a common pattern: releases with higher than average incremental growth tended to alternate with one or more releases with lower than average growth. What are the implications of this commonly observed behavior for developing and using software? How can we use this pattern to our advantage? Read on to see my answers to these questions. </p>
<p>The following graph is illustrative of the pattern:<br />
<a href="http://www.basilv.com/psd/wp-content/uploads/2008/11/incrementalgrowthbyrelease.png"><img src="http://www.basilv.com/psd/wp-content/uploads/2008/11/incrementalgrowthbyrelease.png" alt="Incremental Growth of Software by Release" title="Incremental Growth of Software by Release" width="500" height="331" class="size-full wp-image-179" /></a></p>
<h3>Cause of Cyclical Incremental Growth</h3>
<p>Lehman's general interpretation of these cycles was based on systems thinking in terms of feedback loops. Positive feedback – such as user requests for enhancements – leads to incremental growth in the next release. This in turn activates forces causing negative feedback – such as an increased number of defects to fix – which brings the growth back down. The following diagram illustrates these feedback loops causing a limit to growth:<br />
<a href="http://www.basilv.com/psd/wp-content/uploads/2008/11/enhancementsfixesfeedbackdiagram.png"><img src="http://www.basilv.com/psd/wp-content/uploads/2008/11/enhancementsfixesfeedbackdiagram.png" alt="Enhancements and Fixes Feedback Diagram" title="Enhancements and Fixes Feedback Diagram" width="500" height="307" class="size-full wp-image-182" /></a></p>
<p>If you are not familiar with the topic of systems thinking then I recommend the book <a href="http://www.amazon.ca/gp/product/0385472560?ie=UTF8&#038;tag=basilvandegri-20&#038;linkCode=as2&#038;camp=15121&#038;creative=330641&#038;creativeASIN=0385472560">The Fifth Discipline Fieldbook</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0385472560" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, which provides an insightful introduction to the topic of systems thinking and the use of these feedback diagrams.</p>
<p>Lehman discussed briefly possible causes of the cycles but did not explore this topic in depth. Based on my experience I believe that one primary cause of such cycles is that after significant enhancements to a system are released and put to use, defects, operational issues, and desirable minor changes are discovered. The next release(s) then focuses on addressing these issues, which leads to much lower incremental growth in the system. Once these issues are addressed, the subsequent release can focus more on adding features, which results in increased incremental growth and leads to the observed pattern of cyclic incremental growth.</p>
<p>I have observed this pattern occur multiple times with software I am involved in maintaining. One component at work I have been involved with for a few years now and consistently after every release with significant changes or additions to functionality there is a subsequent release to address defects, operational issues, or usability issues discovered through daily use of the component in production. I have seen a similar pattern with the <a href="http://www.basilv.com/psd/software">open source software I distribute on my website</a>. Often after releasing a new feature and using the software, I discover either a defect or a usability issue which I then fix and release a new version.</p>
<h3>Preventing the Cycles</h3>
<p>Can these cycles be prevented? In particular, can these issues found after the release goes to production be discovered instead through testing the system before release? I have no doubt that thorough testing would help reduce the number of issues found post-release. Extra testing will not, however, prevent the cycle. Software engineering research tells us that testing only finds a certain percentage of defects - usually under 50%. When I consider from my experience the types of issues discovered post-release, they fall into one of the following categories:</p>
<ul>
<li>Usability: The system functions as per the requirements and design, but is difficult or confusing for real users to use in practice. </li>
<li>Maintenance issue: Production support staff experience difficulties supporting the operation of the application in production, i.e. due to insufficient logging or configuration options, or improper error handling.</li>
<li>Incorrect requirements: Once users actually use the system, they discover that what they asked for (the requirements) is not exactly what they want.</li>
<li>High-volume usage issues: I include in this category various types of issues that only seem to be discovered in production use including concurrency, compatibility, performance, and scalability.
<li>Functional Defect: A failure of the system to function as per the functional requirements and design.</li>
</ul>
<p>While I would expect most functional defects to be caught prior to release with careful testing, most of the other categories are less likely. To even have a reasonable chance of discovering these other issues requires a special focus on  these categories during development and testing – i.e. including usability testing or stress testing. Given that functional testing is frequently cut short to meet project deadlines, these other types of testing are much less likely to be done at all, let alone thoroughly. </p>
<p>The fundamental issue is that the most thorough way to test software is to put it into active, daily use. (This is not necessarily the most cost effective way nor is it best for the users.) So despite all the testing that may be done prior to release, deploying the software to production and letting users hammer it is going to reveal issues. I believe that this leads, inevitably, to the observed cycles of incremental growth, as one or more follow-up releases are needed to address defects. The amplitude and frequency of the cycles can be reduced, but not eliminated.</p>
<h3>Lessons Learned</h3>
<p>What lessons can be learned from this pattern of cyclical incremental growth? What common practices in I.T. try to address this cycle? </p>
<ul>
<li>For risk-adverse organizations, avoid software that has just been released with significant enhancements – i.e. release X.0. Instead wait for subsequent minor releases that address the inevitable issues found after the release – i.e. release X.0.1 or X.1.</li>
<li>Use beta releases to simulate an actual release. Whether the beta testers are a handpicked subset of existing users or are early adopters who voluntarily download the beta, the idea is to put the software into hands of users with the agreed expectation that there will be issues. This needs to balance two competing forces: putting the software to use as widely as possible to find issues versus keeping users happy about the product – which finding defects makes more difficult.</li>
<li>Software development teams should plan for an issue-fixing release after major enhancement releases, especially if other steps are not taken to minimize the cyclical pattern. This is surprisingly difficult as it is far easier for the team and management to stay in denial ("the software has no defects" being a common refrain of developers) than to accept reality and plan accordingly.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2008/cyclic-incremental-growth-in-software-systems/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Release When Ready</title>
		<link>http://www.basilv.com/psd/blog/2007/release-when-ready</link>
		<comments>http://www.basilv.com/psd/blog/2007/release-when-ready#comments</comments>
		<pubDate>Sun, 26 Aug 2007 15:26:17 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[schedule]]></category>
		<category><![CDATA[scope]]></category>
		<category><![CDATA[software releases]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/blog/2007/release-when-ready</guid>
		<description><![CDATA[There are several strategies for producing software releases. One approach is to release by schedule – the software ships on a fixed date defined well in advance. Another method is to release based on budget – the work stops once the money available is exhausted. I believe, however, that the best strategy in general is [...]]]></description>
			<content:encoded><![CDATA[<p>There are several strategies for producing software releases. One approach is to release by schedule – the software ships on a fixed date defined well in advance. Another method is to release based on budget – the work stops once the money available is exhausted. I believe, however, that the best strategy in general is to release when ready. I define ready as meaning that the code has been reviewed and unit tested by developers and the software as a whole exercised by separate testers with no serious (unacceptable) outstanding defects. Blizzard Entertainment, the software game company behind many gaming hits such as World of Warcraft, Starcraft, and Diablo, has <a href="http://www.blizzard.com/inblizz/genfaq.shtml">publicly stated</a> that they use the release when ready strategy: "our goal at Blizzard is to not release a game until it's ready." I believe this is one of the key reasons Blizzard has enjoyed consistent success with their games.</p>
<p>Why do I feel that the release when ready strategy is generally best? The objective behind creating software is to have it fulfill a function, and to do this it must work properly. My definition of ready software is essentially a more precise way of saying that the software works. If the software does not work properly, why would you release it prematurely? There are a variety of factors responsible for the large amounts of premature software being released:</p>
<ul>
<li><strong>Politics</strong>: A mandated budget or release date with no basis in reality or an arbitrary reduction in the schedule after it has been estimated are both problematic. In fact, such practices could be considered a fourth release 'strategy': release by management fiat. A more subtle case when politics has a negative impact is when it is onerous to change the budget or release date due to the bureaucracy and paperwork involved.</li>
<li><strong>Fixed Resources</strong>: There are situations where the amount of time or budget is fixed and cannot be changed. One example is software changes due to new legislation that comes into effect at a certain date, such as the recent change in the start time of daylight saving time. Startups often have limited funds, and need to have a software release to market before that money is exhausted.</li>
<li><strong>Competition</strong>: There is a commonly-held perception that being first-to-market is a competitive advantage, and this belief causes marketing departments to push for accelerated release schedules.</li>
<li><strong>Demand for Features</strong>: For both commercial and enterprise software, consumers and users generally demand more features over quality. After people start using the software and discovering problems, then they might begin to demand higher quality. Even then, sometimes the users are not the purchasers, as is the case for most business and enterprises software. This demand for more features influences development teams to include just one more feature rather than spend the time necessary to ensure the software is ready for release (i.e. via code reviews and testing).</li>
<li><strong>Ignorance</strong>: Managers who do not understand software development may come to believe that the software is ready to release when it really is not. This is a common risk of producing software prototypes.
</ul>
<p>These factors can make it difficult to impossible for a development team to apply the release when ready strategy. It is possible, however, to adapt to a release by schedule (or budget) strategy while maximizing the odds of the software being ready. To do this, you first must <a href="http://www.basilv.com/psd/blog/2006/understanding-project-schedules">understand project schedules</a> - in particular how the interrelated factors of time, resources, scope, and quality affect the schedule. Releasing software when ready implies that the quality is high, and a release by schedule strategy implies that the time is fixed. Adding resources is one option, but this is ineffective in the short term (due to Brook's law),  difficult to accomplish quickly, and it does not help when the budget is fixed. This leaves scope as the single factor remaining. The key then is to carefully manage the scope throughout the entire development effort in a variety of ways:</p>
<ul>
<li>Prioritize requirements and features into must-haves, important, and nice-to-haves. Work on the highest priority features first.</li>
<li>Structure and organize features into self-contained units to make it possible to drop features that cannot be finished by the release date.</li>
<li>Fully complete features before moving on to new features, especially as the release date draws near. This means that the work activities should not be structured by technologies or application layers, but by end-to-end functionality. For example, rather than working on the database persistence layer first for all the features, and then turning to the business logic and user interface, do all three layers for a single feature only.</li>
<li>Track the progress on each feature according to whether it is ready for release or not. This means that a feature is not done when the developer is done coding, but is only after it has been reviewed, tested, and all the serious defects eliminated. This implies that you do not wait till the end of the project to do all the code reviews and testing. Tracking progress by ready-to-release features allows you to still release working software if you run out of time by dropping all the incomplete features.</li>
<li>Define a project milestone sufficiently in advance of the release date for making the final decision as to what features will make the release, and which features will be dropped. This allows the time required to remove dropped features from the code base or disable them and to perform 'final' testing on the release candidate.</li>
</ul>
<p>While the above points can help deal with a fixed release date, I feel it is far from the ideal situation. I believe the best approach is the release when ready strategy. You can still have a target release date, but make it flexible. You still aim for that release date using the points above for managing scope, but making the date flexible allows you to take a more rational and balanced approach. As the release date approaches, you can decide whether to cut features or push out the release date. During final testing, if too many defects are being found, you can decide to spend more time improving the quality of the software and push out the release date.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2007/release-when-ready/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lessons Learned in 2006</title>
		<link>http://www.basilv.com/psd/blog/2006/lessons-learned-in-2006</link>
		<comments>http://www.basilv.com/psd/blog/2006/lessons-learned-in-2006#comments</comments>
		<pubDate>Mon, 18 Dec 2006 20:43:35 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[learning]]></category>
		<category><![CDATA[professional]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[error handling]]></category>
		<category><![CDATA[personal development]]></category>
		<category><![CDATA[reliability]]></category>
		<category><![CDATA[software releases]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/blog/2006/lessons-learned-in-2006</guid>
		<description><![CDATA[As a proponent of perpetual learning, I like to periodically take the time to reflect on what I have learned. Looking back at this past year, I definitely expanded my understanding in a number of areas based on my experiences at work and at home. My most significant growth was in the area of personal [...]]]></description>
			<content:encoded><![CDATA[<p>As a proponent of <a href="http://www.basilv.com/psd/blog/2006/perpetual-learning">perpetual learning</a>, I like to periodically take the time to reflect on what I have learned. Looking back at this past year, I definitely expanded my understanding in a number of areas based on my experiences at work and at home.</p>
<p>My most significant growth was in the area of personal productivity: I read and implemented the organizational system described in the book <a href="http://www.amazon.ca/exec/obidos/redirect?link_code=as2&#038;path=ASIN/0743520343&#038;tag=basilvandegri-20&#038;camp=15121&#038;creative=330641">Getting Things Done : The Art Of Stress-Free Productivity</a><img src="http://www.assoc-amazon.ca/e/ir?t=basilvandegri-20&#038;l=as2&#038;o=15&#038;a=0743520343" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by David Allen. I have found this system very useful both at work and at home, and wrote an <a href="http://www.basilv.com/psd/blog/2006/getting-things-done">article describing my experience implementing the system</a>.</p>
<p>This last year I switched to a <a href="http://www.basilv.com/psd/blog/2006/working-four-days-a-week">four day work week</a>, and have found it to be a significant improvement over the normal five days. I even figured out how to do this without a drop in pay.</p>
<p>One area of software development I have explored a lot this year has been change and release management: specifically the process of promoting application or infrastructure changes into a production environment. Both my experiences at work and <a href="http://www.basilv.com/psd/blog/2006/running-my-website-3-month-retrospective">my experiences running this website</a> have made me appreciate the necessity of having a defined process. The amount of process that is necessary depends on the types of changes being made and the complexity of the environment. As I wrote in my article on <a href="http://www.basilv.com/psd/blog/2006/deploying-application-changes">deploying application changes</a>, it is easier when the application is packaged and deployed as a single unit. When this is not possible - like for database changes - then more process is necessary. Adding too much process, however, can be just as harmful as having too little - a proper balance must be maintained.</p>
<p>Over this last year I have spent a lot of time thinking about application reliability. Ensuring a system is highly reliable is a surprisingly difficult task, and one of the major culprits is <a href="http://www.basilv.com/psd/blog/2006/complexity-and-reliability">complexity</a>. I have found myself arguing more strongly for simpler, more reliable solutions as a result. My most recent focus has been on error handling.  My article on <a href="http://www.basilv.com/psd/blog/2006/fail-fast-or-degrade-gracefully">the fail fast and degrade gracefully approaches to error handling</a> contains some earlier thoughts on this subject, but I have not yet written up my latest ideas. I have come to believe that the degrade gracefully approach, while more difficult to implement, is the best for creating highly reliable software. I have unfortunately encountered a third approach to error handling: ignore errors. This leads to silent, undetected failures whose negative effects go unnoticed for an arbitrary length of time.</p>
<p>I have also learned a <a href="http://www.basilv.com/psd/blog/2006/running-my-website-3-month-retrospective">number of lessons from running this website</a>, including improving my knowledge of web design, promotion, and on-line advertising. I have found the process of writing my weekly articles to be a great learning aid. Writing forces me to reflect on and clarify my thoughts and ideas on a particular subject. It is no coincidence that I have provided a number of links above to articles I have written this past year. I tend to write about topics that are currently in my focus of attention, and the act of writing about them helps clarify and solidify the learning I have done. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2006/lessons-learned-in-2006/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Deploying Application Changes</title>
		<link>http://www.basilv.com/psd/blog/2006/deploying-application-changes</link>
		<comments>http://www.basilv.com/psd/blog/2006/deploying-application-changes#comments</comments>
		<pubDate>Thu, 05 Oct 2006 15:00:43 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[maintenance]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[software releases]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/blog/2006/deploying-application-changes</guid>
		<description><![CDATA[The maintenance team for a typical enterprise business application must make ongoing changes to the application. In the effort to fix defects, revise existing functionality, and add enhancements, little thought may be given to the process by which these changes are deployed from development through to testing and then the production environment. However, this process [...]]]></description>
			<content:encoded><![CDATA[<p>The maintenance team for a typical enterprise business application must make ongoing changes to the application. In the effort to fix defects, revise existing functionality, and add enhancements, little thought may be given to the process by which these changes are deployed from development through to testing and then the production environment. However, this process is equally important: no matter how carefully the changes are made and tested in development, they must also be implemented properly in production or a failure will occur. </p>
<p>This application deployment process must specify the set of application artifacts (i.e. executable code, database objects, files) that is deployed for a particular release - what I call the <em>unit of deployment</em>. There are two basic approaches to defining a unit of deployment. </p>
<p>The first approach is a full deployment: packaging together the entire application as a single unit. As a Java developer, this seems like a natural approach: the compiled Java class files along with other application files can be bundled into a single JAR, WAR or EAR file. A typical enterprise business application, however, consists of more than just the code. For the database in particular, deploying all the tables and views for the entire application when doing a release is not practical. Therefore, the second approach to defining a unit of deployment is a partial deployment: only include those application artifacts that have changed. The remainder of the artifacts are left unmodified in the environment being deployed to. For the database, this means that only those tables or views that have been modified need to be included in the deployment.</p>
<p>These two approaches each have advantages and disadvantages. The following criteria are useful for determining which approach should be used in a particular situation:</p>
<ul>
<li>How confidently can you track the application changes? If it is hard or error-prone to track changes to artifacts, then a full deployment is safer. With a partial deployment, you need to know that all relevant changes made in the development environment are being promoted to the test environment, and then from the test to the production environment. Missing one or more artifacts in the deployment to production can cause defects or even a complete failure of the application.
</li>
<li>How much manual effort is required to do the deployment? Manual effort increases the likelihood of a failed deployment due to human error. A full deployment is easy to automate and should require little if any manual effort to maintain, since you always just grab the entire application. A partial deployment can be automated for a single change, but it is hard to have a reusable automatic deployment mechanism since the set of artifacts that change will vary from release to release. Such a mechanism needs to be able to determine automatically what has changed and deploy just those pieces. A good example of this is the automatic update mechanisms found in operating systems and applications - they only download a patch containing the changes rather than an entire copy of the updated application.
</li>
<li>How much time is required to do the deployment? The longer it takes to deploy a single artifact, the more important this criteria, and the more valuable the partial deployment approach becomes. Database changes are the best example: to drop and recreate every table in the database for a change would require a full backup and restore of the data, which will often take prohibitively longer than simply updating the few tables that actually changed. Online application updates are limited by network bandwidth, so they also benefit from a partial deployment.
</li>
</ul>
<p>My preference is for full deployments. Unless circumstances require a partial deployment, I feel that the default choice should be to deploy everything. Unfortunately, this is seldom possible in a complex enterprise environment. Many enterprise applications consist of a collection of components or services such as web application, database, batch processing, scheduling, reporting, and web services. Due to organizational or logistical reasons, it is seldom possible to do a full deployment of all of these components in a single release. At the application level, therefore, a partial deployment is often done. It is at the component level where it is easier to achieve full deployments of the individual components.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2006/deploying-application-changes/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

