Skip to content

Instantly share code, notes, and snippets.

@timhwang21
Last active August 2, 2023 16:43
Show Gist options
  • Save timhwang21/b4f42e72cfaf45543b114bae2b2d09e0 to your computer and use it in GitHub Desktop.
Save timhwang21/b4f42e72cfaf45543b114bae2b2d09e0 to your computer and use it in GitHub Desktop.
Making Tickets Actionable

Making Tickets Actionable

Tim Hwang


Roles in Product Development

  • PM identifies πŸ”Ž user requirements
  • UX designs 🎨 them
  • Dev implements πŸ”§ them

(Leaving out ops, QA, etc. for now)

PM and UX write story and pass to dev as JIRA


Problem

⚠️

User stories !== developer action items


Problem

  • Tickets from PM and UX are feature-based, but not all features are created equal
  • Some features are simply too large to be actionable
  • It's no secret our estimations can use some work

Consequences

  • Poor story point estimates lead to inaccurate (and missed) timelines
  • Ambiguity in implementation details leads to developer frustration and angst

Outcome: Shoddy product

πŸ’©


How Do We Fix This?


Case Study: Audience Builder

Audience Builder

Note:

Other examples

DR-5212 - 10 SP ticket for a huge issue -- helped via subtasks and follow-up tickets PL-6681 - grid child rows didn't yet exist ORION-3959 - status component doesn't exist, missing API data PL-6997 - 3 discrete form states can be implemented separately; missing metrics redux stuff


Case Study: Audience Builder

  • Extremely complex feature
  • Initial ticket included: link to the mocks, a sample API request, and 3 bullet points
  • Story points: 12

...


Developer response: WTF?

This ticket is NOT actionable! Where do I start? I want to cry.

🍺😭🍷

(Where did the number 12 even come from!?)


Making Tickets Actionable

  • Top-down: tech lead does all "actionizing"
  • Consensus: "actionizing" during planning meeting
  • Bottom-up: developer "actionizes" their own ticket(s)

Proposal: bottom-up approach is the best, so let's try it

Note: Top-down can lead to centralization of knowledge; people at top never grow Consensus is good for incrementally improving estimates, but is nowhere near the final step


Making Tickets Actionable

Before starting work, dev translates tickets from being feature-based (user-oriented) to being implementation-based (patchset-oriented)

Note:

Example: pulling out action items as subtasks


Making Tickets Actionable

  • Tasks are recursive trees 🌲: each subtask is either its own task tree or a leaf
  • Leaves πŸƒ are tasks that are sufficiently small to be actionable
  • How do we collect all leaves? Tree traversal algorithm

πŸŒ²πŸšΆβ€πŸŒ²


Depth-First Traversal

<AudienceBuilder/>: Redux-aware container + <ExpressionBuilder/>
  β”œβ”€ Redux-aware container: ACTIONABLE
  └─ <ExpressionBuilder/>: <Container/>, <Left/>, <Right/>
      β”œβ”€ <Container/>: ACTIONABLE
      β”œβ”€ <Left/>: <LeftBlock/>, <LeftContainer/>
      β”‚   β”œβ”€ <LeftContainer/>: ACTIONABLE
      β”‚   └─ <LeftBlock/>: <Header/>, <Breadcrumbs/>, <Grid/>
      β”‚       β”œβ”€ <Header/>: ACTIONABLE
      β”‚       β”œβ”€ <Breadcrumb/>: ACTIONABLE
      β”‚       └─ <Grid/>: checkboxes, drill-down, etc.
      └─ <Right/>: ...etc...

Identify Dependencies

Dependency graph allows you to identify what tasks are parallelizable, and what are high-priority blockers


Output

Action Items

  • 22 story points -- much more confidence in this estimate
  • Clarity in implementation details

Outcome: Robust, bug-free product

😎


Benefits

seemsgood


Better Estimates

Estimates that are the sum of many granular tasks will be more accurate than holistic estimates

(Again -- where did the number 12 even come from!?)


More Robust Code

Small, concrete features are the easiest to unit test

Incrementally written unit tests = very few regressions

(48 unit tests over 24 tickets -- not that much work)


Improved Iteration Speed

  • Concrete task leads to productive, focused discussion with PM and UX
  • Awareness of dependencies makes it easier to pivot when requirements change
  • More deficiencies identified up-front
  • If one subtask is blocked, easy to identify what can still be worked on
  • Limit scope creep: clear acceptance criteria, non-MVP reqs can be moved to follow-up tickets

Faster Review Turnaround

Atomic tasks = smaller, more focused commits = happy reviewers 😊 = faster merging


Deeper Understanding of Requirements

Turns out critical thinking helps understanding. Who knew?

Best emoji ever


Summary

Technique: Before starting work, the developer should translate tickets from feature-based (user-oriented) to implementation-based (patchset-oriented)

  • Better estimates
  • More robust code
  • Improved iteration speed
  • Faster review turnaround
  • Deeper understanding of requirements

Anticipated Questions


"Isn't this waterfall?"

🌊

(disclaimer: not actually a waterfall)


"Isn't this waterfall?"

Short answer: no


"Isn't this waterfall?"

Long answer: noooooooooooooooooooooooooooooooooo

  • Subtask list was highly mutable and changed constantly
  • Up-front planning is NOT against the spirit of agile
  • Agile = ability to respond quickly to change

"I don't have time to do this."


"I don't have time to do this."

Targeting in Tabbed Manage Blade

Tabbed Manage Blade Targeting


"I don't have time to do this."

Targeting in Campaign Wizard

Campaign Wizard Targeting


"I don't have time to do this."

"A stitch in time..."

  • Up-front planning took a day at most
  • Identified importance of strict separation of concerns (routing, data access, wrapper, form layers)
  • Result: porting from manage blade to campaign wizard took ~30 minutes, likely saving weeks of rewriting
  • How many existing features had to be rewritten for the campaign wizard?

"We use one of the other methods you mentioned, and we like it"


"We use one of the other methods you mentioned, and we like it"

Great! Stick with what works

However, I personally think individual sizing is better and is worth trial running at least once

Note:

Again, top-down leads to centralization of knowledge, and consensus isn't precise enough


"This is too hard. I don't know how to do this."


"This is too hard. I don't know how to do this."

  • Practice makes perfect
  • As you get into the habit of breaking down tickets, you'll naturally improve at identifying subtasks
  • Process is entirely up to you -- find the workflow that works best for you

"This isn't the developer's job. Why should I do this?"


"This isn't the developer's job. Why should I do this?"

  • Dev skillset is focused: be very good at this one thing
  • PM skillset is discrete: be good at these fifty things

Easier for devs to learn a subdomain of PM than it is for PMs to learn a subdomain of engineering


"This isn't the developer's job. Why should I do this?"

  • You work more efficiently for the company
  • You also massively increase how hirable you are and what salary you command (remember: TPMs are expensive!)

πŸ€œπŸ€›

Win-win!


"This is obviously the developer's job. Why haven't they been doing this already?"


"This is obviously the developer's job. Why haven't they been doing this already?"

  • Definitely wasn't ever made clear to me 🀷
  • Regardless of how "obvious" it might be, at the end of the day, we're not doing it, and that's what matters

Discussion


Question for Viewers

  • How does your team currently size tickets?
  • Who makes tickets actionable?
  • How are bad estimates handled?

Note:

Possible next steps:

  • Better CR culture
  • Pair programming
  • "Rotational" tech leads
  • Devs participate in user research
@timhwang21
Copy link
Author

timhwang21 commented May 6, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment