<?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; Scrum</title>
	<atom:link href="http://www.basilv.com/psd/blog/tag/scrum/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>Why You Need a Definition of Done</title>
		<link>http://www.basilv.com/psd/blog/2009/why-you-need-a-definition-of-done</link>
		<comments>http://www.basilv.com/psd/blog/2009/why-you-need-a-definition-of-done#comments</comments>
		<pubDate>Mon, 28 Sep 2009 14:09:49 +0000</pubDate>
		<dc:creator>Basil Vandegriend</dc:creator>
				<category><![CDATA[management]]></category>
		<category><![CDATA[definition of done]]></category>
		<category><![CDATA[getting things done]]></category>
		<category><![CDATA[process]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.basilv.com/psd/?p=442</guid>
		<description><![CDATA[Whether you are working on a small task or a large project, do you and your team have a clear understanding of what it takes to complete a piece of work? The Scrum method of software development calls this Definition of Done and touts this as a critical practice for high-performing teams. While I have [...]]]></description>
			<content:encoded><![CDATA[<p>Whether you are working on a small task or a large project, do you and your team have a clear understanding of what it takes to complete a piece of work? The Scrum method of software development calls this <a href="http://www.scrumalliance.org/articles/105-what-is-definition-of-done-dod">Definition of Done</a> and touts this as a critical practice for high-performing teams. While I have used an implicit, <a href="http://www.basilv.com/psd/blog/2007/strategies-for-effective-code-reviews">informal definition of done for coding</a> for years, recently I have been enlightened as to the value of having an explicit, written definition that the team agrees to and understands. </p>
<p>Why is having a definition of done so valuable? I have grouped the benefits it provides into the following categories:</p>
<h3>Higher Quality</h3>
<p>Definitions of done should typically focus less on the activities people normally do and focus more on the activities that tend to be neglected or forgotten. In software development this means specifying activities that ensure the quality of the code being produced, rather than the actual act of coding. Quality often means much more than just few defects: it can also mean readable code, a clean design, or achieving any number of other non-functional requirements such as security, performance, and scalability. A definition of done that includes quality aspects serves, therefore, as both a reminder of the importance of quality in the day-to-day work and as a set of expectations regarding the level of quality to strive for.</p>
<p>Out of curiosity I decided to check out a number of publicly available definitions of done and count the percentage of items that clearly related to quality. Here are the results:</p>
<table class="fancy" cellspacing="0">
<tr>
<th>Definition of Done</th>
<th>% of Items Relating to Quality</th>
</tr>
<tr>
<td><a href="http://www.agile-software-development.com/2007/07/definition-of-done-10-point-checklist.html">http://www.agile-software-development.com/2007/07/definition-of-done-10-point-checklist.html</a></td>
<td>50% (5 / 10)</td>
</tr>
<tr>
<td><a href="http://www.scrumalliance.org/articles/37-are-we-there-yet">http://www.scrumalliance.org/articles/37-are-we-there-yet</a></td>
<td>46% (6 / 13)</td>
</tr>
<tr>
<td><a href="http://www.scrumalliance.org/articles/107-how-do-we-know-when-we-are-done">http://www.scrumalliance.org/articles/107-how-do-we-know-when-we-are-done</a></td>
<td>60% (3 / 5)</td>
</tr>
</table>
<h3>Standardization</h3>
<p>A written, clearly-specified definition of done is essentially a standard. Standards provide many benefits when properly applied using <a href="http://www.basilv.com/psd/blog/2006/are-you-a-rule-maker-or-a-rule-breaker">a lean (pragmatic) mindset rather than a bureaucratic mindset</a>. The proper mindset can be summarized using the following dichotomy: a standard represents the best way we know today of doing some activity within some context, yet each day we search for a better way so as to improve the standard. As implied by this summary, standards help form the foundation for future improvements. This is because following standards brings consistency which makes it easier to analyze the results of the work being done, determine the root cause of problems, and identify how to improve. For more on how standards help improvement efforts see my article on <a href="http://www.basilv.com/psd/blog/2009/continuous-improvement-framework">a framework for continuous improvement</a>.</p>
<p>Standards have a number of other benefits. Checklists can be created from the standards for use by both the people doing the work (as a reminder of what to do), and by the people verifying the work (as a quality assurance check). Standards are helpful in training new team members. Having documented standards can also be helpful for achieving certain certifications like ISO or passing regulatory requirements such as Sarbanes-Oxley.</p>
<p>Most definitions of done do not mandate the specific step-by-step procedures to follow, but rather set expectations regarding the final product produced. To illustrate, a definition of done for coding features will likely mandate that certain kinds of testing be done (automated unit testing, functional testing, etc.), but will typically not mandate the sequence in which the testing and coding activities are done. (So unit tests could be written before the code as per test-driven development, or they could be written afterward - either approach will satisfy the definition of done.) Team may choose to standardize which procedures are used, but this is typically kept separate from a definition of done.</p>
<h3>More Accurate Estimates</h3>
<p>Having a definition of done helps estimation accuracy in two ways. First, it serves as a checklist of all the steps required to complete an activity that can likewise be used to estimate the effort remaining. When estimating the work left on a feature, for example, a definition of done can help ensure that time is estimated not just for the coding, but also for reviewing and testing. </p>
<p>Second, a definition of done makes it easier to track the actual progress, since activities reported as done are more likely (but not guaranteed, unfortunately) to actually be done. This means there will be less surprises in terms of additional work required for previously 'completed' assignments. These surprises, of course, significantly reduce estimation accuracy, so the more they can be eliminated the better the estimates.</p>
<h3>Better Teamwork</h3>
<p>The previous benefits apply when you are working on your own, but software development is more commonly a team activity. And in addition to these prior benefits, having a definition of done will make your team more effective. Many of the challenges of working in terms such as achieving unity of purpose, clear communication, and coordination of effort, benefit from having a definition of done. When team members are communicating about the work that has been and needs to be done, having a clear definition of done helps avoid misunderstandings. The definition functions, in essence, as a communications technique for ensuring that when team members use the word "done" they all mean the same thing. </p>
<p>For examples of what happens without a clear definition see <a href="http://agilesoftwaredevelopment.com/2006/05/definition-of-done">this story of a team of five having three different viewpoints regarding done</a> and <a href="http://www.scrumalliance.org/articles/37-are-we-there-yet">this story of someone reporting a status of 'finished' that really wasn't</a>.</p>
<h3>Concluding Thoughts</h3>
<p>This article has mostly discussed definition of done in the context of software development and specifically coding, but the concept is much more broadly applicable both within I.T. and beyond. Staying within I.T. I can see the benefits of having definitions of done for activities such as incident resolution by support staff, product high-level requirements definition, and pursuing sales. So I challenge you to look for opportunities to use a definition of done to help achieve superior performance.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.basilv.com/psd/blog/2009/why-you-need-a-definition-of-done/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

