So, what if it’d already been raining for 5 days and suddenly the booming voice of God came down and said “Noah, I want you to build me an Ark.” I’m sure Noah would have been thinking (if not saying), “What the heck!? Day 1, I was up to my ankles. By day two, I was waist deep. It’s now day 5 and I finally can’t touch bottom anymore! I’m treading water here and now you tell me to build a boat!?”
It’s a likely reaction in the software development world too. At least one organization that I came into was in exactly this predicament. Years of poor software development practices and a sudden massive turnover (100% of the team in less than 6 months) had left the team with their heads barely above water.
Each morning, calls would come in the from the help desk and 4 or more of us would be downstairs on calls with various people trying to get their systems back up and running. It was a never ending cycle of put out fires, build more poor quality software which caused more bugs which caused more calls to come in. We were drowning. And the reaction of most of the members of the team was to simply try treading water faster.
It was in this case that despite Noah being almost over his head in water that God would have been right. Regardless of how he got there, Noah wasn’t going to survive if he continued to tread water. And neither was our team.
That’s when it became clear to me that building a boat (metaphorically speaking) was the only thing to do. Frankly, it wasn’t worth me running down to the help desk to take phone calls anymore because we weren’t getting anywhere. So I stopped – or at least I moved more slowly. That’s right – I decided it was high time to ignore the phone calls. Sure, the critical “I can’t do business at my location” had to be dealt with, but no longer was I dealing with the “half my systems aren’t working” calls.
Step 1, build a frame. We had a help desk for a reason – to answer calls and resolve issues. If we were down there answering the issues, what did we need the help desk for? The foundation of a good software development organization is software that can be supported by someone else. If you’re supporting your software – then you aren’t developing new stuff. So, I started by building better checklists and strategies for the help desk. Now, understand this – people who are not trained to understand software are not going to debug why your client/server application is crashing. However, if you can identify common fixes that they can perform safely, you should. My personal philosophy on this one was to use a sledgehammer to crack a nut. Sure, it’s overkill, but it works. And the same applies for supporting software. If I gave the techs tools that might work to fix the problem, but they’d have to try several options then it would waste their time (and consequently mine). So instead, if rebuilding the boot images would work for 60% of all the issues experienced in the field, then so be it. That became standard behavior. I will say, that this would come back to bite me a bit in the future. Turns out that techs will attempt to apply any technique they know to even situations where it’s pointless. That said, because rebuilding the boot images was safe, I didn’t really care. They weren’t doing harm, but it did take some retraining to get them out of the habit of trying the same trick for everything. By this point, it isn’t a boat but at least it frees up some of my time to make it more like one.
Step 2, siding. Once we had the techs doing their own jobs on more tasks than they used to be able to we had a teensy bit of breathing room. Imagine the team now clinging to our wood frame floating in the water. We’re still cold and wet, but at least I can stop treading and just hang on. So, where to go next with my software development team? Well, there were all the bugs in the software, so we could clean up the code, but I didn’t think this was a good idea. Every time someone created new software for the field they were creating bugs. So, while I could clear the queue of defects out with some concerted effort the bugs would just be back. Siding is the real purpose of the boat after all - to keep the water out.
I created a development process for my team. No need for anything fancy. We had nothing, remember. It was a basic analysis->design->code->test model. I knew I’d have a revolt if we went too documentation heavy, so for starters I combined analysis and design into a single document. You had to be able to convince one of your peers that you knew what you were talking about when you did the analysis and design. Design included test case creation so that hopefully the developers would test their own stuff and so that when we did integration testing we had tests to execute.
I introduced proper source control. We used to save the software out on the network drives; people overwrote each other’s stuff. It sucked. If there was one thing that could have been done for any team it would be introduce source control if they don’t have it.
That’s it. A basic analysis & design template, peer review of the A&D, peer review of the code and a test plan. It wasn’t long before the releases going into QA were better. We started getting releases through QA in 30 days instead of 60 days. There were still tons of bugs in the code but the queue wasn’t growing anymore.
Step 3, oars and a place to sit. We are not talking about a fancy boat at this point. It doesn’t move at all – no power system and it was leaking water. Frankly, we had to get moving. Prioritize and fix bugs was the next step. Now, you’re probably thinking that we should fix bugs based on business criticality. I disagree. I prioritized bugs based on how annoying they were to our team. If I constantly got called by the help desk because there was an issue that came up over and over, that’s what I wanted fixed. It might have been important to the business as well, but I never asked. If we were going to leave our old life behind then we needed to get away from those things that drag us down. Having to recreate upload files from the raw data, for example, is annoying to us but doesn’t bother the business any. They had no clue we were doing it. So that’s where I went next with the team. Now that the help desk could handle the bulk of the calls and the defect backlog wasn’t still growing we could focus on getting us to the place where we should be. I wanted to put our life with the help desk far behind us, and the only way I was going to get there would be to put them (and myself) out of a job.
Step 4, stop bailing water. When I finally looked around I noticed that despite us rowing slowly in the right direction that we were taking on a lot of water. It took just a little bit of poking around to see why. There were people who worked for me who “liked” treading water and wanted desperately to go back to that way of life. I discovered that one of my team was drilling holes in the siding while the rest of us were trying to row.
The great thing about being the manager is that change management is “easy” for your team. You just tell them to do something new and they do it, right? Well, I wish. Most of my team embraced our new found mobility, but some people don’t change easily. The familiarity of the cold, cold water draws people back for some reason. And so it did with one of my own employees. I tried coaxing him, pleading, yelling (bad managerial style, but after a while I was pissed) and finally resorted to working on terminating. Yup, I was leading him to a makeshift gang plank I had on my boat. I would be damned if one employee was going to destroy all the change I made. Happily, about halfway down the gang plank he realized he’d rather be on the boat than back in the water and got in line. You hate to have to push someone that far, but sometimes you have to do it. In a bigger organization the use of reviews / raises would be a decent tool. Too bad more organizations don’t look at process compliance as important.
Step 5, sails and a dagger board. In sailing, a dagger board is designed to keep the boat from being pushed sideways in the wind. It helps keep the boat on a straight path despite being pushed by a crosswind. In the software development world, it was a bit like an autopilot. I couldn’t steer the boat but at least it didn’t go as the wind blows. I researched, recommended and purchased a workflow management tool. I don’t usually do shameless pitches – but MKS’s Software Integrity and Integrity Manager are great products! We reviewed IBM’s Clearcase and Clearquest, Serena’s TeamTrack, and MKS’s Integrity Manager and Software Integrity. At the time, MKS’s software was far superior to the rest of the competition in almost every aspect. Serena’s was prettier looking, but that’s hardly much of selling point. For some reason Mercury’s ITG suite didn’t make our list, though now that I’ve used it in a later life, I’m glad.
At any rate, the point of a workflow management system was to get us on autopilot with our process. Yes, prior to all this we did it entirely on paper. It’s really annoying as a manger to have to review the contents of every release and all the paper checklists to see if they were all done. But that’s how I discovered that I had a person drilling holes in my ship. I’m not convinced that automation would have been a good thing before I understood our development process, but now that I had it down, I needed to free myself up to steer the ship. Frankly, the developers were happy to have the automation too. They hated printing things out as much as I hated reviewing them.
Step 6, a steering wheel. Finally we had stability and the life we once led was a fading memory. We heard from the help desk less and less every day. By the end of my tenure, I talked to the help desk once every two months or so instead of several times a day. QA was on record that my team produced the best software of any team in the entire department. What was there left to do? Be better, that’s what. Now, at the time I didn’t have any Six Sigma training. I’m pretty positive you don’t need to be successful, but a data driven approach doesn’t hurt. My decision was to implement post-mortems. At the end of every release, I reviewed every defect QA found, looked at common causes and made careful decisions to change one thing at a time. Regardless of what happened in a single release, if I didn’t detect a pattern of behavior, I didn’t change anything. It would take quite a few releases before I’d make a tweak. Changes were usually minor, like adding items to our review checklists.
The biggest change I made was to separate analysis and design into two documents. Why? Because although people were now figuring out what the right solutions were most of the time, they never considered alternative approaches. By separating the two documents I could wrap up analysis with just design proposals – very high level suggestions on how to deal with key issues. It gave some foresight into the design and allowed me to redirect people before they had spent too much time on a design that I didn’t like.
I should note that a lot of people never do proper analysis. They’ll often do a “high level design” and then a “detailed design”. Don’t do it! Understand that analysis should solely be for the purpose of understanding the situation you are in, not to decide on solutions. You have to get people to think about the state of the world before you go and change it. Yes, I insisted on proposals at the end of analysis (because you wanted to make sure they were going to go down the right path based on their conclusions), but the “solution” was 3-4 sentences about what the developer was going to do next.
Step 7, land-ho! Sadly, by the time we’d gotten to where we were it was time to get off the boat. I moved on to a new company, but I came back to check out my ship not that long ago. 2 years after I left the organization they still do software development almost exactly as I left it. I were a few cracks showing, but they could be patched up with a good steward of the process. It is true that even a good process will go bad after time; processes need adapting to the changing world.
But how I built up my ship is not nearly as important as how I got started. More important than anything else was the decision to do the hard thing and build a ship instead of treading water. We could have easily stayed on the path that we were on long ago and the team would still be there today. So, when it seems like you’re drowning, despite being counter intuitive, you now know what the right thing to do is.