00:00:14.879
Hello everyone, I'm really excited for this talk. My name is Giles Bowkett, and today I will be discussing code generation and the concept of 'safety scissors' in the context of metaprogramming.
00:00:21.880
This is my second iteration of this talk; I initially presented it in Philadelphia a couple of days ago, and I will be giving it again next week in Scotland. It's an agile talk that has been evolving over time.
00:00:34.160
Originally, I intended to deliver it as a live coding session consisting solely of code. While it went well initially, there were some technical hiccups — specifically a microphone failure. Additionally, I'm dealing with the issue of fitting into my clothes as I’ve recently lost weight, which added another layer of complexity. The talk ended with still half an hour left to spare, so this time, I'll be combining live coding with slides.
00:01:11.439
In the Ruby community, we have a great fondness for unusual programming languages. We're known for exploring languages like Haskell, Erlang, Scala, and Factor. With this background, I decided to draw from an area I find quite bizarre yet fascinating: ancient Greek. Archimedes, who is regarded as a personal hero of mine, is one notable figure from that era.
00:01:56.960
You likely know the term 'Eureka', which originates from Archimedes. He famously exclaimed it when he discovered a solution to a problem while taking a bath, leading him to run through the streets completely naked. He also made significant contributions to mathematics, such as calculating the value of pi with remarkable precision during a time when geometry was the primary mathematical focus.
00:02:41.040
Tragically, he was killed by Roman soldiers who had been ordered not to harm him while he was engrossed in his work. This incident speaks volumes about his dedication and the seriousness of his pursuits. One of his quotes about levers epitomizes the ingenuity behind engineering: he claimed that if given a proper fulcrum, he could move the world. While Archimedes is an icon in engineering, the programming community tends not to dwell overly much on ancient Greek.
00:03:23.720
However, we do recognize the Greek letter pi, which represents a numerical value. Another Greek symbol that resonates among programmers is Lambda. Those familiar with Ruby’s Proc and Lambda keywords can understand that it pertains to a significant concept in programming. Unlike the Ruby community, which often takes more interest in the notion of 'meta,' the Lisp community emphasizes the derived power of Lambda as a way to express code as data and execute it later.
00:04:28.880
In Ruby, 'metaprogramming' is popularly associated with the language, although the term doesn't entirely grasp what we do. When we talk about metaprogramming in Ruby, what we often mean is simply enhancing object-oriented programming, hence it can be termed 'meta OO.' My talk, 'Code Generation: The Safety Scissors of Metaprogramming,' addresses this notion of operating carefully while writing dynamic code. The idea behind safety scissors is that if you are using them incorrectly, you run the risk of harm, but if you employ them properly, they can be quite useful.
00:05:53.760
Let's dive into the technical aspects. Using a Ruby gem named 'Ruby to Ruby,' you can convert Ruby code into Ruby code, which in itself seems a bit silly but is actually quite powerful. I'll demonstrate with an example of a Lambda that outputs 'Hello World'. When we run 'Ruby to Ruby' on this code, you'll see it returns a Proc instead of Lambda, which is an interesting underlying mechanic.
00:08:01.080
Moving on to a Rails application, we can examine a simple model named 'Widget.' In this case, we will consider how Ruby to Ruby translates the model’s behavior. Initially, we require the library and execute the translation, which should show how the code infers relationships. Looking into a Rails app provides an illustration of how you can introspect existing applications.
00:12:31.799
However, it’s important to note that this introspection isn't groundbreaking; it's more of a fun trick. As mentioned in discussions on Rails plugins, the complexity of Monkey patching can lead to tangled object graphs, which becomes an issue of maintainability.
00:13:26.479
As a solution to excessive Monkey patching, Pat Maddox developed the Meta Alias Method Chain. This tool manages method calls with logging, offering a way to track any changes made to methods dynamically without cluttering the codebase.
00:15:06.919
Although testing code changes can be challenging, the importance of unit tests and specs cannot be overstated. Pat's proposal addressed some key issues of transparency in methods and logging; however, it may not fully resolve the issues related to excessive Monkey patching, which necessitates a broader solution.
00:16:43.680
In essence, I became interested in monkey-patching the concept of monkey patching itself. I initially utilized Rubinius, a Ruby interpreter, to diagram how coding methods can be enhanced. The foundational principle here is that you can extend Ruby’s capacity for metaprogramming with third-party tools that interface with the system.
00:18:25.360
Let me take you through a practical example of applying these concepts to music generation. I’m currently working on a system that algorithmically creates music. After observing the random number generation applied in this field, I recognized the importance of logging each generated instance of music — allowing me to recreate desirable outputs down the line. This logging will help preserve those fleeting moments of quality creation that often arise spontaneously.
00:22:06.520
Therefore, when music is generated, there will be a system which also logs this data into a retrievable format, allowing me to retrieve and regenerate those tracks at will. This realizes the mission to not only create beautiful music but also maintain the ability to revisit or replay music in a live setting.
00:24:51.920
To wrap up, I firmly believe that everyone involved in coding will benefit from exploring the resources and methodologies surrounding metaprogramming, especially concepts detailed in pivotal literature on the subject. Code as data is an attribute every programmer should embrace.
00:26:14.680
In summary, writing code that generates further code not only enhances the capabilities of individual programmers but contributes to an overall boost in productivity within teams. My main takeaway here is that skilled programmers can outpace hiring efforts by creating programs that inherently produce high-quality code efficiently.
00:30:00.160
I want to emphasize that simplicity should take precedence over the complexity found in some powerful languages. While languages like Lisp and Perl present incredible capabilities, they often come at the cost of accessibility. Ruby bridges that gap brilliantly, providing both simplicity and power.
00:37:25.040
Finally, thank you for your time. I hope you will take this opportunity to engage further in discussions about metaprogramming and how it can be applied to your own projects. I'm happy to take any questions!