<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CUQER3o4eSp7ImA9WhRaFEk.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659</id><updated>2012-02-16T17:48:26.431-08:00</updated><category term="quality assurance" /><category term="Team Foundation Server" /><category term="emacs" /><category term="agile" /><category term="sql" /><category term="clojure" /><category term="consulting" /><category term="common sense" /><category term="programming" /><category term="Teams" /><category term="Libertarianism" /><category term="Build" /><category term="open source" /><title>Coding Libertarian</title><subtitle type="html">Steve Moyer's thoughts on creating software for remuneration and finding the freedom to do it.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CodingLibertarian" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="codinglibertarian" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CU8ARncyfCp7ImA9WhRVEkw.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-2384524308317685591</id><published>2012-01-10T08:43:00.000-08:00</published><updated>2012-01-10T08:44:07.994-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T08:44:07.994-08:00</app:edited><title>What are your favorite tech talks of 2011?</title><content type="html">I'm looking for some tech talks to watch with coworkers over lunch. I'm hoping the community will help out by pointing some interesting talks they've seen in the past year.  Since Thoughtworks' blog aggregator is hopelessly broken please use this &lt;a href="http://blog.stevemoyer.net/2012/01/what-are-your-favorite-tech-talks-of.html"&gt;link&lt;/a&gt; to make suggestions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-2384524308317685591?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/yNOlrPlZDEA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/2384524308317685591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=2384524308317685591" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2384524308317685591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2384524308317685591?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2012/01/what-are-your-favorite-tech-talks-of.html" title="What are your favorite tech talks of 2011?" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkABRHg-eip7ImA9WhRWFUo.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-7464632715337205453</id><published>2012-01-02T22:05:00.000-08:00</published><updated>2012-01-02T22:05:55.652-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T22:05:55.652-08:00</app:edited><title>Asynchronous Pair Programming(Duet Programming?)</title><content type="html">Over the last few weeks of 2011 I've been playing around with Vim and Rails.  I know many people are pairing using Vim.  I also know people are using Vim and screen along with some sort of voice chat to pair remotely. One of the limitations(and strengths) of pairing is that both users are working in the same session.  Only one person can be typing/browsing/whatever at a time.  This can be good when you're writing code but tends to suck when you're doing research (on the web or in the code base). 
&lt;br/&gt;&lt;br/&gt; 
Introducing screen to the mix has the ability to break this dependency on a single session.  Each member of the pair can have their own instance of vim in half of a split terminal. Everything that is happening in the screen terminal is still visible to each member of the pair but they have the ability to be active at the same time in separate "windows" of the screen session.  Can you write the next failing test while I extract this method? Can you look up what parameters the method I'm about to call expects?
&lt;br/&gt;&lt;br/&gt;
It's quite possible this practice is widespread and I just haven't seen it in my little corner of the .Net world.  Are people already using screen this way?  If so, how is it working out?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-7464632715337205453?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/0ITO4n6Iex4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/7464632715337205453/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=7464632715337205453" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7464632715337205453?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7464632715337205453?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2012/01/asynchronous-pair-programmingduet.html" title="Asynchronous Pair Programming(Duet Programming?)" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;A08CRHo9fSp7ImA9WhRTFk4.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-4852164171174100947</id><published>2011-11-06T20:20:00.000-08:00</published><updated>2011-11-06T20:24:25.465-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T20:24:25.465-08:00</app:edited><title>Basic A/B testing in .net (with nToggle)</title><content type="html">In order to add the most basic support for A/B testing to &lt;a href="https://github.com/SteveMoyer/nToggle"&gt;nToggle&lt;/a&gt;&amp;nbsp;I have added the ability to specify your own custom repository for the status of a toggle. &amp;nbsp;By implementing a custom repository we can write code to determine which version of a feature a given user of the applicaiton should see.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Example:(If you aren't seeing the embedded code, click through to the full post.)&lt;/b&gt;
&lt;br /&gt;
&amp;nbsp; In my application I have a drop down list for selecting models of cars. &amp;nbsp;The number of items in this list is large and I am going to replace it with an auto-complete textbox which I think will create a better user experience. I think this change could have a large impact on users of the application so I'm only going to release it to power users to get feedback.  Everyone else will continue to see the old version of the application. 
&lt;br /&gt;
&lt;br /&gt;
First I wrap the new and old code in a web feature toggle:
&lt;script src="https://gist.github.com/1344145.js?file=CarModelDropDownMarkup.aspx"&gt;
&lt;/script&gt;
&lt;br /&gt;
&lt;br /&gt;
Second I add the new toggle to my web.config:
&lt;script src="https://gist.github.com/1344151.js?file=CarModel.xml"&gt;&lt;/script&gt;
 Notice that my new toggle has a property on it called "repository".  This tells nToggle where to look for the status of this toggle.  
&lt;br /&gt;
&lt;br /&gt;
The last step is implementing a repository which will determine if the current user is a power user:
&lt;script src="https://gist.github.com/1344158.js?file=PowerUserToggleRepository.cs"&gt;&lt;/script&gt;
&lt;br/&gt;
&lt;br/&gt;
That's all there is to it.  In just a few lines of configuration and code we have created a very simple A/B test of a new feature.  &lt;b&gt;Disclaimer:&lt;/b&gt;  This method is intended for short term use during development and transition.  Feature toggles should be short lived and I recommend removing them(and the branches you have created in your code) as soon as reasonable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-4852164171174100947?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/FlUWbcdtHiE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/4852164171174100947/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=4852164171174100947" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4852164171174100947?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4852164171174100947?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/11/basic-ab-testing-in-net-with-ntoggle.html" title="Basic A/B testing in .net (with nToggle)" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk4BQn8-fSp7ImA9WhdVFE0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-5334675957169807540</id><published>2011-09-18T21:02:00.000-07:00</published><updated>2011-09-18T21:02:33.155-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T21:02:33.155-07:00</app:edited><title>Distributed Check-in Tokens: Pass-The-Puppy</title><content type="html">On many software development teams there is a section of code or some development artifacts which will collide if two people/pairs check in at the same time. &amp;nbsp;In order to stop this from happening many teams adopt a check in token. &amp;nbsp;Only the people who have the token can check in the given resource.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
On my current team we have two such resources: &amp;nbsp;&lt;a href="http://dbdeploy.com/software/net/"&gt;our numbered database migration scripts&lt;/a&gt; (which will fail if any two have the same number) and our &lt;a href="http://blog.stevemoyer.net/2011/03/ndump-managing-development-and-test.html"&gt;functional test data csv files&lt;/a&gt;. &amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Mi4d7SwD8Ls/Tna4B3EdDgI/AAAAAAAAAu0/23VjrsvYLjI/s1600/puppy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-Mi4d7SwD8Ls/Tna4B3EdDgI/AAAAAAAAAu0/23VjrsvYLjI/s320/puppy.jpg" width="285" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Co-located teams can use a stuffed animal(like ours above) or some other physical token. &amp;nbsp; For distributed teams a physical token is not an option.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To enable all of our team members to use the tokens I created a rails app I call &lt;a href="https://github.com/SteveMoyer/pass_the_puppy"&gt;pass-the-puppy&lt;/a&gt;. This app is simple and low volume, so a free &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; account is sufficient to host it for the team. &amp;nbsp;Any team which needs &amp;nbsp;a set token can clone&amp;nbsp;&lt;a href="https://github.com/SteveMoyer/pass_the_puppy"&gt;the app&lt;/a&gt; from &lt;a href="https://github.com/"&gt;github&lt;/a&gt; and create their own Heroku app. &amp;nbsp;&lt;a href="http://pass-the-puppy.heroku.com/"&gt;Sample application&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As a rails novice I was quite happy to discover how easy it was to deploy an app to Heroku. &amp;nbsp;Warning, it's not aesthetically pleasing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-5334675957169807540?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/NKBdpq0DiEs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/5334675957169807540/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=5334675957169807540" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5334675957169807540?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5334675957169807540?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/09/distributed-check-in-tokens-pass-puppy.html" title="Distributed Check-in Tokens: Pass-The-Puppy" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Mi4d7SwD8Ls/Tna4B3EdDgI/AAAAAAAAAu0/23VjrsvYLjI/s72-c/puppy.jpg" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEUBRX09fyp7ImA9WhZQGUo.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-1247542415785013953</id><published>2011-04-27T20:36:00.000-07:00</published><updated>2011-04-27T23:30:54.367-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-27T23:30:54.367-07:00</app:edited><title>Numbing the pain isn't necessarily good</title><content type="html">&lt;p&gt;A few months ago I bought a pair of &lt;a href="http://www.vibramfivefingers.com/index.htm"&gt;Vibram Five Fingers&lt;/a&gt; shoes. &amp;nbsp;When I first started wearing them I realized my normal tennis/running shoes had been hiding a few things from me. &amp;nbsp;The standard way I run/walk is on my heel. &amp;nbsp;This means that I'm limiting the ability of my foot to absorb some of the impact of taking a step. This causes more of the impact to go directly onto my heel and up my leg. &amp;nbsp;Also my Plantar Fascia were very very tight. &amp;nbsp;This is important feedback that I wasn't getting.&lt;/p&gt;&lt;p&gt;When I had pain from running, I'd take Aleve to temper the pain and swelling, and continue to run the same way. &amp;nbsp;Eventually the stress lead to more significant problems that weren't so easy to ignore. &amp;nbsp; By changing the way I step I'm able to eliminate a major contributor to the pain. &amp;nbsp;At first the change is hard. &amp;nbsp;I was sore for a while from using a new set of muscles. &amp;nbsp;It took focus to not fall back into the old step pattern.&lt;/p&gt;&lt;p&gt;Now that I'm adjusted, my calf muscles and plantar fascia are much more flexible. My calves haven't cramped in months. &amp;nbsp;I'm able to comfortably walk barefoot on previously painful surfaces(stepping down on a rock in the street with your heel is not fun).&lt;/p&gt;&lt;p&gt;As usual, I'm only mentioning my Five Fingers experience as a metaphor for software development.&lt;/p&gt;&lt;p&gt;If you are developing an application and bugs keep popping up all over the place, you &lt;strong&gt;can&lt;/strong&gt; just just fix the bug and keep on going adding and changing code. &amp;nbsp;Eventually you'll spend the vast majority or your time poking and proding and trying to get the system almost stable. &amp;nbsp;You'll be afraid to make any changes. Another alternative is that you can start writing tests. &amp;nbsp;Start with a test for that bug. &amp;nbsp;Writing tests will be painful at first. &amp;nbsp;You'll be exposing all of your bad habits. &amp;nbsp;Your code will be difficult to test. &amp;nbsp;As you write more and more tests you'll be able to start to clean up that code. &amp;nbsp;You'll begin to gain the confidence that you can make changes and add features without introducing a bunch of new bugs.&lt;/p&gt;&lt;p&gt;If your release cycle is six months and the releases never seem to go as planned, you&lt;strong&gt; can&lt;/strong&gt; add more time for manual regression or release only every year. &amp;nbsp;"It's a painful 3 months but it only happens once a year", you'll say. &amp;nbsp;Alternatively you can decide you want to release every month or every week or every commit. &amp;nbsp;You can automate all of the steps to release. &amp;nbsp;You can write system tests that give you confidence that you haven't missed deploying a stored procedure or changing permissions on that directory.  You'll have some of the same pain but if you're writing tests it'll be pain in smaller and smaller amounts.  When you test a release after every commit and run tests against it, you'll know immediately if you forgot to add that new step to the deployment&lt;/p&gt;&lt;p&gt;Usually, when there is pain, there are causes of the pain. &amp;nbsp;While you might need to numb the pain you'd better make sure you remove the cause of the pain as well. &amp;nbsp;Start fixing the cause first and numb only if you still need to. Stop numbing the pain as soon as possible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-1247542415785013953?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/exQBU0eeRoU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/1247542415785013953/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=1247542415785013953" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/1247542415785013953?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/1247542415785013953?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/04/numbing-pain-isn-necessarily-good.html" title="Numbing the pain isn&amp;#39;t necessarily good" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEUDSH8-eip7ImA9WhZQGUo.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-4267721866315874456</id><published>2011-04-27T20:35:00.000-07:00</published><updated>2011-04-27T23:31:19.152-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-27T23:31:19.152-07:00</app:edited><title>Usage is not a substitute for tests</title><content type="html">&lt;p&gt;Some months ago I encountered a large Sql Server database which was not particularly well understood and didn't have a test data set. In order to develop a test data set I decided to use a tool(the precursor to &lt;a href="http://blog.stevemoyer.net/2011/03/ndump-managing-development-and-test.html" title="nDump"&gt;nDump&lt;/a&gt;) which I had slapped together in about an hour in late 2009. The tool, though primitive, was already working reasonably well at importing CSV. It had no tests, unit or otherwise. All it had in the way of testing was my manual inspection of the application which consumed the database to verify that it was working correctly.&lt;/p&gt;&lt;p&gt;As I used the tool to understand and generate data for the Sql Server database I realized that the tool was buggy and lacking features. I decided to refactor and extend it. Because I was focused not on the tool but on the data set for the application, I continued to make changes and add features without adding tests. I did make an attempt to reasonably factor the new code in a similar manner to how I would if I had been writing tests. Not writing tests at that time was a mistake.&lt;/p&gt;&lt;p&gt;Later in the development I realized this and went back to add tests.  How well had I done at writing testable code?  Not all that well. Much of the code was easily testable but there were more than a few places where files were being created directly or concrete instances were being new-ed up in the middle of a method doing other work.  It certainly takes much more effort to tease the dependencies out and add the tests after the fact.  Hopefully this post will serve as a reminder to keep me from making the same mistake again.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-4267721866315874456?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/a71ugORI148" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/4267721866315874456/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=4267721866315874456" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4267721866315874456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4267721866315874456?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/04/usage-is-not-substitute-for-tests.html" title="Usage is not a substitute for tests" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0IAQ30_fSp7ImA9Wx9aFUo.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-929793838416538784</id><published>2011-03-08T00:05:00.000-08:00</published><updated>2011-03-08T00:05:42.345-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-08T00:05:42.345-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><title>Breaking Down Unruly Databases: The Problem</title><content type="html">In my &lt;a href="http://blog.stevemoyer.net/2011/03/ndump-managing-development-and-test.html"&gt;last post&lt;/a&gt; on &lt;a href="https://github.com/SteveMoyer/nDump/wiki"&gt;nDump &lt;/a&gt;I talked about a tool I've created to import and export data from MS SQL Server databases. &amp;nbsp;In this post I want to lay out some of my motivation for doing so.&lt;br /&gt;
&lt;br /&gt;
Often when starting at a new client we arrive to find a legacy database/databases which seem nearly incomprehensible.  Development and CI often run against a shared databases which are backups of production.  The state of the data is in a constant flux. &amp;nbsp;If someone desires to run a local database, restoring at least a few gigs of database backups is required.  One reason this is necessary is that the database(s) can't easily be recreated from scripts.  This is relatively easy to get around by breaking creation scripts into parts and employing tools such as &lt;a href="http://dbdeploy.com/"&gt;DBDeploy&lt;/a&gt; to run them in order.&lt;br /&gt;
&lt;br /&gt;
Once the problem of creating an empty database is tackled, nobody seems to have the requisite knowledge to populate it with the basic data necessary to run the application.  There are many problems that spring from a lack of the ability to create minimal data sets: &lt;br /&gt;
&lt;div&gt;&lt;ol&gt;&lt;li&gt;Returning to a known data set is time consuming, requiring  restoring a large backup.&lt;/li&gt;
&lt;li&gt;The development and functional test data sets can't be easily version-ed.  While you can check in a backup, there is no reasonable way to diff it against a previous version.&lt;/li&gt;
&lt;li&gt;Functional tests are often brittle as they rely upon the state of the data which tends to be rather inconsistent.&lt;/li&gt;
&lt;li&gt;Finding data requires searching through a large data set.&lt;/li&gt;
&lt;li&gt;Deciphering incremental changes to the state of the data  is no small challenge.&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;On past projects, the teams have stored development and test data sets as groups of csv or XML files.  Both of these files can be easily version-ed, diff-ed, and modified using excel or open office.  I prefer csv files as they are more concise and contain a lot less noise.&amp;nbsp; Once you have these file sets and the requisite knowledge of the database structure it's relatively pleasant to work with them to maintain known state(s) of the data. By running the database build and load in a CI build we can continually verify that we know how to build a database. Using the populated database we can confirm that our functional tests of the application(s) are still working against a consistent data set. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-929793838416538784?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/4EaalDhxApU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/929793838416538784/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=929793838416538784" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/929793838416538784?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/929793838416538784?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/03/breaking-down-unruly-databases-problem.html" title="Breaking Down Unruly Databases: The Problem" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkYMRH87eip7ImA9Wx9aFUs.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-4658763232873504918</id><published>2011-03-06T16:29:00.001-08:00</published><updated>2011-03-07T23:09:45.102-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-07T23:09:45.102-08:00</app:edited><title>nDump: Managing development and test data sets for MS SQL Server</title><content type="html">&lt;div&gt;I've created a small tool called &lt;a href="https://github.com/SteveMoyer/nDump/wiki"&gt;nDump&lt;/a&gt; which I've been using to help me gain understanding of and manage data sets for complicated(legacy?) MS Sql Server databases. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span"&gt;What does it do?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Apply filtering select statements to MSSQL data tables in a source database&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;&lt;div&gt;By writing select statements to return a small(as small as reasonable) related set of data you force yourself to understand the database while you create a minimal data set.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Save the filtered data to CSV files&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;By saving the selected data to CSV files it can be easily version-ed and diff-ed.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Convert and save the CSV files to SQL script files&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Prepare them to be inserted into another database.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Delete the data from the tables in a target database&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Verifies that you have correctly ordered the tables for deletion.  Returns the database to a relatively known starting state.  &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Apply the SQL script files to the target database&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Ensures that the selected data can be reinserted into the database.  Allows you to run your application against only the data in your set.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Minimal data set generated&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt; &lt;/b&gt;&lt;/div&gt;&lt;div&gt;Once we have a minimal set of data, a somewhat better understanding of the database, and the application running on this data set there are many things we can do:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Add more data to set by editing the csv files in excel or open office.&lt;/li&gt;
&lt;li&gt;Add more data through the application and use nDump to export it without filters.&lt;/li&gt;
&lt;li&gt;Restore the database to this set of data at any time.  &lt;/li&gt;
&lt;li&gt;Run functional tests off this consistent data set.&lt;/li&gt;
&lt;li&gt;Develop in database isolation without having to restore huge databases.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-4658763232873504918?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/jwdUqxYNVo0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/4658763232873504918/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=4658763232873504918" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4658763232873504918?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4658763232873504918?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/03/ndump-managing-development-and-test.html" title="nDump: Managing development and test data sets for MS SQL Server" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUGRnczeCp7ImA9Wx9aE0s.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-4405842056677703277</id><published>2011-03-05T15:05:00.000-08:00</published><updated>2011-03-05T15:37:07.980-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-05T15:37:07.980-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Feature Toggles for .net: nToggle</title><content type="html">Late last year my team and I helped a client to decide against &lt;a href="http://martinfowler.com/bliki/FeatureBranch.html"&gt;Feature Branching&lt;/a&gt; in favor of &lt;a href="http://martinfowler.com/bliki/FeatureToggle.html"&gt;Feature Toggles&lt;/a&gt;.  After making this decision we realized that there didn't seem to be an implementation available for the .net platform so &lt;a href="https://github.com/SteveMoyer/nToggle"&gt;nToggle&lt;/a&gt; was born.  Usage is simple and there isn't a whole lot to it.&lt;br/&gt;
&lt;br/&gt;
Let's suppose we have a new feature, BlogComments, that we want to toggle. 
Configure your new toggle as on or off in the project's Web.config file.
&lt;br/&gt;
&lt;script type="syntaxhighlighter" class="brush: xml"&gt;&lt;![CDATA[  
&lt;configuration&gt;
  &lt;appSettings&gt;
 &lt;add key="BlogComments" value="False"/&gt;
  &lt;/appSettings&gt;
 ...
&lt;/configuration&gt;
]]&gt;&lt;/script&gt;
&lt;br/&gt;
&lt;br/&gt;
Add a WebFeatureToggle around the new feature in  Asp.net WebForms.

&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[  
&lt;%@ Register assembly="nToggle" namespace="nToggle" tagprefix="nToggle" %&gt;
&lt;nToggle:WebFeatureToggle ID="WebFeatureToggle1" EnabledBy="BlogComments" runat="server" &gt;
 &lt;span id="enabledby"&gt;Blog Comments implementation goes here&lt;/span&gt;
&lt;/nToggle:WebFeatureToggle&gt;
]]&gt;&lt;/script&gt;
&lt;br/&gt;
If you have Web Form elements which should not show up when the feature is enabled you can toggle them too using the RemovedBy attribute
&lt;script type="syntaxhighlighter" class="brush: html"&gt;&lt;![CDATA[  
&lt;%@ Register assembly="nToggle" namespace="nToggle" tagprefix="nToggle" %&gt;
&lt;nToggle:WebFeatureToggle ID="WebFeatureToggle2" RemovedBy="BlogComments"  runat="server" &gt;
 &lt;span id="removedby"&gt;Old feature replaced by Blog Comments&lt;/span&gt;
&lt;/nToggle:WebFeatureToggle&gt;
]]&gt;&lt;/script&gt;
&lt;br/&gt;

