RC06: return "reflections on a batch";

December 30, 2023

I'm attending the Fall 2 batch at Recurse Center! Posts in this series cover things I'm working on or find interesting during my time here.

Now that my batch has come to an end, I’ve been reflecting on my time at Recurse. There’s a tradition of writing return statements at the end of one’s batch, and I thought this would be a nice way to complete the posts in this series. This post covers how I spent my batch, some highlights from my time here, and reflections on my Recurse experience.

Virtual and real spaces

While the Recurse Hub is in Brooklyn New York, I spent the majority of my batch from Chicago. I was initially apprehensive about doing it remotely but it turned out that my fears were (thankfully) misplaced. The remote Recurse experience was much better than expected, even after comparing to my previous experience at a remote-first workplace, which I thought did quite a good job. Being an hour behind New York also made it easier to follow the core Recurse hours.

A large part of the enjoyable remote experience was made through the tools and environment. There’s Virtual RC, an online social space to mimic the experience of working together at the Hub. A neat feature that I like from Virtual RC is that I could see the Recurse meeting rooms in it and whenever someone joins a call, their avatar appears in the meeting room. Although seemingly trivial, it gave me a sense of being in the same space as everyone else. Additionally, all core Recurse activities are done online and Recursers at the Hub dial in from their computers instead of having a hybrid conference call setup which I’ve found sometimes encourages people in physical meeting rooms to neglect those on the call. More importantly, there was also a critical mass of other remote Recursers in my batch and that helped make the remote experience feel less alone.

Sometime mid-batch, I did manage to spend two weeks of my batch in the Hub. The experience in the Hub definitely felt different. Richer in a sense, and definitely more social. Personally, I appreciated talking and interacting with other people in the same space, unmediated by network latency. I also enjoyed the serendipity of being together in the same space. To be honest, I think being in the space transformed my Recurse experience. Having the opportunity to meet and grab meals with folks that I was previously interacting with only through Zulip and Zoom calls changed the quality of the relationships. And I also got to discover many more disparate and fascinating projects going on as I talked to more people by chance, usually at the pantry.

What I worked on

One of the main goals I had at the start of my batch was to dive deeper into Rust. I’ve previously read The Rust Book and implemented a toy DNS resolver in Rust, but I felt that I still didn’t get a real feel for working with the language. Implementing TCP felt like a natural next step to continue exploring Rust. If you’re curious about how that went, I wrote more about my experience implementing TCP from scratch in a previous post.

I didn’t just work on TCP during my batch. I also joined a Rust for Rustaceans reading group and another group of Recursers working on the cryptopals challenges. For some reason, I never thought I’d be interested in cryptography, but doing the first few challenges and then discussing them in a group were so fun that I ended up joining this group and also started following Dan Boneh’s online cryptography course. I learnt about semantic security, stream ciphers, and block ciphers such as DES and AES. I also learnt how a Vigenère cipher works and how to write a program to break it using frequency analysis.

Both cryptopals and Rust for Rustaceans were unplanned before I joined the batch, but they turned out to be very synergistic with my goal to learn Rust. Using Rust to solve problems in different domains also allowed me to experience different aspects of Rust, cross-pollinate ideas, and overall strengthen my understanding of the language. Meanwhile, reading Rust for Rustaceans provided inspiration on what features of Rust might be useful. For example, I learnt about the typestate pattern in Rust from it and this turned out to be perfect for my TCP implementation.

Although my main focus for Recurse was learning Rust, I didn’t just work on that. Some additional highlights include:

  • Starting a newsletter for friends and creating a new domain for it. This taught me how DNS records for email work and finally gave me a reason to try out 11ty. I also learnt that cool URIs don’t change.
  • Learning about Bret Victor and participating in reading group discussions on his works, such as how to design a programming system for understanding programs and going up and down the ladder of abstraction.
  • Having all the fun coffee chats I had with Recursers talking about a wide range of topics. From the need for poetry in software to conceptual metaphors in language, and from optimising compiler IR using reinforcement learning to writing Game Boy emulators in Go. I also had a number of fun discussions about emacs, attended a show and tell session and discovered the interesting, idiosyncratic and creative ways Recursers use emacs for fun and productivity.
  • Attending industry related talks organised by the faculty, such as an AI Safety group talk, a panel discussion on working at AI startups, and a talk by a successful open source project creator.
  • Attending a workshop on the creative process and talking about how writers and film makers work to gleam insights into how they might be useful for making software.
  • Giving a non-programming talk on Japanese green teas and attending talks on a multitude of topics such as oil painting in the outdoors, the absurdity of ultra-light backpacking, and on making software and sculptures.

