<?xml version="1.0" encoding="iso-8859-1"?><!-- generator="b2evolution/4.0.3" -->
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>IT Professionals - Author(s): Eli Weinstock-Herman (tarwn)</title>
		<link>http://blogs.lessthandot.com/index.php/ITProfessionals/</link>
		<atom:link rel="self" type="application/rss+xml" href="http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2" />
		<description></description>
		<language>en-GB</language>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<admin:generatorAgent rdf:resource="http://b2evolution.net/?v=4.0.3"/>
		<ttl>60</ttl>
				<item>
			<title>IT vs The Business</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/other/it-vs-the-business</link>
			<pubDate>Tue, 26 Mar 2013 07:36:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="alt">Project Management</category>
<category domain="alt">IT Processes</category>
<category domain="main">Other</category>			<guid isPermaLink="false">2164@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;Monday I caught the &lt;a href=&quot;http://foodfightshow.org/&quot;&gt;Food Fight Show&lt;/a&gt;, discussing &lt;a href=&quot;http://foodfightshow.org/2013/03/the-phoenix-project.html&quot;&gt;The Phoenix Project&lt;/a&gt; and featuring Gene Kim (&lt;a href=&quot;http://www.realgenekim.me/&quot; title=&quot;Gene Kim&#039;s website&quot;&gt;site&lt;/a&gt;|&lt;a href=&quot;https://twitter.com/RealGeneKim&quot; title=&quot;@realgenekim on twitter&quot;&gt;twitter&lt;/a&gt;), Jez Humble (&lt;a href=&quot;http://jezhumble.net/&quot; title=&quot;Jez&#039;s website&quot;&gt;blog&lt;/a&gt;|&lt;a href=&quot;https://twitter.com/jezhumble&quot; title=&quot;@jezhumble on twitter&quot;&gt;twitter&lt;/a&gt;), and Matthew Zeier (&lt;a href=&quot;http://blog.mozilla.org/mrz/&quot; title=&quot;mrz&#039;s Mozilla/Firefox blog&quot;&gt;blog&lt;/a&gt;|&lt;a href=&quot;https://twitter.com/mrz&quot; title=&quot;@mrz on twitter&quot;&gt;twitter&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Part of the way through the show, a conversation took place that I couldn&#039;t get out of my head. &lt;/p&gt;

&lt;h2&gt;Here&#039;s the situation:&lt;/h2&gt;

&lt;p&gt;A business person is asking IT to implement a blog using a specific NoSQL database solution and we push back and try to examine why they want it, and oh by the way we have this great business opportunity for you (around 29:30). &lt;/p&gt;

&lt;p&gt;Which reminded me of a related question I heard (I thought in the show, but apparently it must have been earlier in the day):&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Why it is OK for the IT person to talk business to the business person, when it&#039;s not OK for the business person to talk IT to the IT person.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;What bothered me the whole drive home is the built in assumption that the business and IT are separate entities. The panel went deep into value streams and hypotheses-driven development from here, but I think there was something wrong with the root of this story, where we accepted the separation of IT person and business. This may seem overly detail-oriented, but I think far too many IT people see themselves exactly this way. &lt;/p&gt;

&lt;h2&gt;And it&#039;s wrong.&lt;/h2&gt;

&lt;p&gt;Here&#039;s the flaw in this story (and every other place we talk about IT vs the business):&lt;/p&gt;

&lt;p&gt;Joe Random Executive doesn&#039;t know all the intricacies of accounting, purchasing, warehousing, marketing, sales, law, human resources, or any of a dozen other areas. They will probably know a couple in detail, but they are no more an expert in the rest then they are in IT (and of course we assume they didn&#039;t have an IT Background). These are all skills or roles that get casually lumped under the &quot;business&quot; umbrella. Because somehow all areas but IT are business, while only IT is non-business.&lt;/p&gt;

&lt;p&gt;Is this ego or laziness? Some of both. Only in the IT department do we somehow think our role gives us a magic ticket to be totally ignorant about the company we work for. &lt;/p&gt;

&lt;h2&gt;This is absurd.&lt;/h2&gt;

&lt;p&gt;It makes no more sense then suggesting that accounting is far too intricate to spend time learning how the business around them works. Or that the ever-changing logistics and supply market supersedes understanding the products we are purchasing or shipping. Or that knowing what markets we sell to has any importance to the lawyers. Or that our business growth strategies should take any time away from HR activities around screening and hiring,.&lt;/p&gt;

&lt;p&gt;Maybe the whole company is siloed, but seeing it as IT vs The Business is silly (see Gene Kim&#039;s point 25 minutes in).&lt;/p&gt;

&lt;div style=&quot;text-align: center; font-style: italic&quot;&gt;As an aside, spellcheck prefers to call that soiled. I find myself in agreement.&lt;/div&gt;

&lt;p&gt;But wait, these are IT ops people talking, surely this is different, right? &lt;/p&gt;

&lt;p&gt;I&#039;ll give you a hint, Gene Kim talks early on about how The Phoenix Project was influenced by &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Goal_%28novel%29&quot;&gt;The Goal (Eliyahu Goldratt)&lt;/a&gt;, whose main character is a plant operations manager. So no, IT Ops, IT QA, IT Technician, you are no more off the hook then the enormous variety of lawyers a business may need to work with over the course of it&#039;s life.&lt;/p&gt;

&lt;p&gt;There are two types of workers, and they aren&#039;t IT and non-IT, they are engaged and not engaged. &lt;/p&gt;

&lt;h2&gt;Are you doing your job?&lt;/h2&gt;

&lt;p&gt;Are you doing the job, or just playing with technology?&lt;/p&gt;

&lt;p&gt;An engaged worker knows how the company works, at some level. They can discuss the strategies the business is executing, what their company does, and who their customers are. They may not be able to discuss these things with equal facility as the executives or experts in specific departments, but they can have an intelligent conversation about their business. &lt;/p&gt;

&lt;p&gt;The not-engaged worker is just there to do a job and go home. They are the protectors of turf, the ones that deny every request they can get away with, or the ones that simply don&#039;t care. &lt;/p&gt;

&lt;div style=&quot;text-align: center; font-weight: bold;&quot;&gt;Ignorance of how your company works is a sign of incompetence, not something to be proud of. &lt;/div&gt;

&lt;p&gt;So the reason an IT person (even an IT Ops person) can speak to a non-IT worker about the business is because &quot;the business&quot; is the common language they share. IT, accounting, purchasing, human resources, whoever ... when we need to discuss why something is important, we discuss it&#039;s impact on the the business, the strategies or targets it effects, etc. In fact, being in IT typically requires a &lt;u&gt;higher&lt;/u&gt; level of day-to-day, cross-functional contact then any of the prior examples. More, not less.&lt;/p&gt;

&lt;p&gt;Engaging the business has come and gone as part of many buzzy things, and in DevOps it&#039;s rising again. Regardless of it&#039;s current popularity, if you work for a company, being an IT person doesn&#039;t magically separate you from the goals everyone else is working towards. Engage, learn the business, help them succeed, you&#039;ll find that you&#039;re company is doing some really interesting things and works with some really interesting people. If it&#039;s not, find one that resonates with you and learn what they&#039;re doing. Either way, you&#039;re part of the business, an you chose whether you&#039;re competent or not.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/other/it-vs-the-business&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Monday I caught the <a href="http://foodfightshow.org/">Food Fight Show</a>, discussing <a href="http://foodfightshow.org/2013/03/the-phoenix-project.html">The Phoenix Project</a> and featuring Gene Kim (<a href="http://www.realgenekim.me/" title="Gene Kim's website">site</a>|<a href="https://twitter.com/RealGeneKim" title="@realgenekim on twitter">twitter</a>), Jez Humble (<a href="http://jezhumble.net/" title="Jez's website">blog</a>|<a href="https://twitter.com/jezhumble" title="@jezhumble on twitter">twitter</a>), and Matthew Zeier (<a href="http://blog.mozilla.org/mrz/" title="mrz's Mozilla/Firefox blog">blog</a>|<a href="https://twitter.com/mrz" title="@mrz on twitter">twitter</a>). </p>

<p>Part of the way through the show, a conversation took place that I couldn't get out of my head. </p>

<h2>Here's the situation:</h2>

<p>A business person is asking IT to implement a blog using a specific NoSQL database solution and we push back and try to examine why they want it, and oh by the way we have this great business opportunity for you (around 29:30). </p>

<p>Which reminded me of a related question I heard (I thought in the show, but apparently it must have been earlier in the day):</p>

<blockquote><p>Why it is OK for the IT person to talk business to the business person, when it's not OK for the business person to talk IT to the IT person.</p></blockquote>

<p>What bothered me the whole drive home is the built in assumption that the business and IT are separate entities. The panel went deep into value streams and hypotheses-driven development from here, but I think there was something wrong with the root of this story, where we accepted the separation of IT person and business. This may seem overly detail-oriented, but I think far too many IT people see themselves exactly this way. </p>

<h2>And it's wrong.</h2>

<p>Here's the flaw in this story (and every other place we talk about IT vs the business):</p>

<p>Joe Random Executive doesn't know all the intricacies of accounting, purchasing, warehousing, marketing, sales, law, human resources, or any of a dozen other areas. They will probably know a couple in detail, but they are no more an expert in the rest then they are in IT (and of course we assume they didn't have an IT Background). These are all skills or roles that get casually lumped under the "business" umbrella. Because somehow all areas but IT are business, while only IT is non-business.</p>

<p>Is this ego or laziness? Some of both. Only in the IT department do we somehow think our role gives us a magic ticket to be totally ignorant about the company we work for. </p>

<h2>This is absurd.</h2>

<p>It makes no more sense then suggesting that accounting is far too intricate to spend time learning how the business around them works. Or that the ever-changing logistics and supply market supersedes understanding the products we are purchasing or shipping. Or that knowing what markets we sell to has any importance to the lawyers. Or that our business growth strategies should take any time away from HR activities around screening and hiring,.</p>

