Why Teach Ruby
Ruby may have a smaller place in the market. But that’s not why you should learn it.
As the Co-Founder and Dean of Flatiron School I thought it important to write a response to the recent implication that because a school switched their curriculum focus from Ruby to Java that means the Ruby and Ruby on Rails job market is waning or the popularity and importance of Ruby and Ruby on Rails is diminishing.
At Flatiron School, we are obsessed with the employment outcomes of our students. For four years we’ve taken it upon ourselves to publish independently audited and verified Jobs Reports detailing how our graduates perform in the job market. We’re proud that for four years with over a thousand graduates we’ve maintained such a high employment rate in technical roles.
The truth is that the language a programming school teaches should not be a direct correlation to the job market. We are a pioneer in coding bootcamps and, even in 2012, Java and PHP had larger markets than Ruby.
Don’t define yourself by your first programming language
The very idea that a programmer should be defined by their first language seems tremendously myopic to me. No programmer worth their salt defines themselves as solely a Ruby programmer or a PHP programmer. We are programmers and programming languages are just our tools; we can adapt our toolset to different circumstances and problems. Branding new programmers as “Java” or “Python” by their bootcamp seems hazardous to me, lest the student forever limit their potential by the language they were told they mastered, never taught how to learn something foreign, and lacking the confidence to see their identity outside a language. The tension of vocational schools is blending practical, market-driven, curriculum with more holistic, universal, and philosophical skills that prepare them not just for a first job, but rather a prolific career.
The claim that there is less demand for Ruby programmers is irrelevant. As I mentioned and will expound on, I do not believe in teaching people how to be a “[Language]” programmer. We can continue teaching Ruby first and I’m confident our graduates will still be competitive applicants despite the perceived demand for Ruby in the job market. However, it’s important to say that Ruby is still an in-demand skill and a growing job market. Ruby on Rails is still the language of startups, spawning new companies with every execution of “rails new.” Beyond startups, massive, publicly-traded and private companies have been using Ruby and its ecosystem for years and I don’t see that stopping any time soon. From Ruby on Rails being the primary backend for companies like Shopify, GitHub, Twitch, Airbnb, and more to Chef being a Ruby DSL, there are just so many amazing opportunities for Ruby work. Is it as big as Java? No. But that doesn’t matter because the market for Java and Ruby is hardly saturated and programmers shouldn’t vet opportunities by language anyway.
I don’t think it is educationally prudent to develop a curriculum around being a “Java” or “Ruby” or “[Language]” programmer as that homogenizes your graduates, confines their job opportunities, limits their competitiveness, and fails to prepare them for a career of lifelong learning. Citing a waning popularity of Ruby and Ruby on Rails for a curriculum switch seems suspect to me because in our experience with our thousand of graduates, we see no such lack of demand. I see companies of every size continuing to embrace Ruby, and a great school should qualify a graduate to work in any language they desire to master.
So why Ruby, then?
The most important thing for a student to first learn, regardless of language, is to fall deeply and profoundly in love with code.
As a beginner programmer, the most important thing to really learn are those universal ideas to code expressed through your first language. The danger is that if you are taught a first language in the spirit of “this is all you need to know to get a job” you’ll never learn to recognize those concepts and miss the forest for the trees and not understand how to approach a new language. Tragically, you’ll also miss all the beauty and elegance there is to code.
The joy of programming does not hide in the technical implementations of one language or another, it is found in the wonder of the medium itself, in the “science of operations,” as Ada Lovelace described it. Ada goes on to prophesize:
“The science of operations, as derived from mathematics more especially, is a science of itself, and has its own abstract truth and value.”
Learning to code without learning to recognize the abstract truth in the craft is tragic. A language is never the most important thing to learn when learning to code. The most important thing to learn when learning to code is the absolutely astonishing beauty of code. Students should fall profoundly in love with code.
We teach students to love code first and foremost and Ruby is an attractive choice for the task. What makes Ruby such an amazing first crush for programmers is inherent in the design of the language. Yukihiro Matsumoto, known as Matz, the Japanese inventor of the language, explicitly states his desires with the language:
“The goal of Ruby is to make programmers happy. I started out to make a programming language that would make me happy, and as a side effect it’s made many, many programmers happy.”
Programming languages are invented for hundreds of reasons, almost all of which have to do with the environment of the code — to compile easily across platforms, to optimize parallel processing, to “run faster,” and the such. As far as I know, the only programming language in history invented for your happiness is Ruby. The Ruby language values you, the programmer, over the machine. An early and prolific Ruby programmer known as _why_the_lucky_stiff describes Ruby in this RailsConf 2006 Talk:
“Ruby is so… To code ruby is really to love, to feel passion, to feel pleasure, it stirs you inside so greatly, it’s such a beautiful language, also erotic I would say. Method calls striped, undressed of their parenthesis, chaining them together raw like… Just red ebullient jewel.”
These human-centric values are echoed again in many design choices of the language. Perhaps the most inspiring is the choice in Ruby to provide many ways of accomplishing the same task. Implementation choice is generally seen as a deficit of a language. In fact, Python states in “The Zen of Python” the following value: “There should be one — and preferably only one — obvious way to do it.”
Ruby provides an endless manner of ways to doing something. Matz was asked once at a conference why he would design a language with so many ways to do the same thing and I think his answer speaks to the true heart of the Ruby language:
“I want to make Ruby users free. I want to give them the freedom to choose. People are different.”
To me, that isn’t about programming, or certainly not just about programming — it is a cultural value, the importance of freedom. To Matz, freedom is expressed by the ability to choose. What’s “right” for one person might not be “right” for another and neither are wrong; they are just different, and they should be allowed to be different without judgement. I believe in that value in life, from religious freedom to marriage equality, to political affiliation, and certainly in code.
Values like happiness and freedom might seem frivolous and foreign when embraced by a programming language. After all, who cares about the ideology of a programming language? Certainly not the computer processing the code. So what’s the point? What does Ruby gain by prioritizing the programmer over the machine? And why do these nuances in the language’s design matter when considering what language to teach a programmer first?
Programming languages are just tools. The thing about tools is that they seem interchangeable and inconsequential. Seminal programmer Edsger Dijkstra counters, “The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities.” To paraphrase with a cliche: “When all you have is a hammer, everything looks like a nail.”
The tool you use will directly influence how you think. And how you think about a problem is everything. Thus, the tool you choose to approach a problem will constrain your thinking which will impact your success. Every tool is designed with inherent values. A hammer’s design values the force of the swing, a heavy solid hammer head on top and a light long body to create a long arc for impact. A screwdriver values torque with its long shaft married to a specific screw type and handle perfectly sized to be rotated in your hand. Can you hammer in a nail with a screwdriver? Probably. Is it easy, efficient, elegant, or encouraged by the tool? No. The value of a tool defines how it will be used and how a tool can be used is everything to humanity.
What’s all this have to do with Ruby? Well, I know that I love Ruby and have never loved a programming language before or since like I love Ruby and I’ve been programming for 20 years and know dozens of languages. And it’s not just me — lots of programmers upon learning Ruby fall in love. _why_the_lucky_stiff expresses the sentiment I think many programmers feel at the root of their love:
My conscience won’t let me call Ruby a computer language. That would imply that the language works primarily on the computer’s terms. That the language is designed to accommodate the computer, first and foremost. That therefore, we, the coders, are foreigners, seeking citizenship in the computer’s locale. It’s the computer’s language and we are translators for the world.
But what do you call the language when your brain begins to think in that language? When you start to use the language’s own words and colloquialisms to express yourself. How can it be the computer’s language? It is ours; we speak it natively!
We can no longer call it a computer language. It is the language of our thoughts.
And here’s the thing about Ruby I can’t quite explain and is lost on most inside, and certainly outside, the programming community. Why are Rubyists constantly the inspiration for so many of the major innovations in modern web development? Web Development today is fast, both in performance and productivity; best-practices and conventions are common across languages; and developer tooling and workflows are now a requirement. Rubyists pioneered rapid development frameworks like Ruby on Rails whose conventions allowed you to build a blog engine in five minutes. Ruby on Rails was the first major framework to embrace REST and make it a standard. A few Rubyists thought SVN Version control and the Trac web-interface sucked and embraced Git and built GitHub. The Express.js DSL and so many other Domain-Specific-Languages are created in Ruby and ported to other languages. Heroku, the mother of no-hassle, virtualized, web application hosting, was started by Rubyists for Rubyists. Rubyists have started so many amazing companies: GitHub, Twitch, Twilio, Airbnb, Shopify, and more. For such a niche language, the impact and influence of Ruby is incredible.
Here’s how I explain it and it goes back to the tools we use. Innovation requires doing something differently. A team of Rubyists are fed up with how Ruby on Rails applications manage dependencies, the open-source programs that your application can use to speed development. To solve the issue they create an open-source software library called Bundler to solve the problem. Every programming language has implemented a Bundler-like solution, including yarn, by Facebook, an improvement over npm (node-package-manager), an almost direct port of Bundler. They decided to try something different with Dependency Management.
Around the same time, another group of Rubyists thought it would be amazing if people could rent out their extra living spaces. It was crazy so they used Ruby on Rails to quickly build a working viable product and iterate on it quickly. For years they tinkered and eventually the market and product clicked and we have Airbnb.
I can tell many stories of entrepreneurial success in both the programming and business world with Rubyists at the heart. I’m not claiming amazingness is exclusive to the Ruby community, but I look around and so many incredible improvements that changed the world in ways we still can’t fully know have a thread in Ruby.
Why do so many Rubyists succeed by innovating and inventing? The Ruby language encourages and empowers innovation. If a hammer is meant to be swung and a screwdriver meant to be turned, Ruby is meant to create. The Ruby tool wants you to be happy and when we are happy we can play and explore. The Ruby tool wants you to value expression and allows you to communicate as purely as a human-language. The Ruby tool wants you to be different and make the language your own. The Ruby programmer inherits these values and they fuel the creative human spirit.