Almost every team I audit has a file like this: 1,900 lines, conditionals six levels deep, a comment at the top that just says “careful.” Once a quarter, someone floats rewriting it, and everyone nods like that’s obviously the responsible thing to do.
Usually it isn’t.
Maintainability debt charges interest when work runs through it. Security holes, unsupported…
On one production app I work on, a fresh Git worktree becomes runnable with one setup script:
bin/setup Setup prepares the environment and exits, then the normal development command runs. I’ll use bin/dev here as shorthand for whatever command the repository already uses. Setup doesn’t hide the server inside a clever process manager.
bin/setup is a repo-owned executable that…
A competent outsider shows up with a small, clean fix. They’ve read the contributing guide and written a test; the diff is easy to review. What happens next decides whether they ever come back, and whether the next 10 people who would have followed them ever start.
Nobody defends what usually happens next. Letting a PR rot isn’t a decision anyone makes, and the silent close is…
The first thing I usually do when I pick up a new codebase isn’t opening the code. It’s opening a terminal and running a handful of git commands. Before I look at a single file, the commit history gives me a diagnostic picture of the project: who built it, where the problems cluster, whether the team is shipping with confidence or tiptoeing around land mines.
What Changes the Most…
On March 27, Ruby 3.2.11 shipped with a fix for CVE-2026-27820, a buffer overflow in Zlib::GzipReader. Four days later, Ruby 3.2 hit end of life. That patch was the last one this version will ever receive.
Nothing broke on April 1, and nothing will for a while. What changed is that the next vulnerability discovered in Ruby 3.2 will never be fixed by the maintainers.
What “End of…
Rails 8 wants you to drop Redis, Sprockets, and Sidekiq and adopt a full stack of database-backed infrastructure. None of that is mandatory yet, although the gap between the blessed stack and yours widens with every minor release.
The Rails 7.2 to 8.1 upgrade itself is one of the smoother major version jumps in recent Rails history, with fewer hard removals and fewer gotchas that prevent the…
A client’s team spent a week adding a CSV export to their admin panel. Two engineers, clear requirements, maybe a day of actual work. The rest of the time went to understanding existing code well enough to change it safely. The codebase makes every task take longer than it should, and that overhead never shows up in a dashboard or a sprint report.
The team slows down. Every time,…
Rails 8 ships with Propshaft as the default asset pipeline for new applications. If you just upgraded an existing app to Rails 8, nothing changed. Propshaft is opt-in for existing apps, full stop.
The answer to whether migrating from Sprockets to Propshaft is worth it depends almost entirely on what your asset pipeline actually does today.
Table of Contents
What Propshaft Actually Is…
In order to close a tab in vim, in normal mode type :tabclose (or the shorthand :tabc).
This will close the current tab page and all of its windows.
If you only have one tab open, vim will give you an error. Use :q instead.
You can read more by typing :help tabclose, which outputs this message:
:tabc[lose][!] Close current tab page. This command fails when: - There is only one tab…
After doing this enough times, I’ve learned the first week isn’t about reading the code. It’s about reading the signals.
The client already has opinions about what’s wrong. They’re usually partially right and almost always wrong about why. Your job in week one is to separate what looks bad from what’s actually dangerous.
TL;DR: Start with people, not…
In order to open a new tab in vim, in normal mode type :tabnew.
This will open a new tab with an empty buffer.
You can read more by typing :help tabnew, which outputs this message:
:[count]tabe[dit]	*:tabe* *:tabedit* *:tabnew* :[count]tabnew Open a new tab page with an empty window, after the current tab page. If [count] is given the new tab page appears after the tabpage [count]…
Update — March 2026: This post was significantly expanded to cover additional pitfalls: association bleeding, STI subclass inheritance, multi-tenant security risks with unscoped, and the Rails 6.1 all_queries: true option. It also now includes a recommendation for the discard gem as the correct soft-delete solution.
A pretty popular opinion in the Ruby on Rails community is that default_scopes…
In Ruby on Rails, strong_params are a necessity to work with ActionController parameters, but sometimes an exception of ActionController::ParameterMissing is thrown… Why?
The Code params.require(:message).permit(:text, :author_id) The Exception ActionController::ParameterMissing (param is missing or the value is empty: message)
The Fix The error is occurring because our params hash…
warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call warning: The called method `test' is defined here Ruby 2.7 deprecated the use of hashes in the last argument of a method call. Luckily, this can be resolved by removing the curly braces of a direct hash argument, or adding a hash splat ** to a variable argument
For these examples,…
In vim, one of the largest challenges is learning how to create, open, and manage buffers.
In vim, how do you open the currently opened file in a new tab?
The Command In order to open the current file in a new tab, utilize tabnew like so:
:tabnew % This utilizes the command :tabnew, in which opens a new tab with the argument %, which expands to the currently selected buffer’s…
For example, if I want to find all users created within the last week, I would ask for all users from my User model in which the column updated_at is greater than 1 week ago, or 1.week.ago.
1. Using Ruby’s Infinity Range (Best) In Rails 5+ and Ruby 2.6+, the infinity range can be used like so:
User.where(created_at: 1.week.ago..) If you haven’t upgraded to Ruby 2.6 yet, you can…
While it is common to hold daily stand-up scrum meetings in the morning, this might not be the best fit for your team. Many teams hold their meetings mid-day, or even at the end of the day. Choosing the best time to hold your stand-up can be difficult.
In my personal experience, the best stand-up time is a time in which works best for the workers. This quick status meeting shouldn’t…
When test suites contain a lot of duplication, coupling occurs at an individual spec basis. By utilizing core RSpec functionality, developers can clean up specs in order to reduce duplication and add clarity to the focal point of the spec.
If I want to test an invalid and valid email, it’s pretty easy to test with a basic RSpec test:
RSpec.describe User do it 'me@example.com is a…
Every sourdough recipe calls for “fed” or “unfed” starter and almost none of them explain what that actually means. I spent way too long piecing this together from forum threads and trial and error, so here’s the clear version.
What Is Fed Sourdough Starter? Fed starter is starter you’ve recently fed (equal parts flour and water by weight) and allowed to…
Today, I want to get back into the swing of blogging with a brief overview of my relationship with my father over the past 21 years of my life. More particularly, I want to give an overview of my relationship with my father in relation to the teaching and mentoring he provided me as he guided me through my learnings as a developer and more importantly his firm but guiding hand throughout the…
A good developer takes a break before they get burned out. When a developer gets burned out, it takes them longer to recover than taking periodic breaks.
Taking a break is very important to a developer. It’s one of the reasons that I took a break from blogging for a few days. I was starting to get burned out writing blog articles every day, so I’m cutting back to around one a week.
Every developer has thought Am I really a developer or just a good googler? which is a fair question. It’s something I’ve asked myself a multitude of times.
Recently, this question has been bugging me more than usual, as I have been learning the ins and outs of Ruby and RoR. Recently, I sat down with a graph composition book and wrote down all the differences of “Good…
Teams usually call me after their developers have said some version of: “We can’t build this before we do this, and this, and this.”
Sometimes the trigger is a failed deployment or production downtime. More often, the team is simply struggling. Deadlines keep slipping because every feature exposes another prerequisite, another brittle system, or another part of the app nobody…