We find that often the only way to determine the timetable for a project is by gaining experience on that same project. This needn’t be a paradox if you practice incremental development, repeating the following steps with very thin slices of functionality: Check requirements Analyze risk (and prioritize riskiest items earlier) Design, implement, integrate Validate with the users