00:00:29.920
This is Ryan Davis, who goes by Zen Spider on the internet. He founded Seattle.rb, a prominent Ruby user group. Ryan has authored multiple tools, including RSpec, Test-Unit, T-Package, and MaxiTest, which he is particularly fond of. He recently advised me to use structs for everything, and I believe that is sound advice. Anytime I can use a struct, I should. In my applications, I hardly ever create objects anymore; everything is a struct.
00:01:00.000
You can find Zen Spider's actual work online by searching for Zen Spider. Please join me in welcoming Ryan Davis to the stage with a round of applause.
00:01:19.360
Since I am the last speaker, I don't have to start the timer yet, right? You're all captive here, so please start the timer. This is my first time at this conference, and I want to thank everyone for having me. I believe this is a great conference, and I would like to thank Jonan, Kobe, Josh, and everyone else involved. I'm sure I’m forgetting many names, so a round of applause for them would be appreciated.
00:01:36.880
I also want to thank all of you for sticking around for the last talk. I know you are all more than a little bit drunk, having made it through an entire day, and now you have to deal with me. Thank you very much for your attention. As mentioned, I am the founder of Seattle.rb, and we just celebrated our 13-year anniversary last Saturday. We've been meeting weekly for the last nine years or so. Unfortunately, we don’t have an exact date when we started that, but we really love our meetups.
00:02:01.119
Today, I'll be speaking about 'Standing on the Shoulders of Giants'. A humorous moment occurred at RubyConf Australia where I said, 'I'll let you finish, but my talk was the best talk ever.' This was in response to a talk given by Aaron Patterson titled 'Polishing Ruby,' which is also the title of my blog since 2005. Some people took it seriously; however, it was staged.
00:02:21.680
As is customary with my talks, I like to set expectations. This talk will have very little in terms of code as it is more of a historical overview, focusing on ideas and concepts I believe we should adopt. To begin, I want to share a little story about my journey with alcohol. I was a teetotaler for about 20 years, avoiding drinking before it was even legal for me to do so. That changed at Madison Ruby in 2012 when Jeannie Carpenter introduced me to a whiskey and cheese pairing that was simply sublime.
00:02:46.720
Consequently, I decided to give drinking a shot, thinking, if I consume expensive alcohol, I would moderate my intake. So, thanks for ruining my liver! As for my current diet, my liver has a 5x multiplier effect, meaning I easily feel tipsy after minimal drinking. Thanks, Josh, for the scotch! Please bear with me if I start to slur my speech.
00:03:09.000
Now, let's jump into the main topic. About 900 years ago, Bernard of Chartres wrote that we, the moderns, are like dwarfs perched on the shoulders of giants, which allows us to see further than the ancients. He attributed this not to our own acuity or stature but because we are elevated by the giants’ greatness. Fast forward about 500 years, Isaac Newton added, 'If I have seen further, it is by standing on the shoulders of giants.' This concept is not new; Newton was iterating on the straightforward idea that every idea we have builds upon the ideas that came before.
00:03:37.760
However, it begs the question: when we create a programming language, why do we often start from scratch? And what does this have to do with Ruby? Well, everything! Otherwise, this talk would have been rejected. As a prelude for our comparison later on, I want to give a quick overview of Ruby's features. Ruby was created by Yukihiro Matsumoto in 1993 and is an interpreted, file-based scripting language.
00:04:05.760
It is purely object-oriented, class-based, and features incredibly complex syntax and semantics—something that resonates with many of us. Ruby is designed and optimized for developer happiness, which is one of the reasons why we love it. For comparison, I want to present a simple Fibonacci implementation in Ruby as a basic example of the language.
00:04:41.440
Looking back at Ruby’s history, we see that Ruby 1.0 was released almost 20 years ago, and it shipped with almost everything we use today in terms of language features. Since then, not much has been added in terms of language features. Ruby 1.0 introduced private and protected methods, followed by class variables in Ruby 1.6. After that, variations like encodings were introduced in versions 1.9 and later improved in 2.0.
00:05:12.960
As much as I love Ruby and believe it's a fantastic language, it could become even better. It seems to me that Ruby has only done a remarkable job of adopting ideas from languages like Smalltalk, Lisp, and to an extent Perl, but we can do more. Looking forward, I hope to see more influence from Lisp and Smalltalk, as well as new ideas from Self and another system called Cola.
00:05:38.240
Now, let’s discuss some of the giants in programming that I believe we should take inspiration from. First, there's Smalltalk by Alan Kay; then Self by David Ungar; and Scheme and Racket, which were influenced by Guy Steele and Gerald Sussman. Additionally, we have contributions from Matthias Felleisen and others from Viewpoints Research Institute. I do not mean to imply that these individuals worked alone; each of them had collaborative teams contributing to their projects.
00:06:04.640
Let’s start with Smalltalk, one of the first languages I truly loved and where I learned object-oriented programming principles. Smalltalk has a runtime quite similar to Ruby, but it diverges in almost every other aspect. Smalltalk was developed by Alan Kay and Dan Ingalls at Xerox PARC in 1972, and it was publicly released in 1980. It is bytecode compiled but operates on an image-based system rather than a file-based system.
00:06:27.920
Smalltalk is purely object-oriented and class-based, similar to Ruby. It offers an incredibly simple and clean syntax with only six keywords and four precedence levels, making it vastly different from Ruby. This simplicity is contrasted by its fully immersive development environment that served as an incubator for many ideas that we use today, including object-oriented patterns and the MVC architecture—all of which originated in Smalltalk.
00:06:55.760
Here’s a simple Fibonacci implementation in Smalltalk. I have grayed out the pseudo syntax that appears when you export Smalltalk code to files since its standard operations are primarily conducted in memory. The method signature demonstrates how to define the Fibonacci function, and it shows a straightforward, readable structure that Rubyists can easily understand.
00:07:17.280
Next, let’s talk about Self, a language that many of you may be unfamiliar with. Self was developed by David Ungar and Randall Smith at Xerox PARC, and it was finalized at Sun in 1987. This bytecode-compiled language is JIT (Just-In-Time) based, operating on a unique image-based system with no files aside from the image itself. Self is an object-oriented, classless language that emphasizes prototyping.
00:07:43.760
Looking at its syntax, Self is remarkably similar to Smalltalk, yet intriguingly distinct as it only has eight bytecodes in its virtual machine compared to the numerous bytecodes found in Ruby. Self's innovative approach allowed for the development of prototypes, and it has influenced many modern languages, including JavaScript. Self popularized object-oriented prototyping and provided languages like Ruby with concepts to build upon.
00:08:17.280
Following Self, I want to mention Racket, which is a type of Scheme. Scheme, developed by Gerald Sussman and Guy Steele in 1975, is a minimal variant of Lisp that addresses several semantic issues of earlier Lisp versions. Scheme introduced various practical innovations such as tail call optimization and hygienic macros.
00:08:58.240
Racket, which is a maximal variant of Scheme, was developed by Matthias Felleisen and the PLT cohort. It boasts an extensive and varied library that offers a multitude of graphic tools and other functionalities. Racket was designed with a dual focus: it is primarily functional while supporting a multi-language runtime. Its simple syntax, rich set of expressions, and integration of an editor with the runtime make it a pleasure for developers.
00:09:52.160
Finally, I want to introduce Cola, a small yet powerful kernel, contributing to Allen Kay’s legacy of building upon the shoulders of giants. The Viewpoints Research Institute (VPRI), where Kay worked, received a grant from the NSF to explore innovative foundations of new computing systems—most notably, their project, Steps, which is focused on expressive programming systems.
00:10:29.760
Steps aims to create an entire system—from the language to the GUI and applications—understood by an individual coder in roughly 20,000 lines of code rather than the millions typically required by similar systems. Cola is one of the subprojects of VPRI, defined by its mixed object and lambda architecture, which seeks to create the simplest possible language that can be described by itself.
00:10:54.560
Reflecting on the languages we've discussed, they highlight a few key ideas we should explore in Ruby. For instance, Smalltalk's language-supported developer tools enhance productivity significantly. Smalltalk introduces automatic debugging for failed unit tests, advocating for what’s called debugger-driven development, which speeds up the development process.
00:11:20.000
Moreover, Smalltalk’s introspection facilities allow developers to navigate across their code conveniently, which Ruby can learn from. Many in the Ruby community argue that static typing is necessary for effective code analysis; however, Smalltalk proves that with the right tools and approaches, you can achieve a high level of flexibility and clarity.
00:11:50.000
Self, while very different from Ruby, maintains a focus on developer tools and features a straightforward GUI, which is immensely practical for coding. Self’s approach allows you to embed methods directly into objects, making the programming experience seamless.
00:12:09.760
Racket, on the other hand, excels in its polished documentation and responsive development team, which creates an enjoyable coding environment. Its integrated IDE, designed for teaching, is also highly beneficial for experienced developers. With extensive documentation and efficiency in its coding processes, Racket sets a high standard.
00:12:36.000
The language's ability to declare its type at the beginning of source files and support metaprogramming makes it incredibly adaptable. This trait can be hugely beneficial when developing DSLs (domain-specific languages), which further enhances Racket’s usability.
00:12:55.360
As I conclude, I recognize that Ruby is a great language at its core. However, we must remember to stand on the shoulders of giants and draw from the ideas and innovations of other programming languages. The prospect of incorporating new ideas into Ruby excites me, as I believe there's a lot of potential to enhance Ruby's capabilities moving forward.
00:13:36.000
In summary, let’s continue to borrow great ideas from languages that have paved the way for us and kept pushing forward. It's time for Ruby to step-up, embrace innovation, and truly stand upon the shoulders of giants. Thank you!
00:37:26.880
Thank you!