Skip to content
ExponaBLOG
ENGINEERING CRAFT · DAY 054 / 100

Agile practices that actually help: a step-by-step guide

What worked across three projects I led.

Expona Admin7 min read

Over the last five years leading three different platforms—a trading engine, a ride-hailing service, and a SaaS CRM—I've watched teams adopt and abandon dozens of "agile" ceremonies without ever shipping faster or with better quality. The difference came down to realizing that agile practices that actually help are the ones you can defend to your team without buzzwords. This article covers what worked: two-week iterations with real deliverables, a definition of done that stops rework, retrospectives that produce action, and protected focus time.

Short iterations — Two-week cycles with something demoable at the end

I learned early on that a sprint's credibility lives or dies by demo day. When I joined the trading platform team, they were running four-week cycles. The problem wasn't the process—it was that by week four, half the work wasn't finished, so the demo showed half-baked features and broken UX. Stakeholders lost confidence. The team felt pressure to "make it look good" rather than "make it work."

We moved to two-week sprints and changed one rule: you demo what actually works, even if it's smaller in scope. Week one, we'd commit to something demoable. Week two, we'd iterate and stabilize. The effect was immediate. Small scope meant fewer dependencies, fewer surprises, and fewer meetings to rescope midway through. We could say "yes" or "no" to features much faster.

A concrete example: instead of "build the entire trade execution flow," we'd commit to "execute a market order end-to-end, with validation and error handling." That took ten days. The next sprint, we'd add limit orders. The sprint after, we'd add complex order types. Each demo showed something the business could inspect and trade against.

The two-week cycle also forced us to think in vertical slices. A feature wasn't a backend task plus a frontend task plus a database task. It was a single user story: "As a trader, I want to see my open orders in real-time, so I can manage risk." That meant backend, frontend, database, and monitoring all shipped together. No "we'll wire it up later."

For teams just starting: commit to finishing something, not starting something. Velocity doesn't matter if you're shipping half-finished code. What matters is predictable, demoable delivery every fourteen days.

Clear definition of done — Tested, reviewed, deployed and documented

The second breakthrough came from writing down what "done" actually meant. Before that, it was invisible.

On the ride-hailing platform, a developer would mark a task complete and move it to "ready for QA." Three days later, QA would find edge cases. The developer would argue: "That's not in the scope of the story." We were stuck in a loop where no one owned quality.

We built a one-page definition of done that became non-negotiable:

  1. Unit tests pass locally (minimum 80% coverage for new code)
  2. Code review approved by at least one senior engineer
  3. Integration tests pass in staging
  4. Merged to main and deployed to staging
  5. Product owner (or proxy) signs off visually
  6. Monitoring and alerts configured
  7. Runbook or documentation updated if operational

This was not theoretical. We printed it. Stuck it on the wall next to the board. Made it part of the sprint template. A story wasn't done until it ticked all seven boxes.

The impact was that developers started thinking about testing and documentation earlier. They didn't write code and then hand it off to QA hoping for the best. They built testable systems. They wrote clear commit messages. They thought about how ops would run this thing at 3 a.m.

Here's what the code review checklist looked like in practice:

typescript
// Example: ride-hailing rider location update
// PR description included:
// - Why this change (context)
// - How it was tested (manual + automated)
// - Any config changes needed
// - Any database migrations
// - Monitoring dashboards added

interface LocationUpdate {
  riderId: string;
  lat: number;
  lng: number;
  accuracy: number;
  timestamp: Date;
}

async function updateRiderLocation(update: LocationUpdate): Promise<void> {
  // Validate input
  if (!update.riderId || !isValidCoordinate(update.lat, update.lng)) {
    throw new ValidationError('Invalid location update');
  }

  // Update cache (fast)
  await redis.setex(
    `rider:${update.riderId}:location`,
    60, // TTL: 60 seconds
    JSON.stringify(update)
  );

  // Persist to database (async, non-blocking)
  locationQueue.enqueue({
    riderId: update.riderId,
    location: [update.lat, update.lng],
    timestamp: update.timestamp,
  });

  // Emit to WebSocket subscribers
  broadcastRiderLocation(update);

  // Increment metric for monitoring
  metrics.counter('rider.location.updates', 1, {
    riderId: update.riderId,
  });
}

Every line in that function could be reviewed. The reviewer could ask: Why Redis with a 60-second TTL? Why queue the database write? What happens if the queue fills up? These conversations happened before the code touched production.

