Programmers, to be able to build features, need to gather and understand requirements.
To be able to do that effectively, they need to understand the users’ needs. If they skip this, and go straight to coding, there is a chance that the message will get misinterpreted, and that a wrong thing will be built.
At the same time, before they start coding, they need to use their technical knowledge of the system to determine the feasibility of the proposed requirement. Sometimes, the request is impossible to implement, or it can have serious performance implications.
Sometimes, the developer will propose a better, more efficient solution, that the client didn’t think of. To be able to do this, the developer needs to be up-to-date and able to see the big picture.
What this means, in terms of planning, is that the developers should always be provided with sufficient time to clarify, refine and finalize requirements.
What this means for developers is that, the more effort they put in up front, during the planning and requirement gathering phase, the less surprises there will be down the road.