This is harder than it sounds. I’m thinking about this topic because I’m the manager of a software product team. I’m responsible for the product’s health and speedy delivery. Because of that, I need to steer the team in the direction with the shortest path to the finish line. Some of the things I’m focusing on are as follows:
Part 1: Eliminate Waste
I think there is merit in the “Lean” notion of software development. Earlier in my career, I worked for Dell, Inc. as a software developer. At the time I was pretty pleased to be working for the worlds largest computer manufacturer, but being there taught me a lot about waste and how to indulge in it. I’m sure other large companies have these problems, but I observed so much waste, it hurt my morale. All the talk about “work smarter, not harder” was hard to apply inside the work culture. Mechanical tasks were being done by humans, and manual tasks often had to be repeated several times. I remember spending days working on items that our business partners were never able to benefit from.
Logically, if we eliminate waste, all that will be left will be tactical and strategic tasks that have a direct impact on the business. In software, what things could be waste? Manual tasks: database migrations, build delivery, pre-production software installations, manual refactoring (without the aid of a smart IDE), typing code instead of generating it, reporting status, slow communication, etc.
Database migration
This screams to be automated. Perhaps there are some testing databases with realistic data preloaded. Suppose these are used for reviewing an incremental release to stakeholders. After the stakeholders are finished reviewing the current build, they will have changed the data in the database, and over time it won’t be so realistic. For every build review, it’d be nice to have that realistic database back, so we restore it from backup, detach/attach, etc to get a fresh database for the stakeholders. The key is to not spend human time on such a task. This task is repeated every 1 to 2 weeks. Human time is often the most expensive part of software development. A quick batch script could easily automate the refresh of this database and free up human time for more critical thinking.
Build delivery
To demonstrate the incremental build, how do we install it? Who builds it? Does a “build master” build it in release mode? Why should a human have anything to do with this mundane task. CCNet and NAnt are more than capable of building and delivery the software package in a zip file. Extract the zip file on the demo machine and run. Again, this type of activity is not worthy of human attention. Make the machine work.
Pre-production software installations
All software is different. Some have client components, server components, distributed components. Mature software teams have environments set up for testing. These environments are for testing an incremental build. How does the incremental build get installed? If there are multiple servers with distributed services, who sets it all up. I don’t mean to sound like a broken record, but this task doesn’t require critical thinking. Leave it to the machine to deploy to the testing environment. The task that requires some thought is putting together the deployment script for the machine to run. Invest some time in an install script using NAnt, MSBuild or good old DOS commands, and then you can turn it over to a machine to reliably perform over and over again. In fact, would your testers appreciate a command to run any time they are ready for the next build? Why not have it in 2 minutes rather than scheduling an environment refresh?
Manual refactoring
If you’ve read any of the other posts on my blog, you see that I’m a fan of tools. I especially love Resharper because of all the time it saves me. I remember not using it to. I remember renaming a public property and then using CTRL+SHIFT+F to do a solution string search for the property. For a popular property, this might take a few minutes. With Resharper, it is sub-second. That’s right. No more search and replace. Looking back, why did it take me so long to demand a better tool? What about pulling a method from a concrete class up to an interface? I’d never do it manually now when a tool can do it with a few keystrokes. Again, it’s trading human time for cheaper (and faster) machine time.
Typing code instead of generating it
I’m not talking about software generators. I’m talking about micro-generation. If I need a class with 3 fields, a constructor, and some properties, I can type every character, and I have in the past. It is much quicker to allow a tool to do it for me. Resharper as well as CodeRush make use of micro-generation to throw in standard constructors, properties, and they do standard code completion too. In fact, I let Resharper name my variables for me. It guesses so well that I have very descriptive variable names after only hitting 4 keys.
Reporting status
This can take quite a bit of time. Often a stakeholder or project manager interrupts developers to inquire on status. There is no need for this. The software team already tracks status somewhere, whether it be in an excel spreadsheet, on a whiteboard or a storywall. Wherever status is available, just make it more broadly available. Welcome your stakeholders to take frequent looks at it. There is no need for in-person interruption just for status.
Slow communication
Manual gather of status is a form of slow communication. I’ll throw out a tip on how to slow down communication if it happens too quickly at your company. </tongueInCheek> Give every member of the software team their own offices and make sure all conference rooms are scarce resources and hard to book. In fact, location members of the software team in different parts of the building, or maybe in a different time zone. That should slow down communication sufficiently. Slow communication will slow the production of software. This is a form of waste. Waiting for the answer to a question is wasteful. To eliminate this, locate all members of the team in the same room without physical barriers. Product managers too. This will foster instant communication.
Conclusion
Eliminating waste is key to a productive team. Identifying waste takes some critical thought, though. Some teams are so busy with wasteful tasks that they can’t slow down to think about remedies.
[tags: software, lean, eliminatewaste, tools, productivity]