<?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>Maccherone</title>
	<atom:link href="http://maccherone.com/larry/feed/" rel="self" type="application/rss+xml" />
	<link>http://maccherone.com/larry</link>
	<description>Visualization is like photography with data as the subject. Impact is the result of perspective, focus, and illumination.</description>
	<lastBuildDate>Fri, 03 Feb 2012 12:57:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>The CoffeeScript emperor has no clothes</title>
		<link>http://maccherone.com/larry/2012/02/02/the-coffeescript-emperor-has-no-clothes/</link>
		<comments>http://maccherone.com/larry/2012/02/02/the-coffeescript-emperor-has-no-clothes/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 11:32:05 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[CoffeeScript]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=292</guid>
		<description><![CDATA[Subtitle: when CoffeeScript rock stars run around naked in public Just because you can do something doesn&#8217;t mean you should. Leaving the parentheses out of your CoffeeScript might make your code look a bit more &#8220;natural&#8221;, but it almost always &#8230; <a href="http://maccherone.com/larry/2012/02/02/the-coffeescript-emperor-has-no-clothes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<!--S-ButtonZ 1.1.5 Start--><div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/02/02/the-coffeescript-emperor-has-no-clothes/";
		var dzone_title = "The CoffeeScript emperor has no clothes";
		var dzone_style = "1";
		var dzone_blurb = "Subtitle: when CoffeeScript rock stars run around naked in publicJust because you can do something doesn&#8217;t mean you should. Leaving the parentheses out of your CoffeeScript might make your code look a bit more &#8220;natural&#8221;, but it almost...";
		//-->
		</script>
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div><!--S-ButtonZ 1.1.5 End--><h3>Subtitle: when CoffeeScript rock stars run around naked in public</h3>

<p>Just because you can do something doesn&#8217;t mean you should. Leaving the parentheses out of your CoffeeScript might make your code look a bit more &#8220;natural&#8221;, but it almost always makes the code less readable and in a many cases, it makes it impossible for the CoffeeScript compiler to understand your intent. It&#8217;s more &#8220;natural&#8221; to go around naked but you shouldn&#8217;t. Just like you need to cover your private parts when you go outside, <strong>you should properly cloth your CoffeeScript function/method parameters in parentheses</strong>.</p>

<p>I know&#8230; you want to show that you are a CoffeeScript cool-kid. You can write a one-line list comprehension that is like a brilliant guitar solo. But I think it&#8217;s cooler for my code to be readable and for the compiler to precisely understand what I intend. The list comprehension guitar solo may be showing off but we expect our cool rock stars to show off. However, it&#8217;s uncool (even for rock stars) to be <a href="http://www.forkparty.com/1164/rock-stars">drug-addled running around naked in public</a>. Be the rock star without the drugs&#8230; or running around without your function/method calls properly clothed in parentheses.</p>

<p>In the last few months alone, on StackOverflow, there have a been at least six questions that I have flagged as caused by this issue:</p>

<ul>
<li><a href="http://stackoverflow.com/questions/9098412/coffeescript-calling-a-method-of-returned-object-chaining">Chaining</a></li>
<li><a href="http://stackoverflow.com/questions/7200464/method-call-syntax-in-coffeescript">Calling functions with no parameters</a></li>
<li><a href="http://stackoverflow.com/questions/7532616/multiline-function-calls-in-coffeescript">Lambdas with multiple functions</a></li>
<li><a href="http://stackoverflow.com/questions/4849818/how-do-i-make-a-get-request-using-coffeescript">Help showing code flow with jquery</a></li>
<li><a href="http://stackoverflow.com/questions/7636555/require-a-library-with-configuration-in-coffeescript">Calling a function which calls a function</a></li>
<li><a href="http://stackoverflow.com/questions/6586953/coffeescript-function-call-parameters-and-brackets">Confusing space</a></li>
</ul>

<p>In all of the cases above, there is an idiom that you can&#8217;t precisely/clearly express without parentheses around function/method parameters. Often, the coder realizes that it&#8217;s ambiguous but &#8220;hopes&#8221; that the compiler can figure out his intent. He posts a question on StackOverflow once he is able to show that it cannot. In all of these cases,  the coder has learned CoffeeScript by looking at a bunch of examples that leave out the parentheses and he doesn&#8217;t realize that you <strong>can</strong> put them in&#8230; or he wants to know how the cool-kids express it without them. In each case, the answer is invariably, &#8220;Simply add parentheses and it will work as expected.&#8221;</p>

<p>If this is confusing the compiler and the new users who want to be CoffeeScript cool-kids, we CoffeeScript bloggers should all make an effort to post <strong>all</strong> examples with the parentheses left in. I&#8217;m going so far as to leave them in all of my code and my collaborators seem to appreciate it. If nobody ever needs to read your code, then feel free to walk around naked in a drug-addled state within the privacy of your own home. But as soon as you step out the door, or want anyone else to read your code&#8230;</p>

<p>It&#8217;s perfectly fine to leave them out of if-statements, while-loop, etc. We like our female rock starts to show a little cleavage and some folks get turned on by Mick Jagger&#8217;s tight leather pants. However, leave the parentheses in for <strong>ALL</strong> function/method parameters (both calling-site and declaration). Here are some examples.</p>

<p>Chaining (needed for compiler to understand intent)</p>

<p><code>someObject.slideLeft(4).invert().slideUp(10)</code></p>

<p>Calling a parameter-less method (also necessary)</p>

<p><code>someIterator.next()</code></p>

<p>Function/method calling (even when not chaining, for human clarity)</p>

<p><code>someFunction(parameterA, parameterB)</code></p>

<p>&#8230;Even when the last parameter is a callback (Yeah, I know, the CoffeeScript cool-kids think this is ugly and a pain to line up the ending parentheses but it&#8217;s worth it for the clarity gain, IMHO. Suck it up rock star, even Bob Dillon had to adjust his lyrics so his listeners could understand him&#8230; well, maybe Bob Dylan could get away with confusing shit. But face it, <strong>you are NOT as cool as Bob Dylan</strong>&#8230; and coding requires a precision that isn&#8217;t needed in poetry/music. )</p>

<p><code>someMethodNeedingACallback(parameterA, (err, data) -&gt;
    console.log(data)
)</code></p>

<p>Functions with no parameters (could live without this, but IMHO, it&#8217;s more readable with it)</p>

<p><code>f = () -&gt;
    return "hello"  # notice how I also like to say "return". That's another clarity choice.</code></p>

<p>One last argument to try to convince you&#8230; Python is the most readable programming language out there. The Python BDFL has come out time and again in favor of readability even at the expense of conciseness. Python used to have a parentheses-less <code>print</code> statement, but Guido feels so strongly that this was a mistake, that he went through the very painful backward-breaking change to <a href="http://docs.python.org/release/3.0.1/whatsnew/3.0.html">require parentheses for print function calls in Python 3.0</a>. I would go so far as to argue that we should remove this &#8220;feature&#8221; from the CoffeeScript spec but even if we don&#8217;t, we should stop using it.</p>
<div style="clear:both;">&nbsp;</div>]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/02/02/the-coffeescript-emperor-has-no-clothes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Introducing coffeedoctest</title>
		<link>http://maccherone.com/larry/2012/01/15/introducing-coffeedoctest/</link>
		<comments>http://maccherone.com/larry/2012/01/15/introducing-coffeedoctest/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 17:25:06 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[Documentation]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=286</guid>
		<description><![CDATA[The examples you add to document your project are like a map to the buried treasure that is your library/API/tool/etc. But if the examples are wrong, it&#8217;s like labeling the map with &#8220;promised land&#8221; right over the spot where it &#8230; <a href="http://maccherone.com/larry/2012/01/15/introducing-coffeedoctest/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/01/15/introducing-coffeedoctest/";
		var dzone_title = "Introducing coffeedoctest";
		var dzone_style = "1";
		var dzone_blurb = "The examples you add to document your project are like a map to the buried treasure that is your library/API/tool/etc. But if the examples are wrong, it&#8217;s like labeling the map with &#8220;promised land&#8221; right over the spot where it should...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->
<p>The examples you add to document your project are like a map to the buried treasure that is your library/API/tool/etc. But if the examples are wrong, it&#8217;s like labeling the map with &#8220;promised land&#8221; right over the spot where it should say, &#8220;there be dragons&#8221;.</p>
<p>It&#8217;s less about testing your code with your documentation, than the other way around. Make sure that the examples in your documenation stay current with your code. <strong>coffeedoctest</strong> is a way to test your documentation with your code&#8230; to make sure that the map matches the terrain.</p>
<p>If you&#8217;ve spent any time working in Python, then you are probably familiar with <a href="http://docs.python.org/release/2.5.2/lib/module-doctest.html">doctest</a>. Coffeedoctest is built along the same lines.</p>
<p>For entire story visit the <a href="https://github.com/lmaccherone/coffeedoctest">coffeedoctest project page</a> on github.</p>
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/01/15/introducing-coffeedoctest/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REST for a read-only API. I finally understand the benefit of HATEOAS.</title>
		<link>http://maccherone.com/larry/2012/01/13/rest-for-a-read-only-api/</link>
		<comments>http://maccherone.com/larry/2012/01/13/rest-for-a-read-only-api/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 04:01:55 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Ongoing work]]></category>
		<category><![CDATA[Software craftsmanship]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[HATEOAS]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=264</guid>
		<description><![CDATA[I&#8217;m neck deep in RESTful APIs. I&#8217;m in the late stages of designing the Analytics 2.0 APIs in my job as Product Owner for Analytics at Rally Software. I&#8217;m in the early stages of designing an API for the Lean &#8230; <a href="http://maccherone.com/larry/2012/01/13/rest-for-a-read-only-api/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/01/13/rest-for-a-read-only-api/";
		var dzone_title = "REST for a read-only API. I finally understand the benefit of HATEOAS.";
		var dzone_style = "1";
		var dzone_blurb = "I&#8217;m neck deep in RESTful APIs. I&#8217;m in the late stages of designing the Analytics 2.0 APIs in my job as Product Owner for Analytics at Rally Software. I&#8217;m in the early stages of designing an API for the Lean Software and System&#8217;s...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->
<p>I&#8217;m neck deep in RESTful APIs. I&#8217;m in the late stages of designing the Analytics 2.0 APIs in my job as Product Owner for Analytics at <a href="http://www.rallydev.com/" target="_blank">Rally Software</a>. I&#8217;m in the early stages of designing an API for the <a href="http://www.prweb.com/releases/2011/5/prweb8381618.htm" target="_blank">Lean Software and System&#8217;s (LSSC) Kanban Benchmarking and Research Program</a>&#8230; and just today, I met with Steve Speicher and others from the <a href="http://open-services.net/bin/view/Main/WebHome" target="_blank">Open Services for Lifecycle Collaboration (OSLC)</a> to talk about joining one of the working committee designing RESTful services for data interchange.</p>
<p>I have been struggling with one aspect of &#8220;pure&#8221; REST APIs as defined by the four constraints in Roy Fielding&#8217;s dissertation. In particular, it seems that almost none of the popular &#8220;RESTful&#8221; APIs on the internet implement the Hypermedia as the Engine of Application State (HATEOAS) constraint. If the constraint is so critical, as <a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven" target="_blank">Dr Fielding insists</a>, then why is it so <a href="http://timelessrepo.com/haters-gonna-hateoas" target="_blank">often ignored</a>? The idea is that operations that you perform on a resource should be made visible to clients not via documentation but rather via links in the responses to a few published endpoints. A good citizen consumer of a truly RESTful API will not know the link to transfer bank funds, or approve a leave request, or (any action) on (any resource). Rather, it will &#8220;discover&#8221; the links for these actions in the initial response to a query against the bank account, or leave request, or (any resource).</p>
<p>My main problem with valuing this constraint as highly as Dr Fielding seems to is that it doesn&#8217;t seem to greatly reduce coupling as intended. The client still needs to KNOW that you want to transfer, approve, or (some action). Knowing the link to do so before hand seems like a fractional increase in coupling. That said, if it doesn&#8217;t cost too much, it would be nice to follow this recommendation because it would fractionally reduce coupling.</p>
<p>That brings me to my second conundrum. The Analytics 2.0 APIs are all read-only. What &#8220;application state&#8221; (as opposed to resource state) is there in such a situation? Then today, it finally came to me&#8230; the only application state (that I can think of) in a read-only API is around paging. The first page response to a multi-page request should include the link to the second page, and so on. This is particularly useful for Rally&#8217;s Analytics 2.o Lookback API because we were already recommending that the requests for the subsequent pages include an additional clause to ensure that the data returned for the subsequent pages is for the same moment in time as the first page. We had little confidence that this recommendation would be followed. Now, I&#8217;m specifying that we add a NextPage link to each response. We may also remove the &#8220;start&#8221; parameter from the API as it enables a tighter coupling than the use of the NextPage link.</p>
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/01/13/rest-for-a-read-only-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GitHub is a social media platform</title>
		<link>http://maccherone.com/larry/2012/01/09/github-is-a-social-media-platform/</link>
		<comments>http://maccherone.com/larry/2012/01/09/github-is-a-social-media-platform/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 04:51:15 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Software craftsmanship]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Social media]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=259</guid>
		<description><![CDATA[My first few days on GitHub reminded me of my first few days on Facebook&#8230; I&#8217;ve been using git (not well) for a while at Rally, but in the last several weeks I started using GitHub and I can&#8217;t say &#8230; <a href="http://maccherone.com/larry/2012/01/09/github-is-a-social-media-platform/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/01/09/github-is-a-social-media-platform/";
		var dzone_title = "GitHub is a social media platform";
		var dzone_style = "1";
		var dzone_blurb = "My first few days on GitHub reminded me of my first few days on Facebook&#8230;I&#8217;ve been using git (not well) for a while at Rally, but in the last several weeks I started using GitHub and I can&#8217;t say enough how pleasant the experience has...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End--><br />
<blockquote>My first few days on GitHub reminded me of my first few days on Facebook&#8230;</p></blockquote>
<p>I&#8217;ve been using git (not well) for a while at Rally, but in the last several weeks I started using GitHub and I can&#8217;t say enough how pleasant the experience has been.</p>
<p>I just wanted to tweak the CoffeeScript.mode of Panic!&#8217;s Coda editor which was provided not by Panic! but hosted on GitHub by some other code-head like me. I downloaded it, edited it to add the functionality that I wanted and was on my merry way to using it, when I thought, &#8220;maybe I should share my improvements back to the community that was was kind enough to provide me with the mode in the first place.&#8221;</p>
<p>So, I sent a message on GitHub and included my code changes in the message. The repository owner sent me back a message encouraging me and suggesting that I submit a &#8220;pull-request.&#8221; What the heck is a &#8220;pull-request&#8221;? I thought, so I started investigating. I learned that to do a pull request, I couldn&#8217;t just download the project&#8217;s contents; I had to actually fork it. I&#8217;d seen the &#8220;Fork me on GitHub&#8221; banners on every GitHub page but I never thought much about it before. Just a few clicks and I&#8217;m signed up with an account and few minutes later, I&#8217;ve forked the project, committed my edits, and submitted my pull-request.</p>
<p>The repository owner wanted me to upgrade my code to support more use cases so another round of edits ensued and then he accepted the request. Since then, I&#8217;ve created a couple of other repositories of my own and started managing my code on GitHub. I&#8217;ve downloaded the Mac GitHub client and I&#8217;m fully sold.</p>
<p>Then today, I was describing the entire experience to someone and it occurred to me that the appeal of GitHub is not technical; it&#8217;s social. It has the same sort of pull as social media. My first few days on GitHub reminded me of my first few days on Facebook&#8230; I had to create a Facebook account and started using it because someone tagged me in their 20 interesting things about me post. Facebook&#8217;s value is directly proportional to how many of my friends and family use it. Similarly, GitHub&#8217;s value to me is directly proportional to how many projects that I use are on it&#8230; and how much of the potential audience for Lumenize (my as yet unreleased PhD tools that I hope to commercialize&#8230; or at least popularize) are on there. I&#8217;m now trying to think of ways to redirect Lumenize to be more appealing to the GitHub audience. If folks can fork Lumenize and help it to grow, all the better.
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/01/09/github-is-a-social-media-platform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My first Panic! Coda plugin</title>
		<link>http://maccherone.com/larry/2012/01/09/my-first-panic-coda-plugin/</link>
		<comments>http://maccherone.com/larry/2012/01/09/my-first-panic-coda-plugin/#comments</comments>
		<pubDate>Tue, 10 Jan 2012 04:14:03 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Coda]]></category>
		<category><![CDATA[Node.js]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=252</guid>
		<description><![CDATA[I&#8217;ve been doing more coding in CoffeeScript and as any good craftsman knows, you must sharpen the saw from time to time. This time, I added some convenience commands for doing line manipulation by writing my very own Panic! Coda &#8230; <a href="http://maccherone.com/larry/2012/01/09/my-first-panic-coda-plugin/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/01/09/my-first-panic-coda-plugin/";
		var dzone_title = "My first Panic! Coda plugin";
		var dzone_style = "1";
		var dzone_blurb = "I&#8217;ve been doing more coding in CoffeeScript and as any good craftsman knows, you must sharpen the saw from time to time. This time, I added some convenience commands for doing line manipulation by writing my very own Panic! Coda plugin.It will allow...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->I&#8217;ve been doing more coding in CoffeeScript and as any good craftsman knows, you must sharpen the saw from time to time. This time, I added some convenience commands for doing line manipulation by writing my very own Panic! Coda plugin.It will allow you to delete, duplicate, and move lines with a keystroke. There is also a convenience shortcut for wrapping a variable in console.log.</p>
<p>It was actually pretty easy using <a href="http://www.panic.com/coda/developer/howto/plugins.php" target="_blank">Panic!&#8217;s Coda Plug-in Creator</a>. I wrote my text manipulation code in javascript as shell scripts that would run under node.js and simply dragged them into the Coda Plug-in Creator.</p>
<p>You can find it on GitHub <a href="https://github.com/lmaccherone/LineCommands.codaplugin" target="_blank">here</a>.
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/01/09/my-first-panic-coda-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coda vs WebStorm vs TextMate for CoffeeScript</title>
		<link>http://maccherone.com/larry/2012/01/02/coda-vs-webstorm-vs-textmate-for-coffeescript/</link>
		<comments>http://maccherone.com/larry/2012/01/02/coda-vs-webstorm-vs-textmate-for-coffeescript/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 23:36:55 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[Software craftsmanship]]></category>
		<category><![CDATA[Coda]]></category>
		<category><![CDATA[TextMate]]></category>
		<category><![CDATA[WebStorm]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=248</guid>
		<description><![CDATA[I recently started rewriting all of my PhD tools in CoffeeScript from ActionScript. I&#8217;m loving the python-like syntax and I&#8217;m very happy with the language as well as the ecosystem around CoffeeScript and node.js. Tools are an important part of &#8230; <a href="http://maccherone.com/larry/2012/01/02/coda-vs-webstorm-vs-textmate-for-coffeescript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2012/01/02/coda-vs-webstorm-vs-textmate-for-coffeescript/";
		var dzone_title = "Coda vs WebStorm vs TextMate for CoffeeScript";
		var dzone_style = "1";
		var dzone_blurb = "I recently started rewriting all of my PhD tools in CoffeeScript from ActionScript. I&#8217;m loving the python-like syntax and I&#8217;m very happy with the language as well as the ecosystem around CoffeeScript and node.js. Tools are an important part...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->I recently started rewriting all of my PhD tools in CoffeeScript from ActionScript. I&#8217;m loving the python-like syntax and I&#8217;m very happy with the language as well as the ecosystem around CoffeeScript and node.js. Tools are an important part of the experience so I&#8217;ve played around with several editors/IDE&#8217;s for writing CoffeeScript. Here is a quick comparison.</p>
<h2>Coda</h2>
<p>This is probably my favorite environment right now. I&#8217;m using a <a href="https://github.com/lmaccherone/CoffeeScript.mode">custom CoffeeScript.mode</a> that I forked from <a href="https://github.com/nfiniteset">Sean Durham</a> to add navigator support.</p>
<p>Pros:</p>
<ul>
<li>Nice clean interface written for the Mac</li>
<li>Syntax highlighting that works in both .coffee and CakeFile</li>
<li>Instant startup/shutdown and low resource usage. I can code on battery for 4+ hours on my MacBook Pro.</li>
<li>Preview mode for HTML.</li>
<li>Hackable. I already upgraded the 3rd party mode file. I have thoughts on plugins for running unit tests and reporting code coverage.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Only subversion integration. Personally, I never use the source code integration built into editors and IDE&#8217;s so this is not a problem for me. But EVERYONE uses git for CoffeeScript. I just started using GitHub for Mac. I&#8217;ll see how that goes but I can always use the command line.</li>
<li>No code folding. Again, not a feature that I miss too much because I can put each class into a different file. The navigator is also a decent substitute.</li>
</ul>
<h2>WebStorm</h2>
<p>Pros:</p>
<ul>
<li>Refactoring.</li>
<li>NodeUnit support built in. Nice!!!</li>
<li>Keystrokes that make sense to me. Ctrl-Y means yank this line. It&#8217;s the only one of the three that does that.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Still beta quality</li>
<ul>
<li>The syntax highlighter doesn&#8217;t like multi-line comments &#8220;###&#8221;&#8230;&#8221;###&#8221; to have any &#8220;#&#8221; inside. Until they <a href="http://youtrack.jetbrains.net/issue/RUBY-10124">fix this</a>, I&#8217;m not going to use it again.</li>
<li>My .idea folder got corrupted several times and each time it lost my configuration foo for running nodeunit tests.</li>
</ul>
<li>Heavyweight. It&#8217;s essentially the IntelliJ IDE with java editing (and a bunch of other functionality) removed.</li>
</ul>
<h2>TextMate</h2>
<p>I started writing CoffeeScript in TextMate and I still pull up .coffee files for a quick look in TextMate so this is my backup.</p>
<p>Pros:</p>
<ul>
<li>Syntax highlighting that works. I think TextMate&#8217;s is the basis for the Coda one that I use.</li>
<li>Folder as a project. I like this concept and you can sorta do this in Coda but it&#8217;s nice to open one project/folder with tabs for all of the files that are part of that project but still be able to open separate windows for other files that I randomly need to edit. If you right-click&#8230;open in Coda, it&#8217;ll create another tab in the &#8220;workspace&#8221; that you are working in even if the file has nothing to do with that project.</li>
</ul>
<p>Cons:</p>
<ul>
<li>None really other than it missing some of the Pros of Coda.</li>
</ul>
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2012/01/02/coda-vs-webstorm-vs-textmate-for-coffeescript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The defect 4-step</title>
		<link>http://maccherone.com/larry/2010/06/11/the-defect-4-step/</link>
		<comments>http://maccherone.com/larry/2010/06/11/the-defect-4-step/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 14:33:06 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Software craftsmanship]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=189</guid>
		<description><![CDATA[What to do when you find a defect The defect 4-step is not a new dance craze. It&#8217;s a way to accomplish organizational learning from the opportunity provided by a defect. So, here is what you should do when you &#8230; <a href="http://maccherone.com/larry/2010/06/11/the-defect-4-step/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2010/06/11/the-defect-4-step/";
		var dzone_title = "The defect 4-step";
		var dzone_style = "1";
		var dzone_blurb = "What to do when you find a defectThe defect  4-step is not a new dance craze. It&#8217;s a way to accomplish  organizational learning from the opportunity provided by a defect. So,  here is what you should do when you find a defect:	Fix it.	Find  and...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End--><br />
<h2>What to do when you find a defect</h2>
<p>The defect  4-step is not a new dance craze. It&#8217;s a way to accomplish  organizational learning from the opportunity provided by a defect. So,  here is what you should do when you find a defect:</p>
<ol>
<li><strong>Fix it.</strong></li>
<li><strong>Find  and fix others &#8220;like it&#8221;.</strong> &#8220;Like it&#8221; could be along several  dimensions and at multiple levels of abstraction (see below). Code query  can really help here but sometimes a manual analysis can be effective.</li>
<li><strong>Prevent  future occurrences &#8220;like it&#8221;&#8230;</strong>
<ul>
<li><strong>from leaving  the developers desk (preferable).</strong> This is often satisfied with  some from of  static analysis that runs during the build process or at  the developers  desk (think, upgrading the compiler). Frequently, the best you  can do is share  the bad news or conduct training so developers know  what patterns lead  to defects &#8220;like this&#8221;. Sometimes, you can change  your technology or the  programming paradigm to make the defect  impossible. Switching from C to  Java to avoid certain memory problems  for example.</li>
<li><strong>from getting into production (fallback).</strong> Tests  that run overnight or manual tests that become part of the test plan are  common approaches. Adding the meta-pattern(s) to a code review  checklist can also help especially if it increases awareness and prevents defects &#8220;like it&#8221; from ever being written. Long-running overnight static analysis is  sometimes in this category but it is preferable to run static analysis  in the build process or on the desktop.</li>
</ul>
</li>
</ol>
<h2>Why is this called a 4-step?</h2>
<p>When I originally created this post, I had the two prevention &#8220;steps&#8221; broken out. In reality, you generally only do one or the other &#8220;prevent&#8221; steps. So, I guess I could rename this the defect 3-step.</p>
<h2>What  does &#8220;like it&#8221; mean?</h2>
<p>The definition of &#8220;like it&#8221; for any given  defect might be along several different dimensions and at multiple  levels of abstraction. An example is the best way to illustrate this. We  recently had a &#8220;stop-the-release&#8221; P1 defect found on the Friday before a  Saturday release. An entire part of the application didn&#8217;t work in  certain web browsers. There was an extra trailing comma added to the  javascript that most browsers ignore but some complain about as a  parsing error. Normal testing includes those browsers but didn&#8217;t catch  it because testing was done on a version before the defect was injected.  The definition of &#8220;like it&#8221; in this circumstance is along two different  dimensions. One dimension of &#8220;like it&#8221; might try to address the need to  make sure testing occurs on the latest version. A second dimension of  &#8220;like it&#8221; might target the trailing comma pattern. The simple answer in  this case was to implement JSLint, a static analysis tool for  javascript. This is a great solution because it is at a higher level of  abstraction from merely fixing a trailing comma defect. JSLint can be  used to mitigate against ANY javascript parse error. It&#8217;s often more  work to address the higher level of abstraction but it&#8217;s also usually  more valuable. This trade-off decision should be made on a case-by-case  basis but higher levels of abstraction should generally be favored.  Testing is rarely able to climb the abstraction ladder so static  analysis is favored.
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2010/06/11/the-defect-4-step/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How can an Agile team influence the quality of upstream components</title>
		<link>http://maccherone.com/larry/2010/04/15/how-can-an-agile-team-influence-the-quality-of-upstream-components/</link>
		<comments>http://maccherone.com/larry/2010/04/15/how-can-an-agile-team-influence-the-quality-of-upstream-components/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 13:23:58 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Software craftsmanship]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Coaching]]></category>
		<category><![CDATA[Craftsmanship]]></category>
		<category><![CDATA[Q&A]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=191</guid>
		<description><![CDATA[Q: I would be interested in anything you might have about rolling out Agile on a team that depends on components created by non-Agile teams. In particular, how that is affected by different approaches to Quality between teams in the &#8230; <a href="http://maccherone.com/larry/2010/04/15/how-can-an-agile-team-influence-the-quality-of-upstream-components/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2010/04/15/how-can-an-agile-team-influence-the-quality-of-upstream-components/";
		var dzone_title = "How can an Agile team influence the quality of upstream components";
		var dzone_style = "1";
		var dzone_blurb = "Q: I would be interested in anything you might have about rolling out Agile on a team that depends on components created by non-Agile teams. In particular, how that is affected by different approaches to Quality between teams in the same company (and...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End--><strong>Q:</strong> I would be interested in anything you might have about rolling out Agile on a team that depends on components created by non-Agile teams. In particular, how that is affected by different approaches to Quality between teams in the same company (and no, we don’t have a common standard, only on paper). I was reading about the GM/Toyota experiment (first TPS plant in the US) and how GM had issues trying to roll it to other plants, one of the biggest one being the fact that unlike in Japan, they didn’t have the power to push their process down to their producers. They quickly found out that they could not build a Quality car without Quality components; and I am afraid we will find the same here.</p>
<p><strong>A: </strong>The reason quality is generally higher with the output of Agile processes is related to the nature of feedback loops built into Agile. We feedback on the product/design much more rapidly. Practices like pair programming or lightweight <strong>peer review</strong>, <strong>automated testing</strong>, <strong>short iterations</strong>, <strong>automated build</strong>/continuous integration, and <strong>close collaboration</strong> with the customer/proxy, all tend to give us more feedback on the product/design&#8230; which tends to lead to higher quality. My recommendation would be to try to drive as much of those feedback loops up stream as possible. You don&#8217;t control their process but you may be able to influence it at the boundary between them and you.<br />
<strong><br />
Close collaboration. </strong>The lowest hanging fruit is probably the close collaboration with the customer one. In this instance, the Agile team is the customer. The non-Agile teams are the vendors. I&#8217;m thinking of setting up regular demo/review meetings (probably on the cadence of the Agile team &#8211; <strong>short iterations</strong>). You may also be able to visit (virtually or physically) on a near daily basis.</p>
<p><strong>Automated testing. </strong>You might also try setting up automated testing at the interface level for the components delivered by the upstream teams. You&#8217;ll have to avoid the trap of using this as &#8220;contract negotiation over collaboration&#8221; but that is in how you handle it. The key here is that you want them to think of the tests as a tool to help them do their job as opposed to a way to enforce something. This means that they will need ability to run the tests before delivering to you. It would be better still if they owned the tests and you reviewed them. No matter who owns them, the tests become the specification for the API, which is a good Agile smell.</p>
<p><strong>Peer review. </strong>At this point, you are collaborating/reviewing the test code. This might then lead to a situation where you might be able to do peer review of their production code. I&#8217;d prefer a peer review approach that helped them improve their code (and learn how to write better code in the future) over one that just allowed you to fix their code after the fact.</p>
<p><strong>Automated build.</strong> If you were to give them access to your build process, they would also be able to test the compile-time agreement between their code and yours. This comes with two immediate benefits: (1) it serves as an additional automated test of of the interface, and (2) this (combined with the other automated tests) gives them more confidence to refactor their code and make improvements. The assumption here is that most teams know their code has warts but they are afraid to modify it to improve it because they are afraid of breaking code that depends upon it. Running your build script lowers the fear.</p>
<p>There is a third (and potentially more powerful) benefit to a shared build process. It provides you with a place to plug in other quality improving tests and analysis. The automated testing that I proposed above are tests that run against their upstream code. With an automated build, you could include tests that run against your downstream (but higher level) code. This means that they could see if changes that they make break your higher level functionality. You&#8217;d have to use a stable version of your source so they could be sure the problem was theirs but a distributed source control tool or careful branch management could overcome that obstacle. The build is also a common place to run automated bug finders like FindBugs or even custom analysis like a tool to highlight any changes in the calling signature.</p>
<p>Please let me know if any of this helped. Maybe I can refactor and improve my answer (upstream product) based upon your feedback (from downstream). <img src='http://maccherone.com/larry/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2010/04/15/how-can-an-agile-team-influence-the-quality-of-upstream-components/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Top 10 questions when using Agile on hardware projects</title>
		<link>http://maccherone.com/larry/2010/02/23/top-10-questions-when-using-agile-on-hardware-projects/</link>
		<comments>http://maccherone.com/larry/2010/02/23/top-10-questions-when-using-agile-on-hardware-projects/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 19:46:11 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Software craftsmanship]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Coaching]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=178</guid>
		<description><![CDATA[Recently, I have had the chance to work closely with a number of projects that were not pure software. They all had some software or firmware component but they also included an electronics or even mechanical design aspect. Below are &#8230; <a href="http://maccherone.com/larry/2010/02/23/top-10-questions-when-using-agile-on-hardware-projects/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2010/02/23/top-10-questions-when-using-agile-on-hardware-projects/";
		var dzone_title = "Top 10 questions when using Agile on hardware projects";
		var dzone_style = "1";
		var dzone_blurb = "Recently, I have had the chance to work closely with a number of projects that were not pure software. They all had some software or firmware component but they also included an electronics or even mechanical design aspect. Below are the top ten questions...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->Recently, I have had the chance to work closely with a number of projects that were not pure software. They all had some software or firmware component but they also included an electronics or even mechanical design aspect. Below are the top ten questions I recorded when working with these teams and the answers on how the teams effectively answered them.</p>
<p><strong>1.    Are Agile practices and processes effective when conducting non-software projects (firmware, electronic, mechanical, etc.)?</strong></p>
<p><strong>Absolutely</strong>. Some of the XP engineering practices are not directly applicable or need to be modified based upon industry or your particular situation. However, surprisingly minor adjustments are all that is necessary for the Scrum process framework to be highly effective… even compared to processes that evolved specifically for hardware.</p>
<p><strong>2.    What adjustments need to be made to make to the Scrum process framework work well for these projects?</strong></p>
<p><strong>Surprisingly few.</strong> The primary adjustments center around expectations in two general areas: (1) minimal marketable feature/emergent design/thin vertical slices, and (2) user stories.</p>
<p><strong>3.    What adjustments need to be made to our expectations around minimal marketable feature, emergent design, and thin vertical slices?</strong></p>
<p><strong>Focus on feedback. True, the break even point between thinking versus building encompasses more thinking for non-software projects. Even so, push to build something sooner and even when you are working on early design and infrastructure, get feedback on some “product” each iteration&#8230; and get that feedback from a source as close to the user as possible.</strong> In software, it’s almost always less expensive and more effective to build something rapidly, get feedback on it from an actual user, and change it, than it is to think longer about how to build it expecting to avoid later rework. This is the primary reason why Agile practices encourage you to break up the work into increments of minimal marketable features (MMF). Agile software projects try to build as little infrastructure as necessary to implement the current MMF and let the design emerge from those increments rather than nail down all the requirements and design up front. You are encouraged to build the system in thin vertical slices where all levels of the product experience changes with each increment.</p>
<p>When confronted with this idea, even software-only teams push back. Software teams want an architecturally sound base upon which to build their features. However, I have found that if the team thinks on it for a bit, they can often find a way to build usable features and start to get feedback much sooner than the team originally imagined. Those projects are able to deliver a marketable feature even in the first few iterations and they move rapidly to a mode where very little of each iteration is spent on infrastructure. The primary difference for hardware projects is that you have a different cost structure for manufacturing so the break even point for thinking versus building encompasses a bit more thinking. This means that it may take longer to get into the mode of designing several MMFs each iteration.</p>
<p>Remember, the primary benefit of this approach is to get the most valuable possible feedback as often as possible. So even when it is hard to use thin vertical slices to accomplish that, you should still seek out opportunities to enhance the richness and frequency of the feedback you receive by producing something to get feedback upon during EVERY iteration. The next step down from demonstrating an MMF is producing a prototype but even that can be hard to do every iteration of a hardware project. So when the thing you produce is only a document, a design, or an experiment, make an effort to maximize the value by choosing to get your feedback from a source as close to the customer as possible.<br />
<strong><br />
4.    What adjustments to our expectations need to be made around user stories?</strong></p>
<p><strong>Understand that the “user” in user stories only hints at one of four good reasons to manage requirements with user stories… and it’s not the most important reason, &#8220;conversations.&#8221; Maybe they should be called &#8220;conversational stories.&#8221; </strong>The big hang-up of hardware teams managing requirements with user stories focuses around the word “users”. That’s unfortunate because I don’t think that is the most important benefit that Agile teams (even software teams) get from the practices surrounding user stories.</p>
<p>The benefits come from four aspect: (1) WHO, (2) WHAT, (3) WHY, and (4) conversations. This last one, conversations, is the most valuable so I’ll talk about it first.</p>
<p>Even when drafts of requirements documents are shared with the development team for early feedback, the development team doesn’t internalize them until they start working with them. By having the team size, and often write user stories, you force them to start this internalization much sooner. The early conversation between the development team and stake holders around the requirements allows for implementation costs to be factored into requirements tradeoff decisions. The ongoing conversation throughout the project lifecycle, provides a high-fidelity communication channel and continuous vision alignment.</p>
<p>Now, let’s address the other three beneficial aspects one at a time. The traditional user story format is, “As a WHO, I want to WHAT, so that I can WHY.” All three of these, WHO, WHAT and WHY, provide benefits. The tension of trying to always make the WHO be an end user is not unique to hardware. Even in the most Agile of software-only teams, there are times when the end user is only indirectly the beneficiary of a particular backlog item. For instance, the most direct beneficiary of a research activity, a mockup, or a prototype (collectively referred to as a “spike” in the agile world) is the development team and not the end-user. In those cases, specifying the WHO does not encourage you to think about the product from the end user’s perspective. If every user story were this way, then we wouldn’t call them “user stories”. The “user” is in the phrase to remind us to get the user perspective involved as often and as soon as possible but just like MMFs, this practice is harder to do as often especially early in a hardware project.</p>
<p>I will not dwell on the WHAT because this element is present in all approaches to requirements management, except to mention that it is important for the what to not drift over into the HOW so the development team has flexibility in how they meet the identified need. Note: The Rally tool’s entity for “user stories” is really more of a generic backlog item. There is nothing in the tool that enforces or even makes awkward, the use of this entity in a traditional work breakdown mode.</p>
<p>On the other hand, the WHY is somewhat unique to the practice of user stories and can be very valuable. Understanding why someone wants something empowers the development team to be creative about satisfying a need… sometimes even by explicitly not satisfying the WHAT of the user story.  If a team is told that it must implement a data layer with sub-millisecond response, they may blindly go about accomplishing that… at great cost. My first response to a user story written like that is that it crossed the border from WHAT and into the realm of HOW. Nevertheless, even if you give a team a user story like that but you also tell them that the reason for this “requirement” is the responsiveness of the user interface, they may take steps to provide low latency to user input even when the data does not make it all the way to the data layer for a second or more… saving cost AND improving the product.</p>
<p><strong>5.    What about prioritizing user stories strictly by value to the end user?</strong></p>
<p><strong>Prioritize by overall business value, not end user value. </strong>Even in software-only projects, user stories should be prioritized by overall value to the business, not the end user. Often that is the same thing and certainly, the end user’s needs are the biggest factor in prioritizing any user story with an end-user as the WHO. However, a feature that is desirable to the end user but not saleable might not be valuable to your business. Similarly, valuable features that are too costly (either to produce or as tradeoff for against other desirable features) might not be good decisions.</p>
<p>Apple has been criticized for excluding multi-tasking from the iPhone. They realized that multi-tasking negatively impacted battery life and user interface responsiveness and explicitly left it out of product. They made a business decision that they could still sell the iPhone even without this high profile feature.</p>
<p>However, before they made this decision, they needed some information. How much did background tasks hurt battery life and responsiveness? How amenable will potential customers be to purchasing a product without it? Apple can easily justify investments in research to determine the extent of this impact on both the usability and marketability of the product. This information is of no direct benefit to the end-user but the work necessary to gather it, was of immense benefit to the business.</p>
<p>Development projects of all kinds benefit from good design and marketing decisions. Backlog items focused solely on these outcomes are of value to the business and should get appropriate prioritization. Similar to the above discussion on MMFs and the WHO in user stories, it just may be that non-software projects experience more of these tradeoff analysis backlog items early in the project and they keep seeing them longer into the development cycle.<br />
<strong><br />
6.    Should user stories be our only tool for requirements management?</strong></p>
<p><strong>Not usually for hardware/mixed projects.</strong> There are many reasons why you might want some other mechanism to compliment your user story practice. For instance, the concept of abuse cases is often part of a larger security review. Safety reviews often have a parallel mechanism. Protocols and other interfaces are best defined by other means. Hardware typically have requirements associated with the operating environment. Etc.<br />
<strong><br />
7.    But user stories are not even an official requirement of Scrum so why shouldn’t we just use our traditional requirements practices?</strong></p>
<p><strong>Consider alternatives but remember all four valuable aspects of user stories. </strong>It is true that the official definition of Scrum simply calls for there to exist a backlog of work. It only mentions user stories in a sidebar and even then, the sidebar also mentions other approaches like use cases. The essence of Agile is (1) self-organize, (2) do something, and (3) inspect and adapt. The definition of Scrum is just one step more detailed than this essential definition of Agile and is intentionally minimalistic so any iterative agile approach would fit.</p>
<p>User stories have emerged as a common and valuable practice because of the reasons mentioned above but it is not strictly required. Your team should feel empowered to consider alternatives.</p>
<p>However, if your team chooses another approach to doing requirements management, you should not deviate from the agile practice of allowing the development team to do the estimating. Also, I encourage you to think about the reasons the practices surrounding user stories are valuable (other than the emphasis on the user) as described above and enable as much of those reasons as possible, starting with the conversation aspect.</p>
<p><strong>8.    What about when we need to send a board (or prototype part) out for manufacturing and it will not be done within an iteration?</strong><br />
<strong><br />
Push for rapid prototyping but adapt to your capability. </strong>This is a very specific question that comes up often when folks are told that they need to produce something upon which to get feedback during each iteration. What if the time it takes to get prototype parts back from manufacturing is longer than an iteration?</p>
<p>My first response is to ask yourself, “Is there ANYTHING that we can do so that we CAN produce a prototype in a iteration?“ The world of prototyping has attempted to keep up with the ever-increasing pace of change. There now exist component suppliers that allow you to upload a part design in the morning so that they can produce and ship it overnight. Those services are expensive but so is the time of your team. Failing some solution like that, “Is there a different way to produce something to get the answers and feedback we need for  decisions within a single iteration?”</p>
<p>If you still cannot think of a way to produce it within one sprint, you can handle it by breaking the backlog item down. The first portion includes whatever work is necessary to place the order for the part. The later portion includes any evaluation activities. Collectively, they have value to the business.<br />
<strong><br />
9.    What about dependencies and critical path analysis?</strong></p>
<p><strong>Supplement when needed but ask if it is really needed. </strong>Dependencies are considered by the product owner and the development team when choosing stories for a particular iteration. However, the consideration of dependencies is informal and not explicit like in a Gantt chart format (think Microsoft Project). I have worked with teams where explicitly and continuously conducting this sort of critical path analysis is…. well…  critical to their success; but I have worked with many more teams where the use of a Gantt chart is merely the default and what they are used to. For those projects, the most important thing is for each team member to know what they should be working on right now and have a sense of urgency about getting it done-done! The mechanisms in the Scrum framework are highly effective at accomplishing this. If you do need to conduct critical path analysis at some point, I suggest that you do it only as needed.</p>
<p>Note: The Rally tool includes functionality for you to record dependencies so that they are readily available when you are making decisions about what to work on next.<br />
<strong><br />
10.    Maybe we don’t need continuous critical path analysis, but we still have specialists that are not permanently dedicated to the team. How do we deal with that?</strong></p>
<p><strong>Favor cross-training and using generalist team members but fall-back to explicit allocation and coordination when necessary. </strong>The Agile approach is to fully dedicate as many of these specialists to the team as possible. Even when you know it’s not a full-time job for a particular specialty, it still might be better to supplement those specialists’ workloads with team tasks that are outside of their specialty. We find that becoming Agile tends to encourage more generalists (or at least multi-specialists) to emerge. This cross-training is generally positive on its own merit but double so when you factor in the cost of task switching and the productivity befits you get once a team learns how best to work together (think Forming-Storming-Norming-Performing).</p>
<p>Even so, there may still be some centralized functions that your teams will need to consult. It is often possible to handle these situations by leveraging the team’s approach to dealing with outside suppliers.</p>
<p>When you move the solid line from a functional manager to a team lead and make the functional manager the dotted line, it will bring up many issues like personnel reviews and career counseling. The coaches at Rally have experience with companies making these transitions and can help you with those tough issues but you will have to work through them. “Agile is easy. Implementing Agile is a bit more difficult.”
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2010/02/23/top-10-questions-when-using-agile-on-hardware-projects/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A multiple file loader for Flex/Flash/ActionScript 3 (AS3)</title>
		<link>http://maccherone.com/larry/2009/05/31/a-multiple-file-loader-for-flexflashactionscript-3-as3/</link>
		<comments>http://maccherone.com/larry/2009/05/31/a-multiple-file-loader-for-flexflashactionscript-3-as3/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 01:28:16 +0000</pubDate>
		<dc:creator>Larry Maccherone</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Flex/Flash/ActionScript]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>

		<guid isPermaLink="false">http://maccherone.com/larry/?p=120</guid>
		<description><![CDATA[The URLMultiLoader class in this library will load multiple files and optionally &#8220;process&#8221; them before calling the method specified for Event.COMPLETE. Since file loading in the Flash/Flex/AS3 world is completely asynchronous, when you need to load more than one file, &#8230; <a href="http://maccherone.com/larry/2009/05/31/a-multiple-file-loader-for-flexflashactionscript-3-as3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><!--S-ButtonZ 1.1.5 Start-->
<div style="float: right; width: 42px; padding-right: 10px; margin: 0 0 0 10px;">
		<script type="text/javascript">
		<!--
		var dzone_url = "http://maccherone.com/larry/2009/05/31/a-multiple-file-loader-for-flexflashactionscript-3-as3/";
		var dzone_title = "A multiple file loader for Flex/Flash/ActionScript 3 (AS3)";
		var dzone_style = "1";
		var dzone_blurb = "The URLMultiLoader class in this library will load multiple files and optionally &#8220;process&#8221; them before calling the method specified for Event.COMPLETE. Since file loading in the Flash/Flex/AS3 world is completely asynchronous, when you need...";
		//-->
		</script><br />
		<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script></div>
<p><!--S-ButtonZ 1.1.5 End-->The URLMultiLoader class in this library will load multiple files and optionally &#8220;process&#8221; them before calling the method specified for Event.COMPLETE. Since file loading in the Flash/Flex/AS3 world is completely asynchronous, when you need to load more than one file, the hackish solution is to make the COMPLETE handler for the first one initiate the load for the second, etc. until all the files are loaded. URLMultiLoader will allow you to setup one COMPLETE handler which will not be called until all the files you specify are loaded (and optionally &#8220;processed&#8221;).</p>
<p>When I first had need for this, I said to myself that someone must have done this before. It seems like a fairly common need. <span style="text-decoration: line-through;">However, when I went looking, I couldn&#8217;t find something that fit the bill, so I decided to write my own. </span>It was actually a very good way to get familiar with the event system. Also, while I was at it, I figured I&#8217;d allow the injection of a processor for each file and make sure that got processed before proceeding. <span style="text-decoration: line-through;">If anyone knows of another tool like this please post a link to it in the comments. Actually, it wouldn&#8217;t surprise me if this functionality is built into the Flex framework somewhere and I just missed it.</span></p>
<p>Update: The functionality mustn&#8217;t be in Flex because I have now found several other similar controls:</p>
<ul>
<li><a href="http://www.stimuli.com.br/trane/2007/nov/25/loading-reloaded/">BulkLoader</a></li>
<li><a href="http://code.google.com/p/queueloader-as3/">QueueLoader</a></li>
<li><a href="http://code.google.com/p/ultimateloader/">UltimateLoader</a></li>
</ul>
<p>Mine is relatively simple compared to some of these. BulkLoader seems particularly featureful. It has bandwidth stats and progress indicators. For my loading needs, the sizes were small enough that I wasn&#8217;t worried about progress or bandwidth, but I may update mine to include these features in the future.</p>
<p>One feature that mine has that many do not have is the optional ability to inject in a an IDataProcessor that will pre-process your data before returning it to you.</p>
<p>DataProcessorXMLStringToArray is provided as an example IDataProcessor that can optionally be passed in when adding a new URLRequest to the queue. If provided, an IDataProcessor will convert the raw file string (or binary, or url variables) into some other form before returning. Complete documentation for DataProcessorXMLStringToArray is provided in the ASDoc header for the class but it is offered here primarily as an example. You can easily create your own and inject them when setting up the URLMultiLoader. You just need to follow the IDataProcessor interface which has one method with the following signature:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">function processData(data:*):*</pre></div></div>

<p>Remember, the processor is totally optional. If omitted, URLMultiLoader will simply copy the file contents into it&#8217;s output data field. The type of the data in that case will depend upon the URLLoaderDataFormat: String for TEXT (default), ByteArray for BINARY, and URLVariables for VARIABLES.</p>
<p>Let&#8217;s see it in action.</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">package
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">maccherone</span>.<span style="color: #006600;">urlmultiloader</span>.<span style="color: #66cc66;">*</span>;
	<span style="color: #0066CC;">import</span> com.<span style="color: #006600;">maccherone</span>.<span style="color: #006600;">json</span>.<span style="color: #006600;">JSON</span>;  <span style="color: #808080; font-style: italic;">// Only used for pretty output</span>
&nbsp;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Bitmap</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Loader</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Sprite</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">Event</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">events</span>.<span style="color: #006600;">IOErrorEvent</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">net</span>.<span style="color: #006600;">URLLoaderDataFormat</span>;
	<span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">net</span>.<span style="color: #006600;">URLRequest</span>;
&nbsp;
	<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> URLMultiLoaderTest <span style="color: #0066CC;">extends</span> Sprite
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> urlMultiLoader:URLMultiLoader = <span style="color: #000000; font-weight: bold;">new</span> URLMultiLoader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> baseURL:<span style="color: #0066CC;">String</span> = <span style="color: #ff0000;">&quot;data/&quot;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> urlRequest1:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span>baseURL + <span style="color: #ff0000;">&quot;file.xml&quot;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> urlRequest2:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span>baseURL + <span style="color: #ff0000;">&quot;file.xml&quot;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">// Same file but we'll get it in a different format</span>
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> urlRequest3:URLRequest = <span style="color: #000000; font-weight: bold;">new</span> URLRequest<span style="color: #66cc66;">&#40;</span>baseURL + <span style="color: #ff0000;">&quot;smile.gif&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
		<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> URLMultiLoaderTest<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> urlMultiLoader:URLMultiLoader = <span style="color: #000000; font-weight: bold;">new</span> URLMultiLoader
&nbsp;
			<span style="color: #000000; font-weight: bold;">var</span> dataProcessor:IDataProcessor = <span style="color: #000000; font-weight: bold;">new</span> DataProcessorXMLStringToArray<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">// Example provided with URLMultiLoader. You can create your own.</span>
&nbsp;
			urlMultiLoader.<span style="color: #006600;">addURLRequest</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Request1&quot;</span>, urlRequest1, dataProcessor<span style="color: #66cc66;">&#41;</span>
			urlMultiLoader.<span style="color: #006600;">addURLRequest</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Request2&quot;</span>, urlRequest2<span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">// If no IDataProcessor is provided, then file's contents is returned as String, ByteArray, or</span>
			                                           <span style="color: #808080; font-style: italic;">// URLVariables depending upon the URLLoaderDataFormat TEXT, BINARY, or VARIABLES respectively</span>
			urlMultiLoader.<span style="color: #006600;">addURLRequest</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Request3&quot;</span>, urlRequest3, <span style="color: #000000; font-weight: bold;">null</span>, URLLoaderDataFormat.<span style="color: #006600;">BINARY</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">// Loads smile.gif as a ByteArray</span>
&nbsp;
			urlMultiLoader.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>Event.<span style="color: #006600;">COMPLETE</span>, filesLoaded<span style="color: #66cc66;">&#41;</span>
			urlMultiLoader.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>IOErrorEvent.<span style="color: #006600;">IO_ERROR</span>, onError<span style="color: #66cc66;">&#41;</span>
			urlMultiLoader.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> filesLoaded<span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">data</span>:<span style="color: #0066CC;">Object</span> = <span style="color: #66cc66;">&#40;</span>event.<span style="color: #0066CC;">target</span> as URLMultiLoader<span style="color: #66cc66;">&#41;</span>.<span style="color: #0066CC;">data</span>
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Array of Objects:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + JSON.<span style="color: #006600;">encode</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Request1&quot;</span><span style="color: #66cc66;">&#93;</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">// Uses JSON.encode for pretty output</span>
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;String of file contents:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> + <span style="color: #0066CC;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Request2&quot;</span><span style="color: #66cc66;">&#93;</span> + <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">var</span> loader:Loader = <span style="color: #000000; font-weight: bold;">new</span> Loader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			loader.<span style="color: #006600;">loadBytes</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">data</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Request3&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #0066CC;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #66cc66;">&#40;</span>loader<span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">// Displays smile.gif in Flash player</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> onError<span style="color: #66cc66;">&#40;</span>event:Event<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>event<span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Assuming you put the file.xml and the smile.gif , in a data/ folder below the bin-debug directory and you have the correct security settings, the above code would result in the following output:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Array of Objects:
[
    {&quot;id&quot;: 101, &quot;name&quot;: &quot;/db/node/visitor&quot;},
    {&quot;id&quot;: 102, &quot;name&quot;: &quot;/db/node/observer&quot;},
    {&quot;id&quot;: 103, &quot;name&quot;: &quot;/ui/button&quot;}
]
&nbsp;
String of file contents:
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;root&gt;
  &lt;file&gt;
    &lt;id&gt;101&lt;/id&gt;
    &lt;name&gt;/db/node/visitor&lt;/name&gt;
  &lt;/file&gt;
  &lt;file&gt;
    &lt;id&gt;102&lt;/id&gt;
    &lt;name&gt;/db/node/observer&lt;/name&gt;
  &lt;/file&gt;
  &lt;file&gt;
    &lt;id&gt;103&lt;/id&gt;
    &lt;name&gt;/ui/button&lt;/name&gt;
  &lt;/file&gt;
&lt;/root&gt;</pre></div></div>

<p>Plus it will display smile.gif in the Flash player like this:</p>
<p><img class="alignnone size-full wp-image-127" title="smile_in_flash_player" src="http://maccherone.com/larry/wp-content/uploads/2009/05/smile_in_flash_player.png" alt="smile_in_flash_player" width="290" height="251" /></p>
<p>You can download it from <a href="http://maccherone.com/larry/projects/a-multiple-file-loader-for-flashflex-in-actionscript-3-as3/">here</a>.</p>
<p>Update: I altered the URLMultiLoader to use a string as the key to retrieving the data after the loading is complete. A previous version used the URLRequest as the key for Dictionary object. This version does not depend upon Dictionary.
<div style="clear:both;">&nbsp;</div>
]]></content:encoded>
			<wfw:commentRss>http://maccherone.com/larry/2009/05/31/a-multiple-file-loader-for-flexflashactionscript-3-as3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

