in

 

Chad Myers' Blog

Department of Problem Prevention

May 2008 - Posts

  • Introducing Quality-first Notions Into an Existing Team

    In a recent discussion on the altdotnet mailing list, a question was raised: How to you start introducing TDD into an existing team?  Bill Barry had some good thoughts on how the process might work, I suggest you check out his post.

    It got me thinking about things and three questions came to mind:

    1. If the team is functioning and delivering software, why introduce anything at all -- especially such a radical change as TDD?
    2. When implementing TDD, what's the best way to get it going (i.e. mandatory/imposed, weaving in little by little, separate project, etc)?
    3. Won't this just add a bunch of time to my process?

    First Question: Why introduce TDD into an existing, functioning team?

    What if the team is already having success with their current process? Why add something so different as TDD and risk potentially screwing everything up?  Bill touched on this in his post, but I'd like to expound upon his point. His point was essentially: Is it really working, or does it just appear to work? Shipping software is not the only metric. Is what they're shipping as high quality as it could be? Could they ship faster? Are they working as efficiently on the code as they could be, or is a large percentage of their time spent on up-front design, bug reproduction and resolution, and other otherwise-avoidable activities?  The first thought that came to mind is: Sure, you may have a bunch of heroes on your team that, through blood and sweat manage to pull off successful releases, but at what cost?

    I get this a lot when talking to people about TDD. I hear things like, "But our process is working great, we're shipping software on time and customers are happy!"  That's wonderful and I applaud your success. So now that you're making customers happy, could you be making them happier? Could you be saving your company money by making your successes even more efficient? Let's take it to the next level! Let's make customers ECSTATIC! One vision that comes to my mind when people say they are having 'success' is a circus performer juggling balls in the air while riding a unicycle.  Sure, that performer is an amazing expert in his field and extremely talented. However, if his task is to deliver the balls to a customer, he's spending way too much effort when he could just walk them over to their destination.  Are the talented experts on your team juggling on unicycles, or are they taking the easiest, shortest path?  Which delivery method will make the customer more successful?  Juggling my impress them, but it's not really helping them.

    On the other hand, I have seen teams (yes, including teams I've been on and even lead -- I'm as guilty of this as anyone!) declaring success, but when probed for more details, it turns out that the customers don't necessarily share the same enthusiasm for the success as the development team does. Many times, in this situation, if you ask customers how they really feel, they may say that quality is 'acceptable' or 'good enough' or 'I can work around the problems'.  I will ask the development team what metrics they're using for measuring success (and the sustainability of that success), quality, efficiency, etc.  Very frequently there is no answer, or everyone stares at their shoes. We can ALWAYS do better. We can ALWAYS improve and eek out more efficiency, more automation, more clarity, and, most importantly, more success for our customers. We should be relentlessly seeking out these opportunities and taking whatever reasonable risks we can to make sure that we're not missing things.

    In my mind, TDD is more than just a coding practice, it institutes this culture of relentless self-examination and improvement -- a culture of quality, measurement, sustainability, and repeatability (all summed into the word I use a lot: 'maintainability').  TDD is the tip of the iceberg, but it is supported by other good practices such as Source Control, Continuous Integration, Automation, and Code Refactoring -- among many others.

    Second Question: What's the best way to go about introducing it?

    So, how does one go about bringing this culture to their organization.  Given that I propose that TDD is the tip of a cultural iceberg within your organization, the key is to change the culture and the focus of your team back to quality and customer satisfaction and away from merely shipping the software. OK, OK, I know some of you are going to slam me and say that 'here those TDD guys go again...'  Yes, shipping is important. Shipping is critical, Shipping is one of the most important features of your project. There, I said it. But I'm also concerned that what's being shipped is going to make the customer's happy. And I'd even lean towards the side of ensuring customer satisfaction over hitting imaginary deadlines.  Real deadlines (i.e. the money's going to run out, we have a legal requirement to implement X by such-and-such date, etc) are a different story, but the values are still very similar.

    Anyhow, on to the meat. Here's one possible recipe for implementing a culture of quality and customer satisfaction in your development team:

    1. Get source control setup if you don't have it already. Note: this can be the hardest step sometimes.
    2. Encourage frequent source control commits and the taking of source control seriously -- not just infrequent code backups
    3. Get NAnt, MSBuild, Rake or FinalBuilder and automate the build. I've never met anyone who resisted this.
    4. Set up CruiseControl.NET/TeamCity and get CI going with your new automated build.
    5. Slowly encourage developers to install the CCTray or TeamCity agent tray thingee and encourage them to take build failures seriously. Eventually they will get the build-failure-fever and work to prevent it from happening.
    6. Add in a few unit tests to the build, preferably things that won't break easily to give positive feelings about there being some tests in the build that pass consistently.
    7. Encourage people to add tests whenever they find a bug to ensure that the bug won't happen again. This is usually an easy sell as doing the test as a repro case helps fix the bug faster.
    8. Eventually add a few tests that are brittle to get people used to caring when the build breaks due to tests. Then use that opportunity to discuss the best way to write tests in your environment.
    9. Pick a few of the developers who are most interested and/or who have the best attitude and introduce them to the TDD concept and do a short ping-pong pairing session with them on a simple feature to win a quick success.
    10. Keep doing more of #9 until someone else gets it and wants to help.
    11. Start doing more and more until it catches on throughout the whole (or most of the) team.

    Third Question: Won't this just add a bunch of time to my process?

    This one is easy. In my experience, these practices pay for themselves rather quickly. The ROI on 'sharpening your saw' is usually very quick.  An ounce of prevention is worth a pound of cure, after all.  There is a startup cost, to be sure, but as long as you focus on the values and principles and ditch what doesn't work and try what you think might work and constantly re-evaluate your practices, you will quickly shake out a set of practices that are right for your team and amount to force multipliers.

    Posted May 27 2008, 01:16 PM by chadmyers with 7 comment(s)
    Filed under:
  • Ruminations on Self-examination

    First, let me apologize for not sticking to my self-imposed regimen of only meat-posts for the next few months, but I was smacked in the face by these tonight and wanted to share them with you.  Second, I don't proclaim to be any good at following any of these or be any sort of expert at them. I heard them tonight and will try to put them into action the best I can. I wanted to share them with you so that maybe you might get some benefit from them also.

    In the 1950's, Roman Catholic Archbishop Fulton Sheen had an Emmy award-winning top-rated television show called 'Life is Worth Living' (drawing nearly 10 million viewers, giving Milton 'Mr. Television' Berle a run for his money). It was an extension of his long-lived radio show. Archbishop Fulton was a renowned philosopher having earned a doctorate of Philosophy from Catholic University of Leuven in Belgium and being the first American to win the Cardinal Mercier award for best philosophical treatise.

    I try to listen to the re-broadcast of the audio from his television series whenever I can and it's always a gem. He has a remarkable way of relating complex philosophical topics in simple ways that lay people like myself can understand.  Anyhow, tonight's episode was on 'self-examination' and was particularly good. I tried to remember as much as I could in order to recite some of the better nuggets for you here. I've done the best I can, but these are ONLY PARAPHRASED snippets from my rather unreliable memory.  Hopefully they will do some justice.  If anyone has official transcripts or the direct audio (I found some audio, but not this specific episode) please let me know! I hope you enjoy them as much as I did.

    Life is like a department store you walk into and see that the price of hair pins is $999 and the price of refrigerators is $0.15.  What is the comparative value of these two items? Obviously, this is a mistake. Without self examination, would you ever catch it? Or are you content to leave your values so far out of balance and be taken advantage of by those who can see what you cannot?

     

    Ever notice how the people who don't examine themselves are the quickest to judge everybody else?

     

    The grandfather asked his grammar-school-aged grandson, "What next?"

    "Middle school," he replied.

    His grandfather immediately shot back, "What next?"

    "High school, College" -- "What next?"

    "Wife, family, career" -- "What next?"

    "Retirement, old age" -- "What next?"

    The grandson paused.

    It is precisely at this stage of life -- the end -- which we should begin our self examination. If we allow the youth to persist in thinking with emotion and passion and seeking only good times -- these lower parts of our psyche -- the mind will eventually begin not to accept reason and self examination will become almost impossible. Eventually, life will come to a close, self examination will be forced upon them and all that will be left will be regret.

     

    There are three pools in which to gaze and see aspects of your life:  The first pool is the way others see you, the second pool is the way you think others see you, and the third is the way you really are.  So rarely do people even cast a fleeting glance at the third pool. Yet true self examination cannot happen without long stares in that pool.

     

    The only thing we truly posses in this world is our own will.  Power, fame, money, relationships can all be taken away. The only thing we are truly in control of is our own will. If you wish to truly know who you are and what you are worth, look at your will and adjust accordingly. True self-examination must examine only that which is real. Nothing is real in your life except your own will.

  • ALT.NET Podcast EP2 on Microsoft

    The altnetpodcast crew released the second part of the discussion that Mike Moore, Jeremy Miller, David Laribee, and I had about ALT.NET, continuous improvement, and the relationship between Microsoft and the .NET community at large.

    Please check it out and drop the altnetpodcast folks a line and let them know what you liked and didn't like.

    Posted May 24 2008, 08:35 AM by chadmyers with 3 comment(s)
    Filed under:
  • TIP: Check if a web site is down + cool FireFox hack

    I was having problems connecting to a web site and I managed to stumble into a web site via Google to check to see if a web site is really down or not (get a second opinion) and I found this site:

    http://www.computerhope.com/cgi-bin/isitup.cgi

    But even cooler than that, they had a tip for FireFox that allows you to bookmark that URL and assign a 'keyword' to it. I hadn't seen this before, but apparently it's an old feature in FireFox.

    So now I can just type: ping www.yahoo.com

    And it takes me to the computerhope link above and tells me whether it's up or not. Sweet!

    Posted May 19 2008, 09:58 AM by chadmyers with 5 comment(s)
    Filed under:
  • Austin .NET Code Camp '08 == Awesome

    Yesterday a bunch of .NET geeks descended upon Austin for the '08 Code Camp and it was a great success. From what I heard, about ~200 folks showed up. We had sessions all day and all of them were meaty, good stuff. I don't recall seeing one single vendor salesware demo. Every presentation had meat in it (even the vendor ones). There were several patterns/practices talks and we even got to do a fishbowl on TDD/BDD practices.

    Please indulge me in a few acknowledgements. Please also forgive me for all the people I'm about to miss and offend.  I'd like to especially thank John Teague and Eric Hexter who, from what I understand, organized the whole thing. I'd like to thank all the speakers, especially Ben Scheirman and Jimmy Bogard who both led 4+ sessions EACH!  I'd also like to thank the sponsors who helped make it possible and provided lunch and a bunch of snacks and drinks. Lastly but not least, I'd like to thank all the attendees who really made it a great conference and really help energize the atmosphere and inspire everyone to try harder to make the .NET community in central Texas even more lively.

    It was also good to see the Los Techies crew representin' (Jimmy Bogard, Joe Ocampo, and Eric Hexter).

  • Ping-pong Pairing Session Screencast with Ben Scheirman

    Well, it's two-fer Tuesday here at Los Techies, I guess!  By pure coincidence, Ben Scheirman wrapped up the post-production of a screencast we did a few weeks ago.

    Ben Scheirman just recently posted on his blog about it.

    Ben did a LOT of work trying to get the video and audio in sync and did a heroic job. We still have a lot to learn about how to get everything to work together (audio, video, shared Internet connection), so please forgive us on the unprofessional nature of the screencast. We're developers messing around with screencasts, this isn't our day job! :)

    The Screencast can be viewed here:

    http://www.benscheirman.com/screencasts/tdd-inventory

    Just like Ben did in his post, I'd like to establish a few caveats:

    • I'm not a TDD expert! I make no claims of canon here or that this is official TDD or BDD gospel. Please take with a grain of salt!
    • Our main goal was to have a pairing session using TDD and record it. We started out trying to teach some TDD fundamentals, but it just turned into a cool jam session
    • We had a lot of technological problems w/r/t Skype dropping calls.
    • We had some time sync issues with the audio, so the audio and the video get out of sync part way through the video, but it's still worth watching part of it
    • Sorry for the length, hopefully you can zip around and find stuff that's interesting and then back up a little to see what you want to see.

    Anyhow, there's lots of good stuff in there, and I hope someone gets some useful into out of it.

    I can't speak for Ben, but I know I'd definitely like to keep trying this sort of thing in the future -- hoping that the technological issues would work themselves out and Ben wouldn't have to kill himself just to get the audio lined up!

  • ALT.NET Podcast on Continuous Improvement

    Mike Moore recently put together a podcast about ALT.NET and Continuous Improvement featuring Jeremy Miller, David Laribee, and, in order to make the other guys sound smarter, me.

    Please check it out and let us all know what you think!

    From what I understand, the 'Alt.NET Podcast' folks are planning on doing many more episodes, so you may want to subscribe to their feed and stay on top of it in the future.

    Posted May 13 2008, 08:16 PM by chadmyers with 2 comment(s)
    Filed under:
  • OT: You Can Save Lives

    I debated about posting this on a technical blog and abusing the relationship with my subscribers, but I believe that the benefits outweigh the negatives. Lives are stake, people are suffering, and many of YOU can help. I hope you agree that this post is worth it.

    I know many of you have families and several of you are expecting a new addition. I would like to humbly ask you to consider donating the umbilical cord blood to your local Cord Blood Bank.  In Texas, the Texas Cord Blood Blank is in San Antonio. Most states have a Cord Blood Bank (usually in conjunction with a hospital or a regular blood bank). Please see if there's one in your state.

    Many people are capturing the cord blood after birth and storing it for treatment of their own family should any of the problems arise that cord blood can treat. This is great and you should seriously consider doing this. I would also like to suggest you consider donating some or all of it to your local/regional blood bank for those who are more likely (or who already have) these life-threatening conditions. People with horrible diseases like Leukemia, lymphoma, sickle cell anemia, and cancer are being treated TODAY and some have had remarkable recoveries due to Cord Blood therapy.

    Why am I doing this on my blog? Because so far most hospitals and midwives don't know that you can save the Cord Blood and bank it and so they don't think to ask women before or during labor whether they want the blood to be saved.  At this time, you must ASK for it.  If your family is expecting, I strongly encourage you to look into this and decide if the risks are low enough and benefits high enough to help give someone life-saving therapy.

    From what I understand, several major insurance carriers are starting to cover the collection procedure as well as the on the recipient side, the transplant procedure because it is a demonstrable and scientifically proven medical success.

    Benefits of cord blood:

    • There is very little risk to the donor.
    • Since cord blood immune cells are less mature, they are more easily accepted by the patient when used in transplantation. As a result, patients with a less than perfect immune match can now be treated
    • There are fewer immune complications after transplantation.
    • Since cord blood is banked and ready to use, it is immediately available when a patient needs it.

    Some of the diseases currently treated with cord blood:

    • Leukemia & other blood cancers
    • Aplastic anemia
    • Lymphoma
    • Deficiencies of the immune system
    • Genetic disorders such as sickle cell anemia
  • NAnt script for determining whether an assembly is registered in the GAC

    A friend of mine, Kevin Miller, recently put out a public call for anyone who had some NAnt magic for detecting whether a given assembly is in the GAC or not. I had written something like this a year or so ago and I thought I'd share it with everyone in the hopes it might help you.

    Standard disclaimer: I don't guarantee that this works, I don't guarantee that this won't explode your computer if you run it. I make no warrantees of any kind.

    First, you have to have the .NET SDK installed. If you have Visual Studio 2005 or later, you do. If you're on a server, make sure you install the .NET Framework 2.0 SDK (free download from MS -- SDK x86, SDK x64, and SDK IA64) first.

    At the top of your build script somewhere:

    <property name="gacutil.exe" value="${framework::get-sdk-directory('net-2.0')}\gacutil.exe" />


    Next, add the GAC check in a task somewhere (NOTE: Replace the YOUR_ASSEMBLY... with the name of the assembly to find without the ".dll" portion on the end):

    <exec program="cmd.exe" failonerror="false" resultproperty="foundInGac" verbose="true"
        commandline="/c gacutil.exe /l YOUR_ASSEMBLY_NAME_WITHOUT_THE_DOT_DLL | %windir%\system32\find &quot;Number of items = 1&quot;">
        
        <environment>
            <variable name="PATH">
                <path>
                    <pathelement path="%PATH%"/>
                    <pathelement dir="${framework::get-sdk-directory('net-2.0')}"/>
                </path>
            </variable>
        </environment>
    </exec>

    In my particular case, I added a <fail> task to fail the build if that assembly was in the GAC because it could hose the versioning of my build. Here's how I did that:

    <fail if="${int::parse(foundInGac) == 0}" message="The Core assembly is registered in the GAC. Please un-GAC this assembly before attempting to build the project."/>

     

    I hope this helps someone.

  • Tying up loose ends

    Blogging Stuff

    Just in case anyone was following/caring, I had started a few multi-part series posts that kind of fizzled out and I felt I owed the 3 of you who cared an explanation:

    • Agile Arguments: No one seemed to pick up or care about this one. I have a two half-written parts to this, but I'm not going to flog myself to finish them if there's no interest.
    • Pablo's Topic of the Month for April: Design Patterns - no one else chimed in on this one. April was rough for a lot of people and we just didn't get it done. Sorry folks :(  We're human. We may try something for May, or pick it up again in June with a new topic (hopefully something that requires a little less investment so we can get back up to speed)

    I think I might back away from heady posts altogether and get back to more code/task-oriented posts. There's a ton of stuff out there and I'd like to start doing some real-world minutiae stuff with some test-driven design, IoC, or other stuff I preach sneakily thrown in there in the hopes that that might be a more effective strategy for getting people excited about some of these accelerators I have found.

    Community Stuff

    CodingDojo

    The next incarnation of the TDD CodingDojo was planned for April, but my job situation + ALT.NET Seattle threw a wrench in that. May turned out to be for similar reasons. So the current plan is some time in June (hopefully early). We'll see. Several of you have offered to help set up something and we (and I think I can speak for the Los Techies crew here) really appreciate the offer and we'll probably be calling on you sometime soon.

    Screencasts

    I recorded a screencast with Ben Scheirman a few weekends ago and it worked out pretty well, I thought. Unfortunately there was some temporal distortion between our two audio streams, and last I checked he was slogging it out doing some grunt work to get it straightened out (thanks Ben!)  If anyone knows why one audio stream slowly gets out of sync with the other (i.e. about 1 second every few minutes), we'd appreciate some help.

    Ray Houston and Jimmy Bogard just recorded a screencast and it's coming together nicely in post-production. Look for one of them (hopefully) to post about this soon (great job guys!)

    I'd encourage all four of you who read my blog to consider doing a screencast.  It's a lot easier to do it in person, so if you're in Austin maybe we could set something up together?

    DotNetSlackers and other sites

    The crew over at DotNetSlackers.com are doing some pretty cool things and they're asking for folks to help write articles, send in snippets, etc. I going to *try* to do some of these in the near future (I keep promising Sonu, but never following up -- sorry man).

    I'd like to suggest anyone who has even simple snippets or interesting ASP.NET MVC usage examples, or maybe even NHibernate 101 stuff, contributing it to DotNetSlackers to further the art. They're clamoring for high quality content and they're even willing to PAY for content! Yes, that's right, pay! :) It's in your professional as well as personal interests to contribute to a site like this (disclaimer: I have no affiliation with this site other than being an occasional forum poster and I received no money or other compensation to say any of this -- I just like the site).

    Posted May 04 2008, 09:53 PM by chadmyers with 7 comment(s)
    Filed under:
Copyright Los Techies 2007. All rights reserved.
Powered by Community Server (Commercial Edition), by Telligent Systems