NNabeel Hassan

Blog · August 1, 2026 · 8 min read

What ICPC Actually Taught Me About Shipping Software (And What It Did Not)

By Nabeel HassanAI Engineer · ICPC World Finalist

TL;DR: In 2021 my team won the ACM-ICPC Asia Topi regional as national champions and qualified for the ICPC World Finals. People assume that means I write faster code than everyone else. It does not. Competitive programming gave me four things that transferred almost perfectly into shipping production software, and it gave me two habits I had to actively unlearn before I could be useful on a real team. This is the honest accounting, from someone who went from contest problems to AR systems for the U.S. Fire Administration to AI voice agents in production.

The short answer to "does competitive programming make you a better engineer" is: yes, but not for the reason most people think. It does not make you better because you memorized segment trees. It makes you better because it trains a specific relationship with a hard problem, and that relationship is the rarest thing in engineering.

I spent my years at FAST NUCES going all in on competitive programming. My team won our region, represented our country, and made it to the ICPC World Finals, which is about as far as that track goes. Then I went and built things people actually use: XR platforms, cross-platform SDKs, AR systems for fire response, and now AI agents. Here is what came with me, and what did not.

What transferred

1. You do not get to be stuck

The single most valuable thing ICPC drills into you is that being stuck is a temporary state you are responsible for exiting, not a condition that happens to you.

In a contest you have five hours and a problem you have never seen. There is no Stack Overflow answer, no library that does it, no senior engineer to ask. You have a whiteboard, a teammate, and the requirement that something correct exists at the end. You learn to sit inside not-knowing without panicking, break the problem into a shape you can attack, and keep generating approaches after the obvious ones fail.

That is the exact muscle production work demands, just on a longer timeline. When I joined ARCortex and had to make a live data stream sit correctly on top of the physical world in a headset, nobody had written that blog post. When a voice agent behaves strangely on real calls at 2am, there is no documented answer either. The skill is not knowing. The skill is having a reliable process for the moment you do not know, and contests are five hours of pure practice at that, over and over, for years.

2. Correctness is not a feeling

In a contest, your solution is right or it is not. The judge does not care how confident you were. It does not care that it worked on the sample input. There is no partial credit for elegant code that fails one edge case.

That is a brutal and extremely healthy calibration. It kills the instinct to declare victory because something ran once without crashing. You start reflexively asking the question that separates working software from software that looks like it works: what input breaks this? Empty case, single element, maximum size, duplicate values, the boundary between two branches.

Years later that habit is why I think about the ugly call before the happy path when I build an agent, and why I insisted on honest staleness signals in AR overlays instead of a confident dot that might be lying. The contest version is "your solution fails on n equals 1." The production version is "your booking flow fails when the caller gives a date in the past." Same reflex, higher stakes.

3. Constraints tell you the answer

Every contest problem hands you the constraints up front, and reading them properly is half the solve. If n can be a million, you know your approach must be roughly linear before you have written a line. If n is twenty, you can brute force it and the clever solution is a trap.

This translates directly and almost nobody does it. Real projects also come with constraints, they are just not printed at the top of the page. How many calls a day? How stale can this data be before it is dangerous? How long will a user wait before they hang up? What can this absolutely never get wrong?

I now start engagements by digging those out before touching architecture, because they collapse the design space fast. It is why an AR overlay for a firefighter and a voice agent for a clinic end up with the same architecture underneath: both have a hard latency constraint and a hard correctness constraint, and once you read those honestly, most of the design decides itself. I wrote about that convergence in what public-safety AR gave my AI work, and it is the same reading-the-constraints move both times.

4. Working under a clock without falling apart

Contests are timed, ranked, and public. You will fail in front of people. You will submit something wrong and watch the scoreboard move without you. You learn to keep thinking clearly while behind, and to make triage calls under pressure: this problem is not going to fall in the time left, move to the one that will.

That composure is worth more than any algorithm. When I stepped in as CTO at RAQTS during a critical phase, the technical problems were solvable. What the situation actually required was staying calm with a deadline moving toward me and choosing what not to do. Contests are a cheap, safe simulator for exactly that, and five years of them changes how a bad Friday feels.

