when I started as a trainee dev I was paired with a more experienced dev on my first project and one of the things he was fond of saying was our first role was to challenge the need to build anything at all. This had a significant impact on the project by identifying quite a lot of features that the requirements document had classed as necessary but the users and managers who would use the system confirmed tat they were nice to haves and would not be needed for at least 18-24 months as the functionality that was needed for them to be useful was not built. 2 years later and the functionality has still not been built and it has no time frame for making it into production. Cutting out those jobs early on saved a lot of hassle, time and money and I have carried that thought process with me as we go.
Yes, that is one of the main things for everyone building something be it a bridge or a computer program. Your job is to outline what the customer realy needs, not what fancy words came up on the radio last night. :-)
This is what you do in many agile methodologies. Have the stakeholder rank their stories, understanding that it's a queue you will pull from. They're free to rank them however they want (so 'urgency' doesn't need to be defined; it's entirely on them to subjectively figure things out). As a dev, you just pull from the top.
This doesn't, however, help reduce waste in the same way that pushing back and questioning the need of each story. Oftentimes the stakeholder will think "this thing is super important", without realizing its functionality is unnecessary, or is already in place if you just do some simpler or better thing, or will be useless without some other story done first (that isn't ranked higher). You need to help point these things out.
A real life example I can give is on a project I had in the past, where we were replacing an existing software solution. The customer was adamant that they needed to be able to specify what piece of hardware a job was run on. They were used to the way the existing system worked, where that was the only way you could keep track of where the job was, to see its status, cancel it, etc ("I put it on machine #44, so let me scroll down to machine #44 and see the job"). We wanted instead to just automatically assign the jobs for them, and provide them a search and filter (which they already wanted and had ranked highly), to be able to select, say, just the jobs they had created, that sort of thing. No matter how we tried to explain it, they didn't see that the latter would completely supplant the former, so why do the former. We ended up doing both; they ended up never specifying the piece of hardware. Other places on that project they -did- listen to us, but that one sticks out in my head the most because they didn't.
> Why not just sort the list of requirements according to urgency?
This is a noble idea except that there is more than a dozen ways which "urgency" can be measured. Do you measure by its deadline, where the requirement is sourced, its dependencies etc.
it ended up as an agile project so this is pretty much what we did, these jobs ended up being classed as 'nice to haves' and the groundwork laid down for full implementation if the rest of the business ever got their ass in gear.
Do we really need to do it?