Summarized using AI

Closing Keynote: Why is Aaron Patterson?

Aaron Patterson • July 10, 2025 • Philadelphia, PA • Keynote

Closing Keynote: Why is Aaron Patterson? (RailsConf 2025)

Aaron Patterson delivers the final keynote at the last RailsConf, reflecting humorously yet thoughtfully on his 16 years of participating in the Ruby on Rails community. The talk is structured as both an autobiographical tour of his past RailsConf presentations and a meditation on creativity and programming as a hobby in an AI-driven future.

Main Topic

  • The evolution of Aaron Patterson’s involvement in RailsConf, with an emphasis on creativity, fun, and hobbyist programming within the Ruby on Rails ecosystem.
  • Reflections on how personal, creative projects and hobbyist efforts drive innovation beyond what AI and purely utilitarian programming can achieve.

Key Points

  • Recap of 16 Years at RailsConf

    • Patterson jokes about the pressure of closing out the last RailsConf and reviews memorable (and sometimes embarrassing) moments from his keynotes, highlighting both technical and community aspects.
    • Stories range from his mullet photo for his first talk to behind-the-scenes anecdotes of technical demos and community antics.
  • Notable Technical Talks and Projects

    • Early work integrating SQLite with Ruby using the virtual file system API and storing a SQLite database inside a Ruby script.
    • Reflections on performance topics in Rails, his work on active record speedups, and discussions around queuing systems and the introduction of Active Job.
    • Describes the infamous Ruby YAML remote code execution vulnerability and how it was resolved with YAML.safe_load.
    • Shares inventive and playful projects such as embedding PHP within Rails (Fuby), using convolution in R for cat litterbox monitoring, and creating physical hardware like the analog terminal bell.
  • Learning and Creativity through Hobby Programming

    • Many projects (e.g., analog terminal bell, embedding PHP in Ruby) were driven by curiosity and the desire for fun rather than pure utility, emphasizing experimentation and personal growth.
    • Patterson encourages trick programming and obfuscated code as a way to stretch creativity and technical prowess, suggesting projects like running Ruby applications from a JPEG file or compiling Ruby to PostScript for printers.
  • Reflection on AI in Programming

    • While AI is helpful (for code discovery, explanations, boilerplate generation), its output is often mediocre and lacks creativity.
    • Patterson discusses the risk that over-reliance on AI could lead to stagnation in programming innovation, especially around advancements like convention over configuration.
    • Only humans can program for fun and drive future breakthroughs—it is the “hobbyists” who will continue to push boundaries.

Main Takeaways

  • The most impactful and memorable programming efforts are often motivated by fun and curiosity.
  • AI is a useful tool but cannot replicate the intrinsic motivation and creative spark that hobby programmers bring.
  • To ensure continued innovation, the programming community should prioritize experimentation, play, and learning for its own sake, beyond productivity or job requirements.
  • Patterson closes by urging the Rails and broader programming community to code for fun, as the future of the industry depends on creative, self-motivated practitioners.

Closing Keynote: Why is Aaron Patterson?
Aaron Patterson • Philadelphia, PA • Keynote

Date: July 10, 2025
Published: July 23, 2025
Announced: June 04, 2025

RailsConf 2025