Looking back

On working at the edge of one’s abilities

I can’t quite remember how I wanted to spend my time when I started, but looking back, I’m quite happy with how I ended up spending my time. I thought there were some things that I could have done differently—for example, time box my investigating of raw sockets and TUN devices better, consult the tutorials earlier, and pair more—but in hindsight, I think they weren’t exactly mistakes. Or perhaps they were necessary mistakes as I did want to give myself the space to explore and the opportunities to encounter dead ends and figure things out along the way.

More importantly, I discovered the difficulties, disorienting rewards, and importance of working at the edge of my abilities. And to code when in doubt. I wanted to figure out how to implement TCP without a guide and although I did eventually consult them at certain points, I think I gained a much deeper perspective on TCP and networks programming than if I had just followed a guide like I did for implementing DNS. The experience of implementing something from reading some RFCs and consulting examples and guides online also made me much more confident in my abilities.

Sometime during week 7, I found myself debugging a number of Rust and system call bugs on my own and without much help. Suddenly the compiler errors were not a cryptic message from a distant world, but mostly understandable errors. I remember feeling a distinct sense of progress with Rust then, and a sense of achievement.

At Recurse, working at the edge didn’t mean working alone. A good number of times I was stuck and asking and discussing on Zulip helped get me unstuck quickly and also have a much better sense of the issue at hand. I got to experience first hand what a kind and welcoming community could be like. No question was deemed too trivial or stupid. And I saw this in how the questions were received and answered: even the most basic of programming questions were answered thoughtfully.

On a more personal note

Recurse has been a transformative experience for me. It has rekindled my joy in computing and allowed me to meet so many amazing and kind people passionate about computers (and also lots of other things). It also redefined how I thought about writing software and programming as a discipline. I had the chance to discover so many fun and unexpected ways to use computers, meet people who’ve worked in many diverse industries, and have interesting chats and discussions on working in and writing software.

I learnt that in the right environment I actually gain energy from interacting with people. I spent two weeks at the Hub and since I planned to spend only two out of my 12-week batch there, I made a point to be more social. Being a serial introvert and generally reserved person, this didn’t come naturally, even if it were in a more familiar social environment like Singapore. I was expecting to feel tired some time midway through my visit. Every day, I was talking and meeting with so many people, sometimes late into the night. But the anticipated social exhaustion never came, I only felt energized whenever I was walking back home, even after a long day, and felt really excited for the next day ahead.

Never graduating

It’s so easy to get distracted and nerdsniped at Recurse. The things and projects I mentioned above are just a sliver of what goes on. There’s a whole other group of people working on ML, compilers, niche PLs, data visualisation, etc. In fact, a very important muscle to practice here is saying no. There were a lot of things I was interested in and would love to dive into but didn’t quite have the time for. I did have to reprioritise my batch as it went along. For example, I stopped doing the cryptopals challenges sometime during week 7 to focus on TCP. I do plan to continue working on it from time to time after my batch. And also to explore the intersections of computer networking and cryptography.

Computers are really special, to me at least. But what makes Recurse truly special has been the people at Recurse: the faculty, Recursers themselves, and the alumni. I’m really grateful to have had the chance and privilege to attend Recurse.

If what I’ve mentioned here about Recurse sounds appealing to you, I’d encourage you to apply. Recurse is truly the place to go down computing and programming rabbit holes, and I mean that in the best way. If you’re unsure and would like to find out more, feel free to email me.

Stacey Tay

Hi! I’m Stacey. Welcome to my blog. I’m a software engineer with an interest in programming languages and web performance. I also like making 🍵, reading fiction, and discovering random word origins.