What makes a good engineering task?

The Ask:
I am an engineer. I really like to solve problems. To do that, I like to know as much as I can about the problem. I think a lot of engineers really feel the same way, but it can be hard sometimes to gather all the information you need to create a good solution to the problem.
Recently I have been thinking a lot about what I would love to have in an engineering task. A really effective task is one that gives the engineer a strong base to start with, and hopefully most of what they need to dig into and execute a task.
The Approach:
In an ideal situation a good team is comprised of an engineer, a user experience or design team member and project manager or stakeholder. Preferably, each team meets quickly and often to:
- Define the problem
- Think through solutions
- Agree to a proposed solution
Once the problem is clearly defined, you can work toward finding a solution.
On thinking about the solution:
1. Define the happy path and error case(s)
— What should happen?
— What if something goes wrong?
2. Run through alternative flows
— What happens if a user of X type visits this page?
— When a user enters an invalid state, should X happen?
3. Discover the known unknowns
— What information is missing?
— Is there documentation of this feature?
Once the solution is agreed on, it is time to nail down some of the requirements. This is a key phase that lays down a strong grounding for the engineers to estimate and deliver the feature.
The Output:
Existing behavior:
- Links to the pages that will be affected, alternatively screenshots can help here as well.
- A strong description of the current behavior is a great.
- Clear definition of user types and how they are affected.
Desired behavior :
- List of the pages you want the new behavior on
- Wireframes for user experience flow
- Comps for detailed visual treatment
- Detailed account of the assumed behavior
- Detailed user stories covering each role
- A clear solution for out what happens if there is an error
The Conclusion:
Teams should be able to follow the approach outlined above before starting work on all features, but even just making a template for all the aspects of the work can help a team fill in the gaps and keep them communicating with each other. Producing clear, executable specifications is a huge help to getting work done and stronger communication builds stronger teams.
