What I've been up to

2025

  1. Back to the starting line

    Programming with AI is still in its infancy, and yet it has already redefined what programming will be about in the immediate future.

  2. Being mind-blown as the new baseline

    I have been wanting to revamp my personal site for a while. I wanted a more modern look, sure, but also a reorganization of the structure and navigation. The problem was tediousness:

  3. Delightful, or nothing

    Any AI-powered feature we add will either be amazing or it won’t. Let’s explore. I’ve lived this 37signals stance on AI from the inside, as a programmer.

  4. Lexxy: A new rich text editor for Rails

    Lexxy is a new editor for Action Text developed by 37signals. It features generating a more semantic markup, better ergonomics, markdown support, pasting links, code syntax highlighting, prompt men...

  5. Collectives

    If you’re part of a collective, both of the following can be true at the same time:

  6. Abstraction and Emergence

    Exploring how abstractions should hide distracting details while showing essential information, and examining how good explanations distinguish useful abstractions from poor ones.

    Code with Jason
  7. Anyone can cook

    We just went through a selection for a junior position at 37signals. This is a $146,000/year position for individuals with less than three years of experience, offering the opportunity to be part o...

  8. 37signals

    I joined 37signals five and a half years ago. I don’t think this is the right company for most people or that most people are a good fit for it. At the same time, I know this can be a dream job whe...

  9. Programmers and degrees

    I recently made a point about the disconnection between good programmers and formal degrees. I also expressed my skepticism about universities being the best option for becoming a good programmer i...

2024

  1. Sparks

    A precious moment when working on an idea is seeing the first spark. There is no fire yet, but you sense the potential for the idea to burn brightly. Sometimes, this moment comes after building a ...

  2. Systematic system tests considered harmful

    When it comes to system tests in Rails, I fully agree with David’s vision: their benefit/cost is tiny just because their cost is huge. They are a pain to write because of the poor feedback loop and...

  3. The gift of constraints

    Constraints—specifically timeboxing and team scarcity—actually help developers make better decisions about what to build. Fixed time, variable scope forces teams to prioritize quality where it matt...

  4. Less chat

    I gave this advice to someone today: don’t discuss work things at the chat. Go async… always.

  5. 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 ...

  6. Uphill

    The best things happen after uphills.

2023

  1. Demo of how page refreshes with morphing work

    A showcase of Turbo 8’s new morphing feature, demonstrating how it provides a simpler alternative to stream actions for updating pages without requiring costly broadcast mechanisms.

  2. Exploring Turbo 8

    Deep dive into Active Record encryption and the latest advancements in Turbo 8 technology.

    The Rails Changelog
  3. The radiating programmer

    How individual contributors can minimize disruptive meetings by proactively sharing information about their work, progress, and decisions rather than waiting for others to extract it through formal...

  4. Exploring server-side diffing in Turbo

    An exploratory project at 37signals that investigated server-side diffing as a way to reduce payload size when updating pages in Turbo, ultimately deciding that client-side morphing was the better ...

  5. A happier happy path in Turbo with morphing

    Turbo 8’s new morphing feature enables smoother page updates and simpler broadcasts by intelligently mutating the DOM rather than replacing it entirely, while preserving client-side state like scro...

  6. Navigating personal information with care

    How 37signals implements a privacy-first approach to accessing customer data. Our default for accessing customer information is: we don’t—employees must obtain explicit consent before decrypting an...

  7. Minding the small stuff in pull request reviews

    Why attention to detail in pull request reviews—often dismissed as “nitpicking”—actually matters greatly for code quality, naming conventions, style consistency, and team development standards.

  8. Globals, callbacks and other sacrileges

    Rails pragmatically embraces “sacrificing purity for convenience” through techniques like callbacks, CurrentAttributes, and suppress operations. Rather than adopting absolutist positions against th...

  9. 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 ...

  10. 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 bro...

  11. 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 s...

  12. 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...

  13. A Friday email incident

    How 37signals handled a production incident where emails between HEY users were incorrectly flagged as spam due to DKIM verification failures during our migration from cloud infrastructure to on-pr...

  14. Energy

    Internal energy is tricky.

  15. Pending tests

    My approach to writing tests after code rather than before, reflecting on why I don’t practice test-driven development (TDD) despite understanding its principles and benefits.

  16. 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 a...

  17. 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...

  18. 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 a...

  19. 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. Bei...

