Six weeks of programming at the edge of my abilities and being stuck
Recurse center yield statement
Recursers are encouraged to write a “return statement” upon completion of the three-month programming retreat in New York.
I’m now halfway through my batch, will leave NY soon and so I think it’s a good time to look back and think about how I spent my time, and what I am going to change for the next weeks.
RC gives you a space, a cohort, and an excuse to recruiters in your inbox and the sensible voice in your head that wants you to talk to them.
With that comes a lot of freedom to fill your time with whatever you feel like.
I had tons of ideas about what I wanted to do, but the overarching theme was:
Become a dramatically better programmer and build something that impresses myself
But how?
I had many ideas.
Learn how the computer, the machine I use every day for work, works under the hood. Demystify “low-level” computing closer to the hardware. How to write performant or parallel code? Understand distributed systems…
I also find WebAssembly (WASM) very appealing. I don’t really know why and know almost nothing about it. The acronym sounds cool, I guess. And it’s a way to deliver apps with near-native performance through the browser.
Applications are another thing… Most of my experience programming is building either libraries, dev tools, or scripts for ML or scientific computing. Beyond simple websites or React, I have little experience in building something that corresponds to the first association you have when you think about “Apps”.
On top of that, I wanted to write regularly and find some time for random explorations, doing what I feel like, building agency, volitional muscles, and a sense of what I like doing because I want to, not because I’m committed to something because I’m paid, or agree to it a while ago.
Interestingly, the list contains little to no ML. Maybe I’m kinda done with the hype. I’ve got pretty far in two processes at big LLM labs. But it felt so much like a chore that I did not care for long when I was rejected after six rounds of interviews.
Anyway, the main thing was, that I wanted to focus on my skills as a software engineer, owning bigger projects and making up for any lack of a CS education.
Learning Rust is something that ticks a lot of these boxes. It’s a language closer to the hardware and requires manual memory management. The projects it’s most suitable for are ones where performance is critical: systems programming, compilers, that kind of thing. It also compiles to WASM (or can generate WASM — I really don’t know much about it).
Getting my Rust to a level where I can contribute to established production codebases seems like a decent way to measure if I have become a dramatically better programmer.
Kicking Things off
I started the first week by signing up for a presentations on Thursday. Mostly to force myself to get something out the door and not get lost in analysis-paralysis about the perfect project. Just build something. Anything…
I ended up building an ASCII art generator that could transform images or videos into ASCII art. It was mostly glue-code around FFMPEG (a popular library for transforming images and video). But it was a project, in Rust, and it worked.
Afterward, more or less on a whim, I decided to build a blockchain from scratch. I had a rough mental model of how they worked and did a lot of claude ping pong to come up with a decent architecture always retyping the output to build muscle memory and keep the fingers busy.
That worked for a while and I made decent progress. Until it didn’t. I was led by the fact that LLM output always seems reasonable, sensible, and even smart, but ultimately not isn’t thought through led me into a spaghettified mess that made me abandon the codebase.
The effort wasn’t in vain. I learned a lot about Rust and what not to do, but clearly, using LLMs wasn’t the right fit at this stage.
I decided to give the blockchain another try. This time I used a book: Building Bitcoin in Rust. That worked well. At first.
The problems were different. With Claude, I was always alert that it could hallucinate, provided relevant context, and crafted the necessary prompts. The spaghettification was much more a symptom of me learning blockchain concepts on the fly, than of me not paying attention.
This is different when you follow the implementation of a book. The author knows their stuff. So it’s a constant effort to think through the code and not zone out and simply copy.
But the blockchain worked. Time to move on to new and better things.
I still wanted to learn something new but at the same time not use anything that pre-chews my Rust. It’s not enough to only feel, see, and type what works. I also want to see, feel, and type what doesn’t.
I started working through with Maelstrom. You implement different, increasingly sophisticated distributed system consensus algorithms (CRDTs, Raft) and they provide a testing framework so you know if your implementation works.
Their guide uses Ruby which, compared with Rust, reads almost like pseudo-code. This way I could learn new concepts while still going through all the struggles of writing Rust — this time without the help of an LLM.
I had worked more than half of it. Only sporadically checking the guide has its downsides, though. I missed that the different chapters were not intended to be backward compatible and once I realized I had lost about a day debugging an issue that was not because of an error in my implementation, but because the test change per chapter, I decided to throw the towel — at least for a day.
That’s when I turned to Astral’s Ruff (a Python linter, written in Rust). Initially, I wanted to only clone the repository and click around a bit to get a feel for a professional codebase.
But I found an issue that seemed innocent and recent. It was a little more involved than I thought, but 2 days ago, I got my first contribution to a production Rust codebase merged and can tick that box.
Since then, I’ve added two more pull requests, one of which is a substantial expansion of existing features.
So how do we go from here?
I will definitely go back and work a bit on Maelstrom. I like learning distributed systems and learning a lot about Rust when I know what I want to program but not yet how.
I also want to continue making PRs to open source projects. If I were to merge 10 or 12 throughout the remainder of my batch, I would be pretty proud of that.
But the open source work is different. It’s much more communication, research, idiosyncratic conventions of the Ruff codebase, and much less busy finger code throughput.
It’s also not a substantial project I built on my own from scratch.
I am thinking about building a distributed database system or a compiler.
I’m also planning on building a (simple) real-time multiplayer game with a Rust backend together with a friend.
I have yet to touch WASM. Maybe I won’t. Maybe I won't build an “App” either. Nor have I followed many rabbit holes outside of Rust, performance and systems engineering, or distributed systems (except for a one-day game jam).
That doesn’t matter as long as I feel I have achieved my intention from above. Maybe not everything needs to be precisely measurable. Maybe feeling counts.
Already I feel that I am a much better programmer. I don’t know if people would consider me a senior or if I would pass the hiring bar as a senior software engineer. But to the extent that being senior is a state of mind, I am.
One thing that I have to figure out for the remaining weeks is focus. So far I’ve tried many things. And what I just mentioned above as a plan is basically: Do what you did so far and more.
That’s not going to work.
I already start every day setting goals I fall short of (surprisingly, I’ve already achieved enough that I could stop the batch today and it would still be a success).
Yet, the “building something that impresses me” part is non-negotiable.
So what can I drop?
WASM? Maybe. Maelstrom? But then I basically ragequit and never picked it up again. Ruff contributions? They eat a lot of time, but they’re also really cool (and useful for getting a job, I guess)!
I am doing some things, like reading the Rust book and watching MIT OCW 6.172 (Performance Engineering of Software Systems).
Dropping the book doesn’t make sense. I want to know that stuff.
I also want to know more about performance engineering. But if I am honest, I am just now, as I am writing this, admitting to myself that I stopped with the class about two weeks ago because I deemed programming more important and deluded myself into believing I would watch them at night at home.
I also can’t really throw in more hours, too. A day’s length is finite and it’s 1am again.
I’m at an impasse…
But it’s fun, I’m coding a lot and I’m writing regularly :)
I’ll let you know how this whole thing will resolve.