Beyond Benchmarks: How to Evaluate the Real Coding Ability of LLMs
Leaderboard scores rarely predict how well a large language model performs in real, day-to-day coding work. This article explains why public benchmarks can mislead—through mismatched test sets, inconsistent reruns, and cherry-picked reporting—and what they measure versus what they miss, such as speed, autonomy, context engineering, tool use, and delivery quality. It then walks through a practical framework for building your own evaluation set: extracting tasks from real projects, controlling variables, tracking process metrics, logging experiments with a reusable Python template, and repeating runs for statistical reliability, so teams can turn evaluation into a long-term engineering asset.
Introduction
When choosing a model, many teams’ first instinct is to check the leaderboards. But anyone who has used LLMs to write code for a while will run into an awkward reality: models whose benchmark scores are nearly identical can feel dramatically different in daily use—the gap is far wider than a few percentage points suggest.
The problem isn’t fake scores. It’s that “taking an exam” and “doing the job” are two different things. Benchmarks measure problem-solving in controlled environments, while everyday coding is a long-horizon, multi-turn, uncertainty-filled collaboration process. This article breaks down two questions: what leaderboards can and cannot tell you, and how developers can build a trustworthy evaluation method for themselves and their teams when no authoritative yardstick exists.
1. Why Leaderboards Mislead: Three Measurement Problems
1.1 Different Tests, Incomparable Scores
The “headline numbers” vendors promote often come from different benchmarks: some focus on bug fixing in real repositories, some on multi-step operations in terminal environments, and some are simply proprietary evaluation sets. Task distribution, scoring rules, and pass criteria all differ. Placing two scores side by side is like comparing results from two exams with different subjects and grading rules—there is no conversion between them.
Composite index leaderboards are even more subtle: they average multiple capabilities into a single number, which looks convenient for comparison, but the choice of weights is inherently subjective. Several models clustered in the same score band doesn’t mean they share the same capability profile—one may excel at single-point reasoning, another at long-horizon planning—and after weighting, the difference may be completely invisible.
1.2 Same Test, Wildly Different Reruns
Even for the same benchmark tested by multiple sources, reported numbers can differ by nearly ten percentage points. The reasons aren’t mysterious:
- Different reasoning settings: whether deep thinking is enabled, and how much thinking budget is allocated, directly changes model behavior;
- Different agent scaffolding: how the outer framework decomposes tasks, injects context, and which tools the model is allowed to call—these affect results as much as the model itself;
- Different timeout and retry policies: with generous retries, scores naturally look better.
Vendor-reported numbers typically represent “best-case ceilings,” while third-party reruns are closer to what ordinary users actually get. Mixing the two inevitably distorts conclusions.
1.3 Survivorship Bias in Cherry-Picked Results
No vendor proactively showcases leaderboards where it doesn’t lead. So every vendor can produce a “we’re #1” report card, and what the public sees is a filtered slice. The leaderboards aren’t lying—but they only present the side favorable to whoever published them.
2. What Benchmarks Measure—and What They Miss
Benchmarks Test One-Shot Problem Solving
Mainstream coding benchmarks share common traits: tasks have clear endpoints (tests pass, bug fixed), run offline, and can be judged automatically. This makes them suitable for measuring a model’s knowledge and single-point reasoning—entry-ticket-level metrics. Options that can’t even pass these can be ruled out immediately.
Everyday Coding Is Long-Horizon Collaboration
In real work, what determines your experience is a different set of dimensions—and almost none of them are captured in the statistics:
- Speed and rhythm. How high the first-token latency is, how fast generation runs, how long long tasks take. At the same accuracy, one model that takes three minutes and another that finishes in seconds produce completely different workflow smoothness.
- Persistence on long tasks. On multi-step tasks, does the model “circle”—repeatedly retrying the same failing path, oscillating between two approaches, or prematurely declaring completion? Benchmarks usually give enough opportunities to reach the endpoint, and the cost of circling gets masked by retry policies.
- Autonomy. How many times do you need to type “continue,” “don’t stop,” “do what you said”? Every human intervention is a context switch; too many, and “automation” degrades into “advanced autocomplete.”
- Context engineering. In a real repository, can the model accurately locate relevant files, keep changes consistent across files, and remember earlier constraints in long sessions? Benchmark codebases are often far smaller and simpler than actual projects.
- Tool use quality. Reading and writing files, running commands, executing tests, reading errors, self-correcting—is this chain reliable? With identical scaffolding, the robustness of that chain is determined entirely by the model.
- Delivery form. Does the model produce precise, small diffs, or rewrite entire files? Does it “over-refactor” uninvited? Does it respect the project’s existing style? These don’t change right versus wrong, but they directly determine review cost.
In one sentence: benchmarks measure “can it get it right,” while daily experience depends on “how tiring is it to work with.”
3. Building Your Own Evaluation: A Practical Workflow
Since public yardsticks are unreliable, the most pragmatic approach is to build your own evaluation set. The core principle is simple: control variables, record the process.
Step 1: Extract a Task Set from Real Projects
- Cover four typical task types: bug fixing, small feature development, refactoring, and test completion;
- Pick 2–3 of each with a difficulty gradient—include both “one-line change” easy tasks and “spanning three files” hard ones;
- Write clear acceptance criteria for each task; ideally, existing test cases should already exist, so passing the tests means passing the task;
- Keep one or two “hard bones” that all candidates fail at, to observe failure modes—failure modes themselves are valuable information.
Step 2: Fix Every Variable You Can
- Same scaffolding, same system prompt, same permission configuration (can it run commands, can it access the network);
- Same reasoning settings;
- Test within the same time window to avoid server-side fluctuation.
Step 3: Process Metrics Tell You More Than Result Metrics
| Metric | What to Record | What It Reveals |
|---|---|---|
| Interaction rounds | Round trips to complete a task | Communication cost |
| Human interventions | Times you prompted, corrected, or supplied info | Autonomy |
| End-to-end time | Total duration including waiting | Rhythm and throughput |
| Token consumption | Total input plus output | Cost |
| First-pass rate | Share completed without rework | Delivery quality |
| Subjective experience score | 1–5 stars | Overall feel |
Step 4: Log Every Experiment with a Fixed Template
from dataclasses import dataclass@dataclassclass TaskRecord:task_id: str # Task ID, e.g., bugfix-003category: str # bugfix / feature / refactor / testmodel: str # Identifier of the model under testharness: str # Scaffolding and prompt versionrounds: int # Number of interaction roundsinterventions: int # Number of human interventionswall_time_s: float # End-to-end time in secondstotal_tokens: int # Total token consumptionpassed: bool # Whether acceptance tests passedrework: bool # Whether manual rework was requiredscore: int # Subjective experience score, 1-5 starsnotes: str = "" # Qualitative observations: failure modes, circling behavior, etc.
After running, a minimal aggregation gives you conclusions closer to your actual scenario than any leaderboard:
def summarize(records: list[TaskRecord]) -> dict:return {"pass_rate": sum(r.passed for r in records) / len(records),"median_rounds": sorted(r.rounds for r in records)[len(records) // 2],"avg_interventions": sum(r.interventions for r in records) / len(records),"avg_score": sum(r.score for r in records) / len(records),}
Step 5: Repeat and Apply Basic Statistics
A single run is noisy: the same task may pass twice and fail once across three runs. Repeat each task at least 3 times, and focus on the median and the worst performance—worst-case performance often predicts daily experience better than best-case.
4. Turning Evaluation into a Long-Term Team Asset
- Version-controlled maintenance: update the task set regularly as the project evolves; retire old tasks whose answers may have been “memorized” by training data, so the evaluation doesn’t gradually lose its edge;
- Regression mechanism: when a new model is released or a new version ships, run the same task set for regression comparison instead of chasing new leaderboards;
- Additional checks for enterprise scenarios: beyond coding ability, also evaluate data security and deployment options (such as private deployment support), integration cost with your internal toolchain and CI pipelines, observability (whether call logs, usage statistics, and monitoring/alerting are complete), and cost-accounting granularity. Major LLM service platforms (such as Baidu AI Cloud’s model services) typically offer unified access methods and bundled logging and monitoring capabilities, making side-by-side comparison and staged switching easier under compliance requirements.
5. Conclusion: Scores Are the Entry Ticket, Experience Decides the Game
The right way to use leaderboards is as a first-pass filter: eliminate options that clearly fall below the bar. The final call must be made by your own task set, your own scaffolding, and your own workflow.
Coding isn’t an exam. Exams measure “can you”; collaboration measures “how smooth is it.” The next time you see several models within a few percentage points of each other, the real question isn’t “who’s #1,” but “in my project, which one makes me revise plans less often, wait less time, and rework less?” The answer isn’t in the leaderboard—it’s in your own evaluation log.
