Hands on in All Phases
Each project is different, each one is special. And still, my experience is that there is no more significant factor to project success, than programmers who have previously worked in successful projects. It seems that there are skills to learn while joining successful projects, that you just cannot learn elsewhere. Among them are those human factors like communication and attitude, at least those that one can learn somehow.
Now, project success is created in each single phase of the project. It is easy to know that a project can be doomed while it is still in acquisition or in definition. But it is hard to know how this can be influenced, and what to do there. And it is even harder to know what you can do about doom factors that you spot lateron. Furthermore, before the software is ready, the project is not finished. Again, it is easy to know that a project may fail almost touching the finishing line. The hard part is knowing the difference between the finishing line, and almost the finishing line. And what to do to bridge this gap.
Actually, there are books and courses on all these topics. Reading them, attending them you will learn a lot, gain great insights, and you will be able to speak fluently about any projects potential. Still, there is a difference between experience, and reading.
So here is the career advice. Attend successful projects.
Join projects in whatever phase, and strive to make them successful. Take care that while you see more projects, that you actively join each phase at least once.
If you happen to join a team or company that fails to complete projects, leave. Not as quickly as possible - you might contribute to success, after all, and there is also a lot of learning in failure (1). But you need your opportunity to join a successful project, and to join each phase of a successful project.
(1) "There is no success like failure, and a failure is no success at all". Bob Dylan, Love minus zero - no limits.