2022

  1. 2022

    Some assorted reflections on my 2022:

  2. Stuck

    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:

  3. Rails Concerns

    A deep dive into Rails concerns, when to use them, and how to write good ones.

    Code with Jason
  4. Active Record, nice and blended

    Active Record restates the traditional question of how to separate persistence from domain logic: what if you don’t have to?

  5. Compared to what?

    Discussing software design techniques requires real code examples from actual applications to enable meaningful comparison and debate, rather than abstract concepts alone.

  6. Vanilla Rails is Plenty

    Discussion about how vanilla Rails capabilities are sufficient for building applications, drawing on experience at 37signals.

    Code with Jason
  7. 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 give...

  8. Vanilla Rails is Plenty

    A common critique of Rails is that it encourages a poor separation of concerns. That when things get serious, you need an alternative that brings the missing pieces. We disagree.

  9. Online discussions, the good parts

    Some recent positive experiences made me think about the source of my distaste for online discussions. The blame is on me: I assimilated online to social media or online comments in the wild.

  10. Good concerns

    We love concerns and have been using them for years in large codebases. Here we share some of the design principles we use.

  11. Aging programmer

    Back in college, they told me that I would start my career writing code, but eventually, I would move to a position where I would ask others to code my designs. To celebrate that this turned out to...

  12. Fractal journeys

    Good code is a fractal: you observe the same qualities repeated at different levels of abstraction.

  13. Utility-first CSS

    Recently I’ve found myself with the need to use a CSS toolkit a couple of times. The motivation was building from scratch some internal admin tools. I had heard great things about Tailwind, and Dav...

  14. Domain-driven boldness

    How to create a good domain model is the subject of many books, but here’s a lesson I learned at 37signals: don’t be aseptic, double down on boldness.

  15. What do we want people to feel?

    Since I started using HEY World last year, I have written 28 posts. Those are more than what I wrote in my six previous years of blogging.

  16. Enterprisey expectations

    As a customer, I can’t think of something I value more than how a company handles the problems I have with them.

  17. 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:

  18. 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.

  19. 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 someth...

  20. Writing for yourself

    This question applies to most people, and it certainly applies to me: does it make sense to write without an audience?

  21. 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 ev...

  22. 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 abou...

  23. 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 h...

  24. No silver buckets

    The suggestion that mixing buckets is the root of all your software quality problems is common in our industry.

  25. Balance

    Balance is hard. We love extremes: they are simple and effective.

  26. 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...

  27. 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.

2021

  1. 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...

  2. 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 ju...

  3. 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...

  4. 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 yo...

  5. 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 fi...

  6. 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...

  7. Mass Encryption

    Encrypt existing database records in bulk using Active Record encryption.

  8. 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 hor...

  9. 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 stead...

  10. 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 Mackenzi...

  11. Extracting, not inventing

    Documenting the pull request to add encryption to Active Record brought me memories about the origin of each feature:

  12. 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.

2019

  1. Goodbye Bandzoogle

    This was my last week in Bandzoogle, the place where I have worked for the last six years. I am starting an exciting new adventure next week, but in this post I would like to talk about how special...

  2. Programming quotes that blew my mind

    I love ideas that turn my world around. They typically come via books, articles, and talks but, in some rare occasions, it is just a simple quote that produces that effect.

  3. On Ruby and type checkers

    Stripe recently open sourced Sorbet, a ruby type checker. It was also recently announced that types will be coming to Ruby 3. Along with the impact of Typescript and with types coming to Python, it...

  4. impersonator

    Ruby library to record and replay object interactions.

  5. Processing text files in Ruby simultaneously

    Say you need to process several big text files with Ruby at the same time, in an orchestrated way. Processing a single file is pretty trivial with Ruby but processing multiple files at the same tim...

2018

  1. Rails rendering with Turbolinks

    Some time ago I used Turbolinks in a project and it was instant love. After years working on single page apps with different Javascript frameworks, Turbolinks clicked. And clicked deeply.

  2. Productivity and task management software

    I love personal productivity. In fact, years ago I started my very own GTD-based task management service. But I have changed quite a bit my take on productivity over the years. These days I am not ...

  3. On Rails testing

    Over the years I have experimented with different approaches for testing Rails apps. In my early days I used to abuse mocks, a problem I think affected many Rails devs in the early days of RSpec an...

  4. Learning Ansible

    A couple of months ago I decided to learn Ansible. I grabbed this book and, since learning with real projects is what works best for me, I implemented a system to deploy Rails apps to provisioned E...

  5. Resilience, a double-edged sword

    I have come to dislike resilience when it comes to getting things done. I used to think it was a good skill to cultivate. If I found frictions, I used to thought it was a matter of putting enough t...

  6. Mind your dependencies

    Over the years I have changed my mind about adding dependencies to software. Through a number of painful lessons, I went from being over-confident to being over-cautious.

