Jorge Manrubia

May 16, 2022

Priceless adversity

It's hard to appreciate the good without having experienced the bad. My first job made me professionally very unhappy. It lasted a few years, and it deeply impacted me. I swear there hasn't been a week since I quit, almost ten years ago, where I didn't reflect on my good luck compared to my starting point. Don't get me wrong: if I coul...
Read more

May 14, 2022

Performance in context

When it comes to analyzing code performance, context matters a lot. For example, say we have this code that adds two numbers: a = 1 + 2 And now we need to add a subtraction: a = 1 + 2 a = a - 3 So what's the cost of this change? We can benchmark: require "benchmark/ips" Benchmark.ips do |x| x.report("only add") { a = 1 + 2 } x.report("...
Read more

May 7, 2022

Rails attributes: an essential API you can probably ignore

A few years ago, Rails 5 introduced an API for declaring Active Record attributes. It lets you define typed attributes at the model level and control via types how to cast values assigned to them. Active Record internally uses this API profusely. Active Record models automatically declare these attributes for you by inferring the types...
Read more

April 30, 2022

Ceremony

Ceremony at work is those self-imposed rituals people follow to get things done. Too much, and it becomes a burden. Too little, and it's chaos. Ceremony serves two purposes: assessment and communication. Assessment is about making sure you are working on the right problems at any given moment; communication is about getting everyone on...
Read more

April 23, 2022

What did you work on today?

Everyone at Basecamp answers this question at least twice per week: "what did you work on today?". We use Basecamp check-ins, of course. It's a simple practice with profound implications and something I would recommend to any company working remotely. These answers are in written form, and anyone in the company can see them and make co...
Read more

April 4, 2022

Writing for yourself

This question applies to most people, and it certainly applies to me: does it make sense to write without an audience? It does. One of my favorite books is Pragmatic thinking and learning by Andy Hunt. It's a book about how our brains work, which is a subject I find fascinating. A core concept it develops is how our brains operate in t...
Read more

April 2, 2022

Not a designer

I love design (as in product design). It's a discipline I have tried to educate myself at, and it's what I appreciate the most in any product I use. And yet, I'm terrible at it. I have empirical evidence that it's not my thing. But I can't help having strong opinions on how things should be designed. A contradiction, you see, HELP! I g...
Read more

March 12, 2022

Changing critical code paths with scientist

I recently worked on improving the inbound email analysis system in HEY. This system analyzes every email that hits HEY to decide whether it should flag it as spam, bounce it, or warn the user about specific problems such as having a forged sender or containing a virus. In its current form, the system was making it difficult to add som...
Read more

March 6, 2022

Social media evilness

Why are so many people so awful towards other people on Twitter? How can there be this massive gap between how people conduct themselves on Twitter and in real life? I've always found fascinating how our brains work, and I was sure there would be good answers out there. I've read a few books and articles on social media issues lately, ...
Read more

February 13, 2022

No silver buckets

The suggestion that mixing buckets is the root of all your software quality problems is common in our industry. In Rails, it's a recurring theme from his critics. Augment Ruby core classes with monkey-patching? Wrong! Those buckets are meant to remain separate. Invoke models logic from controllers? Wrong again! Those actions deserve th...
Read more

February 8, 2022

Balance

Balance is hard. We love extremes: they are simple and effective. Take learning and the Shu-Ha-Ri model. When learning something new, you first look for strict recipes: sharp boundaries that guide you through every step. At some point, you forget about recipes and start acting without thinking much. Those initial boundaries become fuzz...
Read more

February 5, 2022

My MacOS essentials

Just because the world is short of lists of favorite apps, here is mine: Task Paper for todos I used to have a thing for todo apps. I tried them all and even tried to build my own. I switched to Task Paper years ago and have stuck to it since then. The truth is that my relationship with todos has changed significantly over the years. T...
Read more

February 2, 2022

Of bugs and giants

In October of last year, we started to receive reports about chats that stopped working in Basecamp. They were all iOS/Safari users. Campfires wouldn’t work, as if there was no internet connection, and the only solution was completely restarting Safari. The bug was elusive and happened very intermittently. We tried several things witho...
Read more

January 29, 2022

Silence

I quit Twitter for the first time nine years ago. Two years ago, when I started at Basecamp, I felt like giving it a new try. Long story short: it didn’t work. I had identified noise as my biggest problem with Twitter back in the day. The signal was very low. I naively thought I could improve that by carefully selecting who to follow a...
Read more

