Defensive Design for the Web: How To Improve Error Messages, Help, Forms, and Other Crisis Points
Available Now ($16.99)
Subscribe to our free newsletter and receive updates on 37signals' latest projects, research, announcements, and more (about one email per month).
When programmers speak of code as ugly or beautiful they reveal an appreciation of software that goes much deeper than the functionalistic appearance of their work. There are plenty of obvious and objective correlations between ugly and opaque code and defects and extendability, but the individual and psychological effects are at least equally interesting.
Whether bad code stems from duplication, verbose constructs, low coherence, or high coupling, it brings along a wide array of unwelcome feelings within the mindful programmer. Guilt (I should have done better) and fear (What if I can’t do better?) are the most prominent, which in turn leads to procrastination as a short-termed escape from the unwanted feelings.
It’s against this backdrop of feelings that I best explain my gratitude to Ruby. Ruby helps me avoid feelings of guilt or fear like no other programming language has in the past. The feedback loop between thought and code fulfilling those thoughts is effectively preventing impatience and uncertainty to take hold as a welcome for those other unwanted feelings.
Ruby doesn’t make new things possible, but many things desirable. It also affords continous simplification and occasional breakthroughs at an for me unprecedented level. There’s an immense sense of satisfaction in making less code do more on a regular sometimes even daily basis.
As a practical example, Ruby enabled me to program Basecamp in less than two man-months (which, however, doesn’t map to either calendar months or the entire developing process for 37signals). That while learning the language and building a full-stack web framework (ORM-layer, controller, template system) called Rails (and soon to be released). It further allowed the system, though continous simplification and occasional breakthroughs, to adapt a wide range of new features without significantly increasing the codebase.
I owe my continued interest in programming to Ruby.