Matt Ambrogi

Worried and Happier: Recurse Center Half Way Reflection

Worried and Happier

"Strange as this sounds, they seem both more worried and happier at the same time. Which is exactly how I'd describe the way lions seem in the wild."

That’s a Paul Graham quote. He’s talking about founders who have left their jobs to do YC. But it is also exactly how'd I'd say I’ve felt the last six weeks.

I couldn't be more grateful to wake up everyday and work on what I want to do. It’s freeing to work without the external pressures of stand ups, meetings, and updates. But a new pressure, which is the product of a desire to use this time well, has taken their place. It’s somehow more intense but preferable. It’s a pressure that makes me feel more alive and engaged, as opposed to burnt out and exhausted.

Using the rest of this time well is important to me. So I'm reflecting a bit on how I've spent it so far, and how I'd like to spend it going forward. This post is the output of that reflection. I'll walk through what I've done, what I feel I've gotten out of RC so far, what I'd like to do over the next six weeks, and how I plan to get it done.

What I've done so far

I dedicated the first week of RC to meeting people, orienting myself, and reviewing some old projects. The third week, I was gone Tuesday through Sunday on a snowboarding trip. Effectively I've had four working weeks. Here's some of the things I've done in that time:

  • Read Django for APIs. Built my first APIs with Django Rest Framework.
  • Built my first React app.
  • Went from knowing nothing about React to feeling slightly comfortable with it by building a blogging platform app with a DRF backend and React frontend. Learned about components, props, state management, hooks, context, token authentication, router, cookies, and how to think about React generally.
  • Set up a weekly ML working group.
  • Built a very simple, but useful, web game that gives couples interesting questions to ask each other. Built it with React+DRF and then again with Django+htmx. Learned about when it does and doesn't make sense to use React and how you can built SPAs without it.
  • Built a web app that analyzes users' Strava activity data and provides insights. Explored multiple technical approaches. Built it with Python/Django/Pandas. Learned a lot about OAuth. Even made it look pretty good.
  • Began blocking time daily to study computer science. Completed Chapter 2 of Composing Programs. Highlight was implementing objects and classes in Python as if they were not built in.
  • Had a lot of great discussions about learning, programming, and self direction.
  • Paired with people on React bugs, Django issues, Go APIs, machine learning apps, and more.

What I've Got Out of RC So Far

It feels like I really just got into a groove. Some days it feels like I’ve progressed dramatically. Other days it feels like I wasted my time. But writing the list above, it feels clear that I've already got a lot out of this experience.

Maybe most importantly, I've learned that I love focusing my day on programming. That's a huge realization that has implications on what I'll do with my career after this. It has made me think a lot about which types of work I am best suited for and enjoy most.

I've become far more confident talking about all aspects of programming with anyone. Recurse Center is amazing because within hours of each other I might have a conversation with a beginner and someone who has made major contributions to their field. Both will be extremely interesting and kind - and I have just as much to learn from both if I ask the right questions.

I've begun to think differently about how to learn and direct myself efficiently. I think I’ve even got a bit better at both.

I've dramatically increased my confidence as a programmer. Since I started college, I've felt that with hard work I could get up to speed in most technical domains. But now I’m really proving that to myself with programming. It’s been fun to put effort in and see progress. For example, learning the basics of React in a week by doing a project. I feel that, if given the time and opportunity, I could get up to speed and contribute meaningfully to many projects and problems. Most likely, I am being overly confident. And some days, especially on more theoretical stuff, I feel like I just don't get things. But in my experience with learning hard things, confidence is the right approach, as it is often a self fulfilling prophecy. It just has to be balanced with self honesty.

Lastly, I've got to work on things that excite me. Maybe for the first time in my life. That feels both good and right. Much like the way you feel after going for a run. Progressing on something I care about, whether that’s a project or theoretical understanding, feels phenomenally satisfying. That alone is worth stepping off the beaten path for.

What I Want to Do Over the Next Six Weeks

At a high level I want to keep working on projects that interest me, while focusing on learning the underlying concepts that will carry over to whatever I ultimately go deep on after this.

