<?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>Heather McLean &#187; Software Development</title>
	<atom:link href="http://heathermclean.net/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://heathermclean.net</link>
	<description>Thoughts on agile methodologies and leadership.</description>
	<lastBuildDate>Tue, 24 Aug 2010 14:00:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Implementing UUIDs in .NET</title>
		<link>http://heathermclean.net/2010/06/implementing-uuids-in-net/</link>
		<comments>http://heathermclean.net/2010/06/implementing-uuids-in-net/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 14:12:15 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=229</guid>
		<description><![CDATA[As another code exercise, I decided to look at RFC 4122 (&#8220;A Universally Unique IDentifier (UUID) URN Namespace&#8221;) and create an object in C# that was capable of handling all five versions presented in that document. I wanted to see if I could successfully interpret the algorithms as described by the document without looking at [...]]]></description>
			<content:encoded><![CDATA[<p>As another code exercise, I decided to look at <a href="http://www.ietf.org/rfc/rfc4122.txt" target="_blank">RFC 4122</a> (&#8220;A Universally Unique IDentifier (UUID) URN Namespace&#8221;) and create an object in C# that was capable of handling all five versions presented in that document. I wanted to see if I could successfully interpret the algorithms as described by the document without looking at any reference implementations.</p>
<p>I think in the end it was quite successful and offers a pretty robust implementation of version 1 through 5 UUIDs, including a version 4 UUID which is compatible with the native <a href="http://msdn.microsoft.com/en-us/library/system.guid.aspx" target="_blank">System.Guid</a> implementation. There is one class called Uuid which can represent any version of UUID, and it is used similar to the aforementioned System.Guid to either create a new unique identifiers or represent existing ones. It also supports explicit casts to/from System.Guid.</p>
<pre name="code" class="c#">Uuid existingUuid = new Uuid("9b1ea5f8-702b-4ad5-97f0-34bb10a28602");
Uuid newUuid = Uuid.NewUuid(Uuid.UUID_VERSION_1);</pre>
<p>A battery of unit tests is also included to help verify the implementation. You can download the code from my <a href="http://heathermclean.net/code/" target="_self">Code</a> page as usual.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2010/06/implementing-uuids-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Code available for download</title>
		<link>http://heathermclean.net/2009/10/code-available-for-download/</link>
		<comments>http://heathermclean.net/2009/10/code-available-for-download/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 01:49:38 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Meta]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=197</guid>
		<description><![CDATA[My new Code page is now online, where you can download some of my little project exercises. You&#8217;ll find the REST web services project I talked about a few weeks ago, as well as a lightweight inversion of control container. I&#8217;m releasing these projects as public domain since they were really just exercises and not [...]]]></description>
			<content:encoded><![CDATA[<p>My new <a href="http://heathermclean.net/code/" target="_self">Code</a> page is now online, where you can download some of my little project exercises. You&#8217;ll find the <a href="http://heathermclean.net/2009/09/rest-in-net/" target="_self">REST web services project</a> I talked about a few weeks ago, as well as a lightweight inversion of control container. I&#8217;m releasing these projects as public domain since they were really just exercises and not full-fledged usable codebases.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/10/code-available-for-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REST in .NET</title>
		<link>http://heathermclean.net/2009/09/rest-in-net/</link>
		<comments>http://heathermclean.net/2009/09/rest-in-net/#comments</comments>
		<pubDate>Wed, 02 Sep 2009 15:52:45 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Personal Development]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=159</guid>
		<description><![CDATA[After a discussion of the merits of various web service technologies with a colleague of mine, I decided to do a little programming exercise. I felt I hadn&#8217;t really gotten to do any seriously complex programming in a while, so it was nice to exercise my brain a bit and learn some new things. I [...]]]></description>
			<content:encoded><![CDATA[<p>After a discussion of the merits of various web service technologies with a colleague of mine, I decided to do a little programming exercise. I felt I hadn&#8217;t really gotten to do any seriously complex programming in a while, so it was nice to exercise my brain a bit and learn some new things. I basically implemented a REST web service stack in .NET. It has both a server and client model. For the client, it&#8217;s as simple as decorating an interface:</p>
<pre name="code" class="c#">
[RestWebClient(Url = "http://local.yahooapis.com/MapsService/V1")]
public interface IYahooTrafficService : IRestWebService
{
    [RestNoun("trafficData", Method = RestHttpMethod.GET)]
    [return: RestReturnType(RestReturnType.Xml)]
    XmlDocument GetTrafficData(string appid, string street, string city, string state);
}
</pre>
<p>The example here uses the <a href="http://developer.yahoo.com/traffic/rest/V1/index.html" target="_blank">Yahoo Traffic Data API</a>. Once the interface is created, I can get a concrete instance through the RestWebClient factory:</p>
<pre name="code" class="c#">
IYahooTrafficService svc = RestWebClient.Create&lt;IYahooTrafficService&gt;();
XmlDocument xdoc = svc.GetTrafficData("YdnDemo", "1771 LBJ Fwy", "Dallas", "TX");
</pre>
<p>And voila! Traffic data:</p>
<div id="attachment_172" class="wp-caption alignnone" style="width: 310px"><img class="size-medium wp-image-172" title="Yahoo! Traffic Data" src="http://heathermclean.net/wp-content/uploads/2009/09/trafficdata-300x202.png" alt="Example of output from the Yahoo! Traffic Data API." width="300" height="202" /><p class="wp-caption-text">Example of output from the Yahoo! Traffic Data API.</p></div>
<p>Pretty simple, and it works with a variety of REST interfaces. It can also handle complex types through XML and binary serialization as well as straight binary streams, such as image files. The server piece works similar to the client; decorate a class with attributes to describe the service contract, and an HttpHandler does the rest.</p>
<p>This was particularly challenging on the client piece because I had to learn the <a href="http://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx" target="_blank">System.Reflection.Emit</a> namespace, which I had never used before, and it requires an in-depth knowledge of <a href="http://en.wikipedia.org/wiki/Common_Intermediate_Language" target="_blank">MSIL</a>. So that was difficult at first, frustrating most of the time, and rewarding in the end.</p>
<p>At some point I would like to clean up the code and release it as open source. Some other folks might actually find it useful. It definitely needs some heavy refactoring first, though.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/09/rest-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Waste</title>
		<link>http://heathermclean.net/2009/07/waste/</link>
		<comments>http://heathermclean.net/2009/07/waste/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 14:00:18 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Lean]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=143</guid>
		<description><![CDATA[&#8220;Waste&#8221;—it&#8217;s an ominous word by itself, and in the world of Lean principles, it&#8217;s the one thing you&#8217;re striving to eliminate. Waste can be defined as that which adds no value to a project; i.e., those things that you are spending time and money doing, but they don&#8217;t move the project forward. Software projects are [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Waste&#8221;—it&#8217;s an ominous word by itself, and in the world of Lean principles, it&#8217;s the one thing you&#8217;re striving to eliminate. Waste can be defined as that which adds no value to a project; i.e., those things that you are spending time and money doing, but they don&#8217;t move the project forward. Software projects are often full of waste, and in such an imprecise discipline, it can be difficult to identify the sources of waste. In fact, a lot of times we end up running in circles, attempting to clean up the symptoms rather than the causes.</p>
<p>In my experience, the one largest source of waste that can be eliminated or reduced to add immediate benefit to a project is <strong>rework</strong><sup>1</sup>. Rework falls into two major categories:</p>
<ul>
<li>Technical debt</li>
<li>Defects</li>
</ul>
<p><span id="more-143"></span>Technical debt refers to those shortcomings in the design of the software that we accept that we will have to address at a later date. This often comes as a result of running out of time in any given iteration; as we cut corners, quality suffers, and technical debt mounts<sup>2</sup>. Defects, on the other hand, are unintended consequences or misunderstood requirements; that is, they are unforeseen problems with the software that must be addressed immediately. The ratio of the two varies from project to project, but since defects often require immediate consideration, they tend to have a disproportionate effect on the deliverable date.</p>
<p>Of course, the obvious solution is to write bug-free code. That&#8217;s what we want to do anyways, right? Admirable, yes, but not practical in the least. It is impossible to write code that is free of defects, as it would at its very base require a product owner and development team that are somehow psychically linked as well as infallible. However, it is possible to reduce the number of defects by following some very simple principles. This list is by no means comprehensive, but it should give you a starting point.</p>
<p><strong>Limit work in progress.</strong> Each developer should really not be working on more than one or two tasks simultaneously in most situations. Focus increases reliability.</p>
<p><strong>Reduce &#8220;crunch.&#8221;</strong> It should be obvious at this point to both developers and managers that there is a diminishing return on hours worked. Try to take on realistic commitments for each development iteration and avoid working large amounts of overtime if at all possible.</p>
<p><strong>Pair programming.</strong> This is a highly useful tool not only for developers to check each other but also a developer and a quality/business analyst to check each other. Your team will think you&#8217;re weird at first for asking for such an odd pairing, but I&#8217;ve done this before, and it can be highly valuable to have someone who understands the business and requirements working with the developer up front. This also increases utilization of QA resources that often sit idle until the end of an iteration.</p>
<p><strong>Engage QA earlier.</strong> Frequently in agile environments we fall into the trap of doing &#8220;mini-waterfall.&#8221;<sup>3</sup> That is, we do a design and specification phase during sprint planning, then the coders spend a bunch of time doing heads-down work to meet sprint objectives, and then they finally throw their deliverables over the wall to the QA team at the very last minute. If you find this to be a frequent problem, then break your tasks down into even smaller chunks that can be completed and delivered without utilizing the entire sprint for each one.</p>
<p><strong>Inclusive design.</strong> Always strive to include the entire team in design and specification meetings. It&#8217;s a simple fact that if more people are involved, more problems are likely to be uncovered before development even starts. The team as a whole should have a keen understanding of the entire project, even parts they may not be responsible for. If you find that this inclusiveness is eating up too much time, it&#8217;s most likely because your team is too large or your meetings are not staying focused.</p>
<p><strong>Daily updates.</strong> The daily status or &#8220;stand up&#8221; meeting is one of the core principles of Scrum. Even if you&#8217;re not practicing Scrum (or any agile methodology for that matter), I highly recommend daily updates. A focused, repeated meeting to keep everyone up-to-date on the team&#8217;s progress can help the team be aware of its progress as a whole as well as help identify and address problems mid-stream rather than at the end.</p>
<p><strong>Visibility.</strong> Another principle of Scrum, task boards and burn-down charts can also help the team with understanding where it is. Whatever the actual implementation, it should be a highly visible cue into everyone&#8217;s projects and the overall health of the project. Increased visibility reduces one of the most frustrating defects—items that we just plain forgot about.</p>
<hr /><span style="font-size:80%"><sup>1</sup><a href="http://itmanagement.earthweb.com/entdev/article.php/3830426" target="_blank">Software Development and The War on Muda</a><br />
<sup>2</sup><a href="http://www.noop.nl/2009/07/commit-to-sprint-planning-or-definition-of-done-not-both.html" target="_blank">Commit to Sprint Planning or Definition of Done, Not Both</a><br />
<sup>3</sup><a href="http://www.agilegamedevelopment.com/2009/02/how-long-should-sprint-be.html" target="_blank">How long should a sprint be?</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/07/waste/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google releases Courgette update engine for Chrome</title>
		<link>http://heathermclean.net/2009/07/google-releases-courgette-update-engine-for-chrome/</link>
		<comments>http://heathermclean.net/2009/07/google-releases-courgette-update-engine-for-chrome/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 15:11:59 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=129</guid>
		<description><![CDATA[I&#8217;ll admit this is a little bit of geek porn today, different from my usual fare. Google has released a new algorithm for sending software updates dubbed Courgette. In particular, I found the section on &#8220;guessing&#8221; intriguing: We can think of a differential update as a prediction followed by a correction, a kind of guessing [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll admit this is a little bit of geek porn today, different from my usual fare. Google <a href="http://dev.chromium.org/developers/design-documents/software-updates-courgette" target="_blank">has released a new algorithm</a> for sending software updates dubbed Courgette. In particular, I found the section on &#8220;guessing&#8221; intriguing:</p>
<blockquote><p>We can think of a differential update as a prediction followed by a correction, a kind of guessing game.  In its simplest form (just bsdiff / bspatch), the client has only a dumb guess, &#8216;original&#8217;, so the server sends a binary diff to correct &#8216;original&#8217; to the desired answer, &#8216;update&#8217;.  Now what if the server could pass a hint that could be used to generate a better guess, but we are not sure the guess will be useful?  We could insure against losing information by using the original and the guess together as the basis for the diff&#8230;</p>
<p>This system has some interesting properties.  If the guess is the empty string, then we have the same diff as with plain bsdiff.  If the guess is perfect, the diff will be tiny, simply a directive to copy the guess.</p></blockquote>
<p>A predictive software update engine has some interesting potential. I would love to see with what kind of accuracy their algorithm can actually &#8220;guess&#8221; the correct patch.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/07/google-releases-courgette-update-engine-for-chrome/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s Do Agile!</title>
		<link>http://heathermclean.net/2009/02/lets-do-agile/</link>
		<comments>http://heathermclean.net/2009/02/lets-do-agile/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 18:41:34 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=81</guid>
		<description><![CDATA[I&#8217;m not ashamed to admit that a recent post from Dave Nicolette reminded me of myself. After spending most of the past year being indoctrinated with Scrum, it is very, very tempting to start trying to apply iterative development to everything. I mean, why not? Iterative development is superior, right? As with all things, the [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m not ashamed to admit that <a href="http://dnicolet1.tripod.com/agile/index.blog?entry_id=1876834" target="_blank">a recent post from Dave Nicolette</a> reminded me of myself. After spending most of the past year being indoctrinated with Scrum, it is very, very tempting to start trying to apply iterative development to everything. I mean, why not? Iterative development is superior, right?</p>
<p>As with all things, the answer is &#8220;not always.&#8221; With my current project, the temptation is high. The organization and the project already exhibit several agile/XP qualities:</p>
<ul>
<li>Continuous integration.</li>
<li>30-day release cycles.</li>
<li>The project has already been broken down into smaller chunks of deliverable features.</li>
<li>We do daily status meetings. (Although they are an hour long and much less focused than a daily stand-up.)</li>
</ul>
<p>As you can see, it has the potential&#8230; on &#8220;the cusp of greatness,&#8221; you might say. It would be tempting to think that we could just overlay Scrum or some other form of iterative development and succeed, and trust me, it is very difficult to resist that urge to evangelize Scrum. However, there are several factors that mean I must take a healthy dose of reality first:</p>
<ul>
<li>The organization has no agile history, and I would bet that 99.9% of the managers and developers have never heard of agile development, let alone practiced it.</li>
<li>The &#8220;product owner&#8221; currently lacks the discipline/desire to commit to a set of requirements for any length of time. (We would be aborting sprints right and left.)</li>
<li>Policy prevents us from actually working on anything until it is completely designed and documented. (Of course, the policy is not always followed 100% of the time.)</li>
<li>The developers are not accustomed to self-managing.</li>
</ul>
<p>Those are just a few off the top of my head. As you can probably imagine, trying to throw Scrum into the mix here would not work out so well. On top of the above hurdles, it would be a hard sell to management, and I have a feeling any initiative would be quickly abandoned if positive results were not immediate.</p>
<p>Still, that doesn&#8217;t mean I&#8217;m not going to try at some point. I just have to be subtle and introduce things one step at a time rather than going whole hog from the beginning.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/02/lets-do-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Disciplines of Agile</title>
		<link>http://heathermclean.net/2009/01/disciplines-of-agile/</link>
		<comments>http://heathermclean.net/2009/01/disciplines-of-agile/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 19:22:38 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=71</guid>
		<description><![CDATA[The Discipline of Agile (followed from a post on Mr. Appelo&#8217;s blog) made me pause and think. Mr. Ambler&#8217;s article does an excellent job of breaking down agile into some key disciplines: Regular Delivery Quality Active Stakeholder Involvement Scale Teamwork I was thinking, though, that the list was far too specific. Some of these things [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ddj.com/architect/201804241?pgno=1" target="_blank">The Discipline of Agile</a> (followed from <a href="http://www.noop.nl/2009/01/4-top-posts-on-discipline-in-software-development.html" target="_blank">a post on Mr. Appelo&#8217;s blog</a>) made me pause and think. Mr. Ambler&#8217;s article does an excellent job of breaking down agile into some key disciplines:</p>
<ol>
<li>Regular Delivery</li>
<li>Quality</li>
<li>Active Stakeholder Involvement</li>
<li>Scale</li>
<li>Teamwork</li>
</ol>
<p>I was thinking, though, that the list was far too specific. Some of these things are results of similar disciplines—for instance, Active Stakeholder Involvement and Teamwork are both principles of good communication. Others are esoteric, such as Scale.</p>
<p>I decided to reorganize these disciplines a bit and change them around, hopefully making them more broadly applicable to agile processes. Below are what I believe to be the disciplines of an effective agile/lean project.<sup style="font-size:80%">1</sup><span id="more-71"></span></p>
<p><strong>The Discipline of Adaptability</strong><br />
How can you talk about agile and not mention adaptability?</p>
<p>The bottom line is that for agile to work, your stakeholders and your team must (willingly) be flexible. No set-in-stone product design, no hard deadlines, no non-negotiable items. An agile project is a conversation, not a lecture.</p>
<p>The hard truth is that everything changes, especially software. If people are not willing to adapt to a changing environment, then agile will fail before it even starts. The team and the customers must be open to receiving change and handling it appropriately.</p>
<p><strong>The Discipline of Intervals</strong><br />
One of the foundations of an agile process is the idea of <em>time-boxing</em>. Time-boxes are important because they allow us to control the pace of development even as we are constantly responding to change. Iterations and releases are often time-boxed to 30 days. The daily stand-up meeting is time-boxed to 15 minutes. Research and discovery tasks can be time-boxed to a few hours so that they remain focused.</p>
<p>When you stick to regular intervals, it assures your stakeholders that even without deadlines they will get something they can use in a reasonable time frame. Every 30 days, you will get some piece of functionality. It also increases developer productivity by setting a pace for development rather than racing to meet an arbitrary future date. When you produce incrementally, you can avoid the impending death march of waterfall projects.</p>
<p><strong>The Discipline of Completeness</strong><br />
Hand-in-hand with intervals, completeness is an important factor in delivering functionality to your stakeholders. Each interval, the team commits to complete a predetermined set of features. At the end of the interval, the team does not deliver partial functionality or a bunch of mock-ups<sup style="font-size:80%">2</sup>; they deliver <em>working software</em>.</p>
<p>The duty to completeness is not just for the developers, however. The product owner is also responsible, and thus he must be willing to de-feature when appropriate. If it looks like a commitment will be missed, this should be <em>communicated to the stakeholders</em> and the feature moved to a future iteration. The product owner should never<sup style="font-size:80%">3</sup> force the team to deliver more than it is capable of in a single iteration, and the team should never arrive at the review meeting and have to tell the stakeholders that they could not get something done.</p>
<p>It is also important on an individual level that each team member not claim that a feature is done until it is truly done—that is, it has been coded, tested, signed off by the product owner, and delivered to the customers.</p>
<p><strong>The Discipline of Quality</strong><br />
One thing that agile development will uncover very quickly in a software project is any sort of fragility. In order to respond to constant change (see &#8220;The Discipline of Adaptability,&#8221; above), the code must be resilient enough to withstand it&#8230; or it must be brought up to that level if it is not.</p>
<p>A common misconception of quality assurance is that QA&#8217;s job is to find bugs. On the contrary, it is actually there to <em>prevent</em> them. Many products have a very long QA cycle because so much time is spent fixing defects that have been identified. Imagine how much simpler it would be if there were no defects to find!</p>
<p>This requires a great deal of discipline from your engineers, since they must be mindful of QA from the beginning. As the saying goes, &#8220;Do it right the first time.&#8221; Developing in increments and utilizing practices such as Test-Driven Development will help achieve this goal.</p>
<p><strong>The Discipline of Communication and Transparency</strong><br />
Communication and transparency are absolutely critical to an agile project. Since there are fewer document artifacts moving around than in a waterfall environment, it is very easy for an agile project to operate &#8220;under the radar&#8221; if the team is not careful.  This is why processes like Scrum have the important core meetings: the daily stand-up, the review, the retrospective, and planning. The task board is also a great visibility tool.</p>
<p>It is important that the Scrum Master and the product owner work together to ensure that communication flows freely between the team and the stakeholders. Without this channel, the stakeholders will feel left in the dark about the project&#8217;s status, and the team will feel like they have no guidance or feedback.</p>
<p><strong>The Discipline of Innovation</strong><br />
The final discipline on my list (but certainly not the least) is innovation. In order for an agile project to succeed, the team and the process must constantly improve. The retrospective allows us to reflect on our past performance and adjust for the future. The team&#8217;s velocity is a tool to help us measure and increase throughput.</p>
<p>The most important thing to keep in mind is that <em>no process is sacred</em>. You may have read all the books on Scrum, but if &#8220;pure&#8221; Scrum is not working for your team, change it. Maybe you need shorter/longer iterations? That&#8217;s fine. Maybe you need a traditional project manager in addition to the Scrum Master and product owner? That&#8217;s fine too. Do what feels right for your organization. Experiment. Learn. Grow. Innovate.</p>
<hr /><span style="font-size: 80%;"><sup>1</sup>With the concession that when I&#8217;m talking about agile in this article, I&#8217;m using Scrum as my frame of reference.<br />
<sup>2</sup>Unless the agreed-to deliverable was a mock-up, of course.<br />
<sup>3</sup>As usual, <em>never</em> is a very strong word. Agile does not preclude crunches when needed, but the product owner should make every effort to avoid them.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2009/01/disciplines-of-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Development Projects and Usability</title>
		<link>http://heathermclean.net/2008/11/agile-development-projects-and-usability/</link>
		<comments>http://heathermclean.net/2008/11/agile-development-projects-and-usability/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 15:20:10 +0000</pubDate>
		<dc:creator>Heather</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://heathermclean.net/?p=44</guid>
		<description><![CDATA[As a matter of course, I like to follow Jakob Nielsen&#8217;s Alertbox posts (as I have been since 1998). Today I think he posted for the first time regarding Agile methodologies: Agile Development Projects and Usability by Jakob Nielsen If I didn&#8217;t know better, I&#8217;d say he has some disdain for Agile, but he makes [...]]]></description>
			<content:encoded><![CDATA[<p>As a matter of course, I like to follow Jakob Nielsen&#8217;s Alertbox posts (as I have been since 1998). Today I think he posted for the first time regarding Agile methodologies:</p>
<p><a href="http://www.useit.com/alertbox/agile-methods.html" target="_blank">Agile Development Projects and Usability</a> by Jakob Nielsen</p>
<p>If I didn&#8217;t know better, I&#8217;d say he has some disdain for Agile, but he makes some good points on how Agile can threaten a project&#8217;s user experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://heathermclean.net/2008/11/agile-development-projects-and-usability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
