Here’s to the Next 3 Years
I officially joined Engine Yard on January 1, 2008, about a week before we announced our Series A funding, becoming its twenty-second employee. I was Engine Yard’s very first “Engineering” hire, and I would spend the next year working on Ezra’s Merb project, finally releasing Merb 1.0 at MerbCamp that October. When I joined Engine...
Announcing Handlebars.js
For a number of years, I’ve been about as active in client-side development (through jQuery) as I have been active in server-side development (through Merb and then Rails). Recently, I’ve released a couple of libraries (jQuery Offline and Rack::Offline), designed to make it easier to build applications that can withstand both flaky connections and a...
Automatic Flushing: The Rails 3.1 Plan
preamble: this post explains, in some detail, how we will implement a nice performance boost for Rails developers. Understanding the details might help gain the full benefits of the optimization, but you will gain some benefits even if you have no idea how it works. As you’ve probably seen, DHH announced that we’d be looking...
A Tale of Abort Traps (or Always Question Your Assumptions)
For a few months now, the bundler team has been getting intermittent reports of segfaults in C extensions that happen when using bundler with rvm. A cursory investigation revealed that the issue was that the C extensions were compiled for the wrong version of Ruby. For instance, we would get reports of segfaults in nokogiri...
Using >= Considered Harmful (or, What’s Wrong With >=)
TL;DR Use ~> instead. Having spent far, far too much time with Rubygems dependencies, and the problems that arise with unusual combinations, I am ready to come right out and say it: you basically never, ever want to use a >= dependency in your gems. When you specify a dependency for your gem, it should...
Threads (in Ruby): Enough Already
For a while now, the Ruby community has become enamored in the latest new hotness, evented programming and Node.js. It’s gone so far that I’ve heard a number of prominent Rubyists saying that JavaScript and Node.js are the only sane way to handle a number of concurrent users. I should start by saying that I...
Everyone Who Tried to Convince Me to use Vim was Wrong
A couple weeks ago, I took the plunge and switched to vim (MacVIM, to be precise). It wasn’t the first time I tried to make the switch, and I had pretty much written it off entirely. Why? Because the past few times I tried switching to vim, I took the advice of a master vim...
What’s New in Bundler 1.0.0.rc.1
Taking into consideration the huge amount of feedback we received during the Bundler 0.9 series, we streamlined Bundler 1.0 significantly, and made it fit user expectations better. Whether you have used bundler before or not, the easiest way to get up to speed is to read the following notes and go to http://gembundler.com/v1.0 for more...
Encodings, Unabridged
I wrote somewhat extensively about the problem of encodings in Ruby 1.9 in general last week. For those who didn’t read that post, let me start with a quick refresher. What’s an Encoding? An encoding specifies how to take a list of characters (such as “hello”) and persist them onto disk as a sequence of...
My Common Git Workflow
A recent post that was highly ranked on Hacker News complained about common git workflows causing him serious pain. While I won’t get into the merit of his user experience complaints, I do want to talk about his specific use-case and how I personally work with it in git. Best I can tell, Mike Taylor...
Named Gem Environments and Bundler
In the beginning, Rubygems made a decision to allow multiple versions of individual gems in the system repository of gems. This allowed people to use whatever versions of gems they needed for individual scripts, without having to partition the gems for specific purposes. This was a nice starting place. Being able to just install whatever...
Ruby Require Order Problems
Bundler has inadvertantly exposed a number of require order issues in existing gems. I figured I’d take the opportunity to talk about them. There are basically two kinds of gem ordering issues: Missing Requires Imagine a gem that uses nokogiri, but never requires it. Instead, it assumes that something that is required before it will...

