Let’s build Product, not Software - Part 2
In the previous post, I have shown you a real example about how to solve the problem as a Software Engineer. This time, we gonna do it by the Product Engineer approach.
Make Agile great again!
If you refer to the first post that I wrote, Building Product is about delivering user values, collecting feedbacks and constantly adapting to the change of business. Does it sound like Agile? Yes, in my opinion, Agile seems to be the best fit out there for Product company at a small and medium size.
Don’t do this
Let’s start with the non-Agile way by this picture-by-picture story
When you put this into a Software perspective, it’s pretty much the same with the first example that I showed in my previous post. The way most people would choose is to implement the whole feature, from backend to frontend before delivering to the customer. Again, do NOT do this.
but use this Incremental Delivery model
How about taking 1 parcel at a time? Begin with the most valuable one and repeat until you’re done?
Does it feel repetitive? Yes, but it’s less risky because it’s much simpler for you to implement. You can ship the values continuously, collecting the feedbacks from your customers. When there are any problems, you can quickly change the route (the approach). Sometimes, you can even throw away the unnecessary features based on the feedbacks. By starting with the most valuable ones, you also focus on resolving 80% of the problem using 20% of the effort, gain the most revenue for the company.
The Agile way | The old way |
---|---|
Deliver values continuously | Wait until the end to see the result |
Keep Customers in a feedback loop | Cannot give feedbacks until very late |
Less multi-tasking | Many features at once |
Less big work, easier to refactor | Hard to make it smaller |
Can throw away unnecessary features | Don’t know what to throw until the end |
Start from User Values
Ok. If all the above sound so theoretical, how about taking the Integration project that I mentioned in part 2 of this series and do it the Agile way?
Instead of defining the tickets/milestones based on the code implementation, try re-writing the Acceptance Criteria following this format
- As a user (a staff, a system admin,...), I want...
- (Optional) so that I can solve (don't have to, be able to,...) ...
- As a user of XXX, I want to be able to log in to Shopify from XXX so I can verify that the credentials are correct.
- As a user of XXX, I want my order to be synced to XXX when it is placed on Shopify.
- As a user of XXX, I want my order to be updated in XXX when it is changed on Shopify.
- As a user of XXX, I want my fulfillment information to be reflected in XXX when I mark the order as fulfilled on Shopify.
then come up with the implementation
For instance, you have this AC from the above
As a user of XXX, I want my order to be synced to XXX when it is placed on Shopify.
you will then define the steps to execute it
- Set up the webhook endpoint to handle
OrderCreated
event from Shopify. - Configure Shopify to send updated data to the new webhook endpoint.
- Implement the mapping logic to map from Shopify sales order to XXX sales order schema.
- Add a new API to get list of orders (very basic information).
- Design a simple UI so the user can verify the information.
We should try to make this as simple and as achievable as possible. This ticket should not target on building a beautiful UI. It should follows exactly the pre-defined AC and provide a very simple UI to verify the data only. After that, there should be another ticket to enhance the UI.
Defining User Value rules
Here are some rules for you to follow to ensure that the project will be on the right track
- Usually, you still need a scaffolding phase in the beginning.
- Again, be agile, try to make it as small as possible. Don’t try to be perfect!
- A User value isn’t necessarily a big and complete feature.
- If it’s still too big, split it until it’s small enough for an
S
,M
or maximumL
estimate. Never createXL
+ ticket
- If it’s still too big, split it until it’s small enough for an
- However, a User value/ticket should be a complete flow, frontend to backend
- That means the Users can use it
- Be clear about the target users and decide whether this feature is necessary for that target users.
- A clear definition of Done
- Done is when the feature flows all the way to Production and is shipped to the user. You don’t have to come back anymore
- Do NOT include future work.
- Prioritization: be 80-20, highest value with smallest effort first.
To be continued
More real world examples…