Don’t spend too much time on infra.

Once I was #3, I decided it was a good time to clean up my codebase and add cmake + other niceties to make development easier. This led to openload in it’s current form. Before this, every challenge was a solution.cpp in it’s own folder, with a makefile scraped together. (2025-03-27) Breaking Highload Orderbook also convinced me that there was significant edge in reverse engineering the input generators for every problem, and the project I set out on evolved into replicating HighLoad’s entire execution environment at home. This went to the point where I had CI and versioning on my internally hosted repo for solution releases I would do, so I could benchmark solutions against each other, and several custom environments for profiling.

Was it worth it? Probably not. But I did learn how to set up CI, versioning, testing and other Cmake best practices. This experience also showed me why most academic code is poorly written crap; the objective of the code is not to be robust, it’s to prove a hypothesis. I think it’s very similar with submissions; the objective of the code is not to be pretty or robust or bug-free; it’s to achieve the highest score. Which explains my next topic.

Ideas beat execution/analysis/profiling

Your value functions may differ, but if you (like me) think that good infra will boost your iteration speed, the limiting factor in HighLoad is how fast you can come up with and reject/accept ideas instead of how well you can write code. It’s more like research in that sense compared to engineering. With AI tooling being as good as it is right now (it wasn’t 8 months ago), it’s effectively free to build good infra/tools, and it’s no longer a tradeoff to focus on infra v/s research. Most often, the best feedback loop is to write code and throw it on the server to see how well it performs instead of buying a haswell machine and benchmarking against your past 5 versions of the same problem.

At higher levels, after you master SIMD and microarchitecture and memory bandwidth and systems concepts in general, HighLoad reduces to optimizing a single score function in the search space of code. If that seems like something Claude Code or Cursor can do well without human intervention, you would be right. Which segues nicely into the next point:

The AI Dilemma

The current highest score on the leaderboard is significantly AI assisted. Since there’s no AI policy yet, this is fair game. To explain what I think of this, I’ll use a small thought experiment. Star Trek has an appliance called a [Replicator](https://en.wikipedia.org/wiki/Replicator_(Star_Trek), which is usually used to synthesize meals on demand. It takes a lot of energy, because it’s constructing matter out of pure energy, so people get replicator rations. There’s still a galley on the ship and a cook, so clearly cooks (read: software engineers) haven’t been made obsolete in this paradigm.

Let’s say you pick up cooking as a hobby and have access to a replicator. You want to make a steak. Would you:

  1. Ignore the replicator, grow the ingredients on your own and cook a steak
  2. Ignore the replicator, go to the market for ingredients and cook a steak
  3. Create the ingredients from the replicator, then use them to cook a steak
  4. Ask the replicator to replicate a cooked steak, then plate it up yourself
  5. Ask the replicator to replicate a complete seasoned + plated steak

You would probably not do 1, that would make you a cattle farmer. 2 is a reasonable compromise, but you’re probably doing 3. If you do 4 you’re no better than an italian handbag maker, and 5 is a disrespect to anyone that cooks for a hobby. Would you feel proud about taking your replicator steak to your cooking club and talking about all the 5 seconds of time and love you put into it?

I do performance engineering because it makes me understand systems more deeply. I’m not understanding systems more deeply if the AI is doing performance engineering for me. You learn performance engineering when the syscall you’re calling is returning a nonzero exit code and you finally realize why when you’re 300 lines into it’s manpage. There are some things that need to be muscle memory for people who are good at their craft, and you build muscle memory by exercising the right muscle. This sentiment is not restricted to programming: Marco Pierre White still chops his garlic by hand. Why doesn’t he use a food processor, or garlic paste?

The way to becoming a better engineer is to do more engineering. Language models make that easier; if you did 3, you save whatever time it takes to go to market and pick the right ingredients. You’re arguably not training the skill of selecting the right raw ingredients, but the time saved is spent in cooking more and making it easier to start cooking. The replicator if used right makes you a better cook, but you have to use it right. And it’s no substitute for effort. If the replicator can do anything you can do, you’re replaceable unless you can do it for cheaper, faster or better than the replicator.

You can strawman this argument and say that software is an industry and not a hobby, and my argument only applies to hobbies and not industries. I see a big push online in the narrative that coding agents will replace software engineers in industry. That’s incorrect. People in any industry are paid for value added. If any programmer can throw claude in a loop and have it churn out solutions faster, better or cheaper than they can, they’re no longer programmers but factory workers. Food is also an industry, and PepsiCo or Nestle still have cooks working for them because they add tangible value to the business.

The way forward, then, is to make sure you’re adding value. You add value by doing something the machine cannot do cheaper, faster or better than you. And if you can’t add value right now, you learn how to add value by putting in the effort. There is no substitute.

Are these still the right problems to solve?

So if AI can do these problems faster, better and cheaper than I can, are they really the right problems to solve?

If you’re a beginner, then yes. I think they are great challenges and you’ll have a very strong grip on SIMD if you put effort into doing all of them. If you’re just picking up a new language, then yes, they will help you come to grips with the language (eg Rust or Zig).

Personally for me, I don’t see a good reason to continue. There are other problems to solve. I have a GPU and want to reimplement flash attention and optimize kernels. I want to play around with processor trace and build better profiling tools. I want to deep dive into the memory hierarchy and find out exactly what makes the prefetchers/page fetchers work. I also balanced a very consuming full time job while doing this last year, and it left very little time for me to enjoy the other things life has to offer.

This doesn’t mean I’m going away. I want to set atleast 3 good problems this year, and I already have a few ideas on some good problems.