I want to primarily split my days between three things: working on projects, studying algorithms, and working with other Recursers.

As far as projects, I've decided that I'm not interested in just trying to get good at any one marketable skill. Instead, it's more important for me to explore different types of projects and, if I'm lucky, to figure out what it is that I want to get good at. Here's a few things I want to work on over the next weeks:

  • ML. Building an ML app. Training a model. Although I decided to leave my job, I was really energized by my time in the ML space. I'd really like to get hands on and do some work with it. Not only are there endless cool applications, I also like the process of wrangling data into a model.
  • Ethereum. I want to do a basic Solidity project. I'm really fascinated by programmable blockchains. I think it would be really fun to build a simple app that allows users to interact with them.
  • Go. I want to build an API with Go. This feels closest to a 'should do' as opposed to a 'want to do.' But so far I've really enjoyed backend work. I've heard great things about Go for this purpose. I'd love to do a simple project to explore it.

In regards to studying algorithms, I both want to and feel I should. There is an undeniable reality that many good software engineering roles and only available to those to can pass algorithmic tests. If I choose to pursue one of those, I want to be able to pass the tests. But I'm also just interested in algorithms. I've always enjoyed mathematical thinking and was really engaged by my brief introduction to algorithms in college. I think studying them will be beneficial not just for my job prospects, but for my programming and, more importantly, thinking in general.

Lastly, I want to make sure I interact meaningfully with other Recursers almost everyday. When programming I'm apt to get sucked into problems, look up, and realize I've been heads down for hours. That is often good and feels productive. But at RC the opportunity cost of not talking to others is too high. There are so many fascinating people here. Talking to them has already exposed me to new things I want to learn, shifted my thoughts and approaches, showed me new tricks and workarounds, and always been enjoyable. If I just wanted maximize the number of hours I spent programming per day, I wouldn't need RC. Instead I'm looking to optimize for the most transformative, educational (even enlightening?) experience I can have in 12 weeks. People, more than programming, are what make that happen. So I hope to carve out more time to pair with others, have my code reviewed, review other's code, and discuss languages, frameworks, tools, ideas, and approaches.

My Operating System for the Next Six Weeks

The following is an instruction manual for myself and some ramblings around things I need to keep in mind in order to stick to those instructions. This may not be very interesting to anyone outside of myself.

The Plan

I want to impose some structure on my time to help me do the things I want to do. I’ve settled on a daily process I plan to try to stick to. Everyday, I will:

  • Start work by 10:00 am.
  • Do at least two 45 minute focused working sessions on my projects.
  • Do at least one 45 minute working session on a LeetCode/algorithm problem.
  • Have at least one meaningful interaction with another Recurser.

An ideal day for me would look something like this:

  • Wake up around 7:30-7:45
  • Go to the gym.
  • Come back and do three 45 minute sessions on a project.
  • Break for lunch.
  • Block an hour for LeetCode sometime in the afternoon.
  • Use other time to read up on things I'm interested in or work with others.

Thoughts on This Plan

This process is intentionally simple and unambitious. For a number of reasons, I think that is the most effective type of process. I’ll outline why I think that’s a good approach for me.

The bullets above are minimum expectations. So it’s not that spending an hour and a half focused on a project is a great day, but that I want to commit to spending at least an hour a half every day.

A piece of advice that I’ve noted and found useful for myself in the past in advice in regards to writing, programming, and other creative fields is that it's good to set daily thresholds and best to make them surprisingly low. That's because consistency is so powerful, that ensuring a system that will allow for it is the most productive strategy.

An overly ambitious goal will only lead to burnout. Meanwhile a modest one like writing one hour a day is doable. And once you get in the flow of that you will often find one hour turns to two or three. The three hour goal is most likely to lead to disappointment. At the surface, this feels amateur. Like only a beginner would set up such a simple process. I remember once hearing Jerry Seinfeld talk about helping his daughter set up a writing routine. He described the interaction on a podcast.