<p>Maybe the whole company is siloed, but seeing it as IT vs The Business is silly (see Gene Kim's point 25 minutes in).</p>

<div style="text-align: center; font-style: italic">As an aside, spellcheck prefers to call that soiled. I find myself in agreement.</div>

<p>But wait, these are IT ops people talking, surely this is different, right? </p>

<p>I'll give you a hint, Gene Kim talks early on about how The Phoenix Project was influenced by <a href="http://en.wikipedia.org/wiki/The_Goal_%28novel%29">The Goal (Eliyahu Goldratt)</a>, whose main character is a plant operations manager. So no, IT Ops, IT QA, IT Technician, you are no more off the hook then the enormous variety of lawyers a business may need to work with over the course of it's life.</p>

<p>There are two types of workers, and they aren't IT and non-IT, they are engaged and not engaged. </p>

<h2>Are you doing your job?</h2>

<p>Are you doing the job, or just playing with technology?</p>

<p>An engaged worker knows how the company works, at some level. They can discuss the strategies the business is executing, what their company does, and who their customers are. They may not be able to discuss these things with equal facility as the executives or experts in specific departments, but they can have an intelligent conversation about their business. </p>

<p>The not-engaged worker is just there to do a job and go home. They are the protectors of turf, the ones that deny every request they can get away with, or the ones that simply don't care. </p>

<div style="text-align: center; font-weight: bold;">Ignorance of how your company works is a sign of incompetence, not something to be proud of. </div>

<p>So the reason an IT person (even an IT Ops person) can speak to a non-IT worker about the business is because "the business" is the common language they share. IT, accounting, purchasing, human resources, whoever ... when we need to discuss why something is important, we discuss it's impact on the the business, the strategies or targets it effects, etc. In fact, being in IT typically requires a <u>higher</u> level of day-to-day, cross-functional contact then any of the prior examples. More, not less.</p>

<p>Engaging the business has come and gone as part of many buzzy things, and in DevOps it's rising again. Regardless of it's current popularity, if you work for a company, being an IT person doesn't magically separate you from the goals everyone else is working towards. Engage, learn the business, help them succeed, you'll find that you're company is doing some really interesting things and works with some really interesting people. If it's not, find one that resonates with you and learn what they're doing. Either way, you're part of the business, an you chose whether you're competent or not.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/other/it-vs-the-business">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/other/it-vs-the-business#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=2164</wfw:commentRss>
		</item>
				<item>
			<title>Quality, Quality Assurance, and How Not To Do It</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/quality-quality-assurance-and-how</link>
			<pubDate>Mon, 04 Feb 2013 12:01:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">IT Processes</category>			<guid isPermaLink="false">2067@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;The technical sphere seems to have very mixed definitions for the terms &quot;Quality&quot; and &quot;Quality Assurance&quot;. The other day I was reading a post by Devlin Liles (&lt;a href=&quot;http://devlinliles.com/&quot; title=&quot;DevlinLiles.com&quot;&gt;blog&lt;/a&gt;|&lt;a href=&quot;https://twitter.com/devlinliles&quot; title=&quot;@DevlinLiles on twitter&quot;&gt;twitter&lt;/a&gt;) in response to a presentation he had attended (&lt;a href=&quot;http://www.devlinliles.com/post/2013/01/31/Quality-Assurance-The-Team-Approach&quot; title=&quot;Quality Assurance&amp;#8211;The Team Approach&quot;&gt;Quality Assurance&amp;#8211;The Team Approach&lt;/a&gt;). While I agreed with a lot of his opinions, as I started to leave a comment I found myself sidetracked into examining the different (and in many cases, wrong) definitions we use for Quality and Quality Assurance.&lt;/p&gt;

&lt;h2&gt;Quality&lt;/h2&gt;
&lt;p&gt;Often in the software world, Quality seems to mean &quot;Does it work or not&quot;. Occasionally there is the idea of a &lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done&quot; title=&quot;LessThanDot Blog - Defining What Done Means&quot;&gt;Definition of Done&lt;/a&gt;, and the definition of Quality includes additional documents, automated tests, formal communications, etc. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Dictionary.com&lt;/b&gt; - character with respect to fineness, or grade of excellence&lt;br /&gt;
&lt;b&gt;Merriam Webster&lt;/b&gt; - degree of excellence, superiority in kind&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If Quality is a scale of excellence, what level do we assign to &quot;it works&quot;? What grade do we get for &quot;I didn&#039;t find any broken bits&quot;? Why do we keep assuming &quot;it isn&#039;t obviously broken&quot; means we have achieved quality?&lt;/p&gt;

&lt;p&gt;I ran into &lt;a href=&quot;http://onquality.blogspot.com/2010/04/what-is-quality.html&quot; title=&quot;What is Quality? by Jimena Calfa&quot;&gt;this post&lt;/a&gt; that examines a number of different definitions of quality and refines them all into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1. A characteristic of a product or service that bears on its ability to satisfy and exceed* stated or implied customer needs, and thereby provide customer satisfaction.&lt;br /&gt;
2. Freedom from deficiencies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which is similar to my less formal definition of:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Quality is how well the product does what we said it would, from the customer&#039;s perspective&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Quality is a scale, not an on/off switch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the product has defects (ie, broken bits), then we have Quality problems. &lt;/li&gt;
&lt;li&gt;If we cut features at the end of the development cycle and don&#039;t tell the customer, we have Quality problems. &lt;/li&gt;
&lt;li&gt;If we have a breakdown in communications to the customer while explaining what the product does, we have a Quality problem. &lt;/li&gt;
&lt;li&gt;If the customer has difficulty interacting with the product, we have Quality problems. &lt;/li&gt;
&lt;li&gt;If the product behaves inconsistently when the customer is using it, we have Quality problems. &lt;/li&gt;
&lt;li&gt;If we deviate from our industry standards without informing the customer, we have Quality problems. &lt;/li&gt;
&lt;li&gt;If we deviate from their industry standards without informing them, we have Quality problems.&lt;/li&gt;
&lt;li&gt;If we have to argue with the customer over whether we built what they asked for, we have Quality problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a scale of &quot;it destroyed our business&quot; to &quot;it was generations beyond what we could have imagined&quot;, &quot;we didn&#039;t find any obvious bugs&quot; sits firmly at zero.&lt;/p&gt;

&lt;h2&gt;Quality Assurance&lt;/h2&gt;
&lt;p&gt;So after a rather long-winded definition of Quality, what about Quality Assurance?&lt;/p&gt;

&lt;p&gt;I&#039;m not a quality professional, but most of what I hear or read seems to be using the definition of Quality Assurance that means we have testers testing our product before delivery. Possibly with some automated tests. Possibly even with some automated tests that can be run by the developers (not to be confused with forms of testing that are the developer&#039;s responsibility).&lt;/p&gt;

&lt;p&gt;Sound about right?&lt;/p&gt;

&lt;p&gt;Except this is Quality Ensurance. Testing the mostly finished product is designed to &lt;u&gt;Ensure&lt;/u&gt; our product meets a specific standard of quality.&lt;/p&gt;

&lt;p&gt;Assurance is a proactive term, &quot;it will be good&quot; vs Ensure&#039;s &quot;we checked at the end and it was good&quot;. The purpose of Quality Assurance is to build confidence in the level of Quality (Assure) by driving improvements, so that improved Quality is a natural result. We Assure, are confidant of, better quality by helping it get cooked in from the start.&lt;/p&gt;

&lt;p&gt;We are all responsible for Quality, but Quality Assurance is responsible for improving the processes, tooling, environment, and business to increase the Quality of our output. Inspection at the end serves as a good first step, so we can gather data to drive improvements, but if this is all you are getting from your Quality Assurance efforts, then you don&#039;t actually have a Quality Assurance effort. &lt;/p&gt;

&lt;h2&gt;Devlin&#039;s Post&lt;/h2&gt;
&lt;p&gt;So back to &lt;a href=&quot;http://www.devlinliles.com/post/2013/01/31/Quality-Assurance-The-Team-Approach&quot; title=&quot;Quality Assurance&amp;#8211;The Team Approach&quot;&gt;Devlin&#039;s post&lt;/a&gt;. He listed a number of points from the presentation and his thoughts on them. While I didn&#039;t attend and am therefore missing some of the context, here are my thoughts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Risk Mitigation is the main job of QA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Absolutely not. The job of QA is to improve our ability to build Quality in as we build the product. This may have the side effect of mitigating risk, but that is a natural outgrowth of building something that engenders greater satisfaction from it&#039;s purchaser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;br /&gt;
2. Cost of finding bugs is higher as you get later in the deployment cycle, so we should incentivize finding bugs early because we saved that money.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Incentivising is one way to improve the ability to build Quality as close to the source as possible, so it passes the Quality Assurance definition above. However, I think incentivizing drives the wrong behavior. Even the most honest developer could choose to spend their time finding bugs instead of building the product. And at the end of the day, what we really want is fewer bugs created, which incentivizing could prevent us from improving towards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. High Quality / Focus on Quality cost more money&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, but only in the short term. Producing Quality products is taking the long view, thinking past the immediate contract or deal that is on the table. Measuring the effects can be difficult, but that doesn&#039;t mean they are nonexistent. How much would you pay to turn your customers into part of your marketing and sales teams? How much more productive is the team that is proud of what they build? How much less do you spend manually inspecting for Quality at the end of the process when it&#039;s built in early on? How much do you save with a better understanding of requirements as your building the product, rather than after you have delivered? What is the value of being able to deliver a product confidently instead of worrying the customer may not accept it? &lt;/p&gt;

&lt;p&gt;Technically, firing the quality team will also save you money. So will firing the development team. That doesn&#039;t make them good long term strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Unit Testing should be a task for each development task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I feel the same as Devlin on this, if you&#039;re in an environment that doesn&#039;t include it as part of getting a task done, then, yes, it may be helpful to assign each task with a paired &quot;so the unit tests&quot; task until people get used to doing them together. But this isn&#039;t an end state, at some point there should be agreement that doing the tests is simply part of calling the work done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5.There are Different Kinds of testers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here I am going to have to diverge from Devlin again, but I&#039;m pretty sure it&#039;s a context issue. I think the question of whether there are different types of testers depends on whether we are talking about types of tests or areas being tested. A manual tester at the end of our process is going to have very different skills then an experienced security tester, which will in turn be different than the skills of a usability tester.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Team Collaboration on testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Again, this is an example of one type of improvement a Quality Assurance team could make in a business. This one may be more successful than the incentivising one above, but I think it&#039;s going to depend on the environment it&#039;s implemented in and, as such, isn&#039;t something I can comment on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. QA is the Whole Team&amp;#8217;s responsibility.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I started out agreeing with Devlin, but I&#039;m going to have to revise my opinion. I think the idea of continuous improvement should be built into the whole team, so that everyone takes responsibility for improving their surroundings, processes, and selves. And I think this directly feeds Quality, because the improvements we are making should be improving the quality of things, either as measured by the customer (product quality) or our coworkers, management, or even cleaning staff. So in a perfect world, building in improvements to improve Quality is part of the individual team members responsibilities. &lt;/p&gt;

&lt;p&gt;However, I think there should still be someone who has overall responsibility for QA, either in the role of a manager or coach, to ensure that decisions are being made soundly on real data, ensure we aren&#039;t over-optimizing one portion of the business at the expense of another, and so on.&lt;/p&gt;

&lt;h2&gt;Thoughts?&lt;/h2&gt;
&lt;p&gt;A lot of people in the software world dislike Quality assurance, but I think this is because there are a lot of poor Quality Assurance efforts out there that never get past the manual test stage (and thus aren&#039;t actually assuring quality).&lt;/p&gt;

&lt;p&gt;Regardless, if &quot;It ain&#039;t broke&quot; is the highest measure of quality in your company, it may be time to recalibrate expectations.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/quality-quality-assurance-and-how&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>The technical sphere seems to have very mixed definitions for the terms "Quality" and "Quality Assurance". The other day I was reading a post by Devlin Liles (<a href="http://devlinliles.com/" title="DevlinLiles.com">blog</a>|<a href="https://twitter.com/devlinliles" title="@DevlinLiles on twitter">twitter</a>) in response to a presentation he had attended (<a href="http://www.devlinliles.com/post/2013/01/31/Quality-Assurance-The-Team-Approach" title="Quality Assurance&#8211;The Team Approach">Quality Assurance&#8211;The Team Approach</a>). While I agreed with a lot of his opinions, as I started to leave a comment I found myself sidetracked into examining the different (and in many cases, wrong) definitions we use for Quality and Quality Assurance.</p>

<h2>Quality</h2>
<p>Often in the software world, Quality seems to mean "Does it work or not". Occasionally there is the idea of a <a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done" title="LessThanDot Blog - Defining What Done Means">Definition of Done</a>, and the definition of Quality includes additional documents, automated tests, formal communications, etc. </p>

<blockquote>
<p><b>Dictionary.com</b> - character with respect to fineness, or grade of excellence<br />
<b>Merriam Webster</b> - degree of excellence, superiority in kind</p>
</blockquote>

<p>If Quality is a scale of excellence, what level do we assign to "it works"? What grade do we get for "I didn't find any broken bits"? Why do we keep assuming "it isn't obviously broken" means we have achieved quality?</p>

<p>I ran into <a href="http://onquality.blogspot.com/2010/04/what-is-quality.html" title="What is Quality? by Jimena Calfa">this post</a> that examines a number of different definitions of quality and refines them all into:</p>

<blockquote>
<p>1. A characteristic of a product or service that bears on its ability to satisfy and exceed* stated or implied customer needs, and thereby provide customer satisfaction.<br />
2. Freedom from deficiencies.</p>
</blockquote>

<p>Which is similar to my less formal definition of:</p>

<blockquote><p>Quality is how well the product does what we said it would, from the customer's perspective</p></blockquote>

<p>Quality is a scale, not an on/off switch.</p>

<ul>
<li>If the product has defects (ie, broken bits), then we have Quality problems. </li>
<li>If we cut features at the end of the development cycle and don't tell the customer, we have Quality problems. </li>
<li>If we have a breakdown in communications to the customer while explaining what the product does, we have a Quality problem. </li>
<li>If the customer has difficulty interacting with the product, we have Quality problems. </li>
<li>If the product behaves inconsistently when the customer is using it, we have Quality problems. </li>
<li>If we deviate from our industry standards without informing the customer, we have Quality problems. </li>
<li>If we deviate from their industry standards without informing them, we have Quality problems.</li>
<li>If we have to argue with the customer over whether we built what they asked for, we have Quality problems</li>
</ul>

<p>On a scale of "it destroyed our business" to "it was generations beyond what we could have imagined", "we didn't find any obvious bugs" sits firmly at zero.</p>

<h2>Quality Assurance</h2>
<p>So after a rather long-winded definition of Quality, what about Quality Assurance?</p>

<p>I'm not a quality professional, but most of what I hear or read seems to be using the definition of Quality Assurance that means we have testers testing our product before delivery. Possibly with some automated tests. Possibly even with some automated tests that can be run by the developers (not to be confused with forms of testing that are the developer's responsibility).</p>

<p>Sound about right?</p>

<p>Except this is Quality Ensurance. Testing the mostly finished product is designed to <u>Ensure</u> our product meets a specific standard of quality.</p>

<p>Assurance is a proactive term, "it will be good" vs Ensure's "we checked at the end and it was good". The purpose of Quality Assurance is to build confidence in the level of Quality (Assure) by driving improvements, so that improved Quality is a natural result. We Assure, are confidant of, better quality by helping it get cooked in from the start.</p>

<p>We are all responsible for Quality, but Quality Assurance is responsible for improving the processes, tooling, environment, and business to increase the Quality of our output. Inspection at the end serves as a good first step, so we can gather data to drive improvements, but if this is all you are getting from your Quality Assurance efforts, then you don't actually have a Quality Assurance effort. </p>

<h2>Devlin's Post</h2>
<p>So back to <a href="http://www.devlinliles.com/post/2013/01/31/Quality-Assurance-The-Team-Approach" title="Quality Assurance&#8211;The Team Approach">Devlin's post</a>. He listed a number of points from the presentation and his thoughts on them. While I didn't attend and am therefore missing some of the context, here are my thoughts.</p>

<p><strong>1. Risk Mitigation is the main job of QA</strong></p>

<p>Absolutely not. The job of QA is to improve our ability to build Quality in as we build the product. This may have the side effect of mitigating risk, but that is a natural outgrowth of building something that engenders greater satisfaction from it's purchaser.</p>

<p><strong><br />
2. Cost of finding bugs is higher as you get later in the deployment cycle, so we should incentivize finding bugs early because we saved that money.</strong></p>

<p>Incentivising is one way to improve the ability to build Quality as close to the source as possible, so it passes the Quality Assurance definition above. However, I think incentivizing drives the wrong behavior. Even the most honest developer could choose to spend their time finding bugs instead of building the product. And at the end of the day, what we really want is fewer bugs created, which incentivizing could prevent us from improving towards.</p>

<p><strong>3. High Quality / Focus on Quality cost more money</strong></p>

<p>Yes, but only in the short term. Producing Quality products is taking the long view, thinking past the immediate contract or deal that is on the table. Measuring the effects can be difficult, but that doesn't mean they are nonexistent. How much would you pay to turn your customers into part of your marketing and sales teams? How much more productive is the team that is proud of what they build? How much less do you spend manually inspecting for Quality at the end of the process when it's built in early on? How much do you save with a better understanding of requirements as your building the product, rather than after you have delivered? What is the value of being able to deliver a product confidently instead of worrying the customer may not accept it? </p>

<p>Technically, firing the quality team will also save you money. So will firing the development team. That doesn't make them good long term strategies.</p>

<p><strong>4. Unit Testing should be a task for each development task</strong></p>

<p>I feel the same as Devlin on this, if you're in an environment that doesn't include it as part of getting a task done, then, yes, it may be helpful to assign each task with a paired "so the unit tests" task until people get used to doing them together. But this isn't an end state, at some point there should be agreement that doing the tests is simply part of calling the work done.</p>

<p><strong>5.There are Different Kinds of testers</strong></p>

<p>Here I am going to have to diverge from Devlin again, but I'm pretty sure it's a context issue. I think the question of whether there are different types of testers depends on whether we are talking about types of tests or areas being tested. A manual tester at the end of our process is going to have very different skills then an experienced security tester, which will in turn be different than the skills of a usability tester.</p>

<p><strong>7. Team Collaboration on testing</strong></p>

<p>Again, this is an example of one type of improvement a Quality Assurance team could make in a business. This one may be more successful than the incentivising one above, but I think it's going to depend on the environment it's implemented in and, as such, isn't something I can comment on.</p>

<p><strong>8. QA is the Whole Team&#8217;s responsibility.</strong></p>

<p>I started out agreeing with Devlin, but I'm going to have to revise my opinion. I think the idea of continuous improvement should be built into the whole team, so that everyone takes responsibility for improving their surroundings, processes, and selves. And I think this directly feeds Quality, because the improvements we are making should be improving the quality of things, either as measured by the customer (product quality) or our coworkers, management, or even cleaning staff. So in a perfect world, building in improvements to improve Quality is part of the individual team members responsibilities. </p>

<p>However, I think there should still be someone who has overall responsibility for QA, either in the role of a manager or coach, to ensure that decisions are being made soundly on real data, ensure we aren't over-optimizing one portion of the business at the expense of another, and so on.</p>

<h2>Thoughts?</h2>
<p>A lot of people in the software world dislike Quality assurance, but I think this is because there are a lot of poor Quality Assurance efforts out there that never get past the manual test stage (and thus aren't actually assuring quality).</p>

<p>Regardless, if "It ain't broke" is the highest measure of quality in your company, it may be time to recalibrate expectations.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/quality-quality-assurance-and-how">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/quality-quality-assurance-and-how#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=2067</wfw:commentRss>
		</item>
				<item>
			<title>Hiding Outages is a Short Term Game</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/RunningMyBusiness/hiding-outages-is-a-short</link>
			<pubDate>Mon, 29 Oct 2012 17:32:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="alt">IT Service Management</category>
<category domain="main">Running My Own IT Business</category>			<guid isPermaLink="false">1878@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;&lt;strong&gt;5:20 PM&lt;/strong&gt; on Saturday night, looking for the correct size air filter at the local superstore. My phone dings and chirps, as I receive almost simultaneous email and twitter alerts; our production application can&#039;t talk to it&#039;s database. As a SaaS company, it rolls downhill. An unexpected outage with our application means an unexpected service outage for our customers. Time to head home and start troubleshooting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5:45 PM&lt;/strong&gt;. After logging into the service provider dashboard, I find that the database services tab is completely non-functional. Attempts to connect to the database from home also fails. Various other troubleshooting directions are followed and also meet in failure.&lt;/p&gt;

&lt;p&gt;And then some scheduled jobs in our development and staging environments kick off and also report database timeouts. It&#039;s getting increasingly unlikely that this is us, time to contact support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.45 PM&lt;/strong&gt;. Calling support leaves me in a hold queue that is experiencing &quot;longer than normal call volume&quot;. Maybe this isn&#039;t just me? I check the service status page and everything is green. Still waiting on hold. I check twitter and don&#039;t see any mentions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7:10 PM&lt;/strong&gt;. Lets check the public forums...ah, there&#039;s a few other people with this problem. I add my own personal story so we can help flesh out the picture of what&#039;s going on. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7:15 PM&lt;/strong&gt;. 30 minutes into the hold queue and I just got transferred to a ringing phone. After seeing the forum post, I suspect I&#039;ll end up getting a canned &quot;We know there&#039;s a problem, we don&#039;t know what it is or when it will be fixed, thank you for all your money&quot; speech. So I&#039;m a little surprised when after two minutes of ringing the phone simply goes dead. &lt;/p&gt;

&lt;p&gt;By now I&#039;ve added a few tweets to twitter with the appropriate tags, started looking at the SLA information for the service, and generally just continue to waste my evening in front of the computer instead of spending time with my wife and two year old. &lt;/p&gt;

&lt;p&gt;And time passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8:10 PM&lt;/strong&gt;. I&#039;ve been refreshing the status dashboard every 10 minutes since I first opened it but this is the first change. Red notifications show up, along with hourly messages going back in time to 5:11 PM. I add a note to the forum and a tweet for anyone else waiting for some word from our service provider. The messages are fairly generic and innocuous, admitting that some customers may experience outages with given services and regions. We apologize for the inconvenience.&lt;/p&gt;

&lt;p&gt;We couldn&#039;t be bothered to provide an update for 3 hours, but we apologize for the inconvenience.&lt;/p&gt;

&lt;p&gt;Your business has been down for three hours and there was no official announcement you could point your customers to, but we apologize for the inconvenience.&lt;/p&gt;

&lt;h2&gt;Admit Your Service Outages?&lt;/h2&gt;
&lt;p&gt;I would bet we have all worked with companies or products that go to great pains not to announce bugs or outages to their end users. After all, admitting an outage means that the people that didn&#039;t get affected will know about it too, and that looks bad.&lt;/p&gt;

&lt;p&gt;Maybe we&#039;re afraid of upsetting users that weren&#039;t online at the time, of losing customers, of warning off potential users, of providing inside information to our competitors, or getting negative press.&lt;/p&gt;

&lt;h3&gt;Been There...&lt;/h3&gt;

&lt;p&gt;I once worked with a manager that screened each outage email, broadcasting only the ones that he felt were important enough to be forwarded, which tended to be none of them. Our service levels improved amazingly in the short term. Unfortunately since we weren&#039;t keeping our users informed, each outage took longer to correct as we also fielded calls from end users thinking it was just a problem with their system. Which meant our mean time to fix outages went down and affected more people. Which meant that the overall public consensus of our service level got poorer, especially as people realized we were simply not reporting our outages anymore. &lt;/p&gt;

&lt;p&gt;We lost credibility. Our service levels were reduced to levels we had worked years to raise them from. The trust our end users extended to us was heavily impacted. &lt;/p&gt;

&lt;p&gt;Before that slow slide back into the mud, we had originally climbed out by being open about our outages. Every outage had been announced, often before we had a fix identified, with follow-ups when information was available. Users trusted us more because they could see us jumping on problems, hear us being honest and open with them, and see the problems getting taken care of. We didn&#039;t have to tell them how much things were improving, they saw it. &lt;/p&gt;

&lt;p&gt;But we stopped admitting our outages, and for a short time we looked even better. Then we looked far, far worse.&lt;/p&gt;

&lt;h3&gt;Pretending Doesn&#039;t Make It So&lt;/h3&gt;
&lt;p&gt;Hiding bad news to protect your image is a short term loan with major long term costs. Your statistics are broken, so justifying and performing root cause analysis is that much harder. You are limited in what you can ask or discuss with your customers, because each one has to be treated as a potential leak. Your support services are put under a lot of strain and probably built with a higher focus on cost reduction than quality of service.&lt;/p&gt;

&lt;p&gt;In short, all of the energy you are spending to look awesome is actually moving you further away and unlikely to be fooling your end users.&lt;/p&gt;

&lt;h2&gt;Back to Saturday Night&lt;/h2&gt;

&lt;p&gt;Saturday night, a well known service provider had an outage that shut down our business for 3 hours and 31 minutes. &lt;/p&gt;

&lt;p&gt;For 3 hours we were in the dark and then, when an update was provided, it was backdated to look like we had been kept in the loop the whole time. Countless hours were wasted as we and many other customers tried troubleshooting a problem that wasn&#039;t in our systems. The support center was overloaded (or just not responding). And at the end of the night a degree of credibility and trust was thrown away.&lt;/p&gt;

&lt;p&gt;Someone had an opportunity to shine, and instead chose to make a bad situation that much worse.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/RunningMyBusiness/hiding-outages-is-a-short&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p><strong>5:20 PM</strong> on Saturday night, looking for the correct size air filter at the local superstore. My phone dings and chirps, as I receive almost simultaneous email and twitter alerts; our production application can't talk to it's database. As a SaaS company, it rolls downhill. An unexpected outage with our application means an unexpected service outage for our customers. Time to head home and start troubleshooting.</p>

<p><strong>5:45 PM</strong>. After logging into the service provider dashboard, I find that the database services tab is completely non-functional. Attempts to connect to the database from home also fails. Various other troubleshooting directions are followed and also meet in failure.</p>

<p>And then some scheduled jobs in our development and staging environments kick off and also report database timeouts. It's getting increasingly unlikely that this is us, time to contact support.</p>

<p><strong>6.45 PM</strong>. Calling support leaves me in a hold queue that is experiencing "longer than normal call volume". Maybe this isn't just me? I check the service status page and everything is green. Still waiting on hold. I check twitter and don't see any mentions. </p>

<p><strong>7:10 PM</strong>. Lets check the public forums...ah, there's a few other people with this problem. I add my own personal story so we can help flesh out the picture of what's going on. </p>

<p><strong>7:15 PM</strong>. 30 minutes into the hold queue and I just got transferred to a ringing phone. After seeing the forum post, I suspect I'll end up getting a canned "We know there's a problem, we don't know what it is or when it will be fixed, thank you for all your money" speech. So I'm a little surprised when after two minutes of ringing the phone simply goes dead. </p>

<p>By now I've added a few tweets to twitter with the appropriate tags, started looking at the SLA information for the service, and generally just continue to waste my evening in front of the computer instead of spending time with my wife and two year old. </p>

<p>And time passes.</p>

<p><strong>8:10 PM</strong>. I've been refreshing the status dashboard every 10 minutes since I first opened it but this is the first change. Red notifications show up, along with hourly messages going back in time to 5:11 PM. I add a note to the forum and a tweet for anyone else waiting for some word from our service provider. The messages are fairly generic and innocuous, admitting that some customers may experience outages with given services and regions. We apologize for the inconvenience.</p>

<p>We couldn't be bothered to provide an update for 3 hours, but we apologize for the inconvenience.</p>

<p>Your business has been down for three hours and there was no official announcement you could point your customers to, but we apologize for the inconvenience.</p>

<h2>Admit Your Service Outages?</h2>
<p>I would bet we have all worked with companies or products that go to great pains not to announce bugs or outages to their end users. After all, admitting an outage means that the people that didn't get affected will know about it too, and that looks bad.</p>

<p>Maybe we're afraid of upsetting users that weren't online at the time, of losing customers, of warning off potential users, of providing inside information to our competitors, or getting negative press.</p>

<h3>Been There...</h3>

<p>I once worked with a manager that screened each outage email, broadcasting only the ones that he felt were important enough to be forwarded, which tended to be none of them. Our service levels improved amazingly in the short term. Unfortunately since we weren't keeping our users informed, each outage took longer to correct as we also fielded calls from end users thinking it was just a problem with their system. Which meant our mean time to fix outages went down and affected more people. Which meant that the overall public consensus of our service level got poorer, especially as people realized we were simply not reporting our outages anymore. </p>

<p>We lost credibility. Our service levels were reduced to levels we had worked years to raise them from. The trust our end users extended to us was heavily impacted. </p>

<p>Before that slow slide back into the mud, we had originally climbed out by being open about our outages. Every outage had been announced, often before we had a fix identified, with follow-ups when information was available. Users trusted us more because they could see us jumping on problems, hear us being honest and open with them, and see the problems getting taken care of. We didn't have to tell them how much things were improving, they saw it. </p>

<p>But we stopped admitting our outages, and for a short time we looked even better. Then we looked far, far worse.</p>

<h3>Pretending Doesn't Make It So</h3>
<p>Hiding bad news to protect your image is a short term loan with major long term costs. Your statistics are broken, so justifying and performing root cause analysis is that much harder. You are limited in what you can ask or discuss with your customers, because each one has to be treated as a potential leak. Your support services are put under a lot of strain and probably built with a higher focus on cost reduction than quality of service.</p>

<p>In short, all of the energy you are spending to look awesome is actually moving you further away and unlikely to be fooling your end users.</p>

<h2>Back to Saturday Night</h2>

<p>Saturday night, a well known service provider had an outage that shut down our business for 3 hours and 31 minutes. </p>

<p>For 3 hours we were in the dark and then, when an update was provided, it was backdated to look like we had been kept in the loop the whole time. Countless hours were wasted as we and many other customers tried troubleshooting a problem that wasn't in our systems. The support center was overloaded (or just not responding). And at the end of the night a degree of credibility and trust was thrown away.</p>

<p>Someone had an opportunity to shine, and instead chose to make a bad situation that much worse.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/RunningMyBusiness/hiding-outages-is-a-short">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/RunningMyBusiness/hiding-outages-is-a-short#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1878</wfw:commentRss>
		</item>
				<item>
			<title>Be Mindful With Your Code</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/be-mindful-with-your-code</link>
			<pubDate>Tue, 24 Apr 2012 10:36:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="alt">Ethics &amp; IT</category>
<category domain="main">Professional Development</category>			<guid isPermaLink="false">1706@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;This post really started over fifteen years ago, if only I had known it then. You see, once upon a time I wrote a piece of code with nonsense variable names and, another time, a bunch of dynamic, inline SQL, and there was that time I tried to write half the program on one line. And lets not even get started on error messages....&lt;/p&gt;

&lt;p&gt;Then I got better.&lt;/p&gt;

&lt;p&gt;But it took a while.&lt;/p&gt;

&lt;p&gt;And I&#039;m not done.&lt;/p&gt;

&lt;h2&gt;Code is for Other People&lt;/h2&gt;
&lt;p&gt;We don&#039;t write code for the computer. We write code for ourselves an hour later, after we we have fallen out of the zone and have to debug it. We write code for 2 months from now on a Friday afternoon when it&#039;s the only bug keeping us from our weekend. We write code for 2 years from now when the axe-wielding psycho of a maintenance developer hits the blame button to see who volunteered to be his newest, bestest friend. Or trophy. Probably trophy.&lt;/p&gt;

&lt;p&gt;When we&#039;re producing code, we have to be mindful that there will be a person consuming our code and stop focusing on just getting it out of our head. When we come back to this code in 6 months we want to be able to read it easily, be able to safely make assumptions about elements in it, understand the intent as well as the concrete implementation, and do so with the least amount of re-reading possible. &lt;/p&gt;

&lt;h3&gt;Be Consistent&lt;/h3&gt;&lt;p&gt; &lt;br /&gt;
Code standards tend to get a bad rap, especially among younger developers. They&#039;re seen as unnecessary extra work or as limiting creativity. I remember thinking this way at one time and agree that over-prescription can be wasteful &lt;i&gt;(but c&#039;mon, over-prescription of just about everything is bad, that doesn&#039;t mean we can&#039;t take something for our headaches)&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;The majority of code standards boil down to naming things consistently and being consistent in how functions and whitespace are structured. We do this so we can make quick assumptions about the code as we scan a file, identifying scope or type of variables, locating blocks of code, determining level of nesting, etc. Sure there is some extra work when we initially adopt a standard, we lose some time as we get used to new naming patterns and structures, but once we get used to the standards it becomes just the way we do things, no more. &lt;/p&gt;

&lt;p&gt;And as far as creativity goes, unless you&#039;re taking part in a &lt;a href=&quot;http://blog.aerojockey.com/post/iocccsim&quot; title=&quot;Plane-shaped flight simulator&quot;&gt;code obfuscation contest&lt;/a&gt;, focusing on being creative at the code structure and variable naming level is a sign that you&#039;ve lost sight of the bigger picture, namely that you have an entire program to be creative with. Or you&#039;re too busy trying to &lt;a href=&quot;https://github.com/twitter/bootstrap/issues/3057&quot; title=&quot;In case you missed the semicolon madness&quot;&gt;express your inner hipster&lt;/a&gt;, one of the two.&lt;/p&gt;

&lt;h3&gt;Ugly Strings are Ugly&lt;/h3&gt;
&lt;p&gt;I&#039;m not a fan of inline SQL. It tends to be written poorly, doesn&#039;t get tested for syntax errors until the first time you hit that code path, can be nearly impossible to locate when you decide to change a field name in the database, and often gets written in a solid block of unformatted text.&lt;/p&gt;

&lt;p&gt;And the same happens with varying degree in HTML, LINQ, Perl, ... really anything that resembles 50 lines of content without a carriage return.&lt;/p&gt;

&lt;p&gt;Even with guidelines for structuring our code, we need to be mindful of the blobs we produce. These blobs are difficult to read, adding to the level of frustration and time wasted when a future developer has to work with our code (&lt;i&gt;Who wrote this garbage code!? Oh, me, argh&lt;/i&gt;). If the blob is truly a string, it deserves good formatting and consistent capitalization just as much as our code. In fact, I would say being consistent is even more important here, where color-coding and syntax checking tends to be unavailable.&lt;/p&gt;

&lt;p&gt;And it&#039;s ugly. We may have saved 30 seconds and got the job done, but it&#039;s not worth taking pride in.&lt;/p&gt;

&lt;h2&gt;Well, I Can See What You Were Trying To Do...&lt;/h2&gt;
&lt;p&gt;I once reverse engineered some business logic out of a chemical cooker simulation program written in the early to mid 80&#039;s, revised 3 times by other developers, and utterly lacking in comments. There were no unit tests, there was one comment in the entire codebase (and it was wrong), and I often ran into cases where I could very clearly see that the developer was doing math, but couldn&#039;t figure out why he had chosen to use set V&lt;sub&gt;T&lt;/sub&gt; = f(V&lt;sub&gt;T+1&lt;/sub&gt;) when everywhere else we were calculating V&lt;sub&gt;T+1&lt;/sub&gt; = f(V&lt;sub&gt;T&lt;/sub&gt;). &lt;/p&gt;

&lt;p&gt;Why were we projecting back in time with that one variable? Turns out someone had swapped the naming scheme for current and future state variables, what a pain that was to figure out. Probably saved them a few seconds to not correct it and a few more not to comment their intent, but it cost me two full days to back into what they were intending to do and determine it was a spelling error. Who knows what it cost maintainers in the 20 years in between.&lt;/p&gt;

&lt;p&gt;There are two things we need to know when we look at a piece of code: what does it do and what it was it intended to do. We can determine what it does by reading the code, but there are many cases where we have to guess at what it should be doing. I&#039;ve learned to start with the assumption that implementation and intent aren&#039;t in agreement (all the while hoping I&#039;m wrong).&lt;/p&gt;

&lt;p&gt;Good naming schemes that identify intent, unit tests, function-level comments, good commit comments. These may seem unnecessary now, but 6 months from now they will be critical, whether it&#039;s to maintain a piece of code or copy it for reuse.&lt;/p&gt;

&lt;h2&gt;Error Messages Make Hulk Angry&lt;/h2&gt;
&lt;p&gt;No one likes getting an error message. An error message is the sign that no matter what we were doing, something has gone terribly wrong and we are now a whole lot further from being done than we thought we were. Obviously what we need in this tense moment is an incomprehensible or sarcastic message from the failing application to really put our mind at ease.&lt;/p&gt;

&lt;p&gt;No?&lt;/p&gt;

&lt;p&gt;How about this then. We develop some software, send it out in the world, and one day receive a call from an annoyed end user about the error they are receiving. The message simply says &quot;Null reference error&quot;, maybe with a brief joke about cheese or a reference to a technical manual for the definition of null reference. Because we all love those &quot;oh crap, I don&#039;t even know where to start&quot; moments.&lt;/p&gt;

&lt;p&gt;No?&lt;/p&gt;

&lt;p&gt;Having been on both sides of this issue, I know neither is fun. In fact, I&#039;d love to stop learning that lesson any time now. Error messages don&#039;t have to increase our stress levels this much. Unfortunately there is a tendency to add the least amount of time for error tracking, compound that with poor error messages, then just live through the frustration when the situation is kicking our butts later. &lt;/p&gt;

&lt;p&gt;Better error messages aren&#039;t that difficult, though, we just need to put more thought into them. We need to keep those two users above in mind when we&#039;re crafting our message, and keep in mind the situation they will be in when this message matters. As the end user, we need help staying calm, information on how bad the situation is, a description of what our next steps should be, and the knowledge that everything is under control. As the developer, we need information about the root cause and all the state information we can get our hands on, to speed up detection and resolution.&lt;/p&gt;

&lt;p&gt;It doesn&#039;t really take longer, especially if we invest in our error reporting infrastructure. Most applications could afford to spend a week or more here, given how many hours/bug of debugging time we will end up saving in the near and long term. But more importantly, unnecessarily upsetting users and developers during an already stressful moment is a double loss that will hit us with every bug, exaggerating an already negative situation.&lt;/p&gt;

&lt;h2&gt;There&#039;s More&lt;/h2&gt;
&lt;p&gt;There&#039;s more to this than consistency, clarity, explaining intent, and providing useful error messages. But it all starts with being mindful that when we code, we are not just writing something to jam through a syntax check and successfully compile. The code we write needs to be clear to the future reader and allow them to understand it with the least amount of re-reading and cross-checking. It needs to be aware that it has an audience, both future developers and end users. Good code is judged, not just on it&#039;s performance characteristics, but more importantly on it&#039;s ability to age gracefully, minimizing maintenance costs and the number of people it upsets along the way.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/be-mindful-with-your-code&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>This post really started over fifteen years ago, if only I had known it then. You see, once upon a time I wrote a piece of code with nonsense variable names and, another time, a bunch of dynamic, inline SQL, and there was that time I tried to write half the program on one line. And lets not even get started on error messages....</p>

<p>Then I got better.</p>

<p>But it took a while.</p>

<p>And I'm not done.</p>

<h2>Code is for Other People</h2>
<p>We don't write code for the computer. We write code for ourselves an hour later, after we we have fallen out of the zone and have to debug it. We write code for 2 months from now on a Friday afternoon when it's the only bug keeping us from our weekend. We write code for 2 years from now when the axe-wielding psycho of a maintenance developer hits the blame button to see who volunteered to be his newest, bestest friend. Or trophy. Probably trophy.</p>

<p>When we're producing code, we have to be mindful that there will be a person consuming our code and stop focusing on just getting it out of our head. When we come back to this code in 6 months we want to be able to read it easily, be able to safely make assumptions about elements in it, understand the intent as well as the concrete implementation, and do so with the least amount of re-reading possible. </p>

<h3>Be Consistent</h3><p> <br />
Code standards tend to get a bad rap, especially among younger developers. They're seen as unnecessary extra work or as limiting creativity. I remember thinking this way at one time and agree that over-prescription can be wasteful <i>(but c'mon, over-prescription of just about everything is bad, that doesn't mean we can't take something for our headaches)</i>.</p>

<p>The majority of code standards boil down to naming things consistently and being consistent in how functions and whitespace are structured. We do this so we can make quick assumptions about the code as we scan a file, identifying scope or type of variables, locating blocks of code, determining level of nesting, etc. Sure there is some extra work when we initially adopt a standard, we lose some time as we get used to new naming patterns and structures, but once we get used to the standards it becomes just the way we do things, no more. </p>

<p>And as far as creativity goes, unless you're taking part in a <a href="http://blog.aerojockey.com/post/iocccsim" title="Plane-shaped flight simulator">code obfuscation contest</a>, focusing on being creative at the code structure and variable naming level is a sign that you've lost sight of the bigger picture, namely that you have an entire program to be creative with. Or you're too busy trying to <a href="https://github.com/twitter/bootstrap/issues/3057" title="In case you missed the semicolon madness">express your inner hipster</a>, one of the two.</p>

<h3>Ugly Strings are Ugly</h3>
<p>I'm not a fan of inline SQL. It tends to be written poorly, doesn't get tested for syntax errors until the first time you hit that code path, can be nearly impossible to locate when you decide to change a field name in the database, and often gets written in a solid block of unformatted text.</p>

<p>And the same happens with varying degree in HTML, LINQ, Perl, ... really anything that resembles 50 lines of content without a carriage return.</p>

<p>Even with guidelines for structuring our code, we need to be mindful of the blobs we produce. These blobs are difficult to read, adding to the level of frustration and time wasted when a future developer has to work with our code (<i>Who wrote this garbage code!? Oh, me, argh</i>). If the blob is truly a string, it deserves good formatting and consistent capitalization just as much as our code. In fact, I would say being consistent is even more important here, where color-coding and syntax checking tends to be unavailable.</p>

<p>And it's ugly. We may have saved 30 seconds and got the job done, but it's not worth taking pride in.</p>

<h2>Well, I Can See What You Were Trying To Do...</h2>
<p>I once reverse engineered some business logic out of a chemical cooker simulation program written in the early to mid 80's, revised 3 times by other developers, and utterly lacking in comments. There were no unit tests, there was one comment in the entire codebase (and it was wrong), and I often ran into cases where I could very clearly see that the developer was doing math, but couldn't figure out why he had chosen to use set V<sub>T</sub> = f(V<sub>T+1</sub>) when everywhere else we were calculating V<sub>T+1</sub> = f(V<sub>T</sub>). </p>

<p>Why were we projecting back in time with that one variable? Turns out someone had swapped the naming scheme for current and future state variables, what a pain that was to figure out. Probably saved them a few seconds to not correct it and a few more not to comment their intent, but it cost me two full days to back into what they were intending to do and determine it was a spelling error. Who knows what it cost maintainers in the 20 years in between.</p>

<p>There are two things we need to know when we look at a piece of code: what does it do and what it was it intended to do. We can determine what it does by reading the code, but there are many cases where we have to guess at what it should be doing. I've learned to start with the assumption that implementation and intent aren't in agreement (all the while hoping I'm wrong).</p>

<p>Good naming schemes that identify intent, unit tests, function-level comments, good commit comments. These may seem unnecessary now, but 6 months from now they will be critical, whether it's to maintain a piece of code or copy it for reuse.</p>

<h2>Error Messages Make Hulk Angry</h2>
<p>No one likes getting an error message. An error message is the sign that no matter what we were doing, something has gone terribly wrong and we are now a whole lot further from being done than we thought we were. Obviously what we need in this tense moment is an incomprehensible or sarcastic message from the failing application to really put our mind at ease.</p>

<p>No?</p>

<p>How about this then. We develop some software, send it out in the world, and one day receive a call from an annoyed end user about the error they are receiving. The message simply says "Null reference error", maybe with a brief joke about cheese or a reference to a technical manual for the definition of null reference. Because we all love those "oh crap, I don't even know where to start" moments.</p>

<p>No?</p>

<p>Having been on both sides of this issue, I know neither is fun. In fact, I'd love to stop learning that lesson any time now. Error messages don't have to increase our stress levels this much. Unfortunately there is a tendency to add the least amount of time for error tracking, compound that with poor error messages, then just live through the frustration when the situation is kicking our butts later. </p>

<p>Better error messages aren't that difficult, though, we just need to put more thought into them. We need to keep those two users above in mind when we're crafting our message, and keep in mind the situation they will be in when this message matters. As the end user, we need help staying calm, information on how bad the situation is, a description of what our next steps should be, and the knowledge that everything is under control. As the developer, we need information about the root cause and all the state information we can get our hands on, to speed up detection and resolution.</p>

<p>It doesn't really take longer, especially if we invest in our error reporting infrastructure. Most applications could afford to spend a week or more here, given how many hours/bug of debugging time we will end up saving in the near and long term. But more importantly, unnecessarily upsetting users and developers during an already stressful moment is a double loss that will hit us with every bug, exaggerating an already negative situation.</p>

<h2>There's More</h2>
<p>There's more to this than consistency, clarity, explaining intent, and providing useful error messages. But it all starts with being mindful that when we code, we are not just writing something to jam through a syntax check and successfully compile. The code we write needs to be clear to the future reader and allow them to understand it with the least amount of re-reading and cross-checking. It needs to be aware that it has an audience, both future developers and end users. Good code is judged, not just on it's performance characteristics, but more importantly on it's ability to age gracefully, minimizing maintenance costs and the number of people it upsets along the way.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/be-mindful-with-your-code">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/be-mindful-with-your-code#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1706</wfw:commentRss>
		</item>
				<item>
			<title>Creating a Recording with WebCam Overlay</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/other/creating-a-recording-with-webcam</link>
			<pubDate>Wed, 11 Apr 2012 12:28:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Other</category>			<guid isPermaLink="false">1692@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;I find that when I&#039;m watching recorded presentations or webinars, they feel far more engaging when I can see the person speaking as well as the content. Recently I wanted to put together a 5 minute video with a webcam overlay, but I didn&#039;t want to spend a lot of money doing it. Something like this, in fact:&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;div class=&quot;videoblock&quot;&gt;&lt;object data=&quot;http://www.youtube.com/v/1AZuXK48GQ8&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;350&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/1AZuXK48GQ8&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;/object&gt;&lt;/div&gt;
Sample Video Using Tools Below&lt;br /&gt;
&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Using a combination of free tools, I was able to record my short video with a webcam overlay, compress it for faster upload, and upload it to to YouTube for sharing. &lt;/p&gt;

&lt;h2&gt;Capturing the Recording&lt;/h2&gt;
&lt;p&gt;The trickiest part is capturing a recording with the webcam overlay without having to shell out money for something like &lt;a href=&quot;http://www.techsmith.com/camtasia.html&quot; title=&quot;Checkout Camtasi by TechSmith&quot;&gt;Camtasia&lt;/a&gt;. I tried a couple products, but eventually found a free product called &lt;a href=&quot;http://camstudio.org/&quot; title=&quot;Go to the CamStudio site&quot;&gt;CamStudio&lt;/a&gt; that allows you to add text or video overlays while it&#039;s recording the screen or a window. &lt;/p&gt;

&lt;h3&gt;Steps:&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;1: Download and Install CamStudio&lt;/b&gt;&lt;br /&gt;
The download link is available from the &lt;a href=&quot;http://camstudio.org/&quot; title=&quot;Go to the CamStudio site&quot;&gt;CamStudio frontpage&lt;/a&gt;. The download is a standard windows setup. Starting up the application presents us with the application:&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/Recording01.jpg&quot; alt=&quot;CamStudio&quot; /&gt;&lt;br /&gt;
CamStudio
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;2: Tweak the Recording Settings (first time only)&lt;/b&gt;&lt;br /&gt;
CamStudio fails to encode the recording if it is over 2GB. By dialing down the framerate of the video (initially 200fps), we can continue to get good output but extend our recording window.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the top menu, go to Options, Video Options&lt;/li&gt;
&lt;li&gt;Slide the slider at the bottom until the framerate reflects 40 frames/second or less&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/Recording02.jpg&quot; alt=&quot;Recording Settings Dialog&quot; /&gt;&lt;br /&gt;
Recording Settings Dialog
&lt;/div&gt;

&lt;p&gt;Note: You may also want to go to &quot;Options&quot;, &quot;Program Options&quot;, &quot;Directory for Recording&quot; to specify where the files will be saved.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3: Open the window you want to record&lt;/b&gt;&lt;br /&gt;
In CamStudio, select the &quot;Window&quot; option from the &quot;Region&quot; menu if you want to record a single window (which I do), or select the appropriate option for your case.&lt;/p&gt;

&lt;p&gt;I&#039;ll use a browser with the LessThanDot site as the example window I&#039;ll be recording.&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/RecordingTarget.jpg&quot; alt=&quot;Recording - Target Window&quot; /&gt;&lt;br /&gt;
Recording - My Target Window
&lt;/div&gt;

&lt;p&gt;Note: If you are recording fullscreen, you will want to go in Option, Program Options menu and select the option to minimize on recording start, then review and/or set keyboard shortcuts to start and stop the recording.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4: Turn on the Video Annotation (after plugging in your webcam)&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the top menu, go to Tools, Video Annotations.&lt;/li&gt;
&lt;li&gt;Select your webcam from the dropdown and press OK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Warning: Cancelling out of this window with a blank selection will give you errors if you try to reopen the dialog, you&#039;re better off restarting the program.&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/Recording03.jpg&quot; alt=&quot;Recording - Video Annotations Source&quot; /&gt;&lt;br /&gt;
Recording - Video Annotations Source
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;4: Position and Size the Video&lt;/b&gt;&lt;br /&gt;
Right clicking the open video gives access to additional settings for the video window.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&quot;Video Format&quot; - Modify the dimensions and pixel depth of the webcam overlay &lt;/li&gt;
&lt;li&gt;&quot;Edit Text&quot; - Remove the &quot;Right Click to Edit Text&quot; text on the webcam overlay&lt;/li&gt;
&lt;li&gt;&quot;Edit Image&quot; - Lets you tweak the shape and border of the overlay&lt;/li&gt;
&lt;li&gt;&quot;Edit Refresh Rate&quot; - Lets you dial down the refresh rate of the webcam if you are having performance problems&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/Recording04.jpg&quot; alt=&quot;Recording - Video Annotations Options&quot; /&gt;&lt;br /&gt;
Recording - Video Annotations Options - Circle w/ Border
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;5: Record&lt;/b&gt;&lt;br /&gt;
At this point we are ready to start recording. Press the red record button (circle) on the toolbar and select the window you would like to record. The window will have 4 green indicators placed around the outside and recording will start immediately.&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/RecordingInProgress.jpg&quot; alt=&quot;Recording - In Progress&quot; /&gt;&lt;br /&gt;
Recording - In Progress
&lt;/div&gt;

&lt;p&gt;After recording the video will be replayed for you. My first video is slightly over 4 minutes at 1140 x 836 and came in at 760MB, although following some of the suggested settings on forums could probably reduce this without adversely affecting quality. &lt;/p&gt;

&lt;p&gt;The next problem is that a 740MB file would take a while to upload.&lt;/p&gt;

&lt;h2&gt;Post-Processing&lt;/h2&gt;
&lt;p&gt;In order to upload the video to YouTube I needed to get it a lot smaller, and I wanted to do so for the least amount of quality loss possible. To do this I will use &lt;a href=&quot;http://www.virtualdub.org/index&quot; title=&quot;Visit the VirtualDub site&quot;&gt;VirtualDub&lt;/a&gt; to process the initial file into a lower resolution and much smaller sized file.&lt;/p&gt;

&lt;p&gt;&lt;i&gt;I can&#039;t guarantee these settings as well as the ones above as I reused saved settings from prior projects, but I&#039;ll outline the main settings I used and the gotcha I ran into.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;1: Open your file&lt;/b&gt;&lt;br /&gt;
The first step is to open the recording. This will simplify the settings when we get to the resize step. &lt;/p&gt;

&lt;p&gt;VirtualDub can display the input and output streams side-by-side, but they may will probably be too large to fit on the screen. Right clicking on the input or output, you can select a zoom level for each stream. 50% worked well for me.&lt;/p&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub01.jpg&quot; alt=&quot;VirtualDub - Opening the Video&quot; /&gt;&lt;br /&gt;
VirtualDub - Opening the Video
&lt;/div&gt;


&lt;p&gt;The option for which panes to see is in the &quot;View&quot;, &quot;Pane Layout&quot; menu.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2: Select codec&lt;/b&gt;&lt;br /&gt;
VirtualDub supports multiple codecs, in my case I used the Xvid codec with the built-in &quot;General Purpose&quot; settings.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the top menu, Select &quot;Video&quot;, &quot;Compression&quot;&lt;/li&gt;
&lt;li&gt;Select the Xvid codec (it may be a separate download, can&#039;t recall)&lt;/li&gt;
&lt;li&gt;Select configure if you want to change from the the defaults&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub02.jpg&quot; alt=&quot;VirtualDub - Codec Selection&quot; /&gt;&lt;br /&gt;
VirtualDub - Codec Selection
&lt;/div&gt;


&lt;p&gt;&lt;b&gt;2: Add a &quot;Resize&quot; filter&lt;/b&gt;&lt;br /&gt;
VirtualDub  works by passing video through a series of filters. We will specify the &quot;resize&quot; filter to reduce the resolution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;From the top menu, go to &quot;Video&quot;, &quot;Filters&quot;&lt;/li&gt;
&lt;li&gt;Press &quot;Add&quot;, find &quot;Resize&quot; in the list and add it&lt;/li&gt;
&lt;li&gt;Before changing the size, Set &quot;Aspect Ratio&quot; to same as source and set Codec-friendly sizing to multiples of 4, my Codec mode is bicubic, -.75 (which should be the default)&lt;/li&gt;
&lt;li&gt;At this point you should be able to tweak the height or width and the other dimension will respond accordingly&lt;/li&gt;
&lt;/ul&gt;

&lt;div style=&quot;text-align:center; font-size: 80%; color: #666666;&quot;&gt;
&lt;img src=&quot;http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub03.jpg&quot; alt=&quot;VirtualDub - Resize Filter&quot; /&gt;&lt;br /&gt;
VirtualDub - Resize Filter
&lt;/div&gt;

&lt;p&gt;Note: On closing the window, you can see the resolution rounds to the nearest multiple of 4 in the filters window&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2: Audio&lt;/b&gt;&lt;br /&gt;
I set my audio to direct stream copy (&quot;Audio&quot; menu, &quot;Direct Stream Processing&quot;), though unfortunately I can&#039;t say whether it makes a difference for this processing job or not.&lt;/p&gt;

&lt;p&gt;Note: if I was an expert at this stuff, I probably would have purchased professional software by now &lt;img src=&quot;http://blogs.lessthandot.com/rsc/smilies/icon_smile.gif&quot; title=&quot;:)&quot; alt=&quot;:)&quot; class=&quot;middle&quot; width=&quot;15&quot; height=&quot;15&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3: Preview&lt;/b&gt;&lt;br /&gt;
At any point, you can preview the output video just by using the player controls at the bottom. The program will do a temporary processing job on the fly to show you the video. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;4: Save&lt;/b&gt;&lt;br /&gt;
Saving is as simple as going to the &quot;File&quot; menu and selecting &quot;Save as AVI&quot;. When you save, the application will process the full video based on the settings we have added.&lt;/p&gt;

&lt;p&gt;My original 5 minute video went from 760MB to 74MB. Part of this was the reduction in resolution, but part was running it through VirtualDub. If you don&#039;t want to reduce the resolution, running through VirtualDub will still give an improvement (740MB to 114MB in the above case). An interesting experiment I&#039;ll try next time will be to use Xvid for the original recording to see if there is the same level of difference before and after running through VirtualDub.&lt;/p&gt;

&lt;h2&gt;And Done&lt;/h2&gt;
&lt;p&gt;This wasn&#039;t a terribly complicated process, although there were a few gotchas that were annoying until I figured them out. The recording software and recording may not be as polished as it would be with a more expensive product, but I still feel it came out better than just recording the screen alone.&lt;/p&gt;

&lt;p&gt;CamStudio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exiting the video annotation selection dialog without a selection upsets the app, just restart it&lt;/li&gt;
&lt;li&gt;Recording more than 4GB will cause the encoding to fail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VirtualDub:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Due to the settings I am using, selecting a resolution that is not divisible by 4 will give a cryptic error message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This may not be the most expertise-packed post, but it was enough to create a video with a webcam overlay. I will gladly take a slightly lower quality video of a speaker or instructions if I can also have the webcam overlay for visual queues.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/other/creating-a-recording-with-webcam&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>I find that when I'm watching recorded presentations or webinars, they feel far more engaging when I can see the person speaking as well as the content. Recently I wanted to put together a 5 minute video with a webcam overlay, but I didn't want to spend a lot of money doing it. Something like this, in fact:</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<div class="videoblock"><object data="http://www.youtube.com/v/1AZuXK48GQ8" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"><param name="movie" value="http://www.youtube.com/v/1AZuXK48GQ8"></param><param name="wmode" value="transparent"></param></object></div>
Sample Video Using Tools Below<br />
</div><p></p>

<p>Using a combination of free tools, I was able to record my short video with a webcam overlay, compress it for faster upload, and upload it to to YouTube for sharing. </p>

<h2>Capturing the Recording</h2>
<p>The trickiest part is capturing a recording with the webcam overlay without having to shell out money for something like <a href="http://www.techsmith.com/camtasia.html" title="Checkout Camtasi by TechSmith">Camtasia</a>. I tried a couple products, but eventually found a free product called <a href="http://camstudio.org/" title="Go to the CamStudio site">CamStudio</a> that allows you to add text or video overlays while it's recording the screen or a window. </p>

<h3>Steps:</h3>
<p><b>1: Download and Install CamStudio</b><br />
The download link is available from the <a href="http://camstudio.org/" title="Go to the CamStudio site">CamStudio frontpage</a>. The download is a standard windows setup. Starting up the application presents us with the application:</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/Recording01.jpg" alt="CamStudio" /><br />
CamStudio
</div>

<p><b>2: Tweak the Recording Settings (first time only)</b><br />
CamStudio fails to encode the recording if it is over 2GB. By dialing down the framerate of the video (initially 200fps), we can continue to get good output but extend our recording window.</p>

<ul>
<li>In the top menu, go to Options, Video Options</li>
<li>Slide the slider at the bottom until the framerate reflects 40 frames/second or less</li>
</ul>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/Recording02.jpg" alt="Recording Settings Dialog" /><br />
Recording Settings Dialog
</div>

<p>Note: You may also want to go to "Options", "Program Options", "Directory for Recording" to specify where the files will be saved.</p>

<p><b>3: Open the window you want to record</b><br />
In CamStudio, select the "Window" option from the "Region" menu if you want to record a single window (which I do), or select the appropriate option for your case.</p>

<p>I'll use a browser with the LessThanDot site as the example window I'll be recording.</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/RecordingTarget.jpg" alt="Recording - Target Window" /><br />
Recording - My Target Window
</div>

<p>Note: If you are recording fullscreen, you will want to go in Option, Program Options menu and select the option to minimize on recording start, then review and/or set keyboard shortcuts to start and stop the recording.</p>

<p><b>4: Turn on the Video Annotation (after plugging in your webcam)</b></p>
<ul>
<li>In the top menu, go to Tools, Video Annotations.</li>
<li>Select your webcam from the dropdown and press OK</li>
</ul>

<p>Warning: Cancelling out of this window with a blank selection will give you errors if you try to reopen the dialog, you're better off restarting the program.</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/Recording03.jpg" alt="Recording - Video Annotations Source" /><br />
Recording - Video Annotations Source
</div>

<p><b>4: Position and Size the Video</b><br />
Right clicking the open video gives access to additional settings for the video window.</p>

<ul>
<li>"Video Format" - Modify the dimensions and pixel depth of the webcam overlay </li>
<li>"Edit Text" - Remove the "Right Click to Edit Text" text on the webcam overlay</li>
<li>"Edit Image" - Lets you tweak the shape and border of the overlay</li>
<li>"Edit Refresh Rate" - Lets you dial down the refresh rate of the webcam if you are having performance problems</li>
</ul>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/Recording04.jpg" alt="Recording - Video Annotations Options" /><br />
Recording - Video Annotations Options - Circle w/ Border
</div>

<p><b>5: Record</b><br />
At this point we are ready to start recording. Press the red record button (circle) on the toolbar and select the window you would like to record. The window will have 4 green indicators placed around the outside and recording will start immediately.</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/RecordingInProgress.jpg" alt="Recording - In Progress" /><br />
Recording - In Progress
</div>

<p>After recording the video will be replayed for you. My first video is slightly over 4 minutes at 1140 x 836 and came in at 760MB, although following some of the suggested settings on forums could probably reduce this without adversely affecting quality. </p>

<p>The next problem is that a 740MB file would take a while to upload.</p>

<h2>Post-Processing</h2>
<p>In order to upload the video to YouTube I needed to get it a lot smaller, and I wanted to do so for the least amount of quality loss possible. To do this I will use <a href="http://www.virtualdub.org/index" title="Visit the VirtualDub site">VirtualDub</a> to process the initial file into a lower resolution and much smaller sized file.</p>

<p><i>I can't guarantee these settings as well as the ones above as I reused saved settings from prior projects, but I'll outline the main settings I used and the gotcha I ran into.</i></p>

<p><b>1: Open your file</b><br />
The first step is to open the recording. This will simplify the settings when we get to the resize step. </p>

<p>VirtualDub can display the input and output streams side-by-side, but they may will probably be too large to fit on the screen. Right clicking on the input or output, you can select a zoom level for each stream. 50% worked well for me.</p>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub01.jpg" alt="VirtualDub - Opening the Video" /><br />
VirtualDub - Opening the Video
</div>


<p>The option for which panes to see is in the "View", "Pane Layout" menu.</p>

<p><b>2: Select codec</b><br />
VirtualDub supports multiple codecs, in my case I used the Xvid codec with the built-in "General Purpose" settings.</p>

<ul>
<li>From the top menu, Select "Video", "Compression"</li>
<li>Select the Xvid codec (it may be a separate download, can't recall)</li>
<li>Select configure if you want to change from the the defaults</li>
</ul>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub02.jpg" alt="VirtualDub - Codec Selection" /><br />
VirtualDub - Codec Selection
</div>


<p><b>2: Add a "Resize" filter</b><br />
VirtualDub  works by passing video through a series of filters. We will specify the "resize" filter to reduce the resolution.</p>

<ul>
<li>From the top menu, go to "Video", "Filters"</li>
<li>Press "Add", find "Resize" in the list and add it</li>
<li>Before changing the size, Set "Aspect Ratio" to same as source and set Codec-friendly sizing to multiples of 4, my Codec mode is bicubic, -.75 (which should be the default)</li>
<li>At this point you should be able to tweak the height or width and the other dimension will respond accordingly</li>
</ul>

<div style="text-align:center; font-size: 80%; color: #666666;">
<img src="http://tiernok.com/LTDBlog/RecordingWebCam/VirtualDub03.jpg" alt="VirtualDub - Resize Filter" /><br />
VirtualDub - Resize Filter
</div>

<p>Note: On closing the window, you can see the resolution rounds to the nearest multiple of 4 in the filters window</p>

<p><b>2: Audio</b><br />
I set my audio to direct stream copy ("Audio" menu, "Direct Stream Processing"), though unfortunately I can't say whether it makes a difference for this processing job or not.</p>

<p>Note: if I was an expert at this stuff, I probably would have purchased professional software by now <img src="http://blogs.lessthandot.com/rsc/smilies/icon_smile.gif" title=":)" alt=":)" class="middle" width="15" height="15" /></p>

<p><b>3: Preview</b><br />
At any point, you can preview the output video just by using the player controls at the bottom. The program will do a temporary processing job on the fly to show you the video. </p>

<p><b>4: Save</b><br />
Saving is as simple as going to the "File" menu and selecting "Save as AVI". When you save, the application will process the full video based on the settings we have added.</p>

<p>My original 5 minute video went from 760MB to 74MB. Part of this was the reduction in resolution, but part was running it through VirtualDub. If you don't want to reduce the resolution, running through VirtualDub will still give an improvement (740MB to 114MB in the above case). An interesting experiment I'll try next time will be to use Xvid for the original recording to see if there is the same level of difference before and after running through VirtualDub.</p>

<h2>And Done</h2>
<p>This wasn't a terribly complicated process, although there were a few gotchas that were annoying until I figured them out. The recording software and recording may not be as polished as it would be with a more expensive product, but I still feel it came out better than just recording the screen alone.</p>

<p>CamStudio:</p>
<ul>
<li>Exiting the video annotation selection dialog without a selection upsets the app, just restart it</li>
<li>Recording more than 4GB will cause the encoding to fail</li>
</ul>

<p>VirtualDub:</p>
<ul>
<li>Due to the settings I am using, selecting a resolution that is not divisible by 4 will give a cryptic error message</li>
</ul>

<p>This may not be the most expertise-packed post, but it was enough to create a video with a webcam overlay. I will gladly take a slightly lower quality video of a speaker or instructions if I can also have the webcam overlay for visual queues.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/other/creating-a-recording-with-webcam">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/other/creating-a-recording-with-webcam#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1692</wfw:commentRss>
		</item>
				<item>
			<title>Defining What "Done" Means</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done</link>
			<pubDate>Wed, 14 Mar 2012 12:12:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Project Management</category>			<guid isPermaLink="false">1656@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;As I left college, I believed that projects would be clearly defined in a functional specification (despite my actual experience up to that point). The grand purpose of the project would be detailed, the goals and assumptions would be written and indexed, and the expectations for uptime, performance, and similar non-functional requirements would be included. In short, I would know exactly what needed to be produced in order to call the project &quot;complete&quot;.&lt;/p&gt;

&lt;p&gt;A little later I was introduced to the idea of a project charter, a brief 2-page document that simply outlined the goals and expectations of a project, a &lt;i&gt;&quot;what will you have when I&#039;m done&quot;&lt;/i&gt; document.  This did a better job, throwing out the crystal ball and admitting that it only knew the goals and some constraints, not the details of how it would look when we got there. &lt;/p&gt;

&lt;p&gt;At some point I was introduced to XP user stories and defining the user&#039;s expectations as acceptance criteria at the feature level, focusing on small distinct pieces of work and providing the necessary level of detail at the last responsible moment.&lt;/p&gt;

&lt;p&gt;And at some point, after an on-again, off-again relationship with unit testing, I was able to use TDD and BDD on projects, both of which work at even lower levels, defining what the behavior will be of a feature or code unit when it&#039;s code complete.&lt;/p&gt;

&lt;h2&gt;Definition of Done&lt;/h2&gt;
&lt;p&gt;The consistent thread through the lessons above was defining what &quot;done&quot; means at a project, feature, behavior, or code unit level. &lt;/p&gt;

&lt;p&gt;A requirements document provides a very deep definition of what the project will look like when it is complete. Unfortunately this only works if you will have a limited need to make changes along the way. Often what we think we need up front requires some hands on use to see what we overlooked, whether the hypothesized feature helps us meet the goal as we expected it to, and whether it makes to our end user.&lt;/p&gt;

&lt;p&gt;A simple project overview, like the charter above, can provide the overall goals and the general shape of the solution, without trying to dive too deep into the mechanics of how they will be achieved. It defines the goals of our project, serves as a measurement to determine if we are done, and helps prioritize the features we are going to implement.&lt;/p&gt;

&lt;p&gt;User Stories operate at a lower level, defining a single feature and what the end users expectations are for that feature. User stories detail expectations from the end users perspective, so discussing or prioritizing them with an end user occurs in terminology they are familiar with. User Stories provide us with the &quot;Why&quot; and room to ask deeper questions.&lt;/p&gt;

&lt;p&gt;With BDD or TDD we define what done means at an individual interaction or code unit level and can then create code that meets that definition. They provide confirmation that we have built exactly what we have set out to build, that we have met our definition of done, and that we will have some protection from derailing that work later on. &lt;/p&gt;

&lt;h2&gt;Multiple Facets of Done-ness&lt;/h2&gt;
&lt;p&gt;As critical as it is to understand what the customer or end user is actually asking us for, having a good definition of &quot;Done&quot; doesn&#039;t stop with the customer&#039;s direct expectations. We also have non-functional requirements that apply to large portions of the project as well as internal processes and practices, all of which should be considered when defining what &quot;Done&quot; means at a specific level.&lt;/p&gt;

&lt;h3&gt;Non-functional Requirements&lt;/h3&gt;
&lt;p&gt;Non-functional requirements span across many or all of the features we build into the system and can be difficult to track. Part of creating a definition of &quot;Done&quot; for a feature should include scanning the list of known non-functional requirements and adding the appropriate ones to the list. &lt;/p&gt;

&lt;p&gt;Building an AJAX feature on a web page that talks to a 3rd party web service? Probably need to include the general requirements around responsiveness of the browser page and how to degrade or error out the service when the 3rd party service inevitably goes missing.&lt;/p&gt;

&lt;h3&gt;Process and Practices&lt;/h3&gt;
&lt;p&gt;We probably have a process we want our features to follow as we build them. In some cases this might be so easy it doesn&#039;t need to be included, in others we might have a more complex process we need to follow. A feature isn&#039;t done at &quot;coded and thrown over the wall&quot;, if there are quality steps, levels of unit test coverage, static analysis to prevent us from dirtying up the codebase, and so on, those should be included in our definition of &quot;Done&quot;.&lt;/p&gt;

&lt;p&gt;Along with our ongoing process, we can also use the definition to drive longer term changes into our process or codebase. Want to add test coverage to a legacy project? Add a requirement that completing a new feature requires meeting a target test coverage and 3 tests in an older part of the code base. &lt;/p&gt;

&lt;p&gt;Being &quot;Done&quot; with a feature means the feature is ready for delivery and we won&#039;t be coming back to it in 6 months to try to bolt-on performance improvements to meet metrics we knew about in the beginning.&lt;/p&gt;

&lt;h2&gt;Benefits of a Definition&lt;/h2&gt;
&lt;p&gt;Why are we spending so much time on something that seems like just extra work?&lt;/p&gt;

&lt;p&gt;There&#039;s a difference between &lt;i&gt;&quot;I know what we have to do, lets just go do it&quot;&lt;/i&gt; and having a good definition of &quot;Done&quot;. If it is truly that obvious, making a quick bullet list will only take about 5 minutes. If it takes longer, it wasn&#039;t as obvious as we thought and we&#039;ve already uncovered some benefit.&lt;/p&gt;


&lt;p&gt;&lt;b&gt;End User Context:&lt;/b&gt; Having the end end user define their expectations helps uncover the parts that are obvious to them, but foreign to us as IT people, employees of a different company, whatever. This also helps us build something that better fits the end users needs and expectations and provides us with information we need to help them make good technical decisions.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Focus:&lt;/b&gt; With a definition of done, we have a laser focus on what needs to be done. Instead of building a general solution to meet what we think they think they want, we can build directly towards their criteria. That&#039;s not to say we&#039;re going to get it perfect on the first iteration, but we can build a leaner solution that more directly meets their expectations. This means fewer iterations and corrections with a smaller and easier to modify code base.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Get Stuff Done:&lt;/b&gt; Ever get on one of those projects where it feels like it just kind of keeps on sluggishly flowing past and tasks are only done if no one has asked about them in a couple weeks? Yeah, I&#039;ve been there too. Having a definition of done not only helps you better define when it hits that magic &quot;Done&quot; moment, but also keeps those one day tasks from turning into 6 month, under the radar, mini-marathon projects. Want an additional feature on top of the original one? We can totally do that too, but lets make a task for it so I can make sure I understand and capture your expectations. That other task is done, done, done.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Prioritization:&lt;/b&gt; How important is &quot;add a button and text input to screen X&quot;? Yeah, I don&#039;t know either. So how are we going to get the end user to help prioritize these things without someone pulling out the &quot;they&#039;re all number one&quot; phrase? Instead of trying to prioritize screens and buttons, the end user is prioritizing their own needs and expectations. This can help the end user prioritize, consider scope reduction of less necessary features, or potentially modifying a deadline to get all of the truly critical elements.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Bake Enough Quality In:&lt;/b&gt; Whatever your non-functional or process criteria are, trying to add them at the end of the project rarely works out well. If you need a certain level of performance, make this part of the criteria along the way. Afraid the focus will shift from getting things done to premature performance tuning? Create a looser &quot;acceptable performance&quot; level that is used during the main development, then tune from there afterwards. We don&#039;t want to waste time on premature optimization, but without at least a minimum acceptable bar you will quickly find out just how horrendously slow something can be written to run.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Don&#039;t Bake Too Much Quality In:&lt;/b&gt; A lack of definition doesn&#039;t automatically make everyone faster, the opposite can happen as well. Without a definition, each person on the project (and the customer) is left to define their own level for non-functional or process criteria. These are not likely to be the same. So the customer has one non-communicated level of performance expectations, the project manager has another. One developer is slamming code out as fast as they can with &quot;as long as it compiles&quot; as a performance bar, another is spending days trying to squeeze an extra 10ms out of a process. Defining &quot;Done&quot; in this case not only helps raise the bar and communicate consistent expectations, it also frees up time from any of the members of the team that have more stringent personal definitions they fall back on. &lt;/p&gt;

&lt;h2&gt;&quot;Done&quot; for the post&lt;/h2&gt;
&lt;p&gt;This post was inspired by posts from Howard (not published yet?) and Alex (&lt;a title=&quot;Bad Medicine - How Prescription Becomes a Problem in User Stories&quot; href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/bad-medicine-how-prescription-becomes&quot;&gt;Bad Medicine - How Prescription Becomes a Problem in User Stories&lt;/a&gt;) as well as ongoing conversations we&#039;ve been having. &lt;/p&gt;

&lt;p&gt;It may seem like wasted effort to put a definition of &quot;Done&quot; together, but I have yet to see an environment where the long term cost wasn&#039;t much greater (and my personal IT experience spans consulting engagements, 4 SaaS products, and over 75 projects). Not every website needs to load at Google search speeds, but the team needs to have a clear bar to aim for, even if that is &quot;under ten seconds&quot;, and the customer needs to know and be OK with this bar. &lt;/p&gt;

&lt;p&gt;A definition of &quot;Done&quot; doesn&#039;t need to have crystal clear requirements in infinite detail, &quot;web-scale&quot; performance guidelines, and so on. Be pragmatic. It&#039;s more important that the end user expectations are captured and understood, that the relevant non-functional requirements (when the 3rd party service goes down, so does our entire product, and it&#039;s OK) are included, and that somewhere we have captured the teams expectations for practices and process. Aim for just enough and be aware you will still have surprises.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>As I left college, I believed that projects would be clearly defined in a functional specification (despite my actual experience up to that point). The grand purpose of the project would be detailed, the goals and assumptions would be written and indexed, and the expectations for uptime, performance, and similar non-functional requirements would be included. In short, I would know exactly what needed to be produced in order to call the project "complete".</p>

<p>A little later I was introduced to the idea of a project charter, a brief 2-page document that simply outlined the goals and expectations of a project, a <i>"what will you have when I'm done"</i> document.  This did a better job, throwing out the crystal ball and admitting that it only knew the goals and some constraints, not the details of how it would look when we got there. </p>

<p>At some point I was introduced to XP user stories and defining the user's expectations as acceptance criteria at the feature level, focusing on small distinct pieces of work and providing the necessary level of detail at the last responsible moment.</p>

<p>And at some point, after an on-again, off-again relationship with unit testing, I was able to use TDD and BDD on projects, both of which work at even lower levels, defining what the behavior will be of a feature or code unit when it's code complete.</p>

<h2>Definition of Done</h2>
<p>The consistent thread through the lessons above was defining what "done" means at a project, feature, behavior, or code unit level. </p>

<p>A requirements document provides a very deep definition of what the project will look like when it is complete. Unfortunately this only works if you will have a limited need to make changes along the way. Often what we think we need up front requires some hands on use to see what we overlooked, whether the hypothesized feature helps us meet the goal as we expected it to, and whether it makes to our end user.</p>

<p>A simple project overview, like the charter above, can provide the overall goals and the general shape of the solution, without trying to dive too deep into the mechanics of how they will be achieved. It defines the goals of our project, serves as a measurement to determine if we are done, and helps prioritize the features we are going to implement.</p>

<p>User Stories operate at a lower level, defining a single feature and what the end users expectations are for that feature. User stories detail expectations from the end users perspective, so discussing or prioritizing them with an end user occurs in terminology they are familiar with. User Stories provide us with the "Why" and room to ask deeper questions.</p>

<p>With BDD or TDD we define what done means at an individual interaction or code unit level and can then create code that meets that definition. They provide confirmation that we have built exactly what we have set out to build, that we have met our definition of done, and that we will have some protection from derailing that work later on. </p>

<h2>Multiple Facets of Done-ness</h2>
<p>As critical as it is to understand what the customer or end user is actually asking us for, having a good definition of "Done" doesn't stop with the customer's direct expectations. We also have non-functional requirements that apply to large portions of the project as well as internal processes and practices, all of which should be considered when defining what "Done" means at a specific level.</p>

<h3>Non-functional Requirements</h3>
<p>Non-functional requirements span across many or all of the features we build into the system and can be difficult to track. Part of creating a definition of "Done" for a feature should include scanning the list of known non-functional requirements and adding the appropriate ones to the list. </p>

<p>Building an AJAX feature on a web page that talks to a 3rd party web service? Probably need to include the general requirements around responsiveness of the browser page and how to degrade or error out the service when the 3rd party service inevitably goes missing.</p>

<h3>Process and Practices</h3>
<p>We probably have a process we want our features to follow as we build them. In some cases this might be so easy it doesn't need to be included, in others we might have a more complex process we need to follow. A feature isn't done at "coded and thrown over the wall", if there are quality steps, levels of unit test coverage, static analysis to prevent us from dirtying up the codebase, and so on, those should be included in our definition of "Done".</p>

<p>Along with our ongoing process, we can also use the definition to drive longer term changes into our process or codebase. Want to add test coverage to a legacy project? Add a requirement that completing a new feature requires meeting a target test coverage and 3 tests in an older part of the code base. </p>

<p>Being "Done" with a feature means the feature is ready for delivery and we won't be coming back to it in 6 months to try to bolt-on performance improvements to meet metrics we knew about in the beginning.</p>

<h2>Benefits of a Definition</h2>
<p>Why are we spending so much time on something that seems like just extra work?</p>

<p>There's a difference between <i>"I know what we have to do, lets just go do it"</i> and having a good definition of "Done". If it is truly that obvious, making a quick bullet list will only take about 5 minutes. If it takes longer, it wasn't as obvious as we thought and we've already uncovered some benefit.</p>


<p><b>End User Context:</b> Having the end end user define their expectations helps uncover the parts that are obvious to them, but foreign to us as IT people, employees of a different company, whatever. This also helps us build something that better fits the end users needs and expectations and provides us with information we need to help them make good technical decisions.</p>

<p><b>Focus:</b> With a definition of done, we have a laser focus on what needs to be done. Instead of building a general solution to meet what we think they think they want, we can build directly towards their criteria. That's not to say we're going to get it perfect on the first iteration, but we can build a leaner solution that more directly meets their expectations. This means fewer iterations and corrections with a smaller and easier to modify code base.</p>

<p><b>Get Stuff Done:</b> Ever get on one of those projects where it feels like it just kind of keeps on sluggishly flowing past and tasks are only done if no one has asked about them in a couple weeks? Yeah, I've been there too. Having a definition of done not only helps you better define when it hits that magic "Done" moment, but also keeps those one day tasks from turning into 6 month, under the radar, mini-marathon projects. Want an additional feature on top of the original one? We can totally do that too, but lets make a task for it so I can make sure I understand and capture your expectations. That other task is done, done, done.</p>

<p><b>Prioritization:</b> How important is "add a button and text input to screen X"? Yeah, I don't know either. So how are we going to get the end user to help prioritize these things without someone pulling out the "they're all number one" phrase? Instead of trying to prioritize screens and buttons, the end user is prioritizing their own needs and expectations. This can help the end user prioritize, consider scope reduction of less necessary features, or potentially modifying a deadline to get all of the truly critical elements.</p>

<p><b>Bake Enough Quality In:</b> Whatever your non-functional or process criteria are, trying to add them at the end of the project rarely works out well. If you need a certain level of performance, make this part of the criteria along the way. Afraid the focus will shift from getting things done to premature performance tuning? Create a looser "acceptable performance" level that is used during the main development, then tune from there afterwards. We don't want to waste time on premature optimization, but without at least a minimum acceptable bar you will quickly find out just how horrendously slow something can be written to run.</p>

<p><b>Don't Bake Too Much Quality In:</b> A lack of definition doesn't automatically make everyone faster, the opposite can happen as well. Without a definition, each person on the project (and the customer) is left to define their own level for non-functional or process criteria. These are not likely to be the same. So the customer has one non-communicated level of performance expectations, the project manager has another. One developer is slamming code out as fast as they can with "as long as it compiles" as a performance bar, another is spending days trying to squeeze an extra 10ms out of a process. Defining "Done" in this case not only helps raise the bar and communicate consistent expectations, it also frees up time from any of the members of the team that have more stringent personal definitions they fall back on. </p>

<h2>"Done" for the post</h2>
<p>This post was inspired by posts from Howard (not published yet?) and Alex (<a title="Bad Medicine - How Prescription Becomes a Problem in User Stories" href="http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/bad-medicine-how-prescription-becomes">Bad Medicine - How Prescription Becomes a Problem in User Stories</a>) as well as ongoing conversations we've been having. </p>

<p>It may seem like wasted effort to put a definition of "Done" together, but I have yet to see an environment where the long term cost wasn't much greater (and my personal IT experience spans consulting engagements, 4 SaaS products, and over 75 projects). Not every website needs to load at Google search speeds, but the team needs to have a clear bar to aim for, even if that is "under ten seconds", and the customer needs to know and be OK with this bar. </p>

<p>A definition of "Done" doesn't need to have crystal clear requirements in infinite detail, "web-scale" performance guidelines, and so on. Be pragmatic. It's more important that the end user expectations are captured and understood, that the relevant non-functional requirements (when the 3rd party service goes down, so does our entire product, and it's OK) are included, and that somewhere we have captured the teams expectations for practices and process. Aim for just enough and be aware you will still have surprises.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/defining-done#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1656</wfw:commentRss>
		</item>
				<item>
			<title>Meme Monday: My First Blog Post</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-my-first-blog</link>
			<pubDate>Tue, 10 Jan 2012 00:07:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Professional Development</category>			<guid isPermaLink="false">1586@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;Denis started us off earlier with his &lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-what-is-the&quot; title=&quot;Meme Monday: what is the first blogpost you wrote and when did you write it?&quot;&gt;Meme Monday&lt;/a&gt; post, &quot;Meme Monday: what is the first blogpost you wrote and when did you write it?&quot;.&lt;/p&gt;

&lt;p&gt;This is a tricky question for me, mostly because my memory is poor and I&#039;m having difficulty bending google&#039;s time search to my will.&lt;/p&gt;

&lt;h2&gt;LessThanDot&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/rant.png&quot; alt=&quot;Ranty pic&quot; style=&quot;float: left; margin: .5em 1em .5em 0px;&quot; /&gt;&lt;br /&gt;
My first LessThanDot post was a &lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/an-invisible-project-is-a-failed-project&quot; title=&quot;An Invisible Project is a Failed Project&quot;&gt;wall of text&lt;/a&gt; in April 2009 that talked about bringing transparency and a definition of success to all projects, no matter how small. Since then I have added 78 more posts, finding out along the way that if you write a post with the word &lt;a href=&quot;http://blogs.lessthandot.com/index.php/Architect/IntroductionArchitectureDesign/why-and-how-i-model&quot; title=&quot;Why and How I model&quot;&gt;&quot;Model&quot;&lt;/a&gt; in it, you will get enough traffic to bring the poor LessThanDot server to its knees (and a whole lot of disappointed readers) and that apparently &lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/trying-the-stand-up-desk&quot; title=&quot;Trying the Standing Desk&quot;&gt;standing at one&#039;s desk&lt;/a&gt; is far more interesting than &lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/process-kills-developer-passion-and-kittens&quot; title=&quot;Process Kills Developer Passion...and Kittens, lots of Kittens&quot;&gt;sarcasm and cat pictures&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I think the last one was the most surprising.&lt;/p&gt;

&lt;h2&gt;But further back...&lt;/h2&gt;
&lt;p&gt;But before my LessThanDot posts I kept a private site with 10&#039;s of hits a month.&lt;img src=&quot;http://tiernok.com/LTDBlog/success.jpg&quot; alt=&quot;Success!&quot; style=&quot;float: right; margin: 0px 0px .5em 1em;&quot; /&gt; Or maybe a little less. My first post on this site was dated in August of 2002, a &lt;a href=&quot;http://web.archive.org/web/20031027050202/http://www.tiernok.com/ShowTutorial.asp?rid=20&quot; title=&quot;Multiple Pages In the same file at Archive.Org&quot;&gt;Classic ASP tutorial&lt;/a&gt; on creating files that incorporated multiple pages. &lt;/p&gt;

&lt;p&gt;Did it count as my first one? I don&#039;t know. Benefits of a poor memory, I guess.&lt;/p&gt;

&lt;p&gt;I am proud to see the site from 2002 was (mostly) HTML table-free and still looks roughly correct 9 years later (despite all the objections since that browsers just aren&#039;t ready for table-free layouts, bitter? naah).&lt;/p&gt;




&lt;h2&gt;Happy 2012!&lt;/h2&gt;
&lt;p&gt;Last year I posted 40 posts, including one with more than 25 pictures. Eventually I&#039;ll get around to making some new goals for this year and look forward to seeing what everyone else at LTD posts in the coming year.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-my-first-blog&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Denis started us off earlier with his <a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-what-is-the" title="Meme Monday: what is the first blogpost you wrote and when did you write it?">Meme Monday</a> post, "Meme Monday: what is the first blogpost you wrote and when did you write it?".</p>

<p>This is a tricky question for me, mostly because my memory is poor and I'm having difficulty bending google's time search to my will.</p>

<h2>LessThanDot</h2>
<p><img src="http://tiernok.com/LTDBlog/rant.png" alt="Ranty pic" style="float: left; margin: .5em 1em .5em 0px;" /><br />
My first LessThanDot post was a <a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/an-invisible-project-is-a-failed-project" title="An Invisible Project is a Failed Project">wall of text</a> in April 2009 that talked about bringing transparency and a definition of success to all projects, no matter how small. Since then I have added 78 more posts, finding out along the way that if you write a post with the word <a href="http://blogs.lessthandot.com/index.php/Architect/IntroductionArchitectureDesign/why-and-how-i-model" title="Why and How I model">"Model"</a> in it, you will get enough traffic to bring the poor LessThanDot server to its knees (and a whole lot of disappointed readers) and that apparently <a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/trying-the-stand-up-desk" title="Trying the Standing Desk">standing at one's desk</a> is far more interesting than <a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ITProcesses/process-kills-developer-passion-and-kittens" title="Process Kills Developer Passion...and Kittens, lots of Kittens">sarcasm and cat pictures</a>.</p>

<p>I think the last one was the most surprising.</p>

<h2>But further back...</h2>
<p>But before my LessThanDot posts I kept a private site with 10's of hits a month.<img src="http://tiernok.com/LTDBlog/success.jpg" alt="Success!" style="float: right; margin: 0px 0px .5em 1em;" /> Or maybe a little less. My first post on this site was dated in August of 2002, a <a href="http://web.archive.org/web/20031027050202/http://www.tiernok.com/ShowTutorial.asp?rid=20" title="Multiple Pages In the same file at Archive.Org">Classic ASP tutorial</a> on creating files that incorporated multiple pages. </p>

<p>Did it count as my first one? I don't know. Benefits of a poor memory, I guess.</p>

<p>I am proud to see the site from 2002 was (mostly) HTML table-free and still looks roughly correct 9 years later (despite all the objections since that browsers just aren't ready for table-free layouts, bitter? naah).</p>




<h2>Happy 2012!</h2>
<p>Last year I posted 40 posts, including one with more than 25 pictures. Eventually I'll get around to making some new goals for this year and look forward to seeing what everyone else at LTD posts in the coming year.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-my-first-blog">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/meme-monday-my-first-blog#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1586</wfw:commentRss>
		</item>
				<item>
			<title>Using Code Katas to Improve Programming Skills</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/using-code-katas-to-improve</link>
			<pubDate>Tue, 20 Sep 2011 09:56:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Professional Development</category>			<guid isPermaLink="false">1408@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;Feelings about programming katas tend to fall into one of 3 buckets; disdain, indifference, or appreciation. The indifferent crowd generally doesn&#039;t see what you learn from repeating the same coding exercise, while the disdainful crowd feels the same way, but at a much louder (and of course disdainful) volume. That leaves the group that feel there is value in repetitively coding the same exercise or coding numerous small code examples.&lt;/p&gt;

&lt;p&gt;I was in the indifferent group, but then I tried it.&lt;/p&gt;

&lt;h2&gt;Where I Started&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/clock.png&quot; style=&quot;float: right; margin: 0px 0px 10px 10px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After finishing &lt;a href=&quot;http://www.amazon.com/gp/product/0137081073&quot; title=&quot;The Clean Coder at Amazon&quot;&gt;The Clean Coder&lt;/a&gt; recently, I decided to give this kata thing a try. I started out with a fairly simple problem in a language I was comfortable with and spent 15-30 minutes each night trying a different variant or constraint. What I found was that even the act of setting up for a kata was a learning experience, in one case learning an entirely new unit test framework before I could even begin.&lt;/p&gt;

&lt;p&gt;Fast forward a couple weeks and I think this is becoming a regular part of my ongoing development. I&#039;ve even taken to synching my local mercurial repositories up to &lt;a href=&quot;http://bitbucket.org/tarwn&quot; title=&quot;Go to my BitBucket account&quot;&gt;my BitBucket account&lt;/a&gt; so that others can take advantage of the pre-setup projects and test scenarios. (I haven&#039;t quite embraced the throw-away aspect yet, but I suspect I won&#039;t be keeping all of my repetitive attempts.)&lt;/p&gt;

&lt;p&gt;In the past several weeks I&#039;ve gained a lot more practice with mercurial, played with some concepts in C# (like Continuation Passing Style), and started digging into unit testing JavaScript. I&#039;ve learned markdown simply by spending an hour or two formatting a series of text documents (an uninspired exercise, I&#039;ll admit) and .. well, for the not much time investment I can already see that this will be a good habit to add.&lt;/p&gt;

&lt;h2&gt;Why (or How) it Works&lt;/h2&gt;
&lt;p&gt;So why, then, do people do this? Obviously it takes time to write a program, no matter how small. &lt;a href=&quot;http://www.objectmentor.com/omTeam/martin_r.html&quot;&gt;Robert C. Martin&lt;/a&gt;, author of The Clean Coder above, swears by this practice. Jeff Atwood is another who &lt;a href=&quot;http://www.codinghorror.com/blog/2008/06/the-ultimate-code-kata.html&quot;&gt;wrote about katas&lt;/a&gt;. Dave Thomas (first kata link below) introduced the term as co-author of The Pragmatic Programmer. &lt;/p&gt;

&lt;p&gt;But where is the value in repeating a simple exercise?&lt;/p&gt;

&lt;h3&gt;The Challenge&lt;/h3&gt;
&lt;p&gt;The first thing that struck me about code katas is their similarity to forum questions the LTD group used to hijack, back in the day. Someone would come up with a perfectly reasonable solution to a somewhat reasonable problem, then 2 or 3 of us would turn it into a 30 reply post, each trying to find a shorter, faster, whackier, whatever-er method of solving the same problem. In fact, the reason I learned how to use python and perl in classic ASP web pages was due to challenges like this.&lt;/p&gt;

&lt;p&gt;The value of short, varied approaches is it forces us to stretch our knowledge of a language or syntax. Playing with constraints (performance, code length, memory limits, etc) help us explore more about a language or technology and choosing a short exercise as a base means we spend most of our time in that exploration, rather than in the act of retyping a solution or having to build a large structure to work with.&lt;/p&gt;

&lt;h3&gt;Focus&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/Scores2.png&quot; style=&quot;float: right; margin: 0px 0px 10px 10px&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By selecting a fairly simple problem, we can choose to focus on any other aspect of programming that we want. Besides introducing rules or constraints to make the program more challenging, we can also use repetition of a simple, known problem to better get to know our tools or learn new supporting tools. Examples include improving use of keyboard shortcuts, trying out methods like TDD, and training ourselves on new habits or standards. By working on something we already know the answer to, we are free to play with the aspects of how we get to that answer.&lt;/p&gt;

&lt;h3&gt;No Loss&lt;/h3&gt;
&lt;p&gt;The last benefit to a programming kata is we can throw it away when we&#039;re done or even stop it halfway and simply delete it. Whatever aspect we have chosen to focus on or challenge ourselves with, this is still a small bit of practice code. Rather than trying to learn something new with a piece of code we will eventually have to support, we can play in a sandbox and put it away when we&#039;re done.&lt;/p&gt;

&lt;h2&gt;Where Can You Start&lt;/h2&gt;
&lt;p&gt;So, if you wanted to try this out, where could you start?&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://codekata.pragprog.com/&quot;&gt;CodeKata.PragProg.com&lt;/a&gt; - Dave Thomas has listed 21 programming and non-programming exercises&lt;/li&gt;
	&lt;li&gt;Forums - Find a forum question that requires more than 5 lines of code for an answer. Write it, reinvent it, mix, repeat&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://codingdojo.org/cgi-bin/wiki.pl?KataCatalogue&quot;&gt;Coding Dojo&lt;/a&gt; - A catalog of 23 katas&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://projecteuler.net/&quot;&gt;Project Euler&lt;/a&gt; - a series of challenging math problems that make excellent practice problems&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://topcoder.com/&quot;&gt;TopCoder&lt;/a&gt; - Though it exists as a programming competition, the sample and practice problems at TopCoder make good katas (if you can get the crash-friendly interface to work and find them, that is)&lt;/li&gt;
	&lt;li&gt;Blogging - Writing about a topic forces us to explore and better define or communicate it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best way to start is to pick something you feel like you can finish in 15-30 minutes and try to do a variant of it every day or two. If you feel like you&#039;re not getting any value out of it after a week or two, you can stop; your time investment has been low. If you do start seeing some value in it, though, you have another tool for keeping your skills relevant and sharp.&lt;/p&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/using-code-katas-to-improve&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Feelings about programming katas tend to fall into one of 3 buckets; disdain, indifference, or appreciation. The indifferent crowd generally doesn't see what you learn from repeating the same coding exercise, while the disdainful crowd feels the same way, but at a much louder (and of course disdainful) volume. That leaves the group that feel there is value in repetitively coding the same exercise or coding numerous small code examples.</p>

<p>I was in the indifferent group, but then I tried it.</p>

<h2>Where I Started</h2>
<p><img src="http://tiernok.com/LTDBlog/clock.png" style="float: right; margin: 0px 0px 10px 10px" /></p>
<p>After finishing <a href="http://www.amazon.com/gp/product/0137081073" title="The Clean Coder at Amazon">The Clean Coder</a> recently, I decided to give this kata thing a try. I started out with a fairly simple problem in a language I was comfortable with and spent 15-30 minutes each night trying a different variant or constraint. What I found was that even the act of setting up for a kata was a learning experience, in one case learning an entirely new unit test framework before I could even begin.</p>

<p>Fast forward a couple weeks and I think this is becoming a regular part of my ongoing development. I've even taken to synching my local mercurial repositories up to <a href="http://bitbucket.org/tarwn" title="Go to my BitBucket account">my BitBucket account</a> so that others can take advantage of the pre-setup projects and test scenarios. (I haven't quite embraced the throw-away aspect yet, but I suspect I won't be keeping all of my repetitive attempts.)</p>

<p>In the past several weeks I've gained a lot more practice with mercurial, played with some concepts in C# (like Continuation Passing Style), and started digging into unit testing JavaScript. I've learned markdown simply by spending an hour or two formatting a series of text documents (an uninspired exercise, I'll admit) and .. well, for the not much time investment I can already see that this will be a good habit to add.</p>

<h2>Why (or How) it Works</h2>
<p>So why, then, do people do this? Obviously it takes time to write a program, no matter how small. <a href="http://www.objectmentor.com/omTeam/martin_r.html">Robert C. Martin</a>, author of The Clean Coder above, swears by this practice. Jeff Atwood is another who <a href="http://www.codinghorror.com/blog/2008/06/the-ultimate-code-kata.html">wrote about katas</a>. Dave Thomas (first kata link below) introduced the term as co-author of The Pragmatic Programmer. </p>

<p>But where is the value in repeating a simple exercise?</p>

<h3>The Challenge</h3>
<p>The first thing that struck me about code katas is their similarity to forum questions the LTD group used to hijack, back in the day. Someone would come up with a perfectly reasonable solution to a somewhat reasonable problem, then 2 or 3 of us would turn it into a 30 reply post, each trying to find a shorter, faster, whackier, whatever-er method of solving the same problem. In fact, the reason I learned how to use python and perl in classic ASP web pages was due to challenges like this.</p>

<p>The value of short, varied approaches is it forces us to stretch our knowledge of a language or syntax. Playing with constraints (performance, code length, memory limits, etc) help us explore more about a language or technology and choosing a short exercise as a base means we spend most of our time in that exploration, rather than in the act of retyping a solution or having to build a large structure to work with.</p>

<h3>Focus</h3>
<p><img src="http://tiernok.com/LTDBlog/Scores2.png" style="float: right; margin: 0px 0px 10px 10px" /></p>
<p>By selecting a fairly simple problem, we can choose to focus on any other aspect of programming that we want. Besides introducing rules or constraints to make the program more challenging, we can also use repetition of a simple, known problem to better get to know our tools or learn new supporting tools. Examples include improving use of keyboard shortcuts, trying out methods like TDD, and training ourselves on new habits or standards. By working on something we already know the answer to, we are free to play with the aspects of how we get to that answer.</p>

<h3>No Loss</h3>
<p>The last benefit to a programming kata is we can throw it away when we're done or even stop it halfway and simply delete it. Whatever aspect we have chosen to focus on or challenge ourselves with, this is still a small bit of practice code. Rather than trying to learn something new with a piece of code we will eventually have to support, we can play in a sandbox and put it away when we're done.</p>

<h2>Where Can You Start</h2>
<p>So, if you wanted to try this out, where could you start?</p>

<ul>
	<li><a href="http://codekata.pragprog.com/">CodeKata.PragProg.com</a> - Dave Thomas has listed 21 programming and non-programming exercises</li>
	<li>Forums - Find a forum question that requires more than 5 lines of code for an answer. Write it, reinvent it, mix, repeat</li>
	<li><a href="http://codingdojo.org/cgi-bin/wiki.pl?KataCatalogue">Coding Dojo</a> - A catalog of 23 katas</li>
	<li><a href="http://projecteuler.net/">Project Euler</a> - a series of challenging math problems that make excellent practice problems</li>
	<li><a href="http://topcoder.com/">TopCoder</a> - Though it exists as a programming competition, the sample and practice problems at TopCoder make good katas (if you can get the crash-friendly interface to work and find them, that is)</li>
	<li>Blogging - Writing about a topic forces us to explore and better define or communicate it</li>
</ul>

<p>The best way to start is to pick something you feel like you can finish in 15-30 minutes and try to do a variant of it every day or two. If you feel like you're not getting any value out of it after a week or two, you can stop; your time investment has been low. If you do start seeing some value in it, though, you have another tool for keeping your skills relevant and sharp.</p><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/using-code-katas-to-improve">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/using-code-katas-to-improve#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1408</wfw:commentRss>
		</item>
				<item>
			<title>What Gordon Ramsay Can Teach the IT Industry</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/what-gordon-ramsay-can-teach-it</link>
			<pubDate>Thu, 28 Jul 2011 10:03:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Ethics &amp; IT</category>			<guid isPermaLink="false">1358@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;Recently I found &lt;a href=&quot;http://www.bbcamerica.com/content/154/index.jsp&quot; title=&quot;More information on BBC America&quot;&gt;Gordon Ramsay&#039;s Kitchen Nightmares&lt;/a&gt; on Netflix. Each episode of this show starts with a restaurant that is on the brink of collapse and follows Gordon through his efforts to help the owners turn their restaurant around. Usually I don&#039;t enjoy reality shows, but along with the drama and swearing there are a lot of great takeaways (no pun intended) for us as IT people.&lt;/p&gt;

&lt;p&gt;The five that initially occurred to me are Simplicity, Authenticity, Communications, Consistency, and Leadership. By the time I was done the post I had considerably more, but I don&#039;t want to spoil the show for you.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I&#039;m obviously in no way affiliated with Netflix, Gordon Ramsay, or the BBC and I hope that if for some reason he finds himself trawling through IT blogs he doesn&#039;t take offense at this post. &lt;br /&gt;
&lt;br /&gt;
I watched a few episodes of the US show and found it to be missing most of what I liked about the UK version, so if you&#039;ve only seen the US version this whole post may confuse you.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Simplicity&lt;/h2&gt;
&lt;p&gt;In many episodes we see a restaurant struggling to serve such a large variety of items that it has no chance but to do them all poorly. The kitchen has no way to be prepared, as every evening is radically different. This struggle then forces them towards false economies of purchasing pre-prepared foods, freezing in advance, and generally cutting corners just to keep up. Simplifying the menu allows the kitchen to focus, wait until that day to prepare, and operate in a smoother manner.&lt;/p&gt;

&lt;p&gt;Now think about it from an IT perspective. In the IT world we have a habit of over-complicating our solutions. We see the technologies shifting in new directions, new products coming, open a book and see architectural patterns for software development, patterns for building infinitely scalable networks, and so on. We try to provide service from an infinitely large menu filled with options we have never really tried. We add functions and unrequested features as a matter of course, ignoring the complexity and extra costs these add in. &lt;/p&gt;

&lt;p&gt;That approach doesn&#039;t work in the restaurant business and it only appears to work in the IT trade because no one gets violently ill when we deliver half-cooked systems. &lt;/p&gt;

&lt;p&gt;&quot;Don&#039;t get to clever&quot;. A professional chef manages the size of their menu to what they can deliver and a professional IT group has to do the same. We need to build a simpler menu that focuses on delivering what the business needs and what we can provide rather than trying to deliver anything and everything on the market (and doing all of it poorly). This doesn&#039;t mean leaving off new technologies, but we need to make sure we&#039;ve tried them and have a good grasp of their strengths and weaknesses before putting them on the menu.&lt;/p&gt;

&lt;h2&gt;Authenticity&lt;/h2&gt;
&lt;p&gt;To appeal to the customer, they have to identify with our product. In several episodes we see Ramsay polling the person on the street about menus, dishes, and once the color of the restaurant. What we end up seeing is a gap between what the customer wants or expects and what the restaurant is providing. In nearly every case, coming into better alignment with the potential customer is part of the recovery. The restaurant shifts to local produce and meats or to more authentic dishes. The menu and food changes to become more consistent with their area or it&#039;s theme and capitalizes on the authenticity to build customers.&lt;/p&gt;

&lt;p&gt;With IT, authenticity is just as important. It doesn&#039;t matter whether the server is a Dell or HP, whether the end user asks for an ERP or scheduling system, whether we prefer an MVC framework or Silverlight application. What matters is working within the context of the business and what our potential users can receive value from. We need to work with our business to determine if an ERP is the best choice or if maybe a small business finance package would be a better fit. Are we using a new framework because it benefits the users or our ego? COTS or homegrown? Does the value of a feature outweigh it&#039;s cost? Is it a quality product or did we buy it based on the quality of the bar they took us to after that tech show?&lt;/p&gt;

&lt;p&gt;Business alignment and helping the business make technical decisions is part of our authenticity as IT people. Helping the business make good, sustainable IT decisions is part of helping the authenticity of our business. Attempting to forcefeed the business solutions that satisfy our ego or laziness is not part of our job descriptions.&lt;/p&gt;

&lt;h2&gt;Communications&lt;/h2&gt;
&lt;p&gt;Kitchens are stressful places and provide numerous places for communication to break down. The chef stops communicating to their team and in minutes the team is idle while the chef melts down trying to run things on their own. Communication between the kitchen and the floor breaks down and not only is the customer impacted, but the floor doesn&#039;t know when to start pushing the faster dishes to ease pressure in the kitchen. Communications to the customer fails, bringing more pressure back on the floor staff, flows back into the kitchen and very quickly things spiral out of control.&lt;/p&gt;

&lt;p&gt;And it&#039;s the same in IT. Not only are the communications between stakeholder and IT person critical, but we have to be aware of the other critical communications lines. Individual failures can quickly propagate inside our group and business, coming back to increase pressure when we need it the least. A good start is having a consistent method of communicating expectations and information. Without a consistent method it just turns into a room full of people generating a muddled background noise. Clear communication of delivery expectations, clear communication of expectations to the team, clear acceptance of delivery, clear updates to end users and stakeholders... These help to focus our efforts and drive repeatable behavior, trust, and a reduced level of stress. &lt;/p&gt;

&lt;p&gt;Chaos is stressful and tends to feedback into itself. Clear, consistent communication keeps chaos to a minimum, ensures important information reaches the right ears, and helps keep us focused on the tasks at hand.&lt;/p&gt;

&lt;h2&gt;Consistency&lt;/h2&gt;
&lt;p&gt;A key to return business is the ability to deliver meals in a consistent manner. The consistency of the food helps set the customers expectations and build trust, while an inconsistent meal generates mistrust and is guaranteed to disappoint the customer. Part of delivering consistent food is tasting every dish before it goes out, testing each one to make sure it is up to the chef&#039;s expectations before it reaches the customer.&lt;/p&gt;

&lt;p&gt;In IT we have a habit of delivering inconsistent solutions. Applications are released that perform poorly in the real world, never having run outside of the developers machine. Networks and services are provided with no measures for quality, performance, scalability. Usability and user experience are add-ons at the end. We spend time on unnecessary features and rush the necessary ones...the list goes on. If no one is tasting the product, if we don&#039;t have both a guide for what &quot;good&quot; is and test against that expectation, then we won&#039;t be able to tell when those systems are failing to live up to our expectations. We can say they&#039;re the best systems in the country, but it&#039;s just wishing.&lt;/p&gt;

&lt;p&gt;We need to define our expectations, test our systems against those expectations, and be consistent with our delivery. Wishing our systems are good makes all the time and energy we have put into them a waste and guarantees that we will be delivering inconsistent systems.&lt;/p&gt;

&lt;h2&gt;Leadership&lt;/h2&gt;
&lt;p&gt;No matter how many improvements he helps make in a restaurant, the critical element for Gordon is to help managers, chefs, and owners take control of their environment and lead their people. Without this final ingredient, the new behaviors will not stick and the restaurant will soon slump back into it&#039;s former ways. With chefs he stresses the importance of leading and teaching the less experienced members of the kitchen, with house managers he might point out the same about their waitstaff. A restaurant that stands still will become dated and slowly degrade, as they start cutting corners and providing poorer service. &lt;/p&gt;

&lt;p&gt;The parallel with IT should be obvious. Just as a restaurant requires leadership to keep moving forward, so does a good IT group. Without good leadership, we get in the habit of cutting corners, watching the clock, falling behind in our skills, falling out of line with the company values... Good leadership is what keeps the positives from falling into disrepair, turns groups into teams, and is the difference between a slow decline into a greasy spoon and a restaurant that delivers consistent, authentic, simple foods that delight the customer and guarantee return business.&lt;/p&gt;

&lt;p&gt;There are only two directions, improving and deteriorating. No matter what improvements we make, if we don&#039;t have good leadership in place to promote those improvements, promote the values of the business, grow and respect the team, then any attempt at improvement is likely to fall by the wayside.&lt;/p&gt;

&lt;h2&gt;We May Not Work in the Kitchen...&lt;/h2&gt;
&lt;p&gt;We may not work in kitchens, but we do work in environments that can be very stressful, where every customer sees themselves as a chef and outages have to be corrected at 3am. We tend to add complexity where we should be removing it, we have communications problems, we have disconnects from our &#039;customers&#039;, we have difficulty delivering consistently, and we treat leadership as something that is granted at the wave of a new title.  &lt;/p&gt;

&lt;p&gt;I picked five elements in the show, but these are not the only parallels I saw. Management, passion, pride, respect, continuous improvement, keeping our eye on the &quot;plot&quot; ... IT doesn&#039;t have to invent everything from scratch. At the end of the day we are in an industry of people, delivering solutions to people, for problems that people created. All of the people-side issues exist all around us, in hundreds of different industries, we just need to step beyond our egos and be open to learning from them.&lt;/p&gt;

&lt;em&gt;After writing this up I took my own advice to go see who else had drawn similar parallels. Here are a couple links you should head over and check out:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://rossclennett.blogspot.com/2008/04/lessons-in-business-leadership-gordon.html&quot; title=&quot;Lessons in Business Leadership: Gordon Ramsay&quot;&gt;Lessons in Business Leadership: Gordon Ramsay &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://performancecomputing.com/news/healthcare/leadership/227600194&quot; title=&quot;Guerra On Healthcare: What Gordon Ramsay Can Teach CIOs&quot;&gt;Guerra On Healthcare: What Gordon Ramsay Can Teach CIOs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/em&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/what-gordon-ramsay-can-teach-it&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Recently I found <a href="http://www.bbcamerica.com/content/154/index.jsp" title="More information on BBC America">Gordon Ramsay's Kitchen Nightmares</a> on Netflix. Each episode of this show starts with a restaurant that is on the brink of collapse and follows Gordon through his efforts to help the owners turn their restaurant around. Usually I don't enjoy reality shows, but along with the drama and swearing there are a lot of great takeaways (no pun intended) for us as IT people.</p>

<p>The five that initially occurred to me are Simplicity, Authenticity, Communications, Consistency, and Leadership. By the time I was done the post I had considerably more, but I don't want to spoil the show for you.</p>

<p><em>I'm obviously in no way affiliated with Netflix, Gordon Ramsay, or the BBC and I hope that if for some reason he finds himself trawling through IT blogs he doesn't take offense at this post. <br />
<br />
I watched a few episodes of the US show and found it to be missing most of what I liked about the UK version, so if you've only seen the US version this whole post may confuse you.</em></p>

<h2>Simplicity</h2>
<p>In many episodes we see a restaurant struggling to serve such a large variety of items that it has no chance but to do them all poorly. The kitchen has no way to be prepared, as every evening is radically different. This struggle then forces them towards false economies of purchasing pre-prepared foods, freezing in advance, and generally cutting corners just to keep up. Simplifying the menu allows the kitchen to focus, wait until that day to prepare, and operate in a smoother manner.</p>

<p>Now think about it from an IT perspective. In the IT world we have a habit of over-complicating our solutions. We see the technologies shifting in new directions, new products coming, open a book and see architectural patterns for software development, patterns for building infinitely scalable networks, and so on. We try to provide service from an infinitely large menu filled with options we have never really tried. We add functions and unrequested features as a matter of course, ignoring the complexity and extra costs these add in. </p>

<p>That approach doesn't work in the restaurant business and it only appears to work in the IT trade because no one gets violently ill when we deliver half-cooked systems. </p>

<p>"Don't get to clever". A professional chef manages the size of their menu to what they can deliver and a professional IT group has to do the same. We need to build a simpler menu that focuses on delivering what the business needs and what we can provide rather than trying to deliver anything and everything on the market (and doing all of it poorly). This doesn't mean leaving off new technologies, but we need to make sure we've tried them and have a good grasp of their strengths and weaknesses before putting them on the menu.</p>

<h2>Authenticity</h2>
<p>To appeal to the customer, they have to identify with our product. In several episodes we see Ramsay polling the person on the street about menus, dishes, and once the color of the restaurant. What we end up seeing is a gap between what the customer wants or expects and what the restaurant is providing. In nearly every case, coming into better alignment with the potential customer is part of the recovery. The restaurant shifts to local produce and meats or to more authentic dishes. The menu and food changes to become more consistent with their area or it's theme and capitalizes on the authenticity to build customers.</p>

<p>With IT, authenticity is just as important. It doesn't matter whether the server is a Dell or HP, whether the end user asks for an ERP or scheduling system, whether we prefer an MVC framework or Silverlight application. What matters is working within the context of the business and what our potential users can receive value from. We need to work with our business to determine if an ERP is the best choice or if maybe a small business finance package would be a better fit. Are we using a new framework because it benefits the users or our ego? COTS or homegrown? Does the value of a feature outweigh it's cost? Is it a quality product or did we buy it based on the quality of the bar they took us to after that tech show?</p>

<p>Business alignment and helping the business make technical decisions is part of our authenticity as IT people. Helping the business make good, sustainable IT decisions is part of helping the authenticity of our business. Attempting to forcefeed the business solutions that satisfy our ego or laziness is not part of our job descriptions.</p>

<h2>Communications</h2>
<p>Kitchens are stressful places and provide numerous places for communication to break down. The chef stops communicating to their team and in minutes the team is idle while the chef melts down trying to run things on their own. Communication between the kitchen and the floor breaks down and not only is the customer impacted, but the floor doesn't know when to start pushing the faster dishes to ease pressure in the kitchen. Communications to the customer fails, bringing more pressure back on the floor staff, flows back into the kitchen and very quickly things spiral out of control.</p>

<p>And it's the same in IT. Not only are the communications between stakeholder and IT person critical, but we have to be aware of the other critical communications lines. Individual failures can quickly propagate inside our group and business, coming back to increase pressure when we need it the least. A good start is having a consistent method of communicating expectations and information. Without a consistent method it just turns into a room full of people generating a muddled background noise. Clear communication of delivery expectations, clear communication of expectations to the team, clear acceptance of delivery, clear updates to end users and stakeholders... These help to focus our efforts and drive repeatable behavior, trust, and a reduced level of stress. </p>

<p>Chaos is stressful and tends to feedback into itself. Clear, consistent communication keeps chaos to a minimum, ensures important information reaches the right ears, and helps keep us focused on the tasks at hand.</p>

<h2>Consistency</h2>
<p>A key to return business is the ability to deliver meals in a consistent manner. The consistency of the food helps set the customers expectations and build trust, while an inconsistent meal generates mistrust and is guaranteed to disappoint the customer. Part of delivering consistent food is tasting every dish before it goes out, testing each one to make sure it is up to the chef's expectations before it reaches the customer.</p>

<p>In IT we have a habit of delivering inconsistent solutions. Applications are released that perform poorly in the real world, never having run outside of the developers machine. Networks and services are provided with no measures for quality, performance, scalability. Usability and user experience are add-ons at the end. We spend time on unnecessary features and rush the necessary ones...the list goes on. If no one is tasting the product, if we don't have both a guide for what "good" is and test against that expectation, then we won't be able to tell when those systems are failing to live up to our expectations. We can say they're the best systems in the country, but it's just wishing.</p>

<p>We need to define our expectations, test our systems against those expectations, and be consistent with our delivery. Wishing our systems are good makes all the time and energy we have put into them a waste and guarantees that we will be delivering inconsistent systems.</p>

<h2>Leadership</h2>
<p>No matter how many improvements he helps make in a restaurant, the critical element for Gordon is to help managers, chefs, and owners take control of their environment and lead their people. Without this final ingredient, the new behaviors will not stick and the restaurant will soon slump back into it's former ways. With chefs he stresses the importance of leading and teaching the less experienced members of the kitchen, with house managers he might point out the same about their waitstaff. A restaurant that stands still will become dated and slowly degrade, as they start cutting corners and providing poorer service. </p>

<p>The parallel with IT should be obvious. Just as a restaurant requires leadership to keep moving forward, so does a good IT group. Without good leadership, we get in the habit of cutting corners, watching the clock, falling behind in our skills, falling out of line with the company values... Good leadership is what keeps the positives from falling into disrepair, turns groups into teams, and is the difference between a slow decline into a greasy spoon and a restaurant that delivers consistent, authentic, simple foods that delight the customer and guarantee return business.</p>

<p>There are only two directions, improving and deteriorating. No matter what improvements we make, if we don't have good leadership in place to promote those improvements, promote the values of the business, grow and respect the team, then any attempt at improvement is likely to fall by the wayside.</p>

<h2>We May Not Work in the Kitchen...</h2>
<p>We may not work in kitchens, but we do work in environments that can be very stressful, where every customer sees themselves as a chef and outages have to be corrected at 3am. We tend to add complexity where we should be removing it, we have communications problems, we have disconnects from our 'customers', we have difficulty delivering consistently, and we treat leadership as something that is granted at the wave of a new title.  </p>

<p>I picked five elements in the show, but these are not the only parallels I saw. Management, passion, pride, respect, continuous improvement, keeping our eye on the "plot" ... IT doesn't have to invent everything from scratch. At the end of the day we are in an industry of people, delivering solutions to people, for problems that people created. All of the people-side issues exist all around us, in hundreds of different industries, we just need to step beyond our egos and be open to learning from them.</p>

<em>After writing this up I took my own advice to go see who else had drawn similar parallels. Here are a couple links you should head over and check out:
<ul>
<li><a href="http://rossclennett.blogspot.com/2008/04/lessons-in-business-leadership-gordon.html" title="Lessons in Business Leadership: Gordon Ramsay">Lessons in Business Leadership: Gordon Ramsay </a></li>
<li><a href="http://performancecomputing.com/news/healthcare/leadership/227600194" title="Guerra On Healthcare: What Gordon Ramsay Can Teach CIOs">Guerra On Healthcare: What Gordon Ramsay Can Teach CIOs</a></li>
</ul>
</em><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/what-gordon-ramsay-can-teach-it">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/EthicsIT/what-gordon-ramsay-can-teach-it#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1358</wfw:commentRss>
		</item>
				<item>
			<title>Building a Lightweight Project Management Process</title>
			<link>http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/building-a-lightweight-project-management-process</link>
			<pubDate>Mon, 18 Jul 2011 10:40:00 +0000</pubDate>			<dc:creator>Eli Weinstock-Herman (tarwn)</dc:creator>
			<category domain="main">Project Management</category>
<category domain="alt">IT Processes</category>			<guid isPermaLink="false">1325@http://blogs.lessthandot.com/</guid>
						<description>&lt;p&gt;Working as a Software Developer* in a range of small companies and organizations, I&#039;ve had the opportunity to work on quite a number of different projects. That experience has given me a healthy appreciation for how not to execute projects, as well as a healthy respect for process. Recently I pulled together a basic process to help manage the development tasks I am working on, track completion against my estimates, and a number of other things. It takes roughly an hour every two weeks and 5-10 minutes per day to maintain.&lt;/p&gt;

&lt;p&gt;This isn&#039;t a new process or even a sales pitch on how you too can implement my process and save thousands. It&#039;s simply a walk through of the challenges that led to the process, the tools and practices I incorporated, and the steps I followed to build a lightweight process.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*Software Developer: It seems every developer position I&#039;ve held has had a different definition of &#039;Developer&#039; (&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/the-programmer-vs-the-developer&quot; title=&quot;Read more on my thoughts of the Developer vs Programmer title&quot;&gt;and &#039;Programmer&#039;&lt;/a&gt;, and...you get the point). The positive side of this is lots of great experiences, the negative side is all the fun things I got to use/do and never again.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Building a Process&lt;/h2&gt;
&lt;p&gt;Just as we do (or should do) when building software, we need to have a purpose. Often the largest, clumsiest processes occur through a lack of focus or a desire to focus in every direction (ultimate flexibility, no limits, etc). That lack of focus leads everyone to add their own bits to the mix. One person adds what worked in his last project, someone else adds something she always wanted to try, more pieces are added to cover ever eventuality or risk that can be thought of....and Colossus is born, moving so slowly that all involved often think they are moving backwards and could be beaten by a 2 man team in a garage.&lt;/p&gt;

&lt;p&gt;The purpose of process is to provide consistency and ground rules. A good process is an enabler.&lt;/p&gt;

&lt;p&gt;I know, that sounds odd (and many of you probably think you are totally against having any process), so lets try a comparison.&lt;/p&gt;

&lt;p&gt;Say we&#039;re working on a software development project and we are required to deliver code documentation as part of the project. Once upon a time this would have required a great deal of time to put together, keep up to date as changes occurred, etc. It probably would have been a full time job on any team over 3-4 developers. Then someone came along and said &quot;Look, if we comment every function like so, then I can write a script to extract those comments and automatically build the documentation.&quot;&lt;/p&gt;

&lt;p&gt;In the software world we call this a &quot;convention&quot;. Incorporating conventions into our practice allows us to automate or get some extra value out of something simply because it&#039;s been done in a consistent manner (possibly with an extra step or two sprinkled on top). &lt;/p&gt;

&lt;p&gt;Process is not inherently bad. Like writing software, there is never only one answer and even using the latest and greatest of tools you can build a ghastly, unmaintainable mess. &lt;/p&gt;

&lt;h2&gt;So Back to My Process&lt;/h2&gt;
&lt;p&gt;So recently I started the new job and I was given responsibility for adding some new capabilities to a system. I had the freedom to define my own processes, determine how I was going to get the work done, and so on. The critical deliverable was only delivery of working software, added in a manner not inconsistent with the existing platform.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;My focus for the process is:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Know as far ahead of time as possible if I was diverging from initial estimates &lt;/li&gt;
&lt;li&gt;Collect just enough data to re-estimate completion if order of tasks changed, interruptions occurred, etc&lt;/li&gt;
&lt;li&gt;Have a sense of accomplishment, see the work getting done&lt;/li&gt;
&lt;li&gt;Have a way to track how much of my time is spent on interruptive tasks, scope additions, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So this is my bare minimum set of requirements from my process, my focus. &lt;/p&gt;

&lt;p&gt;&lt;b&gt;Then we have some challenges:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High potential for variability/change&lt;br /&gt;
      &lt;ul&gt;
	&lt;li&gt;I am new to the company and have a poorer feel for what they need than more experienced employees&lt;/li&gt;
	&lt;li&gt;The company hasn&#039;t had this type of system before, so the requirements will be more changeable and will require greater refinement along the way&lt;/li&gt;
	&lt;li&gt;I don&#039;t have direct contact with stakeholders or end users&lt;/li&gt;
      &lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Limited experience with tools (existing, in-house architecture/codebase)&lt;br /&gt;
      &lt;ul&gt;
	&lt;li&gt;I am not comfortable (or was not) with the system I was adding onto&lt;/li&gt;
	&lt;li&gt;Standards are limited to finding existing examples to duplicate&lt;/li&gt;
	&lt;li&gt;Expected to convert some existing components for wider use w/ my portion without disrupting their existing functions&lt;/li&gt;
      &lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;No automated testing - the framework is challenging for unit testing&lt;/li&gt;
&lt;li&gt;Live environment - though my pieces of the system would not be live for weeks or months, the system is deployed weekly and existing portions would be used and revised&lt;/li&gt;
&lt;li&gt;I am a team of one - limits flexibility, easier to get &quot;stuck in the mud&quot; without someone to pull me out, limited to my own experiences &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So having a focus and an understanding of my initial challenges, I built an initial process.&lt;/p&gt;

&lt;h2&gt;The End Process&lt;/h2&gt;
&lt;p&gt;From the focus and challenges above, I pulled together a minimal process. Let&#039;s look at that process then circle back around to the &quot;why was that piece chosen&quot;. This process borrows heavily from Lean and Scrum processes, incorporating the idea of iterations (or sprints), a visual board, and a burndown chart. &lt;/p&gt;

&lt;p&gt;I started by identifying the major features we were looking for in the system. Once I had these (through a series of conversations and prototyping), I had my manager prioritize them and help group them into potential releases. Initially this proved to be 3 major releases and a few extra features that would be prioritized after the last release.&lt;/p&gt;

&lt;div style=&quot;color: #666666; text-align: center; font-size: .8em;&quot;&gt;
   &lt;a href=&quot;http://tiernok.com/LTDBlog/process/FeaturesLg.png&quot; title=&quot;View the fullsize version&quot;&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/process/FeaturesSm.png&quot; alt=&quot;Feature list spreadsheet&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
   Spreadsheet of prioritized features and releases
&lt;/div&gt;

&lt;p&gt;I put all of these features into a spreadsheet, along with their priority and a rough estimate in ideal days. In a separate page of the spreadsheet I broke down each of the features into individual tasks and estimated those tasks in hours. There was a little variance between my individual task estimates and the feature estimates, but they averaged out. &lt;/p&gt;

&lt;div style=&quot;color: #666666; text-align: center; font-size: .8em;&quot;&gt;
   &lt;a href=&quot;http://tiernok.com/LTDBlog/process/TasksLg.png&quot; title=&quot;View the fullsize version&quot;&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/process/TasksSm.png&quot; alt=&quot;Task list spreadsheet&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
   Spreadsheet of features broken down into tasks
&lt;/div&gt;

&lt;p&gt;In a third tab, I created a list of the available workdays for the project, an iteration code, a number of hours available for each day (initially 6), a calculation for number of hours remaining in the iteration, and an empty column for the number of task hours remaining. I then created a pivot chart for this table, grouping by the iteration so I could easily display a burndown chart of the expected hours being done against the actual tasks being completed.&lt;/p&gt;

&lt;div style=&quot;color: #666666; text-align: center; font-size: .8em;&quot;&gt;
   &lt;a href=&quot;http://tiernok.com/LTDBlog/process/TrackingLg.png&quot; title=&quot;View the fullsize version&quot;&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/process/TrackingSm.png&quot; alt=&quot;Tracking spreadsheet&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
   Spreadsheet for tracking actual vs estimated work against tasks
&lt;/div&gt;

&lt;div style=&quot;color: #666666; text-align: center; font-size: .8em;&quot;&gt;
   &lt;a href=&quot;http://tiernok.com/LTDBlog/process/BurndownLg.png&quot; title=&quot;View the fullsize version&quot;&gt;&lt;img src=&quot;http://tiernok.com/LTDBlog/process/BurndownSm.png&quot; alt=&quot;Tracking spreadsheet&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
   Burndown chart from tracking data
&lt;/div&gt;

&lt;p&gt;The last spreadsheet step was to load up my first iteration without overloading myself. Adding an iteration code to my task list tab and some calculated fields (visible in the task spreadsheet screenshot above) let me total up how many estimated hours I was loading into the iteration.&lt;/p&gt;

&lt;div style=&quot;color: #666666; text-align: center; font-size: .8em;&quot;&gt;
   &lt;img src=&quot;http://tiernok.com/LTDBlog/process/CapacityAssigned.png&quot; alt=&quot;Tracking spreadsheet&quot; /&gt;&lt;br /&gt;&lt;br /&gt;
   Simple graphs of available capacity vs assigned tasks
&lt;/div&gt;

&lt;p&gt;After setting up the spreadsheet, I setup a visual board in the corner of my whiteboard. I created columns for tasks that were ready to be worked (tasks assigned to the current iteration), tasks in progress, tasks completed and waiting for the weekly deployment, and tasks that were completed and in the live environment. Within a couple days I also added an express lane at the bottom for bugs and high priority feature revisions.&lt;/p&gt;

&lt;div style=&quot;text-align: center; font-size: .9em; color: #666666;&quot;&gt;
   &lt;img src=&quot;http://tiernok.com/LTDBlog/process/board.png&quot; alt=&quot;Visual Board Pictures&quot; /&gt;&lt;br /&gt;&lt;br /&gt;
   Pictures of visual board over time
&lt;/div&gt;

&lt;p&gt;The sticky notes were kept fairly simple. The color indicates the type and each has the name of the task and the iteration code written on it. Though I did not implement WIP limits (Kanban) on my columns, I have unofficial numbers in my head to help me limit task switching.&lt;/p&gt;

&lt;p&gt;As the iterations progress, I calculate how many estimated hours of work I get done per day and update that value in the third tab of my spreadsheet. This ratio of estimation hours to real hours then helps me project forward and see if I am on track for the final release, need to refine some tasks to reduce their estimated time, or potentially have some time to pull in tasks at the end. &lt;/p&gt;

&lt;h2&gt;How I Got Here&lt;/h2&gt;
&lt;p&gt;So I started with a focus and some challenges and ended up with all of that (which is actually a fairly lightweight process, it just took a lot of space to write it up). Here&#039;s the connections:&lt;/p&gt;

&lt;h3&gt;Why Iterative?&lt;/h3&gt;
&lt;p&gt;I chose to use an iterative process to help manage the risks for variability and my own limited experience. An iterative process would help me course correct far sooner and take advantage of my growing experience in the company and with the software instead of trying to base the entire project off of my knowledge on day one. &lt;/p&gt;

&lt;p&gt;So the iterative process was chosen to help reduce the impact of risks involved with my knowledge of the software and my understanding of the requirements, as well as refinements that were expected to occur along the way.&lt;/p&gt;

&lt;h3&gt;Why a spreadsheet? Why estimated hours?&lt;/h3&gt;
&lt;p&gt;I chose to use a spreadsheet and this method of estimated vs real hours to address measurement of actual execution against estimated and provide an ability and data to re-estimate tasks as time progressed.&lt;/p&gt;

&lt;h3&gt;Can I have your spreadsheet?&lt;/h3&gt;
&lt;p&gt;Below is a link for the sample workbook I put together for the images in this post. Being an example, it hasn&#039;t actually gone through the process of being used, revised, marked up, etc like the actual one I use. &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tiernok.com/LTDBlog/process/SampleWorkbook.xlsx&quot; title=&quot;Download sample workbook&quot;&gt;Download the workbook&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has no instructions, no notes, and is in XLSX format. &lt;/p&gt;

&lt;h3&gt;Why such small tasks?&lt;/h3&gt;
&lt;p&gt;Why did I break down the features at all? They&#039;re only a few days worth of work, couldn&#039;t I have just used those?&lt;/p&gt;

&lt;p&gt;Well yes and no. By going with smaller tasks I can usually move one or two tasks from doing to done in any given day, which feeds back into my feelings of productivity and such. Smaller tasks also help me find out I&#039;ve gone off the rails sooner or that I missed something critical. Additionally, smaller tasks are easier to move around, if I intend to do task 1A-1C but a bug comes in, I can wrap up my work on 1A, do the bug, then come back to 1B with a much lower task switching cost then if I was switching inside feature 1. &lt;/p&gt;

&lt;p&gt;Small tasks also feed back into estimates, force us to evaluate the features more deeply, bring future issues to the surface early enough that we can start asking questions before we get to do-or-die time, etc.&lt;/p&gt;

&lt;h3&gt;Seriously, Sticky Notes?&lt;/h3&gt;
&lt;p&gt;I chose the visual board for several reasons. The first is that seeing the work flow across the board helps give me a sense of accomplishment. Good morale and a sense of accomplishment help keep me from getting bogged down or feeling like I&#039;m not making progress. The visual board also gave me a way to see the level of revisions that were occurring and the impact they were having as the iteration progressed.&lt;/p&gt;

&lt;p&gt;The final advantage was that the board reduced the time it took me to switch tasks, at any time I could glance at the board and see what I was working on last, what I would likely be working on next, etc. When I go into work after a 3 day weekend, it will take me longer to boot up my computer than to determine what I was working on. I also have a visual of how many tasks I am trying to work on simultaneously, and that causes me to try and limit that number, reducing task switching. In Lean terms, I have reduced my changeover time, some of the waste involved in those changeovers, and the number of changeovers that occur (splitting releases into features into smaller tasks also reduced my batch size).&lt;/p&gt;

&lt;h3&gt;What&#039;s Missing?&lt;/h3&gt;
&lt;p&gt;The only challenges that my process did not address were a method to limit the risk of working on live software without a safety net (other than manual testing). I did address this, but that&#039;s probably for another post.&lt;/p&gt;

&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;The most critical part of creating a process is to know why your creating it. Without a focus, without knowing the goals and risks, you run the risk of creating something that costs more than it solves. Like programming or any other skill, selecting and building a good process is easier the more you do it. Pay attention not just to what does work, but also to what doesn&#039;t. My process is not perfect and it will have failures, I intend to learn from them. But I&#039;m also learning from the processes I see others following. &lt;/p&gt;

&lt;p&gt;If you are interested, here are some random links on related topics (plenty more in my &lt;a href=&quot;http://www.delicious.com/tarwn&quot; title=&quot;Eli&#039;s bookmarks on Delicious&quot;&gt;Delicious bookmarks&lt;/a&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://kosmothink.com/2010/12/31/the-uncertainty-principal-or-how-to-choose-the-right-methodology/&quot; title=&quot;The Uncertainty Principle OR How to Choose the Right Methodology - Kosmothink&quot;&gt;The Uncertainty Principle OR How to Choose the Right Methodology - Kosmothink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.projectsmart.co.uk/waterfall-v-agile-how-should-i-approach-my-software-development-project.html&quot; title=&quot;Waterfall v Agile: How Should I Approach My Software Development Project?&quot;&gt;Waterfall v Agile: How Should I Approach My Software Development Project?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lisamdrake.wordpress.com/2011/05/28/time-boxing-strategies-to-help-you-get-things-done-in-your-project/&quot; title=&quot;Time Boxing Strategies to Help You Get Things Done in Your Project&quot;&gt;Time Boxing Strategies to Help You Get Things Done in Your Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jessefewell.com/2009/12/20/methodology-doesnt-matter/&quot; title=&quot;Methodology Doesn&amp;#8217;t Matter&quot;&gt;Methodology Doesn&amp;#8217;t Matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.xqa.com.ar/visualmanagement/2009/02/visual-management-for-agile-teams/&quot; title=&quot;Visual Management for Agile Teams&quot;&gt;Visual Management for Agile Teams&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;item_footer&quot;&gt;&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/building-a-lightweight-project-management-process&quot;&gt;Original post&lt;/a&gt; blogged on &lt;a href=&quot;http://lessthandot.com/&quot;&gt;LessThanDot&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;</description>
			<content:encoded><![CDATA[<p>Working as a Software Developer* in a range of small companies and organizations, I've had the opportunity to work on quite a number of different projects. That experience has given me a healthy appreciation for how not to execute projects, as well as a healthy respect for process. Recently I pulled together a basic process to help manage the development tasks I am working on, track completion against my estimates, and a number of other things. It takes roughly an hour every two weeks and 5-10 minutes per day to maintain.</p>

<p>This isn't a new process or even a sales pitch on how you too can implement my process and save thousands. It's simply a walk through of the challenges that led to the process, the tools and practices I incorporated, and the steps I followed to build a lightweight process.</p>

<p><em>*Software Developer: It seems every developer position I've held has had a different definition of 'Developer' (<a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProfessionalDevelopment/the-programmer-vs-the-developer" title="Read more on my thoughts of the Developer vs Programmer title">and 'Programmer'</a>, and...you get the point). The positive side of this is lots of great experiences, the negative side is all the fun things I got to use/do and never again.</em></p>

<h2>Building a Process</h2>
<p>Just as we do (or should do) when building software, we need to have a purpose. Often the largest, clumsiest processes occur through a lack of focus or a desire to focus in every direction (ultimate flexibility, no limits, etc). That lack of focus leads everyone to add their own bits to the mix. One person adds what worked in his last project, someone else adds something she always wanted to try, more pieces are added to cover ever eventuality or risk that can be thought of....and Colossus is born, moving so slowly that all involved often think they are moving backwards and could be beaten by a 2 man team in a garage.</p>

<p>The purpose of process is to provide consistency and ground rules. A good process is an enabler.</p>

<p>I know, that sounds odd (and many of you probably think you are totally against having any process), so lets try a comparison.</p>

<p>Say we're working on a software development project and we are required to deliver code documentation as part of the project. Once upon a time this would have required a great deal of time to put together, keep up to date as changes occurred, etc. It probably would have been a full time job on any team over 3-4 developers. Then someone came along and said "Look, if we comment every function like so, then I can write a script to extract those comments and automatically build the documentation."</p>

<p>In the software world we call this a "convention". Incorporating conventions into our practice allows us to automate or get some extra value out of something simply because it's been done in a consistent manner (possibly with an extra step or two sprinkled on top). </p>

<p>Process is not inherently bad. Like writing software, there is never only one answer and even using the latest and greatest of tools you can build a ghastly, unmaintainable mess. </p>

<h2>So Back to My Process</h2>
<p>So recently I started the new job and I was given responsibility for adding some new capabilities to a system. I had the freedom to define my own processes, determine how I was going to get the work done, and so on. The critical deliverable was only delivery of working software, added in a manner not inconsistent with the existing platform.</p>

<p><b>My focus for the process is:</b></p>
<ul>
<li>Know as far ahead of time as possible if I was diverging from initial estimates </li>
<li>Collect just enough data to re-estimate completion if order of tasks changed, interruptions occurred, etc</li>
<li>Have a sense of accomplishment, see the work getting done</li>
<li>Have a way to track how much of my time is spent on interruptive tasks, scope additions, etc</li>
</ul>

<p>So this is my bare minimum set of requirements from my process, my focus. </p>

<p><b>Then we have some challenges:</b></p>
<ul>
<li>High potential for variability/change<br />
      <ul>
	<li>I am new to the company and have a poorer feel for what they need than more experienced employees</li>
	<li>The company hasn't had this type of system before, so the requirements will be more changeable and will require greater refinement along the way</li>
	<li>I don't have direct contact with stakeholders or end users</li>
      </ul></li>
<li>Limited experience with tools (existing, in-house architecture/codebase)<br />
      <ul>
	<li>I am not comfortable (or was not) with the system I was adding onto</li>
	<li>Standards are limited to finding existing examples to duplicate</li>
	<li>Expected to convert some existing components for wider use w/ my portion without disrupting their existing functions</li>
      </ul></li>
<li>No automated testing - the framework is challenging for unit testing</li>
<li>Live environment - though my pieces of the system would not be live for weeks or months, the system is deployed weekly and existing portions would be used and revised</li>
<li>I am a team of one - limits flexibility, easier to get "stuck in the mud" without someone to pull me out, limited to my own experiences </li>
</ul>

<p>So having a focus and an understanding of my initial challenges, I built an initial process.</p>

<h2>The End Process</h2>
<p>From the focus and challenges above, I pulled together a minimal process. Let's look at that process then circle back around to the "why was that piece chosen". This process borrows heavily from Lean and Scrum processes, incorporating the idea of iterations (or sprints), a visual board, and a burndown chart. </p>

<p>I started by identifying the major features we were looking for in the system. Once I had these (through a series of conversations and prototyping), I had my manager prioritize them and help group them into potential releases. Initially this proved to be 3 major releases and a few extra features that would be prioritized after the last release.</p>

<div style="color: #666666; text-align: center; font-size: .8em;">
   <a href="http://tiernok.com/LTDBlog/process/FeaturesLg.png" title="View the fullsize version"><img src="http://tiernok.com/LTDBlog/process/FeaturesSm.png" alt="Feature list spreadsheet" /></a><br /><br />
   Spreadsheet of prioritized features and releases
</div>

<p>I put all of these features into a spreadsheet, along with their priority and a rough estimate in ideal days. In a separate page of the spreadsheet I broke down each of the features into individual tasks and estimated those tasks in hours. There was a little variance between my individual task estimates and the feature estimates, but they averaged out. </p>

<div style="color: #666666; text-align: center; font-size: .8em;">
   <a href="http://tiernok.com/LTDBlog/process/TasksLg.png" title="View the fullsize version"><img src="http://tiernok.com/LTDBlog/process/TasksSm.png" alt="Task list spreadsheet" /></a><br /><br />
   Spreadsheet of features broken down into tasks
</div>

<p>In a third tab, I created a list of the available workdays for the project, an iteration code, a number of hours available for each day (initially 6), a calculation for number of hours remaining in the iteration, and an empty column for the number of task hours remaining. I then created a pivot chart for this table, grouping by the iteration so I could easily display a burndown chart of the expected hours being done against the actual tasks being completed.</p>

<div style="color: #666666; text-align: center; font-size: .8em;">
   <a href="http://tiernok.com/LTDBlog/process/TrackingLg.png" title="View the fullsize version"><img src="http://tiernok.com/LTDBlog/process/TrackingSm.png" alt="Tracking spreadsheet" /></a><br /><br />
   Spreadsheet for tracking actual vs estimated work against tasks
</div>

<div style="color: #666666; text-align: center; font-size: .8em;">
   <a href="http://tiernok.com/LTDBlog/process/BurndownLg.png" title="View the fullsize version"><img src="http://tiernok.com/LTDBlog/process/BurndownSm.png" alt="Tracking spreadsheet" /></a><br /><br />
   Burndown chart from tracking data
</div>

<p>The last spreadsheet step was to load up my first iteration without overloading myself. Adding an iteration code to my task list tab and some calculated fields (visible in the task spreadsheet screenshot above) let me total up how many estimated hours I was loading into the iteration.</p>

<div style="color: #666666; text-align: center; font-size: .8em;">
   <img src="http://tiernok.com/LTDBlog/process/CapacityAssigned.png" alt="Tracking spreadsheet" /><br /><br />
   Simple graphs of available capacity vs assigned tasks
</div>

<p>After setting up the spreadsheet, I setup a visual board in the corner of my whiteboard. I created columns for tasks that were ready to be worked (tasks assigned to the current iteration), tasks in progress, tasks completed and waiting for the weekly deployment, and tasks that were completed and in the live environment. Within a couple days I also added an express lane at the bottom for bugs and high priority feature revisions.</p>

<div style="text-align: center; font-size: .9em; color: #666666;">
   <img src="http://tiernok.com/LTDBlog/process/board.png" alt="Visual Board Pictures" /><br /><br />
   Pictures of visual board over time
</div>

<p>The sticky notes were kept fairly simple. The color indicates the type and each has the name of the task and the iteration code written on it. Though I did not implement WIP limits (Kanban) on my columns, I have unofficial numbers in my head to help me limit task switching.</p>

<p>As the iterations progress, I calculate how many estimated hours of work I get done per day and update that value in the third tab of my spreadsheet. This ratio of estimation hours to real hours then helps me project forward and see if I am on track for the final release, need to refine some tasks to reduce their estimated time, or potentially have some time to pull in tasks at the end. </p>

<h2>How I Got Here</h2>
<p>So I started with a focus and some challenges and ended up with all of that (which is actually a fairly lightweight process, it just took a lot of space to write it up). Here's the connections:</p>

<h3>Why Iterative?</h3>
<p>I chose to use an iterative process to help manage the risks for variability and my own limited experience. An iterative process would help me course correct far sooner and take advantage of my growing experience in the company and with the software instead of trying to base the entire project off of my knowledge on day one. </p>

<p>So the iterative process was chosen to help reduce the impact of risks involved with my knowledge of the software and my understanding of the requirements, as well as refinements that were expected to occur along the way.</p>

<h3>Why a spreadsheet? Why estimated hours?</h3>
<p>I chose to use a spreadsheet and this method of estimated vs real hours to address measurement of actual execution against estimated and provide an ability and data to re-estimate tasks as time progressed.</p>

<h3>Can I have your spreadsheet?</h3>
<p>Below is a link for the sample workbook I put together for the images in this post. Being an example, it hasn't actually gone through the process of being used, revised, marked up, etc like the actual one I use. </p>

<p><a href="http://tiernok.com/LTDBlog/process/SampleWorkbook.xlsx" title="Download sample workbook">Download the workbook</a></p>

<p>It has no instructions, no notes, and is in XLSX format. </p>

<h3>Why such small tasks?</h3>
<p>Why did I break down the features at all? They're only a few days worth of work, couldn't I have just used those?</p>

<p>Well yes and no. By going with smaller tasks I can usually move one or two tasks from doing to done in any given day, which feeds back into my feelings of productivity and such. Smaller tasks also help me find out I've gone off the rails sooner or that I missed something critical. Additionally, smaller tasks are easier to move around, if I intend to do task 1A-1C but a bug comes in, I can wrap up my work on 1A, do the bug, then come back to 1B with a much lower task switching cost then if I was switching inside feature 1. </p>

<p>Small tasks also feed back into estimates, force us to evaluate the features more deeply, bring future issues to the surface early enough that we can start asking questions before we get to do-or-die time, etc.</p>

<h3>Seriously, Sticky Notes?</h3>
<p>I chose the visual board for several reasons. The first is that seeing the work flow across the board helps give me a sense of accomplishment. Good morale and a sense of accomplishment help keep me from getting bogged down or feeling like I'm not making progress. The visual board also gave me a way to see the level of revisions that were occurring and the impact they were having as the iteration progressed.</p>

<p>The final advantage was that the board reduced the time it took me to switch tasks, at any time I could glance at the board and see what I was working on last, what I would likely be working on next, etc. When I go into work after a 3 day weekend, it will take me longer to boot up my computer than to determine what I was working on. I also have a visual of how many tasks I am trying to work on simultaneously, and that causes me to try and limit that number, reducing task switching. In Lean terms, I have reduced my changeover time, some of the waste involved in those changeovers, and the number of changeovers that occur (splitting releases into features into smaller tasks also reduced my batch size).</p>

<h3>What's Missing?</h3>
<p>The only challenges that my process did not address were a method to limit the risk of working on live software without a safety net (other than manual testing). I did address this, but that's probably for another post.</p>

<h2>Wrapping Up</h2>
<p>The most critical part of creating a process is to know why your creating it. Without a focus, without knowing the goals and risks, you run the risk of creating something that costs more than it solves. Like programming or any other skill, selecting and building a good process is easier the more you do it. Pay attention not just to what does work, but also to what doesn't. My process is not perfect and it will have failures, I intend to learn from them. But I'm also learning from the processes I see others following. </p>

<p>If you are interested, here are some random links on related topics (plenty more in my <a href="http://www.delicious.com/tarwn" title="Eli's bookmarks on Delicious">Delicious bookmarks</a>).</p>
<ul>
<li><a href="http://kosmothink.com/2010/12/31/the-uncertainty-principal-or-how-to-choose-the-right-methodology/" title="The Uncertainty Principle OR How to Choose the Right Methodology - Kosmothink">The Uncertainty Principle OR How to Choose the Right Methodology - Kosmothink</a></li>
<li><a href="http://www.projectsmart.co.uk/waterfall-v-agile-how-should-i-approach-my-software-development-project.html" title="Waterfall v Agile: How Should I Approach My Software Development Project?">Waterfall v Agile: How Should I Approach My Software Development Project?</a></li>
<li><a href="http://lisamdrake.wordpress.com/2011/05/28/time-boxing-strategies-to-help-you-get-things-done-in-your-project/" title="Time Boxing Strategies to Help You Get Things Done in Your Project">Time Boxing Strategies to Help You Get Things Done in Your Project</a></li>
<li><a href="http://www.jessefewell.com/2009/12/20/methodology-doesnt-matter/" title="Methodology Doesn&#8217;t Matter">Methodology Doesn&#8217;t Matter</a></li>
<li><a href="http://www.xqa.com.ar/visualmanagement/2009/02/visual-management-for-agile-teams/" title="Visual Management for Agile Teams">Visual Management for Agile Teams</a></li>
</ul><div class="item_footer"><p><small><a href="http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/building-a-lightweight-project-management-process">Original post</a> blogged on <a href="http://lessthandot.com/">LessThanDot</a>.</small></p></div>]]></content:encoded>
								<comments>http://blogs.lessthandot.com/index.php/ITProfessionals/ProjectManagement/building-a-lightweight-project-management-process#comments</comments>
			<wfw:commentRss>http://blogs.lessthandot.com/index.php/ITProfessionals/?tempskin=_rss2&#38;disp=comments&#38;p=1325</wfw:commentRss>
		</item>
			</channel>
</rss>