00:00:19.520 pressure. Um before we before we start, can I get a photo with everybody? Is
00:00:24.800 that okay? Is that cool? I mean, this you know, I don't care if it's cool or not. This is the last rail.
00:00:30.480 We're taking a photo. I'm doing it. Okay, everybody wave your hands, please.
00:00:37.920 All right. Happy Friday. Happy Friday. Okay.
00:00:44.000 All right. Let's get started. No, it is. It's It's always Friday somewhere.
00:00:50.000 It's true. Everybody Everybody that works on date math knows this.
00:00:58.480 All right. Um, okay. Let's uh let's do this.
00:01:05.439 Thank you, Wayne. Uh, the screen is blank. It's supposed
00:01:11.680 to be blank. I did that on purpose. All right, great.
00:01:18.080 Well, not that blank. It's supposed to be more illuminated.
00:01:24.720 There we go. There we go. All right. Uh let's I guess let's get
00:01:32.079 started. Aie. Um
00:01:39.040 I lost rails. Your presentation is so much better than
00:01:44.960 mine. I can't like I can't even compete. the beginning the beginning of your talk my this is this is a liveaction shot of
00:01:52.159 the inside the inside of my brain was just like where is he going with this
00:01:59.040 I had no idea where he was going and I had to I had to put at least one one it's always sunny in Philadelphia joke
00:02:05.280 in here because we're I mean we're here uh but I really really enjoyed their their presentation when when AI said
00:02:12.720 that they had watched all of the Rails Conf keynotes I was like about to curl
00:02:18.800 up into a ball and dive embarrassment just like right there in the front stage. I was so scared. But then then
00:02:25.840 then they said that the keynotes of uh the keynotes of Rails comp are an elevated
00:02:33.519 moment and as soon as I heard that I knew ah they haven't watched my talks.
00:02:40.319 I like to keep the bar down here.
00:02:45.519 Uh so my my talk I I wanted to call I wanted to call this the hobbyist the
00:02:52.080 hobbyest programmer. Uh thank you all for coming to my TED talk. It's great to be here on the TED stage. Uh so I wanted
00:02:58.959 to call this I wanted to call this the hobbyist programmer but after this morning's keynote I had to change the title to why is Aaron Patterson?
00:03:07.680 And unfortunately after after like really thinking about this trying to get
00:03:13.040 the answer I really don't I don't know. I have no idea. All right. So anyway, happy Friday. It's
00:03:20.000 Friday. It's always Friday somewhere. Woo. Friday. Yes. Yes.
00:03:25.760 So this is this is the final excuse me the final keynote at the final Rails
00:03:31.920 comp where I get to say the final word. Indeed. It is it is the final keynote.
00:03:39.120 Uh uh my name is Aaron Patterson. I'm also
00:03:45.760 known online as Tinder Love, of course. Um my entire keynote has already been
00:03:51.040 predicted this morning. I work at a I work at a mom and pop startup company
00:03:59.280 called Shopify. You could say this is my active job. Yes. Yes.
00:04:05.120 Ah, come on. Uh, I'm going to talk about today. I'm going to talk about AI. Uh, I
00:04:12.080 will, but not right now. Before I do that, before I do that, I have an announcement to make to all of you. It's
00:04:17.280 very serious.
00:04:22.960 This is my last Rails. I I'm announcing that I'm stepping down.
00:04:31.040 I'm never going to speak at another Rails comp again. I know. I know. I'm
00:04:37.120 sad. I'm sad, too. But that's because this is the the last Rails comp. So, yes, I I will not be. But since this is
00:04:44.000 the rail last Rails comp, I figured, you know, I've decided that maybe it's time to burn all of my bridges because
00:04:52.960 what are they going to do? Not invite me back? Speaking of speaking of burning all my
00:05:08.320 I enjoy I really enjoyed the fireside chat, but honestly, it was it was very much very much like the So, David's
00:05:15.199 like, "We need to get everything local. We have to get run everything on our machines. We got we got to get it out of the cloud." And the only thing I could
00:05:33.199 Ah, cloud. All right. Um,
00:05:41.520 okay. This one's going to take a minute here.
00:05:55.840 Lit. Literally, this is going to take this is going to take this is going to take a full minute.
00:06:03.120 Yes. Yes. This will take a minute. I mean, so so I mean when I first started
00:06:08.479 doing keynotes at Railscom about 16 years ago, this only took like a second.
00:06:26.800 These days these builds are taking minutes. We can't we can't put up with this.
00:06:36.400 Oh, the the build is still going. Hold on. It's It's bouncing. It's bouncing very slightly. Okay, there we go. All
00:06:42.319 right. So this is anyway yes this is the last Rails conf I'm giving the last keynote and honestly this was just a
00:06:48.800 huge amount of pressure for me like coming up with a good talk felt like an extreme extreme amount of pressure but
00:06:56.000 um then I realized it doesn't matter how poorly I do because I'm not getting invited back and that actually made me
00:07:02.319 feel very very relieved but the issue was
00:07:09.120 I'm trying to make the most of my like subscription to a
00:07:16.479 B-roll website. Yes. All right. So, I felt I felt like I felt very
00:07:22.400 relieved, but then I thought, you know, what should like what should I talk about? Like I don't actually I don't actually know what I should be talking
00:07:27.840 about at this at this uh presentation. I really really need to make one. So, I decided to go ahead and look through
00:07:33.919 like look through what did I talk about previously and I've kept all the slides that I've done at my like I've I've
00:07:40.560 given over the years. I have all of them. So I thought I'd take a look look back and see what I've done and try and get inspiration from those and then see
00:07:47.199 like you know did I like in 15 years of talks did I say something embarrassing
00:07:52.240 and unfortunately the answer is yes absolutely I mean it's been 16 years I've I've done a lot of embarrassing
00:07:59.039 stuff on the uh Rails comp stage unfortunately my first keynote at Rails
00:08:04.240 comp was in in 2010 and I like I looked at these folders and I'm like200 what is
00:08:09.599 that that's like you know two years ago Right. No, no, that is that is 16 years ago. I
00:08:16.639 feel I feel old. As soon as I realized that, I immediately turned into dust and I don't know how I'm actually standing
00:08:22.240 here on stage in front of you. So, I've had 16 years of keynotes, which is
00:08:29.039 16 years of wasting wasting your time. Aie, they they gave the best of Rails
00:08:35.120 comp. Now, I want to close you out here with the worst of Rails. Huh?
00:08:43.039 Or what I like to call tender love, the worster parts. And the funny thing is, the funny thing is all of the worst
00:08:49.200 presentations, they're mine. I did them. So, that's what we're going to talk about today. We're going to talk about
00:08:54.800 my terrible presentations. I want to go through my favorite bad parts. I want to
00:09:00.320 look for stuff in common. And then we're going to wrap that up at the end of the at the end of the talk with something that I want like I hope you can take
00:09:05.839 home today. So my very first Rails comp was in 2010. Uh Chad Fowler invited me.
00:09:11.920 This is him inviting me to the conference.
00:09:17.360 So I I'm going to try and tell you stories about these like maybe a little bit of behind the scenes of these um
00:09:23.600 presentations. So hopefully you get an idea of like what happened to me and my story. So he asked me, "Aaron, I need
00:09:30.800 you to send me a head shot." So I do that and I send him this photo
00:09:36.720 and he responds to me and I like I dug up the emails for this. Like this is a quote. Um, nice mullet. Is that really
00:09:43.760 you? I also I also looked up how you like how
00:09:49.680 you site emails so that it's that's correct there at the bottom
00:09:55.200 that so I which I responded to him. Yes. Yes. Yes. Yes. So he responds to me and
00:10:01.920 unfortunately he's I know he had to leave the conference early. He was here. He had to leave the conference early. Um
00:10:07.680 but he he replied to me and he said, "You know that means I'm going to require you to have that mullet at Rails
00:10:14.320 comp." And the thing is like he never specified
00:10:19.760 what year.
00:10:27.279 So, yes, I grew this mullet specifically for the final Rails comp.
00:10:36.800 Ah, yes. Thank you.
00:10:45.120 I can't wait to cut this thing off. Okay. All right. So I I also spoke about uh SQLite SQLite Ruby and how Ruby uses
00:10:53.279 uh like I I spoke in depth at Railscon my very first very first keynote uh how to use SQLite with inmemory databases.
00:11:00.240 We took a look at the SQLite virtual file system and I talked about using the virtual file system API and this is this
00:11:07.200 is the virtual file system API. I'm I'm also lazy. I I literally took the slides from that time put them on here. So if
00:11:13.839 they're if they're bad like I'm clearly way better at Keynote now. Well,
00:11:19.279 way might be an exaggeration. I am I have improved somewhat. Um, so this is
00:11:24.399 the API for the virtual file system. Uh, SQLite's virtual file system. What's cool about this is you can give SQLite a
00:11:30.800 bunch of callbacks and say like, hey, I need you to call these things anytime you're doing some some operate or
00:11:36.240 anytime SQLite is doing some operation. And I hooked that in. So it would call back out to Ruby and you could implement
00:11:43.440 a VFS module and do anything that you want to. So, for example, you could write a class like this. Um, and anytime
00:11:51.680 SQLite wanted to open a like open a file, it would call back out into Ruby and you could do anything you wanted to at that time. And then like return an
00:11:58.640 object and the the object has had to have read and write methods and you can do whatever you wanted to. So, like of
00:12:03.680 course, you know, every time you open a SQLite database, you got to make your web requests and then and actually this
00:12:10.320 is of course this is ahead of my time because that's basically like microservices like really genius. We got
00:12:15.680 our database going across there. So, uh, what I wanted to use it for though was,
00:12:21.760 uh, does everybody know about end and data? Like, okay. So, for those of you
00:12:28.240 that don't know, if you just write a Ruby script, you can put this special thing at the bottom called under under end under under. And anything below that
00:12:35.600 thing, anything below that line is put into a file descriptor called data. And
00:12:40.880 you can read that. So, here's here's an example. like we can um everything below that under under end is available in a
00:12:47.839 file that's called data and we can actually seek to that and we can even write to that. So we can write write to
00:12:53.519 that thing. So we can write to ourselves. So if we run this script what'll happen is we'll start appending
00:13:00.480 lol to the bottom of the script every time every time we run it. So if we run it it'll print out the thing and you can
00:13:05.839 see that we keep appending appending stuff to the bottom of the script. So uh if we cat the script you'll see that
00:13:11.920 it's it's just like this. We can see that it's appended to myself or it's appended to itself. So uh what I wanted
00:13:17.680 to do is store a SQLite database inside
00:13:23.360 the Ruby script right so you could use it truly. I made a I even made a little
00:13:28.399 demo here like this is this is a thing like this is a recording from back in the day like two what is it 16y old
00:13:34.399 recording. So here's a thing. It's got an under end uses SQLite. We run it and
00:13:40.160 then if we like it stores some stuff in the database and then gets some stuff from the database and then if you go to
00:13:47.360 the very bottom you'll see that the SQLite database is there. So this is the demo. This is the demo that I showed in 2010. So you know why like why did I do
00:13:56.959 this? Why did I do this? Why is Aaron Patterson?
00:14:03.199 I have two answers for you. The first one is I don't know. I just did. And uh
00:14:09.920 I think the real answer was that that it was fun. Like I had a good time doing it. I just wanted to like I wanted to
00:14:15.440 see what was up with this. Like what if I did this? And then then I started thinking, you know what? If what if what
00:14:21.680 if your database was in your app at at the fireside chat, David was talking about having your app plus two or three
00:14:27.920 files for the database. That's not big brain thinking. We want to have everything inside of one file. We're
00:14:33.760 going to upload the one file to our FTP server and then if we have any problems in our database, we're just going to get
00:14:39.680 SSH in vi edit the binary data. Done.
00:14:47.360 Actually, something I really wanted to do I really wanted to do, but I haven't like unfortunately the VFS file system
00:14:53.199 isn't the way to do it. never completed this project is like what if what if
00:14:58.480 SQLite stored tables in tables like like
00:15:04.000 in like in HTML tables.
00:15:09.199 Yeah. Like this is the dream right here. This is the dream. This is what we want.
00:15:19.519 All right. Love it. 2011, uh, Michael Feathers was speaking
00:15:25.440 that year. I'm a huge fan of Michael Feathers. Uh, he wrote he wrote a book called Working Effectively with Legacy
00:15:31.839 Code. And this is probably like the this book changed my life. It is if you
00:15:36.880 haven't read this book, go buy it. It is timeless. Amazing book. Uh, love him. Huge fan. Um,
00:15:45.519 at this at this conference, I talked about um performance a lot. At the time,
00:15:50.560 Rails was getting slower. I was talking about why that was. I was uh talking about what we could do about it. These
00:15:56.160 were these were profiles of of the thingy. And then also at that conference
00:16:01.759 um this is so painful. Also at that
00:16:07.600 conference uh yeah this so this happened. We I got everybody from the
00:16:14.880 Rails core team at the time and other people to get up on stage and dance to this meme this meme thing. And like I
00:16:23.519 also happened to join the Rails core team that year and I know they regretted it. Like I know for sure.
00:16:30.000 But I I like thank god this isn't on YouTube or somewhere for people to see for the rest of my life. As soon as
00:16:39.680 this morning's talk, I'm like, "No." Oh, god. No.
00:16:45.199 All right. So, it's not so much that I said something embarrassing as doing something embarrassing on stage. So,
00:16:52.000 2012. All right. 2012. Ah, 2012. I love 2012. 2012 was the year of the expense
00:16:57.920 reports. Uh, I worked for another mom and pop company at the time, AT&T, mom
00:17:04.000 and pop telek telekcom company. It was great. Really great. Um, and we had a
00:17:09.679 fun expense reporting system. I gave a presentation about the expense reports. So, of course, like today in 2025, we
00:17:16.799 need to have receipts usually. Um, and the way that we would submit receipts,
00:17:22.079 the only way I could submit receipts was via fax. Like I had to fax the receipts in. I worked remotely at the time. And
00:17:28.400 what was cool is they would go into Concur. We used Concur as our expense reporting system. And they would get
00:17:34.160 scanned into Concur. So I'd fax it in, they're automatically scanned in. I would look at it in the website, go,
00:17:40.160 "Yep, that's my expense." Boom. Done. And like I didn't own a fax machine. I I
00:17:46.000 still don't. I That is all that is a state of being. I do not own a fax machine.
00:17:52.400 And I'm like, "Okay, so how do I fax stuff? Like how do you do that if you don't own one? I don't want to go to like Kinko or whatever. So, I found a
00:17:59.360 thing online where it was like, okay, I could upload a PDF and it would fax it, but I had to pay a dollar or two every
00:18:05.200 time I did that. And I'm like, this feels wrong. I have to pay to like get get paid. That's that's very odd. So, I
00:18:12.880 emailed somebody at the uh in accounts receivable at work and I said, "Hey, you
00:18:19.600 know, I know we got to fax this stuff, but like I don't own a fax machine. is there like, you know, something I can
00:18:26.720 do? Is there a way I can upload a PDF because I know that you automatically scan it, so should have a PDF. And the
00:18:33.520 the person responded to me and was like, "Yeah, yeah, absolutely. Uh, just email this special email address at&t.com, put
00:18:40.880 your expense report number in the subject or whatever, attach PDF, and then like it'll it'll go into the
00:18:47.360 system." And I'm like, "Okay, great." So, I tried it out. But I submitted I
00:18:52.559 submitted a receipt and sent I sent the email and then like I don't know a few seconds later I get a response that's
00:18:59.280 like you know two pages sent and I'm like
00:19:06.880 no no no.
00:19:13.679 I couldn't believe it. So what was happening was what was happening was I would send a PDF. I'd make a PDF. I'd
00:19:19.919 send it via email. The email would go to a fax. The fax literally the fax would
00:19:26.080 send it like we'd send it into a system. It would get converted back into a PDF and then go into Concur. And this blew
00:19:33.360 my mind. It blew my mind. But if you think about it from like a software engineering perspective, it's all just
00:19:39.360 interfaces, man. It doesn't matter. Like we don't care what's inside the box. That's the point
00:19:45.760 of encapsulation. You're not supposed to know how it works. But this I couldn't believe this. Uh then
00:19:53.919 uh another fun thing is that I learned I couldn't submit expenses on weekends. Um
00:20:05.360 and I'm pretty sure it's because they just had a fax machine like in a building and then when everybody went
00:20:10.559 home on the weekend or in the evening they would shut off the power and you just couldn't do it on the weekend. The other funny thing, the other funny thing
00:20:16.480 I loved is that when I got the email responses that were like, "Hey, two pages sent or whatever." Uh, they also
00:20:22.960 had the like this footer, like the footer.
00:20:29.520 Incredible. Just incredible. Love it. This is the Rube Goldberg expense reporting system. So, I also talked
00:20:35.120 about response times and not blocking responses. I gave an example of sending emails. Uh I asked the question like why
00:20:42.240 if we have like an email library in Rails like why do we have action mailer
00:20:47.919 and not a queuing system like why do we not have a queuing system it's so odd that we would send mail from the middle
00:20:53.600 of a request and then of course uh rails 42 came out with active job I can't say that I wrote active job but I can say
00:21:07.360 2013 uh I announced my New consulting company adequate industries we do
00:21:13.360 everything adequately this is what we do including SEO optimization I talked
00:21:18.640 about our SEO offerings uh SEO stands for search engine optimization optimizations
00:21:24.960 uh I gave the history of the first search engine this is a picture of it was actually steam powered it came it
00:21:30.880 was the first the first search engine was actually invented in Holland and it was brought to the new world by Leaf
00:21:36.960 Ericson you may know Leaf Ericson who later went on to invent the cell phones.
00:21:42.320 Incredible. Just incredible history to all of this. So amazing. This year, this
00:21:48.720 year was also really really terrible because it was the year of the Rails remote code execution vulnerability.
00:21:54.880 This sucked. This was bad news. Um, this year really, really sucked for me. What
00:22:00.320 happened was at the time you could there was an issue where if you had a YAML file you could submit a specially
00:22:06.240 crafted YAML file to a Rails application and it would end up executing arbitrary code that was embedded in the YAML
00:22:12.559 document. So an attacker could upload code and execute anything that they wanted to like whatever they wanted to.
00:22:19.360 So uh guess who wrote the YAML parser everybody was using and guess who was
00:22:24.640 also on the Rails corner team at the time. Oh, whoops. Wow. Let's do that
00:22:29.840 build. Yeah. Nice. I told you these builds take forever. Anyway, this guy
00:22:34.960 right there. Yeah. So, yeah.
00:22:42.400 Yes. Sorry. Let me do let me do this build one more time.
00:22:49.919 This guy. All right. So, let's talk about some root YAML parser internals real quick. So uh when when the YAML
00:22:56.960 parser runs this this code is not 100% real like it's real code but it's like not exactly what happens when you load a
00:23:04.000 YAML document uh psych the YAML parser is actually written in Ruby and all it really does is it says like oh okay I'm
00:23:10.400 parsing a hash so I'm going to create a new hash and then I'm literally going to call the you know hash setter like you
00:23:17.440 would imagine like how you would write stuff to a hash uh just a normal Ruby call. Uh but there's another feature of
00:23:24.960 the YAML parser that is you can specify the class of the thing that you want to instantiate and we have to support
00:23:31.679 things like subclasses of hashes. So you could subclass a hash serialize that to YAML and you need to be able to load
00:23:37.840 that YAML again. So here's like here's an example. Let's say we have a class called helpers. If we specify that we
00:23:44.880 have a hash and that hash is a uh class an instance of helpers then what the
00:23:51.360 YAML parser will do is it will create a new it'll allocate a new helpers object and it'll call that setter on the on the
00:23:58.000 object itself. So that's how the that's how the YAML parser works. Now what happened was inside of Rails this is and
00:24:06.320 this these are new slides you can tell because they look good. Uh what happened inside of Rails is that we had this
00:24:12.320 method right here that would just eval crap
00:24:18.320 like whatever was in the value of the hash. Like whatever you passed in as the value, it would just turn around and
00:24:24.240 like eval whatever that thing was. So the exploit for this was like, "Oh, okay. Well, I'm just going to send you a
00:24:30.559 YAML file that has this helpers class in it that has a value that's like some
00:24:36.480 Ruby code like this." So that was that was the exploit. And the upshot from all
00:24:42.400 of this is like ple please don't use y
00:24:47.600 actually no it's it's fine it's actually fine to use y go ahead and use yaml it's fine it's fine I said no don't use it
00:24:53.279 but it's fine later I later we had a like after we fixed that vulnerability uh I I have to admit it really really
00:25:00.000 sucked at the time because like people couldn't people didn't understand the
00:25:05.120 nuance of this bug. It wasn't that there was a problem with YAML necessarily. It's that Rails had some really like
00:25:12.320 frankly dumb code in there. Like why are you evaling this stuff? So it's those
00:25:17.360 two things working together. What we did what we ended up doing though is we introduced a method called safe load to
00:25:22.400 YAML. So if you call YAML.safe load when you pull in the YAML it doesn't allow you to do those types of things. And
00:25:28.080 then later on in a major version a major version release of YAML and I'm 100%
00:25:34.000 sure there are people in the audience here today that have been bitten by this uh we changed the default uh load to be
00:25:41.919 safe load. So if you call load by default it is safe.
00:25:46.960 Uh so I'm I'm sorry if you run into that problem but this is why. Uh so 2013 kind
00:25:52.720 of stuck for me. 2014 Chicago. Oh my gosh, we got to get through a lot of years. Um, I talked about active record.
00:26:00.080 I talked about performance. I talked about adequate record. I introduced a product. It was a new product called adequate record. And this was a bunch of
00:26:07.360 performance patches that I'd made on top of active record. And they were really really great. I offered them for a very
00:26:12.880 low low price. Nobody took me up on that so I just merged it. Um,
00:26:20.080 like we don't care. We don't need our Rails apps faster. So the these patches made active record
00:26:26.159 three times faster for some APIs. Uh but they sped up a bunch of different stuff. And I have so I have a video here of me
00:26:32.480 merging merging this. So I'm going to do I'm going to do this. I merged the patches live on stage. I'm not very good
00:26:38.640 at typing. Sorry. Okay.
00:26:45.440 Okay. Uh okay. This will work. This will work.
00:26:50.559 Okay. So, we're g pulling now. It's downloading from the internet. The internet might be a little bit slow. Uh
00:26:58.720 hopefully it'll work. Please work.
00:27:08.159 Maybe we won't be able to do this live. Oh. Oh. Okay. Okay. I think it's there.
00:27:24.559 How do you merge? I don't know what I I don't know what I'm doing here. I mean, don't you think that git has really
00:27:30.799 good? So, okay. So, so clearly I had pre-recorded this. I
00:27:37.520 even like I added the network delays of course like this is all this was all all planned out. Um and I I played the
00:27:45.279 recording like I played the recording on stage. I did the whole like I did the whole bit. I had actually merged the stuff in like I don't know a day or two
00:27:52.000 a day or two prior and then someone at the conference came up to me and they were like wow it was really cool that
00:27:57.200 you merged that live on stage and I thought it was like obvious that
00:28:02.640 it was pre-recorded. They they they also asked like how did you like I saw you merge it on stage.
00:28:08.799 How how is it that it got committed two days earlier? I'm like I don't know.
00:28:15.200 Uh that was fun. uh 2015 Rails comp was in Atlanta. I really enjoyed that year. Kent Beck Kent Beck was there. He is the
00:28:22.080 creator of extreme programming or XP for for short. So what I did for this presentation was I hid my computer on
00:28:29.679 stage. So it looked like I was using a PC. You couldn't tell. You couldn't tell
00:28:34.720 I was using a Mac. And I opened the talk like this. This one has audio to AV
00:28:40.240 people.
00:28:51.520 So well I I crafted all of this. This is handcrafted.
00:28:58.399 Same. See we go straight into it. So this this was how I opened it. I opened
00:29:03.600 like this. I just was very serious on stage. Continu continued on. My slides looked like this. I mostly talked about
00:29:09.520 mostly talked about performance. used comic sands with a blue gradient to make it seem authentic. Um, and then later uh
00:29:18.320 I my machine crashed and I had to like I had to reboot like
00:29:25.440 reboot my computer in the middle in the middle of the um presentation. And I have a recommendation for any of you
00:29:31.360 that want to pull this trick on stage. Uh talk to the AV folks in advance. like
00:29:39.760 that's that's my pro tip to you. Um,
00:29:46.720 so I I also had I had two cats, Gorbachoff, Puffpuff Thunderhorse, this is one of them. This is him. Uh, and
00:29:53.039 then CEK airport, Facebook, YouTube, Instagram, Snapchat. That is her. We called her Choo Choo for short. Uh, at
00:29:58.799 Railscom, Railscom 2015, I started handing out stickers of them to folks in the audience. And it was because like I
00:30:04.880 had learned that I learned that people some people were uh afraid to talk to me like they were intimidated to by me and
00:30:12.640 they didn't know how they didn't know how to say hi. And I felt kind of bad like I felt bad about that because I
00:30:18.880 like talking to people and I want people to feel comfortable uh coming to say hi. So I was like you know what I'll do I'll
00:30:25.200 make stickers of my cats. I'll pass out stickers of the cat. I'll say hey I got stickers. So then if you want to come
00:30:30.399 say hi, you can just ask for a sticker and then like if you didn't know what to say, there's at least that like thing we
00:30:36.880 could do thing we could do uh together. Um unfortunately uh both of my cats have
00:30:42.960 passed away. Uh so I didn't bring any stickers because I wasn't sure if it would be like weird to
00:30:50.240 pass out stickers to my cats. So I didn't bring any but I am still friendly. So please like
00:30:58.399 please come say hello to me. Uh Rails comp 2016 was in Kansas City. This is about performance. Uh I also
00:31:04.320 demonstrated PHP templates embedded in your Rails application. This is incredible. This is one of my favorite talks. So uh let me show you. I'm going
00:31:10.960 to give you a demo here. This is PHP info. So we have in a we have a PHP file
00:31:16.799 that is inside of our Rails application. Let's take a look at that. And it says PHP info there. And if you go ahead and
00:31:22.320 you load that, we're going to boot up Rails right here. It's pointing at my special thing. And then we load it. And
00:31:28.640 then you'll see, hey, we're on Rails. And if you go to the URL users, uh, you can see PHP PHP info.
00:31:37.919 Uh, I also demonstrated reading instance variables. So I want to show that off. In this example, we're changing the PHP
00:31:44.080 template to access an instance instance variable called at hello world. Uh, then
00:31:49.760 we define the instance variable in Ruby. So this is a PHP side. We're reading an IV called Hello World. Over in our
00:31:56.559 controller, we define hello world and I added the time to it so you know that I'm not lying to you. This is real. Um,
00:32:05.039 there is no like no magic here. I mean, there is magic, but so yeah, it prints out prints out the
00:32:11.519 the stuff. So, we're able to define an IV in Ruby and access that access that from PHP. Uh, I also demonstrated
00:32:19.519 iterating over active record objects. So here we could load the users like all the users in our controller and then
00:32:26.559 down in our PHP uh PHP view we could go ahead and
00:32:31.760 iterate over the users and then print out like print out a list of users all in PHP.
00:32:38.000 Okay, go. Good job Aaron. Yes. Okay. Yeah, there's our LIIS uls. I think people got it.
00:32:46.159 All right, go load it. Come on past Aaron. Oh, right, right, right. Yes, there's
00:32:53.039 nobody in the database, of course. So, we got to go create our new user and create the user. Hello. And then we'll
00:33:00.080 go back to our PHP page. Oh, we're going to make a few of them. Good job, me. There we go. Now, our PHP view is
00:33:06.640 working. So, we're printing out printing out that stuff. So, that is what I demoed at this presentation. I think
00:33:13.120 that's it. Yeah, that's it. Okay. Oh, no, I added more. Oh, right. Because I'm bad at HTML, right? Yeah. Yeah. Yeah.
00:33:20.799 Okay. Forgot about that. Right. You can edit it and then it'll update. Like, of course, it updates like anything else,
00:33:27.039 you know, you can do it. Yeah. There you go. Live reloading. So, that was that was it. Do do I not get an applause for
00:33:33.440 this? It's insane. Like,
00:33:38.960 so if you're not like catching what's going on in these sli in these videos, which I can I can understand. I embedded
00:33:45.360 a PHP runtime inside of Ruby. So I took PHP, I embedded it inside of Ruby, and I
00:33:50.960 was able to get them to communicate with each other. So you could define a Ruby object in like a Ruby object, and you
00:33:56.640 could pass that Ruby object into your PHP runtime, access stuff on the Ruby object, and it would work in both
00:34:02.240 directions. So you could define a PHP object, pass that back into Ruby, access stuff, access stuff on the PHP object.
00:34:09.040 Uh, of course, I called the project Fuby. Um, like you can go access it there. I
00:34:16.320 haven't updated it in a while. Uh but yeah, it worked at the time. Uh and then
00:34:21.919 since this was Pooy or had to be had to be Pub Fub on fails,
00:34:29.760 I think a very like a very inspirational project for the year 2025 might actually
00:34:34.879 be like Laravel on Fubon fails. Like maybe somebody want to try that. I think
00:34:41.200 it'll be fun. So these were like some of my highest effort slides ever. Like those three slides took a long time
00:34:51.440 to make like in development time. I had to like I had to learn how PHP worked
00:34:56.960 like how to embed PHP. I had to juggle two different garbage collectors. Like
00:35:02.079 it was it was wild. It was a very difficult project. And you're probably asking me like why why would you write this? What good does it do for you? Same
00:35:10.240 answer. No idea. I don't know. It was fun. I had a good time. Like I had a
00:35:15.599 good time doing it. I learned a ton of stuff about the this different language and how to embed things in Ruby. I had a
00:35:21.280 great time. Uh Rails Comp 2017 2017 Phoenix again. I
00:35:26.320 talked about performance because I always do that apparently. Um
00:35:33.119 in 2017 I talked about code smells. Um and I had I had this data that I had
00:35:40.079 acquired. This was my data. It was ju it's bad data. It's crap data.
00:35:45.440 Just crap data. And I was analyzing this that this was the entire the entire presentation was analyzing this. I
00:35:50.640 talked about digital signal processing uh including how you do digital signal processing. Convolution. Convolution is
00:35:57.920 basically just taking two digital signals combining them together so you get a third signal and you can analyze
00:36:03.359 that signal. So we have we have these two signals and we'll we'll combine them and then see what we get. And like this
00:36:09.920 is actually how radars work. It's very very interesting and it's actually not that hard. Uh this is the formal def
00:36:16.320 definition of convolution. It's really like it looks complicated. It's really really not. It's just like you can
00:36:22.240 imagine two arrays. Well, three arrays total. We have an array X and an array H. X and H are input signals and then Y
00:36:29.920 is our output signal. And all we're doing is we're just iterating through those arrays and then like combining
00:36:35.200 them to get a third array out. And this is what the convolution code looks like in Ruby. I wrote it out wrote it out in
00:36:40.720 Ruby. I mean, you know, you don't need to understand it. We're last day of the last Rails comp. We don't need to think
00:36:46.880 about code too much. So, I wrote it out in Ruby. It was very fun. But I wanted to graph it. I thought it'd be very cool
00:36:53.280 to graph it. And when I want to graph things, I want to seem smart. So, of course, I use R. Um,
00:37:00.400 but the annoying thing is that R uses one-based indexes. And I had written all of my code in Ruby, which uses zerobased
00:37:06.720 indexes. And this like R is a great programming language but it is
00:37:12.160 inscrutable. Here is an example. This is R code. So I've created here a an array
00:37:17.920 called foo and it has the values 1 2 3 in it. And you can do array subscript
00:37:23.280 zero. So you can you can access that and all that does is it returns to you the type of the values inside the array.
00:37:30.800 Right? So you can see here when I access food zero, it return returns numeric. And like
00:37:37.599 I don't know why they do this. This drives me bonkers. But you can see here if you access numeric and you just do
00:37:43.920 plus one, like that works. There's no exception. It just returns numeric zero.
00:37:49.280 So if you don't know that R is a one-based like system, you can write all of your code and it just like doesn't do
00:37:55.599 the right thing and there's no exception, you're like what is what the heck is going on here? So once I once I
00:38:01.440 figured this out, like I tried porting all my Ruby into R. It didn't work. And I am not smart. I couldn't figure out
00:38:08.800 I'm like I don't want to figure out how to port my code to use onebased indices.
00:38:14.800 Like this is too hard for my brain. So what I decided to do was uh implement
00:38:20.160 consc using lambdas. And if you implement
00:38:25.599 those, so if you implement those, you can implement cells. And if you implement cells, you can implement
00:38:31.280 arrays. If you implement arrays, you can do any index base that you want to. So that is what I did. I just implemented a
00:38:37.599 lisp in R and ported all of my code to that. So this is what it looked like. Uh, and
00:38:46.000 this is this is the output. I was very very proud of myself. I had done this. And then at the end of the presentation,
00:38:51.599 at the end of the presentation, I revealed what all of this data was. And what it was is something I had built.
00:38:56.800 It's this this scale here. It's a bathroom scale where I'd put like a I'd put an MSP 430. It's just a
00:39:03.200 microcontroller on the bathroom scale. I used a Raspberry Pi motion sensor. And I mounted the Raspberry Pi motion sensor
00:39:10.640 above the bathroom scale kind of like this. So it was like that. And then on top of like Yeah. Okay. There we go.
00:39:16.320 Great job, Aron. Yeah. on top of the bathroom scale, I placed uh my cat's litter box and then
00:39:24.320 as the cat would get like the cat would go into the litter box and then the cat would come back out of the litter box
00:39:31.520 and then you would end up with graphs like this. So this was so you can see here like you can see
00:39:37.920 here cat enters cat leaves we got a delta there at the bottom so you know
00:39:44.000 like how much was left
00:39:52.079 there those difference. So, I revealed this like I revealed this
00:39:57.200 at the end of the talk and like of course it got a lot of laughs but there were some people who were super pissed.
00:40:04.400 They're like I listened to 40 minutes 45
00:40:09.440 minutes of this and then it's just about cat poop and I'm like no come on.
00:40:16.560 We did digital signal processing. What are you talking about?
00:40:23.359 I don't know. Maybe these were the highest effort slides. I'm not sure. I mean, I had to do a lot of stuff for this. Like I mean, I had to learn about
00:40:29.599 I had to learn about microcontrollers. I had to learn like I had to learn R. I had to implement implement the whole
00:40:35.200 like whole lisp system inside of R. Had to
00:40:41.839 of course why I don't know why why would I do this? I don't again I don't know. I don't know. I don't know. But it was fun. And I had a good time and I learned
00:40:47.280 like I learned a whole bunch of stuff while I was while I was doing this. It was a really good time. I enjoyed it. Uh Rails Comp 2018 Pittsburgh again
00:40:54.720 performance. Yes. Uh I 2018 was the year I became like very famous in Japan for
00:41:00.640 like a day. It I I went viral in Japan like and on on Twitter and Twitter is a
00:41:06.000 much bigger deal in Japan than it is here in the United States. Uh even in in 2018 when it wasn't so awful. Um this
00:41:14.079 was my this was my tweet. It was a one character. One single character uh was
00:41:20.240 like one character 80 80 some thousand likes on a single character. So like if
00:41:25.359 you think about this in terms of character per like it's like really worth the investment. Like I
00:41:32.319 recommend this one to you know post this one and get a lot of likes. Um,
00:41:38.319 I'm not going to go into the whole backstory on why this like why this went viral, but it was very funny because I went to a like I went to a very tiny
00:41:46.000 bar. I happened to be in Tokyo at the time. I went to a very tiny bar and the people there like recognized me. They're
00:41:52.880 like, "You you're the the way that you read this is Kusa." They're like, "You're the Kusa guy." I'm like, "I am.
00:41:59.440 That is me." Yes. So, I got recognized by like normal people, which was weird.
00:42:05.599 I gave a demonstration of this like Ruby code that looks like this. You can define like you can define methods with
00:42:11.599 UTF8 like you can do that. That's legit. Totally real. You can even do like keyword arguments like that too. So this
00:42:17.440 is like the thing you can do. Uh even more fun like really really more fun is that you
00:42:24.000 can do like non-breing spaces too. So this is
00:42:29.040 it's a runnable Ruby program. Yeah. can run it. And then on the on the right
00:42:35.520 is Vim and on the left is the program catted and then runs. So you can see that it actually you can see that it
00:42:40.800 actually does stuff. Again, why why would I do this? I don't know. I really like I don't know. I I had a good time.
00:42:47.040 It was really fun at the time. I think the reason I did this like I learned a lot about Ruby's parser. I learned about
00:42:53.920 a whole bunch of different stuff while I was doing this. I had a fun time doing it. Um Rails Comp 2019 Minneapolis. This
00:43:01.200 is where I said but at what cost a lot and then people like said that to me all the time.
00:43:08.079 Any anytime I said something they would say yes. Yes. Because and I think it's
00:43:13.920 because like I kept talking about performance again. Of course I do that. Yes. Uh and then again this is the this
00:43:21.119 is I talked about eliminating parenthesis and how that was faster. So like this is the code the code on the
00:43:27.280 right is faster than the code on the left.
00:43:33.280 Oh, thank you. Yes. Um, and you might like ask me why that is. And the reason
00:43:40.720 is that no code is faster than no code. Ah, no parenthesis.
00:43:55.920 Of course, I I also did the single quotes joke. That one single quotes for 2x faster. You all know why, right?
00:44:03.599 You should have been paying attention at the opening keynote. Shift key. No shift key. Yeah, thank you. I talked about
00:44:09.760 allocation profiling and ERB, how template compilation works, including locals, how they're compiled, and how we
00:44:15.760 might pre-ompile ERB templates. It was that was fun. Um, 2020 was an unfortunate year. Anybody
00:44:23.359 remember that year? No. Me neither. Me neither. Um, again I talk about
00:44:31.599 performance. Why do I do this? Why is Aaron?
00:44:38.000 Uh, so this time was an active record benchmark comparing using a normal wear call to using a man using a sanitized
00:44:44.800 SQL call. And surprisingly it turned out that the bottom one here like using this
00:44:50.480 sanitized SQL that was faster than the top one. Like that's faster. And like
00:44:58.480 the I don't think I talked about this I don't think I said this in the presentation but the um source of this
00:45:06.319 or the reason I was doing this is that somebody had like figured this out like somebody had figured this out that oh if
00:45:13.520 I use sanitized SQL it's faster than using where so they're like okay we got to rewrite all of our code to use
00:45:19.280 sanitized SQL instead of using sanitized where so they're doing that instead of telling us like Hey, this is slower. You
00:45:28.160 need to fix this. So, um, this whole story was about like, hey,
00:45:34.079 okay, we need to make wear faster. We need to make those speeds match so that folks aren't writing sanitized SQL
00:45:40.000 because we don't we really don't want people doing I mean, you can not going to stop you like this is, you know,
00:45:45.760 you're not going to go to code jail or whatever, but like please don't. We'd prefer you to use the wear thing. So, so
00:45:52.400 the entire presentation was about fixing this. Uh, for the fun, like the mullet,
00:45:58.160 this must have been a mullet talk, not a reverse mullet talk because the fun part was later. For the fun part, uh, we
00:46:04.560 talked about my new Olympus camera, which I decided to hack because um, we were doing everything online. It was fun. I created a proxy server because
00:46:11.760 some for some reason this thing like you control it via Wi-Fi and I wanted to know how to control it. So, I set up a
00:46:17.680 proxy server. uh described all that how I set up an SSH tunnel to intercept all of the like intercept all the traffic
00:46:24.880 then I could replay all the traffic to figure out what it was. Yes, great job. Beautiful presentation, Aaron. Yes. So
00:46:32.160 that we all know how a request and response works. Yes. So I made a little I made a little replay thing with web so
00:46:38.560 that we could get and like get those requests and responses and replay them and log them so that I knew how to hack
00:46:44.560 this camera. That was a fun time. Uh, I also made a sign that every time like
00:46:54.160 every I called it I call Okay, the sign is the aon sign. Uh,
00:47:01.119 and it any time I would mess up a mess up something in my terminal, it would
00:47:06.640 flash a aon at me. So here, let me I I made a little demo here. So this is a sign. This is hanging behind my desk.
00:47:13.040 And every time every time a command returned like an error code or whatever
00:47:18.480 it would flash aa run at me. And that was like that was my project and my presentation for that for Rails comp
00:47:24.880 2020. Why did I do this? I again I don't know but it was fun and I learned about microcontrollers
00:47:31.760 uh many different things. I really had a good time doing that project. Uh 2021 held online again again. Guess what?
00:47:39.520 Performance. Why? instance variables, class variables, parallelism. I also had
00:47:45.119 a product announcement this year. This is my favorite product. It is the analog terminal bell.
00:47:51.599 Uh, and I made the So, hopefully some of you haven't seen this. I I brought the ad. So, here's my my Has this ever
00:47:59.119 happened to you? cd space gi tab.
00:48:05.599 This must be the right directory.
00:48:10.640 If only I'd heard the terminal bell. With the analog terminal bell, you'll never miss a terminal bell notification
00:48:16.560 again. The analog terminal bell is a bell that rings anytime a bell character is
00:48:21.839 displayed on your terminal. Simply plug it into USB.
00:48:36.720 It works with your shell. It works with Vim.
00:48:45.280 It even works with Deview random.
00:48:53.280 Thanks to the analog terminal bell, I'll never miss a terminal bell notification again. Go online and get yours today. Go
00:49:00.079 to analog terminalbell.com today to get your very own analog terminal bell. Once again, that's analog terminalbell.com.
00:49:15.280 Okay, so the thank you.
00:49:23.040 I'm I am honestly not sure which one of these projects has been my highest like my highest effort my highest effort one,
00:49:30.319 but this one was particularly hard. Um, I had to learn. So, not only was I learning how to do microcontroller
00:49:36.400 stuff, I also had to learn how to do 3D printing for the case. Um, the check
00:49:41.599 like that tick mark that was in it term 2. Uh, I had to learn how to develop that. So, I had to learn how like how
00:49:47.760 the terminal works. I actually did modify it term 2 to like do that. Uh, so
00:49:52.800 this this entire project like I meant for this project to be reproducible by anybody. So, it's all real. Uh, I even
00:50:12.800 So, so you should look up the pull request. It's great. Uh,
00:50:20.480 they they closed it. Like they reject this didn't get merged. Uh but but but
00:50:26.800 like it was so fun in the comments. Everybody thought it was hilarious and they're like, "Okay, okay,
00:50:33.760 it can't be the analog terminal belt, but what if?"
00:50:40.000 And they came up with like a legit sounding way to integrate this type of
00:50:45.200 functionality in because what what you needed to do is you need to have a way for the terminal to intercept the bell thing. Like we need to get a call back.
00:50:51.920 Basically, we needed some way to get a call back anytime a bell was displayed in the terminal. And fortunately, the
00:50:57.760 upstream author was like, "Hell yeah, let's do this." So, so you don't need a custom a custom Iterm 2 anymore. It it
00:51:04.960 doesn't say analog terminal. It doesn't say terminal bell in the thing, but there is now a thing that you can do in iTerm 2. So, you don't need the custom
00:51:11.440 build anymore. Uh, so that was that was a ton of fun. Uh, why why did I develop this pro product? I don't know. Uh, I
00:51:19.680 mean it was like it was 2020 2021 so like I had more time on my hands. Uh,
00:51:25.599 but it was it was super fun. I had a great time. I learned about terminals like how terminals work. I learned about
00:51:31.200 uh lib USB. Uh, I learned about 3D printing. It was really so much fun.
00:51:36.960 Um, Railscom 2022 was in Portland. I stayed at the Dubletry
00:51:44.000 Dubletry Hotel. Very fancy. Uh, very fancy. very demure.
00:51:53.280 Um, this slide, oh my goodness, this slide, this slide,
00:51:59.520 this slide uh triggered my French co-workers because
00:52:08.559 this is pointing in the wrong direction. Um,
00:52:26.559 Uh, guess what I talked about at this conference? Ah, yes. Yes, of course I did. I also
00:52:32.720 talked about rack and H2. I talked about TenderJit. Uh this was a side project of mine just building a Ruby like I wanted
00:52:38.480 to build a JIT compiler in Ruby like in pure Ruby and I wanted to do that on the
00:52:43.520 side. So I was I wanted to learn about JIT compiler. So I started writing my own in pure Ruby. I had written a pure
00:52:49.119 Ruby x86 assembler and a pure pure Ruby ARM 64 assembler. And in this presentation I gave a trick like I
00:52:57.200 showed a trick that I really enjoyed. Um this is this is like my favorite part
00:53:03.520 my favorite slide of the presentation. It requires some context around it but basically what these bytes are like what
00:53:09.440 this is what these tables are is a table of bytes and these bytes represent machine code and this machine code can
00:53:16.160 run both on x86 and ARM 64. So it can run on both both architectures. U
00:53:24.160 machines like your processors all they do is they just interpret bytes. So what
00:53:29.520 I thought about was like could I craft a sequence of bytes that if I gave it to
00:53:35.760 uh an x86 processor it would return like the number zero or some value like zero
00:53:41.920 let's say and if I gave the same bytes to an ARM 64 machine it would return one
00:53:47.760 like could I could I put those bytes together and I was able to figure it out and this is it like these are the bytes
00:53:53.359 uh those ones that are in orange those are combined so the top section is x86
00:53:59.119 machine code. The bottom section is ARM 64 machine code. And if you smash the two together, uh where those two where
00:54:06.079 those two bytes meet, you can execute this code on either one of them. And what's what I really liked about this,
00:54:11.520 what I the reason I did this is that I wanted to detect what platform I was running on and I didn't want to write
00:54:17.440 any if statements because we all know that if statements mean complexity and
00:54:26.000 machine code that no there's no if statements there. So
00:54:31.040 air go easy simple code right. So why did I why did I write this one? I do
00:54:36.800 have a reason for that. I just told you. Um, but also it was fun. I had a really good time doing this. I learned about
00:54:41.839 different CPU architectures as well as how to make a JIT compiler. All the different machine instructions for uh
00:54:47.680 x8664 as well as ARM 64. Uh, Rails Comp 2023 Atlanta. Uh, this was where I
00:54:54.000 started my like I started promoting my uh YouTube uh live stream which I
00:55:00.000 haven't really done lately and I really apologize for that. I no I shouldn't apologize because I it's my time. Why do
00:55:06.079 I have to I don't owe you anything. But I do want to do like I do want to do
00:55:12.000 it more. Um and I'll tell you the reason I haven't the reason I haven't done it lately is it's really hard for me to
00:55:17.599 come up with like uh topics. So if you have seriously this is an open like an
00:55:23.280 open invitation. If you have ideas for topics like let me know. Please send me an email and I would do it. Um this
00:55:31.440 presentation guess what? Not about performance. What? Wild. Yeah,
00:55:37.200 I talked about language servers. So, LSPs, uh, we even developed a language server and I said in this talk, Rails
00:55:43.760 should include a language server by default. Uh, so that was my big brain idea for this presentation. Next year,
00:55:51.760 Railscom 2024 Detroit. Uh, unfortunately, this one performance again. Sorry. uh talked about widget
00:55:59.359 parallelism uh how instance variables work and object shapes how they're in a tree data
00:56:05.119 structure which I needed to I don't want to explain this to you right now I mean I could but like we only have five
00:56:10.400 minutes left so um I'm not going to though I could I was thinking one thing
00:56:15.839 I was thinking is like so you know we don't all want Rails comp
00:56:23.599 to end Right.
00:56:32.799 Could I could I do like a Cy Booker and like filibuster the
00:56:40.480 All right. So, okay. Yes. Continue. Continue. Uh, this brings us to 2025 where we are today. Now, I'm giving a
00:56:48.000 talk. I'm in the middle. I'm not in the middle of it. I'm near the end of it. There is no performance stuff in here.
00:56:53.760 No performance stuff in here at all. But I did talk a lot about performance for sure. So you could say that this is a
00:57:06.559 and I'm giving the closing keynote for it. And this talk like I did say at the beginning of this presentation, this talk is a lot of pressure for me because
00:57:12.960 I like this conference means a lot to me and I want to leave you all like leave
00:57:18.559 you all with something like I need I need to think of something that is important to me and that I want to leave
00:57:24.559 the audience with. Um so I like I am going to talk about AI.
00:57:30.720 Um I actually use AI pretty frequently in my day-to-day work. Um, for those of you who are my co-workers, it is
00:57:37.440 imperative that you know that I reflexively use AI.
00:57:42.640 Any, this is an absolutely an inside joke with my co-workers. If any of you see my co-workers who any of you that
00:57:48.559 don't work with me, if you see my co-workers, be sure to mention it to them for me. Like, I would really appreciate that. So,
00:57:55.920 um, yes, I use I I like to use AI and as a as a Vim user, um, I have Yes,
00:58:06.240 as as a Vim user, you can know that I have an aversion to trying new things,
00:58:20.079 pretty like pretty handy. I I like to use cloud code a lot. I mostly use it for code discovery. Uh so for example
00:58:27.119 like I can dive into C Ruby codebase and I can say I can ask it questions like
00:58:32.559 where is the register allocator for Zjget? Like I can ask it that and it'll point me it'll actually point me in the
00:58:37.599 right place. I find it really really helpful for that especially at a company like a mom and pop shop that has such a
00:58:43.040 large large code base. Very helpful something like that. Uh, also explanations like I can say, "Hey, can
00:58:49.200 you explain the union find algorithm to me?" And it'll explain those things to me. Uh, the other really good thing I
00:58:55.200 like using it for is starting things that I don't want to do. Um, an interesting thing about computers versus
00:59:01.440 humans is that computers don't drag their feet like I do. Uh, so I find it useful for getting started. Sometimes I
00:59:08.400 give it more complicated tasks like refactor these tests. Uh, and it's not
00:59:13.760 always good at those particular things. I have to give it like I have to be pretty specific otherwise it'll mess up.
00:59:19.680 I've tried some things like you know implement the set global instruction in zjit and
00:59:26.160 uh it kind of works but the main issue like the main issue that I've found with AI is that AI is very mid like when it
00:59:34.079 generates code or does refactoring it's like not always the best code like it's not that great. Um, I think like there's
00:59:43.280 a trick that I've heard where like let's say you're going out to eat with friends or something and nobody can decide on
00:59:50.079 where to go. Like no one can decide. If people are being indecisive, someone should just say McDonald's
00:59:56.480 because everybody has an opinion about McDonald's. And if somebody doesn't suggest something different, you're going to McDonald's.
01:00:04.240 AI is basically suggesting McDonald's for your code.
01:00:09.760 Now, there of course there's problems with this. We're talk about it a little bit, but the thing is like sometimes
01:00:14.960 sometimes McDonald's is good enough, right? Like given the choice, I'm not typically going to eat fast food. Like I
01:00:21.119 don't do that on a day-to-day basis. But if I'm at the airport, I got to make a connection. I need to eat. I'm very hungry. Like mid food will do the trick.
01:00:29.760 So, as an example, like I got a bunch of CSVs. I need to graph them real quick.
01:00:36.400 uh then and I'm going to throw the script away at the end of that. Asking AI to do that seems fine. Now, the thing
01:00:42.799 that worries me about this is that like if I if I think about this and take this
01:00:48.160 to an extreme, I I think to myself, well, if AI can do it, why should I hire a programmer to do it? And I feel this
01:00:55.119 is
01:01:01.440 love this toot. Um, if AI can do my job, why should I hire why should we hire somebody else? And I I like this this
01:01:07.839 worries me. I am a programmer. I like I like getting paid. Um, but on the flip
01:01:14.160 side of this is like how do I know that the AI output is correct or secure or efficient code? Uh, how do I hold AI
01:01:22.640 accountable for the code that it wrote? Like what do I do? Uh, what do we do if AI vibes out a mess and then we need
01:01:29.839 somebody to fix it? Somebody has to do this. While I was writing these slides, it was very funny like the the me and my
01:01:36.960 procrastination brain. I was like, "Oh, let's go read some news now instead of doing what I need to do." Uh, and I ran
01:01:43.359 across this article where this person is being paid to fix issues caused by AI. And I thought it was very funny. The
01:01:49.680 person is a copywriter getting hired because uh literally the AI slop generated was just too mid. So like her
01:01:58.000 the best part though for me the best part of this article was that like she
01:02:03.040 was getting paid. She's like I'm getting paid like this AI stuff is you know
01:02:08.240 whatever. So she's getting paid and I think that's good. Now all these problems I think are a way of applying
01:02:15.599 pressure to us humans to be better at our jobs than we are today. So, even
01:02:20.720 though it's pretty easy at this at this moment for us to like outpace an AI, uh I think that we're going to have to work
01:02:26.480 to stay ahead. And in my opinion, there's something that we as humans can do that can't be replicated by AI
01:02:33.520 engines, and that is creativity. I think that this is a very very important thing that we can do uh that AI can't. This is
01:02:41.760 a quote from the that BBC article that I just showed you. uh the AI copy she was
01:02:46.960 hired to fix was too bland and when it like it just seemed very basic. It wasn't interesting. Uh they wanted to
01:02:53.839 sell intrigue but instead it was very very vanilla and unfortunately like when it comes to code like we want bland code
01:03:03.760 unfortunately um but for us creativity comes when we have to solve larger problems or think
01:03:09.520 of solutions that have never been explored. So, I think that this type of creativity is a muscle that we need to
01:03:14.799 exercise and the more that we exercise it, the better we can get at being creative. Uh, another thing AI can't do
01:03:21.760 that we can do. Uh, AI can't program for fun. Like, it is a robot. It's not
01:03:27.920 having fun. Um, and despite all of the guys falling in love with their AI
01:03:33.039 girlfriends, and it's all guys doing this.
01:03:45.359 can't program for fun. And I think that we need to have more of this in our community. We need to have more just fun
01:03:52.000 programming. So, what I really want to end this presentation, I was about to
01:03:57.920 drop an F meth bomb there. I'm over time. Let's finish this up. All right. So, programming as a hobby. I want to
01:04:03.839 sell programming as a hobby. When I looked through all of my rail my previous Rails comp keynotes, I noticed
01:04:09.520 like a couple main thing themes. First off was performance. Unfortunately, yes, I talked about I talk about that a lot.
01:04:16.799 Um I think it's because like I whenever I whenever I give presentations I want
01:04:23.359 to do like I want to do two things. I want to give the audience two things. One I want to make people laugh or like
01:04:30.319 make sure everybody's having a good time. And the other thing is like I know that everybody here like paid to be here
01:04:37.039 and like I should provide some value and performance seems like a good like
01:04:42.799 everybody wants to make their app faster. So we talk about performance. Uh but I want to talk about programming for
01:04:49.599 fun. So the second favorite thing I saw in my talks was that or the second thing I noticed from my talks is that I like
01:04:56.400 the talks that I love to give are the ones where I had the most fun. Uh the ones that I think resonated the most
01:05:02.640 with the audience. They were most wellreceived. The ones that I just enjoyed doing. Uh those were the ones
01:05:08.319 where I just did stuff for the fun of it. Like I didn't really have a particular reason. I just wanted to do it. I thought it would be funny. let's
01:05:14.319 just do it and see if I can. So, doing these types of things, it gets for me,
01:05:19.920 it gets my creative juices flowing and it motivates me to try harder and be better, like do do harder things, get
01:05:26.720 better at my craft, uh, and improve myself. And I know that I like when I'm doing it just for fun, I'm intrinsically
01:05:33.119 motivated and I know that I can continue and improve. Now, AI can't do that, but we can and I
01:05:40.240 think that we should take advantage of it. uh not only will we improve ourselves but I think hobbyists will be
01:05:45.520 more and more the ones that are pushing programming forward in the future. Uh a while ago I tooted this blue sky I skied
01:05:52.960 this uh I asked on blue sky uh if LLM had been around in the early 2000s would
01:05:58.160 we still have advancements like convention over configuration and meta programming and I asked this question
01:06:03.440 because I think these types of advancements are specifically tailored for us as humans. So like I another
01:06:11.200 thing that worries me about this AI revolution is that like the point I was
01:06:17.359 making with this with this post was that let's say LLMs were invented back in the
01:06:23.119 2000s. Back in that time I was a programmer. Yes, I am old. I was doing a
01:06:28.160 lot of XML stuff. It sucked. Like I had to configure stuff in XML and it was not fun at all. And when Rails came around
01:06:35.520 and said, "Hey, we've got convention over configuration. You don't need to write any more XML files. Everything is just put in a particular place for you.
01:06:42.000 You don't have to think about this stuff anymore. For me, that was revolutionary. And I was like, I have to do this. This
01:06:47.200 like this is configuring these XML files is one of the worst things of my job.
01:06:53.359 But since AIs don't get tired like we do, they're not motivated to get rid of
01:06:58.799 that like garbage or that grunt work. Like they're happy to output XML files. And I'm worried that like if we lean on
01:07:05.839 these AI like AIs to do this stuff more and more, we're not going to get advancements like this.
01:07:11.920 So I think that in the future maybe maybe AI will like they're going to be spitting out XML or doing whatever, but
01:07:19.280 those types of advancements are going to have to come from hobbyists. They're going to have to come from people who actually care about the code that
01:07:25.760 they're writing. So, I want people to code just for the sake of doing it, just for having it,
01:07:33.039 like just doing it for fun. Uh, and I know like that might be hard for some
01:07:38.240 people like what would be fun and I want to talk about try and give you some ideas. So, um, if the if all of the
01:07:45.599 weird projects that I g that I talked about at the beginning of this presentation were not enough, I want to talk about a few more and then end this
01:07:51.839 end this presentation. So I think it can be hard to pick up programming as a hobby especially if you haven't tried
01:07:57.520 doing it before. So let me see if I can give you some ideas. The first one is trick programming. These are like quines
01:08:03.359 or obuscated programming. I really encourage you go check out this URL and try running the programs in there. They
01:08:09.520 will blow your mind. You will not believe the stuff that people do with the that people do with programming
01:08:15.039 languages, especially Ruby, these ones. Uh here's one. I'm going to give you a very fun one. This one
01:08:22.080 uh this is a JPEG. I will not explain how this works at all. This is your
01:08:28.159 homework for you after the conference. Uh you can run this JPEG
01:08:34.880 that this JPEG contains a Rails application.
01:08:40.799 Seriously, go get Rails.jpeg. I'm displaying it on the screen here, but this is actually executable code. You
01:08:46.719 can do ruby-X and run rails on a JPEG. So, what I would like you to do is go home and try and figure out try and
01:08:53.040 figure out how that works. Uh, the Ruby Ruby's virtual machine is a stackbased virtual machine is another project idea
01:08:58.960 I've had for a while. I just haven't gotten around to it. I want someone here to do it. Um, so Ruby VM stackbased. Do
01:09:06.159 you know what else is stackbased? Postcript is stackbased. Ah
01:09:13.120 yes, of course of course this makes sense. We need a
01:09:19.279 Ruby to Postcript compiler. Yes. Why? Why? What do you mean why?
01:09:27.040 What? What? You should have learned this from my presentation so far. We don't need a reason. We don't need a reason.
01:09:32.239 But if you need a reason, the reason is so that we can have Ruby on Rails on printers,
01:09:38.080 right? It's like our next like lambda thing. You're like, "Oh man, I need more like I need more compute. I get more
01:09:49.839 US East is actually just a bay of printers. We got all the HP, got all the HPs up.
01:09:57.120 Those Epson are too slow, but they're cheaper. Uh, so my final message for this
01:10:04.000 conference is try programming for fun. I think the future of our industry depends on this. Um,
01:10:10.960 time to finish. I'm gonna finish up here. Uh, I feel honored to have had the opportunity to be on this stage for the
01:10:17.280 past 16 years. It's been the best time of my life. I've made dumb jokes. I've
01:10:24.080 been able to go places I never would have been able to go. And I've been able to meet so many people that have touched
01:10:30.239 my life very deeply. Um, I want to say thank you for wasting your time with me
01:10:37.440 and I couldn't think of a better group of people to waste time with. So,
01:10:42.640 thanks.
01:10:58.880 Stop. Stop.
Explore all talks recorded at RailsConf 2025
Kayla Reopelle
Jenny Shen
Gannon McGibbon
Justin Wienckowski
Tia Anderson
Alicia Rojas
Albert Pazderin
Rhiannon Payne
+77