惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
Vercel News
Vercel News
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
I
InfoQ
小众软件
小众软件
Recent Announcements
Recent Announcements
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
美团技术团队
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
MongoDB | Blog
MongoDB | Blog
V
V2EX
J
Java Code Geeks
有赞技术团队
有赞技术团队
博客园 - 聂微东
B
Blog RSS Feed
博客园 - 司徒正美

Yusuf Aytas

When Code Is Cheap, Does Quality Still Matter? Why Crouching Tiger, Hidden Dragon Is a Masterpiece Why We Ignore Advice The Mirror Is Part of the Machine When Too Many Maps Overlap on One Person The Work Runs on Different Maps Your Work Introduces You Trial By Fire The Dude Why Headcount Math Lies Capacity Is the Roadmap The Roadmap Is Not the System Torres del Paine W Trek Escaping Status Theater Incentives Drive Everything Scaling Culture Without Dilution What Good Looks Like Why Airport Security Feels Random Why Politics Appear How to Work with Me The Janus Protocol Multi-Horizon Delivery Framework What Good Execution Looks Like Managing Your Manager Why Kingdom of Heaven’s Director’s Cut Is Better AI Broke Interviews Most of What We Call Progress Managers Have Been Vibe Coding All Along Stop Wasting Brainpower Why Over-Engineering Happens
Cracking Coding Bottlenecks
Yusuf Aytas · 2023-11-10 · via Yusuf Aytas

Published · 6 min read

In software development, we obsess over component benchmarks and algorithmic complexity, chasing milliseconds latency and Big-O wins. But, time and after time, I’ve found that the real latency lives outside the code. It hides in organisational troubles, slow-motion decisions, and half-written requirements. That’s where velocity goes to die. I’ve rarely seen a project stall because of an algorithm; the drag almost never lives in your O (n log n) algorithm.

When requirements drift, docs go stale, or a pull request sleeps in someone’s inbox, throughput nosedives long before production performance even matters. Think about the last time a build turned green yet nothing shipped for hours. Odds are the code wasn’t the blocker; unanswered questions were. Clear specs, living documentation, tight feedback loops, and steady tech debt payments create the runway. Everything else is throttle.

My non-negotiables for every team

  1. Clarify requirements before the first line is written.
  2. Document while the code is still warm so future you (or a new hire) isn’t reverse-engineering intent.
  3. Shrink review and CI cycles until waiting feels strange.
  4. Make it really fast to search and learn.
  5. Pay your debt continuously.

Fix the flow of information and the code ships itself.

Coding bottle kneckCoding bottle kneck

Clarify Vague Requirements

Vague requirements are the biggest enemy of software development. That’s why it’s also a big deal in system design interviews. You want to get to the bottom of functional and non-functional requirements before doing anything else.

My checklist before any code is written:

  1. Define success in one sentence. What is it that we would get after this work?
  2. Separate must-haves from nice-to-haves. List them explicitly with measurable acceptance criteria. Guesswork here is a future rewrite.
  3. Capture non-functional constraints early. Latency targets, throughput, compliance, uptime, and budget. These shape every design choice and belong in the same document.
  4. Confirm scope individually. Make sure people say yes on their own. Silence generally means people didn’t pay much attention. So poke them.
  5. Visibility keeps scope creep honest. Hence, use tools for your advantage.

An extra hour spent nailing requirements saves weeks of rework and keeps the team focused on solving the real problem instead of chasing moving targets.

Stale or missing docs turn every new task into archaeology. When nobody can trace why a piece of code exists, there’s no way you can realistically deliver the work fast. Engineers will burn hours in reverse-engineering context that should have been written down once. In distributed teams, that cost multiplies across time zones big time.

