The real complexity in our jobs is that all planning is done under conditions of uncertainty and ignorance. The code isn't the only think that changes. Schedules slip. New milestones are added for new features. Features are cut from the release. During development, everyone - marketers, developers and testers - comes to understand better what the product is really for.