Efficient Software Project Management at its Roots
Clarity from the start
Milestones that are directional
Transparency on an ongoing basis
Dependency and Risk Management in a pragmatic way
A common tool I see used is via a project kickoff with all stakeholders present and involved.
Given this is an expensive meeting, the person leading the meeting typically prepares an overview about the background ("why"), goals ("what") suggested approach ("how") and end state. Showing off designs or other visuals is a great thing at this stage in order to get through to people who are more visual than textual types.
"Does everyone understand why we are doing this project, how we will get there and what your role will be to help? Raise your hand if the answer is "no" or "maybe" to any of these."
However, people are teams are often late to admit to stakeholders when they come across trouble that they cannot fully mitigate.
A very simple tool I see help in creating this transparency is having a regular, no-BS update on where the team really is.
All team members are part in delivering/writing this update. This serves as a continuous reality check on what is actually happening, close to where the real work is going on: the engineers themselves.
In a team where everyone is aware of how good (or bad) things are going, people will pick up work that can help the team the most.
A lot of business stakeholders don't have much understanding or appreciation of what is easy or hard about software development. By exposing them to more granular details and helping them understand what tradeoffs the team is continuously making helps build empathy and more realistic expectations on both ends.
poor dependency management
This is a symptom of poor risk management.
People practicing things like Scrum or Kanban to also think a lot less of these areas and don't do it early enough.
Discovery. Figure out who your dependencies are and what they need to do.
Agreement. Talk to them and agree what they will do and by when.
Check-in before the due date. For teams that you don't have a good track record working with, do more frequent check-ins, to make sure they are on track.
Give feedback and/or escalate. Once the work is complete, give feedback. If your dependent team did a great job, call this out clearly. If they did not do a good job, consider understanding why. If they are really late, consider escalating earlier, rather than later.
For risk management, have a culture that rewards raising concerns early on and be pragmatic in tradeoffs to mitigate risk.
So when they come across a problem, they see a challenge to solve, not a potential delay to the project.
To tackle this, create a culture of talking about interesting challenges coming up on a day to day basis. Start rewarding people who flag things that might take longer to do and bring tradeoffs to the table.
Whenever risk comes up, consider reacting to it ahead of time.
When we eventually do get things done, looking back and figuring out where we can do better next time is a key part of individual and team growth. And of course, celebrating a big achievement
This last step really helps build a cohesive team who will be ready and hungry to deliver on the next, more complex project, in a way even better than this last one.