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.
Programming with AI is still in its infancy, and yet it has already redefined what programming will be about in the immediate future.
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:
Follow-up video addressing viewer questions about Fizzy including testing and fixtures, modeling questions, AI, multi tenancy, view layer (templates, helpers, view components), and more.
How to architect Rails apps is the subject of many heated debates. Here is our take at 37signals. It includes thoughts on Domain Driven Design, service objects, callbacks and concerns.
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.
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...
If you’re part of a collective, both of the following can be true at the same time:
Exploring how abstractions should hide distracting details while showing essential information, and examining how good explanations distinguish useful abstractions from poor ones.
Code with JasonWe 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...
Action Text in Rails will get much better soon.
Nobody loves urgencies, but a sense of urgency is a blessing.
A modern rich text editor for Rails.
Read announcementI 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...
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...
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 ...
Hotwire Spark is a new live-reloading system for Rails applications that automatically updates pages when source code changes, with a focus on providing a smooth, seamless feedback loop rather than...
Minimal dependencies, maximum productivity. Staying vanilla pays long term dividends for your Rails apps.
I’m skeptical about Bluesky debunking X in the long term. Two reasons:
A live-reloading system for Hotwire applications.
Read announcementWhen 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...
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...
I gave this advice to someone today: don’t discuss work things at the chat. Go async… always.
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 ...
The best things happen after uphills.
I don’t think creative processes benefit from democracy — quite the opposite.
A demo showing how page refreshes with morphing work, and how they compare to stream actions. This is a new feature coming with Turbo 8.
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.
Deep dive into Active Record encryption and the latest advancements in Turbo 8 technology.
The Rails ChangelogHow 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...
Discussion covering Active Record Encryption, Console1984, and the development of Turbo Morph for Turbo 8.
Remote RubyI recently published two articles in the 37signals dev blog related to how we will improve page updates in Turbo 8.
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 ...
Page refresh with morphing for Turbo 8.
Read announcementTurbo 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...
A Rails World 2023 talk exploring how Turbo can make a real difference in building modern web applications.
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...
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.
There is complex and there is difficult, they are not the same.
Rails pragmatically embraces “sacrificing purity for convenience” through techniques like callbacks, CurrentAttributes, and suppress operations. Rather than adopting absolutist positions against th...
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 ...
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...
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...
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...
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...
Internal energy is tricky.
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.
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...
You don’t need an audience to put writing work for yourself:
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...
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...
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...
Some assorted reflections on my 2022:
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:
A deep dive into Rails concerns, when to use them, and how to write good ones.
Code with JasonActive Record restates the traditional question of how to separate persistence from domain logic: what if you don’t have to?
Discussing software design techniques requires real code examples from actual applications to enable meaningful comparison and debate, rather than abstract concepts alone.
Discussion about how vanilla Rails capabilities are sufficient for building applications, drawing on experience at 37signals.
Code with JasonI 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...
Last Sunday a friend shared with me this Twitter thread by Kasper Timm Hansen:
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.
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.
We love concerns and have been using them for years in large codebases. Here we share some of the design principles we use.
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...
Good code is a fractal: you observe the same qualities repeated at different levels of abstraction.
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...
Dashboard and Active Job extensions to operate and troubleshoot background jobs.
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.
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.
As a customer, I can’t think of something I value more than how a company handles the problems I have with them.
It’s hard to appreciate the good without having experienced the bad.
When it comes to analyzing code performance, context matters a lot. For example, say we have this code that adds two numbers:
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.
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.
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...
This question applies to most people, and it certainly applies to me: does it make sense to write without an audience?
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...
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...
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...
The suggestion that mixing buckets is the root of all your software quality problems is common in our industry.
Balance is hard. We love extremes: they are simple and effective.
Just because the world is short of lists of favorite apps, here is mine:
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...
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.
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...
When working remotely, this is a great habit: make decisions and communicate them, but try to avoid getting blocked waiting on others.
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...
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...
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...
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 constitute...
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...
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...
Encrypt existing database records in bulk using Active Record encryption.
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...
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...
A Rails console extension that protects sensitive accesses and makes them auditable.
Read announcementAs 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...
Documenting the pull request to add encryption to Active Record brought me memories about the origin of each feature:
Encrypted attributes for Active Record models.
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 was an eventful one:
A tweet about how engineers should not write code (Spanish) made me revisit a subject I used to enjoy: metaphors of what software development is about. There are only one million articles about thi...
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...
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.
I released ib_ruby_proxy, a service for invoking Interactive Brokers (IB) API from Ruby. You can read more about how it works on its README.
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...
I released Impersonator, a Ruby library to record and replay object interactions. Many times in the past, I had missed something like VCR when HTTP was not involved. So this time I went ahead, a wr...
Ruby library to record and replay object interactions.
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...
I recently discovered a couple of niceties about Ruby Structs that made me love them even more.
Recently I have worked on form-validation systems in a couple of modern Rails apps, and I learned a few things along the way I would like to share.
Invoke IB api from ruby.
I believe that development costs should inform every activity that takes place when developing software.
The SPA path is dark and full of terrors. You can bravely fight those… or choose a different path that takes you to a similar destination: modern Rails.
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.
Support for render with Turbolinks in Rails controllers.
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 ...
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...
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...
Ansible playbooks and roles for deploying Rails applications to EC2.
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...
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.
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.
Command-line utility for syncing and running your backtests in QuantConnect.
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...
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...
I have been working on a thing that deals with stock market data. The format for the data is in CSV and, since I am using second-resolution data, they are big files. I am using Ruby, and I got curi...
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 ...
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.
Fetch books metadata using Amazon Product Advertising API.
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.
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...
Copy active record models from remote databases.
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...
Rails Action Mailer adapter for Mailgun.
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 ...
I love RubyMine. I have been using it for one year and a half as my main Rails/Javascript editor.
A tool for truncating HTML strings efficiently.
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...
Assert utility for ruby.
Some months ago, following my brother’s advice I replaced del.icio.us with Evernote as my web bookmarking system. At the moment I had over 2000 del.icio.us bookmarks. Since Evernote didn’t offer an...
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...
Lately, I often find myself thinking about how much I have changed my mind about Java. For a long time I have been interested in the Java Platform, and I have tried to be educated on its good pract...
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...
I am involved in a personal project where I am developing a web application with Rails. I am using RSpec and Cucumber, and I am following an outside-in, behavior-driven development approach, as rec...
I recently read The Mythical Man-Month: Essays on Software Engineering.
This week I found out that there are important differences between Ruby and Groovy when it comes to evaluating code dynamically. In order to write the testing infrastructure of a DSL we were develo...
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...
I would like to share the slides I used in a talk on agile development. I gave the talk on last July, as part of the Preparatic weekly sessions. I really enjoyed it. The people received the lecture...
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...
In 2006 I got a FICYT Research Grant in Software Engineering. As the results of my research I wrote a document I would like to share. Since it was written three years ago it is quite outdated but p...
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...
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...
When I was at the university, I remember being very interested in the suggestion that building software was like building bridges, and that software should have blueprints as sophisticated as those...
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.
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...
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
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...
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...
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.