雖然他是以遊戲專案的觀點為論述，但我發現好的管理文章都有一個特點，就是他們其實在90%的內容上是適合套用在任何產業的。 這也是管理學有趣的地方，你能精通一個產業，你或許就能把大部分的經驗套用出去。 雖然其中的經驗必然有些要調整之處，但只要當事人戒慎恐懼，總是可以找到並調整成合適的做法。
What is a Schedule?
On many projects I've been told there is no schedule - either as a complaint ("We don't have a schedule!") or boast ("We don't have a schedule!"). But there is always a schedule, and you'll find out what it was when you don't meet it.
During an interview with a prospective client, I was told "we're not going to release this product until it's ready." Soon after I started working there, the president of the company called an all-hands "come to Jesus" company meeting, where he yelled at everyone for not having the product finished several months ago.
"We won't release the product until it's ready" - famous last words. Only well-funded and self-funded companies can really say it, mean it, and do it, and you usually hear this said after a product misses it's original release date. So how do you make schedules you can meet and meet the schedules that you make?
Before blathering on about effective project scheduling, let's be clear about the definition of a schedule. A schedule is an expectation of delivery dates - most importantly the product release, but also key demos, milestone deliveries to customers, promised interim release dates. Don't confuse the schedule with a glorified task list, a daily to-do list, or lines of code written per day.
The management of a startup company that was cruising in research and development was obviously getting restless, so I suggested we establish a schedule. This inspired the project manager to establish a day-to-day task list for each engineer during the next two weeks. When I clarified that I really meant "when do we have to have something you're going to show", upper management commiserated and then informed us that we had to show a demo to investors at the company launch party in a few weeks! The micromanagement list went out the window and we scrambled to implement the key features needed for demo. (We came close, but I can't say it was a success - we got the demo running just as the party was winding down, and the funding fell through.)
A project's life or death hinges on getting good demos in the premier trade shows, satisfying contractual deliveries to clients, and timely appearance on the market. The entire project revolves around these expectations, so the first job in scheduling is to figure out these expectations and make them and their assumptions explicit.
It's a Deadline, Not a Guideline
After understanding what a schedule is, the next important thing is to take it seriously. Know your schedule, and make sure everyone on your project knows it.
I was astounded on one project when casually mentioned our recent product release and a fellow engineer on the project didn't know what I was talking about. But I couldn't blame him for that head-in-the-sand mentality - our management would announce "stop coding, we're making a release today" and then justify it with "well, the beta release date was last week."
Any computer scientist should be able to tell you that constraints are a good thing when it comes to problem-solving - they narrow down what you can and can't do. Take advantage of the fixed milestones in your schedule, like trade shows. Milestones that you can't shuffle around in self-denial are useful, like the scale that won't lie about your weight.
Every missed deadline means the next one will be taken that much less seriously. And every project that runs overtime means the next project will start and end that much later.
In a surreal moment, just a few weeks before a product release, timed to coincide with the premier industry trade show, and right after I'd dissuaded the company president from demanding new features by pointing at the bug list, a well-intentioned marketing manager suggested to me "why don't we postpone the release by a month so you guys have more time to work on it?" Setting aside the trade show, which should have concerned him more than me, we had a supplementary feature release scheduled just three months after that, and then big upgrade a few months later. Delaying the release by a month would have just delayed all the other releases. And it wouldn't have saved us any work - we would just have been behind by one release month.
Stick with the schedule. There's always a next time, if you get this one done on time. And while delivering late is criminal, there's no sin in delivering early.
For some reason, even when given the option to either a) release the product early or b) take the extra time to test the product, management usually elects option c) squeeze in a new feature that jeopardizes the the product and the schedule. (In fairness, engineers are often complicit - "sure, it'll just take an afternoon"). The one time I've seen a product delivered early took place after the president of the company gave the development manager a fake release date. I can't imagine that working more than once, though.
It's Macro, Not Micro
When I shop for groceries, I know it's not going to take more than half an hour, and I'll spend about forty dollars (sixty, if I'm hungry). I know this because I've bought groceries before, and that's generally how long and how much it takes.
Now, if I plan my grocery expedition by listing all the items I think I'm going to buy, estimating the unit price of each item, and predicting how much time it will take to park the car, locate each item, stand in the checkout line, and unload each item, my schedule will be off by the time I reach the first aisle. It's unlikely that my predicted individual prices will be on the money, so to speak, but it would be a waste of time to recalculate my schedule every time I find an item and its actual price. Even if I have a detailed grocery list written down, I'm only committed to the items I really need (can't postpone getting that cat litter) - I may purchase additional items that happen to be on sale and omit items that turn out to be too expensive or are unavailable.
The same goes for project scheduling. Estimate project durations based on what you know of previous projects - that's where experience comes in, and that's a big reason why senior engineers should get paid more, if they've learned anything. Estimating project durations by summing up individual tasks only works if you've worked on exactly the same kind of project before and know every single task and possible schedule deviations that could happen in that type of project. In which case, you'd already know how long the total thing took, so why not use that, anyway?
I worked on one distributed simulation project where the manager's office wall was completely covered with a Microsoft Project schedule. I assume this included every task going into the project (and maybe tasks not going in). But this project actually had a very simple schedule - have the simulation ready for the exercise date in six months, or the exercise would proceed without us. Major milestones, like having the software components ready for integration, the network hardware up and running comfortably ahead of the exercise date, and even my security clearance so I could start work, took months longer than they should have. Yet we had our meetings where everyone reported that everything was going fine and more paper went on that scheduling wall. The final month of that project was an exercise in panic and triage.
Schedule the major milestones first - the final release, the beta and alpha releases, and the interim milestones like first QA release and trade show demos. These are your hard targets - everything else can, and will, be more malleable, as you find certain technologies are working out better than others, you have to deal with staff turnover, sick days and vacations. I personally don't feel it's useful to schedule tasks to a granularity smaller than a week, but regardless, don't let your micro-schedule drive your macro-schedule - tracking low-level tasks looks good on paper, but the feeling of control is illusory - it's no substitute for "macro" planning.
It's Not a Negotiation
I've worked with managers and clients who would ask for a time estimate on a task, and then respond to the estimate with "why should it take so long", or "can you get it done sooner?". There are several things wrong with this approach:
If you're taking issue with an estimate, that indicates you already had a preconception of what the estimate would be.
There's no reason to believe a revised estimate will be more reliable than the first one. On the contrary - it will probably be less valid.
Remember what a schedule is - a prediction. I have allowed myself in some cases to lowering time estimates in these "negotiations", but it didn't change how much time the task actually required. If, as a manager, you are asking for a lower time estimate, then you are saying the original estimate is wrong, and if you receive a revised prediction, whether it's more or less to your liking, you should ask yourself why the revision is more believable than the original prediction.
Likewise, as a client, you may want to bargain down on price, but bargaining down the time estimate will just backfire on you - the project will take as long as it takes.
That doesn't mean you cannot shorten the time for a project, but that means making reasoned tradeoff in features or resources. The right question to ask is "What can we do to get this project done earlier"
I used to have a terrible punctuality problem when I lived in Boston. Whenever an appointment time came around, I would tell myself I just need, say, fifteen minutes to drive down Memorial Drive along the Charles River to make a meeting around MIT. Invariably, after giving myself that fifteen minutes, I would still get started late, get bogged down in Boston traffic (sometimes I forgot to factor in the rush hour impedance). And then there was the time spent getting lost, if it was an unfamiliar meeting place, finding parking (certainly a high risk factor in Boston), and navigating the destination office building.
This planning could be charitably called "best-case" planning, but I think everyone would agree it's a stupid way to schedule, especially after missing more than one meeting (including job interviews) by a wide margin. Nowadays, I'm much better at this - partly because I moved to California, but also because I do take in account how long these trips usually take, and I give myself some extra time in case traffic is slow or I have to stop for gas.
Software projects should be scheduled the same way. Look at how long it's taken your group to do similar projects and add some safety time to take in account things that might happen. You don't necessarily have to take in account worst-case scenarios - I don't factor in potential three-hour freeway stoppages when I plan my outings, but they do happen once in a while. But do consider carefully how much risk is acceptible, a question that is de rigeur in other aspects of engineering.
The First Schedule is Always Right
One consequence of making a distinction between the macro schedule and micro schedule is sticking to the initial macro schedule. The schedule you set down at the beginning of a project is most likely the correct schedule - you're basing the delivery date on market considerations, expected budget, staffing and technology capability, and the beta, alpha and interim milestones all fall from that. At this point, you're most free of wishful thinking influences - the schedule should be consistent with your experience from your own projects and others that this is a feasible schedule. Some things will take longer than expected, some shorter, but you'll arrive at the expected time.
Three months into a a one year development schedule to port a 3D graphics application from Unix to Windows, I suffered several bouts of unwarranted optimism. The user interface system was basically up and running, and I told my boss I thought at this rate, I'd have the project done six months earlier. Fortunately, he didn't tell anyone. With Windows idiosyncracies, graphics card issues, tracking ongoing changes from the Unix product line, and battling a compiler that was also in a "pre-alpha" stage, it wasn't long before it was obvious we were exactly where the originally schedule said we'd be.
But no good deed goes unpunished. Once it appears your project won't be a disaster, everyone who was keeping a healthy distance away will suddenly show up to "help".
Ten months into a year-long crunch project, at the beginning of which it was wisely decided to pare features to enable a release by the next industry show, my boss suddenly wanted to put those features back in. He went around me (he knew what I would say) and asked some of the more optimistic and eager-to-please engineers to put in the features. After several days effort, I put my foot down and explained we already had a hundred and fifty bugs marked by QA as critical, and we could not afford the time to put in new features. "Oh, I didn't know we had so many bugs," was his lame acquiescence.
On a game project at a different company, the president tried to accerate the project by promising game delivery two months ahead of schedule. It seemed like things were going well, and finishing this project early would have let us get started on the next game, so I agreed, but once again, I was wrong. When we reached the revised deadline, we were just starting find all the bugs that had to be fixed, including extensive requirements by the console makers, whose approval we needed to distribute the game.
So we went back to the original schedule, but during the last week, once again, the president tried to advance the submission date by a couple of days. And once again, we didn't make it. Worse, for every attempt to finish early, there was an extra flurry of activity, extra builds and late nights, that were essentially wasted our energy and sapped the momentum of the team. When you're taking catnaps in your parked car during the day, you're probably not producing quality work (especially if you own a compact car)
There will always be at least one point in the project where it seems like things are going better than expected. It's not. If the project actually gets done early (but it won't), then ship it, and if you want to maximize the chances of that happening (but it won't), then focus on getting those requirements done and avoid other distractions, like additional features.
by Philip Chu
Original Artical http://www.technicat.com/writing/schedule.html