<?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>Sober Counsel &#187; Smart Client</title>
	<atom:link href="http://www.sobercounsel.com/tag/smart-client/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sobercounsel.com</link>
	<description>The Philosophy of IT</description>
	<lastBuildDate>Tue, 29 Nov 2011 09:31:27 +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>Software Factories: Part 4 &#8211; Measuring Outcomes</title>
		<link>http://www.sobercounsel.com/2011/09/06/software-factories-part-4-implementation-guidelines/</link>
		<comments>http://www.sobercounsel.com/2011/09/06/software-factories-part-4-implementation-guidelines/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 17:36:26 +0000</pubDate>
		<dc:creator>Malcolm Mac Donald</dc:creator>
				<category><![CDATA[Management]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[Strategy]]></category>
		<category><![CDATA[Smart Client]]></category>
		<category><![CDATA[Software Factory]]></category>

		<guid isPermaLink="false">http://www.sobercounsel.com/?p=39</guid>
		<description><![CDATA[One of the difficulties with implementing a software factory is measuring development-team performance. Depending on the culture of the team, and the desired outcomes for your team, the approach may be fundamentally different, but here is an approach I have &#8230; <a href="http://www.sobercounsel.com/2011/09/06/software-factories-part-4-implementation-guidelines/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>One of the difficulties with implementing a software factory is measuring development-team performance. Depending on the culture of the team, and the desired outcomes for your team, the approach may be fundamentally different, but here is an approach I have implemented, that I believe is fairly unique in a corporate environment.</p>
<p><span id="more-39"></span></p>
<p>My Objectives were:</p>
<ul>
<li>To change the culture from one that was inward-looking (every problem is solved by writing some code) to one that considered external commercial or Open Source solutions (a problem can be solved in many different ways).</li>
<li>To reward outcomes rather than inputs, i.e. the primary concern is that the project objectives, the deadlines and the architectural principles and standards were all met.</li>
<li>To allow developers some freedom to choose their projects</li>
<li>To encourage information sharing, collaboration and cross-skilling within the team</li>
<li>To reward the top performers and manage the poor performers</li>
</ul>
<p><!--more--></p>
<p>This looks like a lot to ask from a single process with a simple measurement system, but I believe that the process we have selected should achieve all of these.  Firstly it is necessary to note that I have created three development teams who are accountable for progressing our technical strategy and defining standards and toolsets within their respective domains.  These are the &#8220;Front-Ends&#8221; team which includes the web-team, the Integration team, and the Services team.</p>
<h3>The RFP Process</h3>
<ul>
<li>At the Project prioritization forum the Business-Unit heads agree the priorities of the projects for which we will publish RFPs</li>
<li>The Project office prepares a very brief RFP describing the key outcomes required for the project.</li>
<li>As the CIO, I estimate the size of the project and award the project a size-value on a scale of 1-20.</li>
<li>The RFP is published on an internal blog indicating its size-value and priority.</li>
<li>The developers are notified of a new RFP and may then respond to the RFP or form a syndicate across the various teams to respond to the RFP.  Only two days are allocated for the construction of a proposal at this point in the process.</li>
<li>The responses are considered at the weekly Architecture council meeting (Chief Architect, Head of Operations, Heads of each development team, Data &amp; Services registrar) in terms of the quality of the technical approach, the reasonableness of the effort estimate and the time-to-market vs architectural-significance trade-offs.</li>
<li>One syndicate is awarded the project and must take into consideration any guidance offered by the architectural council.</li>
</ul>
<h3>The Planning Process</h3>
<ul>
<li>The syndicate should then embark on a detailed estimation process which follows a Delphi methodology to arrive at a fairly good estimate of effort.</li>
<li>A detailed design process is worked into the plan and after the design is complete the effort estimates are reviewed one more time.</li>
<li>The project is baselined at this point and deadline targets are measured based on this iteration of the project estimation.</li>
<li>Depending on each syndicate members involvement after the estimation the project-size units earned by each member is adjusted if necessary.</li>
</ul>
<h3>The Project Scoring process</h3>
<ul>
<li><span style="font-size: small;">Once the project has been completed it must be scored by all the relevant stakeholders.</span></li>
<li><span style="font-size: small;">A standardized electronic survey with a set of questions for each type of stakeholder is used, so that scores can be easily compared.</span></li>
<li><span style="font-size: small;">The standardized questions are published so that everyone knows in advance what the required outcomes are.</span></li>
</ul>
<h3>The Performance  Measurement Metrics:</h3>
<p>Using these measures the following can easily be measured and managed:</p>
<ul>
<li><span class="Apple-style-span" style="line-height: 19px; font-size: small;">Each individual must have earned at least 20 Project size points in a year.  I measure this on a prorated basis every quarter and meet with underperforming team members to help them get back on track.</span></li>
<li><span class="Apple-style-span" style="line-height: 19px; font-size: small;">In order to qualify for a bonus each individual must earn at least 24 project-size points in a year.</span></li>
<li><span class="Apple-style-span" style="line-height: 19px; font-size: small;">Of those eligible for a bonus, their individual Aggregate Project Outcome Scores  (Sum of (earned Projects Size-points x Project Survey Score) for all the projects an individual was involved in) determines their rank on the Bonus list.  Top 5 scorers earn 15,14,13,12,11% of the development team bonus pool respectively, and the balance of the eligible team-members share the remaining 37% as a ratio of their relative scores.</span></li>
</ul>
<h3>Performance Reporting</h3>
<p>Although all this may sound complicated it reduces each team-member&#8217;s score to two metrics: Project Size Points and Project Outcome Scores.</p>
<ul>
<li><span class="Apple-style-span" style="font-size: medium;">If you have more than 20 Project Size points you keep your job. </span></li>
<li><span class="Apple-style-span" style="font-size: medium;">If you have more than 24 Project Size points you will get a bonus.  </span></li>
<li><span class="Apple-style-span" style="font-size: medium;">The size of that bonus is determined by you Project outcome Scores (The quality &amp; timeliness of your work)</span></li>
</ul>
<p>The current scores for each team member (both size and outcome scores) are published weekly for all to see.  No-one should have any doubt where they stand at any point in the year.</p>
<h3>Some Balancing factors</h3>
<p>Of course none of this works if there are insufficient projects to keep everyone busy during the year.  It would not be fair if there were not enough project-size points available to ensure that everyone can earn their required 20.  Fortunately I do not anticipate that scenario for many years to come.<br />
I am sure that by the time that occurs humans will no longer be involved in software development processes, and performance measurement will have a completely different set of objectives.</p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=144363255628317&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://www.sobercounsel.com/2011/09/06/software-factories-part-4-implementation-guidelines/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.sobercounsel.com/2011/09/06/software-factories-part-4-implementation-guidelines/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Software Factories: Part 3 &#8211; Smart Clients</title>
		<link>http://www.sobercounsel.com/2007/03/07/software-factories-part-3-smart-clients/</link>
		<comments>http://www.sobercounsel.com/2007/03/07/software-factories-part-3-smart-clients/#comments</comments>
		<pubDate>Wed, 07 Mar 2007 07:27:07 +0000</pubDate>
		<dc:creator>Malcolm Mac Donald</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Trends]]></category>
		<category><![CDATA[Smart Client]]></category>
		<category><![CDATA[Software Factory]]></category>

		<guid isPermaLink="false">http://www.sobercounsel.com/?p=35</guid>
		<description><![CDATA[A custom smart client can go a long way to addressing your Software factory needs and is in my opinion one of the most effective ways of reducing ongoing development effort. A Smart-client can address many non-functional or repeating-requirements that &#8230; <a href="http://www.sobercounsel.com/2007/03/07/software-factories-part-3-smart-clients/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A custom smart client can go a long way to addressing your Software factory needs and is in my opinion one of the most effective ways of reducing ongoing development effort.</p>
<p>A Smart-client can address many non-functional or repeating-requirements that will not have to be developed ever again.</p>
<p><strong>Smart-Client Administration</strong><br />
An administration Interface for the smart client is essential to take admin away from the developers and hand it over to the support desk.  For instance adding a new user or promoting a piece of functionality from Testing to Production can be done via an administrative interface.  Within this client we embed a lot of functionality that would previously have been done by developers.  I include Authorisation, creation of Data access aliases (See section on Data Access Agent), upload of new functionality into the Smart-client database, promotions between Development, Testing, Production etc, notifications to authorised users, work-flow definition and edits, creation of aliases to access functionality (menu-item naming) and any other administration whether done by developers or support-staff.  I  also recommend that the admin tools be built as functionality that snaps into the smart client itself &#8211; it just makes it easier.</p>
<p><strong>Authentication / Authorisation</strong><br />
If your organisation uses a directory service of some sort, then integrate the smart client into the directory for authentication.  If you have a generic authorisation services, then use that to authorise the client functionality as well.  if not, link the IDs of your directory user into an authorisation table accessed by the Smart client Administration interface to link users to the functionality they require.</p>
<p><strong>Work-flow</strong><br />
If your organisation uses work-flow, then definitely link generic work-flow functionality into the smart client so that it too is dealt with once.</p>
<p><strong>Data Access Agent</strong><br />
If your smart client allows plugged-in code to access data directly,  then you are missing a trick here.  This idea has very powerful side-effects.</p>
<p>Define a method by which plugged-in code asks a function provided within the smart client for some data.  The smart client should then source the appropriate data and return it to the calling plug-in.  Some side-effects here are that the developers need not know any of your production database user-names or passwords, and you can within the smart-client infrastructure redirect data requests to other destinations (for example to your disaster-recovery site, or a testing database)</p>
<p>In the implementation I have built previously, we created a lookup-table for data-sources that indicated an &#8220;allowed calling-plug-in&#8221;,  &#8220;operational-mode&#8221; a &#8220;Data-source alias&#8221; and the details of each data source.  This allowed us to automate a switch to &#8220;Disaster-Recovery&#8221; mode through using a predefined &#8220;operational-mode&#8221; called &#8220;DR&#8221;.  The Smart-client had a process for checking against a centralised web-service for which mode it should be operating in for a particular application.  The flexibility here was staggering.  This also means that the change management team can promote an program from Testing to Production without any help from a technical team whatsoever.</p>
<p><strong>On-line/Offline modes</strong><br />
A web-based client or portal has the disadvantage that offline modes are not possible or at least very difficult to implement.  A smart-client can do this fairly easily and with the &#8220;data-access agent&#8221; functionality above it is even easier to achieve.</p>
<p><strong>Code Generators</strong><br />
I have found that most user interfaces that we needed to build were in fact forms that interacted with data-tables.  We used a multi-tier architecture where the front end was smart-client (containing a data-access layer), a business layer consisting of  stored procedures which performed a lot of the business activities and which interacted directly with the data-tables.  So we created a form-builder that created both the stored procedures and .NET forms automatically.  We would point the tool  at a set of data-tables and lookup tables do some configuration and click &#8220;GO&#8221;.  What we got out was a stored-procedure that conformed with all the rules we had predefined and a .NET project with all the necessary forms and the interactions with the Data Access Layer and Stored Procedures.  If there were no fancy custom UI interactions nececessary we could simply compile the project, and upload the DLL into our smart-client database for testing.</p>
<p>So no developer-time required for:</p>
<ul>
<li>authorisation,</li>
<li>basic form-based UIs,</li>
<li>access to data,</li>
<li>Disaster recovery implementations,</li>
<li>promotions between  Dev, QA, Prod etc,</li>
<li>Creation of menus</li>
<li>Creation of custom workflows</li>
</ul>
<p>among others.  This represents a significant saving in the development stage of any project.</p>
<p>Technorati Tags: <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Software%20Factory">Software Factory</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Development">Development</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Custom%20Code">Custom Code</a>, <a class="performancingtags" rel="tag" href="http://technorati.com/tag/Code%20Generation">Code Generation</a></p>
<div class="al2fb_like_button"><div id="fb-root"></div><script src="http://connect.facebook.net/en_US/all.js#appId=144363255628317&amp;xfbml=1" type="text/javascript"></script>
<fb:like href="http://www.sobercounsel.com/2007/03/07/software-factories-part-3-smart-clients/" layout="standard" show_faces="false" width="450" action="like" font="arial" colorscheme="light" ref="AL2FB"></fb:like></div>]]></content:encoded>
			<wfw:commentRss>http://www.sobercounsel.com/2007/03/07/software-factories-part-3-smart-clients/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

