Yukihiro Matsumoto, known in the community as Matz, designed Ruby in
response to a specific dissatisfaction. In the early 1990s he valued the
speed of scripting languages but could not find one that paired that
flexibility with a coherent, pleasant object model.
Ruby emerged from that search. It drew ideas from Smalltalk, Lisp, Perl,
Eiffel, and Ada without simply placing them side by side. Matsumoto
prioritized human experience: programs should express intention
fluently, reduce repetition, and present forms close to the problem.
This orientation is often called “programmer happiness.” It does not
mean Ruby is always simple or prevents errors. It means accepting
implementation complexity when that creates a more natural interface for
the person writing code.
Learning languages before creating one
Matsumoto was born in Osaka Prefecture in 1965 and grew up in Tottori.
He became interested in programming as a teenager, when local access to
computers and specialized documentation remained limited.
He entered the University of Tsukuba in 1984, gaining access to
machines, international documentation, and networked communities. He
studied information science, languages, and compilers, graduating in
1990, and explored many languages while building tools in Emacs Lisp.
This variety convinced him that language design cannot maximize one
property alone. It must balance coherence, power, familiarity, and
learning cost. His long-standing wish to create a language became
concrete when he sought a practical scripting language in which objects
were central rather than peripheral.
February 24, 1993: the beginning of Ruby
Matsumoto dates Ruby’s birth to February 24, 1993, during a discussion
about an object-oriented scripting language. Perl 4 was powerful for
text, while Python’s object model did
not then feel as uniform as he wanted.
He began an interpreter combining fast scripting, values as objects,
iterators and closures, exceptions, automatic memory management, and
practical string and regular-expression tools. The name Ruby echoed
Perl—a gemstone after a pearl—while signaling a different identity.
Matsumoto developed the project outside his main job. Ruby 0.95 appeared
on Japanese newsgroups in December 1995, followed by Ruby 1.0 in
December 1996.
Everything is an object, but objects must remain practical
Ruby applies message sending more uniformly than many hybrid languages.
Numbers, strings, classes, and booleans are objects. 3.times literally
asks the object 3 to repeat a block.
3.times do |index|
puts "Step #{index + 1}"
end
The integer supplies iteration and the block describes only the changing
action. This keeps common intention visible and moves repetitive
machinery into reusable methods, allowing libraries to build
domain-oriented vocabulary.
The model remains dynamic: variables have no declared static type, so a
missing method may be discovered only when that path runs. Tests,
analysis tools, and API conventions are therefore essential in large
systems.
Blocks, closures, and iterators
Blocks are one of Ruby’s most recognizable features. A method can
receive code, execute it, retain it as a Proc, or pass values into it.
prices = [12, 20, 7]
taxed = prices.map { |price| price * 1.2 }
map controls construction of the new collection while the block
supplies transformation. Indices, size, and mutation stay hidden when
the problem is simply to transform every price.
Blocks are closures and can capture surrounding variables. This supports
callbacks, scoped resources, and internal languages. File.open can
open a file, yield it, and guarantee closing it. Ruby’s originality lies
not in inventing closures, but in integrating them naturally into
ordinary method calls.
Single inheritance and mixins
A Ruby class inherits from one superclass. To share behavior without
artificial hierarchies, modules act as mixins. Enumerable, for
example, supplies sorting, filtering, and searching when a class
provides iteration.
This separates “is a kind of” inheritance from “has this behavior”
composition and avoids some ambiguities of multiple inheritance. Mixins
still require clear contracts: if a module expects missing methods,
failure occurs at runtime.
Ruby commonly favors duck typing: an object’s ability to answer
required messages matters more than its declared label. This enables
lightweight substitution but shifts part of verification to use,
documentation, and tests.
Ruby classes remain open: programs may add or redefine methods after
creation, even on standard-library classes. Metaprogramming can define
methods, intercept messages, and inspect classes, letting libraries turn
concise declarations into validation, associations, serialization, or
commands.
This expressiveness enables internal domain-specific languages, but
global modification—often called monkey patching—can unexpectedly
alter a dependency. Dynamically generated methods are also harder to
search and trace.
Experienced teams limit global changes, isolate metaprogramming, and
sometimes prefer explicit code over an opaque clever abstraction. The
author’s happiness today must remain compatible with the reader’s
happiness months later.
“Natural,” not merely minimal
Matsumoto describes Ruby as natural rather than simple. It may offer
aliases or contextual syntax when that makes code flow better.
send_report if ready?
This form foregrounds the action and treats the condition as a
qualification. The goal is not to imitate English everywhere but to
match how developers mentally organize an operation while retaining a
precise, international grammar.
Like Larry Wall, Matsumoto accepts some
redundancy inspired by natural language, but Ruby seeks a more uniform
aesthetic: common operations are method calls and blocks structure
variations. What feels elegant remains subjective, making editorial
direction and diverse community feedback necessary.
Early discussion took place mainly in Japanese on ruby-list.
Contributors reported bugs, proposed libraries, and shaped the language.
Matsumoto retained final responsibility for coherence, but Ruby quickly
ceased to be a solitary implementation.
Ruby became one of the first major open language projects born in Japan
to gain global adoption. Free licensing enabled distribution, but
internationalization also required English documentation and community
relays.
The ruby-talk list and Dave Thomas and Andy Hunt’s online Programming
Ruby in 2000 made the language more accessible outside Japan. User
groups, conferences, packages, and localized examples completed a
process that translation alone could not achieve.
Ruby on Rails: the accelerator, not the origin
In 2004, David Heinemeier Hansson extracted Ruby on Rails from
37signals’ Basecamp. Rails used Ruby’s blocks, conventions, open
classes, and metaprogramming to reduce Web application configuration.
Its principles of convention over configuration and don’t repeat
yourself let frameworks infer relationships. Demonstrations that
produced working applications in minutes gave Ruby worldwide visibility;
many developers encountered Rails before Ruby itself.
Matsumoto did not create Rails, and Ruby had existed for nearly a
decade. Rails demonstrated how language features could enable a
distinctive framework, but implicit conventions could also complicate
diagnosis outside the standard path.
Evolving the implementation without changing the identity
The reference implementation is MRI—Matz’s Ruby Interpreter—or
CRuby because it is written in C. Growth made performance and execution
architecture increasingly important.
Ruby 1.9 incorporated YARV, a virtual machine designed mainly by Koichi
Sasada. JRuby targeted the JVM, TruffleRuby used GraalVM, and mruby
addressed embedded systems. These projects show that Matsumoto guides
the language while many people build its implementations.
Ruby must improve speed without sacrificing dynamic behavior. Method
redefinition, introspection, and generated code restrict optimization
because the runtime must assume the program may change. Modern versions
add just-in-time compilation, profiling, and optimization while
preserving the dynamic model.
Governing through coherence and discussion
Matsumoto remains Ruby’s lead designer and an important arbiter. His
role is less to write every patch than to decide whether proposals fit
the language’s identity and direction.
Public issue tracking, mailing lists, conferences, and core teams expose
ideas to implementers and users. The Ruby Association, chaired by
Matsumoto, connects the open community with organizations requiring
stability.
Ruby evolves through releases, deprecation warnings, experiments, and
revised decisions. Coherence is continuous work, not a property
permanently acquired in 1993.
Why Yukihiro Matsumoto still matters
Ruby showed that a dynamic language could put programmer experience at
the center without remaining an educational toy. Its blocks, iterators,
and expressive APIs influenced how communities discuss readability and
internal languages.
Matsumoto also demonstrated the role of deliberate taste. Language
design is not a vote on a feature list: someone must decide which
combinations form a recognizable whole and where complexity should live.
Ruby also provides a warning. Pleasant syntax and powerful
metaprogramming improve productivity when conventions are shared, but
harm maintenance when behavior becomes implicit or global. Programmer
happiness is not merely typing fewer characters; it balances writing,
reading, feedback, and turning ideas into software without needless
struggle.
Timeline
- 1965: Yukihiro Matsumoto is born in Osaka Prefecture.
- 1984: He enters the University of Tsukuba in information
science.
- 1990: He graduates and begins a software-development career.
- 1993: Ruby’s design begins on February 24.
- 1995: Ruby 0.95 is published on Japanese newsgroups.
- 1996: Ruby 1.0 is released.
- 2000: Programming Ruby supports international adoption.
- 2003: Ruby 1.8 stabilizes the branch used during worldwide
growth.
- 2004: David Heinemeier Hansson creates Ruby on Rails.
- 2006: International Ruby groups and conferences grow rapidly.
- 2007–2009: Ruby 1.9 integrates Koichi Sasada’s YARV.
- 2011: Matsumoto receives the Free Software Foundation Award.
- 2013: Ruby 2.0 appears twenty years after the project began.
- 2020: Ruby 3.0 emphasizes performance and concurrency tools.
Frequently asked questions
Why did Yukihiro Matsumoto create Ruby?
He wanted a practical scripting language with objects at its center
rather than added later. No existing language combined exactly the
flexibility, objects, iterators, and writing experience he wanted.
Is Ruby inspired only by Smalltalk?
No. Smalltalk strongly influenced its object model, but Matsumoto also
cites Perl, Lisp, Eiffel, and Ada. Ruby combined and adapted these
influences into its own identity.
What does “optimized for programmer happiness” mean?
It means favoring expressive interfaces, rapid feedback, and constructs
close to human intention. Complexity remains, but the language tries to
hide its repetitive parts.
Did Matsumoto create Ruby on Rails?
No. David Heinemeier Hansson created Rails from Basecamp in 2004. The
framework greatly increased Ruby’s visibility and uses its blocks,
conventions, and metaprogramming extensively.
What are Ruby’s main limitations?
Dynamic behavior can postpone errors until runtime, open classes can
create difficult interactions, and performance has long been
challenging. Tests, conventions, and modern tools reduce but do not
eliminate these risks.