My checklist before any pull request merges:

  1. Docs live beside code. Every repo has a README.md (setup, gotchas, failure modes) and an /docs folder for deeper dives. If a change alters behaviour, the accompanying doc changes ships in the same commit.
  2. Describe intent, not just mechanics. Code explains how; docs explain why. A short paragraph on the design rationale saves future debates and prevents accidental regressions.
  3. Make documentation part of the review. A pull request that changes behaviour without touching docs triggers an automatic rejection. Reviewers check the diff and the words.
  4. Prune aggressively. Out-of-date docs are worse than none. 
  5. Use examples over prose. A concrete input-output sample or curl command beats three paragraphs of explanation. If I can’t run it in under a minute, the doc isn’t finished.

Write it once, keep it current, future-you and everyone else get the benefit every single day.

Speed Up Slow Feedback Loops

Slow feedback loops are silent productivity killers. When a build drags or a pull-request waits, momentum evaporates long before any code hits production. My rule of thumb: if a feedback step takes longer than 30 minutes, it gets fixed because after half an hour most engineers context-switch and the real cost balloons.

My checklist to keep the loop tight:

  1. Measure every hop. Time the build, test, deploy, and review phases. Post the numbers where everyone can see them; what’s visible gets ownership.
  2. Parallelise and cache relentlessly. Split giant test suites, run jobs side-by-side, and reuse artefacts. Extra compute is cheaper than lost focus.
  3. Cap change size. Keep pull-requests small (≈ 400 LOC or less). Compact diffs review faster.
  4. Automate first-line checks. Linting, formatting, schema validation. Get bots reject obvious issues so humans review design, not whitespace. And make them part of the precommit so they get fixed automatically. 
  5. Schedule review windows. Explicit reviewer rotations or daily review blocks beat the “whenever someone notices” model. Waiting becomes abnormal.
  6. Attack long tails. Averages lie; investigate the slowest 5 % of builds and reviews. Those outliers wreck predictability.

Shave minutes off every pass through this cycle and you compound hours back into the week. It’s the simplest, most reliable way to boost delivery speed without touching a single algorithm.

Gain Information Faster

Coding speed is mostly information speed. When answers hide behind team aliases, approval chains, or three-time-zone gaps, tasks stall no matter how tidy your codebase is.

How I unblock myself and the team:

  • Ping a person, not a group. Direct a tight question to the named owner; “@Dana, which table owns customer_id?” almost always beats “Anyone know…?” The clearer the call out, the faster the reply.
  • The moment you spot a likely approval (security, legal, analytics), schedule it. Surprises killed more launches than bad code ever did.
  • Escalate early, visibly. If a blocker idles, surface it while it’s still small. I bump after 24 h, then again at 48 h.
  • Map the decision fence. For distributed teams, write down who can green-light what. Clear fences stop questions from waiting on slack responses.
  • Leave breadcrumbs. Whenever you dig up a hard-won answer. Be it API quirk, policy edge case, drop it into the repo’s FAQ or run-book right away. Today’s breadcrumb is tomorrow’s shortcut.

Cut the wait time on information and the rest of the pipeline moves like it’s supposed to.

Address Technical Debt

Tech debt is compound interest on every shortcut. The longer it sits, the more it eats into delivery speed. The more tech debt you have, the slower you move.

How I keep the balance sheet healthy:

  1. Make the debt visible. I log each compromise in a lightweight ledger: component, owner, impact, and a gut-level “interest rate” (how fast the pain grows). Invisible debt never gets paid.
  2. Fix a repayment rate. A small but immovable slice of engineering time, typically one day every two weeks goes to debt work. Because it’s scheduled, it doesn’t get cannibalised by feature pressure.
  3. Chip away, don’t cliff-dive. Large rewrites die on calendars; I break refactors into merge-ready slices that land continuously. Value shows up early, risk stays low.
  4. Tie debt to metrics. Whenever latency, build time, or defect rate drifts upward, I trace the root cause. If debt is the culprit, it jumps the queue. No debate.

Treat debt like a balance you’re determined to clear. Every payoff buys future freedom instead of future friction.

In conclusion, cracking coding bottlenecks hinges on information flow. Each strategy has an important role in moving the ball forward.