<?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>Rough Sea Games &#187; Methodology</title>
	<atom:link href="http://blog.rough-sea.com/category/methodology/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rough-sea.com</link>
	<description>Indie game development</description>
	<lastBuildDate>Sun, 29 Jan 2012 12:19:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
<image>
			<title>Rough Sea Games</title>
			<url>/wp-content/uploads/2008/10/rsg_rss-feed.jpg</url>
			<link>http://blog.rough-sea.com</link>
			<width>144</width>
			<height>95</height>
			<description>Indie game development</description>
		</image>		<item>
		<title>Some facts about Usability – and why you should care about it</title>
		<link>http://blog.rough-sea.com/2010/08/some-facts-about-usability-%e2%80%93-and-why-you-should-care-about-it/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=some-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it</link>
		<comments>http://blog.rough-sea.com/2010/08/some-facts-about-usability-%e2%80%93-and-why-you-should-care-about-it/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 11:22:28 +0000</pubDate>
		<dc:creator>Kathrin</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=1366</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F08%2Fsome-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F08%2Fsome-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>The research field of human-computer interaction, which also includes explorations of the interaction with digital games, has put forth two main concepts which contribute to a user-centered design: Usability and User Experience. First of all, I would like to introduce you to the essential ideas that are &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2010/08/some-facts-about-usability-%e2%80%93-and-why-you-should-care-about-it/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F08%2Fsome-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F08%2Fsome-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>The research field of human-computer interaction, which also includes explorations of the interaction with digital games, has put forth two main concepts which contribute to a user-centered design: Usability and User Experience. First of all, I would like to introduce you to the essential ideas that are concealed behind the term “Usability”:</p>