2017

  1. Testing a command-line tool with plain Ruby

    Recently I published Qc, a tool for interacting with QuantConnect using the command-line. It lets you develop your algos in your local box, without having to open QuantConnect web editor to run them.

  2. qc

    Command-line utility for syncing and running your backtests in QuantConnect.

  3. IndexedDB, camels, and committees

    IndexedDB is a W3C standard for storing collections of objects locally in your browser. I have used it extensively to add offline support to an app, and I strongly dislike it. I am not the only one...

  4. Ruby enumerators are slow... and wonderful

    Ruby Enumerators are a really cool abstraction. They can be used in many ways. I particularly love that, in the standard library, most methods that take a block to iterate over something will retur...

  5. On working remotely

    I have been working remotely at Bandzoogle for over four years. Remote work was something I dreamed with when I had a 9am-5pm office job. It has been one of those rare cases where reality exceeded ...

2015

  1. Open Source Oriented Architecture

    I recently watched this talk by Vicent Marti (Spanish) about microservices and Github. I loved it. It is full of wisdom pills and common sense delivered in a fun and entertaining way.

  2. bookcrawler

    Fetch books metadata using Amazon Product Advertising API.

  3. Moved to Jekyll

    I moved my personal page from Wordpress to Jekyll. It is exactly what I was looking for: a simple but customizable platform I can manage editing plain text files.

2014

  1. Forceps: import models from remote databases

    I recently released a gem called forceps. It lets you copy data from remote databases using Active Record. It addresses a problem I have found many times: importing data selectively from production...

2013

  1. forceps

    Copy active record models from remote databases.

  2. Mailgun adapter for Action Mailer

    At bandzoogle we wanted to use Mailgun as our mail provider for sending emails. Mailgun offers 2 interfaces: SMTP and an HTTP api. If you want to use mailgun in a Rails app via Action Mailer, the o...

  3. On better information habits

    I have recently read The information diet. It is a book about information consumption. It makes an analogy with food that works pretty well: in the same way that healthy eating habits are good and ...

2012

  1. Why I love RubyMine

    I love RubyMine. I have been using it for one year and a half as my main Rails/Javascript editor.

  2. truncato

    A tool for truncating HTML strings efficiently.

  3. Continuous delivery with Jenkins and Heroku

    Some time ago I read Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation, by Jez Humble. It is a great book I totally recommend. In this post, I would lik...

2011

2010

  1. Using delayed_job with Cucumber

    Delayed_job is a great Ruby solution for executing jobs asynchronously. It is intended to be run in the background, dispatching jobs that are persisted in a table. If you are using Cucumber you hav...

  2. I have read' 'The Inmates Are Running the Asylum'

    I have recently finished reading *The Inmates Are Running the Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity, by Alan Cooper. It is a book about user experience and int...

2009

  1. About agile estimating in hours

    In this post I would like to talk about the practice of estimating tasks in hours in the iteration planning. After more than one year applying agile estimating techniques at work, I have changed my...

  2. The Composed Method implementation pattern

    I loved this presentation by Neal Ford. The first practice it mentions is the composed method implementation pattern. I think this is one of the most most fundamental coding patterns I can think of...

  3. Slides of Agile Development and Rails Course

    Here you can download the presentation I used in the Agile Development and Rails courses I taught in the University of Oviedo (HCI-RG group). They correspond to a 6 hours-class (the whole course wa...

  4. Slides of Web Accesibility Course

    There are some stuff I would like to share online. It may be useful for someone and is totally useless in my hard drive. Perhaps in the future I will create a downloads page or something similar. F...

  5. A nice iPhone tool for agile development

    From time to time I like to check for new applications for my iPhone. It’s pretty amazing how quickly the base of applications is growing, so I usually discover nice surprises.

2008

  1. Errors in my post on Comparing EMF Models

    There was an error in the code originally posted in my article on Comparing EMF models. Thank you so much to Jim Showalter for warning me. The post has been updated with the right code. Now it’s al...

  2. Generating JUnit Test Cases Dynamically

    In this post I’m going to talk about generating JUnit Test Cases Dynamically. In order to define tests, most JUnit’s users place their testing code inside test methods that

  3. Comparing EMF Models

    At work, we needed a mechanism to compare EMF models. We are developing a system that uses ATL model to model transformations. We wanted to validate the transformations with JUnit unit tests. We ne...

  4. Posting from Textmate

    I’m writing this entry using Textmate. I been a lot of time waiting to use this fantastic editor. Finally, I’ve bought a 17 inches MacBook Pro. I’m really loving it!. So much time reading things ab...

  5. Skittlish theme for Typo

    I have adapted a theme I really love to use it with the blogging engine that runs this site: Typo. It’s the Skittlish theme, originally created by Damien Tanner and Cristi Balan for Mephisto’s.