Let's start with the obvious: there's a known Parkinson's syndrome - work takes up all the time she has. That is, if a programmer is given a week for a two-day task - he will do it all week. Of course, the two-day task will not take a month, but nevertheless.
The consequence is the effect of straightening the deadlines. This is when the programmer multiplies the terms by two to have time to debug the bugs, the manager also makes a reserve, and the customer on the contrary - cuts the terms as he can. As a result, the number of agreed deadlines depends on the compromise of the parties, not the real complexity of the task.
How to treat? To divide a project in a queue, inside the queues - tasks no more than for 1-2 working days. When building the queues, look at the dependency at once (after which block the current one can be made). In the nesting - an example of such a diagram.
Additional bonus: by the example of such a queue, you can reflect the current progress of the project, painting in yellow what is submitted to the acceptance, and in green - accepted. Much clearer than a simple list.