Code in a code behind that should be toggled can use the WebFeatureToggle as well.
&lt;script type="syntaxhighlighter" class="brush: csharp"&gt;&lt;![CDATA[  
protected void Page_Load(object sender, EventArgs e)
  {
   WebFeatureToggle1.RunActionWhenDisabled(CodeToRunIfDisabled);
   WebFeatureToggle1.RunActionWhenEnabled(CodeToRunIfEnabled);
  }
  protected void CodeToRunIfDisabled()
  {
  //your code
  }
  protected void CodeToRunIfEnabled()
  {
  //your code
  }
]]&gt;&lt;/script&gt;
&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-4405842056677703277?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/WX2ircrxXlU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/4405842056677703277/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=4405842056677703277" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4405842056677703277?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/4405842056677703277?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2011/03/feature-toggles-for-net-ntoggle.html" title="Feature Toggles for .net: nToggle" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkEMQ388cCp7ImA9Wx9QF0U.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-308165676235311888</id><published>2010-12-30T23:31:00.001-08:00</published><updated>2010-12-30T23:31:22.178-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-30T23:31:22.178-08:00</app:edited><title>The Curious Task of Agile</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt; This &lt;a href='http://cafehayek.com/2010/12/hayek-poster-contest-winner.html'&gt;poster contest&lt;/a&gt; over at &lt;a href='http://cafehayek.com/'&gt;CAFE HAYEK&lt;/a&gt; reminded me of one of my favorite economics quotes:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;"The curious task of economics is to illustrate to men how little they really know about what they imagine they can design." - F.A Hayek&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Simply replacing "economics" with "agile" I think the quote is equally valid:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The curious task of agile is to illustrate to men how little they really know about what they imagine they can design.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Software development suffers from many of the same problems as economic planning: complexity, lack of information, changing preferences, and unintended consequences. As with economies, when we attempt top down planning of software or attempt to plan it in detail in advance we almost always end up with a poor result. When developing software we strive for emergent design which parallels the economic concept of spontaneous order. &lt;/p&gt;&lt;p/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-308165676235311888?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/QMxGRjVTyjs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/308165676235311888/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=308165676235311888" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/308165676235311888?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/308165676235311888?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/12/curious-task-of-agile.html" title="The Curious Task of Agile" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk4DSHo5cCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-7129643217195411343</id><published>2010-08-09T22:20:00.001-07:00</published><updated>2010-08-10T22:36:19.428-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:36:19.428-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="common sense" /><title>Freeway Driving</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;As a software developer it amazes me how many software developers simply go on doing what they've been doing without making any attempt to grow or improve. At some point I hop in the car and begin the drive home. It doesn't take too long before I realize that it's not just developers. Many people can't be bothered to pay any attention to what they are doing in any setting. How many times during each trip do I come up behind someone in the fast lane (or carpool lane) going 10-20 miles per hour slower than majority of the traffic on the freeway. It's at this point that I begin to wonder why they are doing what they are doing. This list usually amounts to something like the following:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;They think it's ok because they are going the posted speed limit (or within some miles per hour of it)&lt;/li&gt;&lt;li&gt;They can't stand the thought of anyone going faster than them.&lt;/li&gt;&lt;li&gt;They're taking a moral stand against those going over the posted speed limit.&lt;/li&gt;&lt;li&gt;They like the far left lanes because there is never anyone close in front of them.&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;As I get down the list, I realize that while there are some people who may identify with the reasons above, the majority of these people are likely just not paying any attention. They get on the freeway, merge over to the fast lane(s), and completely check out. They don't notice the large line of cars piling up behind then. They don't notice the frustrated people who resort to passing them in the slower lanes (at worst having to pass 2 or 3 lanes over). They've probably been driving many years and at no point have they noticed any of these things happening.&lt;/p&gt;&lt;p&gt;While I'm often happy to ridicule and mock them as we drive along, what I'd really like to do is lay it out for them:&lt;/p&gt;&lt;p&gt;&lt;span style=' font-size:large;'&gt;&lt;strong&gt;You are creating traffic&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As the cars pile up behind you the amount of congestion is increasing. Two cars driving slowly in the wrong lanes can just about block the entire freeway. Everyone else will be delayed because of you.&lt;/p&gt;&lt;p&gt;&lt;span style=' font-size:large;'&gt;&lt;strong&gt;You aren't gaining anything&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;If you just move a few lanes over you can still go the same speed without blocking anyone.&lt;/p&gt;&lt;p&gt;&lt;span style=' font-size:large;'&gt;&lt;strong&gt;You are creating a traffic hazard&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;As cars rapidly approach from behind you they find themselves with the choice to either pass on the slow side or sit in congestion behind you. In either case you are causing the freeway to be less safe than it should be.&lt;/p&gt;&lt;p&gt;&lt;span style=' font-size:large;'&gt;&lt;strong&gt;Here are a few simple easy to follow rules&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;If you can't talk and drive at the same time you either a) don't talk or b) don't drive. Take your pick.&lt;/li&gt;&lt;li&gt;You should drive in the slowest lane that can contain your speed.&lt;/li&gt;&lt;li&gt;Should the need to pass arise you need to pass in a reasonable fashion. Speed up at least 5 miles per hour faster than the person you are passing. After completing the pass move back to the prior lane if it's safe to do so. If you can't pass at a difference of at least 5 miles per hour than you should slow down and stay behind the car until there is a point when you can.&lt;/li&gt;&lt;li&gt;If you aren't going faster than the regular traffic in the fast lanes you have absolutely no business in the carpool lane&lt;/li&gt;&lt;li&gt;If all of the lanes on the freeway are going a pace that is uncomfortable for you, perhaps you would be more comfortable on surface streets.&lt;/li&gt;&lt;li&gt;It is your job as a driver to know how many cars are in front of you and how far away they are, how many cars are behind you and how far away they are, what the pace of traffic is in the lanes to either side of you. If you don't know these things you are an unsafe driver. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=' font-size:large;'&gt;&lt;strong&gt;So, what's the point?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I'm sure that's more than enough of me ranting about oblivious freeway drivers. The same thing applies to software developers (and other team members). You may not be the best or fastest at what you do but it is your job to keep up with what other people are doing to be better and or faster. I'd hope that you're also trying to figure out how you could be better and or faster. Even if you aren't, the one thing you should make sure you aren't doing is holding back others or possibly even the entire team. One or two people clogging up the works is often enough to stall or seriously slow down even the most productive team. &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-7129643217195411343?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/kR5QyAIfZR8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/7129643217195411343/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=7129643217195411343" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7129643217195411343?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7129643217195411343?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/08/freeway-driving.html" title="Freeway Driving" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Dk4HQXg-fCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-7264168201185885088</id><published>2010-08-06T00:36:00.003-07:00</published><updated>2010-08-10T22:35:30.654-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:35:30.654-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><title>Learning Emacs and Clojure</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;I've recently embarked on a journey to learn both Emacs and Clojure (on Ubuntu). I've made some progress learning the basics of clojure and the basics of emacs but I've struggled with getting a development flow going. &lt;/p&gt;&lt;p&gt;I'm going to try and document what I've learned and am learning. I'd appreciate any helpful hints, tips, or comments that people have. &lt;strong&gt; While writing this post I stumbled on &lt;/strong&gt;&lt;a href='http://lifeofaprogrammergeek.blogspot.com/2009/03/learning-clojure-and-emacs.html'&gt;&lt;strong&gt;Curran's blog&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; which has most of what I wanted to capture and &lt;/strong&gt;&lt;a href='http://lifeofaprogrammergeek.blogspot.com/2008/06/hello.htmlblogspot.com/'&gt;&lt;strong&gt;a lot more&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.  &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Emacs Installation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I'm not sure it's the best way to do it but I installed emacs 23 from the from the ubuntu package manager and followed Bradford Cross's emacs &lt;a href='http://measuringmeasures.blogspot.com/2010/01/my-new-clojure-emacs-setup.html'&gt;setup steps&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I recently watched this &lt;a href='http://www.vimeo.com/1013263'&gt;screencast&lt;/a&gt; by Stuart Halloway (thanks to &lt;a href='http://twitter.com/timwee'&gt;Tim Wee&lt;/a&gt;) and enabled ido.el by following the instructions on &lt;a href='http://www.emacswiki.org/emacs/InteractivelyDoThings'&gt;emacswiki&lt;/a&gt;. I strongly prefer the file selection with ido.el to the default behavior.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Clojure installation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I also started off installing clojure from the package manager as well but I soon started using the &lt;a title='lein' href='http://github.com/technomancy/leiningen'&gt;leiningen&lt;/a&gt; build tool for clojure. Leinigen makes things pretty easy and manages your dependencies and classpath.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Using Leiningen&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;(With the lein file in the current directory or on the path&lt;/p&gt;&lt;p&gt;Starting a new project:&lt;/p&gt;&lt;p&gt;&lt;em&gt;lein new &amp;lt;project name&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;cp lein &amp;lt;projectname&amp;gt;/&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;cd &lt;/em&gt;&lt;em&gt;&amp;lt;projectname&amp;gt;/&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Download Dependencies:&lt;/p&gt;&lt;p&gt;&lt;em&gt;lein deps&lt;/em&gt;&lt;/p&gt;&lt;p&gt;start a repl for the project:&lt;/p&gt;&lt;p&gt;&lt;em&gt;lein repl&lt;/em&gt;&lt;/p&gt;&lt;p&gt;starting a swank server:&lt;/p&gt;&lt;p&gt;&lt;em&gt;lein swank&lt;/em&gt;&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;strong&gt;TDD Flow&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I've only recently started to get any flow when coding. I'm hoping people can give me some tips to make this more effective.&lt;/p&gt;&lt;p&gt;To get set up I run through a set of steps&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Open a terminal window and start emacs in the terminal. &lt;/li&gt;&lt;li&gt;Open another terminal tab(ctrl-shift-t) and navigate to the project directory.&lt;/li&gt;&lt;li&gt;If the project is not new skip to step 6.&lt;/li&gt;&lt;li&gt;Add the following to the generated project.clj file to enable lein swank:&lt;br/&gt;:dev-dependencies [&lt;br/&gt;[swank-clojure "1.1.0"]&lt;br/&gt;[leiningen/lein-swank "1.1.0"]&lt;br/&gt;]&lt;/li&gt;&lt;li&gt;Run &lt;code&gt;&lt;em&gt;lein deps&lt;/em&gt;&lt;/code&gt; to download dependencies&lt;/li&gt;&lt;li&gt;Run &lt;em&gt;lein swank&lt;/em&gt; to start the swank server&lt;/li&gt;&lt;li&gt;Switch back to the emacs tab (ctrl-page up)&lt;/li&gt;&lt;li&gt;I have a widescreen monitor rotated to profile so I normally split screen horizontally (C-x, 2)&lt;/li&gt;&lt;li&gt;Start the swank server in one window (M-x slime-connect)&lt;/li&gt;&lt;li&gt;Switch to the other window (C-x, o)&lt;/li&gt;&lt;li&gt;Open clojure test file (C-x, C-f, select file)&lt;/li&gt;&lt;li&gt;Add/edit test&lt;/li&gt;&lt;li&gt;Save test file (C-x, C-s)&lt;/li&gt;&lt;li&gt;"Load the file" to update the state of the repl (C-c, C-l)&lt;/li&gt;&lt;li&gt;Switch to the slime repl (C-x, o to switch to the other window)&lt;/li&gt;&lt;li&gt;Make test fail by executing the unit tests in the repl: (clojure.test/run-tests 'sample.namespace-of-tests) or to run all tests: (clojure.test/run-all-tests)&lt;/li&gt;&lt;li&gt;Implement code to make test pass. &lt;/li&gt;&lt;li&gt;Run tests and watch them pass&lt;/li&gt;&lt;/ol&gt;&lt;p/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-7264168201185885088?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/4DqRqsr79vU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/7264168201185885088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=7264168201185885088" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7264168201185885088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7264168201185885088?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/08/learning-emacs-and-clojure.html" title="Learning Emacs and Clojure" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;Dk4FQn09eCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-9094647749051757931</id><published>2010-07-21T16:36:00.001-07:00</published><updated>2010-08-10T22:35:13.360-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:35:13.360-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="Team Foundation Server" /><category scheme="http://www.blogger.com/atom/ns#" term="Build" /><title>MicroSoft's Total Failure System (MS TFS)</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Let me apologize in advance for my exasperation,  I've been working with TFS.
&lt;br/&gt;
My coworker Jonathan McCracken was too nice to MS Team Foundation System in his &lt;a href="http://jonathanmccracken.blogspot.com/2010/07/mvp-microsoftfanboy.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+MyIdeationHasFoundAHome+%28My+Ideation+Has+Found+a+Home%29"&gt;MVP != MicrosoftFanBoy post&lt;/a&gt;.  Microsoft will tout that all of the tools are integrated.  I would argue that each of the "integrated" tools are pretty close to worst in their class.  I enjoy c# as a language but in general I want to use Visual Studio with ReSharper and then get as far away from the other MS tools as possible.  Disclaimer: I haven't used TFS 2010 but in my experience when something is this bad it may get a bit better but rarely will be completely transformed.
&lt;br/&gt;&lt;br/&gt;
&lt;big&gt;&lt;big&gt;&lt;b&gt;Version Control&lt;/b&gt;
&lt;/big&gt;&lt;/big&gt;&lt;br/&gt;
&lt;br/&gt;I agree with Jonathan's assessment that Subversion is a better choice for source control than Team Foundation Version Control(TFVC). I think SVN the gap is quite wide.  Let's say we want to use TFS for builds and project management but use SVN (or anything else) for version control.  To the best of my knowledge there is no way to integrate any other version control system with Team Build.
&lt;br/&gt;&lt;br/&gt;
Better Choices:  SVN, Git, and Hg.  All of which are free and open source.
&lt;br/&gt;&lt;br/&gt;
&lt;big&gt;&lt;big&gt;&lt;b&gt;Builds&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Build Configuration&lt;/b&gt;&lt;br/&gt;
Let's look at Team Build (appropriately abbreviated TB).  Of course
to use TB we need to be using TFVC so we'll assume we've made the
mistake of accepting that.
&lt;br/&gt;&lt;br/&gt;
TB requires you to name your build file TFSBuild.proj.  Upon kicking off a build it downloads the TFSBuild.proj file and rest of that folder's contents to a folder(BuildType) that is nested one level less deep than it's location in source control (TeamBuildTypes/MyBuildType).  Not a particularly big deal since the rest of my project won't be downloaded until after it attempts to load the .proj file.  Say you wanted to have some shared targets between multiple builds: So far as I can tell, you can't do it.  Your .proj file will only be able to use files in it's folder and we've already established that there can only be one project per build folder because it forces it to be named TFSBuild.proj.  All I want is for the build files to be co-located with the project and be flexible.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;
Build Status&lt;/b&gt;&lt;br/&gt;
I want every team member to be aware of the status of all builds that are relevant to them. TB is integrated with Visual Studio but the interface is awful.  There doesn't seem to be an easy way to see the current status of each build type without having to dig through a list of all builds by date.
&lt;br/&gt;&lt;br/&gt;
Build radiators such as a flat screen showing build status or red/green build light are great to have but unless everyone is consistently in view of them we  probably need a tray icon as well.  The only tray icon I could find would show green any time a build was running.  If you have 9 broken builds and one that was in the process of building the icon would show green!
&lt;br/&gt;&lt;br/&gt;
When a build fails on TB I almost always have to dig into a raw log to find the details as TB seems to have no intention of giving me the relevant information. Part of this is probably due to that fact that many of the unit tests were NUnit tests.
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;Local Builds&lt;/b&gt;
&lt;br/&gt;
In the past while using NAnt running a build before check-in on a developer machine has been a piece of cake.  With TB 2010 I've heard that the option is to shelve some changes and then queue up a private build.  This is still more complicated than just kicking of a build at the command line and will not work at all if disconnected.  Rather than embracing NAnt and NUnit and making sure they we're integrated they instead created MSBuild and MSTest to kill off NAnt and NUnit.
&lt;br/&gt;&lt;br/&gt;
Better free/open source choices:  Hudson, CC.net(when I last used it in 2005 probably more so now.)&lt;br/&gt;
Better Paid options:  Team City(free for small projects), Go(formerly Cruise)
&lt;br/&gt;&lt;br/&gt;
&lt;big&gt;&lt;big&gt;&lt;b&gt;Project Management&lt;/b&gt;&lt;/big&gt;&lt;/big&gt;
&lt;br/&gt;&lt;br/&gt;
I have minimal experience using the project management part of the suite.  This is due to the fact that almost all of the clients I've worked with have chosen not to use it, even those who seem to blindly take whatever MS gives them.
&lt;br/&gt;&lt;br/&gt;
Better Free Choices:  Anyone have suggestions here???&lt;br/&gt;
Better Paid Choices:  Mingle, Version One(last touched in 2005)
&lt;br/&gt;&lt;br/&gt;
&lt;span style="font-size:130%;"&gt;&lt;b&gt;Question &lt;/b&gt;&lt;/span&gt;&lt;br/&gt;
What would your preferred tool set be if you were starting a .net project today?
&lt;br/&gt;
Considerations: scalable to a large enterprise, easy to use, easy to integrate, easy to maintain,cost
&lt;br/&gt;&lt;br/&gt;
My default toolset would look something like:&lt;br/&gt;
Source Control: SVN or Git if the team is distributed&lt;br/&gt;
Development Environment: Visual Studio w/ ReSharper&lt;br/&gt;
Continuous Integration Server: Team City(free for small teams),  Hudson for larger teams or organizations&lt;br/&gt;
Build Scripting: NAnt&lt;br/&gt;
Unit Testing: NUnit&lt;br/&gt;
Project Management: Mingle(free for small projects),  ?? for larger projects&lt;br/&gt;
&lt;br/&gt;
Other than Visual Studio and ReSharper I've avoided anything with a price tag.  There are paid tools that I might prefer but for my default I don't want anyone to be able to kill the setup based on budget.
&lt;br/&gt;&lt;br/&gt;
I can have most of this set up on my local box in about 30 minutes or set up on a server for the team in a couple hours.
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-9094647749051757931?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/-gYBrJ8igMs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/9094647749051757931/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=9094647749051757931" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/9094647749051757931?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/9094647749051757931?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/07/microsofts-total-failure-system-ms-tfs.html" title="MicroSoft's Total Failure System (MS TFS)" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CEENRXc4eip7ImA9WxFSEEg.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-8438434055671691095</id><published>2010-04-11T23:05:00.001-07:00</published><updated>2010-04-11T23:11:34.932-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-11T23:11:34.932-07:00</app:edited><title>Sustainable Growth</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;After reading Ross Petit's interesting article on &lt;a href='http://www.rosspettit.com/2010/03/supplying-it-mercenaries.html'&gt;&lt;span class='PostTitle'&gt;Supplying IT Mercenaries&lt;/span&gt;&lt;/a&gt; it occurred to me that there is another reason that companies who try to focus on supplying wealth generators(as opposed to income generators) end up having resort to supplying mercenaries so frequently. Sell side firms often see growing the size of their forces as the key piece in increasing their wealth.  &lt;br/&gt;&lt;br/&gt;There is a limit to how fast you can effectively increase your forces before the structure becomes unweildy and begins to collapse upon itself.  New forces take resources and time to be appropriately integrated.  In good times highly growth oriented sell side firms attempt to grow as fast as possible.  Supplying inadequately aligned/integrated forces to wealth generating engagements tends to sour those engagements.  &lt;br/&gt; &lt;br/&gt;Because forces seem to be flying out the door, the structure to support these forces lags behind. When a down cycle comes this overgrowth and lagging infrastructure is exposed.  Given the high cost of adding forces, the company attempts to avoid removing forces at all costs. The misaligned forces make it difficult to avoid contraction with wealth generation, thus the company turns to supplying mercenaries.&lt;br/&gt;&lt;br/&gt;Given the other effects of supplying mercenary forces that  Ross mentions,  I think that sell side firms would be better off to focus on maximizing wealth generation from existing forces and growing at significantly slower than maximal rate.  While this will likely lower income at peak levels it should also make the troughs less deep.  If hiring and integrating new forces at a more manageable rate helps the firm to avoid mercenary work, this would also lower attrition.  It's possible with the lowered attrition that the firm might even grow at the same rate over the longer term with fewer bumps along the way.   &lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-8438434055671691095?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/bqzUQLPm5nY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/8438434055671691095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=8438434055671691095" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/8438434055671691095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/8438434055671691095?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/04/sustainable-growth.html" title="Sustainable Growth" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0IFRXY_eCp7ImA9WxFTGEk.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-2986921172735667535</id><published>2010-04-09T12:31:00.001-07:00</published><updated>2010-04-09T12:31:54.840-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-09T12:31:54.840-07:00</app:edited><title>Pointing Stick</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I'm against the use of the mouse in most cases.  That's not to say that I'm particularly good at avoiding it.  It requires you to take your hands off the keyboard and breaks up the flow of what you are doing.  There is a solution to this problem, the pointing sticks in the middle of the keyboards. These don't require you to stray nearly as far from typing position. They works pretty well but require that you're typing on a laptop(an IBM or Dell to be specific).  When you are working on a desktop and not a laptop you're pretty much screwed.  Looking around on the web I've seen very few options and most of them have limited availability at best.&lt;br/&gt;&lt;br/&gt;In my ideal world I could get something like the &lt;a href='http://www.amazon.com/Microsoft-Natural-Ergo-Keyboard-4000/dp/B000A6PPOK'&gt;Microsoft Natural Ergo Keyboard 4000&lt;/a&gt; but with the addition of a pointing stick.  You might say that there are usb keyboards which have a touch pad on them but touchpads aren't nearly as integrated and I detest the clunkiness of using them.  This is my opinion and is certainly &lt;a href='http://news.cnet.com/8301-17938_105-10010673-1.html'&gt;not unanimous&lt;/a&gt;.  It took me a week or two of using a pointing stick to start liking it.&lt;br/&gt;&lt;br/&gt;Why is this such a big deal for me?  Even on a desktop, I like to type with the keyboard sitting on top of my thighs.  The side effect of this is that the mouse is nowhere near me.  My alternate computer usage has been sitting on the couch with my computer hooked up to my HDTV.  If you've ever tried to use a traditional mouse on the couch you probably know how quickly the pain comes.  &lt;br/&gt;&lt;br/&gt;While my desire for a desktop keyboard with a pointing stick may not be all that common it's certainly not unique.  Why don't there seem to be keyboards which meet my requirements?  I'm guessing patents and the company or companies holding them (IBM?).  Does anyone have any good solutions?&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-2986921172735667535?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/x0fo7IkYR18" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/2986921172735667535/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=2986921172735667535" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2986921172735667535?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2986921172735667535?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/04/pointing-stick.html" title="Pointing Stick" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk8MQns7fip7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-6589893898230068401</id><published>2010-04-06T00:13:00.000-07:00</published><updated>2010-08-10T22:34:43.506-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:34:43.506-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="quality assurance" /><title>My QA Value Proposition</title><content type="html">I've heard and observed that Quality Analysts/ Quality Engineer's(QA for the purposes of this post) are often valued a lot less than other members of software development teams.  Here are some of the reasons I've heard in support of this view:&lt;br/&gt;

