September 9, 2024
The gift of constraints
One of the hardest things about shipping products is balancing this contradiction: you want to do the best possible work everywhere, but optimizing every piece takes time, and time is finite. I’ve done a poor job here countless times in my career. And I have seen many others struggle here, too. If you like your craft, it’s natural that...
Read more
Read more
September 3, 2024
Less chat
I gave this advice to someone today: don't discuss work things at the chat. Go async... always. We're working on a new product, and we don't use the chat other than to celebrate new features. I came back from holidays this week, and I didn’t open any chat to catch up on what had happened. We're working on new stuff this week, and the p...
Read more
Read more
June 2, 2024
The popover drama
The popover drama started with a tweet about how a HEY Calendar popover loaded slowly on a throttled internet connection. Then, a heated discussion followed in the best social media way, including nuance-free hot takes and professional trolls. The funny thing is that the popover example is not even a good one to fuel a SPA vs. HTML-Ove...
Read more
Read more
The best things happen after uphills. That’s one of those counterintuitive life lessons. Our brain seems to demand downhill: predictability, certainty, and ease. But the satisfaction downhill brings is shallow and ephemeral. What’s worse, too much downhill brings boredom, and lack of motivation is no joke. Of course, some uphills are t...
Read more
Read more
December 23, 2023
When everyone has a say
I don't think creative processes benefit from democracy — quite the opposite. After presenting the new Turbo 8 stuff in Rails World, some people opined that Rails needed to improve collaboration in the frontend space. I got a variant of this question in a couple of podcasts, which also happened when we released Active Record Encryption...
Read more
Read more
November 27, 2023
Demo of how page refreshes with morphing work
This article was originally published in the 37signals dev blog. We published a demo showing how Page Refreshes with morphing work in Turbo 8. Comparing code helps a lot in software discussions, so I thought it would be valuable to show how the new feature compares to Turbo stream actions for performing partial updates and broadcasts. ...
Read more
Read more
November 20, 2023
The radiating programmer
This article was originally published in the 37signals dev blog. You are an individual contributor at heart. You like writing code and solving technical problems. You dislike meetings and ceremony. Here’s what you can do to maximize what you like and minimize what you don’t: radiate information. The daily standup meetings that Scrum po...
Read more
Read more
October 25, 2023
Towards smoother page updates in Turbo
I recently published two articles in the 37signals dev blog related to how we will improve page updates in Turbo 8. • A happier happy path in Turbo with morphing. What we will do. • Exploring server-side diffing in Turbo. An investigation of an alternative approach to fulfill the same vision. I hope you like them!
Read more
Read more
September 26, 2023
Navigating personal information with care
This article was originally published in the 37signals dev blog. Accessing personal information from customers is a serious matter. With the launch of HEY in 2020, we developed some technology and processes to support a very simple principle: employees shouldn’t have access — intentionally or unintentionally — to personal information f...
Read more
Read more
August 31, 2023
Minding the small stuff in pull request reviews
This article was originally published in the 37signals dev blog. Nitpicking in pull requests reviews means offering insight that looks excessive, pedantic, and unimportant. It’s a pejorative term. I don’t question there are cases where the term applies, but many folks assimilate it to paying attention to the small stuff. By projecting ...
Read more
Read more
August 11, 2023
Difficult and complex
There is complex and there is difficult, they are not the same. Being able to run a marathon is very difficult. But what you have to do to prepare is simple. A small sheet of paper is enough to describe the steps. You will need tremendous effort and discipline - so it’s hard - but it is simple. Software development is different: it is ...
Read more
Read more
August 1, 2023
Globals, callbacks and other sacrileges
This article was originally published in the 37signals dev blog. Sacrificing purity for convenience is one of the Rails pillars. This principle informs several Rails features that some recommend avoiding but that we happily use in our apps. In this post, I’ll discuss how we use three of those in Basecamp. I’ll show some examples involv...
Read more
Read more
July 10, 2023
Let people be
• Have side-projects / don’t have them. • Do open source / don’t do it. • Have tech-related hobbies / have completely unrelated ones. • Have children / don’t have them. • Work long hours / never put in an extra hour. • Small and risky / large and secure. • Work for others / work for yourself. • Work out of passion / work to pay the bil...
Read more
Read more
July 2, 2023
Social media evilness (II)
Back in the day, I wrote some notes on the puzzling question of why so many people act so maliciously toward others on social media. A book introduced me to the concept of moral outrage, which brought some answers to my questions. A recent tweet by Dr. Jonathan Shedler referred an article that suggests a pretty different angle: the pri...
Read more
Read more
June 12, 2023
Remote struggles
I've worked fully remotely for the last ten years. I find the discussion about remote work fascinating. Is remote better or a lesser evil? Is a decision full of tradeoffs? Something that works in some circumstances, but that is not a good default? As with every complex subject, people – me included – love to reduce it to a dichotomy. A...
Read more
Read more
June 4, 2023
Erase and rewind
Imagine a problem you can't understand without solving it first. The first time I saw software development described as a wicked problem was in Code Complete by Steve McConnell, and I haven't seen anything but a constant validation of this proposition throughout my career. And it's a paradoxical one with several counterintuitive coroll...
Read more
Read more
Internal energy is tricky. On the one hand, energy is more reliable than happiness. I liked this reflection by Jocko Willink in the Huberman podacast. Everyone experiences joy and sadness as part of their daily lives: keeping a certain energy level is more feasible than a certain level of happiness. On the other hand, as with anything ...
Read more
Read more
March 2, 2023
Pending tests
I recently started working on a new thing at 37signals. We have a blank slate in front of us, and nothing is set in stone, which means we are moving fast. I find myself creating meaty pull requests every day. This is how every single pull request I open ends: This is just a reflection of how, most of the time, I write tests at the end....
Read more
Read more
February 26, 2023
Sensations
I’m fascinated by the sensations that the things we use induce in us. Not their usefulness, suitability, ergonomics, or aesthetics, but sensations. I don’t have a better term to capture something as substantial as difficult to describe, but I can illustrate with some very personal sensation-driven opinions: • Zelda Breath of the Wild’s...
Read more
Read more
January 22, 2023
Writing is thinking
You don’t need an audience to put writing work for yourself: • Writing can let you access things you know but can’t access deliberately. This is a powerful and utterly counter-intuitive insight. • Writing down assorted ideas as they pop up in your mind will bring all the benefits you are looking for here. In my experience, formalities ...
Read more
Read more
January 18, 2023
The best presenter ever
I learned about Benjamin Zander in 2011. I was reading Resonate by Nancy Duarte, and she used his Ted Talk from 2008 as a case study in one of the chapters, to illustrate several concepts on how to deliver presentations. Nancy Duarte knows one thing or two about presenting, so her description of him as a "master communicator" caught my...
Read more
Read more
January 16, 2023
The augmented programmer
If you are a programmer and have tried ChatGPT, you have probably realized it’s a landscape-changing technology. The history of programming is a history of raising the abstraction level, and with all the cautions and disclaimers you want, the jump that ChatGTP represents is monumental. Right after college, I got a research grant to exp...
Read more
Read more
January 1, 2023
Learning with ChatGPT
I’m learning Python these days. The reason is that there are two domains I want to explore and play with — finance and artificial intelligence — and everything I want to use is built in Python. Being Ruby my go-to language, a recurring problem I’ve suffered for years is building my own infrastructure for most things I wanted to do in t...
Read more
Read more
Some assorted reflections on my 2022: • I wrote a lot, more than ever. This was my favorite piece. This was my biggest hit. And I’m proud of this series, into which I put quite a bit of effort. I had many interesting conversations with people with shared interests, which I enjoyed a lot. I intend to continue writing for myself in 2023....
Read more
Read more
I have referenced this article by Kent Beck in my last two pieces. Here goes the last one. When discussing whether coupling was good or bad, Beck says: “This is where I got stuck for a long time (years).” I can’t think of a more influential author than Kent Beck. His contributions have defined what modern software development is. This ...
Read more
Read more
December 19, 2022
Code I like (V): Active Record, nice and blended
This article was originally published in the 37signals dev blog. Persisting objects in relational databases is an intricate problem. Two decades ago, it looked like the ultimate orthogonal problem to solve: abstract persistence out so that programmers don’t have to care about it. Many years later, we can affirm that… it’s not that simp...
Read more
Read more
December 13, 2022
Compared to what?
This article was originally published in the 37signals dev blog. I loved this article by Kent Beck on cohesion. At some point, when discussing how cohesion and coupling are opposing forces, it says: “Wait!? Isn’t coupling bad? But cohesion is good? But cohesion is coupling of subelements? Isn’t that bad? And good? This is where I got s...
Read more
Read more
November 27, 2022
My curse with plain code editors
I think the first IDE I used was Borland Delphi in 1999. I remember being marveled by its code insight features, where the editor would suggest what properties and methods were available for a given symbol. I remember being puzzled about the programming sorcery powering that — pretty much the same feeling I have today when I play a mod...
Read more
Read more
November 15, 2022
What defamation looks like
Last Sunday a friend shared with me this Twitter thread by Kasper Timm Hansen: He confirmed later in the thread he was referring to me as the author of the Vanilla Rails article I recently published in the 37signals dev blog. Kasper starts by presenting a history of friction during PR reviews between us, where he was careful with words...
Read more
Read more
November 8, 2022
Code I like (IV): Vanilla Rails is Plenty
This article was originally published in the new 37signals dev blog. Read it there. I have often heard this: vanilla Rails can only get you so far. At some point, apps become unmaintainable, and you need a different approach that brings the missing pieces, because Rails encourages a poor separation of concerns at the architectural leve...
Read more
Read more
See more posts »