<?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/"
		xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Scott Burkett&#039;s Pothole on the Infobahn &#187; IT-Management</title>
	<atom:link href="http://www.scottburkett.com/tag/it-management/feed" rel="self" type="application/rss+xml" />
	<link>http://www.scottburkett.com</link>
	<description>Blogging, opining, ruminating, and pontificating on entrepreneurship, venture capital, process improvement, technology, online communities, business networking, IT Management, online social networking, and other things that melt in the warm Atlanta sun.</description>
	<lastBuildDate>Tue, 07 Feb 2012 16:09:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
	<copyright>2006-2007 </copyright>
	<managingEditor>scott@incursio.com (Scott Burkett&#039;s Pothole on the Infobahn)</managingEditor>
	<webMaster>scott@incursio.com (Scott Burkett&#039;s Pothole on the Infobahn)</webMaster>
	<ttl>1440</ttl>
	<image>
		<url>http://www.scottburkett.com/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
		<title>Scott Burkett&#039;s Pothole on the Infobahn</title>
		<link>http://www.scottburkett.com</link>
		<width>144</width>
		<height>144</height>
	</image>
	<itunes:subtitle></itunes:subtitle>
	<itunes:summary>Blogging, opining, ruminating, and pontificating on entrepreneurship, venture capital, technology, online communities, business networking, IT Management, online social networking, and other things that melt in the warm Atlanta sun.</itunes:summary>
	<itunes:keywords></itunes:keywords>
	<itunes:category text="Society &#38; Culture" />
	<itunes:author>Scott Burkett&#039;s Pothole on the Infobahn</itunes:author>
	<itunes:owner>
		<itunes:name>Scott Burkett&#039;s Pothole on the Infobahn</itunes:name>
		<itunes:email>scott@incursio.com</itunes:email>
	</itunes:owner>
	<itunes:block>no</itunes:block>
	<itunes:explicit>no</itunes:explicit>
	<itunes:image href="http://www.scottburkett.com/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<item>
		<title>Scaling Your Technology with Your Business</title>
		<link>http://www.scottburkett.com/technology/scaling-your-technology-with-your-business-530.html</link>
		<comments>http://www.scottburkett.com/technology/scaling-your-technology-with-your-business-530.html#comments</comments>
		<pubDate>Mon, 08 Jan 2007 22:00:13 +0000</pubDate>
		<dc:creator>Scott Burkett</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[IT-Management]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.scottburkett.com/index.php/technology/2007-01-08/scaling-your-technology-with-your-business.html</guid>
		<description><![CDATA[I have been advising a local entrepreneur who is building a really interesting new web play. A great guy, but doesn&#8217;t have a deep background in technology. He is starting to see some traction with his service, and is beginning to run into those early scalability hurdles that so many young startups eventually run into. &#8230;<p class="read-more"><a href="http://www.scottburkett.com/technology/scaling-your-technology-with-your-business-530.html">Continue reading <span class="meta-nav">&#8594;</span></a></p>]]></description>
			<content:encoded><![CDATA[<p><img align="right" id="image531" style="border: 1px dotted #a0a0a0; padding: 2px; margin-left: 10px" alt="scalability.jpg" src="http://www.scottburkett.com/wp-content/uploads/2007/01/scalability.jpg" />I have been advising a local entrepreneur who is building a really interesting new web play.  A great guy, but doesn&#8217;t have a deep background in technology. He is starting to see some traction with his service, and is beginning to run into those early scalability hurdles that so many young startups eventually run into.</p>
<p>Our informal discussions around scalability inspired me to jot down some of my thoughts on this issue, and how early-stage entrepreneurs can scale their technology platform from 5 users to millions.<br />
<span id="more-530"></span></p>
<p><strong>Some Simple Rules</strong></p>
<p>There rarely exists a set of rules that, if followed, will result in nirvana &#8211; scalability is no different. Every situation is different.  However, these bullets summarize my general tenets, mantras, and beliefs for scaling a web-based application or system.  The rest of this post will cover these in a bit more detail.</p>
<ol>
<li>Abstract your logical architecture into at least 3 tiers (web, application, and data)</li>
<li>Even if you are only using one or two servers initially, think/design as if you have 50.</li>
<li>Designing with an SOA (services oriented architecture) in mind up front will aid you in scaling down the road.</li>
<li>Don&#8217;t overlook the scalability of your network infrastructure &#8211; your servers may be running at only 25% capacity, but if you don&#8217;t have the throughput and bandwidth to handle large amounts of traffic, those souped up servers won&#8217;t help you.</li>
<li>To help remove common/special cause variation &#8211; move system services such as DNS and e-mail off of production web/app servers and onto other, dedicated servers, and disable all non-essential services.</li>
<li>Scale vertically first, wherever possible, to control costs. But only do so if the benefits are greater than the cost.  Early on, putting extra resources into an existing server is probably cheaper than procuring additional servers.</li>
<li>Scale horizontally when vertical scaling begins to produce diminishing returns</li>
<li>When upgrading/replacing existing servers, replace lesser horsepower ones first &#8211; and cannibalize components wherever possible (to control burn)</li>
<li>Performance tuning is not a one-time activity &#8211; it should be an iterative process</li>
<li>If you don&#8217;t have solid system administration capabilities in-house, outsource it immediately</li>
<li>Daily reporting is a must. You can&#8217;t know when/how to scale if you don&#8217;t know the landscape at any point in time.</li>
</ol>
<p><strong>What is scaling (or scalability)?</strong><br />
Simply put, scalability refers to an system&#8217;s ability to handle increasingly heavier loads from users (activity) without fundamentally breaking the way in which it operates. In other words, as you continue to add new users and expand your business, you want your application or service to be able to easily handle the increase without slowing down, or worse, breaking down completely.</p>
<p>An application (or platform) is considered <em>scalable</em> if it can continue to service additional users, through the deployment of supplemental hardware/software/resources, without seeing any significant performance hit from the user&#8217;s standpoint. Of course, very few systems in their early prototypical states will fit this definition.  Your goal is to get the product to the point where it can be scaled in this manner, while reducing the number of potential bottlenecks.</p>
<p>Unfortunately, for business and IT managers, there is no single way to scale an application.  Ah, if only there were actually a big red &#8220;easy&#8221; button. Each situation is different, given that there are so many factors that need to be taken into account.  To make matters worse, sometimes, an application seems &#8220;infinitely scalable&#8221;, only to have a major bottleneck reveal itself down the road.  This doesn&#8217;t mean the end of the world &#8211; it simply means that you have to adjust accordingly.  The trick is, of course, to reduce the number of &#8220;midcourse corrections&#8221; that you will have to endure.</p>
<p><strong>A Bit About n-Tier Architectures</strong><br />
Before we dive in too deep, I should probably throw out a note or two on n-Tier architectures.  If you are an IT weenie, and understand this concept, skip to the next section.  Otherwise, hang with me.</p>
<p>In the old days, applications were deployed onto servers, and when a bottleneck was encountered, the physical resources in the machines were expanded.  This was the extent of scalability. Then, some bright engineer realized that if you split a system into two &#8220;tiers&#8221;, you could distribute the workload a bit.  Voila &#8211; the birth of the client/server revolution.  Eventually, though, systems began to grow so large that they needed something else in order to break through the inherent bottlenecks of a 2-tier system. An even brighter engineer realized that there was no reason to stop at &#8220;2&#8243; tiers.  You could have an arbitrary number of tiers in your system.  Thus, the birth of the &#8220;n-Tier&#8221; architecture (&#8220;n&#8221; representing some arbitrary number of tiers).</p>
<p>An &#8220;n-tier&#8221; application architecture is characterized by the <em>functional decomposition</em> of applications, service components, and their distributed deployment. By breaking a system down in such a manner, it provides for improved scalability, availability, manageability, and good resource utilization. A &#8220;tier&#8221; itself is nothing more than a functionally separated hardware and software component that performs a <em>specific function</em>.  Whew &#8211; what a mouthful.</p>
<p>Typical &#8220;tiers&#8221; include:</p>
<ul>
<li>Web server tier: provides HTTP protocol support (i.e. handles web requests)</li>
<li>Application server tier: provides support for web services, business logic, etc. (e.g. web services/SOA)</li>
<li>Database tier: provides data storage and retrieval support (e.g. Oracle, MySQL, mainframe/VSAM, etc.)</li>
</ul>
<div style="text-align: center"><img id="image533" alt="basic.gif" src="http://www.scottburkett.com/wp-content/uploads/2007/01/basic.gif" /></div>
<p>Note: don&#8217;t confuse these &#8220;tiers&#8221; with application &#8220;layers&#8221; (presentation layer, data layer, business logic layer, etc.)  Tiers are architectural in nature, whereas &#8220;layers&#8221; are generally code/library specific.</p>
<p>The important thing to know here is that in an &#8220;n-tier&#8221; model, a system has been broken up into various levels of functionality, each capable of some degree of horizontal scaling.  Which brings me to my next point &#8230;</p>
<p><strong>Horizontal vs. Vertical Scaling</strong><br />
When you hear people talk about &#8220;scaling horizontally&#8221; they are essentially referring to the ability to add new servers to a tier to allow it continue to provide uninterrupted service in the face of continuously increasing usage.  For example, your database is chugging hard and heavy, so you can add new servers to the database tier to distribute the workload.  If your web server is bogged down, you can add new web servers to do the same. This also affords you with a nice layer of failover as well.  If one server experiences an issue (even to the point where it crashes), you have other servers online in that particular tier that can still provide service. This concept is becoming increasingly important as more and more systems are being deployed using SOA models (service oriented architectures).</p>
<p>One great example of horizontal scaling can be seen in Amazon&#8217;s new &#8220;<a target="_blank" title="_blank" href="http://ec2.amazonaws.com">Elastic Computing Cloud</a>&#8221; (my old friend <a title="_blank" target="_blank" href="http://www.linkedin.com/profile?viewProfile=&#038;key=2075805&#038;fromSearch=0&#038;sik=1167883664814&#038;split_page=1&#038;rd=in&#038;goback=%2Esrp_1_1167883664814_in">Chris Brown</a> is a patent co-inventor and senior engineer on that project).</p>
<p>Vertical scaling, on the other hand, is where you extend/expand the physical resources in a server itself.  For instance, your database server is getting way overworked, hitting the swap space early and often.  You can &#8220;vertically scale&#8221; that server by simply adding more RAM, faster hard disks, better CPUs, etc.</p>
<p>There are benefits/pros/cons to each type of scaling.  Obviously there is a cost associated with both.  Horizontal scaling is <em>theoretically</em> infinite, whereas vertical scaling has an obvious ceiling (there is only so much horsepower that you can derive from a single server).</p>
<p>Horizontal scaling only makes sense if the service you are attempting to scale was designed to be extended in this manner. For many third-party applications, such as a database server, this will be the case. Of course, if you are designing the software, you will want to take this into account as you build it.</p>
<p>Think of hardware as simply a <em>vehicle (perhaps a bus) </em>for your software, your real service. If the bus gets too crowded, you add another bus to the fleet. However, not all buses will go to the same destination, so those buses need to connect together in order to get information from point A to point B within your architecture. Voila, you have the meager beginnings of a service-oriented-architecture (SOA).</p>
<p><strong>A Scalability Example </strong><br />
Let&#8217;s set the stage with a typical early-stage example, and we&#8217;ll try to scale this application theoretically as the business scales.</p>
<p>John is an aspiring technology entrepreneur who has developed a really great online service called WidgetFire.  WidgetFire is brand new, so there aren&#8217;t many users yet.  John has built this product in his spare time, and is bootstrapping the business via his day job as a software engineer for another company.  To keep his costs down, he has a single web server (built from extra parts), and he has it co-located at a local data center with a basic level of service (1U single rack space, 1Mpbs throughput, unlimited bandwidth, for probably < $100/month). On this single server, he is running Apache and MySQL together, along with the normal services (bind/DNS, sendmail, etc.)</p>
<div style="text-align: center"><img id="image540" alt="1tier.gif" src="http://www.scottburkett.com/wp-content/uploads/2007/01/1tier.gif" /></div>
<p>So far, scalability is not a concern to John.  But that is about to change. In a big way.</p>
<p>Over a period of a few months, John leverages word-of-mouth marketing and manages to aggregate 25,000 registered users for his service.  The server he is running (which he&#8217;s affectionately nicknamed &#8220;Seabiscuit&#8221;) is holding up fine, but is beginning to feel the strains of all of those new sessions and database queries.  Additionally, his automated e-mail notification list is starting to add to the system load, as now the server is sending out thousands of emails a day.</p>
<p>John &#8220;vertically scales&#8221; his server by adding some additional RAM and performing some additional performance tuning to the database.  This buys him time.  But not much.</p>
<p>Then, WidgetFire gets a mention in a prominent tech blog, and the next thing John knows, he has 100,000 registered users for his service.  His server is on its knees, and practically unresponsive.  Sadly, the data center staff isn&#8217;t much help &#8211; after all, he is running under a pretty basic co-located hosting plan &#8211; and they have bigger problems to deal with than the occasionally unresponsive Seabiscuit.</p>
<p>So John then moves to a very rudimentary n-Tier architecture.  He moves his MySQL database over to a separate server, which frees up resources on the old web server.  Now, the system is humming along smoothly.  But after a few months, WidgetFire is quite the rage on college campuses, and John must once again address how he is going to facilitate additional traffic.</p>
<div style="text-align: center"><img alt="2tier-a.gif" id="image538" src="http://www.scottburkett.com/wp-content/uploads/2007/01/2tier-a.gif" /></div>
<p>He does some vertical scaling on the database server (adds new RAM, faster disks, etc.), but it isn&#8217;t enough.  The new user signups are coming too fast and furious for his 2 server setup to handle.</p>
<p>This particular nexus is where many startups begin to experience some tough scalability issues.  The &#8220;easy&#8221; scaling options have already been exhausted (vertical scaling on one server, splitting the database off into a separate server.)</p>
<p>Fortunately for John, his traction has caught the interest of a handful of investors, and he is able to secure a small round of outside capital.</p>
<p>To get to the next level, John implements a load balancing router, an extra web server, and an extra database server.  He configures the load balancer to distribute incoming web requests evenly between his two web servers.  Additionally, he configures the original database server to be a &#8220;master&#8221;, and the new database server to be a &#8220;slave&#8221; server.  While all database write operations occur on the master server, John realizes that most web requests that require database access will be for &#8220;reads&#8221;, so the slave can offload some of that workload from the master.  Voila &#8211; he has scaled even further!</p>
<div style="text-align: center"><img alt="2tier-b.gif" id="image539" src="http://www.scottburkett.com/wp-content/uploads/2007/01/2tier-b.gif" /></div>
<p>A few more months go by, and John makes the cover of Wired Magazine.  VCs are clamoring to pour their cash into WidgetFire.  While John basks in this glory, he doesn&#8217;t realize that his little server farm is becoming overwhelmed by the sheer success of his venture.  To make matters worse, while John is putting together a plan to scale even further, his slave database server crashes, leaving only the one original database server in operation.  WidgetFire is basically dead in the water.</p>
<p>John brings the slave server back online, but he realizes that more must be done.  He adds an extra web server to the web server tier, and adds an additional slave database server to the database tier.  But he doesn&#8217;t stop there.  John realizes that his actual application, which is comprised of a mish-mash of Java, PHP, and Perl, is utilizing the vast majority of CPU time on the web servers themselves.  John decides to move from a 2-tier model to a 3-tier model by implementing an &#8220;application services&#8221; tier.  He moves this code off of the web servers and onto several new servers.</p>
<div style="text-align: center"><img id="image536" alt="ntier.gif" src="http://www.scottburkett.com/wp-content/uploads/2007/01/ntier.gif" /></div>
<p>John realizes pretty quickly that his original code design really wasn&#8217;t architected for this type of model. He has to spend a couple of months retrofitting his old code to fit into more of a &#8220;web services&#8221; model. He is now surrounded by burgeoning IT costs, hosting fees, and system complexity. All of a sudden, his &#8220;Google-ready&#8221; venture is giving him a headache, and isn&#8217;t much fun anymore.</p>
<p>Of course, had John anticipated the steepness of his growth curve ahead of time, he could have designed his system with it in mind, and avoided at least some of the headaches.</p>
<p><strong>Can&#8217;t money be thrown at the problem?</strong><br />
Sure. To a point.  All things cost money, of course, whether it be labor (people), hardware, or software.  Most systems can <em>initially </em>be scaled to a sufficient level by simply adding more hardware, or expanding the resources within the server.  But that only gets you so far in most cases &#8211; at some point the logical architecture of the system needs to have been designed with scalability in mind.  If the architecture isn&#8217;t scalable, you are either going to hit a ceiling, or spend <em>way too much money </em>to scale it (and even then, there are no guarantees).</p>
<p>It isn&#8217;t a question of whether or not money can be thrown at the problem &#8211; it all costs money.  The question is <em>how much money are you going to have to spend to scale it?</em>  Obviously, there rarely exists an endless supply of capital that can be leveraged to solve a scalability problem &#8211; especially in the startup realm. Clearly, you want to be able to control your tech spend (which is a big part of your overall burn).</p>
<p>The bottom line is this:  If you <em>plan </em>for scaling initially, instead of throwing a bunch of crap together and hoping it will get you to point &#8220;B&#8221;, the less money you are going to spend as you scale.</p>
<p>To properly address scalability, you have to take a holistic approach, and examine your <em>architecture</em>, your <em>software components</em>, and your <em>hardware configurations</em>. Then you have to deploy capital in an intelligent manner. Otherwise, you could end up like John in our fictitious example &#8211; sitting on a pile of code that really wasn&#8217;t designed to split up into services across an n-tier architecture. And that, my friends, represents a serious misuse of capital.</p>
<p>If you are scaling by adding new hardware &#8211; <em>that is generally a good problem to have</em> &#8211; that hopefully means your business is expanding.  However, if you are having to rewrite large amounts of code in order to scale &#8211; you&#8217;ve likely made some very serious mistakes.  Too many of those mistakes, and you&#8217;ll be dead in the water.  You see the latter quite often in the startup world, again, as there is so much pressure to slap something together and get it out the door.</p>
<p><strong>Architectural Concerns</strong><br />
It all starts with the blueprint of your architecture.  Note, I am not referring to your functionality matrix/map, your application requirements definition, etc.  I am talking about your physical and logical architectures.</p>
<p>When I say <em>physical architecture</em>, I am referring to the physical hardware components that make up your network, application, etc. Things to consider:</p>
<ul>
<li>What are your network capabilities? Throughput, bandwidth, etc. Are these scalable from a cost and availability standpoint?</li>
<li>What are the capabilities and specifications of your web servers, application servers, database servers, etc.?</li>
<li>How many of these servers do you have at your disposal? Are they dedicated or shared?</li>
<li>What are your capabilities for handling increased DNS requests, e-mail volume (in and out), etc.?</li>
</ul>
<p>When I refer to your <em>logical architecture</em>, I am referring to the way in which your various software components connect with and layer into one another.  Things to consider:</p>
<ul>
<li>Are you properly segregating functional aspects of your application into easily managed and scalable services (e.g. SOA)?</li>
<li>Are you isolating those services in unique hardware or operating environments?</li>
<li>Are you building for the short-term, but planning for the long-term (i.e. how extensible will this thing be down the road?)</li>
</ul>
<p>If you are in startup mode it is very easy to fall into the trap of &#8220;getting started&#8221; &#8211; pushing code and charging up the hill.  &#8220;Get-to-market&#8221; pressure from investors rarely helps. However, many such efforts are met with stiff resistance once the entrepreneur realizes that the &#8220;hill&#8221; he or she just conquered is actually but a small plateau on a mountain comprised of increasingly steeper slopes. It all starts with a good plan in place!</p>
<p>Having the right architecture in place doesn&#8217;t guarantee that you won&#8217;t have to eventually add more hardware or write more code.  Actually, in the early stages, you may actually spend more money (especially if you are deploying web services on their own servers, etc.)  However, the proper architecture allows you to get the <em>most</em> out of out that new hardware and software, as you will be plugging it into a framework that was built with it in mind.</p>
<p><strong>A Note on System Services</strong><br />
Before you start diving off into creating a true services oriented architecture, do yourself a favor and split your system services off accordingly.  Things like DNS services and e-mail should be move off of and away from your application&#8217;s production environment.  I bring this up because more often than not, you find system services being co-located on production web servers.</p>
<p>It is hard to get a sense of an application&#8217;s true load on a physical machine when you have a million other things running on it.  This becomes even more important if you are planning on using tools like Six Sigma to measure scaling and availability metrics, as you will need to do everything possible to remove potential causes of common/special cause variation.</p>
<p><strong>The Importance of Performance Tuning</strong><br />
Another very important aspect of scaling is <em>performance tuning</em>.  Performance tuning is essentially the art of tweaking and fine-tuning your various applications and services in order to maximize their operational efficiency.  There are more ways to performance tune a system than you can possibly imagine.  Some obvious examples would include:</p>
<ul>
<li>Tuning your database server to use more or less RAM (for buffering, sorts, key lookups, etc.), adding indexes on data tables to decrease query times, etc.</li>
<li>Optimizing your web server&#8217;s socket configuration to improve connection times</li>
</ul>
<p>Some not-so-obvious examples might include:</p>
<ul>
<li>Enabling DMA (direct memory access) for a server&#8217;s IDE drives to improve seek times (you should be using 15K RPM SCSI drives, but if you aren&#8217;t &#8230; )</li>
<li>Making sure your OS kernel (for UNIX/Linux) was compiled with only the services and features you require (i.e. remove kernel bloat)</li>
<li>Mounting filesystems with the &#8220;+noatime&#8221; flag, which will prevent the OS from updating the (mostly) meaningless &#8220;last access timestamp&#8221; of every file you read or write</li>
<li>Partitioning your OS so that system files, logs, etc. are on their own partition (or even a separate IDE channel or SCSI bus)</li>
<li>Using the &#8220;strip&#8221; command to remove debugging/profiling data from common executables to lower their memory footprint (On UNIX systems)</li>
</ul>
<p>I have known people who have spent thousands on new hardware, only to realize later that their applications or server/OS were simply not optimized. if you don&#8217;t have the requisite skills in house to do performance tuning, then outsource this function immediately &#8211; <em>it is that important</em>.</p>
<p>Finally, I should mention that performance tuning should not be viewed as a one-time activity.  You should routinely profile and tune your systems (both hardware and software).</p>
<p><strong>Network Scalability</strong><br />
Another thing to stay on top of is your service level agreements with your data center or hosting provider.  There are fundamentally three or four things to keep in mind:</p>
<p>First, if you are bootstrapping a startup, and you are using a low-cost, shared server, you need to move to a dedicated server solution as soon as possible.  Trust me.</p>
<p>Next, make sure that you have the ability to quickly secure additional rackspace and bandwidth as you need it.  Having your data center tell you that you are going to have to suffer major downtime because they have to move your servers to a &#8220;bigger rack&#8221; is probably not a good thing.</p>
<p>Third, make sure that the connections from your servers to the net are <a target="_blank" title="_blank" href="http://en.wikipedia.org/wiki/Burstable_billing"><em>burstable</em></a>.  When you have those huge traffic spikes because someone put a mention of your site on digg.com, Slashdot, etc., you&#8217;ll want to be able to handle the temporary increase in traffic (without necessarily incurring a large bandwidth bill).</p>
<p>Finally, make sure that your <em>throughput</em> is not capped, or if it is capped, make sure it is capped higher than you think you&#8217;ll need.  Don&#8217;t confuse <em>bandwidth</em> with <em>throughput</em>.  Bandwidth refers to how much data your connection can transfer over a period of time (e.g. 100 gigabytes per month, etc.)  Throughput, on the other hand, refers to how much data can be flowing through your connection at <em>any given time</em> (e.g. 10Mbps).  Think of throughput as being the thickness of your server&#8217;s pipe &#8211; obviously, a lot more can flow through a garden hose than a soda straw.  Same analogy.</p>
<p>To illustrate the point on throughput; a few years back we had a system that began to be wickedly unresponsive.  The CPU loads on the server were only about 35-50%, so it didn&#8217;t make a lot of sense.  It turns out that the connection had been capped at 10Mbps.  Anything over 10Mpbs at any point in time had to basically wait in the queue.  This caused perceived &#8220;slowdowns&#8221; by users.  Raising the throughput cap remedied the problem, of course.</p>
<p>On a final note, I want to voice my support for co-locating servers rather than using a full-service hosting provider.  If you have the skillset in house to maintain the boxes, using co-location can save you some money, and give you more flexibility.  Again, in startup mode, every penny counts.   If you are in or near Atlanta, I highly recommend my friends down at <a title="_blank" target="_blank" href="http://www.capitalinternet.com">Capital Internet</a>.  I&#8217;ve co-located and hosted servers with them for 6 years now, and it has been a very enjoyable, hassle-free partnership.</p>
<p><strong>Advanced Topics<br />
</strong>There are a lot of advanced topics that come up in discussions about scaling applications.  Things like caching, high availability clustering, network storage (via SANs), and distributed networks.  Obviously, those are very specific areas that are beyond the scope of this already ridiculously long blog post.  Suffice it to say that there are some very advanced (and expensive) toys out there that can make scaling a lot easier.  However, the vast majority of applications/services can be scaled to rather massive proportions if you  simply  follow the bullet points at the top of this post.</p>
<div align="center">
<div align="left">
<div align="left">
<div align="left">I hope you&#8217;ve found this blog post to be of value.  If you are an entrepreneur who has further questions on how to scale your application/service, I invite you to visit our forums over at <a target="_blank" title="_blank" href="http://www.startuplounge.com">StartupLounge.com</a>, and post your question in the &#8220;CTO&#8217;s office.&#8221;  Happy scaling!</div>
<p>Cheers.</p>
<p align="left">
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.scottburkett.com/technology/scaling-your-technology-with-your-business-530.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JAD: Creating a Functionality Matrix</title>
		<link>http://www.scottburkett.com/process-improvement/jad-creating-a-functionality-matrix-107.html</link>
		<comments>http://www.scottburkett.com/process-improvement/jad-creating-a-functionality-matrix-107.html#comments</comments>
		<pubDate>Wed, 08 Nov 2006 13:54:10 +0000</pubDate>
		<dc:creator>Scott Burkett</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[facilitation]]></category>
		<category><![CDATA[facilitators]]></category>
		<category><![CDATA[functionality_matrix]]></category>
		<category><![CDATA[functional_requirements]]></category>
		<category><![CDATA[IT-Management]]></category>
		<category><![CDATA[JAD]]></category>
		<category><![CDATA[joint_application_design]]></category>
		<category><![CDATA[RAD]]></category>
		<category><![CDATA[rapid_application_development]]></category>
		<category><![CDATA[requirements_gathering]]></category>
		<category><![CDATA[Software-Process-Improvement]]></category>

		<guid isPermaLink="false">http://www.scottburkett.com/index.php/process-improvement/2006-04-10/jad-creating-a-functionality-matrix.html</guid>
		<description><![CDATA[As promised in the recent article on JAD Facilitation Basics, this article will focus on the steps needed to create a viable functionality matrix, which will serve to summarize and prioritize the functionality for a proposed software system.<p class="read-more"><a href="http://www.scottburkett.com/process-improvement/jad-creating-a-functionality-matrix-107.html">Continue reading <span class="meta-nav">&#8594;</span></a></p>]]></description>
			<content:encoded><![CDATA[<p><img border="1" align="right" style="margin-left: 10px" id="image141" title="matrix_small.gif" src="http://www.scottburkett.com/wp-content/uploads/2006/01/matrix_small.gif" />As promised in my previous article on JAD Facilitation Basics, this article will focus on the steps needed to create a viable functionality matrix, which will serve to summarize and prioritize the functionality for a proposed software system. Thanks to the recent reader who reminded me that this post was long overdue!</p>
<p><span id="more-107"></span></p>
<p>As a quick refresher, in a JAD context, the functionality matrix represents a prioritized collection of the major functional components of a proposed system.  These functional areas were, hopefully, agreed to by all relevant stakeholders who attended the JAD session(s) that went into its creation.</p>
<p>Before we go further, it is important to point out something.  As much as it pains me to say this, my way is not the only way, nor is it necessarily the best way.  It has worked for me consistently in the past, however.  Hopefully, at a bare minimum, this article will at least give you a framework on which to build your own method(s), or at least spark your imagination a bit.</p>
<p>Before creating the functionality matrix, I recommend having the scribe, or some other able-bodied person, take the controls of a laptop and fire up Microsoft Excel.  Excel represents a fast and easy way to collect and tabulate data.  Excel will become even more important later on, when we begin doing some calculations.  If at all possible, I would recommend being in a room where the laptop can be projected onto the wall.  By doing so, everyone in the room can participate in the creation of the functionality matrix.</p>
<p>At some point during the JAD session, you, as the facilitator, will lead the group through a series of exercises in order to capture the broad requirements of the system. For many new facilitators, this part is the hardest, however, it doesn&#8217;t have to be.  It really, truly is amazing what happens when you simply ask &#8220;ok, what, at a high level, does this system need to do?&#8221; The general flow will be as follows:</p>
<ol>
<li>Brainstorm ideas</li>
<li>Streamline the ideas by grouping or removing</li>
<li>Go to step #1 and repeat as needed</li>
<li>Prioritize the final list of requirement categories</li>
<li>For each high level requirement area, go to step #1 and repeat as many times as necessary (to capture the detailed requirements).</li>
</ol>
<p>When brainstorming requirements, it is important to capture <em>each and every</em> idea.  Some ideas will be great.  Some will be so-so.  A few will be completely worthless in the end.  But capture them <em>all</em>.  By doing so, you are guaranteeing that every voice is behind heard; at least once. <em><strong>Many JAD sessions fail because consensus was not attained, or voices go unheard</strong><strong>.</strong></em></p>
<p align="center"><!--adsense--></p>
<p>The process of <em>brainstorming</em> is used to quickly and efficiently capture a stream of ideas.  It is not a time for discussion, and certainly not the time to argue one&#8217;s case.  If you catch your participants doing this, it is imperative that you remind them of this!  Capture first, discuss later.</p>
<p>It is practically impossible to instruct someone how to conduct a brainstorming session.  The easiest way to learn is to participate in one.  However, here is a small sample of the general flow of a session:</p>
<p><strong>Facilitator</strong>: Ok, we are now ready to capture the high-level requirements of this new system.  We are using a brainstorming session, which means no discussions, only ideas!  We have 10 minutes for this, so just blurt them out.  As you call them out, I will write them up here on the whiteboard. Mike, our scribe, will also capture all of the ideas on his laptop for use later on.  Ready? Begin.</p>
<p><strong>John</strong>: The system should offer basic RFQ functionality for our buyers.</p>
<p><strong>Facilitator</strong>: Ok, good one (writes it on whiteboard).</p>
<p><strong>Susan</strong>: We also need a more in-depth set of RFP functionality.</p>
<p><strong>Facilitator</strong>: Ok, very good.</p>
<p><strong>Roger</strong>: But aren&#8217;t those things sort of the same thing?</p>
<p><strong>Facilitator</strong>: Maybe, maybe not.  Let&#8217;s focus on gathering the rest of the requirements, then we&#8217;ll discuss the merits of each of them in turn.</p>
<p><strong>Jane</strong>: We&#8217;ll need a news portal.</p>
<p><strong>Facilitator</strong>: Got it.</p>
<p><strong>Jane</strong>: And we&#8217;ll also need an online supplier directory.</p>
<p><strong>Facilitator</strong>: Very good.  Let&#8217;s keep going. Faster, if we can.</p>
<p><strong>John</strong>: Permission marketing.</p>
<p><strong>Susan</strong>: Invoicing and billing.</p>
<p><strong>Randy</strong>: Broker integration.</p>
<p><strong>Roger</strong>: Contract management.</p>
<p><strong>Facilitator</strong>: Great! Let&#8217;s keep those ideas flowing!</p>
<p>and so on &#8230;</p>
<p>If you get the team working in a rapid-fire mode, you will be completely <em>amazed</em> at the sheer number (and quality!) of ideas that come forth.</p>
<p>As a footnote here, it may be helpful to have the team &#8220;practice&#8221; a brainstorming session first.  First, pick some arbitrary inane topic.  For example &#8220;the best way to hand wash a car,&#8221; or &#8220;we are building a house, let&#8217;s talk about what features this house needs to have in it.&#8221;  Allocate 5 minutes to the brainstorming session, and let them go through it.  This is a good ice-breaker as well. Give them some feedback on their brainstorming techniques at the end, and then move into the real session.</p>
<p>Once the time limit has expired (the time limit is completely arbitrary, although I recommend keeping it to 10 or 15 minutes at the most), and you have &#8220;broadly&#8221; captured the first round of requirements, it is then time to examine them in turn. Of course, anything the group feels is out of place, or nonessential, can be easily removed from the list.</p>
<p>Frankly, the easiest way to examine the requirements is to simply ask the group to comment openly on the generated list.  Most of the time, they will logically begin funneling similar requirements into broader groupings, which is the ideal scenario.  For example, RFQ, RFP, and contract management functionality might all end up in a bucket called &#8220;transactional requirements.&#8221;  Things like &#8220;receiving&#8221; and &#8220;shipping&#8221; could be logically grouped into a broader &#8220;logistics&#8221; category.  It is up to the group, through your leadership, to determine what the best number and type of categories to use.</p>
<p>Ultimately, you want to have a nice list of 5-10 (or even a dozen) high level areas, with each of them having perhaps a few sub areas within them.  Once you&#8217;ve done this, you should start a second round of brainstorming.  This time, however, the goal is to provide ideas around the current list of functional areas.  We do this for several reasons, but the primary reason is that by seeing the list up on the wall, the participants will naturally begin to expound upon those ideas, and come up with even newer ones &#8230; or things that perhaps were overlooked in the first round of brainstorming.</p>
<p align="center"><!--adsense--></p>
<p>Once this 2nd round has concluded, you should again lead the group through an open discussion of the requirements.  Again, the priority here is to streamline the list &#8211; grouping and removing as needed.  You can theoretically repeat this process any number of times, although generally speaking, 2 or 3 times is sufficient.</p>
<p>Once you&#8217;ve done this, you should now be in possession of the broad, high-level requirement areas for this system.  You are now ready to move into the prioritization phase. We will brainstorm the <em>detailed requirements</em> shortly, but for now, let&#8217;s focus on the the high level requirement areas.</p>
<p>Remember in the previous article where I mentioned that having several thousand dollars in fake money would come in handy?  Well, we&#8217;ve arrived at that discussion!  There are lots of ways to lead a group through a prioritization exercise, but I am partial to what is known as the &#8220;$20 method&#8221;.  In this model, the facilitator gives each participant $20 in singles.  You can also do this without using actual physical fake money, but it is more fun to do it this way.  Each participant can &#8220;spend&#8221; their $20 on whatever functionality they desire.  The more money they spend on an area, the more important that area is to them.  At its core, this is a simple exercise in &#8220;weighting&#8221;.</p>
<p>If John spends $8 on &#8220;logistics&#8221;, and $3 on &#8220;transactional functionality&#8221;, then that means John places a higher value on the logistics functionality within the newly proposed system.  At the end of the exercise, it is interesting to see what areas people spend their money on.  Often times, their areas align politically with their vested interests &#8211; so keep this in mind.</p>
<p>As you can see in this partial screenshot of our Excel model (click image to expand), the business side of the equation was represented by three people (John, Susan, and Mike).  The technical team had 4 members present (Jeff, Roger, Jane, and Jill).  They each spent $20 on the various high-level functional areas (Transaction, Workflow Management, etc.)  You can also see some additional statistics to the right, such as simple summations and averages.  Of note are the color coded cells to the far right, which indicate which control group favored a particular area &#8211; for instance, the technology team spent more money (on average) on Workflow Management than the business team.<br />
<a title="priority1.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif" /></p>
<p><a title="priority1.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif"> </a><a title="priority1.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif"> </a><a title="priority1.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif"> </a><a title="priority1.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif"> </a></p>
<div style="text-align: center"><a target="_blank" title="priority1.gif" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.gif"><img width="128" height="47" alt="priority1.gif" id="image147" src="http://www.scottburkett.com/wp-content/uploads/2006/01/priority1.thumbnail.gif" /></a></div>
<p>I should point out that all of the functional areas are &#8220;important&#8221; if they&#8217;ve made the final list.  Just because one area doesn&#8217;t get as much attention as the others, doesn&#8217;t mean it isn&#8217;t critical to the system.  It is also important to point out that the final functionality matrix is not necessarily set in stone.  Even though we&#8217;ve applied some basic statistical methods to capturing, grouping, and prioritizing the requirements, in the end, the business drivers may screen that a certain requirement be bumped up the list, or bumped down.  Common sense, of course, should prevail.  The functionality matrix is simply a streamlined viewpoint into the system requirements.</p>
<p>The same weighting method can be applied to the requirements under each major category.  I generally use a separate Excel sheet for this.  As you can see from the screenshot below, the four requirement areas under the larger &#8220;transaction&#8221; category are also prioritized.<br />
<a title="priority2.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif" /></p>
<p><a title="priority2.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif"> </a><a title="priority2.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif"> </a><a title="priority2.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif"> </a><a title="priority2.gif" class="imagelink" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif"> </a></p>
<div style="text-align: center"><a title="priority2.gif" target="_blank" href="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.gif"><img width="128" height="77" alt="priority2.gif" id="image148" src="http://www.scottburkett.com/wp-content/uploads/2006/01/priority2.thumbnail.gif" /></a></div>
<p>You&#8217;ll also notice that at the top of the sheet, there is a small decision matrix.  This  four quad matrix compares technical complexity on the vertical axis, and business benefit on the horizontal axis. The four quadrants break down as follows:</p>
<ul>
<li>Upper left quadrant (high technical complexity, but low business benefit): Definitely not in phase one</li>
<li>Bottom right quadrant (low technical complexity, but high business benefit): Definitely in phase one</li>
<li>Lower left quadrant (low technical complexity, and low business benefit): Examine options &#8211; Risk averse approach</li>
<li>Upper right quadrant (high technical complexity, and high business benefit): Examine options &#8211; Risk taker approach</li>
</ul>
<p>Hopefully, this is self-explanatory.  The idea is to figure out which quadrant each subfunctional area falls within. To do this, we need to establish some cutoff values. At the top left is a smaller version of the matrix with &#8220;cutoff&#8221; values in it.  These values represent the cutoff values that affect the conditional shading of the cells in the main content area.  The idea is that you should be able to quickly scan the content area to see which functional areas fall within each quadrant of the decision matrix.  For example, the &#8220;contract management&#8221; functional area (under the larger &#8220;Transaction&#8221; category) has a business benefit value of 47.92%.</p>
<p>We got that by taking the average for that line item (10.00 + 8.75 + 10.00) and dividing that number by the total points spent (20, as in $20).  That gives us a simple percentage.  47.92% of the business teams money went into the &#8220;contract management&#8221; functional area.  Since our cutoff value is 30%, the shaded color is green (which according to the decision matrix, would indicate that the business folks feel that this functional area should be in phase one of the system). This area clearly has a high business benefit!</p>
<p>However, the technical team&#8217;s score is 45.83% &#8211; which is over the cutoff value of 25%.  This means that developing this functional area will come with a high level of technical complexity (meaning risk!).</p>
<p>So now we have a situation where both sides of the equation (business and technology) feel that this area has a high value.  This would push us to the upper right quadrant (shaded yellow).   I know this all sounds a bit complicated &#8211; and it is.  But hopefully this all makes some sense to you.</p>
<p>This post has run a bit long (okay, way long.)  I will save the final bit (where we dive into the detailed requirements and finalize things) for another post.  I&#8217;ll also provide some Excel templates for you to use as well.</p>
<p>Cheers, and happy JAD&#8217;ing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottburkett.com/process-improvement/jad-creating-a-functionality-matrix-107.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>JAD: Facilitation Workshop Basics</title>
		<link>http://www.scottburkett.com/process-improvement/jad-facilitation-workshop-basics-122.html</link>
		<comments>http://www.scottburkett.com/process-improvement/jad-facilitation-workshop-basics-122.html#comments</comments>
		<pubDate>Mon, 13 Mar 2006 11:00:08 +0000</pubDate>
		<dc:creator>Scott Burkett</dc:creator>
				<category><![CDATA[IT Management]]></category>
		<category><![CDATA[Process Improvement]]></category>
		<category><![CDATA[facilitation]]></category>
		<category><![CDATA[facilitators]]></category>
		<category><![CDATA[functional_requirements]]></category>
		<category><![CDATA[IT-Management]]></category>
		<category><![CDATA[JAD]]></category>
		<category><![CDATA[joint_application_design]]></category>
		<category><![CDATA[RAD]]></category>
		<category><![CDATA[rapid_application_development]]></category>
		<category><![CDATA[requirements_gathering]]></category>
		<category><![CDATA[Software-Process-Improvement]]></category>

		<guid isPermaLink="false">http://www.scottburkett.com/index.php/process-improvement/2006-03-13/jad-facilitation-workshop-basics.html</guid>
		<description><![CDATA[This article will take a more hands-on look at conducting JAD workshop sessions. While there is no single best way to accomplish JAD objectives, I will try to present a format that has worked nicely for me in the past, in the hopes that it will give you some ideas as to how best to structure your own sessions.<p class="read-more"><a href="http://www.scottburkett.com/process-improvement/jad-facilitation-workshop-basics-122.html">Continue reading <span class="meta-nav">&#8594;</span></a></p>]]></description>
			<content:encoded><![CDATA[<p></p>
<div style="text-align: center"><img width="128" height="11" alt="divider.png" id="image163" src="http://www.scottburkett.com/wp-content/uploads/2006/01/divider.png" /></div>
<p align="left"><img hspace="10" align="right" id="image123" title="facilitation.gif" src="http://www.scottburkett.com/wp-content/uploads/2006/01/facilitation.gif" />As promised in my post on <a href="http://www.scottburkett.com/index.php/archives/112">IT Facilitation Skills</a>, this article will take a more &#8220;hands-on&#8221; look at conducting JAD workshop sessions. While there is no single &#8220;best&#8221; way to accomplish JAD objectives, I will try to present a format that has worked nicely for me in the past, in the hopes that it will give you some ideas as to how best to structure your own sessions.<span id="more-122"></span></p>
<p>JAD (Joint Application Design), is a software design process which attempts to bring together various business stakeholders (most likely users) and IT professionals in a highly focused workshop environment.   Why do we prefer this format?  Well, in the old days (gee, all of 10 or 15 years ago) most sets of functional requirements were cobbled up by business analysts and &#8220;tossed&#8221; over the wall to the software engineers, whereupon we were supposed to plop a handful of arcane ingredients into a big pot, mutter a few incoherent passages from Ken Thompson&#8217;s <em>UNIX Philosophy</em> and stir until some magic software solution poofed out of it. Alas, the road to JAD is paved with the morasses of projects past that have stemmed from poor requirements gathering.</p>
<p>Of course, the problem with this is obvious &#8211; business analysts are generally not technologists, and vice-versa. Business personnel are not necessarily adept at taking into account technical constraints/limitations, best practices, or the newest innovations. Likewise, technologists have not historically been overly proficient at cobbling together business requirements.   It has been unequivocally proven that by bringing both sides of the house together to define the requirements that a vast majority of common problems and misunderstandings can be dealt with up front (where they cost $1,000), rather than in the 47th week of the project (where they cost $1.3M).</p>
<p>Make no mistake, JAD is not the panacea for software development, or even requirements gathering, for that matter.  It can, however, provide a pretty good path of least resistance.  Theoretically speaking, the big advantage of JAD is <em>accuracy</em>, or the ability to deliver a system with the functionality that is actually needed.  In addition, JAD affords you with a dramatic shortening of the time it takes to complete a project (due to having tighter functional specs up front). Of course, your mileage may vary &#8211; I have found that having a very experienced facilitator goes a long way toward determining the eventual impact of the session(s). The use of JAD also improves the quality of the final product by focusing on the gathering of accurate requirements, thus reducing the likelihood of errors that are expensive to correct later on.</p>
<p>Much of this information is taken from &#8220;consulting 101&#8243; &#8211; if you have some business background, a lot of the initial concepts may be familiar to you.  But keep reading &#8211; we&#8217;ll get vertical soon enough. I apologize in advance for this article&#8217;s length, but I don&#8217;t believe in &#8220;blogging for blogging&#8217;s sake.&#8221;  I prefer my blog entries to have substance and value.  I hope you will agree!</p>
<p><strong>Workshop Preparation</strong></p>
<p>As any experienced facilitator will tell you, quite a bit of the work effort you will put in will occur well before the sessions even begin.</p>
<p>The very first thing that the facilitator needs to do is to ensure that he/she fully understands the context of the business problem being addressed. Note that I did not say that &#8220;granular industry knowledge&#8221; was necessary, nor did I mention anything about the facilitator having technical prowess.  The focus here should be on  understanding the context of <em>the business problem</em>.</p>
<p><em>What </em><em>is the problem we are dealing with here?  Who is affected by it? What are we trying to accomplish.  What stakeholders will be affected by this system, and how many of them will attend the session(s)?</em></p>
<p>Once you have a grasp of the breadth of things, you will be in a position to direct the subject matter experts to drill down vertically into the problem. Interviewing various stakeholders is a good way to cobble up the knowledge that you need &#8211; this can usually be done pretty quickly.</p>
<p>Don&#8217;t be surprised, however, if you get to day one of the session and realize that you overlooked an important aspect of the group dynamic or the business problem.  This can (and will) happen.  Just prepare yourself as best as you can up front, and be prepared to augment that knowledge with things you pick up on-the-fly during the session.</p>
<p>As far as physical, tangible items goes, here is a list of items that I have found to be helpful during a JAD session:</p>
<ol>
<li>Large whiteboard (preferrably mounted on wall), markers, eraser</li>
<li>Large Post-it style easel pads</li>
<li>Projector (for use with workshop slides)</li>
<li>Laptop with Microsoft Office suite (Word, Excel, etc.), or some other set of tools (Corel Office, Appleworks, Lotus Smart Suite, OpenOffice/StarOffice, etc.)</li>
<li>Several thousand dollars in fake money (I&#8217;ll explain later &#8211; ha!)</li>
</ol>
<p align="center"><!--adsense--></p>
<p><strong>Workshop Agenda</strong></p>
<p>As a starting point, I like to break down requirements gathering into two distinct phases &#8211; both phases consisting of facilitated JAD sessions.  In the first JAD session, we will gather very high-level requirements and funnel them into what I call a <em>prioritized functionality matrix</em>.  In the second session, we take that functionality matrix and generate draft use-cases from them.</p>
<p>For the first session, which I think is the most critical, I tend to follow a high-level agenda similar to the following:</p>
<ul>
<li>Introductions:</li>
<ul>
<li>Session Roles</li>
<li>Ground Rules</li>
<li>Objectives</li>
</ul>
<li>Reaffirm:</li>
<ul>
<li>Vision</li>
<li>Business Drivers</li>
<li>Business Context</li>
</ul>
<li>Baseline Functionality Matrix</li>
<li>Wrap up</li>
</ul>
<p>We will discuss each of these items in more detail below.</p>
<p>For the second session, the agenda would look something like this:</p>
<ul>
<li>Quick Review of Functionality Matrix</li>
<li>Use Case Mini-Tutorial (to educate the stakeholders)</li>
<li>Use Case Identification</li>
<li>Draft Use Cases</li>
<li>Wrap Up</li>
<li>Questions</li>
<li>Next Steps</li>
</ul>
<p><em>NOTE: We&#8217;ll cover the detailed creation of the functionality matrix and use cases in separate articles.<br />
</em></p>
<p><strong>Session Roles</strong></p>
<p>Before beginning your session, the facilitator should work with the various stakeholder participants to identify those individuals who will fill certain critical session-specific roles.  These roles are discussed briefly below, but it is incredibly important that these people be identified in advance, and are not surprised by their assignments on the day of the session!</p>
<p><em>The Facilitator:</em> This is the easy one.  This is the person leading (facilitating!) the session.  For more info, see my article on <a href="http://www.scottburkett.com/index.php/archives/112">IT facilitation skills</a>.</p>
<p><em>Timekeeper:</em> Simply put, this person is responsible for watching the clock and alerting the facilitator when sessions (or segments of a session) are approaching the pre-determined cutoff point.  For example, the facilitator may decide to give the group 5 minutes to brainstorm solutions to a particular problem.  The timekeeper might alert the facilitator when the clock hits 4 minutes (1 minute warning), and then once it hits the 5 minute limit. This can be done silently by a nod of the head or raising of the hand, or even verbally. Maintaining adherance to a time schedule will help keep people focused, and assist in keeping things rolling along.</p>
<p><em>Scribe:</em> Outside of the facilitator, this person probably has the most instrumental role in the success of a session.  The scribe is essentially the secretary &#8211; they keep track of all major outcomes of the session.  This is similar to meeting minutes, but is more detailed. This can be done via pen and paper, but in most cases, it is probably best done on a laptop, where the person can switch around between Excel, Word, and other applications.  Depending upon the makeup of the stakeholder groups in the room, this person may also be the one responsible for drafting the functionality matrix (in real-time, with input from others).</p>
<p><em>Parking Lot Attendant:</em> Invariably, things are going to arise that are out of the scope of the session&#8217;s guidelines.  In order to keep from getting off track and derailing the session, the facilitator may reserve the right to &#8220;park&#8221; those issues or questions in the &#8220;parking lot&#8221; so that they may be addressed later.  I generally like to address the parking lot issues list at the end of the session (or at the end of each day, if the session will span multiple days).</p>
<p><em>SMEs/Participants/Devil’s Advocates:</em> Everyone in the room, including the people filling the roles above.  Remember, the more valued input you have, the more productive your session will be!</p>
<p>You may decide to come up with other ancillary responsibilities and roles &#8211; this is your discretion as the facilitator.  Just be careful not to over-delegate to the participants &#8211; you want the principal parties to be focused on the task at hand, and not immersed in some other duties that will detract from this.</p>
<p><strong>A Bit on Brainstorming<br />
</strong></p>
<p>For those of you who may be new to the concept of brainstorming, I will simply refer you to the great entry over at <a target="_blank" title="_blank" href="http://en.wikipedia.org/wiki/Brainstorming">WikiPedia</a>. However, I will state that I am a big fan of whiteboards, and an even bigger fan of the big Post-It easel style pads.  Those are great for capturing ideas quickly, ripping them off, sticking them on the wall, and moving along to the next idea.</p>
<p><strong>Ground Rules</strong></p>
<p>It always pays to lay out the ground rules up front, so that everyone is on the same page from the beginning of the session.  What these rules are, in the end, is up to you as the facilitator.  In general, I like to use these as a starting point:</p>
<ul>
<li>Stay focused</li>
<li>Be honest</li>
<li>Respect opinions</li>
<li>Stay on time</li>
<li>Use the parking lot</li>
<li>Brainstorming rules</li>
<ul>
<li>There are no bad ideas</li>
<li>No criticism of an idea</li>
<li>Strive for quantity, not quality</li>
<li>Strive for creativity, think out of the box</li>
<li>Build on the ideas of others</li>
</ul>
</ul>
<p>After I explain these rules to the group, I generally ask if anyone else in the room has any other ideas for ground rules to add to the list for the session.  Occasionally, someone will throw something out there (no checking email during the session, turn off cell phones, etc.). Calling for other ground rules is a great way to begin empowering the participants, and to set the tone for the session.</p>
<p><strong>Objectives</strong></p>
<p>Once the session roles and ground rules have been announced, I like to immediately state what the official &#8220;objectives&#8221; of the JAD session are.  You would be amazed on the first day at how many people actually proclaim things such as &#8220;oh, I thought that JAD meant we were going to build the application together&#8221; or &#8220;I thought we were just going to talk about the need for the project, I didn&#8217;t know we were designing it!&#8221;  The objectives I usually use as a starting point are:</p>
<ul>
<li>Define the system scope</li>
<li>Draft use case models for primary scenarios</li>
<li>Define the domain model/glossary</li>
</ul>
<p>The &#8220;system scope&#8221; is going to be defined largely by our functionality matrix (deliverable from the 1st session), whereas the use case models and domain model/glossary are going to be outputs from the 2nd session.</p>
<p>You may feel the urge to add additional objectives to this list.  My only advice to you here would be to make sure to tie any new objectives to specific deliverables that will come out of your session(s).</p>
<p><strong>Reaffirmations<br />
</strong></p>
<p>I like to go through a series of &#8220;reaffirmations&#8221; before I lead the group into unchartered waters.  I want everyone in the room, from the lowliest coder to the most senior executive, to understand <em>why</em> we are building this product, <em>who</em> it will affect and benefit, and <em>what</em> value it will bring to the market or stakeholders.</p>
<p>Reaffirming the <em>vision</em> of the project is first on the list.  The &#8220;vision&#8221; could be anything, really, but it should be related in some way to the project.  If your organization is following a PMI style project plan, then this is probably the project charter.  If you are building a software platform for a startup company, then this is probably the actual vision statement of the company itself.</p>
<p>Next, I like to reaffirm the <em>business drivers </em>and <em>business context</em>.  <em>Why</em> are we doing all of this again? What business problem will this project solve? How big is the market we are talking about here? What is the value proposition?</p>
<p>Let&#8217;s state all of this as a matter of fact &#8211; level the playing field by educating (or-re-educating) everyone in the room.</p>
<p><strong>Critical Success Factors</strong></p>
<p align="left">At this stage in the game, we really haven&#8217;t done <em>anything</em> toward the actual design of the system.  This is a good thing.  All of this groundwork will serve us well as we move further into the process.</p>
<p align="left">After the reaffirmations, I like to do a quick 5-10 minute brainstorming session where the group throws out potential <em>critical success factors </em>(CSFs).  This allows the stakeholders to identify very succinctly those things that will make or break this project or product.</p>
<p align="left">Consider these examples:</p>
<ul>
<li>Head of Marketing: <em>&#8220;It is imperative that we have 24&#215;7 uptime &#8211; availability will be critical to our customers!&#8221;</em></li>
<li>Lead Developer: <em>&#8220;We should implement this system using an open architecture in order to easily integrate new technologies or functionality in the future.&#8221;</em></li>
<li>Business Analyst: <em>&#8220;It is important that we have executive buy-in and participation from our key industry design partners.&#8221;</em></li>
</ul>
<p>You get the idea.  Don&#8217;t camp out in this stage &#8211; this should be quick, but also helpful in setting everyone&#8217;s expectations and understandings.</p>
<p><strong>Current Processes (As-Is) / </strong><strong>Future Processes (To-Be)</strong><strong><br />
</strong></p>
<p>Once we&#8217;ve identified the CSFs, I like to do a very brief &#8220;as-is/to-be&#8221; analysis.  This may or may not be something that every project will use, but I do find them useful in two cases. If you are designing a new product (or working with a startup company), then the &#8220;as-is&#8221; will probably represent the current state of the industry.    If you are doing business process reengineering, and your software product will be a part of the future processes, then the &#8220;as-is&#8221; will probably represent the current business environment.</p>
<p>In either event, the questions you will ask will be the same:</p>
<ul>
<li>What are the major flows of information?</li>
<li>Who is involved?</li>
<li>How are stakeholders doing business now?</li>
<li>What do those processes look like?</li>
<li>What technologies do they use?</li>
<li>What tools do they use now?</li>
</ul>
<p>Additionally, in either event, the &#8220;to-be&#8221; part represents the deliverables/outcomes of the project itself.</p>
<p>Why do we spend time on this?  I have found that if all of the stakeholders, including the development team, have an understanding of where we&#8217;re going, and what things look like in the current state of affairs, the end result is a much more cohesive and functional product.</p>
<p>I usually spend 45 minutes on the &#8220;as-is&#8221; area, and another 45 minutes or so on the &#8220;to-be&#8221; area.  I would recommend a break in between!</p>
<p><strong>Assumptions</strong></p>
<p>Getting weary yet? Don&#8217;t fret, as we&#8217;re nearly done with laying the groundwork!  Only one last item remains.  The final area that I like to touch on before leading the team into the design process is the generation of relevant <em>assumptions</em>.  These are generated via a short (10-minute) brainstorming session.  These should represent things that the project design team are assuming to be true, or in place.  Generally, they represent inputs to the system, or owners of certain things. I like to brainstorm these up front, so that the group doesn&#8217;t keep disclaiming things all throughout the session.<br />
Examples:</p>
<ul>
<li>&#8220;Our major design partners will be responsible for content management within the product catalog.&#8221;</li>
<li>&#8220;The initial database content will be provided by Acme Corporation, one of our key partners.&#8221;</li>
<li>&#8220;Marketing will provide a list of 10 qualified beta customers before we launch.&#8221;</li>
</ul>
<p>One caveat here.  If you sense that the group is starting to &#8220;haggle&#8221; or argue over the assumptions, then they apparently are not assumptions to begin with.  In such cases, either choose to put the issue in the parking lot, or make a note to revisit it at a later time during the session, where it can be discussed in a more streamlined manner.</p>
<p><strong>Functionality Matrix</strong></p>
<p>Congratulations, you&#8217;ve made it through all of the groundwork exercises.  We&#8217;re ready to begin taking all of the information from the brains of the participants and funneling them into a prioritized functionality matrix.</p>
<p>The functionality matrix is essentially a prioritized grid of the major functional areas within the proposed system.  The matrix can be developed using whatever tools you wish, although I recommend Excel, as I find its ability to do quick calculations for me (important later on) and conditionally formatting cell colors to be handy.</p>
<p>However, given the sheer scope of what is involved in creating a functionality matrix, I will save it for a separate article.  Don&#8217;t worry, that article has already been written &#8211; it will publish a week from the date of publication on this article, so be sure to check in then for a more detailed walkthrough. In that article, I&#8217;ll also share with you the reasons for bringing several thousand dollars in fake money to your JAD session. :)</p>
<p align="center"><!--adsense--></p>
<p><strong>Wrap-Up</strong></p>
<p>Hopefully, the functionality matrix came together in short order.  Even the most demanding set of requirements should be able to be pulled together in no more than 2 days (but most often in an afternoon).  Don&#8217;t forget to address any issues that were plopped into the &#8220;parking lot&#8221; before going home!</p>
<p><strong>Next steps: Use Cases</strong></p>
<p>Let the participants know that all of their hard work is about to be funneled into the <a href="http://www.scottburkett.com/index.php/process-improvement/2006-11-08/jad-creating-a-functionality-matrix.html">next phase</a>, where the individual use-cases will be developed.  These will provide the &#8220;substance&#8221; behind the functionality matrix.</p>
<p><strong>My final thoughts<br />
</strong></p>
<p>I know this was a lot of information, and if you&#8217;ve made it this far, then I commend you!  While I think all of these ideas are a fantastic way to approach your JAD sessions, I would like to say again, however, that these are not the only areas that you can explore.  Use your imagination!  Every session will be different, because every project is different.  Just follow your instincts, and I&#8217;m sure you&#8217;ll do fine.</p>
<p>In order to make things a little easier for you, I am including a bare-bones Powerpoint presentation that lays out the flow of this type of JAD session (coming later this week!).</p>
<p>Cheers, and happy JAD&#8217;ing!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.scottburkett.com/process-improvement/jad-facilitation-workshop-basics-122.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
			<enclosure url="http://www.scottburkett.com/audio/podcast_13_MAR_2006.mp3" length="31873985" type="audio/mpeg" />
		<itunes:duration>0:33:12</itunes:duration>
		<itunes:subtitle>This article will take a more hands-on look at conducting JAD workshop sessions. While there is no single best way to accomplish JAD objectives, I will try to present a format that has worked nicely for me in the past, in the hopes that it will give[...]</itunes:subtitle>
		<itunes:summary>This article will take a more hands-on look at conducting JAD workshop sessions. While there is no single best way to accomplish JAD objectives, I will try to present a format that has worked nicely for me in the past, in the hopes that it will give you some ideas as to how best to structure your own sessions.</itunes:summary>
		<itunes:author>scott@incursio.com</itunes:author>
		<itunes:explicit>no</itunes:explicit>
		<itunes:block>no</itunes:block>
	</item>
	</channel>
</rss>