&lt;ul&gt;&lt;li&gt;Following a script and clicking through a website is easy, anyone can do it.
&lt;/li&gt;&lt;li&gt;We test so we don't need someone else to do it.&lt;/li&gt;&lt;li&gt;They never find any real bugs.&lt;/li&gt;&lt;li&gt;We'd rather just have another developer.
&lt;/li&gt;&lt;/ul&gt;
&lt;br/&gt;
I don't agree with the perspective so I thought I'd lay out what I think the QA value proposition is.&lt;br/&gt;&lt;br/&gt;

While the entire team must take ownership of the quality of application, the QA's are the shepherds of that quality.  If you are simply tossing an untested application over the wall at QA, they will be scrambling(usually ineffectively) to clean up your mess.  To be effective, QA's should be full fledged members of your team, co-located with your team, testing in-phase with your team.&lt;br/&gt;&lt;br/&gt;

While QA's perform a good amount of manual testing they also help create smoke tests, help determine acceptance criteria, help write acceptance tests, and monitor performance testing.
&lt;br/&gt;&lt;br/&gt;
While QA's may follow some test scripts, they also monitor browser compatibility, find creative ways to break the application, and have keen attention to detail.  They are also able to step back and notice things that escape your eye after viewing the functionality in your story for the thousandth time that day.
&lt;br/&gt;&lt;br/&gt;
Good QA's help expose defects, find work-arounds, and help the business to prioritize them.  They monitor, minimize, and mitigate the differences between other environments and production.
&lt;br/&gt;&lt;br/&gt;
While it's certainly possibly to successfully develop quality applications without formal "QA", having good QA's around makes it much easier.  I think they are every bit as valuable as other members of the team.
&lt;br/&gt;&lt;br/&gt;
When people don't see much value in QA's, I generally think they haven't worked with a good QA or have only worked in environments which make all but the most basic QA work impossible (i.e. "After 6 months, here is our first testable release. We have to be in production in a week.  Good luck.").
&lt;br/&gt;&lt;br/&gt;
I'm sure I've left out many other things.  How else do QA's provide value to projects?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-6589893898230068401?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/G8axUKdIx0w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/6589893898230068401/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=6589893898230068401" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6589893898230068401?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6589893898230068401?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/04/my-qa-value-proposition.html" title="My QA Value Proposition" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;A0YNR309eyp7ImA9WxFTEEQ.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-6096345961094302125</id><published>2010-03-31T22:19:00.001-07:00</published><updated>2010-03-31T22:19:56.363-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-31T22:19:56.363-07:00</app:edited><title>Offshoring Software Development isn't cheap</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I have some thoughts on offshoring that I'd be interested in getting some feedback on.  Agree/disagree at will.&lt;br/&gt;&lt;br/&gt;If a software developer (BA,QA,PM, etc.) is little more than a typist then it makes perfect sense.   &lt;br/&gt;If I send work offshore it costs me 1/X times my onshore rates. &lt;br/&gt;&lt;br/&gt;Let's assume the average skill level is more or less the same onshore and offshore.  This has been my experience with my fellow thoughtworkers. &lt;br/&gt;&lt;br/&gt;To make things easy let's also assume a programmer in your favorite offshoring location (I chose India because it has the best food :) ) commands a salary that is 1/9th that of an onshore developer. I made up this number based on the first salary numbers I could find on the net. ( Indian developer ~10k USD (~450k INR), US developer ~90k USD)  If I'm way off let me know in the comments.&lt;br/&gt;&lt;br/&gt;Even the most optimistic person will agree that there is some additional overhead that goes along with this setup.  For Example, network connections between the offices, additional development servers, and a certain amount of overlap of roles in each place.  Given our 1/9th multiplier these costs seem pretty minor. &lt;br/&gt;&lt;br/&gt;There are other more substantial issues:  &lt;br/&gt;&lt;ul&gt;&lt;li&gt;Employee morale decreases on both ends when people constantly have to work late or get up early to have meetings across a wide spread of time zones. &lt;br/&gt;&lt;/li&gt;&lt;li&gt;Network sluggishness makes sharing a common code repository difficult and leads to long  check-in cycles and/or painful merges.&lt;/li&gt;&lt;li&gt;Communicating requirements through typed documents is not effective and is even less so when crossing cultural boundaries.&lt;/li&gt;&lt;li&gt;People are blocked and can't continue their work because they need answers from people who are not available.  &lt;br/&gt;&lt;/li&gt;&lt;li&gt;Transparency is often low within a single office.  It's almost non-existent when you add many time zones and thousands of miles to the mix.&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;The drags on productivity listed above can be mitigated to a fair extent:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Have team members alternate spending chunks of time working in both locations.  Getting to know all members of the team and working side by side with them in the trenches will increase morale, communication, and transparency.  Video conferencing equipment can help as well but isn't a substitute for working together face to face.  This is a pretty significant cost.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;Collaboration tools like Mingle and Cruise can help keep people on the same page and ensure that you aren't stepping on each other's toes. (yep, I'm plugging my employer's products)&lt;/li&gt;&lt;li&gt;Distributed version control such as Git or Mercurial are supposed to help with some of the repository issues.&lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;When all of this is added up does offshore development actually cost less?  What have you observed?&lt;br/&gt;&lt;br/&gt;My hypothesis is that on average the chances of poor outcomes are higher and the costs may not be significantly different.  &lt;br/&gt;&lt;br/&gt;Why do I suspect that this is the case?  Here's an anecdote for what I imagine is the average case of offshoring:&lt;br/&gt;Company A spends a lot of money on their in-house product development.  CTO Smith observes that development is slow(and getting slower) and that Company A is getting a poor return on their investment.  Because programming is like typing, they need more typists... at a lower cost.  They hire a larger number of programmers via the lowest rate offshoring firm available.  The project starts slowly.  When the project is well behind schedule the answer is to increase resources significantly, incurring additional cost.  Not much if anything is delivered and the quality of deliverables is very low.  &lt;br/&gt;&lt;br/&gt;This is &lt;b&gt;not&lt;/b&gt; a condemnation of offshoring. It's a condemnation of that idea that a company which doesn't run consistently successful projects onshore will be successful in running projects offshore.  It's a challenge to find high performing people.  It's a challenge to run successful projects.  Even under good conditions some projects will fail.  Offshoring adds additional challenges.  &lt;br/&gt;&lt;br/&gt;Is it worth it to take on these additional challenges?&lt;br/&gt;&lt;br/&gt;I think in many cases it is.  If we reviewed successfully offshored projects what would we find? My guess is we'd find consistently successful deliveries with costs in the realm of 1/2 to 1/3 what it would cost to develop onshore(I just made up these numbers.  Lawyered!).  These companies took the opportunity to scale up(or replace?) their already successful onshore development operation.  They would do so by creating a high end offshore team.  &lt;br/&gt;&lt;br/&gt;Assuming my hypothesis is correct, I further suggest:&lt;br/&gt;&lt;ul&gt;&lt;li&gt;Quality BA's, Developers, QA's, PM's are hard to find.  Offshoring should be utilized to scale up because you will have a  larger pool to draw from. You will assume  additional risk however you may also save a significant amount of money.  &lt;br/&gt;&lt;/li&gt;&lt;li&gt;If costs are really the main driver for outsourcing, I think a company considering outsourcing should do two things:  1. Take a long hard look at why development is so expensive (and/or results are so poor) in your organization.  What makes you think doing things offshore will produce different results.  2. Consider co-locating the entire team, including stakeholders and business owners, offshore for the duration of the project. &lt;/li&gt;&lt;li&gt;Project success is impacted much more by the abilities of the people on the team than where the project is developed.  if you're hiring average typists, you're probably ok.  If you're hiring average software developers, you're in for a lot of pain regardless of where they are physically located.&lt;/li&gt;&lt;/ul&gt;&lt;br/&gt;What do you think?&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-6096345961094302125?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/FHq38iC2GeY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/6096345961094302125/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=6096345961094302125" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6096345961094302125?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6096345961094302125?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/03/offshoring-software-development-isn.html" title="Offshoring Software Development isn&amp;#39;t cheap" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>9</thr:total></entry><entry gd:etag="W/&quot;Dk8ARX48fip7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-1065561251594251158</id><published>2010-03-29T23:05:00.000-07:00</published><updated>2010-08-10T22:34:04.076-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:34:04.076-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="consulting" /><title>Consulting Engagement Success Indicators</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Whenever I roll on to a new client there are a few things that I find to be leading indicators for the success of the engagement.&lt;br/&gt;&lt;ul&gt;&lt;li&gt;How long it takes to get a badge/computer/access to the building.  Hopefully this stuff is ready and waiting when you arrive. I have seen cases where a badge takes a few weeks and a computer takes up to two months.  It's particularly awesome if they won't provide you with a computer and won't allow your computer on their network.  If I don't have all of this stuff by the end of the first week on the client it's a bad sign.    &lt;br/&gt;&lt;/li&gt;&lt;li&gt;The amount of time it takes before I hear the first mention of filing a ticket.  Something like "Here is your laptop, if you want a mouse or keyboard file a separate ticket for each and we'll get them for you."  I've really come to hate the words "file a ticket", particularly when preceded by "I forgot to" and followed by "so that won't be ready for a few weeks."&lt;/li&gt;&lt;li&gt;Availability of client personnel.  If the people I'm supposed to be working with are MIA or are splitting time with a bunch of other projects I lose a bit of confidence.  &lt;br/&gt;&lt;/li&gt;&lt;/ul&gt;I used to have a few more which seem to have slipped my mind.  Do you have any other early indicators for project/engagement success or failure? &lt;br/&gt; &lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-1065561251594251158?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/xdNjYkHeRIM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/1065561251594251158/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=1065561251594251158" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/1065561251594251158?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/1065561251594251158?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/03/consulting-engagement-success.html" title="Consulting Engagement Success Indicators" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;Dk8FQXs9eSp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-6615463301236965594</id><published>2010-03-29T21:35:00.000-07:00</published><updated>2010-08-10T22:33:30.561-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:33:30.561-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>agile : large companies :: recovery : heroin addicts</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;font style='font-weight: bold;'&gt;&lt;font style='font-weight: bold;'&gt;&lt;br/&gt;&lt;/font&gt;&lt;/font&gt;&lt;font&gt;&lt;font&gt;H&lt;/font&gt;&lt;/font&gt;&lt;font&gt;ow are large companies like heroin addicts you ask?&lt;/font&gt;&lt;br/&gt;&lt;ol&gt;&lt;li&gt;They make excuses and/or deny the problem. My favorite is: How bad
could we be? We're a billion dollar company! When I hear this, I wonder
how many companies have gone billion dollar balance sheets to
bankruptcy in a short amount of time.  Think about Amtrak, the major
airlines...size won't save your business.&lt;/li&gt;&lt;li&gt;They can't maintain focus and their priorities shift constantly. The
new highest priority is either the shiniest thing in view or whomever
is shouting the loudest.&lt;/li&gt;&lt;li&gt;When they do decide to change, they're often only partly committed. &lt;/li&gt;&lt;li&gt;During the transition, managers are paranoid that you're out to get them.  They think the changes will take away their kingdoms.  Developers are paranoid that people will find out that they don't know how to write a test.  QA's are paranoid because nobody tells them what to expect until they don't have enough time to deal with it.  The business is paranoid that they're not getting a return from their expensive IT department.&lt;br/&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;They often flounder through short lived attempts to reform before reverting to their old ways.&lt;/font&gt; Management goes back to constant fire fighting.  They could quit fire fighting if they wanted to, but this stuff is extremely important!  &lt;br/&gt;&lt;/li&gt;&lt;/ol&gt;&lt;font&gt;&lt;br/&gt;Recovery for many large companies is about as likely as it is for a heroin addict.  It is possible but it usually requires a few things:&lt;br/&gt;&lt;/font&gt;&lt;ol&gt;&lt;li&gt;&lt;font&gt; They need to hit rock bottom.  A five year project that cost millions and delivered nothing.  A few days with the production servers down and money flowing out the door.&lt;br/&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt; They need to be committed to making serious change from the top of the organization to the bottom.&lt;br/&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;They need to treat the problems that led down this path in the first place.&lt;br/&gt;&lt;/li&gt;&lt;/ol&gt;Given the challenges that companies face in transitioning to agile, what do they need to increase their odds of success?&lt;br/&gt;&lt;ol&gt;&lt;li&gt;&lt;font&gt;Guidance from people who have successfully transitioned.  I don't mean a coach or two for a couple days.  When transitioning, the team generally needs to have at least 50% experienced practitioners for at least a few months.  To successfully go below the 50% threshold requires a very high level of motivation from those adopting the agile mindset and XP practices. Even with high motivation, it will take one on one support or the drive to spend a lot of extra time on their own.&lt;br/&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;Cross-functional teams with a strong preference for co-location.  The more inter-team hand-offs it takes to get a project developed and deployed, the less likely the project is to succeed.  Getting the stakeholders, BA's, developers, QA's, support staff, and IT dedicated to this cross-functional team and to share the same physical space will increase the odds of success significantly. &lt;br/&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;Transparency.  Bring out all the warts and underlying issues.  Make sure everyone understands the problems and issues at hand.  If people don't agree that there is a problem, they're unlikely to participate in solving it.  In the worst case, a project can be cancelled early. in the best case, problems can be mitigated or resolved and the project delivered. &lt;br/&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;A shared vision of where the business wants to go.   It's very difficult to put full effort into going somewhere if you don't share the same map.&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font&gt;Some quick wins.  If team members see signs of improvement, it can help them sustain their efforts through the instability and insecurity that comes with any change.&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-6615463301236965594?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/UuHBPl5nAKw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/6615463301236965594/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=6615463301236965594" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6615463301236965594?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/6615463301236965594?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/03/agile-large-companies-recovery-heroin.html" title="agile : large companies :: recovery : heroin addicts" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkANRHgzfCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-5307399416555425202</id><published>2010-03-29T16:25:00.000-07:00</published><updated>2010-08-10T22:33:15.684-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:33:15.684-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Why Scrum is Easy and XP is Hard</title><content type="html">I recently read Cyndi Mitchell's article on &lt;a href="http://www.sdtimes.com/link/34197"&gt;The Half Agile Path&lt;/a&gt; and I agree with her that "We are failing to advance good agile engineering practices at anywhere near the pace that we are advancing agile planning practices."&lt;br/&gt;&lt;br/&gt;


