<?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>Conscious Development</title>
	<atom:link href="http://samipoimala.com/it/feed/" rel="self" type="application/rss+xml" />
	<link>http://samipoimala.com/it</link>
	<description>Curious perversions from software development</description>
	<lastBuildDate>Wed, 07 Mar 2012 06:53:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Rethinking software development project staffing</title>
		<link>http://samipoimala.com/it/2011/04/09/rethinking-software-development-project-staffing/</link>
		<comments>http://samipoimala.com/it/2011/04/09/rethinking-software-development-project-staffing/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 10:05:30 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Conscious development]]></category>
		<category><![CDATA[Project work]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=148</guid>
		<description><![CDATA[You are about to start a new project and are considering what kind of people you need. Typically people take a project manager, a designer, some developers and a tester so it must be the perfect recipe? Scrum and other agile methodologies came to the scene and confused people: they have roles like “Product Owner, [...]]]></description>
			<content:encoded><![CDATA[<p>You are about to start a new project and are considering what kind of people you need. Typically people take a project manager, a designer, some developers and a tester so it must be the perfect recipe? Scrum and other agile methodologies came to the scene and confused people: they have roles like “Product Owner, Scrum Master, Coach and ‘the Team’”. Still, you have people with diverse set of skills and you need to staff your team. What should you search for? Here I explain why you should build your project on top of generalists and try to keep the team as small as possible, but no smaller.<span id="more-148"></span></p>
<div class="wp-caption alignleft" style="width: 314px"><a href="http://samipoimala.com/it/files/2011/04/image.png"><img style="background-image: none; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0pt none;" title="image" src="http://samipoimala.com/it/files/2011/04/image_thumb.png" alt="image" width="304" height="233" align="left" border="0" /></a><p class="wp-caption-text">Recognised roles</p></div>
<p>Any project needs all sorts of expertise. In the picture 1 I have illustrated a typical, yet simple, scenario where the project needs some management, architecture, user interface design, development and it operations. The easiest and arguably most common solution is to assign one or more people into each expertise.</p>
<div class="wp-caption alignright" style="width: 314px"><a href="http://samipoimala.com/it/files/2011/04/image1.png"><img style="background-image: none; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0pt none;" title="image" src="http://samipoimala.com/it/files/2011/04/image_thumb1.png" alt="image" width="304" height="239" align="right" border="0" /></a><p class="wp-caption-text">Person per role</p></div>
<p>This seems obvious: if we have a work to do, we need a person to do it. But this leads to problems well known: people are not collaborating effectively, they have their own silos, most of the decisions need to be done upfront which leads to waterfallish development no matter what your official methodology is. Most challenges in real world have cross-cutting concerns. Solving any such problem needs broad understanding of many aspects and in this setup this means you need many people work together. Collaboration is not bad in itself, but when you have two specialists who don’t understand each other’s expertise, it is not as efficient as it should be.</p>
<p>The solution to this problem has been examined before (see for example my <a href="http://samipoimala.com/it/2010/03/18/whats-wrong-with-typical-resourcing/">problems in current resourcing</a>). But as I see this one of the major hurdles to efficient (dare I say, agile?) development and I don’t see it being handled properly I need to keep refreshing on it. So, what we should aim for?</p>
<div class="wp-caption alignleft" style="width: 314px"><a href="http://samipoimala.com/it/files/2011/04/image2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0pt none;" title="image" src="http://samipoimala.com/it/files/2011/04/image_thumb2.png" alt="image" width="304" height="233" border="0" /></a><p class="wp-caption-text">Person per gap between role: 10 required</p></div>
<p>Instead of using simple “person(s) per expertise” -method, we should probably use “minimal number of people that is enough to fill all the gaps between silos” –method. First you need to identify all the expertise areas that are needed to accomplish the desired end result. Then you need to find such persons that fulfill every gap between any two expertise areas. In our example, we had identified the five expertise areas so we have 10 gaps to fulfill.</p>
<p>Again, each of these gaps does not directly map into one person. Soon it becomes evident that if each team member only has one or two areas she is comfortable working in, you have a problem. Should each member have only two areas of competence, you’d really need 10 people. But, if even one of them possesses three different skills, the number of required people counts down to 8. If you have one “superstar” that is competent in four areas, you need only two people to fulfill every gap.</p>
<div id="attachment_149" class="wp-caption alignright" style="width: 310px"><a href="http://samipoimala.com/it/files/2011/04/overlappingskills.png"><img class="size-medium wp-image-149" title="overlappingskills" src="http://samipoimala.com/it/files/2011/04/overlappingskills-300x267.png" alt="" width="300" height="267" /></a><p class="wp-caption-text">Persons with overlapping skills: only 3 required!</p></div>
<p>In any real-life project you have probably more than just 5 types of expertise needed: concept design, usability design, graphic design, requirements gathering, database programming, UI programming, testing, it operations, mathematical analysis, domain-specific knowledge etc. And as we know, <a href="http://www.stevemcconnell.com/articles/art06.htm">the more people there are in the project, the more demanding the communication</a>. And communication happens to be one of the most important aspects of any project, especially one of software deveopment (see: <a href="http://alistair.cockburn.us/Software+development+as+a+cooperative+game">software development as a cooperative game</a>). This reminds us about the <a href="http://samipoimala.com/it/2009/09/30/multi-competence-required-today/">importance of multi-competence</a>.</p>
<p>So as a summary, the suggested method to project staffing is:</p>
<ul>
<li>identify the required expertise areas</li>
<li>find the least amount of people that cover all the required areas</li>
<li>if you need more firepower into any area, only then can you add a specialist</li>
</ul>
<p>=&gt; Sami&#8217;s rule of project staffing: Build the project on top of generalists, only add specialists if needed.</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2011/04/09/rethinking-software-development-project-staffing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unobtrusive client validation in ASP.NET MVC 3</title>
		<link>http://samipoimala.com/it/2010/11/29/unobtrusive-client-validation-in-asp-net-mvc-3/</link>
		<comments>http://samipoimala.com/it/2010/11/29/unobtrusive-client-validation-in-asp-net-mvc-3/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 11:24:24 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=121</guid>
		<description><![CDATA[Recently I walked through the pains of setting up flexible client-side validation on ASP.NET MVC 3 project. After all the hassle, the solution is actually pretty easy and elegant. All the information is available on the internet already but the One And Only blog post that explains it everything seems to be missing. So here [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I walked through the pains of setting up flexible client-side validation on ASP.NET MVC 3 project. After all the hassle, the solution is actually pretty easy and elegant. All the information is available on the internet already but the One And Only blog post that explains it everything seems to be missing. So here it is.</p>
<p>  <span id="more-121"></span> What we want to achieve:
<ul>
<li>We do not want to duplicate validation rules into many places </li>
<li>We want to have as much as possible validated on the client </li>
<li>We do not want to have tons of boilerplate custom javascript </li>
</ul>
<p>And the solution consists of the following elements:</p>
<ul>
<li>ValidationAttributes (<em>System.ComponentModel.DataAnnotations</em>) </li>
<li><a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/">jQuery Validate</a> </li>
<li>Unobtrusive extension to jQuery Validate </li>
</ul>
<h2>The basics of attribute-based validation</h2>
<p>Namespace <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx">System.ComponentModel.DataAnnotations</a> contains many attributes that you can use to validate user input. Specifically, you have <em>DataTypeAttribute</em>, <em>RangeAttribute</em>, <em>RegularExpressionAttribute</em>, <em>RequiredAttribute </em>and <em>StringLengthAttribute</em>. I guess the names are pretty self-explanatory.</p>
<p>In addition, System.Web.Mvc namespace contains <em>CompareAttribute </em>which allows you to define that the values of two different fields must be the same (for example, password and passwordConfirmation) and <em>RemoteAttribute </em>which allows you to have complex validation rules executed on the client. In practice, you can define a controller and action which is executed by an AJAX call.</p>
<p>ScottGu explains the basics pretty well: <a title="http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx" href="http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx">http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx</a>.</p>
<h2>Unobtrusive client validation</h2>
<p>ScottGu’s example uses Microsoft’s own validation framework (MicrosoftMvcValidation.js) but in ASP.NET MVC 3 Microsoft allows us to use jQuery Validate and has implemented a nice addition on top of that. Brad Wilson posted a nice article about enabling unobtrusive validation: <a title="http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html" href="http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html">http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html</a>.</p>
<h2>Extending the validation</h2>
<p>It’s likely that sooner or later you find yourself having a custom validation rule that is not available in the previously mentioned framework. Most probably you’ll be missing the attribute on server side as jQuery Validate plugin actually contains a lot more validation methods than .NET Framework’s attributes represent, for example email validation for which the support is implemented below. You can find the list of all supported validation rules on the <a href="http://docs.jquery.com/Plugins/Validation#List_of_built-in_Validation_methods">jQuery Validate’s documentation</a>.</p>
<h3>Custom attribute</h3>
<p>It turns out that implementing a custom attribute is really an easy task. You implement your own class that inherits <em>System.ComponentModel.DataAnnotations.ValidationAttribute</em> and implements <em>System.Web.Mvc.IClientValidatable</em>. So you need to do three things.</p>
<p>1) Override <em>public bool IsValid(object value)</em>    <br />This method will be run when the validation is done on the server (for example, if the client does not have javascript enabled). This is all you need to do if you don’t need client validation.</p>
<p>2) Create a class that inherits from <em>ModelClientValidationRule</em>. This is usually very simple. Here’s an example how to enable email validation on the client:<span class="kwrd"> </span></p>
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ModelClientValidationEmailRule : ModelClientValidationRule
{
    <span class="kwrd">public</span> ModelClientValidationEmailRule(<span class="kwrd">string</span> errorMessage)
    {
        <span class="kwrd">base</span>.ErrorMessage = errorMessage;
        <span class="kwrd">base</span>.ValidationType = <span class="str">&quot;email&quot;</span>;
    }
}</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } -->3) Implement <em>public IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)</em></p>
<p>This is also usually very easy to implement, here’s the example on email validation:</p>
<pre class="csharpcode"><span class="kwrd">public</span> IEnumerable&lt;ModelClientValidationRule&gt; GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    <span class="kwrd">yield</span> <span class="kwrd">return</span> <span class="kwrd">new</span> ModelClientValidationEmailRule(FormatErrorMessage(metadata.GetDisplayName()));
}</pre>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } -->This is all you need do to write your own attribute to enable validation using the readymade validation rules on jQuery Validate plugin. But there will be times when you invent new ways to do validation on client so you’ll need to write your own validation method for jQuery Validate.</p>
<h3>Custom client validator</h3>
<p>As you can guess, custom validators are not that hard to implement either. In the simple case (your validator doesn’t have any parameters) here’s all you need:</p>
<pre class="csharpcode">(<span class="kwrd">function</span> ($) {
    $.validator.addMethod(
        <span class="str">&quot;your-method-name&quot;</span>,
        <span class="kwrd">function</span> (value, element) {
            <span class="kwrd">return</span> (!value &amp;&amp; <span class="kwrd">this</span>.optional(element)) || <span class="rem">/*place your validation logic here*/</span>;
        },
        <span class="str">&quot;your own error message&quot;</span>);
    $.validator.unobtrusive.adapters.addBool(<span class="str">&quot;your-method-name&quot;</span>);
} (jQuery));</pre>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } -->And to use this, you need to write your own custom attribute (and when implementing the <em>ModelClientValidationRule</em>, you need to set <em>base.ValidationType = “your-method-name”</em>).</p>
<p>NOTE: Usually it is good practice to first check whether the input is empty and whether the element is not marked as required. Otherwise using your own validator would also make the field required which is unexpected. The same applies to implementing server-side attribute’s <em>IsValid</em> method.</p>
<h2>Conclusion and FAQ</h2>
<p>This way we have a single solution for performing validation both on the client and on the server, and the usage of HTML 5 (yay!!!) data attributes for this kind of tasks is simply beautiful.</p>
<p>Q1: I have everything set up, but I still don’t get the validation happening on the client, it still goes to the server everytime.<br />
  <br />A1.1: You do not have client validation enabled. Check that you have the following values on your web.config:</p>
