A year at 37signals
A year ago I had my first day at 37signals (the people behind Basecamp, HEY and Fizzy).
This was a dream come true for me.
I wanted to work there ever since I read Rework over a decade ago. The books, podcasts and talks that followed showed me that we also share a similar philosophy towards work and the craft of coding. That just cemented my resolve.
Not to mention that it's the birthplace of Rails! The single piece of software that made me decide to turn my programming hobby into my career.
I had an incredible year, so I want to share how I got here and what I learned that might not be obvious when looking from the outside-in.
Getting the job
I'm not sure how many times I applied for a job here over the years. It must be at least six, maybe more.
Out of those I passed to the final round twice.
The first round is notoriously difficult, which is quite funny because it's just a simple cover letter.
We write a lot internally. Nearly all communication is written and most of it is long-form comments and notes. Being able to write is essential.
I wasn't a good writer. It took me a few attempts to realize that. But I was determined to get better at it, so I worked on it.
The first step to writing better is to read more. Not just technical books, self-help and similar, but stories, essays, opinion pieces. Learn what's out there and expand your vocabulary and literary horizon, then forge your own style from the things you like.
A funny side-effect of reading more is that I started to hate corporate newspeak - it's so bland and dull that I immediately tune out as soon as I start to read or listen to it now. To me it's like communicating in memes.
The second step is to write more. I started writing more often on this blog, which helped with long-form technical writing. But later on I started keeping a diary. Nothing fancy, I'd just jot down what happened every day and some thoughts bouncing around in my head - this helped me in general, not just with writing.
The third step is to learn how to write a cover letter. This took several attempts and it boils down to: be yourself.
I always felt a pressure to make the cover letter sound professional. You know, the things they tell you in school: serious tone, respect, warm but also not too personal.
That's terrible advice. And I realized that only after I started hating corporate newspeak. It makes you sound the same as everyone else, and dull on top of that.
A cover letter should explain why you want to work there. It's your chance to tell your story. It's supposed to be personal, fun and interesting.
The second round is a take-home exercise.
I was never worried about this. For me Rails and the OSS that 37signals puts out has always been a treasure trove to explore and learn from so I was familiar with their style, and I already spent a lot of time internalizing why they structure code like they do.
I could write a whole essay about this, but to keep it short: ergonomics and domain design are important; the code should read like prose.
Lastly there is the interview.
I fumbled the first one. I was unbelievably anxious and over-thought and over-explained every question; the conversation didn't flow. But I got good feedback from it and spent a lot of time improving on it. The second time around I was relaxed and we had a fun chat.
Then, one evening I got an email ominously titled "Some news" telling me that they'd like me to join the company! I was over the moon!
Working here
I have a hazy memory of the first few weeks - they felt like a dream. What I remember the most is reading, and reading a lot.
As soon as I started working on actual tasks a new feeling hit me: doubt. I started to second-guess my own work and this thought formed in my mind that I just lucked out with the hiring process and that someone would soon notice that my work wasn't any good.
This feeling lingered on for months and passed only when I started getting fewer comments on my PRs.
It sounds like a curse, and it felt like it, but now I see that it was also a boon. It motivated me to get better and to learn. I figured that's the only thing that would cure that feeling, and it did.
Then came Fizzy's launch.
I got to work on Fizzy as soon as I joined. My first task was to add FizzyAsk - an LLM-powered chat where you could tell Fizzy what to do or ask it questions about your data.
After adding it I barely ever used it. And to my surprise it was completely scrapped alongside all AI features after a month.
This was the first time I ever saw features get cut - not pivoted, not moved, not put on hold - after they were built and before they were even released.
The reason behind the cut was eye-opening: delightful or nothing.
Imagine an overgrown garden with hundreds of different plants in it - that's what the products of most companies look like to me: an eclectic collection of ever-growing features. The garden is "designed" by adding whatever plants the neighbours added to their gardens this week. Everything is overgrown because nobody has the time to care for so many plants, and even if they do they don't know how. The plants that are cared for are overshadowed by the overgrowth.
By comparison, what I saw with Fizzy was gardening. There was a vision. The garden had just a few flowers, but all of them were curated to work together and arranged to be delightful. If something new didn't work with what was already there it wouldn't make the cut, or we'd remove some of the old flowers to make room for the new ones.
I talked to a few friends about this and some of them had an interesting comment: "Isn't that soul-crushing? You spend so much time building something just to see it go down the drain."
No, it isn't. In fact, it's liberating. Not all ideas are good, but you can't know that ahead of time. Sometimes you have to try them to understand why they don't work. It would be far more soul-draining to have to support an experiment for years than to admit that it wasn't very good and bury it right away.
Whenever I talk about this I think of Buddhist mandalas. These are intricate artworks made of colored sand that can take weeks to complete. Once they are done they are admired for a while and then swept up and thrown into a river. Nothing is permanent.
Later on I was tasked with building a new magic-link-based auth system. Sounds easy, right? It wasn't.
Fizzy was built on two new in-house gems: activerecord-tenanted and beamer. AR-tenanted separated each tenant into their own database, and Beamer replicated those SQLite databases to the whole fleet of servers. The catch was that there had to be a central identity database for sign-in, but each server was the writer for a few tenant databases, so you could never write to that database and then the tenanted database in the same request because the two databases would be on different servers most of the time.
As I was untangling that I realized that I was used to working with the latest release of Ruby and Rails, even with Rails edge. But this was different. We were ahead of Rails edge. We were building what might become Rails edge at some point and dogfooding it ourselves to work out the kinks!
This can sometimes become a challenge. The magic links took two weeks to implement and I spent a good part of those two weeks wondering if it could even be done.
Some of my work on Fizzy did make it into Rails. I added Crockford's Base32 to Fizzy for magic link codes and that became SecureRandom.base32. Later on I added passkeys to Fizzy, and that might also land in Rails as has_passkeys in Active Record.
After the launch we shifted into cycle work. This was the first time I experienced Shape Up.
Shape Up has two modes: cycle work and new-product mode. Cycle work is the thing most people associate with Shape Up - six week cycles with cooldown periods in between. In new product mode there's no fixed cycle, no appetite, no kick-off, no pitch. It's like jazz, things are made up as we go.
After working in both modes I realized that what I thought of as "agile development" was just waterfall with extra steps.
Take scrum as an example: two week sprints, task pointing, standups. It sounds quite similar to Shape Up: six week cycles, appetite, check-ins and hill-charts.
The magic is in what happens behind the scenes.
In every company I ever worked at there was something like a "product roadmap" - a document that laid out each feature that would be added in the fiscal year and in which order they would be worked on. Then scrum gets slapped on top of that. So now you are working in cycles, but there is this Gantt chart called the "roadmap" in the background that suspiciously looks like a waterfall and if anything slips the cascades become a bit wider. Scrum isn't there to get things done, it's there to keep you on schedule.
In Shape Up the plan is laid out six weeks at a time. It isn't set in stone, it can shift; projects are dropped, shortened or extended. The important part is that after the six weeks are over a new plan is laid out that takes into account not only what was done in the last six weeks but also what happened in the world.
Jason Fried had an excellent article about this where he compared it to running like a squirrel. A squirrel runs a little, then stops, looks around, picks a new direction, and then runs some more. As it does that it takes its surroundings into account. It goes in a direction but it regularly re-evaluates. That's agile.
I've seen so many serendipitous situations where one project became the groundwork for another that was just the right fit at the moment. You can't plan this, you have to see and feel the previous work to form a vision of what you could build with it next.
These are just the most eye-opening things I learned.
Last week was a big week for me because the company decided to keep me! After the first year everyone goes through a review that asks one question: knowing what the company knows now, would they hire you again? A huge weight has been lifted off my shoulders even though I knew the review would go well.
I'm grateful I get to work alongside and learn from my amazing colleagues at 37signals.
When I joined I expected a challenge, I wanted to learn and to grow, and that's exactly what I got. I'm glad I managed to rise to it. This really was a dream come true.