While I also agree with Cyndi that it is difficult for management to see the value of pairing and other engineering practices, I disagree that this is the main reason that these practices aren't usually put in place. The much bigger reason is that Scrum at it's most basic(not most effective) is mechanical.  Anyone in an organization can understand and apply scrum practices.  Short iterations, standups, product backlog, burn down. Hey we're agile right!!!&lt;br/&gt;&lt;br/&gt;


On the other hand XP practices like pairing, TDD, refactoring are much more difficult to learn and take a lot of time and effort to become effective at.  I think you can learn these things most effectively by working one on one with people who are already experienced at theses things.  This makes the cost of getting people to be moderately effective at Scrum fairly cheap and the cost of getting people to be moderately effective at XP practices very very expensive.  A fair number of people will never get there.  Additionally TDD and refactoring are made much harder by the large amounts of tech debt that have likely accumulated in the code base.&lt;br/&gt;&lt;br/&gt;


With a development staff of 5-20 the costs of technical up-skilling may be possible to finance.  With a development staff of significantly larger these costs quickly become exorbitant.&lt;br/&gt;&lt;br/&gt;


How can we overcome this problem?  I've spent a lot of time thinking about how to increase the technical ability of non-small organizations over the last few years. I've seen and been involved in a few different approaches and have some ideas. I'll save that for another post.  Has anyone had consistent success in overcoming this?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-5307399416555425202?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/2Dw4W2jS91A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/5307399416555425202/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=5307399416555425202" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5307399416555425202?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5307399416555425202?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/03/why-scrum-is-easy-and-xp-is-hard.html" title="Why Scrum is Easy and XP is Hard" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;Dk4CRHo5fyp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-2285109508166199430</id><published>2010-03-23T20:30:00.000-07:00</published><updated>2010-08-10T22:36:05.427-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:36:05.427-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="common sense" /><title>Office Recycling</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;I'm noticing an annoying trend at the client locations where I've been working.  The number of recycling bins in the offices are sky-rocketing.  Why is this annoying you ask?  Don't you want to recycle?  Don't you care about the environment?&lt;br/&gt;&lt;br/&gt;While I certainly have some thoughts about those last two questions, they aren't the reason for my post.  The reason for my annoyance is that the total number of bins hasn't changed.  Corresponding to the sky-rocketing number of recycle bins is a plummeting number of waste baskets.  In many of the offices I've been in lately desks and cubes each have their own recycling but there are only a few waste baskets.  The planners of this no doubt imagine that trouble finding a nearby waste basket will cause people to generate less waste.  Unfortunately, what actually happens is that people just start throwing their trash away in the recycle bins.  If the goal was to simply change the color of waste baskets to blue then congrats and mission accomplished.  If the goals was to get the recycling and trash separated by the people generating them then these efforts have failed miserably.  We're now at the same place we were 10 years ago, we can either pay people to separate the mixed trash and recycling or we can get cans side by side.  &lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-2285109508166199430?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/L0fGoiO8KPw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/2285109508166199430/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=2285109508166199430" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2285109508166199430?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2285109508166199430?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/01/office-recycling.html" title="Office Recycling" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkABQnY7eCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-2935685790598813293</id><published>2010-01-23T16:41:00.000-08:00</published><updated>2010-08-10T22:32:33.800-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:32:33.800-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>White Space</title><content type="html">Ok I'll say it. I hate checkstyle. More specifically, I hate quite a
few of the standard checkstyle rules. What do the following code
snippets have in common?


