There's also the problem of of a company working on multiple construction sites in parallel.
In software engineering, this also happens of course, especially if you develop in house. And you also need to factor in the maintenance, as it's usually performed by the same team.
Everything that's below the ground is hard to predict, because you seldom know exactly what's in the ground.
Once your construction has progressed above ground, it's somewhat more predictable.
(But delays are still possible.)