What I had to unlearn

Now the part nobody says at the awards ceremony. Competitive programming also installs habits that are actively wrong outside a contest, and my first year of real client work was mostly discovering them.

Contest code is write-once, and production code is not

In a contest, code lives for five hours. Variable names are single letters. There are no tests, no comments, no structure. It is optimal for the environment and it is a disaster in a repository someone else has to maintain next year.

Real code is read far more than it is written, usually by someone who has never met you, often by you having forgotten everything. I had to consciously slow down and write for the reader, not the compiler. Clear names, obvious boundaries, code that explains its intent. The speed I had trained was speed at producing a throwaway artifact, and the job was durable systems.

The hardest problem is rarely the algorithm

ICPC selects for one skill: solving a well-specified problem. Someone else already did the hard part, which is deciding what the problem is.

In real work, that specification does not exist. The client describes a symptom, not a requirement. The actual difficulty is figuring out what should be built, what it must never get wrong, and what everyone is assuming without saying. Almost none of my production time goes to algorithmic difficulty. It goes to ambiguity, integration, edge cases in other people's systems, and human factors.

That was a genuinely humbling adjustment. Being extremely good at the last mile does not help if you are running the wrong direction, and I had to build the taste for problem definition from scratch. It is now most of what I actually do, especially holding CTO roles across several companies at once, where judgement about what to build is the entire deliverable.

So is it worth it?

For a student asking whether to spend two years on competitive programming: yes, if you go in knowing what it is. It is a gym, not a job. It builds problem-solving stamina, correctness instincts, and composure under pressure at an intensity that normal work will never give you, because normal work has deadlines measured in weeks and lets you look things up.

But treat it as one input, not the whole education. Ship something real alongside it. I was freelancing in Unity through university while competing, and the combination is what mattered: contests taught me how to think when I am stuck, and client work taught me what is worth thinking about. Neither one alone would have gotten me to AR systems for public safety or to production voice agents.

The people who plateau are the ones who believe the contest ranking is the skill. It is not. The ranking is a side effect of having practiced not-knowing for thousands of hours. That is the transferable asset, and it does not expire when the tools change. I have been paid for C++, Unity, mobile SDKs and now LLM agents, and every one of those transitions was survived with the same muscle a five-hour contest builds: sit with the unfamiliar problem, decompose it, attack it, verify it honestly, and do not flinch at the clock.


I build software and AI systems for teams that need the hard parts done right, from XR platforms and cross-platform SDKs to voice and chat agents. If that is you, my inbox is open: more about my background here, or book a call.

FAQ

Does competitive programming make you a better software engineer?

Yes, but not for the reason most people assume. It does not help because you memorized advanced data structures, since almost no production work is algorithmically hard. It helps because it trains a specific relationship with an unfamiliar problem: you learn that being stuck is a temporary state you are responsible for exiting, you learn that correctness is verified rather than felt, you learn to read constraints before designing, and you learn to keep thinking clearly under a clock while other people watch you fail. Those four habits transfer almost intact to real engineering, and they are far rarer than algorithmic skill.

What does competitive programming not teach you?

Two big things. First, contest code is written to live for five hours, so it optimizes for speed of production with single-letter names, no tests and no structure, which is exactly wrong for code that other people maintain for years. Second, and more importantly, contests hand you a perfectly specified problem, which means someone else already did the hardest part of real work. In production the difficulty is almost never the algorithm; it is deciding what should be built, what it must never get wrong, and which unstated assumptions everyone is carrying. That taste for problem definition has to be built separately, usually by shipping real things for real users.

Is ICPC worth the time for a computer science student?

It is worth it if you treat it as a gym rather than a job, and if you ship something real alongside it. Contests build problem-solving stamina, correctness instincts and composure under pressure at an intensity normal work will never provide, because normal work runs on weeks and lets you look everything up. But the students who plateau are the ones who mistake the ranking for the skill. I competed through university while freelancing in Unity at the same time, and that combination is what mattered: contests taught me how to think when I am stuck, and client work taught me what was actually worth thinking about.

Building something in this space?

I take on AI-agent, automation and product work directly — scoped fast, shipped fast.

Book a discovery call →

Keep reading