<?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>Software Rockstar &#187; Agile</title>
	<atom:link href="http://www.softwarerockstar.com/tag/agile/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.softwarerockstar.com</link>
	<description>Coaching and mentoring on a journey from a Developer to an IT Leader</description>
	<lastBuildDate>Thu, 12 Nov 2009 18:12:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Astoria and Jasper: Old Ideas New Technology</title>
		<link>http://www.softwarerockstar.com/2007/10/astoria-and-jasper-old-ideas-new-technology/</link>
		<comments>http://www.softwarerockstar.com/2007/10/astoria-and-jasper-old-ideas-new-technology/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 01:19:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ADO.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Cool Tools]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2007/10/18/astoria-and-jasper-old-ideas-new-technology/</guid>
		<description><![CDATA[SubSonic is an excellent open source DAL generation tool developed by Rob Conery that has been around for almost a year. In most cases SubSonic can just be added to your project, pointed to a databse, and you magically and immediately gain access to a rich and strongly typed object model that can be used [...]]]></description>
			<content:encoded><![CDATA[<div class="imageleft"><img src="http://softwarerockstar.com/wp-content/uploads/2007/10/dotnet.png" alt="Microsoft .NET" title="Microsoft .NET" width="189" height="100" /></div>
<p><a href="http://www.subsonicproject.com/">SubSonic</a> is an excellent open source <a href="http://en.wikipedia.org/wiki/Data_access_layer">DAL</a> generation tool developed by Rob Conery that has been around for almost a year. In most cases <a href="http://www.subsonicproject.com/">SubSonic</a> can just be added to your project, pointed to a databse, and you magically and immediately gain access to a rich and strongly typed object model that can be used to query and persist data to and from your relational data source.</p>
<p><a href="http://www.subsonicproject.com/">SubSonic</a> also has a cool feature called the <a href="http://en.wikipedia.org/wiki/REST">REST</a> handler that essentially allows one to use <a href="http://en.wikipedia.org/wiki/Http">HTTP</a> protocol as an interface to data stored in a back-end relational database. It is <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier">URI</a> based and returns data back in <a href="http://en.wikipedia.org/wiki/Xml">XML</a> format. This data can then be used by decoupled client applications as they see fit. If you have never looked at <a href="http://www.subsonicproject.com/">SubSonic</a>, you owe it to yourself to checkout this very cool tool.</p>
<p>Recently Microsoft unveiled their plans to release similar features codenamed <a href="http://astoria.mslivelabs.com/">Astoria</a> and <a href="http://msdn2.microsoft.com/en-us/data/bb419139.aspx">Jasper</a> with <a href="http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx">.NET framework 3.5 and Visual Studio 2008</a>. The CTP of <a href="http://astoria.mslivelabs.com/">Astoria</a> and <a href="http://msdn2.microsoft.com/en-us/data/bb419139.aspx">Jasper</a> are available for download from Microsoft.</p>
<p>Jasper is described by Microsoft as:</p>
<blockquote><p>Project Jasper is geared towards iterative and agile development. You can<br />
start interacting with the data in your database without having to create<br />
mapping files or define classes. You can build user interfaces by naming<br />
controls according to your model without worrying about binding code. Project<br />
Jasper is also extensible, allowing you to provide your own business logic and<br />
class model. Since Project Jasper is built on top of the ADO.NET Entity<br />
Framework, it supports rich queries and complex mapping.
</p></blockquote>
<p>Pablo Castro, the mastermind behind Astoria describes it as:</p>
<blockquote><p>The goal of Microsoft Codename Astoria is to enable applications to expose data as a data service that can be consumed by web clients within a corporate network and across the internet. The data service is reachable over HTTP, and URIs are used to identify the various pieces of information available through the service. Interactions with the data service happens in terms of HTTP verbs such as GET, POST, PUT and DELETE, and the data exchanged in those interactions is represented in simple formats such as XML and JSON.</p></blockquote>
<p>The <a href="http://astoria.mslivelabs.com/">Astoria</a> web site also includes <a href="http://astoria.mslivelabs.com/OnlineService.aspx">sample online services</a> that showcases how this new technology can be used. It also allows anyone with a Passport account to design and host their own experimental data services .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2007/10/astoria-and-jasper-old-ideas-new-technology/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Build Engine (MSBuild)</title>
		<link>http://www.softwarerockstar.com/2006/10/microsoft-build-engine-msbuild/</link>
		<comments>http://www.softwarerockstar.com/2006/10/microsoft-build-engine-msbuild/#comments</comments>
		<pubDate>Sat, 21 Oct 2006 14:39:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[Process & Management]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Cool Tools]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/10/21/microsoft-build-engine-msbuild/</guid>
		<description><![CDATA[Up until Visual Studio 2005 and .NET Framework 2.0, the actual build process of solution or project files was pretty much a black-box phenomenon for developers. With .NET Framework 2.0 and Visual Studio 2005, Microsoft unveiled its new build platform called MSBuild. MSBuild essentially provides a transparent build process through Visual Studio IDE, as well [...]]]></description>
			<content:encoded><![CDATA[<p>Up until <a href="http://msdn.microsoft.com/vstudio/">Visual Studio 2005</a> and <a href="http://msdn.microsoft.com/netframework/">.NET Framework 2.0</a>, the actual build process of solution or project files was pretty much a black-box phenomenon for developers. With <a href="http://msdn.microsoft.com/netframework/">.NET Framework 2.0</a> and <a href="http://msdn.microsoft.com/vstudio/">Visual Studio 2005</a>, Microsoft unveiled its new build platform called <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a>. <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> essentially provides a transparent build process through <a href="http://msdn.microsoft.com/vstudio/">Visual Studio</a> IDE, as well as allows developers to build projects and solutions from the command line. This allows us to fully customize our builds and create builds on machines where Visual Studio is not even installed.</p>
<p>On a recent team project I was using continuous integration or <a href="http://www.martinfowler.com/articles/continuousIntegration.html">CI</a> (an Agile practice) via <a href="http://ccnet.thoughtworks.com/">CruiseControl.NET</a>. It was a breeze to automatically build projects and solutions using <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> on our build server (a run-of-the-mill Dell workstation running Windows XP without <a href="http://msdn.microsoft.com/vstudio/">Visual Studio 2005</a> installed) whenever someone checked-in any files to source control. This allowed us to be confident at all times that various pieces our distributed project integrate well. Moreover, since <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> can build projects and solutions from command line, I had some batch files setup that would build release versions of our projects, create setup files (using <a href="http://nsis.sourceforge.net/">NSIS</a>), archive older versions of setup files, and move new setup files to a network share where MIS / Operations folks could install the new version on the production server from.</p>
<p>In <a href="http://msdn.microsoft.com/vstudio/">Visual Studio 2005</a>, project and solution files are nothing more than <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> XML build scripts. This allows us full control over the build process. For example, in a web project, <a href="http://msdn.microsoft.com/vstudio/">Visual Studio 2005</a> does not provide any user interface to modify pre and post build actions. However, since solution file is simply an <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> script, we can modify such actions manually by opening up the solution file in any text/XML editor.</p>
<p><a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> can perform several key tasks out of the box. Each task is essentially a unit of work (UOW) that contributes to the entire build process, e.g. copy files and folders, compile files, etc. If we ever require tasks that do not ship with <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a>, we can always create custom tasks in any .NET language by simply implementing the <a href="http://msdn2.microsoft.com/en-us/library/microsoft.build.framework.itask.aspx">ITask</a> interface or deriving from the <a href="http://msdn2.microsoft.com/en-us/library/microsoft.build.utilities.task.aspx">Task</a> class.</p>
<p>In conclusion, <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> allows developers full control of the build process so that builds can be fully customized. This may not be so crucial in smaller projects, but for enterprise solutions that typically comprise of several projects and many dependencies, <a href="http://msdn2.microsoft.com/en-us/library/wea2sca5.aspx">MSBuild</a> is definitely a God-send!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/10/microsoft-build-engine-msbuild/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ISP: Interface Segregation Principle</title>
		<link>http://www.softwarerockstar.com/2006/08/isp-interface-segregation-principle/</link>
		<comments>http://www.softwarerockstar.com/2006/08/isp-interface-segregation-principle/#comments</comments>
		<pubDate>Tue, 29 Aug 2006 00:10:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design Principles]]></category>
		<category><![CDATA[OOA/OOD]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/28/isp-interface-segregation-principle/</guid>
		<description><![CDATA[The Interface Segregation Principle (ISP) deals with cohesion and is closely related to the Single Responsibility Principle (SRP). In Uncle Bob&#8217;s terms, the ISP states that: Clients should not be forced to depend on methods that they do not use. In other words, this principle states that if a class performs multiple functions that may [...]]]></description>
			<content:encoded><![CDATA[<p>The Interface Segregation Principle (ISP) deals with <a href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)">cohesion</a> and is closely related to the <a href="http://mfharoon.blogspot.com/2006/08/srp-single-responsibility-principle.html">Single Responsibility Principle (SRP)</a>. In <a href="http://www.objectmentor.com/resources/articles/isp.pdf">Uncle Bob&#8217;s terms</a>, the ISP states that:</p>
<blockquote><p>Clients should not be forced to depend on methods that they do not use.</p></blockquote>
<p>In other words, this principle states that if a class performs multiple functions that may be used by different client classes, then those functions should be seperated out into different interfaces according to their usage.</p>
<p>The idea behind this principle is to confine the aount of rework to only clients that use a certain interface, should the interface of a depended-upon class changes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/isp-interface-segregation-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MSF Agile v4.0 Team Model</title>
		<link>http://www.softwarerockstar.com/2006/08/msf-agile-v4-0-team-model/</link>
		<comments>http://www.softwarerockstar.com/2006/08/msf-agile-v4-0-team-model/#comments</comments>
		<pubDate>Sun, 27 Aug 2006 23:01:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Process & Management]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/27/msf-agile-v4-0-team-model/</guid>
		<description><![CDATA[Out of all the Agile methodologies I have studied so far (XP, Scrum, AUP, and MSF), I really like the fact that MSF provides a Team Model that goes into details about how project teams should be structured. While it may be obvious to some, I know from experience that properly structuring teams is not [...]]]></description>
			<content:encoded><![CDATA[<p>Out of all the Agile methodologies I have studied so far (<a href="http://en.wikipedia.org/wiki/Extreme_Programming">XP</a>, <a href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum</a>, <a href="http://en.wikipedia.org/wiki/Agile_Unified_Process">AUP</a>, and <a href="http://en.wikipedia.org/wiki/Microsoft_Solutions_Framework">MSF</a>), I really like the fact that MSF provides a Team Model that goes into details about how <a href="http://en.wikipedia.org/wiki/Project_team">project teams</a> should be structured. While it may be obvious to some, I know from experience that properly structuring teams is not something that that comes naturally to many organizations. In fact some organizations have less success with agile only because of their ineffective team structures.<br />
MSF Team Model is based on the following basic principles:</p>
<ul>
<li>A team of peers with clear accountability, shared responsibility and open communications. Each role is accountable for a specific share of the quality of the overall solution.</li>
<li>Advocacy for all key constituencies that must be represented on a successful software project. Every perspective is represented to provide the checks and balances that prevent errors of omission and lopsided decisions.</li>
<li>Stretch to fit to the scale necessary for the specific project. Constituencies may be combined in small teams or further refined as teams scale for larger projects.</li>
</ul>
<p>There are 7 advocacies that are represented in the MSF Agile Team Model. In my opinion it&#8217;s imperitive that these advocacies have proper representation in order to ensure success of a given project. Since MSF offers a stretch-to-fit approach, it&#8217;s possible to map these 7 advocacies into fewer role clusters as determined by the phyical size of the team.</p>
<p>Following are the advocacies and their respective focus as presented by the MSF Team Model:</p>
<p align="center">
<img src="http://lh4.google.com/mharoon/Rtct8efH3nI/AAAAAAAACAs/HsGnTgxrNUI/s800/msf-team-model.gif" />
</p>
<p>
<h3>Product Management</h3>
<h4>Goals</h4>
<ul>
<li>Understand, communicate, and ensure success from the standpoint of the economic customer requesting the solution. </li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Marketing </li>
<li>Business Value </li>
<li>Customer Advocacy </li>
<li>Product Planning</li>
</ul>
<h4>Responsibilities</h4>
<ul>
<li>Acts as customer advocate </li>
<li>Drives shared project vision/scope </li>
<li>Manages customer requirements definition </li>
<li>Develops and maintains business case </li>
<li>Manages customer expectations </li>
<li>Drives features vs. schedule vs. resources tradeoff decisions </li>
<li>Manages marketing, evangelizing and public relations </li>
<li>Develops, maintains, and executes the communications plan
</li>
</ul>
<h3>Program Management</h3>
<h4>Goals</h4>
<ul>
<li>Right solution is delivered at the right time and all expectations are understood, managed and met. </li>
<li>Deployed solution will meet qualities of service &amp; business objectives, and be viable in the long term. </li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Project Management </li>
<li>Solution Architecture </li>
<li>Process Assurance </li>
<li>Administrative Services </li>
</ul>
<h4>Responsibilities</h4>
<ul>
<li>Drives development process to ship product on time </li>
<li>Manages product design and specifications </li>
<li>Facilitates communication and negotiation within the team </li>
<li>Implements and ensures standards </li>
<li>Maintains the project schedule and reports project status </li>
<li>Drives implementation of critical trade-off decisions </li>
<li>Develops, maintains, and executes the project master plan and schedule </li>
<li>Drives and manages risk assessment and risk management </li>
</ul>
<h3>Development</h3>
<h4>Goals</h4>
<ul>
<li>Implementation, estimates, high quality maintainable code and unit tests. </li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Technology Consulting </li>
<li>Implementation of Architecture and Design </li>
<li>Application Development </li>
</ul>
<h4>Responsibilities</h4>
<ul>
<li>Specifies the features of physical design </li>
<li>Estimates time and effort to complete each feature </li>
<li>Builds and/or supervises building of features </li>
<li>Prepares product for deployment </li>
<li>Provides technology subject matter expertise to the team </li>
</ul>
<h3>Quality Assurance</h3>
<h4>Goals</h4>
<ul>
<li>Ensure solution quality. </li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Test Planning </li>
<li>Test Engineering </li>
<li>Test Reporting
</li>
</ul>
<p><b></b></p>
<h4>Responsibilities<br />
</h4>
<ul>
<li>Ensures all issues are known </li>
<li>Develops testing strategy and plans </li>
<li>Conducts testing </li>
<li>Reports test results </li>
</ul>
<h3>Release/Operations<br />
</h3>
<h4>Goals</h4>
<ul>
<li>Timely readiness and compatibility of infrastructure.</li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Infrastructure </li>
<li>Support </li>
<li>Operations </li>
<li>Commercial Release Management </li>
</ul>
<h4>Responsibilities</h4>
<ul>
<li>Act as advocate for operations, support and delivery channels </li>
<li>Manage procurement </li>
<li>Manage product deployment </li>
<li>Drive manageability and supportability trade-off decisions </li>
<li>Manage operations, support, and delivery channel relationships </li>
<li>Provide logistical support to the project team </li>
</ul>
<h3>User Experience</h3>
<h4>Goals</h4>
<ul>
<li>Provide user documentation and training </li>
<li>Understand and communicate users’ context, and ensure usability from user perspective </li>
</ul>
<h4>Functional Areas</h4>
<ul>
<li>Technical Communications </li>
<li>Training </li>
<li>Usability </li>
<li>Graphic Design </li>
<li>Internationalization </li>
<li>Accessibility </li>
</ul>
<h4>Responsibilities</h4>
<ul>
<li>Acts as user advocate on team </li>
<li>Manages user requirements definition </li>
<li>Designs and develops performance support systems </li>
<li>Drives usability and user performance enhancement trade-off decisions </li>
<li>Provides specifications for help features and files </li>
<li>Develops and provides user training </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/msf-agile-v4-0-team-model/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DIP: Dependency Inversion Principle</title>
		<link>http://www.softwarerockstar.com/2006/08/dip-dependency-inversion-principle/</link>
		<comments>http://www.softwarerockstar.com/2006/08/dip-dependency-inversion-principle/#comments</comments>
		<pubDate>Sun, 27 Aug 2006 13:58:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Principles]]></category>
		<category><![CDATA[OOA/OOD]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/27/dip-dependency-inversion-principle/</guid>
		<description><![CDATA[The Dependency Inversion Principle deals with how to correctly design classes such that their dependency on one another causes the least amount of work in case of a change. Uncle Bob&#8217;s definition of DIP states: High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details [...]]]></description>
			<content:encoded><![CDATA[<p>The Dependency Inversion Principle deals with how to correctly design classes such that their dependency on one another causes the least amount of work in case of a change. <a href="http://www.objectmentor.com/resources/articles/dip.pdf">Uncle Bob&#8217;s definition</a> of DIP states:</p>
<blockquote>
<ul>
<li>High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
<li>Abstractions should not depend on details. Details should depend on abstractions.</li>
</ul>
</blockquote>
<p>Essentially what this principle means is that in a tiered design, higher level modules and lower level modules should not directly depend on each other; instead they should only depend on <a href="http://en.wikipedia.org/wiki/Abstraction">abstractions</a>. Moreover, abstractions should not have any knowledge of details (other classes in the system).</p>
<p>This principle closely relates to <a href="http://mfharoon.blogspot.com/search?label=Design+Principles">some of the other design principles</a> I discussed previously in that it yields a design that is highly decoupled ensuring that minor changes in one part of the application do not cause a domino effect in other parts of the application. Moreover such a design is extensible &#8212; as new business entities are added, usually such as design scales well by requiring only new code to be added rather than existing code to be modified.  ASP.NET 2.0&#8242;s <a href="http://aspnet.4guysfromrolla.com/articles/101905-1.aspx">Provider Model</a> is a great example of such a design that provides a default implementation for various sub-systems such as Membership, Personalization, Navigation, etc. but also allows developers to modify the default behavior by extending certain classes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/dip-dependency-inversion-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LSP: Liskov Substitution Principle</title>
		<link>http://www.softwarerockstar.com/2006/08/lsp-liskov-substitution-principle/</link>
		<comments>http://www.softwarerockstar.com/2006/08/lsp-liskov-substitution-principle/#comments</comments>
		<pubDate>Thu, 24 Aug 2006 00:23:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Principles]]></category>
		<category><![CDATA[OOA/OOD]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/23/lsp-liskov-substitution-principle/</guid>
		<description><![CDATA[The Liskov Substitution Principle dictates when and where it is correct to derive a subtype from an existing supertype. As defined by Barbara Liskov and Jeannette Wing, it essentially states that: Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where [...]]]></description>
			<content:encoded><![CDATA[<p>The Liskov Substitution Principle dictates when and where it is correct to derive a <a href="http://en.wikipedia.org/wiki/Subtype">subtype</a> from an existing supertype.  As defined by <a href="http://www.pmg.csail.mit.edu/~liskov/">Barbara Liskov</a> and Jeannette Wing, it essentially states that:</p>
<blockquote><p>Let q(x) be a property provable about objects x of type T. Then q(y) should be true for objects y of type S where S is a subtype of T.</p></blockquote>
<p>What it means is that if S is a subtype of T, then a function q(x) must behave in the same manner irrespective of the type of x whether it be S or T.  In other words, if a piece of code behaves differently for a subtype than a supertype, then that code violates the LSP (and consequently the OCP).</p>
<p>Let&#8217;s say that we work for a bank and that we have a simple teller application.  Currently the teller application works with checking and savings account types.</p>
<pre class="brush: csharp">
public abstract class Account
{
    public abstract double CurrentBalance { get; }
    public abstract void Deposit(double amount);
}

public class CheckingAccount : Account
{
    private double _currentBalance;

    public override double CurrentBalance
    {
        get { return _currentBalance; }
    }

    public override void Deposit(double amount)
    {
        _currentBalance += amount;
    }
}

public class SavingsAccount : Account
{
    /* Savings account implementation */
}
</pre>
<p>Our bank just entered the mortgage business so we need to modify our teller application to support this new account type.  During the short analysis phase we decide that since mortgage account is type of an account (IS-A relationship), we can simply create a new mortgage class deriving from the Account abstract class, override a method and a property, and we should be in business.  We add a new class as follows:</p>
<pre class="brush: csharp">
public class MortgageAccount : Account
{
    private double _currentBalance;

    public override double CurrentBalance
    {
        get { return _currentBalance; }
    }

    public override void Deposit(double amount)
    {
        _currentBalance -= amount;
    }
}
</pre>
<p>Everything sounds logical, that is until we come across this code in the teller application:</p>
<pre class="brush: csharp">
public class Bank
{
    public void ReceiveMoney(Account account, double amount)
    {
        double oldBalance = account.CurrentBalance;
        account.Deposit(amount);
        Debug.Assert(account.CurrentBalance = oldBalance + amount);
    }
}
</pre>
<p>Based on our pre-existing code, the ReceiveMoney() method is making a reasonable assumption that the new balance should be equal to the old balance plus the newly deposited amount.  This assumption is, however, violated if we pass an instance of the Mortgage class to this method.  This is a clear violation of the LSP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/lsp-liskov-substitution-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Resource Allocation</title>
		<link>http://www.softwarerockstar.com/2006/08/agile-resource-allocation/</link>
		<comments>http://www.softwarerockstar.com/2006/08/agile-resource-allocation/#comments</comments>
		<pubDate>Wed, 23 Aug 2006 00:03:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Leadership]]></category>
		<category><![CDATA[Process & Management]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/22/agile-resource-allocation/</guid>
		<description><![CDATA[For Agile methodologies to really work with the promised increase in efficiency, it&#8217;s important that all participating team members be generalists rather than specialists. For some companies migrating to Agile from other traditional methodologies, this may not be the case. I have worked with companies that have well-defined and assigned roles for Business Analysts, Database [...]]]></description>
			<content:encoded><![CDATA[<p>For <a href="http://en.wikipedia.org/wiki/Agile_software_development">Agile methodologies</a> to really work with the promised increase in efficiency, it&#8217;s important that all participating team members be <em>generalists</em> rather than <em>specialists</em>.</p>
<p>For some companies migrating to Agile from other traditional methodologies, this may not be the case. I have worked with companies that have well-defined and assigned roles for Business Analysts, Database Administrators, Front-end Developers, Back-end Developers, etc. When such companies move towards Agile, they face a problem of optimal resource allocation and utilization.</p>
<p>As an example, a developer may not be productive while a DBA is creating new tables in the database and writing stored procedures. Once the DBA is done with his tasks, he may not have enough to do until the start of the next iteration. Since Agile is iterative, and iterations can&#8217;t overlap, this may result in poor resource utilization and may adversely effect the overall efficiency.</p>
<p>Before starting to implement an Agile methodology within your organization, it is important to make sure that your IT human-resource infrastructure actually supports it. While Agile <em>may</em> work in companies with specialized IT roles, it is definitely not designed and optimized for those scenarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/agile-resource-allocation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OCP Open-Closed Principle</title>
		<link>http://www.softwarerockstar.com/2006/08/ocp-open-closed-principle/</link>
		<comments>http://www.softwarerockstar.com/2006/08/ocp-open-closed-principle/#comments</comments>
		<pubDate>Tue, 22 Aug 2006 00:04:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Design Principles]]></category>
		<category><![CDATA[OOA/OOD]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/21/ocp-open-closed-principle/</guid>
		<description><![CDATA[Another fundemental principle of object-oriented software design is the Open-Closed Principle. According to Uncle Bob (Robert Martin), this principle states that: Software entities (classes, modules, functions, etc.) should beopen for extension, but closed for modification. Essentially, what this means is that software&#8217;s design should be such that it&#8217;s behavior can be modified by extending the [...]]]></description>
			<content:encoded><![CDATA[<p>Another fundemental principle of object-oriented software design is the Open-Closed Principle. According to <a href="http://www.objectmentor.com/publications/ocp.pdf#search=%22Object%20mentor%20OCP%22">Uncle Bob (Robert Martin)</a>, this principle states that:</p>
<blockquote><p>Software entities (classes, modules, functions, etc.) should be<br />open for extension, but closed for modification.</p></blockquote>
<p>Essentially, what this means is that software&#8217;s design should be such that it&#8217;s behavior can be modified by <em>extending</em> the existing source code rather than <em>modifying</em> it. Consider the following example:</p>
<pre class="brush: csharp">
public class CheckingAccount
{
    private double _currentBalance;

    public void ProcessDeposit(double amount)
    {
        _currentBalance += amount;
    }
}

public class MortgageAccount
{
    private double _currentBalance;

    public void ProcessPayment(double amount)
    {
        _currentBalance -= amount;
    }
}

public class Bank
{
    public void ReceiveMoney(object account, double amount)
    {
        if (account.GetType() == typeof(CheckingAccount))
        {
            CheckingAccount checkingAccount = (CheckingAccount)account;
            checkingAccount.ProcessDeposit(amount);
        }
        else if (account.GetType() == typeof(MortgageAccount))
        {
            MortgageAccount mortgageAccount = (MortgageAccount)account;
            mortgageAccount.ProcessPayment(amount);
        }
    }
}
</pre>
<p>Notice that the ReceiveMoney() method of the Bank class has to determine the type of account passed in. Only based on that information it can perform the appropriate business logic. Later if we add another account type then we may need to modify this code in order for it to work properly. The above code is, hence, in violation of the Open-Closed principle.</p>
<p>So how can we revise our code to conform to the Open-Closed Principle? Abstraction is the answer. Let&#8217;s take a look:</p>
<pre class="brush: php">
public abstract class Account
{
    public abstract void Deposit(double amount);
}

public class CheckingAccount : Account
{
    private double _currentBalance;

    public override void Deposit(double amount)
    {
        _currentBalance += amount;
    }
}

public class MortgageAccount : Account
{
    private double _currentBalance;

    public override void Deposit(double amount)
    {
        _currentBalance -= amount;
    }
}

public class Bank
{
    public void ReceiveMoney(Account account, double amount)
    {
        account.Deposit(amount);
    }
}
</pre>
<p>Notice how we got rid of all conditional logic in the ReceiveMoney() method. Also notice that if we later add a new account type, the ReceiveMoney() method will work without any modifications. The revised version of our code above, hence, conforms to the Open-Closed Principle.</p>
<p>Let&#8217;s now consider what happens to our code if a new business rule is added that requires an e-mail notification to be sent to the account holder whenever a deposit is made. Obviously, we&#8217;ll have to modify the ReceiveMoney() method to perform that logic. Since we can&#8217;t account for all possible scenarios, we can never acheive <em>perfect closure</em>. With that in mind, design the simplest software that will do the job, and conform to OCP or other such design principles where you see the need.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/ocp-open-closed-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SRP: Single Responsibility Principle</title>
		<link>http://www.softwarerockstar.com/2006/08/srp-single-responsibility-principle/</link>
		<comments>http://www.softwarerockstar.com/2006/08/srp-single-responsibility-principle/#comments</comments>
		<pubDate>Sun, 20 Aug 2006 13:42:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design Principles]]></category>
		<category><![CDATA[OOA/OOD]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/20/srp-single-responsibility-principle/</guid>
		<description><![CDATA[SRP is one of the fundamental object oriented software design principles, first introduced by Tom DeMarco in 1979. In simple terms, SRP states that every class should have a single well defined goal, and that all members of that class (properties, methods, etc.) should work together to achieve that goal. Robert Martin puts it in [...]]]></description>
			<content:encoded><![CDATA[<p>SRP is one of the fundamental object oriented software design principles, first introduced by <a href="http://www.systemsguild.com/GuildSite/TDM/Tom_DeMarco.html">Tom DeMarco</a> in 1979.</p>
<p>In simple terms, SRP states that every class should have a single well defined goal, and that all members of that class (properties, methods, etc.) should work together to achieve that goal. <a href="http://www.objectmentor.com/resources/articles/srp">Robert Martin</a> puts it in slightly different terms:</p>
<blockquote><p>There should never be more than one reason for a class to change.</p></blockquote>
<p>Essentially SRP enforces the concept of high <a href="http://en.wikipedia.org/wiki/Cohesion_%28computer_science%29">cohesion</a> that should not only be applied to classes but also internals of a class, such as methods.</p>
<p>So why is SRP such an important design principle? It is because a class with multiple responsibilities is more difficult to change and more difficult to reuse (design smells: <a href="http://blogs.netindonesia.net/zeddy/archive/2006/07/31/10428.aspx">fragility and immobility</a>).</p>
<p>While SRP is quite easy to understand, it&#8217;s not <em>always</em> logical to implement. Consider the following class:</p>
<p><img style="display:block;cursor:hand;text-align:center;margin:0 auto 10px;" alt="" src="http://photos1.blogger.com/blogger2/5599/106541226764272/400/SRP-Image1.jpg" border="0" /></p>
<p>Given the convenience of having a customer class that is smart enough to know how to load and save itself, would you rather break it out like this?:</p>
<p><img style="display:block;width:400px;cursor:hand;text-align:center;margin:0 auto 10px;" alt="" src="http://photos1.blogger.com/blogger2/5599/106541226764272/400/SRP-Image2.jpg" border="0" />
<p>According to SRP, you should, because the combined customer class shares multiple responsibilities: customer business logic, and customer persistence logic. In fact if you use <a href="http://en.wikipedia.org/wiki/Test_driven_development">TDD</a>, you may even be <em>forced</em> to separate these two responsibilities.</p>
<p>In practicality, however, while we should keep this principle in mind and try to apply it wherever it makes sense, we should never get so carried away that we start introducing other design smells in our architecture, such as <a href="http://blogs.netindonesia.net/zeddy/archive/2006/07/31/10428.aspx">Rigidity, Viscosity, and Needless Complexity</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/srp-single-responsibility-principle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FxCop Analyzes Internals</title>
		<link>http://www.softwarerockstar.com/2006/08/fxcop-analyzes-internals/</link>
		<comments>http://www.softwarerockstar.com/2006/08/fxcop-analyzes-internals/#comments</comments>
		<pubDate>Sat, 19 Aug 2006 13:37:00 +0000</pubDate>
		<dc:creator>SoftwareRockstar</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Other]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[Code Analysis]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://mharoon.wordpress.com/2006/08/19/fxcop-analyzes-internals/</guid>
		<description><![CDATA[While FxCop is an invaluable tool for analyzing the external (public / protected) API of our assemblies, I was really hoping to have a way to also fire it against internal members of our code in order to enforce coding standards across our organization. David Kean&#8217;s tip shows us exactly how to do that! It [...]]]></description>
			<content:encoded><![CDATA[<div class="imageleft"><img src="http://softwarerockstar.com/wp-content/uploads/2007/10/fxcoprules.jpg" alt="FxCop" width="233" height="293" class="alignnone size-full wp-image-291" /></div>
<p>While <a href="http://www.gotdotnet.com/team/FxCop/">FxCop</a> is an invaluable tool for analyzing the external (public / protected) API of our assemblies, I was really hoping to have a way to also fire it against internal members of our code in order to enforce coding standards across our organization. <a href="http://blogs.msdn.com/fxcop/archive/2006/08/08/692908.aspx">David Kean&#8217;s tip</a> shows us exactly how to do that! It turns out to be a simple matter of turning on the <strong>Run all overridable rules against all targets</strong> option under <strong>Project</strong> | <strong>Options</strong> | <strong>Spelling &amp; Analysis</strong> menu.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarerockstar.com/2006/08/fxcop-analyzes-internals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->