return "reflections on a batch";

Monday, December 19, 2022

There's a tradition at Recurse Center of writing a Return Statement after your batch. I'm not sure of the origin of the terminology, but it seems like it's a pun on the return statement in programming languages. It's a great tradition, and it gives me a good motivator to reflect on my batch and share those reflections.

This is going to be a ride, so buckle up. First I'll go through what was life-changing and formative about this period for me. This is going to be very personal and not so much about programming at first. Then I'll go through what I worked on during RC and what the batch was like.

RC has been life-changing and formative

I've mentioned in a few of my previous posts about RC that it's been a formative, life-changing experience for me. There's a lot to unpack there. And sorry if you came here expecting mostly programming things: a lot of this section is wholly unrelated to programming!

I came into RC expecting it to be an excellent, fun time where I would be restored and learn to love programming again, and to improve as a programmer. These things did happen! But there were also some unexpected things that happened.

The main theme of the unexpected things is self-discovery. I guess in retrospect it's not surprising that in a warm, welcoming community where you're self-directed, a lot of self-discovery can and will happen. But I didn't anticipate it, and I'm so glad I got to experience it!

The most major self-discovery was that I want to use they/them pronouns (but he/him pronouns are fine)1. I haven't been in many spaces before where the cultural norm is to give your pronouns. I've been in spaces before where you can2, but in a space where it was a norm, suddenly I had a box staring me in the face and I felt very uncomfortable writing "he/him" because that felt wrong in some way I can't capture in words.

I started out the batch with he/they pronouns, since people used he pronouns for me mostly so it felt like the default safe choice? My identity was very much rooted in what other people saw, and I knew things felt a little off, but I went with it. As people used they/them and he/him for me, I got to see what felt right. Partway through my batch, I flipped it to they/he to signal my preference, and now I'm mostly using they/them pronouns when there's a box I can put them in.

This has been an interesting experience of accepting my identity and my lack of affinity for the masculine gender. In particular, it has made it a lot easier to accept some of my preferences and be myself. I think at work, I'd like to set a norm of providing pronouns, because it's important to make sure everyone has space to express who they are.

Another major self discovery was that I am a writer3. I've always enjoyed writing, and I think I'm halfway decent at it, but I would think "pssshhh I'm not really a writer." No, that self-doubt and lack of confidence has stopped.

