Some of the key reasons:
- Individual components simple but integration of the components hard (50+ dependency layers)
- Long approval process for each change (too many cooks in the waterfall kitchen)
- Windows coders only producing 1,000 lines of code per year (average)
- Culture of slipping. Nobody wants to hear how long something will actually take to do.