Spend Time on the Little Things

For a software development project, much as it is in life, it is the little things that really make a big difference.   These are the tasks that, for some reason, seem little at the time.  As such, they get pushed to the back burner in favor of something else that at the time seems more important.   Those leading the project will often say something like “that’s easy, we’ll get to it later” or “that’s not important because the customer doesn’t see it – we’ll get to it later”.  In my opinion, this needs to stop.  We need to realize that more often than not, whatever is being pushed off now will not get done (or at least done well) later.

I often see this attitude come up in two areas – unit tests and automated builds and/or deployments.  With so many people preaching the good word on the benefits of unit testing and automation, it surprises me when people continue to not do it and push it off to “later” – only to find “later” never comes.

You have to have unit tests.  And it has to be automated.  There is no way around it.  Take the time when starting a project to put the infrastructure in place.  If a pointy-haired manager questions why there is a need to spend time doing this, when you could be making a text box have rounded corners, you need to sit that manager down and explain the benefits.  Explain how finding a bug during development is much cheaper than finding it after the product ships.  Explain how having a repeatable, automated way to find defects increases the team’s ability to respond to changes – without having to worry as much about breaking something else.  Explain that if something does break, the team will find out right way and be able take corrective action – thus saving time and money.  Finally, you need to explain that setting up unit testing is something small and easy to do.  It’ll pay huge dividends down the road.  It’s a small thing, and it matters!

Automate whatever you can.  We’re human – we make mistakes.  Realize the fact the computers are simply better at repeatable tasks than humans are.  What needs to be automated?  First, as mentioned above, you really need to automate the unit tests.   Second, please automate your builds and deployments.  When a project first starts out, it seems easy to say “building and deploying only takes a few minutes, I’ll just do it by hand”.  Seems logical, right?  Sure enough, as the project continues, more and more features are added and the project grows in complexity.  Time becomes tight, and that pointy-haired manager wants a new build pushed out, and always at the same time he wants 5 seemingly critical defects fixed.  Using a tool like NAnt, MSBuild, or FinalBuilder can really help here.  You can configure these tools to perform the build and deployment steps for you.  Yes – you will have to spend a little time upfront configuring the tool.  Once you’ve set up how you want builds and deployments to operate, you are done.  Fire and forget!  If you want to be ubergeek cool, then add in a tool like CruiseControl.Net or FinalBuilder.  With these tools, you can have your system built, unit tested, and deployment to whatever environment you want whenever a change is made to your system.  The effort on your part to do this once configured – zero.   Go have some coffee and bask in your greatness!

I’ve been on projects where unit testing and automated builds and deployments were setup up when the project started, and I’ve been on projects were that was not the case.  The difference is amazing.  On the projects were the time was taken to set up the testing and automation, the teams were more productive and produced a much higher quality product.  Take the time to do the small things – they really do matter.