<p><a href="http://blog.rough-sea.com/wp-content/uploads/2010/07/comic-ease-of-use.png"><img class="alignleft size-full wp-image-1371" title="comic ease of use" src="http://blog.rough-sea.com/wp-content/uploads/2010/07/comic-ease-of-use.png" alt="" width="481" height="192" /></a></p>
<p><strong>Usability</strong> deals with the question whether a software can be intuitively and effectively used to accomplish the tasks it is designed for.</p>
<p>Usability is mainly a psychological issue. When evaluating the ease of use of an application this automatically means taking into account the user’s cognitive requirements, too: limits in human memory, perception and attention, the user’s expectation and his abilities all contribute to the way he interacts with the software. Too many information on a screen, for example, might overwhelm the user’s brain abilities as he is only capable of comprehending 7 +/- 2 pieces of information simultaneously.  Of course, this does not mean we can conclude that we can realize an optimum in accessibility for the user by simply always implying round about 7 items on each page. Human psychology is much more complex and so is the subject of Usability, thus it won’t really fit into this tiny blog post.</p>
<p>Still, you don’t have to be a psychologist to be able to explore the usability of your application. Fortunately, there are alreasy someone guidelines developed by experts that can support you. We can get started on this taking a look at the Usabilty principles defined by ISO 9241-10. They are less abstract than psychological constructs and therefore quite easy to understand:</p>
<ul>
<li>suitability for the task</li>
</ul>
<p>(Can the application be used to carry out the tasks efficiently? Are all required functions needed to carry out the task implemented?)</p>
<ul>
<li>suitability for learning</li>
</ul>
<p>(Does the application offer the user a step by step acquisition of these functions? Can the user deal with the complexity of the application?</p>
<ul>
<li>suitability for individualization</li>
</ul>
<p>(Can the application be adjusted to different user needs?)</p>
<ul>
<li>conformity with user expectations</li>
</ul>
<p>(Is the usage of the application comparable to similar applications?)</p>
<ul>
<li>self descriptiveness</li>
</ul>
<p>(Can the user comprehend the application intuitively? Are there help functions implemented?)</p>
<ul>
<li>controllability</li>
</ul>
<p>(Can the application be adjusted to the work flow, different task assignments and time periods?)</p>
<ul>
<li>error tolerance</li>
</ul>
<p>(Does the application offer a smooth error-handling?)</p>
<p>So start your usability evaluation of your application with checking the points mentioned above and you will have quite a good basis for further investigations in this research field.</p>
<p>More secrets about Usability, User Experience and how to measure them concerning your game will be revealed in my next blog post!</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=1366&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F08%2Fsome-facts-about-usability-%25e2%2580%2593-and-why-you-should-care-about-it%2F&amp;title=Some%20facts%20about%20Usability%20%E2%80%93%20and%20why%20you%20should%20care%20about%20it" id="wpa2a_2">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2010/08/some-facts-about-usability-%e2%80%93-and-why-you-should-care-about-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our way of game testing</title>
		<link>http://blog.rough-sea.com/2010/07/our-way-of-game-testing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=our-way-of-game-testing</link>
		<comments>http://blog.rough-sea.com/2010/07/our-way-of-game-testing/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 12:04:44 +0000</pubDate>
		<dc:creator>Team Felix/Markus</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Quality Assurance]]></category>
		<category><![CDATA[Game Testing]]></category>
		<category><![CDATA[QA]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=1252</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F07%2Four-way-of-game-testing%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F07%2Four-way-of-game-testing%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p></p> <p style="text-align: left;" lang="en-US">Hi guys,</p> <p style="text-align: left;" lang="en-US"> <p style="text-align: justify;" lang="en-US">today we want to introduce you to what it means to be a game-tester. Being a tester doesn&#8217;t mean playing games all the time, but rather exploring every possible constellation in which a bug &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2010/07/our-way-of-game-testing/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F07%2Four-way-of-game-testing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F07%2Four-way-of-game-testing%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } --></p>
<p style="text-align: left;" lang="en-US">Hi guys,</p>
<p style="text-align: left;" lang="en-US">
<p style="text-align: justify;" lang="en-US">today we want to introduce you to what it means to be a game-tester. Being a tester doesn&#8217;t mean playing games all the time, but rather exploring every possible constellation in which a bug could appear.</p>
<p style="text-align: left;" lang="en-US">
<p style="text-align: justify;" lang="en-US">Maybe you have been asking yourself already: “How is it possible that some games are full of bugs?” We have the answer! Some testers just don’t apply the right methods for their bug tracking.</p>
<p style="text-align: left;" lang="en-US">
<p style="text-align: justify;" lang="en-US">This is why we would like to introduce you our favorite ways of testing now.</p>
<p style="text-align: left;" lang="en-US">
<p style="text-align: justify;" lang="en-US">The first way is the &#8220;Switch off your brain&#8221;-method.</p>
<p style="text-align: justify;" lang="en-US"><span style="font-size: medium;"><strong> </strong></span><a href="http://blog.rough-sea.com/wp-content/uploads/2010/06/1.png"><img class="alignleft size-thumbnail wp-image-1260" title="1" src="http://blog.rough-sea.com/wp-content/uploads/2010/06/1-150x150.png" alt="" width="40" height="40" /></a>You just follow the instructions of the test-cases and note your results. If the test-plan is well-organized, this is an effective, but less creative method. And as no test-plan can cover all bugs, you need an additional, less structured method of tracking bugs!</p>
<p style="text-align: justify;" lang="en-US">
<p style="text-align: justify;">Therefore, here comes our second option, which is: “Simply playing the game.”</p>
<p style="text-align: justify;" lang="en-US"><a href="http://blog.rough-sea.com/wp-content/uploads/2010/06/2.png"><img class="alignleft size-thumbnail wp-image-1262" title="2" src="http://blog.rough-sea.com/wp-content/uploads/2010/06/2-150x150.png" alt="" width="40" height="40" /></a>You play the game without any evil bug tracking intentions –  as if you bought it for your personal pleasure. The benefit of this way of testing is, that you have more freedom while playing the game. On the other hand, bug tracking is quite random in this case, which is a disadvantage and makes a further option necessary.</p>
<p style="text-align: left;" lang="en-US">
<p style="text-align: justify;">So, in total, our advice is our third approach to bug tracking. It&#8217;s the combination of testing method number one and two and corresponds to the following rule: &#8220;As structured as necessary, but at the same time as creative as possible&#8221;.</p>
<p style="text-align: justify;" lang="en-US"><a href="http://blog.rough-sea.com/wp-content/uploads/2010/06/3.png"><img class="alignleft size-thumbnail wp-image-1263" title="3" src="http://blog.rough-sea.com/wp-content/uploads/2010/06/3-150x150.png" alt="" width="40" height="40" /></a>You have to test every state in every possible order. For example: The test-plan requests you to change the display resolution. In practice, there are two ways of doing so: You can either change the display resolution by using the main menu; but it is also possible in the course of the game. This means you have to think yourself. We have to admit, this example is not the best one, but the more complex a game is, more states in which bugs can occur will be given.</p>
<p style="text-align: justify;" lang="en-US">
<p style="text-align: justify;" lang="en-US">Next time we will reveal our secrets of how to raise the effectivity of your testing skills.</p>
<p style="text-align: justify;" lang="en-US">
<p style="text-align: justify;" lang="en-US">Thx 4 reading our first blog entry.</p>
<p style="text-align: justify;" lang="en-US">
<p style="text-align: justify;" lang="en-US">
<p style="text-align: justify;" lang="en-US"><span style="font-size: medium;"><strong>To be continued…</strong></span></p>
<p style="text-align: left;">
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=1252&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F07%2Four-way-of-game-testing%2F&amp;title=Our%20way%20of%20game%20testing" id="wpa2a_4">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2010/07/our-way-of-game-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Numeric Enumerations (Enums) for AS3</title>
		<link>http://blog.rough-sea.com/2010/04/numeric-enumerations-enums-for-as3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=numeric-enumerations-enums-for-as3</link>
		<comments>http://blog.rough-sea.com/2010/04/numeric-enumerations-enums-for-as3/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 09:11:51 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[wiener würschtel]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=1149</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F04%2Fnumeric-enumerations-enums-for-as3%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F04%2Fnumeric-enumerations-enums-for-as3%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Something I really missed in Actionscript 3 were <a title="Wiki - Enumeration" href="http://en.wikipedia.org/wiki/Enumeration" target="_blank">enums</a>. If you need ascending unique numeric ids ( e.g. for naming array indexes ), enums are your friend.</p> <p>For our current project we programmed a messaging system. The system uses unique numeric ids &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2010/04/numeric-enumerations-enums-for-as3/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F04%2Fnumeric-enumerations-enums-for-as3%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F04%2Fnumeric-enumerations-enums-for-as3%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Something I really missed in Actionscript 3 were <a title="Wiki - Enumeration" href="http://en.wikipedia.org/wiki/Enumeration" target="_blank">enums</a>. If you need ascending unique numeric ids ( e.g. for naming array indexes ), enums are your friend.</p>
<p>For our current project we programmed a messaging system. The system uses unique numeric ids for message types and message channels. The list of messages and channels grew over time and right now each list contains more than a hundred entries. In the beginning we did the numbering ourselves like that:</p>
<p><code> </code></p>
<p><pre><code>
&lt;pre&gt;&lt;span style=&quot;color: #f07700;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_OPEN_WINDOW:int = 0;
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_CLOSE_WINDOW:int = 1;
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_REGISTER_TIMER:int = 2;
&nbsp;&nbsp;&nbsp;&nbsp;// .. and so on
&lt;/span&gt;&lt;/pre&gt;
</code></pre></p>
<p>For code beauty we were always trying to group related message ids, which often meant to re-index dozens of entries if we inserted an id somewhere in between. This was a pain!</p>
<p>The net already has assembled quiet some wisdom about &#8220;fake enums ins as3&#8243;<a title="Footnote 1" name="1" href="#Footnote_1">¹</a>, which do fit different needs (like some have type safety) but unfortunately not ours. Most of them are String based, which is what we did not want. So after putting in some thought we came up with a solution that worked for us. Now we can define our enums like this:</p>
<p><code> </code></p>
<p><pre><code>
&lt;pre&gt;&lt;span style=&quot;color: #f07700;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_OPEN_WINDOW:int = cEnum.Enum(0);
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_CLOSE_WINDOW:int = cEnum.inc;
&nbsp;&nbsp;&nbsp;&nbsp;public static const MSG_REGISTER_TIMER:int = cEnum.inc;
&nbsp;&nbsp;&nbsp;&nbsp;// .. and so on
&lt;/span&gt;&lt;/pre&gt;
</code></pre></p>
<p>Now, by using static methods and a static counter we can create an arbitrary amount of coherent numeric values, which comes in very handy from time to time! Re-indexing is in the past now!</p>
<p>We want to share our little enum class with the web, so here it comes:</p>
<p><code> </code></p>
<p><pre><code>
&lt;pre&gt;&lt;span style=&quot;color: #f07700;&quot;&gt;
&lt;strong&gt;public class&lt;/strong&gt; cEnum
{
&nbsp;&nbsp;&lt;strong&gt;private static var&lt;/strong&gt; m_currentIncrement:int = 0;
&lt;span style=&quot;color: #009900;&quot;&gt;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * Adds an enum value to the collection
&nbsp;&nbsp; */
&lt;/span&gt;
&nbsp;&nbsp;&lt;strong&gt;public static function &lt;/strong&gt;Enum(_v:int) : int
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;m_currentIncrement = _v;
&nbsp;&nbsp;&nbsp;&nbsp;return m_currentIncrement;
&nbsp;&nbsp;}
&lt;span style=&quot;color: #009900;&quot;&gt;
&nbsp;&nbsp;/**
&nbsp;&nbsp; * returns the next increment
&nbsp;&nbsp; */
&lt;/span&gt;
&nbsp;&nbsp;&lt;strong&gt;public static function get &lt;/strong&gt;inc():int
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return ++m_currentIncrement;
&nbsp;&nbsp;}
}
&lt;/span&gt;&lt;/pre&gt;
</code></pre></p>
<p>Bottom line, if you need a neat way to maintain a list of static coherent numeric entries while type safety is not a big issue &#8230; this is an fairly easy way to do it. May this help you out there as much as it helped us.</p>
<p>Have fun and happy coding<br />
Manuel</p>
<p><a title="Back" name="Footnote_1" href="#1">¹</a> Further readings on AS3 enums can be found here: e.g. <a href="http://www.herrodius.com/blog/87">http://www.herrodius.com/blog/87</a>,<br />
<a href="http://scottbilas.com/blog/faking-enums-in-as3/">http://scottbilas.com/blog/faking-enums-in-as3/</a><br />
or  <a href="http://blog.petermolgaard.com/2008/11/02/actionscript-3-enums/">http://blog.petermolgaard.com/2008/11/02/actionscript-3-enums/</a></p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=1149&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2010%2F04%2Fnumeric-enumerations-enums-for-as3%2F&amp;title=Numeric%20Enumerations%20%28Enums%29%20for%20AS3" id="wpa2a_6">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2010/04/numeric-enumerations-enums-for-as3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Effortless Text Localization</title>
		<link>http://blog.rough-sea.com/2009/09/effortless-text-localization/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=effortless-text-localization</link>
		<comments>http://blog.rough-sea.com/2009/09/effortless-text-localization/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 14:32:24 +0000</pubDate>
		<dc:creator>Thomas</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Server Administration]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[automatization]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[content]]></category>
		<category><![CDATA[continous integration]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[R&D]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=1105</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F09%2Feffortless-text-localization%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F09%2Feffortless-text-localization%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Automatization of repeated work is one of the keys to productive development. Another is abstraction of common problems to allow concentration on project specific work. Localization is one of the problems you have in nearly every project, especially in iPhone projects. The iPhone SDK brings interesting solutions &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/09/effortless-text-localization/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F09%2Feffortless-text-localization%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F09%2Feffortless-text-localization%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Automatization of repeated work is one of the keys to productive development. Another is abstraction of common problems to allow concentration on project specific work. Localization is one of the problems you have in nearly every project, especially in iPhone projects. The iPhone SDK brings interesting solutions that abstract many parts of the localization process.</p>
<p>The tool <strong>ibtool</strong>, for example, extracts strings from an interface automatically. The strings are placed in a .strings file, a textfile with key/value pairs. To localize an interface, you have to translate .strings and merge the strings back into the interface again. Because you have individual interfaces for every localization, it&#8217;s possible to adjust widgets individually for each one.</p>
<p><strong>genstrings</strong> is another tool inside the iPhone SDK. It extracts textIDs from the source code and write them into a .strings file. You may ask how  the tool knows which texts need localization and which do not. The solution is the macro NSLocalizedString, which will be replaced by a .strings file lookup method by the preprocessor, but also searched for by the genstrings tool to create the files.</p>
<p>Both tools help you to create a localized application without paying much attention to localization itself. But you cannot expect the localization department to search for .strings files inside your project and create localized versions of them. Of course this would be possible, but not very convenient, because you have to migrate the translated texts back into the interfaces using ibtool. Another reason for us at Rough Sea is that we use a localization interface from our publisher. This interface is well known to the localization department and the content is placed in a centralized database on a server.</p>
<p>So we have the great tools from Apple that help us to separate texts from the project and we have the great tool from our publisher that handles the whole translation and reviewing process. Now we need something to tie those tools together, because we do not want to insert new texts from the .strings file into the publisher&#8217;s localization tool manually or vice versa. This glue tool has to execute the Apple tools, extract the texts from the .strings files and insert them into the publisher&#8217;s loca tool. On the other hand, it has to check for new localized texts from the publisher&#8217;s loca tool, build the required .strings files from the results and merge them back into the interfaces. Sounds quite easy, but of course there are some obstacles to get there. You have to handle other things, like the deletion of a text entry or changes to an already translated interface. So you have to know what has changed since the last update and stuff like that.</p>
<p>It turns out that you only have to integrate this glue tool into the build process of your build server. The tool will update the localization database whenever the code or the interface changes and it will update the localized versions when the database changes. As a coder you only need to remember to use the text macro around your text id. You don&#8217;t have to add this text id in a file or anything else. As you commit your changes, the build server will do this for you. As an interface designer it&#8217;s the same: just create your interfaces in the primary language and commit it. After the localization department finishes localizing those texts, they will be inserted into the localized versions automatically. Of course you have to make adjustments to the interface if there are loca bugs like labels that are to small to hold the translated text.</p>
<p>As you can see those localization tools are a big black box for coders, interface designers and translators. The coders only have to write code, the interface designers design interfaces and the translators translate texts. At the end there will be a localized product.</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=1105&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F09%2Feffortless-text-localization%2F&amp;title=Effortless%20Text%20Localization" id="wpa2a_8">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/09/effortless-text-localization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common project management mistakes: Estimating tasks (part 2)</title>
		<link>http://blog.rough-sea.com/2009/06/common-project-management-mistakes-estimating-tasks-part-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=common-project-management-mistakes-estimating-tasks-part-2</link>
		<comments>http://blog.rough-sea.com/2009/06/common-project-management-mistakes-estimating-tasks-part-2/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 14:19:46 +0000</pubDate>
		<dc:creator>Joe Cool</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[crunch]]></category>
		<category><![CDATA[estimation]]></category>
		<category><![CDATA[mistakes]]></category>
		<category><![CDATA[project management]]></category>
		<category><![CDATA[tasks]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=443</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F06%2Fcommon-project-management-mistakes-estimating-tasks-part-2%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F06%2Fcommon-project-management-mistakes-estimating-tasks-part-2%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Hi there,</p> <p>we were quite busy over the last weeks,  so updates of our blog are currently reduced. We are only going to post once a week in the upcoming month, but this should improve the quality.</p> <p>Today I will continue my project management series.  In my &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/06/common-project-management-mistakes-estimating-tasks-part-2/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F06%2Fcommon-project-management-mistakes-estimating-tasks-part-2%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F06%2Fcommon-project-management-mistakes-estimating-tasks-part-2%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hi there,</p>
<p>we were quite busy over the last weeks,  so updates of our blog are currently reduced. We are only going to post once a week in the upcoming month, but this should improve the quality.</p>
<p>Today I will continue my project management series.  In my first post I described the common mistakes which are often happening when estimating tasks:</p>
<p>- Mistake 1: Estimation is not done by the task owner<br />
- Mistake 2: The task has no proper description<br />
- Mistake 3:  Estimation is done by averaging worst case with best case scenarios<br />
- Mistake 4:  The tasks are too big<br />
- Mistake 5: The tasks have unclear dependencies<br />
- Mistake 6: The owner puts some unknown buffer time into the estimation</p>
<p>Please check out the first <a href="http://blog.rough-sea.com/2009/01/common-project-management-mistakes-estimating-tasks-part1/" target="_self">part</a> of this article to find viable solutions to those mistakes.</p>
<p>The mistakes I wrote about are not really specific to a single department; most of them are quite common problems.  Unfortunately, there is one department where task estimation can be very difficult.  It&#8217;s obviously the programming department that I have in mind. Estimating tasks with programmers is quite an awkward  business.</p>
<p>You need lots of knowledge and experience to get numbers that are even close to realistic.  As a project manager you may wonder why this is so complicated and why programmers&#8217; estimates are so often unreliable.  There are several reasons:</p>
<p><strong>Mistake 7:</strong></p>
<p>Taking the estimates of a rookie programmer as the final estimate</p>
<p><em>Solution:</em><br />
Programmer performance varies by a factor of 10, which means a very good programmer can solve a given problem ten times faster than a bad one/rookie. No problem, you think: just let the slowest programmer estimate the task. That will unfortunately not solve your problem.</p>
<p>Young programmers tend to overrate their skills and dramatically underestimate tasks. So let the lead programmers, who are able to rate programmer performance as well as task difficulty, review the rookie&#8217;s estimate. The more experienced programmers check the estimate, the better it gets.</p>
<p><strong>Mistake 8:</strong></p>
<p>The buffer time for the programming tasks is the same as for any other task in the project plan</p>
<p><em>Solution:</em><br />
This is nothing new and a lot of people have written about this problem, but unfortunately it&#8217;s still not accepted as an unalterable fact. Maybe it&#8217;s because of the certainty that there is no simple formula to determine the right buffer time.</p>
<p>It really completely depends on your programming team. You might have a 100% or even 200% buffer time and it&#8217;s not enough. Track real life data and your estimates,  compare them, learn from them . Every programmer has his own speed and estimation techniques.  Find out which ones are reliable and which are not and adjust your buffers accordingly.</p>
<p><strong>Mistake 9:</strong></p>
<p>Assuming that a programmer programs 8 hours a day</p>
<p><em>Solution:</em><br />
If a programmer tells you he needs one day for the task, does that mean one real life day? It depends, again, on the programmer, but you should not ask how many days; instead you should ask &#8220;how many hours do you need?&#8221;. This is very important because a rookie programmer might not have realized yet that his effective  programming time is only 4 to 5 hours a day.</p>
<p><strong>Mistake 10:</strong></p>
<p>Changing numbers in the project plan in order to change reality</p>
<p><em>Solution:</em><br />
Project managers very often reduce the (massive) programming buffer times after estimation is complete, because it tightens the project schedule and seems to save lots of money.</p>
<p>Well you know the answer already: this does NOT change reality and you will not save a single cent. Instead it will cost you a lot of money! Never reduce programming buffer times unless you are absolutely sure it can be done faster.  To put programmers into a crunch because you reduced their necessary buffer times will damage your reputation, and the team will not trust you anymore and will sneak their own buffer times in their upcoming estimations.</p>
<p>Next time I will talk about <strong>crunch</strong>, a very common technique to waste money and lose good employees.</p>
<p>That&#8217;s it for today, thanks for your time <img src='http://blog.rough-sea.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Cheers,<br />
Matthias</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=443&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F06%2Fcommon-project-management-mistakes-estimating-tasks-part-2%2F&amp;title=Common%20project%20management%20mistakes%3A%20Estimating%20tasks%20%28part%202%29" id="wpa2a_10">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/06/common-project-management-mistakes-estimating-tasks-part-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ByteArray Beats Regular Array</title>
		<link>http://blog.rough-sea.com/2009/04/bytearray-beats-regular-array/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=bytearray-beats-regular-array</link>
		<comments>http://blog.rough-sea.com/2009/04/bytearray-beats-regular-array/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 07:27:28 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Array]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[ByteArray]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[linear]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[storage]]></category>
		<category><![CDATA[three dimensional]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=777</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F04%2Fbytearray-beats-regular-array%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F04%2Fbytearray-beats-regular-array%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>To compare the performance of different approaches for handling large data I wrote a small test suite.</p> <p>This application contains one test class (cDataHandlingTest) that writes to and reads from an abstract data class (iData). Each data class offers an unified interface but is implemented in different &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/04/bytearray-beats-regular-array/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F04%2Fbytearray-beats-regular-array%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F04%2Fbytearray-beats-regular-array%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>To compare the performance of different approaches for handling large data I wrote a small test suite.</p>
<p>This application contains one test class (cDataHandlingTest) that writes to and reads from an abstract data class (iData). Each data class offers an unified interface but is implemented in different ways. The test class repeats each test several times, records initialization times and accessing times and then calculates the average for each data class. If you want to have a closer look on the code, you can download the <a href="http://ruelke.wuchtel.de/study/datahandling/datahandlingtest.zip">FlashDevelop-project here</a>. You can check out the test application at the end of the post.</p>
<p><strong>Three-Dimensional Array (cDataArray3D)</strong></p>
<p>This data class uses a three-dimensional array to store the data. Initialization takes a very long time because you need to cycle through several nested loops allocating the data. Access times are ok.</p>
<p><strong>Linear Array (cDataArray1D)</strong></p>
<p>Here I used a linear array for the data. Initialization for a linear area is lightning fast. The draw-back is the access, though. Calculating the offset of the data in the array is pretty complex:<br />
<pre><code>
var index:int =&nbsp;&nbsp;(((_y * m_width ) + _x) * m_entries) + _entryType;
</code></pre></p>
<p>This makes working with a linear array really slow if you cannot predict in what order you will access the data. If you will usually access the data in the exact order it is stored in the array, you would actually be really fast. Unfortunately, this is usually not the case. The linear array is about 10 times slower than the three-dimensional one on random access.</p>
<p><strong>ByteArray Int-Based Access (cDataArrayByte)</strong></p>
<p>In this example I used a ByteArray. The position is calculated in the exact same way as in the linear array example. Data is extracted by using a readInt() command on the stream, data is written by using the writeInt() command. I expected this approach to be really slow. Well it isn’t! On my computer it already outperforms the three-dimensional array in all areas. (It might not on others, though).</p>
<p><strong>ByteArray Byte-Based Access (cDataArrayByteOpt)</strong></p>
<p>If you only need values between 0 and 255 you can use the array operator [ ] of the ByteArray class. This is the fastest way to access the data. Initialization times are really good and access is on my computer about 25% faster than the three-dimensional array.</p>
<p><strong>Test Application</strong></p>
<p>This is the test. Click into the window to start. Be careful, it needs a lot of resources. If you have significantly less then 2GHz per core or only one core I recommend not to try it because it will lock up your computer for too long to be convenient.</p>
<p><object width="500" height="450" data="http://ruelke.wuchtel.de/study/datahandling/DataHandlingTest_small.swf" type="application/x-shockwave-flash"><param name="src" value="http://ruelke.wuchtel.de/study/datahandling/DataHandlingTest_small.swf" /></object></p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=777&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F04%2Fbytearray-beats-regular-array%2F&amp;title=ByteArray%20Beats%20Regular%20Array" id="wpa2a_12">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/04/bytearray-beats-regular-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>State Machine Best Practices</title>
		<link>http://blog.rough-sea.com/2009/01/state-machine-best-practices/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=state-machine-best-practices</link>
		<comments>http://blog.rough-sea.com/2009/01/state-machine-best-practices/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 14:56:30 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[DRY]]></category>
		<category><![CDATA[state machine]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=459</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fstate-machine-best-practices%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fstate-machine-best-practices%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>In game development, state machines are the most common way to structure the behavior of code.  Wikipedia defines a state machine as :</p> <p>A state machine is a model of behavior composed of a finite number of states, transitions between those states, and actions.</p> <p>Probably every game programmer &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/01/state-machine-best-practices/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fstate-machine-best-practices%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fstate-machine-best-practices%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>In game development, state machines are the most common way to structure the behavior of code.  Wikipedia defines a state machine as :</p>
<blockquote><p>A <strong>state machine</strong> is a model of behavior composed of a finite number of states, transitions between those states, and actions.</p></blockquote>
<p>Probably every game programmer has worked with or even created a state machine that turned into debugging mayhem. The road there is short and simple: Game programmers usually do not bother with planning a state machine carefully before starting to code. They usually just create an object, add the obviously needed states and add more states and functionality as needed over time. After a while, the code is full of “set state” calls mingling the states and creating a most complex structure, whose behaviour becomes almost impossible to predict.</p>
<p>We believe in the DRY principle propagated in the book “The Pragmatic Programmer” by Andrew Hunt and David Thomas. DRY is short for “Don’t Repeat Yourself”.  It simply means that duplication of information should be avoided. Creating a state-machine diagram and an implementation is an duplication of information already.</p>
<p><strong>How can the DRY principle be applied to state machines?</strong></p>
<p>Our answer is: Include the state-machine diagram in the code! Using such an in-code diagram makes it really easy to understand how an object works and how states are connected. This transparency is gained by triggering the state changes through observing changes in the internal data rather than using external stimuli. To make this possible we completely eliminated the use of the “set state” method (except for setting the initial state of an object).</p>
<p>Let&#8217;s get practical: We declare our state-machines in the constructor of our objects. First, we define all the needed states. States consist of a state method (reference to a member function) and a state id (constant integer value). Each state can have an arbitrary number of transitions. Each transition contains a reference to a transition-trigger method and a target-state id.  (A transition trigger returns true if a state-change condition is fulfilled, false if not.)<br />
<pre><pre style="background-color:#FFFFFF; color:#000055; padding: 10px;"> 1 // set up state- machine diagram
 2 m_sm = new cStatemachine(NUMBER_OF_STATES);
 3
 4 m_sm.AddState(ST_ANCHORING, StateAnchoring);
 5 m_sm.AddTransition(ST_ANCHORING, IsAnchorUp, ST_FLOATING);
 6
 7 m_sm.AddState(ST_FLOATING, StateFloating);
 8 m_sm.AddTransition(ST_FLOATING, IsSailOut, ST_SAILING);
 9 m_sm.AddTransition(ST_FLOATING, IsAnchorDown, ST_ANCHORING);
10
11 m_sm.AddState(ST_SAILING, StateSailing);
12 m_sm.AddTransition(ST_FLOATING, IsSailIn, ST_FLOATING);
13
14 // set initial state
15 m_statemachine.SetState(STATE_ANCHORING);</pre></pre><br />
Let’s have a closer look at the example (<a href="http://www.ruelke.net/study/as3_statemachine_example_boat.html">Look here for a  more extensive version</a>): There you see the state machine of the object “Boat”. It starts in the state “STATE_ANCHORING” (line 15). As soon as the method “IsAnchorUp()” returns true, the corresponding transition kicks in and it changes the state to “STATE_FLOATING” (line 5). If the sailors should decide to lower the anchor again, the second transition of the floating state will cause the boat to return into “STATE_ANCHORING”  (line 9) again. You are now surely able to easily understand what the other states do and how they interact.</p>
<p>Besides all the good things this approach brings into your project, it also has its downside: It is simply a bit of more work. The programmer has to think about the design of the state machine constantly while programming. It only works if you design your states well. In addition, a little bit more code is needed to implement a particular functionality, too.</p>
<p>Still, the benefits you can gain from this methodology are well worth it. This especially applies to a distributed multi-programmer environment like ours where you need to understand other people’s code fast.<br />
Happy coding! <img src='http://blog.rough-sea.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=459&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fstate-machine-best-practices%2F&amp;title=State%20Machine%20Best%20Practices" id="wpa2a_14">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/01/state-machine-best-practices/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Common project management mistakes: Estimating tasks (part1)</title>
		<link>http://blog.rough-sea.com/2009/01/common-project-management-mistakes-estimating-tasks-part1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=common-project-management-mistakes-estimating-tasks-part1</link>
		<comments>http://blog.rough-sea.com/2009/01/common-project-management-mistakes-estimating-tasks-part1/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 22:53:59 +0000</pubDate>
		<dc:creator>Matthias</dc:creator>
				<category><![CDATA[Industry]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[estimating tasks]]></category>
		<category><![CDATA[mistakes]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.rough-sea.com/wordpress/?p=64</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fcommon-project-management-mistakes-estimating-tasks-part1%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fcommon-project-management-mistakes-estimating-tasks-part1%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Over the last several years I have managed and participated in different projects of different sizes. I made a lot of mistakes, some of them more than once. This time I want to talk about mistakes in estimating the time to complete tasks.</p> <p>Estimating tasks is really &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/01/common-project-management-mistakes-estimating-tasks-part1/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fcommon-project-management-mistakes-estimating-tasks-part1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fcommon-project-management-mistakes-estimating-tasks-part1%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Over the last several years I have managed and participated in different projects of different sizes. I made a lot of mistakes, some of them more than once. This time I want to talk about mistakes in estimating the time to complete tasks.</p>
<p>Estimating tasks is really tough work, and it&#8217;s done wrong most of the time. Estimations are never precise. I think that most project managers are aware of this problem, but may not know how to get better information out of their team.</p>
<p><strong>Mistake 1:</strong></p>
<p>The task is estimated by somebody who is not working on it &#8212; maybe by the lead, which is even worse.</p>
<p><em>Solution:</em><br />
Tasks should be estimated by the owner of the task with the help of his colleagues or his lead. Programmers especially have different working speeds, which can be ranked from 1-10.  This means a very good programmer can be 10 times faster than a very bad one.</p>
<p><strong>Mistake 2:</strong></p>
<p>The task has no proper description and/or is unclear to its owner.</p>
<p><em>Solution:</em><br />
How do you know if the task has a proper description? Well, it&#8217;s a mixture of common sense and experience. If you, as a project manager, do not understand the task (e.g. it&#8217;s too technical), it might be already a very good hint. Tasks should be described non-technically, understandably and in only a few sentences. If you prefer working with user stories I would recommend to you this <a href="http://www.amazon.com/Agile-Estimating-Planning-Robert-Martin/dp/0131479415" target="_self">book</a> from Mike Cohen.</p>
<p><strong>Mistake 3:</strong></p>
<p>The task is estimated with worst case and best case scenarios and the average is taken for the project plan.</p>
<p><em>Solution:<br />
</em>This doesn&#8217;t make sense because the owner has to make 2 estimations. In the worst case scenario there is probably a hidden buffer time, which is not obvious to the reader when checking the project plan. Ask only for one estimation from the owner or the team when estimating the tasks.  It&#8217;s much clearer to them and they know you will add the buffer.</p>
<p><strong>Mistake 4:</strong></p>
<p>The task is too big and cannot properly estimated by its owner (tasks with 8- 16 hours are a maximum)</p>
<p><em>Solution:</em><br />
As soon as a task is bigger than 2 days, it is time to break it down, because nobody can foresee the problems that are going to arise when approaching such a big issue. If you are not able to break down the task (e.g. because of a missing design),  but you need the information desperately, you should estimate it and add at least a 100% buffer. Don&#8217;t forget to mark that task with &#8220;??&#8221;, to be sure to break it down later and re-estimate it.</p>
<p><strong>Mistake 5:</strong></p>
<p>The task has dependencies on other tasks that are not clear to its owner.</p>
<p><em>Solution:<br />
</em>This is not an easy problem. Try to make tasks as independent as possible when defining them. If you work with user stories, add the dependencies of the task to your war-room board and check if your priorities match the dependencies.  It is really hard work for the designer and project manager to get this right. Communicate as much as possible with the team to avoid dependency hell early: it can vaporize your whole project plan if you do not care about it.</p>
<p><strong>Mistake 6:</strong></p>
<p>The owner puts some unknown buffer time into his estimation</p>
<p><em>Solution:</em><br />
Again you need your soft skills and experience here to identify this problem. Some people just add buffer times to be sure they can handle the task. Be open with them, tell them that you will add enough buffer time, holiday and sickness absence.  They will only tell you the right time if they trust you. Collect all the estimation data of each owner to get an idea of how well they estimate over the whole project.</p>
<p>I have some more mistakes on my list, but It is late already. So stay tuned for more in the upcoming days. Cheers for reading and I would love to hear your experiences&#8230; <img src='http://blog.rough-sea.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=64&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fcommon-project-management-mistakes-estimating-tasks-part1%2F&amp;title=Common%20project%20management%20mistakes%3A%20Estimating%20tasks%20%28part1%29" id="wpa2a_16">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/01/common-project-management-mistakes-estimating-tasks-part1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Asserting the Basics III – Unit Testing</title>
		<link>http://blog.rough-sea.com/2009/01/asserting-the-basics-iii-%e2%80%93-unit-testing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asserting-the-basics-iii-%25e2%2580%2593-unit-testing</link>
		<comments>http://blog.rough-sea.com/2009/01/asserting-the-basics-iii-%e2%80%93-unit-testing/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 17:47:17 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[asunit]]></category>
		<category><![CDATA[unittests]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=412</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fasserting-the-basics-iii-%25e2%2580%2593-unit-testing%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fasserting-the-basics-iii-%25e2%2580%2593-unit-testing%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Hello, welcome back and a happy new year to all readers from me as well!</p> <p>Today, we are going to shed some light on our unit-testing process. It is one of our vital safety parts to ensure that our development process is still on track and that &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2009/01/asserting-the-basics-iii-%e2%80%93-unit-testing/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fasserting-the-basics-iii-%25e2%2580%2593-unit-testing%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fasserting-the-basics-iii-%25e2%2580%2593-unit-testing%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hello, welcome back and a happy new year to all readers from me as well!</p>
<p>Today, we are going to shed some light on our unit-testing process. It is one of our vital safety parts to ensure that our development process is still on track and that we are not breaking anything.</p>
<p>Before we started the project, I did some research on unit testing with AS3 on the web. I stumbled upon AsUnit at <a href="http://www.asunit.org">http://www.asunit.org</a> by Luke Bayes and Ali Mills. I integrated their framework into our newly set-up project and we were able to start coding right away. Just now I realized that the  tutorial to set up AsUnit with FlashDevelop disappeared from the web. So, I decided to quickly assemble a new tutorial. You can find it at my web page <a href="http://ruelke.wuchtel.de/showBlog.php?viewid=5&amp;newsid=127">http://www.ruelke.net</a>.</p>
<p>When we started using it in real-life, we discovered a few minor issues. Consequently, I added and changed a couple of things over time, which transformed AsUnit into our very own version.</p>
<ol>
<li>Process: Run tests first: if one fails do not start project code</li>
<li>Extension: Our Asserts can be checked</li>
<li>Extension: Controlling the debug output</li>
</ol>
<p>Ok, let&#8217;s explore these things a little further:</p>
<p><strong>1. Run Tests First: If One Fails Do Not Start Project Code</strong></p>
<p>Out of the box, AsUnit just doesn&#8217;t do anything after it has finished the tests. We all are regular game programmers that have used C++ before. So our unit-testing experience revolves around UnitTest++. I tried to get AsUnit to behave as similarly as possible. Accordingly, AsUnit needs to do the following:<br />
- Start and Run the tests<br />
- Check the result<br />
- Continue with the game code if everything was correct</p>
<p>To do this, I extended the TestRunner-constructor with another parameter: a function pointer (callback). The callback is called within the TestRunner&#8217;s testCompleteHandler-function if the unit tests passed successfully. Then the callback takes care of continuing with the game &#8212; starting the game loop, loading assets and so on.</p>
<p><strong>2. Our Asserts Can Be Checked</strong></p>
<p>It is important to integrate our assert-handling into the testing process. You may remember my posts about assert-handling a while back (<a href="http://blog.rough-sea.com/category/methodology/">http://blog.rough-sea.com/category/methodology/</a>). It is possible to use our debug class&#8217; HasAsserts()-method, which returns true if an assertion failed, to check if an assertion actually fails as expected in a test case. The AsUnit framework has a class called Assert, which contains all checking methods used in the tests. By using what&#8217;s already there (like the assertTrue method), I could realize the check for assertions in a very simple way :<br />
<pre><pre style="background-color: white; padding: 5px; color: #222222;">&lt;span style=&quot;color: #008000;&quot;&gt;/**
 * Asserts assertions.
 * Usage: assertError(m_object.ErroneousMethod())
&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; * If assertion does not fail an AssertionFailedError is thrown
 * with the given message.
 */
&lt;span style=&quot;color: #000080;&quot;&gt;static public function assertError(...args:Array):void
&lt;span style=&quot;color: #222222;&quot;&gt;{
&lt;span style=&quot;color: #000080;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;assertTrue(&quot;Assertion failed to fail!&quot;, Debug.HasAsserts());
&lt;span style=&quot;color: #222222;&quot;&gt;&nbsp;&nbsp; &lt;span style=&quot;color: #008000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;// clear the asserts so there is
&nbsp;&nbsp;&nbsp;&nbsp;// no interference with other tests
&lt;span style=&quot;color: #222222;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: #000080;&quot;&gt;Debug.ClearAsserts();
&lt;span style=&quot;color: #222222;&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;</pre></pre><br />
<strong>3. Controlling The Debug Output</strong></p>
<p>A lot of our classes, especially the state machines, contain automated debug output. When running our tests, this debug output is overwhelming &#8230; and useless as well. All of the console output goes through our Debug class. So I added a flag that is able to disable the sending of messages to the console. This flag is activated right before the tests and deactivated right after. The spam was history.</p>
<p>Alrighty, these are the three most important changes I did to the AsUnit framework to make it suit our needs. Well, you have reached the end of my little trilogy. Don&#8217;t worry, I still have stuff to talk about.<br />
So see you next time and happy coding! <img src='http://blog.rough-sea.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=412&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2009%2F01%2Fasserting-the-basics-iii-%25e2%2580%2593-unit-testing%2F&amp;title=Asserting%20the%20Basics%20III%20%E2%80%93%20Unit%20Testing" id="wpa2a_18">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2009/01/asserting-the-basics-iii-%e2%80%93-unit-testing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Asserting the Basics &#8211; Part IIb</title>
		<link>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-iib/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asserting-the-basics-part-iib</link>
		<comments>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-iib/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 18:07:36 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[assertions]]></category>
		<category><![CDATA[asserts]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[error handling]]></category>
		<category><![CDATA[stacktrace]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=242</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-iib%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-iib%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Hello, again! We&#8217;re back with another episode of &#8220;Asserting the Basics&#8221;. Last time we talked about our assertive philosophy on error handling. Today, we go into the dirty little details: the coding of asserts.</p> <p>Asserts are not something that Actionscript3 offers naturally. Consequently, I added an Assert-method &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2008/11/asserting-the-basics-part-iib/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-iib%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-iib%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Hello, again! We&#8217;re back with another episode of &#8220;Asserting the Basics&#8221;. Last time we talked about our assertive philosophy on error handling. Today, we go into the dirty little details: the coding of asserts.</p>
<p>Asserts are not something that Actionscript3 offers naturally. Consequently, I added an Assert-method to our Debug class (remember from my first post?). Its job is (of course) to check whether a Boolean expression is true, and, if not, to eventually communicate this fact. Rather than showing all failed asserts directly, our method only stores them. I want to have control over when the asserts are shown, since there are times when you actually want asserts to fail: for instance when you want to try out your error handling in Unit Tests. Thus, there is another method to take care of displaying them, which can be called at an appropriate time. So our assert framework looks like this:<br />
<pre><pre style="background-color: White; Color: Black;">&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; var m_asserts:Array;
&lt;span style=&quot;color: #008000;&quot;&gt;/**
 * Asserts that a condition is met
 * @param&nbsp;&nbsp;&nbsp;&nbsp;_statement condition to check
 * @param&nbsp;&nbsp;&nbsp;&nbsp;_msg Message to describe the assert
 * @return true if the assert failed
 */&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; function Assert(_statement:Boolean, _msg:String):Boolean
{
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&lt;/span&gt; (_statement != true)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var msg:String = &lt;span style=&quot;color: #800000;&quot;&gt;&quot;****************************\n &quot;&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ &lt;span style=&quot;color: #800000;&quot;&gt;&quot;ASSERT FAILED!!\n &quot;&lt;/span&gt;+_msg+&lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;+GetStackTrace()+&lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;****************************&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;\n &quot;&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// record assert&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_asserts == null)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_asserts = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; Array();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_asserts.push(msg);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Out(msg);
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt; true;
&nbsp;&nbsp;&nbsp;&nbsp;}
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt; false;
}
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; function ShowAsserts(_stage:Stage) : &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;
{
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&lt;/span&gt; (m_asserts == null)
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;var assertBox:TextField = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; TextField();
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.autoSize = TextFieldAutoSize.LEFT;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.width = _stage.stageWidth;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.textColor = &lt;span style=&quot;color: #800000;&quot;&gt;0xFF0000&lt;/span&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.backgroundColor = &lt;span style=&quot;color: #800000;&quot;&gt;0x000000&lt;/span&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.background = true;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.wordWrap = true;
&nbsp;&nbsp;&nbsp;&nbsp;assertBox.text = &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&quot;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;for&lt;/span&gt; (var i:&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; = &lt;span style=&quot;color: #800000;&quot;&gt;0&lt;/span&gt;; i &amp;lt; m_asserts.length; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var assertString:String = m_asserts[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertBox.appendText(assertString + &lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;_stage.addChild(assertBox);
}</pre></pre><br />
You may have noticed that our assert method has a Boolean return value, returning true if the assert fails. This way we can use the method to exit early from a function that would crash otherwise. Since we cannot simply take the asserts back out, we might as well use them in a bigger context.</p>
<p>In our code the use of these asserts look like this:<br />
<pre><pre style="background-color: White; Color: Black;">&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; function Load(_path:String) : &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; {
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&lt;/span&gt; (Debug.Assert(m_fileName != null, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;Filename is null!!&quot;&lt;/span&gt;))
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&lt;/span&gt; (Debug.Assert(m_fileName.length != &lt;span style=&quot;color: #800000;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;Filename is empty!!&quot;&lt;/span&gt;))
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt;;
&lt;span style=&quot;color: #008000;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;// yada yada … more code&lt;/span&gt;
}</pre></pre><br />
To give our asserts even more value, I did some research on how to get stack traces. I found out that if you throw an error and catch it in a debug player, you can retrieve a stack trace from the error object, as seen here:<br />
<pre><pre style="background-color: White; Color: Black;">&lt;span style=&quot;color: #008000;&quot;&gt;/**
 * Returns the stack trace (filtered)
 * @return stack trace
 */&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; function GetStackTrace() : String {
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;if&lt;/span&gt; (Capabilities.isDebugger == true) {
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; Error(); }
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&lt;/span&gt; (e:Error) { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FilterStackTrace(e.getStackTrace()); }
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt; &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&quot;&lt;/span&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;else&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #800000;&quot;&gt;&quot;Stack trace not available in non-debugger version.&quot;&lt;/span&gt;;
}</pre></pre><br />
Unfortunately, the stack trace you get this way is really extensive and hard to read. Every line in the trace contains the complete path to the corresponding file on the local machine. So, I added a filtering function to remove the unnecessary path info. This method turns e.g. this:<br />
<pre><pre style="color: darkorange;">&lt;span style=&quot;color: #ff9900;&quot;&gt;tests::TestDynamicTextManager.TestTextEdit()Trace:
AssertionFailedError
&nbsp;&nbsp;at tests::TestDynamicTextManager/TestTextEdit()
&nbsp;&nbsp;[D:\projects\programming\bgame\svn\FlashComponents
&nbsp;&nbsp;\client\src\tests\TestDynamicTextManager.as:15]&lt;/span&gt;</pre></pre><br />
into this:<br />
<pre><pre style="color: darkorange;">&lt;span style=&quot;color: #ff9900;&quot;&gt;tests::TestDynamicTextManager.TestTextEdit()Trace:
AssertionFailedError
&nbsp;&nbsp;at tests::TestDynamicTextManager/TestTextEdit() [line:15]&lt;/span&gt;</pre></pre><br />
Here is the filter function:<br />
<pre><pre style="background-color: White; Color: Black;">&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; function FilterStackTrace(stack:String):String {
&nbsp;&nbsp;&nbsp;&nbsp;var lines:Array = stack.split(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;);
&lt;span style=&quot;color: #008000;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;// remove the path
&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;// it&#039;s too long and we can get the info from the method trace&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;var regEx:RegExp = /\w:[\\\/]([\w-]+[\\\/])*\w+.as/ig;
&nbsp;&nbsp;&nbsp;&nbsp;var newStack:String = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; String(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;);
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;for&lt;/span&gt; (var i:&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; = &lt;span style=&quot;color: #800000;&quot;&gt;0&lt;/span&gt;; i &amp;lt; lines.length; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var line:String = lines[i];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line = line.replace(regEx, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&quot;&lt;/span&gt;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line = line.replace(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;[:&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot; [line:&quot;&lt;/span&gt;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStack = newStack + line + &lt;span style=&quot;color: #800000;&quot;&gt;&quot;\n&quot;&lt;/span&gt;;
&nbsp;&nbsp;&nbsp;&nbsp;}
&lt;span style=&quot;color: #0000ff;&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;return&lt;/span&gt; newStack;
}</pre></pre><br />
Alrighty, now you&#8217;re set to do your own asserts. Next time, I&#8217;ll talk about unit testing and Actionscript3.<br />
So, see you in a bit for a new episode of &#8220;Asserting the Basics&#8221;.</p>
<p>Happy coding, Manuel</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=242&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-iib%2F&amp;title=Asserting%20the%20Basics%20%26%238211%3B%20Part%20IIb" id="wpa2a_20">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-iib/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Asserting the Basics – Part IIa</title>
		<link>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-ii/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asserting-the-basics-part-ii</link>
		<comments>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-ii/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 17:16:01 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[assertions]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=173</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-ii%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-ii%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Welcome back! Today, let’s talk about the probably most sensitive part of programming: error handling. This is a really big topic, so I made two articles out of it. This time I am going to tell you about our philosophy on that. Next time, I&#8217;ll show you &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2008/11/asserting-the-basics-part-ii/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-ii%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-ii%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Welcome back! Today, let’s talk about the probably most sensitive part of programming: error handling. This is a really big topic, so I made two articles out of it. This time I am going to tell you about our philosophy on that. Next time, I&#8217;ll show you how we turned our vision into reality.</p>
<p>Back to business: A project without proper error handling is doomed to fail after it has passed a certain level of complexity. Actionscript3 offers exceptions as a standard answer on the topic of how to deal with errors. Exceptions are for exceptional problems, but not for your little everyday error check. So, for us at Rough Sea Games exceptions are simply not enough. We like to be able to do what “The Pragmatic Programmer” [1] calls “assertive programming.” We add a lot of checks to our code to make sure we are still safe. If something goes haywire, our asserts make sure we crash early. That really helps to find the bug(ger) quickly. In addition, we like to ensure that “contracts” between methods are kept. That means, for instance, that if a method requires one of the parameters passed to it not to be null, we want to assert this to make sure it won’t happen. And if it does, we want an immediate feedback and not a some ambiguous crash further down the road.</p>
<p>Despite being a great help for the programmer, assertions can be a problem when it comes to performance.</p>
<p><strong>Performance Issues</strong></p>
<p>I did some performance tests while ago: I took out the assert method just leaving an empty stub. Oddly, this did not have a significant impact on the performance. So, the method itself is not very greedy. That’s good, but still, when I took out a couple of asserts the performance went up. How can that be? I found out that calling the method was the problem. Our assert method takes a string as one of its parameters. In some places we employed some heavy string operations to include values in that message.</p>
<p>When you do something like that inside an important  loop you may be surprised about the great loss of performance. By refactoring some of those critical asserts, I could speed things up quite a bit without having to take the asserts out. So, if you are careful, asserts do not have to be a performance killer.</p>
<p><strong>Better Production Code</strong></p>
<p>Of course, taking the asserts out will produce slightly faster code, but since there is no simple way to actually take them out in a reversible manner (like using a preprocessor), we may as well leave them in for good. Some people may perceive them as a debug-only facility, but having them in production code might not be such a bad idea. We want to debug and improve our product constantly after release. A consumer that is able to tell us which assert exactly failed, helps us to find bugs a lot easier.</p>
<p>Well, I could go on about assertions forever … but time is scarce, so I’ll close for now. Next time, we&#8217;ll get our hands dirty and dive into our assertion code.</p>
<p>So, stay tuned and happy coding,  Manuel</p>
<p>[1] The Pragmatic Programmer; Andrew Hunt, David Thomas, Addison-Wesley<br />
ISBN 02161622X (<a href="http://www.pragmaticprogrammer.com">http://www.pragmaticprogrammer.com</a>)</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=173&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-ii%2F&amp;title=Asserting%20the%20Basics%20%E2%80%93%20Part%20IIa" id="wpa2a_22">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asserting the Basics – Part I</title>
		<link>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-i/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=asserting-the-basics-part-i</link>
		<comments>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-i/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 07:05:10 +0000</pubDate>
		<dc:creator>Manuel</dc:creator>
				<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[text printing]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=171</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-i%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-i%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Although it’s not the hardest language to learn, Actionscript3 does provide a couple of traps that may lead an inexperienced Padawan astray. In a series of blog entries I would like to describe my own first steps on these new grounds, hoping that I can provide some &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2008/11/asserting-the-basics-part-i/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-i%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-i%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Although it’s not the hardest language to learn, Actionscript3 does provide a couple of traps that may lead an inexperienced Padawan astray. In a series of blog entries I would like to describe my own first steps on these new grounds, hoping that I can provide some aid for other programmers who also want to join the scripted side of the action.</p>
<p>Usually, the first thing I do in a new language is to ensure to have at least the following things at hand:</p>
<ul>
<li>a possibility to print out text</li>
<li>an assert mechanism</li>
<li>and unit tests</li>
</ul>
<p>These ingredients provide at least a minimum of safety while progressing through the uncharted territories of a new language and this is what I want to talk about. Let&#8217;s start on the first topic:</p>
<p><strong>The beauty of text output</strong></p>
<p>My very first project as a professional programmer was a racing game in C++ for Symbian OS 6 (an operating system on Nokia cellphones). Back then, the Symbian SDK consisted pretty much only of compilers and packagers, … and one funny little emulator. This bad boy did not have a text console to print to, and, even worse, there was no support for a real-time debugger. I pretty much felt like being blindfolded. It was then, when I realized how important a simple text console can be! Traumatized by this experience, I started our game engine by writing a Debug class with its first method being an output function for text messages.</p>
<p>Some may say: “Heck, why didn’t he just use trace() everywhere”. This has several reasons: For one, trace() simply does not work with non-debug Flash players and secondly I wanted to have one interface for all the debug messages. This way, implementing the possibility to switch off printing of messages is a piece of cake, and later adding a logger for all messages would be just the piece of cake next to the one I have just mentioned.</p>
<p>Now, this is what our very first method(s) looks like:<br />
<pre><pre style="background-color: White; color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: blue;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; var m_sendDebugInfo:Boolean = true;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; function EnableDebugInfo(_debugInfo: Boolean) : &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sendDebugInfo = _debugInfo;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: green;&quot;&gt;/**
&nbsp;&nbsp;&nbsp;&nbsp; * Sends a message to the console of flash develop
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp;&nbsp;&nbsp;_msg message to send
&nbsp;&nbsp;&nbsp;&nbsp; */&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: blue;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;static&lt;/span&gt; function Out(_msg:String): &lt;span style=&quot;color: blue;&quot;&gt;void&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (m_sendDebugInfo == true)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fscommand(&lt;span style=&quot;color: maroon;&quot;&gt;&quot;trace&quot;&lt;/span&gt;, _msg); &lt;span style=&quot;color: green;&quot;&gt;// for normal player&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(_msg); &lt;span style=&quot;color: green;&quot;&gt;// for debug player&lt;/span&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}</pre></pre><br />
Alright, this is pretty basic stuff, I know. Anyway, I did have to fiddle around with the text console to get it working in all players, especially with the non-debug player. So I thought, why not starting simple? I can always get more complicated later &#8230; and maybe this info can save some of somebody else&#8217;s time.</p>
<p>So, we just reached the end of the first entry of my series. Next time, I’m going to discuss the topic of assertions. So stay tuned for another episode of “Asserting the Basics”.</p>
<p>Happy coding,  Manuel</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=171&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F11%2Fasserting-the-basics-part-i%2F&amp;title=Asserting%20the%20Basics%20%E2%80%93%20Part%20I" id="wpa2a_24">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2008/11/asserting-the-basics-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrum and XP for distributed teams (part two)</title>
		<link>http://blog.rough-sea.com/2008/10/scrum-and-xp-for-distributes-teams-part-two/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scrum-and-xp-for-distributes-teams-part-two</link>
		<comments>http://blog.rough-sea.com/2008/10/scrum-and-xp-for-distributes-teams-part-two/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 08:47:21 +0000</pubDate>
		<dc:creator>Matthias</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[collective code ownership]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[remote pair programming]]></category>

		<guid isPermaLink="false">http://blog.rough-sea.com/?p=139</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F10%2Fscrum-and-xp-for-distributes-teams-part-two%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F10%2Fscrum-and-xp-for-distributes-teams-part-two%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>Please check my last <a title="blog entry" href="http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one" target="_blank">blog entry</a> for the background to this post.</p> <p>This time I will focus a little bit more on the XP side and explain what exactly we practise here.</p> <p>Step 5 &#8211; regular pair programming sessions</p> <p>Unfortunately, we are not &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2008/10/scrum-and-xp-for-distributes-teams-part-two/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F10%2Fscrum-and-xp-for-distributes-teams-part-two%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F10%2Fscrum-and-xp-for-distributes-teams-part-two%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Please check my last <a title="blog entry" href="http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one" target="_blank">blog entry</a> for the background to this post.</p>
<p>This time I will focus a little bit more on the XP side and explain what exactly we practise here.</p>
<p><strong>Step 5 &#8211; regular pair programming sessions</strong></p>
<p>Unfortunately, we are not able to pair program very often. We currently try to meet up once a week and have a 3 &#8211; 4 hour pair programming session. At this session we go through as much code as possible and talk about the architecture and the current design flaws. We try to get hold of the worst things we did while coding on our own, and start refactoring on the spot to learn a little bit more of each other&#8217;s code.</p>
<p>Sometimes pair programming is not possible because people live too far away, so we are looking into <strong>remote pair programming</strong>. We have not established it yet, but have collected lots of information. Please checkout <a href="http://blog.lathi.net/articles/2007/10/09/remote-pair-programming" target="_blank">Doug Alcorn&#8217;s Blog</a> or <a href="http://andrzejonsoftware.blogspot.com/2008/02/remote-pair-programming.html " target="_blank">Andrzej Krzywda&#8217;s     Blog</a> for some field reports.  We will probably try VNC combined with Skype, because Flash Develop (our current IDE) does not have any collaboration support yet.</p>
<p><strong>Step 6 &#8211; collective code ownership is even more important</strong></p>
<p>CCO means that everybody can make changes and fix bugs anywhere in the code. There is <strong>not a single line</strong> of code in the project that is under the control of only one person. A good description of code ownership can be found at <a href="http://www.martinfowler.com/bliki/CodeOwnership.html " target="_blank">Martin Fowler&#8217;s Blog</a>. As mentioned, we know each other very well already. If this weren&#8217;t the case,  CCO would be much more of a hassle.  A lot of trust and a lot of communication is necessary and coding divas are not allowed. Fortunately there is no diva in our team yet.</p>
<p>CCO is key for the success of a distributed team, because it helps to spread the knowledge of the code, systems and architecture of the project among team members (as pair programming does). Programmers will perform much better when they know how to use a specific system and how to adapt it to their needs. Not everybody on the web thinks that CCO is a the best idea ever; please check <a href="http://weblogs.asp.net/ralfw/archive/2006/04/01/441639.aspx " target="_self">Ralf Sudelbücher&#8217;s Blog</a> for a different perspective.</p>
<p><strong>Step 7 &#8211; consistent and very regular refactoring</strong></p>
<p>This, you might think, is not something specific to distributed teams — but I&#8217;m here to tell you you&#8217;re wrong. Sitting at home on your own, without a team mate next to you who reminds you to fix that broken window  <strong>now </strong>(kudos to the <a href="http://www.pragprog.com/" target="_blank">pragmatic programmers</a>), makes refactoring much less likely.  The code quality can decrease quite fast for a distributed team if the programmers do not really care about it. What to do?</p>
<p>It&#8217;s actually quite easy. At each pair programming session, we identify broken designs and foul code and write our own refactoring stories. We give those stories the highest priority in the backlog. It&#8217;s very important to keep these stories as small as possible, because refactoring can sometimes get out of hand and this should be avoided. We only put the most relevant refactoring tasks into stories, because otherwise the backlog gets too confusing.</p>
<p><strong>Step 8 &#8211; keep up the motivation </strong></p>
<p>This is by far the most relevant and hardest part for a team which does distributed work, especially when there is no investor yet. The 7 steps already described help a lot to keep up the motivation when done right, but that&#8217;s not everything which can be done.</p>
<p>Try to establish a culture of praise and respect in your team. As soon as people start blaming each other,  motivation will ebb and the team will break apart. If possible, the whole team should meet on a regular basis, as this helps a lot to improve communication and trust.</p>
<p>It&#8217;s also very important to have progress in all areas, not only the development part. Somebody has to care about investor relations, marketing issues, team building, business development etc.  The team needs to believe that the product will be a success and that it is worth selling to the customers.</p>
<p>That&#8217;s it for today. I hope I could shed some light on our Scrum and XP processes and if you have some improvements or suggestions for us, I would be very happy to hear them.</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=139&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F10%2Fscrum-and-xp-for-distributes-teams-part-two%2F&amp;title=Scrum%20and%20XP%20for%20distributed%20teams%20%28part%20two%29" id="wpa2a_26">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2008/10/scrum-and-xp-for-distributes-teams-part-two/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scrum and XP for distributed teams (part one)</title>
		<link>http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scrum-and-xp-for-distributed-teams-part-one</link>
		<comments>http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one/#comments</comments>
		<pubDate>Tue, 30 Sep 2008 08:56:47 +0000</pubDate>
		<dc:creator>Matthias</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[agile development]]></category>
		<category><![CDATA[distributed teams]]></category>
		<category><![CDATA[extreme programming]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://www.rough-sea.com/wordpress/?p=98</guid>
		<description><![CDATA[<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F09%2Fscrum-and-xp-for-distributed-teams-part-one%2F"> <img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F09%2Fscrum-and-xp-for-distributed-teams-part-one%2F&#38;style=compact&#38;b=2" height="61" width="50" /> </a> <p>As promised, this blog will include some thoughts about development processes and their impact on teams and projects. Today I will write about scrum and extreme programming (XP) for distributed teams, because at the moment we are one of those teams.</p> <p>Scrum is a well known and &#8230; </p><p><a class="more-link block-button" href="http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one/">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F09%2Fscrum-and-xp-for-distributed-teams-part-one%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F09%2Fscrum-and-xp-for-distributed-teams-part-one%2F&amp;style=compact&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>As promised, this blog will include some thoughts about development processes and their impact on teams and projects. Today I will write about scrum and extreme programming (XP) for distributed teams, because at the moment we are one of those teams.</p>
<p>Scrum is a well known and currently very popular agile project management process. XP is a technical process, for programmers, and is also an agile methodology. The basics of Scrum are summarized in this great <a href="http://geekswithblogs.net/emanish/archive/2008/07/27/124060.aspx" target="_blank">video</a> from Kent Schwaber. If you looking for a good overview on XP check the <a href="http://codebetter.com/blogs/darrell.norton/pages/50340.aspx" target="_blank">Codebetter.com blog</a>. More info on Scrum and XP can be found at the <a href="http://www.agilealliance.org/" target="_blank">Agile Alliance Website</a> and <a href="http://blog.mountaingoatsoftware.com" target="_blank">Mike Cohen&#8217;s blog.</a><br />
I know both processes quite well, read all the available books, and have had the great opportunity to build up a team using these agile approaches at full scale.  The team included some offsite workers, but that wasn&#8217;t too hard to organize.</p>
<p>To implement Scrum and/or XP in a team which does not share an office sounds almost impossible. Everything in agile methodologies relies on communication and transparency. A distributed team talking over e-mail/ICQ/wiki normally has difficulty communicating, and most team members have almost no idea what their colleagues are currently working on.</p>
<p>I will tell you what our team has done to improve communication, and why it is currently working like a charm.  I have to admit that all team members know each other and are quite experienced. All of them have used Scrum and XP methodologies before.  So the techniques described might not work for new teams which have never worked in an Agile way.</p>
<p><strong>Step 1 &#8211; a wiki substitutes for the daily Scrum</strong></p>
<p>We established a wiki as our major communication platform. WOW! That&#8217;s magic, isn&#8217;t it? <img src='http://blog.rough-sea.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Well, the magic is not in the wiki itself, it&#8217;s in the motivation of its participants. If the team doesn&#8217;t update the wiki several times a day, it becomes absolutely useless.</p>
<p>Every day, I post the latest technical and business news, and all team members, including me, write an update on their current tasks.  We still write e-mails and chat over ICQ, but most important communication happens in the wiki. It contains our business plan, the product backlogs, the complete (and current!) game design, helpful FAQs, various artwork and brainstorming thoughts. We even track our work hours and expenses in the wiki.  We are still trying to improve our communication processes, but for now it&#8217;s working out quite well.</p>
<p><strong>Step 2 &#8211; removed sprints, and introduced stories as mini sprints</strong></p>
<p>We are currently working part time on our project, because we are still looking for an investor. People work in their free time on weekends, vacation days and so on.  At first we tried to fix sprint timelines to certain dates, but that didn&#8217;t work at all. Working in your free time with (arbitrary) deadline pressure is horrific and far too much stress for everybody, so we skipped it.</p>
<p>Instead, Rafael put together a backlog in which the core game mechanics are written down as stories with acceptance tests. Stories get estimated by the programmers &#8212; not in a planning game, unfortunately, but the estimations do work out, because the team is quite experienced.  It is very important that the stories do not exceed 2.5 points (most of our stories have 0.5 to 1.5 points). One point is a perfect day, so you need 2.5 perfect days to complete a 2.5 point story. This might take up to 2 or 3 weeks, depending on the time available. So the size of the story is important because of motivation issues: completing work in a short time gives you a very good feeling.</p>
<p><strong>Step 3 &#8211; sprint demos are done for each story </strong></p>
<p>We have always a working build and our designer is able to update the svn repository whenever he wants to. After updating he just has to start FlashDevelop, press F5 and can play the game.  As soon as somebody moves the story to the &#8220;completed&#8221; section, Rafael checks the story directly in the current build and adds a comment if something has to change. If the change request is too big,  Rafael writes another story and adds it to the product backlog.  This works absolutely great so far; thanks go to Rafael for doing a fantastic job here!</p>
<p><strong>Step 4 &#8211; established test driven development from the start<br />
</strong></p>
<p>Fortunately there are some open source frameworks for Actionscript 3 which support test driven development. We are currently using one of them, which Manuel has improved a lot in the first weeks of the project.  Maybe Manuel can explain what he exactly did in some of his future blog posts.</p>
<p>We used TDD from the very first moment, and it proved to be a good decision, because it helps us to have very stable builds. Having a stable version of the game is a must for distributed teams, because it will highly affect the motivation and performance of the team.</p>
<p><strong>To be continued&#8230;</strong></p>
<p>So I guess that&#8217;s it for today. There is a lot more to say about this topic, so I will write part two in the upcoming week. I hope you enjoyed this post and are able get some valuable info out of it.</p>
<p>Cheers,<br />
Matthias</p>
<img src="http://blog.rough-sea.com/?ak_action=api_record_view&id=98&type=feed" alt="" /><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.rough-sea.com%2F2008%2F09%2Fscrum-and-xp-for-distributed-teams-part-one%2F&amp;title=Scrum%20and%20XP%20for%20distributed%20teams%20%28part%20one%29" id="wpa2a_28">Share/Bookmark</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.rough-sea.com/2008/09/scrum-and-xp-for-distributed-teams-part-one/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

