Imagine that you are the CEO at a technology company. How do you decide what your software developers should be working on?
As you know the most about the company, you and your senior leadership team are best placed to figure out the solution. You start with the most pressing problem, and then decide on how to fix it. Maybe your key problem is that customer churn is too high, and your solution is to build a new email notification system. You then give your solution to the product team, who thoroughly spec out the solution before passing it on to your developers. The developers complete the task as requested, but something seems wrong. It takes much longer than you expected.
It turns out that if you gave the developers the problem you were trying to solve instead of your solution, you would have gotten a very different result. They would have told you that they could get text notifications working really quickly thanks to some previous work done. Working on this instead of email notifications also allows them to improve that previous work, increasing code quality and keeping the codebase leaner. This will allow them to develop new solutions even faster.
If you want to have something built, give your developers features to build. If you want the best solution built, give your developers problems to solve. 1
This post was heavily inspired by this interview with Jeff Lawson of Twilio.