&lt;script type="syntaxhighlighter" class="brush: java"&gt;&lt;![CDATA[  
public void myFunction(){  
...  
}
]]&gt;&lt;/script&gt;

&lt;script type="syntaxhighlighter" class="brush: java"&gt;&lt;![CDATA[  public void myFunction()  
{  
...  
} &lt;/script&gt;


&lt;script type="syntaxhighlighter" class="brush: java"&gt;&lt;![CDATA[  
public void myFunction(String param ) {
  ... 
}&lt;/script&gt;

That's right, there's a good chance that they'll cause the checkstyle limit to be exceeded on my current project, for the following reasons:
&lt;ol&gt;&lt;li&gt;There is no space between the ) and {&lt;/li&gt;
&lt;li&gt; The { is on a new line&lt;/li&gt;
&lt;li&gt;There is a space before the )
&lt;/li&gt;&lt;/ol&gt;


Too many checkstyle violations will cause the build to fail.  To remedy this enough violations will have to be manually fixed.  That's the annoying part of it.  In my mind these type of white space differences are completely insignificant.  I know there are many of you out there who obsess about this stuff and I won't get you started about tabs vs. spaces.  I will say that unless you have automated code formatting run on all modified files before check-in you should not have checkstyle failing your builds.  How much time has been wasted splitting string constants because they are over a certain number of characters?


How to avoid this type of BS:
&lt;ul&gt;
&lt;li&gt;Any white space formatting you can't live without should be automatic and not require user action.&lt;/li&gt;
&lt;li&gt; Only fail your build on errors, not warnings.  Also, the violations listed above should be set as warnings.&lt;/li&gt;
&lt;li&gt;Before spending any significant amount of time feeding the checkstyle, fill out your TPS cover sheet first and have it ready to go.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-2935685790598813293?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/--ODCQ1X5M8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/2935685790598813293/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=2935685790598813293" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2935685790598813293?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/2935685790598813293?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/01/white-space_23.html" title="White Space" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Dk4BQHk6eCp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-5586523648241118868</id><published>2010-01-23T03:38:00.000-08:00</published><updated>2010-08-10T22:35:51.710-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:35:51.710-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="common sense" /><title>Beyond Business Casual</title><content type="html">As in "There is no good reason to go beyond business casual".  For some reason many individuals and companies have decided that the more dressed up a person is correlates positively with how much they have to offer as well as how productive an employee they are.

I would argue that where you dress on the scale (from anywhere above a greasy stained t-shirt up to a basic suit) indicates almost nothing.  I wouldn't mark someone down for dressing at the level required by their company's dress code but I would say that dressing above what is required is correlated negatively with skills and positively with the playing politics.  If we lived in the land of Pride and Prejudice this would all make sense but shouldn't we have moved beyond using this kind of thing as a proxy with which to measure people.

There's a reason all politicians and many sales people wear suits all the time.  They literally have nothing of value to offer.  When this is the case, it makes sense for them as individuals to spend all of their time trying to give the false impression that they are powerful and important.  Isn't it time we stopped buying into it?

They always have their excuses.  I have to keep up with the competition.  First impressions are important.  Shaking hands and kissing babies isn't as great for my image if I'm not dressed to the nines.  How about developing a real value proposition?  When I run into companies who are unusually casual for their industry(WAMU, Southwest Airlines for example) I often find that they are known for lower prices and friendlier service. 

I fairly consistently push the lower boundaries of the dress codes wherever I go.   I applaud people like my co-worker who showed up to work in a plain white t-shirt and jean shorts this past Friday.  Assuming you aren't wearing a bikini or mankini the odds are good that nobody will question you.  If someone does, you either need to make yourself more valuable to the company or find a place to work with fewer folks who think that dress codes add value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-5586523648241118868?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/H85spBF8Cdc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/5586523648241118868/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=5586523648241118868" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5586523648241118868?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/5586523648241118868?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2010/01/beyond-business-casual.html" title="Beyond Business Casual" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkMFRX89eCp7ImA9WxBSFUk.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-874532364745391848</id><published>2009-12-22T19:17:00.000-08:00</published><updated>2009-12-22T21:00:14.160-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-22T21:00:14.160-08:00</app:edited><title>Moving Windows Mobile contacts to Nokia</title><content type="html">I've bought  a new Nokia E71 and I was looking to transfer my contact list to gmail as an intermediate step to adding all my contacts to my new phone.  I stumbled onto &lt;a href="http://www.google.com/support/mobile/bin/answer.py?answer=138636&amp;amp;ctx=sibling&amp;amp;topic=14299"&gt;this&lt;/a&gt; help article which helped me to sync them up.  The steps are for a windows mobile phone but I also found &lt;a href="http://thesymbianblog.com/2009/02/10/how-to-sync-your-mobile-contacts-with-your-google-account-for-free/"&gt;a set&lt;/a&gt; for the new nokia I purchased.  Once they are sync-ed you can use gmail to merge any duplicate contacts.  One sweet side effect of syncing was that all of my gmail contacts buddy icons will display on my phone when they call.  Quick and painless, just the way it should be.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-874532364745391848?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/W1WOlfyV0gw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/874532364745391848/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=874532364745391848" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/874532364745391848?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/874532364745391848?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2009/12/moving-windows-mobile-contacts-to-nokia.html" title="Moving Windows Mobile contacts to Nokia" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkEDRXk_eyp7ImA9Wx5SFU0.&quot;"><id>tag:blogger.com,1999:blog-3204036996116858659.post-7647324674982961601</id><published>2009-11-16T04:19:00.000-08:00</published><updated>2010-08-10T22:31:14.743-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-10T22:31:14.743-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><title>Transitioning to open source</title><content type="html">I'm now contributing to an &lt;a href="http://www.google.com.au/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;ved=0CAcQFjAA&amp;amp;url=http%3A%2F%2Fblog.mises.org%2Farchives%2F009475.asp&amp;amp;ei=3EMBS8eAKdOGkQXQn5zuDA&amp;amp;usg=AFQjCNGPBhbbKD6ixs7DDVezEcZYmSKhKQ&amp;amp;sig2=q2Sfn2kWNPGCihnyGlVwSw"&gt;recently open sourced project&lt;/a&gt; .     I'm finding that the process of trying to help the project get going to be full of interesting challenges.  Before I dive into that, I'll provide a little background.

The Ludwig von Mises Institute is a non-profit organization dedicated to promoting the Austrian School of economics and spreading the ideas behind the economics of freedom.  Educating people about economics and freedom are particular interests of mine which is what has drawn me to the project.  They have open sourced the code for their websites as well as the books, papers, articles and media owned by the Institute.  The project has been open source for about 9 months an has not gotten much in the way of code contributions aside from the original programmer who has been working on the project in his spare time for about 5 years.  Like many projects and most single developer projects in particular, the projects has grown organically without automated tests.  Little attention has been paid to the amount of effort necessary to get a development environment up and running.  There is a large amount of data access directly in the UI tier as well as a large amount of business logic in the database.  Changes are manually pushed to production and some changes seem to be made directly to the production environment.  The feature request list consists of a few tasks as well as the output of a brainstorming session.

How can we take this project from a one programmer show to a thriving  open source project?

&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Lower the barriers to entry&lt;/span&gt; -  As I mentioned little attention has been paid to the amount of effort necessary to get a developer workstation up and running, and why should there have been.  On a single programmer project there is no cost associated with this,  the original developer has it compiling and running on his own machine and should he need to set up another he more or less knows what it takes.  Getting it running on my local machine for the first time took a couple of days.  For an open source project this kind of up front cost is unacceptable.  Even most of those who are highly motivated to contribute will give up fairly quickly if they can't see a direct path to making valuable contributions. Most of the first week and a half or so that I've spent on the project has been dedicated to easing the process of getting up and running. &lt;ul&gt;&lt;li&gt; So far: Checked dependencies into source control.  Set up a command line build which is able to build and run the app(including a local copy of the databases with some data) with minimal configuration after being checked out of source control.
&lt;/li&gt;&lt;li&gt;Yet to be done: Ensure that the data makes sense in the context of the app and comprises a representative subset.  Add more detail around installing prerequisites for running the app.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Decrease the risk associated of change&lt;/span&gt; - Pretty quickly after starting to look at the code I realized that I had no confidence in being able to change it without breaking something, or perhaps even everything.  For example I pulled the business logic classes that were in the web site out into a separate assembly.  Getting the app compiling again was pretty easy but there were a couple places that the classes were loaded via xml that had been broken.  This went unnoticed for a couple of days.  I'd like to have a wide array of unit, integration, and functional tests.  The majority of the code is not unit testable.  I'm not comfortable  structurally changing it to be unit testable without some form of regression available. &lt;ul&gt;&lt;li&gt;So Far: Installed CI to ensure that the code and databases compile after each check-in.  Explored the code and application to better understand the domain.
&lt;/li&gt;&lt;li&gt;Yet to be done:  Add integration tests and/or functional tests in the areas where a feature is to be developed, refactor to a unit testable condition when those tests are in place.  Add unit testing for areas of the code that I changed.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Deliver business value&lt;/span&gt; - I'm shocked and saddened that this is the third thing on my list!  I've been working quite hard for a week and a half and I haven't delivered anything of value to the Institute.  I can't decide if I should have delayed some of the build and ci related tasks and left them to be done in the near future.  On one hand I could have have knocked out a few tasks.  On the other hand a couple of fellow Thoughtworkers are willing to contribute and were able to get going much more quickly than I was.  Another challenge is clearly going to be communication bandwidth.  The team members working on the project are distributed  across the world.  In addition it's being developed in people's free time which makes it even less likely that their availability will line up to allow communication.
&lt;ul&gt;&lt;li&gt; So far:  Some tasks and brainstormed ideas have been added to a wiki
&lt;/li&gt;&lt;li&gt;Yet to be done: Determine who the Business Owners and other stakeholders are.  Gather some user stories in a standard format (As a ... I would like to .... so that ...?).  Help the stakeholders to create a prioritized list.  Address availability of requirements or lack there of.  Wrap up non-value generating tasks so Business Value can go to the top of the list where it belongs.
&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Generate interest and buzz&lt;/span&gt; - I think &lt;a href="http://www.rationalmind.net/"&gt;David&lt;/a&gt; and the folks at the institute have done a good job of generating interest in the project by getting the news out there.  I agree with his assertion that getting more people to contribute more than just talk requires getting some exciting stuff done.
&lt;ul&gt;&lt;li&gt;Yet to be done: Deliver, Deliver, Deliver.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;
I'd appreciate any ideas, thoughts, comments, criticism, etc so feel free to fire away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3204036996116858659-7647324674982961601?l=blog.stevemoyer.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CodingLibertarian/~4/TwQZ9_gDBKQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.stevemoyer.net/feeds/7647324674982961601/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3204036996116858659&amp;postID=7647324674982961601" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7647324674982961601?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3204036996116858659/posts/default/7647324674982961601?v=2" /><link rel="alternate" type="text/html" href="http://blog.stevemoyer.net/2009/11/transitioning-to-open-source.html" title="Transitioning to open source" /><author><name>Steve Moyer</name><uri>http://www.blogger.com/profile/17748480677185277347</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total></entry></feed>