December 22, 2021

A system to encrypt data in bulk for Rails

We just released mass_encryption, a library to encrypt large sets of data using Active Record Encryption. If you have been following along, Rails 7 was recently released and, among many goodies, it supports at-work encryption with Active Record. This new gem addresses a problem many apps will face: perform the initial encryption in exi...
Read more

November 28, 2021

Don't block yourself: a remote-worker super-power

When working remotely, this is a great habit: make decisions and communicate them, but try to avoid getting blocked waiting on others. Imagine this typical example: you are not sure about how to do something. Your first idea might be to jump into a chat and ask someone for help. I won’t say I never ever do this, but it’s not a great ap...
Read more

November 20, 2021

MacBook Pro M1

Two weeks ago, I got a MacBook Pro 16-inch. I got the base model (M1 pro, 16GB). My previous machine was a loaded-up MBP 15-inch from 2019. Bottom line: it's been the most noticeable performance jump I've experienced since SSD disks. Performance The improvement is ridiculous. My previous MBP felt slow, and it often struggled to dispatc...
Read more

October 9, 2021

Career advice

A software engineering student asked me via Linkedin about career advice. Not sure I would take advice from myself because I made many mistakes, but here are a few things I wish someone had told me right after college: • Technical stuff is a fantastic career path, really. If someone tells you that true engineers don’t code, or that you...
Read more

August 29, 2021

Timeboxing away

Deadlines in software have bad press, for a reason. Say “we need to release this version at this date”, and you are stressing everyone out. Now, say “we need a version of this at this date”, and you are actually helping to ship. I learned about this idea of fixed deadlines and negotiable scopes from Basecamp many years ago, way before ...
Read more

August 19, 2021

Privacy-aware Rails consoles with console1984 and audits1984

We just released console1984 and audits1984. The first gem extends Rails consoles to make them auditable and to protect sensitive accesses. The second one is a simple auditing tool. This constitutes the other essential part of the technology we developed at Basecamp to raise the privacy bar in Rails applications, and I am thrilled to f...
Read more

July 21, 2021

Making Rails run just a few tests faster

Some time ago, I learned that Rails parallel testing had a significant overhead due to database setup and fixture loading. Essentially, each process will set up its own database and load all the fixtures, and this is not free for non trivial datasets. Fixtures are a factor here. At Basecamp, we use fixtures heavily and, when running si...
Read more

June 18, 2021

A story of Rails encryption

This story starts in October of 2019. I was in the Basecamp meetup in Chicago two weeks after joining the company. During an internal presentation, David talked about the need to raise the bar when it came to privacy for the new product the company was working on, codenamed Haystack, now HEY. We all were busy with all kinds of projects...
Read more

April 19, 2021

Complexity-inducing narratives

I recently gave a talk on software complexity, Single Page Applications and Hotwire (slides). Due to time constraints, I ended up cutting off a whole section on narratives that are often Trojan horses for unjustified complexity and decided to write it down instead. These narratives are: • It doesn’t scale • Tech giant uses it • In the ...
Read more

April 9, 2021

Farewell Evernote

I've been using Evernote since September of 2010. I started as a passionate user, and it quickly became an indispensable part of my workflow. Then, the product started to go south, slowly but steadily. The clients became more complex, heavier, and uglier. They added a ton of features nobody asked for. And they didn't improve the one th...
Read more

March 19, 2021

A Basecamp email: before and after

As a longtime fan of Basecamp copy, I always enjoy asking for help with user-facing texts I need. This time we had to send an email to some users that were impacted by a bug. I went to Jim Mackenzie. Here's the before and after. Before: “Hi <name>, We recently discovered a bug in HEY where it could fail to move emails to the designated...
Read more

March 14, 2021

Extracting, not inventing

Documenting the pull request to add encryption to Active Record brought me memories about the origin of each feature: • Support for unencrypted data: HEY was already used by staff and some beta users when we added encryption. • Option to downcase: emails are not case-sensitive. • Option to ignore case: labels are case-insensitive when ...
Read more

March 6, 2021

Smelling Rails smells

Shopify recently published Upgrow: A sustainable architecture for Ruby on Rails. It describes a set of architectural principles to build Rails applications and announces a companion future gem. I was surprised by seeing Shopify endorse this approach. The proposed patterns aren't new. Many people have advocated for them since Rails is R...
Read more