Recurse Center - Return Statement
The Recurse Center is a self directed programming retreat. I did the W1'23 batch (30th October 2023 to 9th February 2024). This batch was a bit special vs other batches because there was a break in between from 8th December 2023 to 2nd January 2024 during which I travelled to Japan.
Here is my experience from the batch
The Planning
I knew about RC from about 2017, when I met someone who was attending a batch in Bangalore. I wanted to do a batch since then and the original idea was to find time in life to do it in person from NY. Fast forward to late 2022, when I was planning for the year 2023. I thought that I would do a batch in 2023 but RC wasn't yet open to in-person, so I planned my batch remotely.
I just planned it way too early (as RC ended up opening for in-person batches). By February 2023, I knew that I would do this batch at the end of the year. Yes, if that sounds too early and too far ahead, it is true. For the last 2-3 years, I plan my yearly goals ahead of time and I chose this time for an RC batch because
it is easier to take vacations around Christmas (I originally planned to take time off and do a half-batch but by the end of the year I ended up leaving my job to do a full-batch)
winters in Berlin is brutal, I thought it would be a great time to do the RC batch and add a kind, social programming community to dark winter times
The Experience - First Half
I quit my job in September, so I roughly had 1 month before my batch started and I was simply tinkering and having fun building zoid-fs. When my batch started, it was a wonderful experience from the beginning, I met a lot of kind and curious programmers working on the edge of their abilities. Since, I had some momentum with my project, it acted as an anchor and protected me from the overwhelm of multiple streams of things happening at RC, there are always many different tracks of things happening at RC and FOMO can be real.
Timezone wise, I was in Europe, so I had the following setup, I would start working a bit late (I was mostly playing Football in the morning), like 10am-11am and work on my projects till 5pm. Then the US folks are available, so I was using the evenings mostly to pair program, attend events and do coffee chats. This worked really well for me.
With zoid-fs, I originally wanted to build a CRDT aware file system, so you can mount, say Obsidian on this file-system and it auto syncs across machines and there is never a collision. Though while working on the project, I diverted my attention to making it as much POSIX compliant (by running it against a POSIX test suite) and performant as possible. That meant that my data structures (chunked binary per file) is not the best suited for CRDTs and that was okay. It can support various backends and I would in future write a non-efficient (text only files, one DB column / file) backend that supports CRDTs.
However, I was able to do some cool things with this file system, like
Making SQLite in SQLite work
Automatic document sorting with LLMs
Making it a distributed FS by simply mounting it on Turso
(incomplete) Making PostgreSQL createdb work in this FS, so PostgreSQL in SQLite
I also wanted to make a "always" compressed filesystem which led me to the rabbit-hole of my second big project in RC. I started the compression bits and got curious about how does compression **really** work, that led to me building zoid-zip. It is super slow but it does compress and decompress text files and it led me to appreciation for the field of data compression and information theory. I read further a lot about how to make this faster / production ready but didn't pursue to programming those as I wanted to move on to some other things.
It was also during this project that I learned a lot about bit manipulation and ArrayBuffers in JavaScript. In this project, I do all the necessary bit manipulation without using bitwise operators but getting a DataView in which bits are always available in an array, see Uint1Array. I think this is different from any other programming language and pretty cool.
All of this has happened and not even the first half of the batch is over, so of course I felt super productive. Besides, I used the "coffee chat" feature of RC and was meeting new people every day. This was a very fulfilling period of my life.
At this point, I spontaneously decided to tackle a project that I always wanted to do. I got into computers and programming because I used to play game boy games in a GBA emulator roughly when I was around 10-11 years old. I was always fascinated by emulation and decided to take a stab at it. This led to zoid-boy. I still had ~10 days left in the first half of my batch and I didn't want my RC time to become just about this project, so I time-boxed it. I wanted to build as much of the emulator that I can in these 10 days and then abandon the project. When I started, I was relatively confident that I would be able to reach at least a single pixel on screen stage (that didn't happen). I also didn't want to boringly type all instructions, so I wrote a small parser + code-generator that generates the CPU based on the assembly instruction mnemonic. Then, I went through this blog. It goes instruction by instruction and shows the state of the CPU and I just matched the state with the state of my generated CPU. With this workflow, I was able to get the boot rom to a success state and that was the end of this project.
The Break
During the mid-batch break, I travelled to Japan and didn't even carry my main laptop with me. This was my second trip to Japan in 2023 and again one of the best trips of my life but I won't digress too much in this post
The Experience - Second Half
Unlike the momentum of the first half, my second half at RC started a bit slow. The batch resumed on 3rd January 2024 but I was set to return to Berlin on 9th January 2024. So there was a small overlap of travel i.e. unproductive time. Besides, I wasn't sure yet what would I do in the second half of the batch.
Was doing a bunch of reading/side quests (mentioned in the next section) before the first "Impossible Day" of the second half. "Impossible Day" is an RC event where you attempt to do a project in 1-day that you feel is impossible (for you). I started a no-code website builder and that was the foundation of my second half at RC (and till now after my batch).
I wanted it to support custom domains and everything and have a simpler infrastructure/deployment setup. So, I played around with setting up SSL for user defined domains with Caddy and deployments with Kamal and was pleasantly surprised by how good these tools are. Then, I dived into the rabbit hole of CSS in depth and layout system to build such a no code system.
Learned a lot while building this and I am still working mainly on this in the last few months.
Side Quests
So far, I only wrote about the main projects that I worked on at RC. I also did this thing that I call "time-boxables" where I spend 1-2 day doing something like a small project or play around with something, here is a quick list of such things (not ordered)
- Trying to turn my primary dev environment to a NixOS VM. Eventually, there was enough friction that I switched to using Ubuntu VM and now I am back to macOS. I started doing this because building FUSE filesystem experience was way better in Linux vs macOS
- Game of Life, believe it or not, in a pair programming workshop, I programmed game of life for the first time in my life. It was super fun.
- Attended nand2tetris, maptime, crafting interpreters, emulators and VMs group, cryptopals, sadservers for a while on and off
- LLM based cover letter generator (to practice doing automatic document sorting with LLM in the file system)
- Open sourced TrackFootball.app
- Had German B1 exam on 14th November, so smack in the middle of things. That worked out well, I passed
- Update CV for potentials jobs etc + some interviews. Also, landed some "dream roles" at the start of the RC batch, so it didn't work out. This was top tier learning experience though, I feel that saying no to a dream role is super hard and I felt like I levelled up in taking responsibility of my own life when I did that to continue RC + planned sabbatical
- Played around with Calcite, wanted to build an SQL layer on top of FoundationDB. This project is super interesting to me, it died because FoundationDB doesn't work on any ARM processor, so I couldn't get a workflow setup (yet)
- Picked up Effect.website and moved a bunch of small application to Effect. I am sure it will be big in the TypeScript ecosystem
- Wrote a TCP PostgreSQL proxy to hot-swap the user in the proxy. This meant I had to re-implement the secure authentication in PostgreSQL wire protocol
- Fakegres - distributed PostgreSQL built with Raft backed by SQLite (technically this was after my RC batch)
Closing Thoughts on RC and Advice
If you are just going to start a batch or on the fence for doing a batch, this section is for you. Please take it with a grain of salt as everyone is different. What works for me might not work for you
Do regular checkins: in the first half of the batch, I did a written check-in almost every day so I felt more coherent, productive and the time felt slow. In the 2nd half of the batch, I did check-ins sporadically and it felt like that the time just flew by. I didn't do video check-ins though they are available for two reasons, one I prefer written over video more and two it happened at 5:30pm in the evening for me, when I was already wrapping up the coding part of my day
Avoid FOMO: A lot of stuff is happening at RC at any given time and while I had the anchor of my projects. I still felt a bit of FOMO when saying no to events. Luckily, RC has the policy of "never graduating", and these events keep on happening in various shapes across batches. So, you can always do something outside of your batch. I convinced myself of this perpetual availability to say to to more things
Self-directives: RC self directives are super powerful and in one of the related workshops, someone mentioned "when in doubt, write code". This was a very powerful directive for me. It took away all the stuck-ness from things that I experienced as I was no longer bound to planning/doing things right.
People are awesome: RC is a very unique community of kind and curious programmers, my personal experience was better than expected. Not only it was fun to talk to folks doing their own curious projects, there was a lot of positive energy in seeing folks just follow they curiosity and working on things just for the fun of it. Some people ask me, if they can do whatever I did in RC without doing a batch since it is self directed, the answer is no because the people and the vibe make all the difference. When you are working on hard projects and are stuck, it is empowering to see other people share their journeys of pushing through their limits and at RC there are people from various expertise and background, so there is a big chance that you would get unblocked by someone in a pairing session.
Presentations: Presentations is also a great recurring event at RC, folks present all sorts of cool things that I didn't think were possible!
The End
My RC batch was a great and fulfilling experience for me and I will surely do another batch in the future. I am grateful to have shared with likeminded and curious people. If you have any questions regarding RC or are curious about any of my side projects, please don't hesitate to reach out on Twitter.