Day 4 at RC

What a week! RC has been a huge mental (and emotional) shift for me. I still feel anxious about making rapid progress; I hope as I settle on a more concrete direction that I'll be able to manage some of those feelings a little bit better. I feel like I'm shifting more toward a relaxed "let's just write some code" mindset. That feels good.

Self Reflection

I think back to some of the early performance discussions that I had with my managers as I was starting my career. At the time, I think I was reasonably satisfied with my own work. I was solving interesting problems and had a good dynamic with my teammates. It was satisfying to hear that others on the team were also satisfied with the work that I was doing.

Over time, the expectations that I've set for myself have grown. In some ways, I think those expectations may have stunted my growth as an engineer. With each new project or endeavor, it became more and more difficult to be satisfied with my own work. I think this is something I've struggled with since I was young. The first few times that I solved a particular type of math problem were satisfying. After that, I expected myself to be able to solve that kind of problem. There was no joy to be had in demonstrating again that I could solve that kind of problem. I would seek out progressively harder problems to solve while procrastinating on the exercises that I already knew I should be able to solve.

Software engineering is mostly working on things that you are already familiar with in some capacity. Understanding how to structure a particular abstraction or what kind of approach to take while solving a problem is mostly a consequence of experience. With enough time in the saddle, you get to see which decisions have the most significant consequences. When I feel like I am struggling to make good decisions easily, I quickly get frustrated with myself.

In that sense, being at RC feels great. I don't have to justify making a salary. I can convince myself that there are no external expecations which helps me to take it easy on myself.

More about day 4

2048

The little 2048 project that I've been pairing on is shaping up really well. It's a lot of fun to see how different strategies compare with one another. It reminds me a little bit of looking at some of the wordle solvers from the beginning of 2022. I'm excited to pair more on this on Monday.

LeetCode

I paired on a LeetCode problem again. I think I did a really bad job of driving and felt pretty bad in the moment. I was really impatient and didn't take the time to make sure I was on the same page as my navigator. My partner handled the situation really well and asked if we could take a step back to get on the same page.

I think this was a great experience for me. It was a chance to see how I can improve the way that I collaborate, which was awesome. I feel badly that I maybe didn't create the best experience for my partner, but I'm glad that I am getting better.

Crafting Interpreters

I finally dusted off my in-progress C++ implementation of a Lox bytecode interpreter. I think I'm going to forge toward the end with the hopes of thinking more about how to express some of the idioms in Rust.

One of the ideas I've been mulling over: I'd like to write a two-pass Lox compiler in Rust and implement an interactive debugger. If the debugger runtime is sufficiently modular, it should be feasible to get something up and running in wasm with a Rust-based front-end (maybe Leptos?). I think this would be a fun way to build on top of what I've learned while working through Crafting Interpreters while getting a better understanding of the compile-to-wasm space (with some web development thrown in there). We'll see how I'm feeling as I wrap up my C++ implementation.

Databases

I had a great coffee chat with an RC alum mostly discussing databases. I think I definitely want to pursue something in this space. I think I'm a bit anxious about building a toy database but maybe it's worth just trying.

Presentations

The presentations were awesome. It's a lot of fun to see the sheer variety of things that people are working on.

That's all for now

Thanks for reading. These posts will probably continue to lose structure over time. It's a lot of fun to write about random thoughts that I've been having even if they're not quite fully baked.

Day 3 at RC

Day 3 was really packed. Here's a quick summary before I jump in:

  • I started my day by writing down my reflections on day 2 (yesterday's post).
  • Pairing session on a 2048 implementation in python.
  • Heard from a bunch of folks about their plans/advice at RC.
  • Paired on a LeetCode problem in JavaScript.
  • Responded to a creative coding prompt in p5js as part of a group.
  • Paired some more on a neat Pokémon image downloader in async rust.
  • Had a coffee chat with an RC alum to talk about some of our experience in the programming language sphere.
  • Had a really interesting discussion about reusing some open source C++ code to create an LSP implementation in Rust by bridging the gap with cxx.
  • Dove into some of the cxx documentation.
  • Watched the first half of Jon Gjengset's The What and How of Futures and async/await in Rust video.

The rest of this post will be some of my thoughts during day 3.

Reflecting in the morning

I think I like this routine of beginning each day by reflecting on the previous day. So I'm doing it again today!

I haven't done a great job of writing down these kinds of reflections professionally. I don't really know why that is. Maybe it's because I'm not all that comfortable being vulnerable at my place of work? Regardless, I'd like to care a lot less about others' perception of me and my work and focus more on creating things that I'm proud of or excited about. So far writing down some of my thoughts has really helped clarify how I'm feeling.

2048

This morning pairing session was great. The dialogue felt pretty good and there was a nice exchange of thoughts back and forth while producing a good amount of code. We made a solid amount of progress in a little over an hour and had a mostly functional version of 2048 playable in the terminal. We planned another pairing session around wiring up a simple AI to see how well it might perform.

I'd love to work on a more in-depth writeup about this at some point in the future.

LeetCode

I really gravitate toward LeetCode-style problems. In some sense, I find it really satisfying to come up with an efficient solution to a problem. But on the other hand, I don't know that spending time on LeetCode is "working at the edge of my abilities" (one of the self directives at RC). I've spent a lot of time working on competitive coding prompts like Advent of Code, Codeforces and LeetCode. I'm not the best that I could be -- I certainly don't crank out LC hards -- but it's comfortable for me.

I'll probably try to fight the temptation to spend a lot of time on this style of programming throughout the rest of my batch.

Creative Coding

I had a lot of fun navigating on a creative coding prompt. We built an interactive scene where an emoji person was trying to decide on which outfit to wear. It was a great reminder that programming doesn't have to be serious. I think these sessions will be especially good as a foil for solving really complex technical challenges. I've historically leaned on playing trumpet for this kind of release. But when I really want to focus on growing as a programmer for a few months, creative coding sessions with a group of folks seems pretty great.

I mentioned in an earlier post that I struggle with some of the improvisational skills that are sometimes called upon for activities like this. The group setting felt pretty nice and it was a lot of fun to think about ways to structure the scene we built.

Rust

Rust seems to be everywhere. There are a bunch of folks in my batch that seem really interested in learning Rust which is really exciting.

For a low-level language, Rust has a really compelling feedback loop. Top-notch developer tooling (at least compared with clangd), built-in testing functionality and a package management ecosystem that makes it easy to focus on the problem you want to solve instead of how to repackage an open source library as a Bazel library instead of using CMake (I'm not salty at all...).

And the community is fantastic. There are so many resources for learning and most of them are fairly up-to-date. I think C++ is simply too large of a language for most resources to be broadly applicable. Recently, I have enjoyed Klaus Iglberger's CppCon talks on YouTube; and I'm curious about his recently published book C++ Software Design. But it gets really frustrating to see recommendations for pasting over decades-old language design mistakes by adding yet another keyword or annotation to your method declaration. Rust corrects a lot of these mistakes and incorporates better mechanisms for encoding invariants in programs. In many ways, Rust is now one of the most accessible languages with explicit memory management: you get best-practices by default instead of opting into them with a keyword.

I'm sure I'll write a lot more about Rust in the coming weeks so I'll leave it at that, for now.

Closing Thoughts

I've been spending a lot of time in group activities this week. I think I'm developing a stronger sense for how I want to spend my time during the rest of my batch. I definitely want to continue with these daily reflections. Thanks again for reading!