...which is exactly why it's so hard.
Business Guy asks for some feature X. Programmer starts implementing X. But before he's done, Business Guy comes back and says, "Hey, why don't you throw Y in there too. I mean, it won't be that hard, right?"
Later during the demo of features X and Y, manager watches and then says, "That's not exactly what I had in mind for Y. Also, we really need Z in there too."
If you could freeze the requirements imposed on a piece of software, like you can for a bridge or a power plant, then the programmers could finish those features. But the temptation to slip in new features is too great, because "Hey, it's easy, right?"
The best defense against this "feature creep" phenomenon is to have a visual metric that shows not just the progress toward the release goal, but also how the release goal grows in size with time. (A scrum burn-down chart is one good example of this). The chart communicates to all involved that new features (or revisions to existing features) don't come for free.