You know why I know I'm a writer? Because I love writing and do it just to do it. And I've been doing it quite a lot. I'm up to over 33,000 words written on my blog this year, and I'm going to keep up the momentum and keep writing. Writing has been an incredibly important part of my life for a while (it's how I think, it's how I communicate best, and it's a big part of my success as a staff engineer), and I'm recognizing that it's part of my identity.

Another unexpected self-discovery was that in the right environment, I gain energy from social interactions. I've long identified as an introvert and been generally drained by social things and interpersonal reactions. In a work context, conversations with people and pair programming were very draining. It turns out that in the right environment and with the right mindset, these things are incredibly energizing to me. Nearly every interaction I had with a Recurser left me more excited and more energized. I quipped in the first week that I was an introvert getting extrovert energy, and I think that captures it well.

The big thing that contributed to this shift was the environment and the culture. The environment was one where we all had a shared purpose and we all chose to be here, we were all excited to be here. Every single person was nice (not a surprise given the criteria for admission) and the social rules at RC set a nice baseline for behavior. It certainly changed the way I think about my interactions and changed my assumption that interactions with people necessarily drain my energy.

Okay, that's probably it for the really squishy personal stuff. Now onto some of the more programming-related stuff. I mean, it's still squishy personal stuff.

One of the things I did during RC was learn in the open. I wrote a lot on my blog, and I posted check-ins every day where I detailed what I had done, what I was working on and thinking about, and the challenges I was running into. This was very new for me. In the past, I've always waited to talk about details of things until I'm sure that they're "ready." This was an element of being afraid to fail or be wrong, and some amount of judgment that may come along with that. In contrast, during RC, I learned to put myself out there and I got to experience how helpful it was—both to me and to other people. I'm going to keep doing this as much as I can.

Related, I learned how to pair program more effectively. More fundamentally, I learned what my hangups with it were. In my first week, we did some pairing exercises, and I noticed that I would freeze up during pairing. After getting off the pairing call, I'd often have this experience of immediately realizing what was blocking us, or look up one thing and figure it out. But during a pairing call? No chance.

With a lot of introspection and advice from batchmates and the facilitators (shoutout to James Porter in particular!), I was able to figure out what was blocking me from making the most of pairing: It felt performative to me. I think this comes from many years of being an honors student or star employee and being expected to be right and have the answers, and I internalized that. But that's not helpful, and none of us know all the answers. I learned how to be vulnerable and how to take a beat to think, to read the docs, to take a break. That shifted my relationship with pairing. It's still a somewhat draining activity, but it's going to be a regular part of my work going forward. I love it.

I also learned what I want to do with my time and my life. I mentioned above that I'm a writer. I used to say I want to start a startup or other business. It felt like the thing I should do in order to "control my destiny" and be able to choose what I work on, to an extent4. No, I want to keep doing what I did at RC: learning, experimenting with technology, and writing about it. I'm fortunate to have a job where I have a lot of flexibility (our leadership is pretty forward-thinking) so I have reasonable hours and four-day workweeks. I'm going to make the most of my time and lean into this as much as I can on my Fridays, mornings, and evenings.

Related, I learned how to engage with projects consistently and let go of them when I'm done with them. I don't mean when they're done. I used to feel this need to ship projects, to completely finish them (as if a thing is ever finished!). Not anymore! Now when I've gotten out of a project what I wanted to learn, and maybe written about it, then it's done and I can let go and move on. I love you, projects, and I have to move on to another one now! It's very liberating, and it lets me learn about so many different things.

Similarly, RC put into focus how I spend my time, so I learned to focus on the things I really want to do and engage with those projects consistently, not with the ones that aren't how I want to spend my time. I've cut out any exploration of devops things in my personal time because while it's useful, it's not what I want to spend my time on! And I've leaned into learning about programming language interpreters right now, since they're so interesting and fun.

Another one which I've written about before, but is worth mentioning again, is my evolution of thinking on open-source. Letting go of shipping things as potentially-commercial projects meant I could really lean into copyleft licenses. It's really freeing to think about starting projects and realize that I can make them, license them under a copyleft license, and rest easy knowing that if the code is useful and someone wants to use it, they can. It's a big mindset shift to also chain myself to the mast of open-source and not allow myself to make a proprietary version of my code (once there are any other contributors).

I think that's the major formative and life-changing things from my batch. I'm sure I'm forgetting something, though. So much happened in the batch.

Which naturally leads into...

How did I spend my time during batch?

My time was generally split into four buckets: working on my projects, talking to individuals, working with groups, and going to events.

A typical day would generally start at 8am with my check-in call. Then I'd probably have a coffee chat, or take our toddler to preschool. By 9:30am, I'd be at my desk and in the swing of things, so I'd spend the morning making pretty good progress on my project or pairing with someone on it or theirs. Then I'd take lunch, sometimes over a meaty subject like proving theorems in Coq. In the afternoon, there were often more groups, and I'd have some coffee chats or pairing sessions and work on my projects. I wrapped up my days at 5pm. I'd usually come back and write my check-ins around 7:30pm, after our kids were in bed.

But days were variable! I bounced to so many different things, and took opportunities to pair or attend events as they arose, so I didn't really stick to a firm schedule. I was also kind to myself and listened to my brain. If I wasn't into something that day, I'd work on something else.

So, here's the laundry list of things I did:

  • Wrote a key-value store which can beat Redis's performance multi-core and comes close on single-core.
  • Wrote a chess engine that can beat me if I'm playing fast but not if I try hard.
  • Explored immediate-mode GUIs for my chess engine and learned that oh, no, I really do love the web, thank you very much.
  • Wrote a check-in post every day of batch that wasn't a holiday, and some that were. This was about 60 daily check-ins.
  • Attended UTC-friendly check-ins every day at 8am Eastern. These were a cornerstone of my RC experience, because I got to have a call with the same folks (spread out all over the world!) every day, and it was such a good crew. I love you folks!
  • Had about one coffee chat per day (sometimes they'd bunch up), so about 60 coffee chats across the batch! This was a wonderful way to get to know folks, share common interests, and hear about different life experiences.
  • Read through most of the Red Book and read a bunch of the papers from it, presenting them in the group.
  • Wrote 25 blog posts, totalling over 32,000 words, during my batch. I got in the rhythm of writing and it feels profoundly good and correct.
  • Pair programmed a lot, probably three times per week on average. I started out around once every day, but then tapered off near the end, so I think it rounded out to about this. I really loved the pairing experiences at RC, and I can't wait to keep doing it going forward!
  • Worked through five chapters of Logical Foundations with a few other brave souls. They've outlasted me. I threw in the towel, but had a ton of fun in the chapters we did work through. (We also tried learning Lean first. There's a reason we switched to Coq.)
  • Wrote a (portion of) a chess database, which I'm still working on and is slow going! This project has been very fruitful and I've learned so much about systems programming, Rust, and databases.
  • Worked through the first project in Crafting Interpreters. The second one is still in progress.
  • Learned a little bit of category theory, then let go of that pursuit because I was stretching myself too thin.
  • Went to a few full-stack web development meetings, but let go of that mostly during batch since I wanted to focus on new-to-me things instead.
  • Learned about homelab things with my fellow homelab enthusiasts!
  • Bought and set up a very overkill homelab server, which then turned out to be not at all overkill for the chess database project.
  • Did a few leetcode problems with people as a fun way to program together.
  • Did the first few Advent of Code problems, and abandoned it when my batch ended as I was going to be short of time since I was going back to work.
  • Attended the weekly Rust meeting! It was super fun to have a group of fellow Rustaceans to discuss things with, and it was a good way to measure my progress on getting comfortable with Rust. At the beginning, a lot of the discussion went over my head. By the end, I was pretty comfortable keeping up.
  • Did the weekly reflections meeting every week and helped keep it running after the facilitator for the first half had his Never Graduation.
  • Attended weekly presentations, and presented a few times on my projects!
  • Switched my primary git forge to SourceHut instead of GitHub.
  • Learned some Idris and decided it's not for me right now.
  • Rediscovered the joy that is computers and writing code.

RC was pretty intense for me, in a delightful kind of way. Now it's time to find a sustainable balance.

What's next?

Well, what's next for me is that I've gone back to my day job, and I'm loving it. We've got a great team and a great culture. And I'm continuing on with Recurse Center. After your batch, you Never Graduate, and you stay a part of the community. I wrote most of this post while hanging out in a writing focus group with people from Recurse Center, and I'm so thankful for the community and being able to remain a part of it.

As for you: I'm not sure, but if you think Recurse Center sounds appealing, you should apply. It's an amazing community of wonderful people, and it has been life-changing for me. It isn't life-changing for everyone (that would be quite a high bar!), but the experience is pretty excellent all around, and it's a great place to become a better programmer regardless of how much or how little experience you have.

If you join Recurse Center, welcome. I'll see you on Zulip.

And if not, no worries! Always feel free to reach out to me if you want to chat, whether that's Recurse Center or Rust or espresso or anything else!


1

For me, this is like my name. If you call me "Nick", I'll know what you mean and I won't be offended, but it sounds wrong to me, makes me slightly uncomfortable, and I'd really prefer you call me "Nicholas". Exact same thing with they/them pronouns vs he/him pronouns.

2

Fun fact, the first place I put he/they pronouns (as an early experiment in identity) was in our performance review system. I'm not sure if anyone noticed, because I think only one person had the possibility of even seeing it. But it felt good.

3

Some of the impostor syndrome remains, and may always. While writing that sentence, I started with "I'm comfortable identifying as a writer", which is such a passive way of saying it. No, fuck that! I'm not just comfortable identifying as a writer, I am a writer!

4

In reality, I can't think of any worse way to choose what I work on than starting a startup. I'd have to focus on all the other things that go into it rather than the things I really want to work on.


If this post was enjoyable or useful for you, please share it! If you have comments, questions, or feedback, please email my public inbox or my personal email. To get new posts, please use my RSS feed.