The definition of done also killed the "we'll refactor this later" lie. Later never comes. If it's not good enough to demo now, it's not done.

Retrospectives with action items — One or two concrete improvements per sprint

Bad retros are the graveyard of agile. You sit for an hour, complain about Jira, agree that communication is hard, and then nothing changes. The team leaves feeling heard but nothing different happens next sprint.

On the CRM project, I changed the retro format to force action. Here's the structure:

  1. First fifteen minutes: What went well? (celebrate concretely)
  2. Next fifteen minutes: What caused pain this sprint? (identify friction)
  3. Last fifteen minutes: Pick ONE thing to change next sprint. Write it down. Assign someone to drive it.

That's it. Done in forty-five minutes. One action item per sprint.

If the team said "Slack notifications are killing focus," the action was: "Switch notifications to digest mode. Rajesh owns it. We'll measure context switches next sprint." Concrete. Owned. Measurable.

I kept a rolling document of retro notes. Six months in, we'd reduced Slack interruptions by 70% because we'd picked that one action and stuck with it. The week after, we tackled "deploys take twenty minutes and nobody deploys on Friday." We found that half the time was waiting for tests. The next sprint, we parallelized the test suite and cut deploy time to four minutes.

The magic isn't in the format. It's in the discipline: one thing, one owner, one metric, one sprint. Not five things, not "we'll try," not "the whole team will work on it." That's how retros become real.

Protect focus time — Fewer meetings, more uninterrupted building

This is where most teams fail. They implement all the agile ceremonies and accidentally create a calendar that has no deep work left.

On the trading platform, we were running daily standups (15 min), planning (2 hours), retros (1 hour), and backlog refinement (1.5 hours). That's 4.75 hours of meetings, every week. Developers had Wednesday and Thursday afternoons to actually code.

We cut it down:

  • Standups: once a week, Mondays after planning. Async written updates other days. (15 min/week)
  • Planning: every other week, just-in-time. (2 hours, every 14 days)
  • Retros: end of every sprint, right after demo. (45 min/sprint)
  • Refinement: continuous, small conversations with product, not a big meeting. (ad-hoc)

Suddenly developers had Monday through Friday afternoons unbroken. Friday mornings were protected "no meetings" time. Slack was on digest mode after 2 p.m.

The result was that complex problems got solved. The async task queue issue that had been nagging us for two sprints got solved in a focused Friday. The WebSocket scaling problem got tackled and shipped in a week instead of three because the engineer had unbroken time to think.

I also learned that synchronous agile ceremonies work better in-person. If your team is distributed, Zoom standups feel like theater. We moved to async standups: write one paragraph before your workday starts, in Slack. Takes two minutes. Other people read it while sipping coffee. Way more human, way less performative.

Common mistakes

Mistake 1: Confusing busy with productive. If every sprint you commit to eight stories and ship six, that's not a win—that's poor planning. Better to commit to four and ship four, every time. Your burndown chart teaches you the rhythm of your team.

Mistake 2: Abandoning the definition of done under pressure. "We'll test it later, we need to ship now." You won't test it later. You'll ship bugs and spend the next month in firefighting mode. The definition of done is your boundary. Defend it.

Mistake 3: Retros without follow-through. If you agree to an action and don't check on it next sprint, you've trained the team that retros are theater. One action per sprint, one owner, one check-in.

Mistake 4: Meetings that could be Slack messages. Before you schedule a meeting, ask: "Is synchronous time required?" Often the answer is no. You're just creating the illusion of alignment.

Key takeaways

  • Two-week sprints force realistic scoping and keep demo days credible. Demoable doesn't mean perfect; it means real.
  • Write down your definition of done and treat it as law. It stops rework, aligns expectations, and builds team ownership of quality.
  • One action per retro, owned by one person, with one metric. That's how process improvements actually stick.
  • Protect focus time fiercely. Four hours of meetings in a week is reasonable; eight is dysfunction. Cut ruthlessly.
  • Async-first communication with synchronous ceremonies only when needed. Most standups and refinements don't need to be live.
  • Agile is not a toolkit to memorize. It's a practice of ship, inspect, adapt. Everything else is overhead.
ShareXLinkedInReddit

Found this useful? Support the writing.

Buy me a coffee
Written by
Expona Admin
Site administrator

Comments

Loading comments…

Leave a comment

Comments are reviewed before they appear. Be kind and stay on topic.

Related articles