
The Ruby AI Podcast
The Ruby AI Podcast explores the intersection of Ruby programming and artificial intelligence, featuring expert discussions, innovative projects, and practical insights. Join us as we interview industry leaders and developers to uncover how Ruby is shaping the future of AI.
The Ruby AI Podcast
Rails After the Robots: Chad Fowler on AI as the Next Abstraction
Veteran Rubyist and investor Chad Fowler sits down with hosts Valentino Stoll and Joe Leo to unpack why generative AI is less a magic trick and more the next big layer of abstraction. From his days rewriting Wunderlist in multiple languages to today’s LLM-driven code generation, Chad explains how small, well-typed modules, strong conventions and agent-based workflows could let humans design systems while machines write the code. The trio debate Python vs. Ruby, micro-services vs. monoliths, cognitive load, runtime performance (hello Haskell & Rust) and what it will take for legacy Rails apps—and our careers—to thrive in an AI-first future.
Mentioned In the Show:
- MountainWest Ruby Conference — Early Ruby conference where Chad delivered a keynote in 2007 about the future of Ruby.
- TLA+ — Formal specification language for verifying distributed systems, discussed in relation to formal verification.
- Quint Language — Open-source formal specification language resembling Ruby/JavaScript.
- OWL (Web Ontology Language) — Semantic Web language for defining ontologies, cited as inspiration for constraints.
- Extreme Programming Immersion (Object Mentor) — XP training course Chad attended, pairing with Kent Beck.
- Immutable Infrastructure — Concept Chad advocated, paired with his idea of "disposable code."
- Snyk — Security company that auto-generates PRs for dependency and vulnerability fixes, discussed as a precursor to agent workflows.
- Specification-Driven Development — You described industry momentum toward specification-driven code assistants.
- Claude on Rails — Obie's exploration of using Anthropic's Claude with Ruby on Rails.
- ESP32 Dev Kit — IoT hardware Chad experimented with, used in AI-assisted electronics projects.
- 3D Printing with ChatGPT — General reference to AI-assisted 3D design and printing workflows.
Hey, everybody. Welcome to another episode of the Ruby AI podcast. I'm your host today, Valentino Stoll, and joined by co-host Joe Leo. Hey, everybody. And we have an incredibly special guest today, Mr. Chad Fowler. I really appreciate you coming on. Just one of those blind reaching out to you we had never met before. But, you know, I was at RailsConf and I heard you talking about how you feel about all of these AI changes with respect to Rails. And I found it really compelling. And so I would love to hear your opinions on so many things here. I want to hear yours too. Let's argue a little bit too, hopefully. Well, Valentino is actually, he's being nice and I appreciate that he is completing the gambit, which is to get you on here under the auspices of talking about artificial intelligence and Ruby. That's not true. I actually, I specifically wanted you to come on the show so that I could talk to you about February, 2013, when you left Ruby world as I knew it and the country to go work on a startup and write it in Cappuccino. And I would like you to explain that, please. In Cappuccino? What is Cappuccino? Exactly. So I think you're talking about when I went to Wunderlist. What is Cappuccino? Is that a thing we use? That's the Objective-C library. Okay. Right, right, right. Yeah. You know, it's funny. I did leave the Ruby world then. So, you know, we were talking about our mutual friend, David Allen Black, Ruby Luminary, right before we started this. And I said, I hadn't seen him since RailsConf 2012. That's because the last time I went to RailsConf was 2012. Right after that, I left the country. I went to Germany. I worked on this thing called Wunderlist. And they hired me because I was a Ruby person. And they've done this big rewrite and done a backend in Ruby. And the first thing I did was start talking about tearing up the Ruby thing and replacing it with other languages, which I think was much to their chagrin. Like, oh, great. We got this crazy guy. We moved him from the US and now he wants to use Scala of all things. But it is true. I did. Yeah, I totally did that. I think we'll probably end up getting back to that at some point, so I won't go too much into it. But the reason I did that was actually largely architectural. And it's when I was forming some of the biases that lead to how I'm viewing AI today and generative code specifically. Yeah, no, I definitely want to get into it. I mean, it was such a conflicting moment for me. I know I'm dating myself, but there were all these people who started writing Scala at or around that time because it was like, oh, what Chad is doing and look at this cool thing. Because obviously, if you don't know the story of Wunderlist, it was an incredible success sold to Microsoft. And you that went and had several positions at Microsoft, obviously, the re-architecture was a good idea. But of course, me as a rebudist at that time, I was like, wait, wait, chat's doing something else. Why? Why? And of course, you know that you get older and you make different decisions. I did other languages as well. So I'd be interested to hear the kind of architectural underpinnings behind that. Yeah, sure. You know, it's funny you're talking about that feeling of, oh, no, I'm doing Ruby and I at the time. And we all felt like we were at the top of the world because we got lucky and we were in this tech that everyone was using. It's kind of like investing in a company that is very early and then getting lucky. And it won't be long before we're all old people wishing that we had learned something else. So how do we avoid getting stuck in this thing? And so that is actually one of the reasons that I stopped doing Ruby when I did, because it felt too good to do Ruby, ironically. And I knew I could get stuck there. I didn't want to get stuck. I can understand that because I could also, I also had that same feeling right around that time, but I was much earlier on in my Ruby writing career. But I was like, man, can we actually keep this thing going? Your analogy to a startup you invested in, I think is a really good one. I just double checked and isrubydead.com says no. I have so many questions for you. I mean, especially around all of this AI stuff is very Python central or what now is TypeScript central in some ways. And there's so much value, I think, from the Ruby language in this particular space, as far as transformers go and natural language processing that I think, to be honest, makes Ruby well-positioned work better in a lot of ways for these transformers specifically. I'm curious what your opinions are kind of with language specifics around all this stuff. Is that something that you think about even or is it all abstractions at this point? I think about that a lot, partially because being a nerd, of course, I want to be one of the people who figures out how to do it. The Python thing is really irritating. Irritating as a Rubyist, of course, because there really is no reason to be both a Python programmer and a Ruby programmer. And unless it's just like you want to use one of the libraries from one of them or something, you know, they fill the same hole. But just the very basic fact that a language that's white space sensitive in an era where everyone's copying and pasting is just really stupid. And I hope everyone involved in that decision, which might just be Guido. Maybe he's not even experiencing this now, but in retrospect, it's a mistake. And even at the time, it felt like a mistake. So, ugh, gross Python. Just for that reason. That said, I want to hear your perspective on how Ruby is better for transformers. I will tell you first, since you asked me, the way I think about it is I think probably it would make sense to even have a language that's geared toward generative AI, generative code. My first hunch was that something like Haskell would be perfect for this. Because with Haskell, I used to joke we had Haskell stuff, if it compiles, it works because the type system is so rich and you can embody so much in the type system that it's beyond just syntax and grammar. It's semantics that get baked into these things. Ruby doesn't have that and Python doesn't have that. TypeScript sort of does. Python as being like the default thing that these LLMs vomit up, then great. Because now, in a way that I used to argue against when dynamic languages were becoming the rage in the early 2000s, the programmers we're talking about now actually are stupid, they're LLMs. And Dave Thomas of Pragmatic Bookshelf and Pragmatic Programmer, he used to say that Java is the Duplo block of programming. You're trying to protect the dumb programmers for themselves by putting all these things in place. Joe Armstrong actually even told me once about the Erlang system. What is the Erlang system? The framework is called OTP. Yeah. So we were talking about OTP and he's like, oh, I don't use that. We built that for bad programmers to use. That's really funny. He would literally not use OTP. He would always code everything on his own. He's one of the inventors of Erlang. Just for context, if people don't know, most Ruby people seem to know Erlang. So my point is guardrails actually matter more than they used to, or at least more than I used to argue that they used to. There were people that never moved on from that. But like the programmers are pretty dumb, the LLMs. They're good at spitting out lots of stuff. So there's language-specific stuff like that. I've done some research into formal verification and languages for that for doing specifications, so like TLA+, and there's another one called Quint that's new and open source and looks more like Ruby and JavaScript. It's really nice. I feel like there's a place for those sorts of tools. And then ironically, things like ontologies to describe domains in some sort of codified language, like OWL was the thing from the semantic web, ontological web language. I think it's like these sorts of things that come together that can create and document constraints in a computer checkable way that become more valuable, usually than very specific language features. And then the problem is, I think it would be great if there were languages built for LLMs to use because I think they'd made things better. However, you also have the whole other side of reality, which is LLMs work by indexing the internet, which means the best thing that you could do is use something that everyone else used two years ago or before, right? So the best documented things are the best ones. Or here's something in the favor of Rails, not necessarily Ruby. Languages that have very strong conventions or frameworks that have very strong conventions. That's a great thing about Rails. Rails is an architecture more than a framework. It's an architecture embodied in Ruby. And then people have completely embodied that in other languages. And so the things that reduce decisions that a human would need to make that are not of value are also good for LLMs because you also want to reduce places for them to make mistakes, places for the context window to grow so they become more stupid as they go. Anyway, this was like a totally unhinged babbling session. Why do you think, Valentino, that Ruby is better for transformers? What's the argument? I mean, more specifically, I guess, is the training data. Right now, things are mostly like, you know, like you said, scraped from the internet, but a lot of it is pure textual. I would say a very small portion of the training data is actually code in a lot of ways, especially for the larger ones, models that everybody uses the code, right? Is that in perspective to the amount of data that they're actually scraping and training and preparing, the amount of code is very small. And so what you end up with is something that more desirable is aligning your inputs to be more textual and more English reading and sentence structure and things like that matter more than how the code is specifically formatted or parameters and things like that. This is all hearsay. I don't have any empirical data to support any of this that I'm talking about, but this is just from what I've been reading about it, transformers over the years and following the patterns and training data that they at least are admitting to. This is kind of where I'm thinking is the more you can get something to look like actual sentences and structures and reporting and things like that, the better your outputs end up being. And I think a lot of this can be proven simply by Markdown. Like Markdown is an incredibly well performing format, even compared to JSON as an example, which is what a lot of people use, but it doesn't perform as good. And I think that kind of leads into a lot of just how transformers work. And when you get a lot of these superfluous tokens of hash signs or begin, end, and maybe some of this stuff that doesn't make sentence a sentence. For Ruby's case, like those begin ends maybe make it less desirable. But when you get ones where there's like curly brackets and lots of semicolons and even lots of this extra tokens, it doesn't really align as well. And then unless the model is like heavily trained in that specific language, you end up getting kind of blended results where it's, okay, it has to assume that you're using this language. is like heavily trained in that specific language, you end up getting kind of blended results where it's okay, it has to assume that you're using this language. And then based on that language, it gets into a different layer and then tries to have to reason internally about how to align those layers and chains through everything. And so my perspective is that Ruby is very easy to read and it is more like language specific from a grammar standpoint. And so if you can align your code, which I think Rubyists do kind of best practices of trying to make it more legible, right? And even from an abstraction standpoint, very practiced at trying to make your abstractions work well from a readability standpoint. And so like the more readable your code is, really people say that's the better Ruby. And I tend to agree with that. That's interesting. And it's also another take on the raising of abstraction where Rubyists will like create a DSL for something that doesn't need a DSL. And I don't mean that in a negative way. It's just like stylistically what happens because we all fell in love with this idea of being able to raid the level of abstraction to where it's almost like human language to the point where we did a bunch of stupid things too in the past. Weird chained sentence structures just because you can do it because the result of every call is some sort of value that you can chain on and overload and blah, blah, blah. And that's an interesting one because those are really bad for people. Ultimately, they're good for the reader and not good for anyone who needs to write it or modify it. But that might not be true for LLMs. Yeah, and I mean, this is all just assumptions. There's definitely more training data on the models for code for all of the code that these model producers adhere to. And that's clear, which in some cases may be why something like Scala or Rust or something like that, maybe Rust is a bad example. I heard it doesn't perform very well. But I feel like there's just a lot of opportunity for Ruby to really dig into the current state, at least. But I definitely want to hear more about your idea of abstractions because I was hoping the WebAssembly application of language, like you're mentioning some kind of specification that converts to something that is LLM performant, where like maybe there's like some kind of WebAssembly version of cross-language compilation into some kind of spec that then the LLMs understand universally. That's something I think about too. These are all hypotheticals. Is anybody working on this stuff? I haven't seen it. Maybe you have. I don't know. I've talked to a lot of people doing CodeGen-related stuff. Yeah. And my sense is that probably they don't live in LLMs. Ultimately, these models, parts do and parts don't, but they're like MCP calls into things that have like better graph oriented structures behind them or whatever. So I don't know. I don't know if the LLMs care about this sort of uniform thing either. Like one lesson I've learned from talking to founders as an investor now is sometimes I'll ask people, well, what's the shape of this API and how do you get these two things to talk to each other? people, well, what's the shape of this API and how do you get these two things to talk to each other? Like, oh, it's a prompt actually, you know, at this point, we don't even need to think about that anymore. And for small enough problems, that's fine. It actually works today where you can tolerate some error. You were asking about abstractions. I remember when Rails came along. Well, I remember when Ruby came along in fact, and before that, like there was a time in my programming life where I really thought in terms of the program counter, basically. When I learned basic, it's 10 print, hello world, 20 go to 10, literally about the steps that the program is following and store this thing in here and then print it here or assembly was even lower level than that of course every time we've seen a major level of abstraction get raised in programming there's a community of people that are absolutely terrified angry think it's stupid not going to work whether it's compilers or even assemblers or the JV app or Ruby as a high level language with dynamic typing, as opposed to using Java or C at the time where everyone's like, well, it's going to go crazy. You're not going to know what any of these values are and it's not going to work and it's going to perform terribly. Well, that ended up being false. Rails comes along and says, you know what? You don't need to spend several days figuring out the project structure of this web app because none of these are valuable questions to even answer. So just get past that by typing one command and we're done with how to set up the test framework, which one to use, what directories things go into, how you do routing, all this stuff is just answered for you. That is the miracle of Rails sitting on top of the miracle of Ruby at the time. It's all about convention over configuration and being opinionated. Yes, I agree. So you look at active record, that looks insane to a person in the year 2004. Someone who spends all day working on database stuff, they look at that and think, that is never going to work. It sounds like a fun trick, but it's never going to work. It worked. It works. Of course, there are all sorts of corners and you end up fixing them. And for a while, there's a job, and there still is, but for a while, there was really a job for people to figure out how to get something like ActiveRecord to work without destroying your database when you start getting people hitting it because the first thing that you do is N plus one problems. and there were so many things that were just like by default you were going to screw up no longer the case though and no one expects to start a job on a software project now and type sql all day right it just doesn't happen someone has to do it sometimes if you're lucky and i say if you're lucky because it means you have a performance problem because people are using your app right so if you're lucky you get to do it sometimes if you're lucky. And I say, if you're lucky, because it means you have a performance problem because people are using your app, right? So if you're lucky, you get to do that. It's not everyone on the team. I'm looking at these LLMs like this, and I know there'll be people who disagree because it's not deterministic and blah, blah, blah. There's all sorts of arguments, but it's just a continuation of the same thing we've been doing the entire time we've been in this very still nascent industry is raising the level of abstraction to a point where we can ignore the things underneath it. So I think there's soon a time very, very soon. I think we should stop saying the phrase vibe coding unless it's a pejorative, actually, because vibe coding implies people who don't know what they're doing, just like letting the thing go. Right. people who don't know what they're doing, just like letting the thing go, right? There's a time pretty soon where people like us that have spent our entire careers understanding exactly what's happening also ignore what the thing develops. As long as it's doing the thing we want, it's creating the thing we want in the same way that I have not recently read the source code to any of MRI to see what happens when I call a function with a certain type of argument, because I don't care. Ruby's doing that. That's Ruby's job, not my job. Well, so this is an interesting point here because you've hit on something with Rails, the convention over configuration concept or feature. What it does is it eliminates cognitive load, right? I no longer have to think about how I'm going to group my models, my views, controllers. I no longer have to think about routing, right? There were a lot of things. Soon after that, we got things like Heroku. And then all of a sudden, we didn't have to spend two weeks figuring out how we were going to deploy this thing that we had built to the web. We could do it overnight. We could do it in an hour. So if that is an abstraction, both of those are abstractions that reduces cognitive loads that we can work on, presumably higher creative problems. Then what is the cognitive load that gets reduced with the introduction of AI as an abstraction? I'll tell you a story instead of answer the question real quick. Right after Rails was released, there's a guy named Glenn Vanderberg that all the Ruby people used to know. I'm not sure if they still do, because he also left around the time I did. And I think he got closure, but I remember vaguely he did a bunch of great talks at Rails comps and stuff. He's a really good thinker in architecture. He had moved from doing Java stuff. I think he'd written books on Java and enterprise Java before that too, to Rails. And he told me, I remember where I was sitting, I was in 2005 and I was helping him with some like Rails windows problem. But he said, yeah, I've just started working in Rails and it's been like a month and I find myself to be exhausted at the end of the day. And the reason, because I thought, well, that's weird. That's not what I expected. I expected you to say like energized and excited, you know, not dealing with all this crap anymore. He's no, I'm exhausted because in the Java world, I would think of something I want to do, and then I'd spend an hour typing it into the thing and having it compile, and then I'd be done. And then I'd think of the next thing. And the hard part is thinking of what you want to do and how you want to do it. Then the easy part was sitting and typing. So I was like, well then I'd think of the next thing. And the hard part is thinking of what you want to do and how you want to do it. Then the easy part was sitting and typing. So weirdly, it actually increased his cognitive load to raise the level of abstraction. And I recognize that to be true for me too. Like, oh, I can go so fast with this thing. I have this exact feeling today when I'm using cloud code because I structure things in such a way that it finishes the thing I wanted to finish and I need to decide what's next. And I'm dealing with complexity much more quickly than I would if I was typing it in because the system is creating is huge. So you asked me the opposite. I'm telling you, it sort of increases the cognitive load, but I think it does it because it removes the boring stuff and the mindless stuff from my process. The things that it would decrease though. So just to make this believable, imagine you have a system you're building and almost the entire system is made of pure functions. So, you know, no side effects, no memory being changed. It's just deterministic inputs, outputs. So the first one is reverse a string. You could write that. You could also use a built-in thing for the language, but let's imagine the language doesn't already have it. If you had to reverse the string right now, you'd sit down, and if the language doesn't already have it, you'd sit and you'd think, okay, how do I need to do this? How does it need to perform well? Blah, blah, blah. And then you'd finally type it out, and you'd be, okay, how do I need to do this? How does it need to perform well? Blah, blah, blah. And then you'd finally type it out and you'd be done. It's a simple thing. But I think we all agree we could ask an LLM to do this and we could probably trust the output. It's a pure function. Complexity is reduced by the surface area of it. So I think with the right architecture, many more problems can be solved in such a way that the solution is trivial. And therefore, we can reduce cognitive load by not having to think about it. And that leaves us thinking about architecture. And, you know, another thing from my past is when I got into test-driven development, I've only been to two software courses in my life. One of them was the extreme programming immersion that Object Mentor used to do. And I went to that. I convinced my company to send me and a whole bunch of other people and we were going to do XP. And so I was sitting with Kent Beck, because that's what you get to do, the inventor of extreme programming, pair programming on some made up problem. And I remember telling Kent as we were working on this thing, I see what's happening now when we do TDD the right way, we take a complex problem, we break it into simple pieces, we declare what those pieces are, and we allow the hard part to happen lower in the stack. So now we go lower in the stack, we do exactly the same thing, and we TDD all the way down to the bottom where nothing was ever actually hard to do. I think what we need is architectures now that mirror that sort of a thinking for the LLMs. Because the LLMs can't do hard stuff in a way that's reliable. They certainly can't maintain the system after they generate it. But what if we had a system design and architecture that was just made up of hierarchies of things that were all trivial and we could all trust the most idiotic programmer we've ever met to build it as long as there's a test for it so this is how i think now and it's how i've always thought i told you there's biases that i bring from back before i went to wonderlist which led me to do this crazy heterogeneous back-end microservice, which I didn't talk much about. But the reason I left Ruby was I wanted to explore these ideas of decoupling and composing systems of trivial pieces. And even back then I started talking about immutable infrastructure. Yeah, I remember. That was a big influence for me. Sorry to cut you off, but I loved that, what you wrote about, And I neared it at the company I was working for. It was a big influence on me. Yeah, continue. I think I coined that term. I've been taking credit for it for years. I'm sorry. Oh, no, it was you that coined the term. But after I heard it, I wrote a post about it. And what I used to always talk about was immutable infrastructure and disposable code. And it's the latter that's more powerful that didn't catch on as much. So at Wunderlist, what I would tell the team is you can write your code in any language you want on the backend, mostly. Yeah, that's where I was really working, mostly. Any language you want, but it had to follow a certain set of guidelines. And there were the obvious ones, like it works with the monitoring system and the build system, whatever else. But the one that was the most important is I would hold my fingers up like the size of a small page or something and say, as long as the code is this big or smaller, you can write it in any language you want. The reason was we had built a system with a consistent set of calling conventions and API conventions. So anything could plug in. It was all via HTTP, of course, and a message bus thing that was sitting on top of RabbitMQ. So we had like two modes of calling things. We had an architecture where it was very obvious where something should sit. And so if your code is no bigger than a page long and it doesn't work or someone doesn't like that language and they're on call, they can replace it. So if I'm doing some crazy stuff in Haskell and I could only find one other person at the company who would work on Haskell with me, which is the case. Well, that was one of the rules. You had to have at least one other person who was excited to work on and maintain the thing with you. So if neither of us was around and the Haskell thing went down, we'll just rewrite it in Ruby. It's fine. You know, or rewrite it and go or whatever. And we did that sometimes. So like, oh, I've got an upgrade request for this service. I don't like Clojure. I'm just going to rewrite that function and TypeScript or whatever and do the upgrade for it, the feature enhancement for it at the time. That's pretty fascinating. The reason I'm talking about this is what if you had a complex software system where all of the pieces of code followed those rules and therefore anytime you needed to modify the code or maintain the code, the system just figures out which piece it needs to change and it replaces it because it's trivial and it has like a clear inputs and outputs and side effects are well known so it doesn't matter if your lom can figure out how to maintain your code as long as it can find the thing and replace it and you don't care you're not like married to the implementation of the thing you just need it to do what it's supposed to do i really love that that response i'm glad you rambled because yeah love the idea of the hierarchy of composable objects. I think that if you can abstract a concept about something, then you don't have to define it everywhere anytime you call the LLM. And that seems to be true even for a lot of the stuff coming out in the industry as well, even from Shopify, a lot of Obi's work from like Cloud on Rails or the specification driven development, right? That's coming out now. It does seem to be like, okay, if you enter this directory even, then this is how you should behave as a coding assister. And that can be even, like you said, drilled down further down the stack to be more specific to, okay, I'm working on database related things in a Rails architecture. Here are things to follow, right? But there is definitely, it's hard to manage that kind of abstraction on top of all the other abstractions. And I think that's where we're kind of missing some tooling and infrastructure, even from the industry, not just Rails and Ruby, right, is we have all of these kind of cobbled together things that work kind of, and they should work very well because of how tightly bound the conventions are already defined, right? So in a Rails stack, if you want to do anything database active record is very well defined and it has very simple instances and interfaces to like do most things with, right? But if you just drop that in an LM, you're going to have to like give it some handholding or hook up an MCP and then it's going to have to call the MCP who knows how many times to figure out just how to implement the thing that's already implemented. And so what I'm looking forward to is more of this context expansion, right? Like how do we take these abstractions that are very big, but when the ask comes, it's very specific. How does it like then walk the stack? How does it find its way up to build up more context to figure those things out, which is ultimately what we do kind of in reverse in a way. Yeah. Well, we do it in both directions because we're doing in both directions. Yeah. And we have the same problems that LLMs have too. Right. We also create the same problems that LLMs create for that matter. Totally. I feel like Rails, like you mentioned, outside of the conventions, all the generators and things like this are just so helpful in this generative process. I feel like there's something there too, where we could really expand on to drill into these kinds of concepts. I'm curious if you've thought about from a Rails perspective, or even Ruby's like modules includes and things like that. If you've thought about maybe how this architecture would look. A bit, yeah. I mean, I think I lean toward, you know, I use the word bias a lot in this conversation already because I have this bias that everything needs to be small and decoupled. And this is why I was also one of the crazy microservice people, and I probably still am. It's not because I want everything to talk via HTTP and be slower. It's because I want forced decoupling, and I want it to be harder for things to be badly coupled than easier. Like the default choice should be the good choice. And that's what microservices do. Whereas in Rails and Ruby, there was a speaker, I should remember his name, a speaker at Nordic Ruby back in 2014, who said, paraphrasing, Ruby lets you create beautiful coupling or something. Like that's the purpose of Ruby. And it was just like, he was coming from the outside and he had this really eloquent way of saying, Ruby's features are beautiful and they increase coupling in so many different ways. You don't know if there's a new method on string, for example, you don't know what's going to happen. And that's one of the things that never would have worked, that people thought Ruby is crazy, you can't be doing this. So I think more about like, how do I not have to worry about tons of context more than I think about how to increase it? But I think you're right that like generators, it's not just conventions, it's like actual code that does things. And to your point about text being a big input, well, the input, but textual descriptions versus code being more of an input into LLMs and the training data, all the text tells you to generate things. So the LLMs already know that's what you're supposed to do, which is good. That's a good start. The worst case would be like, oh, I know how to make a Rails app. I'm going to, as an LLM, hand code all the components, which means they're going to be like the two-year-old version and not work with Rails 8 or whatever. We've been talking about how Ruby and Rails in certain ways lend themselves well to generated applications. And I agree. I think that's true. I agree with myself. No, I think that's true. Though the pessimistic side of this from a Ruby perspective, when I was thinking about going to RailsConf and how I was going to perceive being there after all these years, the pessimistic side of me says, well, the language that wins is the one that there's an ease of generation, ease of deployment piece, but ease doesn't matter anymore when humans are out of the loop. So what really matters is the runtime that's the cheapest to run and provides the best uptime and speed, right? So they're like just really boring metrics that are all about machines that ultimately we need to care about. Probably there is a bit of like how verbose is it, Valentino, to your point of like more tokens means larger contacts. You know, I'm sure there are ways that brilliant people can compress that stuff out, but succinctness is probably important. Is that kind of like another vote in favor of something like Haskell as a better alternative? Yeah, or Haskell Rust. I mean, it could even be C. I think that would be stupid with LLMs because you have no guardrails. Rust is kind of best of all worlds. You've got the compiler can check things for you. It smells sort of like Haskell in that way, but you can create things that are like super lean, perform really well. Yeah, Haskell is a great example. We had a service in Haskell that when we were scaling up, we had massive performance problems before a big rewrite that we did that I was leading. With all of our servers, we have like at least nine instances of the server running on nine EC2 machines back then. With Haskell, we never needed more than one because it was just like everything happened in a millisecond and used no memory and it never crashed. You could run it on a laptop, probably. The rest of it, we were spending hundreds of thousands of dollars to run this infrastructure. That's why we're gaming the show to the Haskell AI podcast coming to you next week. I think Haskell has not won. By the way, Haskell is an interesting one where when I said, if someone hates my Haskell code and they don't want to modify it, or they don't like Haskell, they can rewrite it. Ultimately, the code never broke. We never had to change it once it worked because, you know, the type system and there weren't any bugs in it. But the build system changed around it in a way that was incompatible with something we had done. And we got to a point where we could never compile it again. So we had to replace it just because we couldn't get it to compile, which was a very annoying thing for me with my Hasbro project. Yeah. Yeah. You know, I had a follow-up question based on your idea of computation performance at that point. So I think what I took away from that is that if Ruby wants to dig in to take more market share, we need to be more performant? Yeah, definitely. Or the pessimist says, too late. Doesn't matter anymore. The optimist says, there's a bunch of Ruby code in production, so people already are dealing with the operational cost of Ruby. So maybe it's not too late. There's tons of great documentation that's easy to generate things and all the stuff we said about Rails before with conventions. So maybe it's not. I. There's tons of great documentation. It's easy to generate things and all the stuff we said about Rails before with conventions. So maybe it's not. I do worry a little bit, though. I know we're on a Ruby-themed podcast now, but the main thing that I was thinking about going to RailsConf is like, you know, I spent so much of my career really identifying with a programming language, whether it be Ruby or something else, or with some sort of like guts of how things work concern, most of us in the future won't have the luxury to do that. If that's even a luxury, the fact that there's a conference called RailsConf, this feels like a blip in time. Of course, now it no longer exists. So, you know, maybe... More right than you realize, yeah. It's a blip in time where humans were concerned with this sort of thing at levels that would have thousands of them go to other countries and talk to each other about it. I think it's a dangerous, worrying thing to identify now with an implementation detail. And I think Ruby and Rails are implementation details in the near future versus like cultures and full-time vocations and hobbies. Unless it's like, I guess I still do like racket programming sometimes on the weekend for no reason. So there's probably a place for a hobby. But yeah, it's not just Ruby and Rails. Any language community beyond the hobbyists, you say like we want Ruby to be adopted. Well, you know, I used to be a director of a nonprofit that was all about advocacy, of course, for Ruby. Now I think that isn't a thing that we should be thinking about so much. I think we're graduating to another level. And it's more like, how do we make these machines build the code for the machines better? And there's a whole bunch of stuff around that, as you know, you know, you've been talking about MCPs for this and that. To me, that's the place that people like us live in the future, as opposed to down in the layer of abstraction of even a web framework and how you implement things in it. Well, so you could be right about that. And Obi Fernandez was on the show a few weeks ago, said something similar, like, hey, you know, I used to really pride myself on, what did he say, the assembler code that he put together. And that's over. You kind of let those things go. But I am curious to know, I probably have a less serious question than Valentino, but it is serious. What do the enthusiasts, the professional enthusiasts do? Where do they go to celebrate what they do together and learn from each other? Or is it just a bunch of like, well, we all just kind of direct the machines now and that's good enough. We don't have to go to any conference about it. Well, there's probably a transition period. Obviously, for a long time, there is going to be Ruby and rails and people are going to be typing ruby and rails code and reading ruby and rails code if for no other reason than there's all this legacy code people have to maintain so i think communities continue to exist around this stuff but i think in the future there will always be enthusiasts but it's just a matter of what they're enthusiastic about i think it's going to be like the tools around this stuff and the techniques. I'm sure you see this as well. The reason I said earlier, I think we should stop using vibe coding as a term, except for as a pejorative. So I think there is like an art which will be evolving for quite a long time of how to orchestrate systems so that they get built well. Cheapest, most effective, best user experience. It's still a creative thing. I wrote a short story recently. And when I say I wrote one, I had multiple LLMs collaborate with me on a short story. And ultimately, I wrote none of the text. But I feel deep ownership of the output. No one else would have created what I created in that session. It's actually deeply disturbing. I'm going to use it for a music project. I won't go into it because I ramble too much. But at the end of that, I thought, I'm exhausted. I feel like I've done something amazing. I want to share it with people. And I did not write this story. I'm not an author of fiction. I didn't write the words, but I still feel like I created this thing. And there's a craft to it. And I don't think you could have done it, either of you, because you're not me. You didn't approach it the way I did. And I think there was actually even something like novel and clever of the way I did it. Of course, in programming, I think that to a much greater degree, because I'm so-called expert in software development and architecture. So the way I deal with these LLMs is different than most people. And the way you deal with them is different from most people. And it's really exciting. And what I find is when I catch up with my friends in such situations like this, my previous call was with a friend named Jess Martin, who used to be in the Ruby community too. We spent the whole time talking about how we're dealing with LLMs to generate code and how we're orchestrating and making tasks get completed in a way that works, like integrating with GitHub, and that's where it goes now. It's just a different thing that you're worried about at a higher level of abstraction. Sometimes we'll look at the code that it implements and probably comment on that too, but we don't get together at RailsConf and all of us talk about the specific implementation of some feature like how has many works that's not interesting anymore it used to be in 2008 that was the thing we would debate not anymore it's done curious there are so many problems technically that haven't been solved too. And so where do those problems go in this new state? We almost have to have those solved too, right? Before we can get to that ideal state of the LLMs just doing everything. So to me, I worry that that is like something promised early and delivered late and everybody's just ends up having to deal with it. And how do you move fast in that environment, right? The Rails and Ruby, they're really great at moving fast. That's why people choose Rails to begin with is you want to get a business set up on the internet. Rails is fantastic for doing that at lightning speed, right? And so how do we keep that momentum in this new layer of abstraction, right? And so that's something I worry about because Repl.it is great for doing quick things. Somebody wants to deal with UX and try out a new thing, let your design team at it and have them build up an interface and solve your UX for how you want it to work and then hand it off to something else, right? That's going to be more performant longer term. I feel like I'm a little suspicious of that actually being solved near term, even medium term, like in the next three years. I feel like that's a long shot. So I think about like, everybody's going and using all these code generation tools and it's great, but do you still have this review process, right? Trust but verify is going to be a thing for a long time. And when you have to read through thousands of pages of code that it generates at a time, there are ways to reduce that amount with some work. Then you just have more code to review in smaller chunks. And you're not going to review it. It's still reviewing, right? How do you continue to move fast, right? Like in this iterative process that we've built up, that we've proven that works, right? I know that we're talking about building new processes, but I feel like that generative aspect of things is a huge bottleneck. And everybody that I've seen introducing code generation on a large scale introduces a bottleneck that is unseen and it is seen by top people in some regards but it hasn't been realized. It's trash most of it. I have so many reactions to what you just said one of them being there is this obsession with one shots which is the wrong way to think about things. That's good for demos. The other one is the entire modality of assuming that people are going to sit in an editor and have an assistant. That's silly. That was a complete waste of time and will continue to be. I think it made us all go faster for a little while for those of us that like to use those IDs. I don't, ultimately, I think we have to think about agents as members of the team, you know, not like we have to humanize them, but GitHub, GitHub was built for agents. They didn't know that at the time, but I remember the first time I saw Snyk, the security company, S-N-Y-K. I talked to the founder. He showed me a demo of Snyk making changes to code to like upgrade from security vulnerabilities. I was very skeptical back then. This is like 2017 until he showed me, oh, it just generates a pull request. And I thought, oh, wow. Okay, great. It's a pull request. I'm comfortable with that. And the reason that that turned on the switch of like, oh, computers are going to be able to generate code because I see how it fits into the process. So I would like to see agents get introduced to teams in this way where they're just dealing with the programmable API surface areas of all the things that we interact with when we create code. We don't need to look at their editor when they're working on it, just like you don't have to look at mine. But then you're right. If it's going too fast, you're not going to be able to review it quickly enough. That's where it's about new processes to me and architectures that make this okay. Sending the right things to the agents so that you can trust them in the same way that if you work for a big company and you bring on a large contracting company for lower cost labor to do software development, which I have done a lot in my career, you don't get to talk to them all the time. Sometimes you're not speaking the same native language. So there's a bunch lost in translation. They go off and they do a bunch of work and they deliver it all at the same time. And then you've got tons of code to review. You work on a system for 10 years and you're in an environment with rotating staff members and rotating contract companies. You have the exact same problem already that you have with LLMs. You're just getting to the problem state faster, but you're also getting to the positive state faster with LLMs. So it's not all bad. So I think you should worry about it. You know, I was interrupting like excitedly saying we're not going to review the code. Not because I think we shouldn't, although I also think we have to accept it and not review the code because we can't we also can't slow down because no one will tolerate that the incentive structures in the world don't align with us all saying we got to slow down let's be like half AI speed and half human speed not going to be okay that's just not how it works right so look into the future and look what business is going to tell us about how we need to operate on code and we need to be thinking about how that's going to be okay i think you're totally right that there are a bunch of promises and they're not going to be delivered and the whole thing's going faster the cart's going before the horse and all this stuff we have to figure it out and there are going to be people who care about this and who don't have their heads in the sand that are the ones that figure it out. And they're the ones that have a programming community that enthusiasts rally around because they're figuring this stuff out in the same way that like the first like rail scaffold thing, all the Java enterprise people are like, haha, that's ridiculous. That's junk. I don't trust that. I'm worried about that. Yeah, you should have been. But also there are a bunch of people who saw that and said, we're going to make that okay. And we're going to solve those problems as opposed to say, eh, we got to slow down and not use that. Let me know when it's done. Because those are the ones that are still doing Java enterprise programming at a terrible corporation. Yeah, I really like that answer. I had something similar to say in a talk a few months ago about the number one reason that AI exists at all when it comes to software is so that humans could go faster. Businesses just want us to program faster. So yeah, you're right. At some point, we will have to create a system or get comfortable or something with the fact that we can't review all the code that the AI is writing because our competitor is not going to review all the code that AI is writing and look at all the money they're making according to the owners of the business. Yeah. I mean, that's maybe that's capitalism or that's economics, but I think that's absolutely the way we have to be thinking about it. But I also like there's some hope in there, I think from both of you, because you're saying, well, okay, if that's the case, then we need to get a lot better at building the thing to make it okay. As you said, Chad, to make it okay means to be innovative and creative to find solutions for that rather than tucking it away or pushing it away. Yeah, it's kind of like regulation and alignment and all this stuff. If a country slows down on this AI stuff, then the other ones aren't going to. Unfortunately, it's like an arms race. I think it's not capitalism as much as it is economics, to your point, that it's all about incentives and mechanisms and game theory. And by the way, we all have a business. You know, you were mentioning the business owner. Well, you're the business owner of your career and you're competing with other software developers as well. 10 years ago, it felt like that would never actually mean anything other than how rich can I be as a software developer? It might mean, can I have a job as a software developer in the future? And so you need to be making those decisions, not you specifically, Joe, but you know, you as proverbial you, wow, need to be thinking about this, like how do you compete in the industry? And if you're not going fast, someone else is. Are they writing perfect code? No, but neither are you. So like, what's the gradient? What's the Delta? What are you bringing that's special this time in the world? And I will argue that for most people, the thing you bring that is special and differentiates you will not be your expertise in a specific programming language or framework. It might be in a database. It might be in a runtime. If you're an expert at deploying, it's like the containers and the rails on which these agents will work. That will continue to be valuable for some period of time, but the creation of the thing, not so much, not in the details anyway. One thing I've seen recurring in the Ruby community is this idea of a runtime self-tolerant system where it kind of just rebuilds itself as it goes. And I can see that becoming a thing as these things become more performant. And maybe that is a potential future for Ruby in general. If somebody can go build one of these things where it's safe to run and modify, right, in real time, I feel like there is potential there to see maybe a future, not necessarily for writing the language of your own, but at least using it. Yeah, that's interesting. Like you could modify in memory with monkey patching in memory. If it generates something and it had an issue doing whatever it was trying to do, just having the thing reflect on itself and be like, what should we have done differently and modify and then re-execute? I'm afraid of that. Yeah, everybody's excited about it. Yeah, yeah, yeah. I mean, my crazy idea is we could definitely build up a standard library of known good stuff really quickly, whether it's in Ruby or probably Wasm or some other, maybe it's on a domain and tech specific thing. Imagine an incentivized contest where you are rewarded for the best challenges and the best challenges, like the most useful, best specced version of a function that needs to exist that lots of people want right you're rewarded on that end you're also rewarded for the solution and the solution is based on metrics and kpis and of course assertions and you know actual test framework now people could come play this game and they could type code that wouldn't happen for very long if there's a reward right so then it becomes a bot war whose bot does the best thing so imagine now you win the contest for one specific function or library or whatever the unit is now there's an ongoing thing where you're incentivized to make a better version so this has now been canonicalized into the standard library of whatever. And now you've got thousands of agents competing to make the more performant version or the version that uses less memory. And now just like pour tons of money into this thing and watch agents build up an amazing new system of interoperable libraries and components that you can trust because they're all spec'd out in terms of how you verify them. I'm sensing a cryptocurrency scheme here. Well, it just, it feels that way because that would be a way that makes sense. It's really because crypto and mechanism design go together and this is an economic problem. To be honest, I could see that incentivizing people to solve challenges and earn from that over time being very fruitful. I know I've done coding challenges myself back in the day, no longer, but there's a certain reward you get from it, achieving it. And I imagine agents would feel that in a way. Well, you would still be a person trying to coerce the agent, trying to program the agent. Yeah, exactly. You're trying to create the bot that'll do it. Yeah. If the system existed and was successful, people could just make their living asking bots to do the best, most clever version of this. I think it'd be an interesting way to like race to some new understanding of how to generate code well. Let's do it. All right. After this call, we'll hang up and start on. Botchallenge.com. The first thing I will type is Claude space dash dash dangerously skip permission check, whatever it's called. It's amazing how much that is getting adopted that I've been seeing people do just like, yeah, whatever. YOLO. It makes me nervous. Welcome to the future. You should be nervous. Yeah, I should be nervous. And it's just what I was saying. You should be nervous and you cannot stop it. So we have to just assume this is the case. We really loved having you on here. We'd love to have you back again, especially after this new chatbot challenge is up and running. And you can talk about the winning of the purse. We'll be too busy raking in the money after that. It was fun. Yeah. And anytime. I love to talk about this, obviously. Yeah, us too. Thanks so much. I appreciate it. If you've got any more time, we do this little segment at the end where we just share something that you're interested in. It doesn't have to be specific to what we're talking about. We'll just give you the opportunity to share whatever you want. Because of AI, I am finally learning 3D modeling and 3D printing after wanting to do it for years. It is amazing how quickly you can go from nothing to like actually solving a problem in your house. So the first project I did was I created a new end cap for my saxophone that protects the octave key because I have one that I love. Then I had another one I didn't love and I have two alto saxophones and I protects the octave key. Because I have one that I love, then I had another one I didn't love, and I have two alto saxophones, and I lost the bad one. So I measured with calipers and created a new end cap. It was my first project. It took me like three hours. And it was all because I was asking ChapGPT and like showing it my screen. I just knew what to do. It's amazing. I sound like such an AI show, but it's just such an exciting new world. It really is. You know, I have the similar one with circuit printing and configurations. You know, hey, chat GPT, what would you do for this? I even took a picture of tiny hardware components that I had lying around. I'm thinking about making this thing. How would you lay it out? Oh, yeah. I got an ESP32 dev kit for doing IoT this weekend, too. It's all related to 3D printing and all this. And it had a QR code and a URL to get instructions and a tutorial. Of course, the URL's dead. And I think the company doesn't exist. I was getting a knockoff. So I dumped out all the components on a table, and I took a picture of it, and Pat PPT sorted through and told me what it all was. Amazing. That's awesome. And it walked me through projects. It's the future, man. Yeah. You can't not talk about it. Right. Awesome. All right, Chad. Thanks very much. Thanks again, Chad. And it's great having you. Take care. All right. Thank you.