Green dashboards, empty merges
Developer productivity breaks when motion replaces finished work: tickets closed with no deploy, refactors that never ship, standups that report activity instead of risk. The job is not to look busy. It is to leave the codebase, the ticket, and the next person in a better state than you found them.
This guide covers deep work for coding, what to do while builds and tests run, protecting debugging sessions, handoffs across timezones, and metrics that lie. Home focus rules: protect focus when you work from home. Day shape: structure a remote workday.
Deep work for coding
Coding has a long warm-up. Opening the IDE, loading context, and rebuilding the mental model of a branch can eat twenty minutes. That cost is why "just check Slack" mid-block is expensive.
| Work type | Block length | Rule |
|---|---|---|
| Feature slice with tests | 45 to 90 minutes | One branch goal per block |
| Code review | 25 to 40 minutes | Batch reviews; do not interleave with coding |
| Refactor | 50+ minutes | Name the stop condition ("extract service X") |
| Incident | No timer | One incident commander; others async |
| Email / triage | 15 to 25 minutes | Window on the clock |
Name the block before you start: file, function, or test you will touch. If you cannot name it, you are still browsing. Size blocks with the Pomodoro Planner.
Protect the first block
Morning chat destroys the cheapest deep hour. Batch messages after the first meaningful commit or failing test. Notification patterns that survive real jobs: protect focus when you work from home.
Build, test, and wait work
Pipelines and local builds create natural gaps. The mistake is treating every gap as social media or random ticket thrash. The fix is a waiting list of tasks that fit the gap size.
| Gap | Good waiting work | Bad waiting work |
|---|---|---|
| 2 to 5 minutes | Stretch, note next action | New Slack thread |
| 5 to 15 minutes | Small review, doc typo, log cleanup | Start a second feature |
| 15 to 45 minutes | Adjacent test, config tweak, write handoff | "Quick refactor" with no scope |
| 45+ minutes | Switch to planned secondary task | Pretend the build will finish in two minutes |
Full list of productive waiting work: what to work on while a build or export runs.
When a deploy is running, write the verify steps you will run when it finishes. That turns passive waiting into active preparation.
Debugging without thrash
Debugging is the most interruption-sensitive work on the team. One ping can cost an hour of reconstructed state.
During an active debug session:
- Post one line in the team channel: "Debugging PAY-218; async until … or if P1."
- Capture hypotheses in the ticket, not only in your head
- Note the last command, branch, and data snapshot before you context-switch
- If stuck past one honest hour, write a blocker with reproduce steps and ask for one specific pair, not a vague "any ideas?"
When someone interrupts:
- If it is not P1, schedule the reply at the next message window
- If you must switch, spend sixty seconds on a park note: next command, current theory, open files
Pairing belongs in overlap hours, scheduled, with a timebox. Random shoulder taps on Slack are how bugs live for a week.
Handoffs that survive overnight
Follow-the-sun only works when the artifact is pick-up-ready. Mood notes do not transfer ownership.
Minimum package:
State: branch, PR link, environment
Proof: command or URL that shows current behavior
Next move: first physical step for the next owner
Blocked: who owes what, by when, in which zone
Full method: leave work someone else can continue.
Worked example: You finish at 17:00 Pacific; QA in Poland starts in the morning.
| You write | They do |
|---|---|
| PR #510 open; preview URL in description | Pull branch; run npm test |
Failing test: webhook.spec.ts line 42 | Fix or confirm env secret per ticket |
Next: set WEBHOOK_SECRET in preview | Comment pass/fail before overlap |
If the next move is "continue checkout," the handoff failed. Sharpen until it names a file, command, or test.
Metrics that lie
Teams measure what is easy, not what matters. Watch for these traps.
| Metric | What it looks like | What it hides |
|---|---|---|
| Story points closed | Velocity up | Half-finished work, no deploy |
| Lines changed | Big diff | Noise, revert tomorrow |
| Hours logged | Full timesheet | No merge, no customer value |
| PRs opened | High count | Review pile, context switching |
| "Green" CI | All checks pass | Flaky tests, skipped e2e |
Better questions for a weekly ten-minute review:
- What shipped to production or a client-visible environment?
- What is blocked with a named owner and deadline?
- Where did we lose a deep block to preventable chat?
- Which waiting gaps turned into fake work?
Outcomes beat motion. Related read: busy vs finishing work.
Worked developer day
Assumptions: one Primary (ship webhook fix to staging), one meeting, CI often slow.
| Time | Block |
|---|---|
| 09:00 | Five-line plan; mute chat |
| 09:10 | Deep 50m: reproduce failing test locally |
| 10:05 | Break |
| 10:15 | Deep 50m: implement fix + unit test |
| 11:10 | Push; CI running |
| 11:15 | Waiting list: review one small PR, draft handoff if CI slow |
| 11:45 | Message sweep |
| 12:00 | Lunch |
| 13:00 | Meeting 30m (decision only) |
| 13:45 | Verify staging when CI green |
| 14:30 | JSON log sanity check in browser devtools; JSON Formatter for payload shape |
| 15:00 | Shutdown note with Done / Open / Blocked / Next |
If CI fails after lunch, the Primary shrinks to "document failure + assign owner," not a heroic evening.
Small tools, small wins
You do not need a new app for every micro-task. Browser-local tools reduce tab thrash:
- Pretty-print API responses with the JSON Formatter instead of fighting minified logs in the console
- Plan tomorrow's first block in the Pomodoro Planner before you close the IDE
Tradeoffs
| Pressure | Cut first | Protect |
|---|---|---|
| Always-on chat | Instant replies | One deep block + windows |
| "Just one more refactor" | Scope creep tonight | Named stop condition |
| Manager wants hourly updates | Narrating work | End-of-day outcome note |
| Flaky CI | Re-running until lucky | Fix or quarantine the test |
What to refuse
- Starting a second feature while the first branch is unmerged and unverified
- Handoffs that say "see Slack"
- Meetings with no decision or pairing goal
- Counting lines or points when nothing shipped
- Debugging with chat open and banners on
Developer productivity is finished work plus continuity. Name the next block, protect debugging, use waiting time on purpose, write handoffs someone can execute without you, and measure merges and deploys, not motion.