I told her, “Just do an hour.” That’s a lot. She says, “I’m going to write all day.” “No, you’re not. Nobody writes all day. Shakespeare can’t write all day. It’s torture.”

So maybe an hour isn’t only for amateurs.

The same logic applies to my 10:00am start time. That is pretty late. But I know I can make it happen every day and will thus avoid stressful mornings feeling that I am behind - which can ruin clarity for an entire day. Similarly set goals that work into 45 minutes blocks. I chose 45 minutes because I can string together many blocks of 45 minutes on, 15 minutes off. But that doesn't mean I'll force myself to stop at 45 minutes.

And so my process is simple: try to hit those goals everyday and try to make as many days as possible look like that ideal day.

Some days I won't go to the gym and will start work early. Some days I'll need a brain break. That's ok.

Splitting my Time

Another thing I need to be conscious of is splitting my time well between my areas of focus: projects, computer science (algorithms for now), and people. For me the issue is not getting locked into something, but breaking out of it.

Because I know that I have a tendency to get absorbed in what I'm working on, I may need to experiment with creating a set block for algorithms - either before or after project work. That's something I'll keep an eye on over the next few weeks. Getting the system right out of the gate is less important than continuously observing, making objective judgements on what’s working, and adjusting accordingly.

This same tendency can make it hard to break out of work to pair, chat, or attend a meeting. I'm hoping setting time thresholds and committing to dedicating my mornings to getting most of my focused work knocked out will make it easier for me to shift gears in the afternoon to more exploratory time. I think the single most important element of my process is getting a few hours of focused work done in the morning.

Overall, I'm hoping to practice being more binary in my days. Working when working and playing/relaxing when not.

It's easy to feel a constant pressure to do more as my savings dwindle with each day of Recurse Center. But that feeling is as unproductive as it is unhealthy. And so my hope is that I can stick to this and then feel free the rest of my day. If I'd like to work more, I can. If not, go play.

A Few Thoughts on Projects

Because my goal is to explore a breadth of things, it's critical that I let go of any perfectionist tendencies. Especially when working on projects. I want to push myself to move on quickly.

I’ve noticed that if I work on a project for a week and a half, 80% of the learning happens in the first week. Usually I'd be better off abandoning the second half week of work. Jumping into a new project would keep me in a higher learning rate state. This won't always be true. But it's something I want to watch.

Likewise, I want to push myself to work at the edge of my ability. If I am confident I can do something on my own, I should wait until after Recurse Center to do it.

Diving Into the Next Six Weeks

To review, here are some heuristics I plan to try to stick to for the remainder of my time:

  • Aim to do at least three 45 minute focused sessions per day. Make at least one of those focused on algorithms. After that, feel free to work more, but only if you want.
  • Work on projects that you are interested in. Chip away at one everyday. When you feel the learning has slowed, move on.
  • When working on something, ask yourself: could I do this easily after RC? Is there something else I could be working on that I’m excited about and less sure how to tackle? If yes to either of those, it’s probably time to move on.
  • Have a meaningful interaction with another Recurser everyday.
  • Continue to reflect weekly. Make these reflections less about recounting exactly what I did and more about reflecting on what I should do more or less of going forward. Think about what is or isn’t working well. How I could adjust. Think about what I’m most exciting to work on. Am I working on it? Why not?

Lastly, I'll note that this coming week is going to be a unique one. I've decided to dedicate the rest of this week to reviewing algorithms and getting to know the new Spring 1 batch. I'll be spending all of my focused time working on getting a place where I feel comfortable starting daily LeetCode work. Mostly, I'll be reading through Skiena's The Algorithm Design Manual.

It’s hard for me to write, reflect, and work all at once. So that’s meant taking a few days of this week to really think through what I have shared above. I’ve had to fight back against a feeling that I should be doing programming related work. But I’m hopefully that taking a few days to stop and think about how to work and what to work on will more than make up for a few lost days of progress. Lions in the zoo have their food left out for them. Lions in the wild have to stop and think about their next meal. But in return, they get to choose what they eat.

- 1 toast