<p><span class="kwrd"></span></p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">appSettings</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">=&quot;ClientValidationEnabled&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;true&quot;</span> <span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">add</span> <span class="attr">key</span><span class="kwrd">=&quot;UnobtrusiveJavaScriptEnabled&quot;</span> <span class="attr">value</span><span class="kwrd">=&quot;true&quot;</span> <span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">appSettings</span><span class="kwrd">&gt;</span></pre>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } -->A1.2: You do not have the required javascript libraries loaded. You need to have jquery, jquery.validate and jquery.validate.unobtrusive included on your page.</p>
<pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">src</span><span class="kwrd">=&quot;/Scripts/jquery-1.4.3.min.js&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;text/javascript&quot;</span> <span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">src</span><span class="kwrd">=&quot;/Scripts/jquery.validate.min.js&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;text/javascript&quot;</span><span class="kwrd">/&gt;</span>
<span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">src</span><span class="kwrd">=&quot;/Scripts/jquery.validate.unobtrusive.min.js&quot;</span> <span class="attr">type</span><span class="kwrd">=&quot;text/javascript&quot;</span><span class="kwrd">/&gt;</span></pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p><!-- .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: Consolas,"Courier New",Courier,Monospace; background-color: rgb(255, 255, 255); }.csharpcode pre { margin: 0em; }.csharpcode .rem { color: rgb(0, 128, 0); }.csharpcode .kwrd { color: rgb(0, 0, 255); }.csharpcode .str { color: rgb(0, 96, 128); }.csharpcode .op { color: rgb(0, 0, 192); }.csharpcode .preproc { color: rgb(204, 102, 51); }.csharpcode .asp { background-color: rgb(255, 255, 0); }.csharpcode .html { color: rgb(128, 0, 0); }.csharpcode .attr { color: rgb(255, 0, 0); }.csharpcode .alt { background-color: rgb(244, 244, 244); width: 100%; margin: 0em; }.csharpcode .lnum { color: rgb(96, 96, 96); } --></p>
<p>Q2: I have validation rules that I cannot express by static attributes. How to use more complex validation rules?<br />
  <br />A2: On your action method you can have arbitrary validation logic. To put the error messages into the same output system, use <em>ModelState.AddModelError(&quot;&lt;fieldname&gt;&quot;, &quot;ErrorMessage&quot;);</em></p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/11/29/unobtrusive-client-validation-in-asp-net-mvc-3/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Blocked file madness in Windows 7</title>
		<link>http://samipoimala.com/it/2010/10/25/blocked-file-madness-in-windows-7/</link>
		<comments>http://samipoimala.com/it/2010/10/25/blocked-file-madness-in-windows-7/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 12:15:20 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[reflector]]></category>
		<category><![CDATA[unblock file]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=118</guid>
		<description><![CDATA[Some time ago Rytmis wrote about Windows Vista&#8217;s annoying security feature. I had similar-looking problem with blocked files, but the solution was a bit different. Specifically, I was trying to use .NET Reflector Pro&#8217;s Visual Studio add-in. I enabled Visual Studio integration from Reflector (Tools-&#62;Integration Options -&#62; Visual Studio 2010) and all was good. However, [...]]]></description>
			<content:encoded><![CDATA[<p>Some time ago <a href="http://blog.rytmis.net/">Rytmis</a> wrote about <a href="http://blog.rytmis.net/2009/01/putty-vista-and-annoying-security.html">Windows Vista&#8217;s annoying security feature</a>. I had similar-looking problem with blocked files, but the solution was a bit different. Specifically, I was trying to use <a href="http://www.red-gate.com/products/reflector/">.NET Reflector</a> Pro&#8217;s Visual Studio add-in. I enabled Visual Studio integration from Reflector (Tools-&gt;Integration Options -&gt; Visual Studio 2010) and all was good. However, when restarting Visual Studio I got an error message that .NET Reflector add-in cannot be loaded (of course, without any meaningful error message). It was easy to guess that this has something to do with files downloaded from the internet.<span id="more-118"></span>But I encountered an interesting nuisance: unblocking the addin.dll seemed to work quite right, but when looked another time, the file still seems to be blocked! As per Rytmis&#8217; suggestion, I thought &#8220;yay, I need to unblock the file in it&#8217;s original download location&#8221;. But wait a minute, as you know Reflector comes as a zip file and I can&#8217;t unblock a file inside a zip file, can I? The solution is of course as easy as it is distracting: you need to unblock the whole zip file! After doing this the files are all unblocked no matter where do you extract the archive.</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/10/25/blocked-file-madness-in-windows-7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>And to our own beat march we will</title>
		<link>http://samipoimala.com/it/2010/08/16/and-to-our-own-beat-march-we-will/</link>
		<comments>http://samipoimala.com/it/2010/08/16/and-to-our-own-beat-march-we-will/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 07:59:48 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Offbeat]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=110</guid>
		<description><![CDATA[Previously I told that we are about to start a new business. Now that the company has got it&#8217;s name approved and entered all the official records, we are proud to announce that we will operate under the name OFFBEAT SOLUTIONS. Lauri has posted a nice explanation on what lies beyond the name. The actual [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://samipoimala.com/it/2010/08/12/okay-its-now-storm-after-the-silence/">Previously I told</a> that we are about to start a new business. Now that the company has got it&#8217;s name approved and entered all the official records, we are proud to announce that we will operate under the name OFFBEAT SOLUTIONS. Lauri has posted a nice explanation on <a href="http://blog.rytmis.net/2010/08/whats-in-name.html">what lies beyond the name</a>.</p>
<p>The actual operation will begin 30.8.2010. If you want to be the first who will enjoy our march&#8230;. <a href="mailto:info@offbeat.fi">info@offbeat.fi</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/08/16/and-to-our-own-beat-march-we-will/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Okay, it’s now storm after the silence</title>
		<link>http://samipoimala.com/it/2010/08/12/okay-its-now-storm-after-the-silence/</link>
		<comments>http://samipoimala.com/it/2010/08/12/okay-its-now-storm-after-the-silence/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 12:25:54 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Offbeat]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=106</guid>
		<description><![CDATA[It&#8217;s has been a bit quiet lately. I&#8217;ve obviously had something more important to do than write some blog posts. Here comes the explanation. Now, after being an employee for dozen years, it has come time to move on and start as an entrepreneur. This is a huge step for me, and it all will [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s has been a bit quiet lately. I&#8217;ve obviously had something more important to do than write some blog posts. Here comes the explanation.<span id="more-106"></span> Now, after being an employee for dozen years, it has come time to move on and start as an entrepreneur. This is a huge step for me, and it all will start in the beginning of september. Here&#8217;s some quick info about the future:</p>
<ul>
<li>The services and products we will provide will surely have something to do with .NET, agile and conscious development</li>
<li>We are four people together: <a href="http://www.heikniemi.net/hardcoded/">Jouni</a>, <a href="http://www.linkedin.com/profile?viewProfile=&amp;key=7315383">Riikka </a>and <a href="http://www.rytmis.net">Lauri</a>.</li>
<li>The company name still remains to be seen</li>
</ul>
<p>More info about the company and services will follow soon, now it is time to find some clients and get the old job finished. We are living interesting times!</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/08/12/okay-its-now-storm-after-the-silence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iterations and increments explained</title>
		<link>http://samipoimala.com/it/2010/04/16/iterations-and-increments-explained/</link>
		<comments>http://samipoimala.com/it/2010/04/16/iterations-and-increments-explained/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 12:41:17 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Conscious development]]></category>
		<category><![CDATA[Increment]]></category>
		<category><![CDATA[Iteration]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Sprint]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=95</guid>
		<description><![CDATA[These days many people talk and write about iterative and incremental development and most often those terms are used inter-changeably. Some people, specifically Scrum folks, even use the term sprint. Agile software development methods are said to be BOTH iterative and incremental. So what does it mean? Iterative development Wikipedia has the definitive explanation on [...]]]></description>
			<content:encoded><![CDATA[<p>These days many people talk and write about iterative and incremental development and most often those terms are used inter-changeably. Some people, specifically Scrum folks, even use the term <em>sprint</em>. Agile software development methods are said to be BOTH iterative and incremental. So what does it mean?</p>
<p><span id="more-95"></span><br />
<strong>Iterative development</strong></p>
<p>Wikipedia has the definitive explanation on what it means to iterate:</p>
<blockquote><p>Iteration means the act of repeating a process usually with the aim of approaching a desired goal or target or result. Each repetition of the process is also called an &#8220;iteration&#8221;, and the results of one iteration are used as the starting point for the next iteration.</p></blockquote>
<p>In software development the desired goal is of course a shippable software product. So instead of having a big bang one-shot release (as known from waterfall process) the development team comes up with one version, which is immediately iterated into next version. The product is <em>ready</em> as soon as the product reaches good-enough quality level.</p>
<p>Iterative development is good for providing rapid feedback from users, but it&#8217;s weakness is that the whole product must be taken into production in one shot. The whole product is iterated all the time. (This of course is in the purest iterative, non-incremental case)</p>
<p><strong>Incremental development</strong></p>
<p>Let&#8217;s again borrow the definition from Wikipedia:</p>
<blockquote><p>Incrementalism is a method of working by adding to a project using many small, incremental changes instead of a few (extensively planned) large jumps.</p></blockquote>
<p>So what this means is that incremental is what has been called <em>staged delivery</em> for decades. It means you develop one part of the system and when it&#8217;s ready you develop the next part. In the purest version, you can first make the analysis and design, then develop first increment then develop the next increment and so on as long as all the features are developed.</p>
<p><strong>The difference and the synergy</strong></p>
<p>The elevator pitch for iterative and incremental development goes like this: iterative means making better something that has been done earlier and incremental means adding new features on top of what has been done before. These two ideas can be used without each other (as shown earlier) but they can be used together as well &#8211; which is actually a Very Good Idea as it turns out.</p>
<div id="attachment_96" class="wp-caption alignright" style="width: 307px"><a href="http://samipoimala.com/it/files/2010/04/iterative_incremental.png"><img class="size-medium wp-image-96 " title="Iterative and incremental" src="http://samipoimala.com/it/files/2010/04/iterative_incremental-297x300.png" alt="" width="297" height="300" /></a><p class="wp-caption-text">Iterative-incremental method space</p></div>
<p><strong>Alternative view on iterativeness and incrementalism</strong></p>
<p>As incremental development goes through all the phases of development (analysis, testing, development, design, integration, production) it is a perfect tool to expose all problems in the process. Should the integration be difficult, using incremental process you&#8217;ll face it early and repeat it many times so you&#8217;ll have to fix the problem, not postpone it into the end of the project (when you&#8217;ll be already late).</p>
<p>Iterative process means rework on the existing product, so it doesn&#8217;t help that much on the process-side, but it makes the product better. Usually agile teams first come up with a <em>walking skeleton</em> which is an end-to-end solution to the problem but may miss some features. So after getting feedback from customer the skeleton is iterated into next version by adding some muscles onto it.</p>
<p>So we could state that:<br />
- incrementalism improves the process<br />
- iterativity improves the product</p>
<p><strong>Enter agile</strong></p>
<p>So agile methods are said to be both iterative AND incremental. As we learned from previous chapters they are different things and actually we can think of them orthogonal axes in the method space (see picture). Plain waterfall is non-iterative, non-incremental process (have you seen such in reality?) so it is in the lowest left corner. The good-old staged delivery is incremental but not iterative so it is in the lowest right corner.</p>
<div class="mceTemp">
<p>However, spiral model is highly iterative but not at all incremental so it is in upper left corner. Thus the last corner, upper right, is reserved for agile methods. I&#8217;ve drawn it as an area, not a point because there is not just one agile process but many different flavors. The process must be in that area to be agile by definition but the amount of iterativity and incrementalness can vary. This is actually one of the key questions when architecting the process for any given project.</p>
<div id="attachment_101" class="wp-caption alignright" style="width: 310px"><a href="http://samipoimala.com/it/files/2010/04/iteration_increment_sprint.png"><img class="size-medium wp-image-101 " title="Sprint, increments and iterations" src="http://samipoimala.com/it/files/2010/04/iteration_increment_sprint-300x187.png" alt="" width="300" height="187" /></a><p class="wp-caption-text">Sprint, increments and iterations</p></div>
<p><strong>What is a sprint anyway?</strong></p>
<p>In Scrum we use the term sprint. What does it mean, is it an iteration or an increment? The term <em>sprint</em> is merely a fixed timebox, and Scrum doesn&#8217;t care whether you are iterating or incrementing your project. Most scrum teams keeps doing both types of work in any given sprint.</p>
<p>A good pattern is to think of it this way: the sprint is one increment in which you do all the activities you need to, from analysis to deployment. Think of it as a release. Inside a release it is good idea to have a few iterations &#8211; or internal releases &#8211; to make sure your increment will meet the requirements of your customer who will be analyzing your work in the sprint review.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/04/16/iterations-and-increments-explained/feed/</wfw:commentRss>
		<slash:comments>49</slash:comments>
		</item>
		<item>
		<title>.NET Framework will be renamed</title>
		<link>http://samipoimala.com/it/2010/04/01/net-framework-will-be-renamed/</link>
		<comments>http://samipoimala.com/it/2010/04/01/net-framework-will-be-renamed/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 21:05:10 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=92</guid>
		<description><![CDATA[Many of Microsoft&#8217;s technologies have been renamed to be consistent with each other and to form uniform product lines. Most of the base technologies are called foundation technologies. A rush at that arena was at the launch of .NET Framework 3.0. Then was released the new user interface technology Windows Presentation Foundation (WPF), formerly known [...]]]></description>
			<content:encoded><![CDATA[<p>Many of Microsoft&#8217;s technologies have been renamed to be consistent with each other and to form uniform product lines. Most of the base technologies are called <em>foundation</em> technologies. A rush at that arena was at the launch of .NET Framework 3.0. Then was released the new user interface technology <em>Windows Presentation Foundation</em> (WPF), formerly known as Avalon; the new model for distributed programming <em>Windows Communication Foundation</em> (WCF), formerly known an Indigo and the underlying technology for all new workflow applications, <em>Workflow Foundation</em> (which was then called WWF, but the official acronym is now WF).</p>
<p>Now, at the release of Sharepoint 2010, the lite version formerly known as Windows Sharepoint Services, will be renamed to Sharepoint Foundation.</p>
<p>Finally, the naming of these fundamental technologies will achieve it&#8217;s closure: The programming framework and paradigm that we originally called <em>Lightning</em>, was released under the name <strong>.NET Framework</strong>. Now, at the release of version 4.0 the framework will also be renamed to conform to this naming convention and as expected, the new name will be <strong>Windows Technology Foundation</strong>. To celebrate this remarkable milestone, Microsoft has acquired the <a href="http://www.thedailywtf.com">well known site </a>and will continue to bring daily news about all WTF technologies.</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/04/01/net-framework-will-be-renamed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>What&#8217;s wrong with typical resourcing</title>
		<link>http://samipoimala.com/it/2010/03/18/whats-wrong-with-typical-resourcing/</link>
		<comments>http://samipoimala.com/it/2010/03/18/whats-wrong-with-typical-resourcing/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 22:12:15 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Conscious development]]></category>
		<category><![CDATA[Project work]]></category>
		<category><![CDATA[peopleware]]></category>
		<category><![CDATA[teamwork]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=87</guid>
		<description><![CDATA[Oftentimes people are assigned into projects by looking into resource pools and determining some key characteristics of each resource: what is the current utilization rate, what do reservation calendars look like and on some more sophisticated scenarios, also each person’s skill sets are taken into consideration. But this model is far from ideal for numerous [...]]]></description>
			<content:encoded><![CDATA[<p>Oftentimes people are assigned into projects by looking into <em>resource pools</em> and determining some key characteristics of each resource: what is the current utilization rate, what do reservation calendars look like and on some more sophisticated scenarios, also each person’s skill sets are taken into consideration. But this model is far from ideal for numerous reasons.<span id="more-87"></span></p>
<p><strong>Skill sets</strong></p>
<p>First of all, the skill sets that really are taken into consideration, are mostly technological. Like &#8220;Sally is a java programmer, Joe is database administrator specializing on Oracle and Harry is a tester while Sophia is a UI designer&#8221;. Someone has somehow calculated how many units of each resource type project needs and thus a project team is formed.</p>
<p>This model doesn&#8217;t take into account what kind of personality types the specific project needs. Should we take Sally the java programmer who is not comfortable with iterating but usually produces error-free code from decent design, or Scott the java programmer who is at his best at trying different things out but doesn&#8217;t want to wait for design to be finished? Should we take Sophia the UI designer, who is considered more senior and competent on her own but is unable to work with customers or should we take Chris the UI designer who shines with customers but who often gets to argue with other team members?</p>
<p>Furthermore, this model completely ignores the fact that a team is more than the sum of it’s parts. A team may vastly benefit from a person who is complete junior on every technological aspect but really makes the people work as a team.</p>
<p>If these decisions are not made consciously, the project will most probably meet unexpected challenges in getting into working effectively.</p>
<p><strong>Productivity differences</strong></p>
<p>In any given resource pool you have many people with similar skill sets. Are each of them similarly productive? We have significant evidence that between two programmers there can be 20-time (the multiplier varies from 10 to as far as 50 on different studies) difference in their productivity. Do you know the productivity characteristics of each member on your resource pools?</p>
<p><strong>Team is more than a group of people</strong></p>
<p>By assigning project teams merely resourcing each member from their respective pools you do not get an actual <em>team</em>. Instead you&#8217;ll just put up a group of people who are not enjoying the empowering effects of a well-working team. A team in which every member knows each other will have productivity that is far more than the sum of its each individual member.</p>
<p>Teams are not something that any single person can mandate to exists: a group of people decides to work as a team or the do not. Finally, if you happen to come up with a jelling team, resource pooling often breaks each team after every project. So you’ll face the team building phase on every project. It’s not the most efficient way of working.</p>
<p><strong>So what to do about it?</strong><strong></strong></p>
<p>1)       Forget resources</p>
<p>The first step into the right direction is to quit speaking of people as <em>resources</em>. Considering people as resources proposes the usage of <em>resource pools</em> and ignores the notion of a well-functioning team. Instead of focusing on setting up resource pools and optimizing individual utilization we should focus on building highly efficient teams that are capable of organizing themselves at all times. Teams should be big enough to allow assigning the best person to any given task but small enough so that the number of communication channels does not overwhelm the benefits of people knowing each other.</p>
<p>2)      Consider organizational structure</p>
<p>Do you have your workforce organized by functional expertise? Project management team, UI design team and development team, database team and testing team? This grouping doesn’t encourage self-organization and introduces many possible bottlenecks to your workflow. People working together should stay together and have a common organizatory goal.</p>
<p>3)      Let teams build themselves</p>
<p>A jelling team can typically consist of 10 or less people. Bigger than that and the communication channels get far too many and the diversity of the persons get in the way of efficient collaboration. You may have organization units that are bigger, but inside units you may have more teams. If you as a unit manager see some people getting along especially well, why not letting them work together as a team?</p>
<p>4)      Emphasize specializing generalists, not pure specialists</p>
<p>Each person who has strictly limited expertise is a bottleneck to productivity. Specialists need a well-defined role, they need a project that can use a specialist of his profession. When your people are capable, and willing, to act on a multitude of roles, your staffing problems get a lot easier.</p>
<p>A group of specialists can make – and usually do &#8211; products in which any given area is crafted well, but the product as a whole doesn’t work at all. To make anything remarkable you need a group of people who understand what others are doing, people who understand the product as a whole.</p>
<p>Surely you need the <em>specializing</em> part, too. A group of pure generalists will surely do something that works somehow, but it won’t shine on any aspect. The optimal situation is having a team full of generalists, each of which could carry any role in the project, but where each has her own specialty on top of good general knowledge.</p>
<p>=&gt;  Sami’s first law of productivity: Productivity is directly proportional to the amount of overlap in team members’ skill-area / expertise-level –space.</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/03/18/whats-wrong-with-typical-resourcing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What is your inner story?</title>
		<link>http://samipoimala.com/it/2010/01/09/what-is-your-inner-story/</link>
		<comments>http://samipoimala.com/it/2010/01/09/what-is-your-inner-story/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 13:18:58 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Conscious development]]></category>
		<category><![CDATA[Project work]]></category>
		<category><![CDATA[philosophy]]></category>
		<category><![CDATA[teamwork]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/?p=83</guid>
		<description><![CDATA[Behind every person is an inner story. A story that describes her world-view and thus her behaviour. The story may not be consciously written but silently adopted – and adapted &#8211; from local contemporary culture, childhood, genes and so on. All the books you read and stories you heard contributed to your story. But there [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rebelzen.com/2008/07/ego-and-the-inner-story/">Behind every person is an inner story</a>. A story that describes her world-view and thus her behaviour. The story may not be consciously written but silently adopted – and adapted &#8211; from local contemporary culture, childhood, genes and so on. All the books you read and stories you heard contributed to your story.</p>
<p>But there are sub-stories also. <a href="http://www.ratical.org/co-globalize/MaeWanHo/future.pdf">In physics we have had Newtonian and Einsteinian stories</a>, and these <a href="http://ozpk.tripod.com/para">stories constantly change</a>. In this post I urge you to think what are your stories of software development. There are at least three different types of stories that define you as a software developer.<br />
<span id="more-83"></span></p>
<h3>What is software development at very high level -story</h3>
<p>In the last decades of software development we have not been in lack of paradigms to choose from. Many have come, many have gone. And I agree, <a href="http://www.ddj.com/embedded/187002099">we still are trapped in nonfunctional paradigms</a>. Here are a few different paradigms that Alistair Cockburn pointed out:<br />
<img title="Image51-.gif" src="http://alistair.cockburn.us/get/2350" alt="Image51-.gif" /></p>
<p>Of course, these are a bit philosophical paradigms from methodologists and as such do not define very strictly how you will behave in every situation. But it is a foundation on top of which the other stories build. Do you have a different metaphor for software development that describes your style better? Let me know!</p>
<h3>What is a software project –story</h3>
<p>This is the type of story that has caused most <em>process wars</em>, manifestos to be written, different schools of thought to be born and continuous flux on the science side.</p>
<h4>Educated 90´s software development</h4>
<p>Perhaps the most common story is what was teached at school in the 90´s, being a mixture of Meyer´s engineering, Humphrey´s discipline and Jacobson´s model building. This most often resulted in the traditional waterfall-development in which each activity is carried out sequentially by specialists of each phase.</p>
<p>This story encourages for big, upfront design, comprehensive documentation and project management as a separate task. And testing postponed to the end of the project.</p>
<h4>Software project is a collaborative game</h4>
<p>In many parts, this is the original way of writing software – that is doing an reincarnation in the names of lighter-weight methodologies. You basically take a cross-functional team (preferably small) of people and trust them to get the job done. This philosophy is behind the many <em>agile methods</em> that coming with varying set of practices, principles and rules on the game.</p>
<p>Usually this story comes with iterations, incremental development, continuous integration, behavior driven design and test driven development etc.</p>
<p>Alistair Cockburn has even composed a <a href="http://alistair.cockburn.us/Cooperative+game+manifesto+for+software+development">manifesto</a> for this style:</p>
<blockquote><p>“Software development is a (series of) cooperative game(s), in which people use markers and props to inform, remind and inspire themselves and each other in getting to the next move in the game. The endpoint of the game is an operating software system; the residue of the game is a set of markers to inform and assist the players of the next game. The next game is the alteration or replacement of the system, or creation of a neighboring system.”</p></blockquote>
<h4>Cowboys on the desert</h4>
<p>In practice, many software teams are not willing – or capable of – carrying out monstrous project framework and processes that 90´s style requires. Further, they do not have the discipline neither responsibility that collaborative game needs. Instead they work like cowboys on an unknown land: without any idea where to go, they take each confronting sack, changing direction continuously and ultimately ending somewhere leaving a disastrous mess behind.</p>
<p>In software terms this means that there is a bunch of individuals who are not collaborating fluently, requirements drop unexpectedly from customer and there´s virtually no communication between the customer and developing team except what is absolutely required to hand off the requirements and at the end, deploying some piece of somehow working software.</p>
<p>Requirements change wildly and they are implemented right away without thinking the architecture and keeping the code clean.</p>
<h4>Systems thinking</h4>
<p>Some go as far as saying you should not have projects at all, but think development artifacts as products. Usually projects have up-front funding, scope fixed at the beginning and success is measured in terms of meeting the scope in given time at given cost. What´s worse, the team is often disbanded and each member goes on to new projects. A new team will step in and take care of the maintenance.</p>
<p>Alternatively, in systems thinking the development is funded incrementally, scope is expected to evolve along the way and success is measured in terms of market share and profitability. The same development team often stays with product.</p>
<h3>What am I as a developer –story</h3>
<p>Finally, after each person´s beliefs about development in general and reckoning about projects (or products) each still has a different attitude towards his work</p>
<h4>Stonecutters, living earners and cathedral builders</h4>
<p>There´s is a great story about three stonecutters in <em>Kitchen Table Wisdom.</em></p>
<blockquote><p>It’s a story offered by psychologist Roberto Assagioli, who tells of a man who goes to interview three stonecutters engaged in building a very large cathedral. When he asks the first stonecutter what he is doing, the man bitterly replies that he is cutting stones into blocks, a foot by a foot by three quarters of a foot. With frustration, he describes a life in which he has done this over and over, and expects to continue to do so until he dies.</p>
<p>The second stonecutter also says that he is cutting stones into blocks, a foot by a foot by three quarters of a foot, but he adds an important piece. He lets the man know that he is earning a living for his family; through his work his children will have clothes to keep them warm and food for them to grow strong, and that he and his wife will be able to maintain their home, which they built with so much love.</p>
<p>But it is the third man’s response that astounds the interviewer. In an enthusiastic voice, he tells the man how joyous and grateful he is to have the privilege of building a great cathedral, so strong that it will stand as a holy beacon for a thousand years.</p>
<p><a title="http://clf.uua.org/quest/2008/12/janamanchi.html" href="http://clf.uua.org/quest/2008/12/janamanchi.html">http://clf.uua.org/quest/2008/12/janamanchi.html</a></p></blockquote>
<p>Are you just typing some freakin´ code, putting up darned CSS styles, &lt;put here your current day-to-day activity&gt; or are you part of  team who is building an exciting new product? Or are you just doing whatever you´re told to do so that you can feed your kids? When you are annoyed by your job what do you do? Complain about it? Ignore it? Fix the problem?</p>
<h4>Technology lovers, tool blamers and superheroes</h4>
<p>Besides the overall attitude to your work there are some characterizing ministories that you may have absorbed.</p>
<p>Are you a superhero that often works night´n´days, sacrificing your own life because “it´s the only way to save the project”. Do you think the other people on your team are inferior and you are the only competent guy?</p>
<p>Or do you think that you and your team are perfectly competent and suitable for the project – except that the <a href="http://thedailywtf.com/Articles/Tool_Blame.aspx">tools are always wrong</a>. Be it the operating system, version control software, time-tracking software, internet browser… You are doing your job perfectly but the tool just prevents you to be productive. And there is nothing you can do about it.</p>
<p>You may also have fallen in love with technology. Be it all the new technology in general or any given brand that has dazzled you. Anything you think is from the point of view of the newest technology.</p>
<h4>Different types of developers</h4>
<p>Alex Love has written a nice overview of <a href="http://blog.lowesoftware.com/software-development/types-of-software-developers-what-are-you">different types of developers</a>. Do you recognize one of the types to describe yourself?</p>
<h3>Afterthoughts</h3>
<p>While it may be hard to find a single story that works for you all the times, it´s important to understand your own way of thinking. Equally important is to understand the stories that your team mates carry with them. Conscious team leaders make up teams that consist of people with compatible inner stories.</p>
<p>Have you noticed different types of stories that define software developers? Feedback is welcome!</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2010/01/09/what-is-your-inner-story/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>The essence of smart methodology is bridging the gaps</title>
		<link>http://samipoimala.com/it/2009/12/15/the-essence-of-smart-methodology-is-bridging-the-gaps/</link>
		<comments>http://samipoimala.com/it/2009/12/15/the-essence-of-smart-methodology-is-bridging-the-gaps/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 18:57:03 +0000</pubDate>
		<dc:creator>Sami Poimala</dc:creator>
				<category><![CDATA[Conscious development]]></category>
		<category><![CDATA[teamwork]]></category>

		<guid isPermaLink="false">http://samipoimala.com/it/2009/12/15/the-essence-of-smart-methodology-is-bridging-the-gaps/</guid>
		<description><![CDATA[Listening to Ivar Jacobson’s talk about closing the gap between business and IT gave me an idea, what software development methodologies are all about. During the 50 years of software development we have seen a plethora of software development methods. Every ten years comes a new methodology, a new solution, to the same old problems [...]]]></description>
			<content:encoded><![CDATA[<p>Listening to Ivar Jacobson’s talk about <a href="http://ivarblog.com/2009/11/17/closing-the-gap-between-business-and-it/">closing the gap between business and IT</a> gave me an idea, what software development methodologies are all about.</p>
<p>During the 50 years of software development we have seen a plethora of software development methods. Every ten years comes a new methodology, a new solution, to the same old problems we have been fighting for the whole 50 years. And will be fighting, dare I say, the next 50 years. One weapon used in the war is <em>development methodologies</em>. But what really is the essence of a methodology?</p>
<p> <span id="more-81"></span><br />
<h3>A lone coder</h3>
<p>Imagine you are developing software alone for yourself. You know perfectly well, WHAT it is you want to achieve. You are effectively a business analyst. Also, you alone specify HOW you are going to implement the software. Naturally you write the code and test the solution yourself.</p>
<p>I bet anyone who has wrote any non-trivial software for himself, did find some opportunities to make the software better than originally thought. When you work alone it’s usually not a problem, you change your mind and are happy with that. </p>
<p>You don’t need much ceremony for this to work.</p>
<h3>Enter external client</h3>
<p>Things get a lot more difficult when another person comes into the game. Especially if the other guy is your client who is going to tell you WHAT to do.</p>
<p>When two or more people work together (you are working together, aren’t you?) they need a way to coordinate their work, share knowledge and find a way to make decisions. </p>
<p>This comes extremely important when you need to agree on WHAT to build.</p>
<h3>Bigger team, more roles</h3>
<p>Usually as one person turns to an organization and projects grow bigger, more roles become involved in the game. Most often first person to enter is an hybrid of project manager and analyst taking care of the client and telling the developer WHAT to do. What effectively occurs, is more loss of information (according to many studies ca. 50% of information gets lost on a handoff).</p>
<p>Next people to come into an project are architects, designers (telling developer HOW to do) and testers (trying to validate whether the developers did what the analyst told them to do, no matter is it what the client wants, no matter was it done how designer thought). More coders. More clients with conflicting ideas on WHAT to do. More problems. Many methodologies have been born to solve these questions, many theories about teamwork have existed many decades, so we are perfectly suited for a successful project?</p>
<p>Each new person presents new demands for the development methodology.</p>
<h3>And the ultimate question is…</h3>
<p>So now we have a team of people (without going into discussion on what is the essence of a team) consisting of many specialists perfectly suited to do their own craft. And the team has a client who has a business process to be improved using software. The only remaining problem is that the team should produce what the client needs. And it needs answering the ultimate question WHY. Why is the software being developed? Why is client asking for what she asks? Why is designer proposing a given solution?</p>
<p>To answer that question (and also to further specify the WHAT) business processes are modeled and various diagrams are drawn. </p>
<h3>The problem</h3>
<p>Developers have their own methods, business has it’s own methods and IT operations has it’s own methods. Unluckily, there’s very little common ground between the different stakeholders. There are huge gaps between the different sides. And after a few thoughts, we find that our specialists-driven team has also many gaps: designer doesn’t understand what each decision means development-wise, developer doesn’t understand the UI designer etc.</p>
<p>We need something to help us bridge the gap or even better, remove them totally.</p>
<h3>The solution</h3>
<p>Each project has it’s very own characteristics: it has a unique combination of skills, unique value definitions, unique scheduling, unique state of the world and – what’s most important – unique human beings. This means that the project needs to find a way to work effectively together under these unique circumstances.</p>
<p>I have written before on <a href="http://samipoimala.com/it/2009/09/30/multi-competence-required-today/">cross-functional teams</a>. But it doesn’t stop on the software development team. We need a cross-functional <em>business development team</em>. Most software is written because of business change, and as business changes continuously, so do software.</p>
<p>For any project to succeed it needs all the stakeholders speaking the same language, sharing objectives, collaboration, building trust and enabling business agility. Real methodologies always try to find practices that bridge the gaps between end users and client, between client and analyst, between members of development team etc.</p>
<p><em>“The essence of Lean is thinking in context”</em> someone said. I couldn’t agree more. Thinking in context is the very essence of software development. We have come too far in determining readymade methodologies. Think in context, define your own methodology for your project and bridge the gaps.</p>
<h3>Afterthought</h3>
<p>A football team consists of highly trained specialists. They have goalkeeper, defensemen, middle-field and the forwards. Each one is focusing primarily on his role. What is the difference between a football team and a typical software development team? Each member on a football team know how to play football! Every single player can kick the ball, they know the strategy, the are able to serve the ball, they know how to tackle the opponent etc.</p>
<p>Typically on a software development team you find testers who can’t write code, you have designers who can’t write code, you have coders who know nothing about user interfaces (or even the users…). Why is that?</p>
]]></content:encoded>
			<wfw:commentRss>http://samipoimala.com/it/2009/12/15/the-essence-of-smart-methodology-is-bridging-the-gaps/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

