I have been a software engineering project manager for eleven years now, and it still amazes me how painful it is and how long it takes to finish up that ‘last percent’ of the work!
“That doesn’t make any sense” you say? Or perhaps you think the last percent of work should not be any different from any other part of the work?
Following that logic, our 20,000ish hour development effort should take a couple hundred hours for the last one percent to be finished. The reality is we have burned five hundred or so hours and counting. The light at the end of the tunnel is in sight but we are crawling toward it instead of running!
There are a number of reasons for that last percent of work taking such a disproportionate amount of effort to finish off.
A big part of it is the developer’s succumbing to human nature and the project manager letting such a thing happen…because it seems harmless when you consider the decisions one by one. What I am referring to is most people’s tendency to go for the ‘easy kills’ when assigned a number of tasks. We do that because we like the feeling of success and forward progress we get when we finish a task. In organizations where there is performance evaluation based on completing tasks and having quality assurance sign off on them, going for the easy kills is sometimes an act of survival, i.e. the system makes you do it, regardless of whether you want to or not.
The project manager’s part of this is either not assigning a priority to the tasks to ensure that things get done in a particular order regardless of their relative difficulty OR in letting it slide when some of the developers skip the hard stuff. My sin is usually the second type.
Another material contributor to the hours spent finishing the last percent of work is dealing with more ripple effects than usual. Once your application is basically completely built, any change you make has a higher probability of affecting more code–much more in both respects than when you are first starting to build the application.
LATE STAGE REQUIREMENTS CHANGES
In the same light, requirements changes that are introduced at the end of the job have a higher probability of affecting more code.
DEALING WITH IT
So now we know how we got to this painful stage, how do we get through it?
This first thing is to manage the expectations of all the stakeholders. Let them know that the task list is much shortened from before but that the items left are difficult and risky. Let any of those who are asking for requirements changes know the full potential impact of their requested change & suggest, where feasible, that the change would be best left until after the first version of the product is tested and released.
The second thing is to maintain the development team’s morale. Grinding through the tough tasks and dealing with ripple effects is going to be stressful, especially for those who either need or are used to frequent gratification from completing easier tasks. Congratulate each developer for the small gains that will be made as they happen. Keep the team updated about progress that is being made.
Finally, stay positive and stay focused! Your clients on the one side and development team on the other will sense any fear or negativity you feel–and it will adversely affect their attitude. Celebrate progress made, however glacial. You need to keep your focus, the clients’ focus, and the development team’s focus all squarely on completing the product. You will need to be strong in resisting any changes that are not absolutely necessary, whether proposed by the client or by your development team. In this light, you need to be prepared to re-evaluate the inclusion of any functions that are causing major problems. If feasible, delay a troublesome function for later in order to expedite the completion of the release.
OK, so you and your team pushed through the resistance and finished the release. Can you avoid making the ‘last percent’ so painful on the next project? Well, you won’t be able to get rid of all the nasty nuances tied to the last percent of work, but much of it can be managed away.
Ensure that your developer performance evaluation and task tracking system are sensitive to task difficulty and priority. Do this by assigning higher completion credit to difficult issues & assigning an exact relative priority to each task. The completion priorities must be enforced throughout the project, otherwise the tough items will pile up for late in the project.
Throughout the project, carefully evaluate any change requests, whether from clients or the development team, for the degree of ripple effect and for how truly immediate they need to be. Change requests that can reasonably delayed to a future release should all be delayed. Ones that cannot be delayed will need to have their time required, including dealing with ripple effect and added quality assurance time, push the project completion date forward commensurately.
Until next time for more software engineering ramblings,
Dean Whitford, B.Comm
Chief Operating Officer