Distributing Your CLI with Homebrew: Tips from Mike McQuaid

Interviewed by Ruby Rogues

In this episode of Ruby Rogues, I sit down with Mike McQuaid, lead maintainer of Homebrew, to talk all about building and distributing CLIs. We dig into the practical steps for turning small scripts into reliable command-line tools, why Ruby is a great starting point, and when you might want to reach for Go or Rust instead.

Show transcript
  • 0:00 Hey folks, welcome back to another episode of the Ruby Rogues podcast.
  • 0:09 This week, I'm your host, Charles Maxwood, and we are talking to Mike McQuaid.
  • 0:13 Mike, you came on before we talked about homebrew and building homebrew and workbrew and all
  • 0:20 the stuff you were doing at the time.
  • 0:21 Is there anything else you want people to know about by way of introduction or?
  • 0:25 Yeah, not really all the same old stuff, like I'm not kind of doing as much stuff on
  • 0:30 workbrew nowadays and doing even more stuff on homebrew nowadays.
  • 0:33 So yeah, all good stuff.
  • 0:34 Nothing really has changed.
  • 0:36 Good deal.
  • 0:37 I use workbrew, or not on workbrew, I use homebrew all the time.
  • 0:40 So yeah, glad to hear it.
  • 0:42 It runs on Linux too, I think.
  • 0:44 I think I wound up using it there somewhere.
  • 0:46 Yeah, yeah.
  • 0:48 It runs on Linux and I guess because it's Linux, but we've still got a little, a few tweaks there
  • 0:53 as well on like WSL, on Windows as well.
  • 0:55 So I've ended up playing around with it on my like Windows gaming machine, which until
  • 0:59 recently has been unsullied by homebrew.
  • 1:02 Unsullied, I love it.
  • 1:03 Yeah, we talked quite a bit about homebrew and how it works last time.
  • 1:08 And I thought it'd be interesting because I find myself sometimes fiddling with like writing
  • 1:13 scripts or things like that on my machine and then thinking, you know, it wouldn't be too
  • 1:19 bad to kind of parlay this or the set of scripts into like a CLI.
  • 1:24 And so I was just curious.
  • 1:27 I don't even know where to start with that.
  • 1:30 But since you've kind of built a CLI that a lot of people use, I know you had other contributors,
  • 1:34 but yeah, let's say that I'm sitting on some stuff that I think belongs in the CLI.
  • 1:39 Where would you even start with something like that?
  • 1:42 Yeah, I think that's, it's a really good question because I think the, it, a lot of this depends
  • 1:47 on, I guess, like a lot of stuff in tech, right?
  • 1:50 It's like, what does your scaling story look like, right?
  • 1:54 To be one of those boring people of like, if it's just something that you're writing for
  • 1:59 yourself to run it once and throw it away, then, you know, thinking about like the language
  • 2:04 you use, like, you just want to reach for whatever is the most familiar to you, or I guess increasingly
  • 2:10 nowadays, like, whatever you think, chat GPT can one shot a reasonable approximation of
  • 2:17 what you want it to do.
  • 2:18 And then you can tweak it before you run it.
  • 2:20 But yeah, so like that way more than I care to admit.
  • 2:23 I mean, it's great, because I feel like there's a lot of stuff around that where there's like
  • 2:27 scripts that previously we just wouldn't have written.
  • 2:30 And then now just being like, hey, I want to pull this data from the GitHub API and previously
  • 2:34 be like, oh, it's possible, but don't really want to spend like two hours on this.
  • 2:38 And then it's not like, well, I'll spend 20 seconds asking chat GPT and look at the output.
  • 2:44 And if it's wrong, then it doesn't matter.
  • 2:45 But yeah, so I guess that's the first thing is like, so for me personally, like I tend to
  • 2:52 reach for like the smallest, dirtiest, filthiest scripts for Bash because I'm pretty comfortable
  • 2:58 in Bash.
  • 3:00 There's, Bash has like a huge amount of gotchas though.
  • 3:02 So as soon as it becomes even slightly load bearing, even for you, you probably want to
  • 3:08 go to like a, no offense, Bash authors, like a real language.
  • 3:12 And at that point, you know, stuff's pretty interchangeable.
  • 3:15 Like if we're on a Ruby podcast, so like Ruby is really good for like standalone, single
  • 3:22 file, CLI scripts.
  • 3:24 That's what I would tend to kind of go for straight away.
  • 3:27 If you're a Python person, Python's pretty good for that type of stuff as well.
  • 3:30 I think like, you know, if people don't have familiarity with those, I'd be surprised if
  • 3:35 they listen to a brewery podcast.
  • 3:36 But then, you know, I'm sure you can probably do equivalent stuff in C sharp and various other,
  • 3:44 right.
  • 3:45 More obscure languages.
  • 3:46 But like, I guess that's where I would tend to go next is just be almost like, okay, how
  • 3:50 can I put it in a single script?
  • 3:52 And you can do some kind of neat stuff with, most people are familiar with bundler for installing
  • 3:58 dependencies.
  • 3:59 But then most people are also like, okay, like bundler, I have to do like bundling stall
  • 4:03 and bundle exec and all this type of stuff.
  • 4:05 But actually, you can do some cool stuff with bundler where you can actually define a gem
  • 4:09 file inside the script itself.
  • 4:13 So the first thing it does is checks all its dependencies and installs them all.
  • 4:17 So that can be, again, quite a nice way of extending some little basic scripts.
  • 4:23 Yeah, I just want to back up on that for a minute, because I ran into that somewhere.
  • 4:27 I can't remember where, but yeah, it's just its own little syntax in there, isn't it?
  • 4:31 What exactly do you have to do in order to?
  • 4:33 Yeah, I can't remember the exact syntax off the top of my head.
  • 4:36 But yeah, basically, like, I mean, that's the nice thing about the state of bundler and
  • 4:41 Ruby in 2025 is if you're installing an even vaguely modern Ruby, it's going to come
  • 4:46 with a vaguely modern Ruby gems and bundler out of the box.
  • 4:50 And then everything essentially you can do through the CLI, you can also do through the
  • 4:54 Ruby APIs instead.
  • 4:55 And that means that essentially every input that you would previously have passed in as
  • 5:00 a parameter, you can pass in as a string or like your gem file, instead of reading it
  • 5:05 from disk, you can like have that be like a here doc in your Ruby script or whatever it
  • 5:10 Yeah, like, so that's a nice way of getting there.
  • 5:13 So like, that's what I will tend to do is have like a little bit at the top of maybe one
  • 5:17 of my scripts that's like, hey, if I need this particular gem, then install this gem at the
  • 5:22 And then I don't need to like carry along the script and a gem file and whatever, but I
  • 5:28 can just run it wherever I need to and however I need to.
  • 5:30 Yeah, I did find that you require a bundler inline and then you do gem file do, and then you
  • 5:39 basically put all your gem file stuff in there.
  • 5:41 So you do your source, which is probably rubygems.org.
  • 5:45 And then you gem whatever.
  • 5:46 And yeah, you just use your, the domain specific language for the bundler for the gem file.
  • 5:52 Yeah.
  • 5:53 And off it goes.
  • 5:54 It's pretty cool.
  • 5:55 So then when your script's getting a little bit more, I guess, load bearing, as we were
  • 6:00 saying as well, like that might be when you want to be like, hey, I want to have some
  • 6:05 like options parsing.
  • 6:06 And like the most basic way of doing that is just, you know, you've got the argv like array
  • 6:12 and you can go and say, okay, what's the first parameter, second parameter.
  • 6:14 But if you want to handle flags and switches and being passed in different orders, there's like
  • 6:19 the Ruby, again, part of the standard library, there's the Ruby kind of option parser library,
  • 6:24 which is pretty good, pretty easy to use.
  • 6:26 If you're still in bash land, there's like sort of a bash equivalent.
  • 6:28 But in my mind, even by the time I start getting towards like multiple argument parsing, it's
  • 6:34 like, that's again, a nice sign that I probably want to go into Ruby and use that kind of richer
  • 6:39 library.
  • 6:40 And there's also various gems that provide different DSLs for whatever your preferences are
  • 6:45 Yeah, that makes sense.
  • 6:46 I know a lot of people also use Optimist used to be called Trollop.
  • 6:50 If you're been around for a while and it's like Optimist, it's the same thing.
  • 6:55 So do you have a preference?
  • 6:57 It's funny because I tend to, I tend to like not, I tend to use just the most basic, like
  • 7:07 I'm going to pull stuff out of argv until it hurts.
  • 7:12 I think it's also because I've been around in Homebrew and Ruby and whatever, like long
  • 7:16 enough.
  • 7:17 It's like, I'm aware of all of the kind of edge cases that you get there.
  • 7:21 And like, if you delete a random part of argv or if you dupe it, or if you check for inclusion,
  • 7:28 like what the various gotchas are.
  • 7:30 So like, I wouldn't necessarily recommend other people do what I do.
  • 7:35 But yeah, but I guess I don't have a particular library that I prefer for this stuff.
  • 7:42 And Homebrew, because for a very long time, Homebrew kind of couldn't really by design use
  • 7:49 any Ruby libraries without fully vendoring them all, which was a big pain for us.
  • 7:53 Like Homebrew basically built its own argument parser and stuff like that.
  • 7:57 And even today, like Homebrew, we're a little bit, I wouldn't say suspicious of other libraries,
  • 8:02 but it's like the, we care, I guess this is a nice segue to the next thing you might start
  • 8:07 caring about with the CLI, which is like Homebrew nowadays, we really care about like the runtime
  • 8:12 and almost like how long is it going to take to essentially, you know, do the thing that
  • 8:18 you want it to do.
  • 8:19 So like how long, how long until you can print a hello world once you have all your libraries
  • 8:24 loaded and everything like that.
  • 8:25 And I think that's the type of thing where, like, if you have a script that you run once
  • 8:30 a month and it takes 30 seconds to run, you probably don't care if it takes five seconds
  • 8:34 or 30 seconds or a minute, right?
  • 8:35 Like it's, but if you have a script that you're running in your shell prompt, say, and then
  • 8:39 your shell's not going to be print, your shell prompt's not getting it printed until the script
  • 8:45 completes, all of a sudden you maybe don't want to require that library.
  • 8:50 You maybe want to do it by hand so that you can just boost it, or you may well be getting
  • 8:54 to the words of the point, which Homebrew is not quite able to do, but some of the other
  • 9:00 CLIs I've built more recently, I guess, like at Workbrew and at GitHub or whatever, it's
  • 9:05 like, okay, you maybe want to reach for another language at this point.
  • 9:08 So Ruby is really good language.
  • 9:11 There's been a lot of performance authorization work that's gone into Ruby in the last five
  • 9:15 or 10 years.
  • 9:16 But a lot of that comes from the Shopify's and the GitHub's who are not focused on how can
  • 9:22 I make a CLI run as fast as I possibly can, but they're focused on like, how can I have
  • 9:26 a long-lived Ruby process realistically running probably Rails or Sinatra or whatever, which
  • 9:31 can serve as many requests as possible as quickly as possible, right?
  • 9:35 So that has more performance implications around like memory management and garbage collection
  • 9:41 and jits and stuff like that.
  • 9:43 And things which rewards the longer execution of the application, which is the exact opposite
  • 9:49 of what a CLI does.
  • 9:50 Unfortunately, some things like Rubicop have kind of got around that by having, I forget what
  • 9:55 they call it, but there's basically a mode where you can essentially have Rubicop sitting
  • 9:58 in the background and you end up sending requests to an already running process.
  • 10:03 I guess we could maybe take that approach with Homebrew one day, but we've not yet.
  • 10:06 So instead, we're generally concerned about like, how can you, how can you shave that time
  • 10:11 How can you require as little as possible and push some logic into maybe Bash in Homebrew's
  • 10:16 case?
  • 10:17 But when you're writing like a prophecy ally, then that's, you know, that looks like maybe
  • 10:21 nowadays probably the best choices would be something like Rust or Go, depending on your
  • 10:25 Like Go, for example, is, if you're used to Ruby, it's a very sad language, I think, to
  • 10:32 write because it's, you cannot be expressive.
  • 10:34 I'm learning Go right now, so.
  • 10:36 Yeah.
  • 10:37 I mean, so how have your experiences been with that, about like going from the delights of
  • 10:42 Ruby land to Go land with the stuff?
  • 10:44 Yeah, yeah, I don't love it.
  • 10:45 I mean, I, I'm just barely getting into it, but they use it at work.
  • 10:49 So, um, yeah, backend engineer encompasses Ruby and Go.
  • 10:54 Yeah.
  • 10:55 And mostly I get away with not doing a lot of Go, but yeah, they, they kind of expect and
  • 11:02 need you to, so.
  • 11:03 Yep.
  • 11:04 Yeah.
  • 11:05 It's, I don't know, I feel like there's, there's definitely been several schools of languages
  • 11:09 languages where the, the underlying methodology is like, stop people from doing stupid stuff.
  • 11:16 And Ruby feels like it's almost as far in the other extreme as you can do, where it's
  • 11:22 like, you can, I mean, I'm sure you've reviewed some absolutely heinous Ruby code of the years
  • 11:27 where people have taken metaprogramming to an absurd Goldberg level where it's impossible
  • 11:34 to figure out what's going on, but that also allows you to build incredible DSLs and rails
  • 11:39 and all of this stuff, right?
  • 11:41 In Go, I'm sure you have the same Charles.
  • 11:43 I just ended up feeling like, you know, this like 20 line switch statement could be one
  • 11:48 line of code in Ruby, but you know, you don't let me have the, you know, you've taken away
  • 11:53 the keys to this particular car.
  • 11:54 So I guess I have to write the 20 line switch statement.
  • 11:56 Yeah.
  • 11:58 I just have to say, I mean, to a certain extent, like control flow and things like that, it's
  • 12:03 all the same, you know, there's some funky stuff with like variable, variable assignment
  • 12:08 and functions and things like that.
  • 12:09 But yeah, it doesn't light up my soul like Ruby does.
  • 12:12 Yeah.
  • 12:13 So like Go feels in many ways to me, like a sort of much less verbose Java.
  • 12:19 And like, I wrote a bunch of Java back in the day when it was peak Java enterprise beans and,
  • 12:26 you know, all of this like excessive boilerplate.
  • 12:29 And there's a lot less of the boilerplate in Go, but it still feels like there's non-zero
  • 12:33 amounts.
  • 12:34 But yeah, so as I say, I would still consider reaching for Go for a CLI if you really care
  • 12:39 about that like execution performance.
  • 12:42 So for example, I guess when I was at work previously, I was working on the CLI there,
  • 12:50 which wrapped around homebrew CLI.
  • 12:53 So we wanted to provide as little overhead as possible.
  • 12:55 And the amount of stuff you can do in 0.1 of a second on modern hardware in Go compared
  • 13:02 to Ruby is like fairly spectacular.
  • 13:03 Like in Ruby, you're really trying to make sure you avoid like any IO or significant computation
  • 13:14 Just because of the virtues of it being like a natively compiled language, you can just do
  • 13:20 an awful lot of stuff much faster.
  • 13:23 And like the multi-threaded story as well is like, because it's not the global interpreter
  • 13:28 lock or I can't remember if that's the Ruby name, but whatever the Ruby equivalent is.
  • 13:32 And you can, you can afford to just lead into the concurrency a lot harder.
  • 13:36 Yeah, that makes sense.
  • 13:37 So let's say that I want to build a CLI and I'm trying to think of like a super fun example.
  • 13:44 Let's say that I'm going to, you know, I'm going to get an open AI API key and I'm going
  • 13:49 to, you know, I'm going to make it talk to whatever.
  • 13:52 So, you know, maybe it'll talk to multiple services there.
  • 13:55 Right.
  • 13:56 So I'm doing stuff maybe with the podcasts, which is kind of what I'm imagining.
  • 14:00 So I, I hand off my audio or video to whisper and it bought a being, I got a transcript.
  • 14:09 Right.
  • 14:11 And then maybe I hand the transcript off to the LLM and it does some stuff.
  • 14:15 A lot of this stuff.
  • 14:16 I mean, you would put on the back of like a rails app or anything else too.
  • 14:19 Right.
  • 14:20 But, you know, I want to command line interface just to make it super easy for me to kind
  • 14:24 of navigate through some of this stuff.
  • 14:25 Where would you recommend I start?
  • 14:27 I mean, like for me with stuff like that tend to, in some ways, that's a kind of general
  • 14:34 question about like, how do you build software?
  • 14:35 Right.
  • 14:36 And I'm sure everyone has different views, but like the way I've always liked to do it
  • 14:41 is essentially just try and write the, well, I'll give my pre AI answer first.
  • 14:49 My pre AI answer is essentially just write the filthiest, hackiest code, assuming that
  • 14:54 no one will ever read it to just get the core thing done.
  • 14:58 So I guess in your case, it's like, okay, I want to write a script and I would point the
  • 15:02 I'm not going to do any argument.
  • 15:03 I'm just going to assume an argument has been passed.
  • 15:06 I'm going to pull out the first argument.
  • 15:08 I'm going to get the file, maybe the MP3 file or whatever from the podcast on disk.
  • 15:13 I'm then going to load that into memory.
  • 15:15 I'm then going to pass that off to open AI's transcription API.
  • 15:18 I'm then going to pull down the result of that as like JSON or whatever.
  • 15:22 Then I'm going to immediately get that, not store anywhere, stick that into opening AI's
  • 15:27 like MLM API, do something with that, bring that down and then print the output, right?
  • 15:33 And essentially build it in such a way that there's no error handling.
  • 15:36 If anything is in any way, not the happy path, then it will fail with a completely incomprehensible
  • 15:42 So like generally that's the way I like to feel out how to do things initially.
  • 15:47 And this episode is brought to you by Spreaker, the platform responsible for a rapidly spreading
  • 15:52 condition known as podcast brain.
  • 15:54 Symptoms include buying microphones you don't need, explaining RSS feeds to confused relatives
  • 15:59 and saying things like, sorry, I can't talk right now.
  • 16:02 I'm editing audio.
  • 16:03 If this sounds familiar, you're probably already a podcaster.
  • 16:07 The good news is Spreaker makes the whole process simple.
  • 16:10 You record your show, upload it once and Spreaker distributes it everywhere people listen.
  • 16:15 Apple Podcasts, Spotify, and about a dozen apps your cousin swears are the next big thing.
  • 16:20 Even better, Spreaker helps you monetize your show with ads, meaning your podcast
  • 16:24 might someday pay for, well, more microphones.
  • 16:28 Start your show today at Spreaker.com.
  • 16:31 Spreaker, because if you're going to talk to yourself for an hour, you might as well publish
  • 16:36 Like I think sometimes with like CLIs and stuff like that, it can be tempting to be like,
  • 16:41 oh, I'm going to add the options first, you know, because that's if you're almost like
  • 16:45 thinking from like top to bottom, that might be how you would think about it.
  • 16:49 But actually, like that's not really probably the thing you cared the most about.
  • 16:53 You're trying to figure out is this thing even viable or useful or whatever.
  • 16:58 And every minute you spend fiddling with options is a minute you're not figuring that out.
  • 17:02 Right.
  • 17:03 Not doing the core thing.
  • 17:05 That makes sense.
  • 17:06 And then, so one thing that I'm looking at is, so then do you just build the CLI around
  • 17:11 it so that you can say transcribe file name?
  • 17:14 Yeah.
  • 17:15 Yeah, exactly.
  • 17:16 So I, again, with this type of stuff, like I tend to go for like, keep everything in one
  • 17:22 file, like until it starts falling over.
  • 17:25 And I would, again, to start with not even necessarily use any methods until I am thinking
  • 17:31 about making things kind of dry and, you know, I'm having to call the same thing multiple
  • 17:36 times or whatever.
  • 17:37 So I just would tend to do that until it feels like it's getting too much.
  • 17:42 I don't know what that is, whether that's, you know, a couple hundred lines, 500 lines,
  • 17:45 a thousand lines, whatever.
  • 17:46 Right.
  • 17:47 And then start splitting up.
  • 17:48 As you said, if you had commands, like say you're passing like a transcribed command to do
  • 17:52 this or like a read out loud command or, you know, start a chat command or whatever, then
  • 18:00 that might be when I'm like, okay, well, logically there's like three different things this is
  • 18:03 doing.
  • 18:04 Probably the codes between them is not actually that similar.
  • 18:09 So maybe these could all split out into separate files that are stored a bit separately and
  • 18:14 included separately and whatever.
  • 18:16 And again, that's one of the pros and cons of kind of Ruby and Go.
  • 18:22 And stuff like that, because in Ruby, okay, you've got those different files, but you've
  • 18:28 now, once you split into multiple files, like if someone else is like, oh, cool scripts, how
  • 18:32 can I use it?
  • 18:33 Then it goes from being like, here's literally like the copy and pasted script contents to
  • 18:37 being like, you need to clone this repo.
  • 18:39 And here's how you run it.
  • 18:41 Yeah, exactly.
  • 18:43 So like, okay, you could make it a gem and then they could gem install it.
  • 18:46 But like, I'm showing my homebrew maintainer bias here, but I've, I personally, I really
  • 18:53 like Ruby gems and equivalents in other languages for like, I want a library.
  • 18:58 I'm writing Ruby.
  • 18:59 I want a library for Ruby.
  • 19:01 I kind of resent it when I'm like, I want to install a tool that just happens to be written
  • 19:06 I don't actually care what language this tool is written in.
  • 19:08 Right.
  • 19:09 And I have to use NPM or gem or PIP or whatever to install some random CLI.
  • 19:14 Like for me, I would always either reach for homebrew or if it's just something my mate
  • 19:18 wrote, ideally my mate just like sends me the script and I have like a dumping ground repo
  • 19:24 and I just like copy and paste that file into my repo and then I can run it or modify it
  • 19:28 as I choose in future.
  • 19:29 Right.
  • 19:30 So that was that.
  • 19:31 You're, you're talking around one of the things that I was going to ask, right?
  • 19:34 Because if it's just one file, it's like, okay, stick this in your path.
  • 19:39 Make it executable.
  • 19:40 Bam.
  • 19:41 Right.
  • 19:42 But if it's multiple files, yeah, I was trying to figure out, okay, how do you package that?
  • 19:46 And I guess, yeah, you could use something like homebrew or yeah, I agree with you on
  • 19:50 the, I mean, if it's a Ruby specific tool, like rake, I don't really have a problem with
  • 19:55 it being in Ruby gems, but yeah, like the, I've used other CLIs.
  • 20:00 I think it's like the Heroku CLI or the Stripe CLI.
  • 20:03 I can't remember, but one or two of those, it was like, yeah, I had to go NPM install
  • 20:07 it and I'm going, yeah, but this is not a code tool.
  • 20:11 Yeah.
  • 20:12 And that's, yeah, I agree with you there.
  • 20:13 It's like, no, this, this belongs in homebrew or apt or yum or, you know, whatever, whatever
  • 20:21 your package manager is for your operating system, where it's going to pull it in and say, hey,
  • 20:25 this is a utility you're going to use for other things.
  • 20:29 Right.
  • 20:30 It's an application essentially that runs on top of your OS.
  • 20:33 And as a Ruby podcast, it feels like a safe space to admit this, but yeah, like I, my one
  • 20:39 is like NPM where it's like, I, ideally I don't have Node.js on my system at any given
  • 20:45 So like when, when something says like, oh, the way to do this next step, like step
  • 20:50 one, NPM install X.
  • 20:51 And so, well, actually there was a step zero, which was install Node.js.
  • 20:54 Install Node.
  • 20:55 And I, and given that this thing that you're asking me to do is nothing to do with JavaScript.
  • 21:00 Like I don't see why I have to do that.
  • 21:03 So often I'm like, okay, I then go looking and I'm like, oh, is this, is this already
  • 21:07 in homebrew?
  • 21:08 And if not, maybe I package it in homebrew for my own benefit and other people in the future
  • 21:12 But yeah, I've always felt that that's that.
  • 21:16 The kind of, I think that's a, you've brought up a bigger question there about almost like
  • 21:20 And I think that's, that's a bit more kind of messy and complicated because it, it ends
  • 21:26 up being like, well, what is the distribution method?
  • 21:28 And, and homebrew somewhat infamously, I think it might be one of the first, maybe even the
  • 21:33 first to the whole, like cold to bash installer scripts that everyone is much derides, but
  • 21:39 like, you know what, if you're installing something, exactly.
  • 21:42 It works.
  • 21:43 But also like, if you're trying to install something that's kind of like non-trivial, like homebrew
  • 21:47 that involves cloning a repo and you know, again, it's like the NPM install, like we could
  • 21:53 say, okay, well, step one, get clone.
  • 21:55 And so, well, I don't have get on my machine.
  • 21:56 It's like, okay, well you need to still get, how do I do that?
  • 21:59 Well, it's still homebrew.
  • 22:00 Like, you know, whoops.
  • 22:02 I, I, I guess that's my issue.
  • 22:04 Right.
  • 22:05 Is I generally have node and NPM on my machine.
  • 22:08 Right.
  • 22:09 I'm working in rails.
  • 22:10 You know, I need some kind of JavaScript runtime.
  • 22:12 And so it's like, okay, this feels weird, but I'll do it.
  • 22:15 But yeah, if it's a pip install, cause I, I never touched Python or, you know, if, if it
  • 22:21 requires go or something like that.
  • 22:23 Now these days I'm working on go, but yeah, it's like, why do I have to install a programming
  • 22:28 language in order to get my tool when it doesn't really have anything to do with the programming
  • 22:33 language?
  • 22:34 And so, yeah, just getting into, you know, that step, I, I guess some of these come like
  • 22:41 self-packaged or when you do the install, then it'll, you know, behind the scenes, it'll
  • 22:46 install either a standalone version of the language or give you some way of building it on your
  • 22:50 machine.
  • 22:51 Or sometimes it's just an executable that's prebuilt that, you know, it has reasonable
  • 22:56 assumptions about what's already there.
  • 22:59 And so, so that works.
  • 23:01 Um, but yeah, so let's say that I am building a CLI, uh, I write it in Ruby, you know?
  • 23:10 I mean, I can tell my friend to go get clone it, right.
  • 23:13 If they're a programmer and, you know, and then it's like, okay, here's the command to
  • 23:17 run it.
  • 23:18 But yeah, let's say that it's something that's getting wider adoption and it needs that
  • 23:22 distribution, right?
  • 23:23 Where it's, Hey, you know, you're going to go run this on your own machine, right?
  • 23:27 Maybe it's a fancy CLI that cleans up large files on my hard drive or something like that,
  • 23:34 It's some other utility that, that does some of these other things, you know, it's helpful
  • 23:38 and I don't need a UI for it, or at least not a complicated UI, big graphical UI.
  • 23:43 Yeah.
  • 23:44 How do, how do I begin to package that up?
  • 23:47 So again, probably unsurprisingly, my natural response to that is like homebrew is pretty
  • 23:52 good.
  • 23:53 Distributing software, right?
  • 23:54 So with homebrew, you can kind of stick it in a repo and then call like brew create dash
  • 24:01 dash Ruby, point that at the repo and then homebrew will try its best to figure things out.
  • 24:06 And, but then, you know, if it can't, you can fiddle with that and homebrew can help you
  • 24:11 And, you know, if this is a, a thing that's pretty widespread use and you're packaging someone
  • 24:17 else's software or whatever, then you could submit it to the main repository and chances
  • 24:20 are it will be accepted fairly quickly.
  • 24:22 And then everyone can benefit that.
  • 24:24 If not, we have this thing called, called taps, which are like third party repositories, basically
  • 24:28 that you can run a command brew tap new, which basically will create a new tap for you.
  • 24:34 You can then push that up to GitHub as a repo.
  • 24:36 And we spit out some nice CI workflows.
  • 24:39 So you can use those free public repo actions minutes to put them to use.
  • 24:44 And then you could use that as your distribution method if you want instead.
  • 24:47 And then that could be a nice way of, you know, regardless of what language you write it in,
  • 24:52 if you're doing Ruby or Python or Go or whatever, then you can distribute your software that way
  • 24:57 pretty easily.
  • 24:58 So if there's any kind of setup or build step or anything like that, is there some version
  • 25:03 of like an install script or something that it runs or?
  • 25:05 Yeah, yeah.
  • 25:06 So there's like in Homebrew's Ruby formula, which is kind of like our DSL for like building
  • 25:12 and installing software, basically.
  • 25:13 There's yeah, there's like an install method.
  • 25:15 And basically you can, much like in normal Ruby, you can run a bunch of system commands
  • 25:19 in there.
  • 25:20 Like we try and do a reasonable guess of like, hey, if it's a Ruby project, you probably want
  • 25:25 to run like bundle install and then, you know, stick a Ruby file in a bin directory somewhere.
  • 25:31 And that probably gets you most of the way there.
  • 25:33 But yeah, but it's basically just like little nice DSLs that kind of help you get that software
  • 25:39 onto your machine.
  • 25:40 And it's, I think one of the nice things about Homebrew is it's definitely of most of the
  • 25:45 packaging systems I've ever interacted with.
  • 25:47 And from what I hear from people, it's one of the easiest to just get started with like
  • 25:52 an existing piece of software.
  • 25:53 Because essentially you're just like, okay, run some commands, which you can try yourself
  • 25:58 and bash and then move stuff from one place to another.
  • 26:01 And then that's you.
  • 26:02 So, I mean, in the case of Ruby, Homebrew already runs Ruby.
  • 26:06 But let's say that I reach for something like Go or Rust, or maybe I'm using Python, right?
  • 26:13 And so I can't assume that the person whose machine is going to get installed on has, you
  • 26:21 know, the language or language tools that I need in order to build and run it.
  • 26:24 How do you manage that kind of a thing?
  • 26:26 So in Homebrew, that's, we just have like a little line again with our DSL called Depends
  • 26:31 on where you can basically say, okay, I need Ruby or this particular version of Ruby or
  • 26:36 whatever it may be.
  • 26:37 Where it gets a bit more fun.
  • 26:38 And it installs that globally?
  • 26:39 Yeah.
  • 26:40 So it installs that, but Homebrew keeps track of, okay, did you ask me to install it?
  • 26:46 So say we have your OpenAI transcription thing, call it Transcribey or whatever, right?
  • 26:52 And you might install it with Bruinskull Transcribey.
  • 26:55 This episode is brought to you by Spreaker, the platform responsible for a rapidly spreading
  • 26:59 condition known as podcast brain.
  • 27:02 Symptoms include buying microphones you don't need, explaining RSS feeds to confused relatives
  • 27:07 and saying things like, sorry, I can't talk right now.
  • 27:10 I'm editing audio.
  • 27:11 So if this sounds familiar, you're probably already a podcaster.
  • 27:15 The good news is Spreaker makes the whole process simple.
  • 27:18 You record your show, upload it once, and Spreaker distributes it everywhere people listen.
  • 27:22 Apple Podcasts, Spotify, and about a dozen apps your cousin swears are the next big thing.
  • 27:28 Even better, Spreaker helps you monetize your show with ads, meaning your podcast might someday
  • 27:33 pay for, well, more microphones.
  • 27:35 Start your show today at Spreaker.com.
  • 27:38 Spreaker.
  • 27:39 Because if you're going to talk to yourself for an hour, you might as well publish it.
  • 27:44 So that would install Ruby automatically because that's what you said.
  • 27:48 But then in a year, you're like, ah, you know, Ruby sucks or whatever.
  • 27:52 I'm going to rewrite this and go.
  • 27:54 And then you switch your packaging to Go, then Homebrew knows when you ran Brewing School
  • 27:59 Transcriby, you weren't saying, hey, can I have Ruby and Transcriby?
  • 28:03 You were just, I just care about Transcriby.
  • 28:05 I don't care what Transcriby is written in, right?
  • 28:07 So then if it changes in future to Go, then Homebrew then knows like, oh, well, you never
  • 28:12 We don't need Ruby anymore.
  • 28:13 Let's give it a Ruby, right?
  • 28:15 And again, the fun thing with Go as an example is like, and this is where it gets slightly
  • 28:20 I won't go into the details unless you're really interested of like, if you're, you're
  • 28:25 building it yourself versus if Homebrew builds it for you, but if Homebrew builds it for you,
  • 28:29 then the nice thing about Go is because Go spits out binaries, then you don't even need
  • 28:34 to install Go on your system, right?
  • 28:35 You can probably use the binary that we have built for you.
  • 28:38 So then you can get rid of Ruby.
  • 28:39 You don't need Go.
  • 28:40 We need to install Go when we're building it for you in our servers, but on your system,
  • 28:45 you don't need Go unless you're building it from source, as we would say.
  • 28:49 Right, similar with Rust.
  • 28:50 Yeah, exactly.
  • 28:52 And it seems like the approach that we're taking with Ruby or Python or something that's not
  • 28:58 compiled that way, or Node is another example, right?
  • 29:02 If it's running on any of those, the install Node or install Python or install Ruby approach
  • 29:06 works fine on Linux or Mac or in the USL.
  • 29:12 Yeah.
  • 29:13 WSL, whatever it is.
  • 29:15 I am not a Windows.
  • 29:16 I help my wife with Windows, but she's not using the Linux emulator.
  • 29:20 But yeah, so that works fine there.
  • 29:24 And then if you need to package it up for something like Windows, then you're looking at another
  • 29:30 tool that's going to essentially package your language, right?
  • 29:34 It's going to put your Ruby VM in the executable so that it can run.
  • 29:39 Yeah, so that's when it starts to get a bit more messy and different languages are optimized
  • 29:43 So again, like going right back to our original, like I'm writing a CLI.
  • 29:48 So I think like one of the first questions I would probably have is like, what are the chances
  • 29:53 are that you're going to want to ship this to Windows users, right?
  • 29:57 And if, unless the chance is definitely not, then Ruby and Python and even more so things
  • 30:03 like Bash are, you know, very easy to get started across Windows and, sorry, across Linux and
  • 30:10 Mac OS from the outset.
  • 30:12 But then when you have like a Windows story, that's when it starts to get a bit more messy.
  • 30:16 Like Windows has, again, like plenty of package managers and stuff like that.
  • 30:20 But your average Windows user is not going to be familiar with those.
  • 30:25 And even a lot of Windows developers don't necessarily use like package management as widespread as
  • 30:33 it is in the Linux and Mac OS worlds.
  • 30:35 So that's when I would say like the story that Go, for example, can do for you is I'm less
  • 30:41 clued up on Rust in this way.
  • 30:42 So I might, excuse me, any Rustians who are listening that I might not know quite as much
  • 30:47 about what Rust is capable of.
  • 30:48 But certainly I know with Go, the nice thing is you can just build a single binary, which
  • 30:53 you can then have run on a Windows machine and that will work as expected, right?
  • 30:58 But the other nice thing with Go is it's the cross compilation stories very easily is very
  • 31:03 So even if you only have access to a Mac machine, you can build the binary on your Mac
  • 31:09 for all Mac OS versions, essentially, and Linux and Windows.
  • 31:13 And if you don't have access to those operating systems, you can have a reasonable degree of
  • 31:20 confidence that unless you're doing kind of wacky OS specific stuff that that binary will
  • 31:24 just run fine on all three OSes.
  • 31:26 And like that's a pretty appealing thing if you're building a CLI that you want to be used
  • 31:30 cross platform.
  • 31:31 Yeah, that makes sense.
  • 31:32 I'm a little curious.
  • 31:33 Getting into running it on Mac versus Linux, like are it seems like for the most part,
  • 31:41 things just generally work the same way.
  • 31:44 Are there meaningful differences that you need to be aware of in certain cases?
  • 31:48 Yes.
  • 31:49 I think most of the time you don't need to think too hard about things.
  • 31:54 And I think it's, it's often relatively obvious when you're sort of starting to get a little
  • 31:59 bit more detailed.
  • 32:00 So, for example, one difference would be the, I mean, you know, we're going to really nerd
  • 32:06 out on some nice OS, well, like high level OS internals here.
  • 32:11 But, you know, like macOS and Linux run different kernels, right?
  • 32:16 There's the Linux kernel and the macOS Darwin kernel.
  • 32:19 And then there's the stuff in user space as well.
  • 32:22 So like, because, yeah, like, as you mentioned, like macOS came from like a BSD kernel land,
  • 32:29 like most of the user space applications are BSD.
  • 32:32 And on Linux, most of the user space applications might be GNU ones, right?
  • 32:37 And Apple won't use those because of GPLv3, which is a whole other long and very boring
  • 32:43 But yeah, so basically, like, if you're calling out to various, say, like even GRET, right?
  • 32:50 GRET has arguments that will work on macOS, and they will not work on Linux in the same
  • 32:57 way, and vice versa.
  • 32:58 So you might, if you're shelling out to GRET, you might need to have like conditional logic
  • 33:04 based on the OS you're on.
  • 33:06 Or alternatively, instead of shelling out to GRET, you just say, okay, I'm going to instead
  • 33:10 like get all the lines, and I'm going to iterate over the lines in Ruby and do things that way
  • 33:17 So I think with like writing Ruby itself, like Ruby and Python are both generally written
  • 33:24 in such a way that like, pretty much everything you would ever try and do is going to be cross
  • 33:30 platform by default, right?
  • 33:31 It's just various little gotchas like shelling out or, again, I can't remember this still
  • 33:37 the case in 2025.
  • 33:38 I'm pretty sure it is.
  • 33:39 But like, by default, Linux generally ships with a Linux issue ship with a case sensitive
  • 33:45 file system.
  • 33:46 And macOS ships with a case insensitive file system.
  • 33:48 So if you're doing all your development on Mac, and you have like some file that you read
  • 33:53 in from your repository or whatever, and it's uppercase A, you know, Anteater with an uppercase
  • 33:59 A versus Anteater with a lowercase A, that will work just fine on macOS if you're inconsistent
  • 34:04 between the repo data on disk and how you've written in your source codes, but then on Linux
  • 34:11 that might block, right?
  • 34:12 So like these are types of little things that you need to care about when you're doing cross
  • 34:17 platform development.
  • 34:18 So yeah, I'm just trying to think through the rest of it.
  • 34:21 I'm imagining that, yeah, if I split things up into files, what it's going to do is it's
  • 34:26 going to put all of my files into one place, put the executable in the path somewhere, and
  • 34:32 then the executable is going to be aware of where the things are and just have that in
  • 34:37 the load path, essentially.
  • 34:38 Exactly.
  • 34:39 Now with testing, are there specific things that you do when you test?
  • 34:47 Or do you just kind of test the internal logic and assume that your flags and stuff work?
  • 34:52 So that's a good question as well, because I think particularly if you've never really written
  • 34:57 a CLI before, you would probably think, particularly once you get to like the multiple files level
  • 35:04 of like, okay, I'm going to write a bunch of unit tests for the internals and make sure
  • 35:08 that they work.
  • 35:09 My experience as a, you know, long-term CLI-er is that like, actually, that is going to cause
  • 35:17 you a lot of pain unless you have at least some tests that are actually shelling out and
  • 35:22 running the script externally, right?
  • 35:25 And we, I guess, relatively recently in Humbru, which in my mind is probably like 10 years
  • 35:32 ago, but that's recent as far as I'm concerned.
  • 35:34 So we used to have a lot of tests that were just, you know, unit tests.
  • 35:38 And then we would just find like really core functionality would break because all of the
  • 35:44 internals, all the internal APIs were working, you know, it's the, it's the tailors all this
  • 35:49 time with like unit tests versus integration tests, right?
  • 35:51 Of like, you can have all of your internal APIs working perfectly and are beautifully tested,
  • 35:56 but then when you fit them all together, things explode.
  • 35:59 So as a result, like I've always found with CLIs in particular, like really taking that sort
  • 36:05 of outside-in testing approach is really nice to ensure that you're like, okay, so say again,
  • 36:12 we're talking about this open AI CLI type thing.
  • 36:16 Like if I was writing a CI pipeline to test that, I would probably give GitHub Actions
  • 36:22 my, like either my or a test open AI key, and I would have it in CI, like actually trying
  • 36:28 to run a transcribe command on maybe like a single word or some very short amount of input
  • 36:34 data and actually making sure that as close to a real use of that application is actually
  • 36:43 being tested and working as expected because all the kind of clever, like all the clever
  • 36:48 unit tests you might have will just otherwise fall over when you need them the most.
  • 36:53 I like it.
  • 36:54 Um, I'm going to, oh, go ahead.
  • 36:57 I was going to say, so another thing you might find, I guess, as I've been talking about like
  • 37:01 CLI performance, cause it's sort of in front of my mind with this stuff.
  • 37:04 So there's a guy who's written loads of really helpful little CLIs in Rust.
  • 37:11 I forget his name off the top of my head, but we can find him, Google him later or whatever.
  • 37:14 So he's got a really nice tool he's built called Hyperfine, which is a CLI benchmarking
  • 37:21 tool, basically.
  • 37:22 Um, it does a bunch of other things, but that's what I've found it most useful for.
  • 37:26 So what that does is it takes this sort of outside in approach and you can say like,
  • 37:31 hey, I want you to run this command this many times and then tell me like what the performance
  • 37:36 characteristics are, or I want you to run this command and this command and tell me the difference
  • 37:41 between the two.
  • 37:42 So quite often when I'm doing like homebrew performance work, the way I will measure the
  • 37:47 performance differences is like that command could include like checking out a branch or
  • 37:51 you can, you should specify that as like preparatory command or whatever.
  • 37:55 So I'll say, okay, check out this branch, run this homebrew command, then check out this
  • 37:59 branch, run this homebrew command.
  • 38:01 And then it just has a nice little display of almost like, well, when you run this command,
  • 38:05 it's 1.4 times faster on average.
  • 38:08 And that varies by like, this episode is brought to you by Spreaker, the platform responsible
  • 38:13 for a rapidly spreading condition known as podcast brain symptoms include buying microphones.
  • 38:18 You don't need explaining RSS feeds to confused relatives and saying things like, sorry, I can't
  • 38:24 talk right now.
  • 38:25 If this sounds familiar, you're probably already a podcaster.
  • 38:29 The good news is Spreaker makes the whole process simple.
  • 38:32 You record your show, upload it once and Spreaker distributes it everywhere.
  • 38:36 People listen, Apple podcasts, Spotify, in about a dozen apps, your cousin swears are the next
  • 38:42 Even better, Spreaker helps you monetize your show with ads, meaning your podcast might someday
  • 38:47 pay for, well, more microphones.
  • 38:50 Start your show today at Spreaker.com.
  • 38:53 Spreaker, because if you're going to talk to yourself for an hour, you might as well publish
  • 38:58 2% like across the iterations and it will, I think it runs at 10 times by default, but you can,
  • 39:04 you could say run this a thousand times or two times or whatever.
  • 39:08 And there's like, as you might expect for kind of a beautiful, like proper CLI nerd CLI
  • 39:15 like this, you know, there's like so many different options to twiddle every possible knob to get
  • 39:20 it to work exactly how you want it to.
  • 39:21 But yeah, but if you're ever in a world where you're like, I really care about the performance
  • 39:25 implications of my CLI, like that is the best tool I've ever used and works basically exactly
  • 39:31 how I want it to, because it does that inside out testing, right?
  • 39:35 Of like actually running the actual process and then measuring the actual time that like
  • 39:42 So big shout out to Hyperfine.
  • 39:45 And yeah, the, I found it on GitHub.
  • 39:47 It's a David Peter and a short DP is his GitHub handle.
  • 39:52 And yeah, yeah.
  • 39:53 Looks like a cool tool.
  • 39:55 Cause I wanted to switch gears a little bit.
  • 39:58 Yeah, please.
  • 39:59 So I was, I wound up on your blog when I was getting ready for the episode and you have
  • 40:05 an article on here and we wound up talking about AI and it seems like it's still the hot
  • 40:12 It's funny cause over the last, I don't know, three, four or five months, I've really started
  • 40:17 to use AI quite a bit.
  • 40:19 Sometimes I use it essentially to write most of the code.
  • 40:23 And then I have people, you know, get concerned about whether AI is going to take people's jobs
  • 40:28 and things like that, which you address in your article here.
  • 40:31 It says open source maintainers thrive in the LLM era.
  • 40:34 You know, you address some of that and you talk about how people are using LLMs and things
  • 40:37 like that.
  • 40:38 I'm just wondering like what, what's your experience using LLM tools like Cursor or
  • 40:44 And then the other question I have is, and you kind of address it here is, is there any hope
  • 40:49 for the people that are freaked out that AI is going to take their programming job?
  • 40:53 So I guess I'll make sure I get to both of those.
  • 40:57 But yeah, I guess the experience wise, I've been probably using some sort of tools and
  • 41:04 some Cursor capacity since the very early days.
  • 41:07 So like back when Copilot was still an internal alpha at GitHub based on, I think GPT two to
  • 41:17 Yeah.
  • 41:18 And OpenAI had publicly not really done anything except released a bunch of papers.
  • 41:22 Like I, I was asked to test it internally, essentially.
  • 41:26 And like, I was known for being the type of person who was good.
  • 41:30 If you wanted honest opinions of the things I was testing, because regardless of the political
  • 41:35 consequences, if you asked me to test something and I thought it was all trash, I try and be
  • 41:39 But like, I would not tell you that it was great.
  • 41:42 I would tell you that it was not great.
  • 41:44 But yeah.
  • 41:45 So I remember trying this and being like, this will, because I'm sure people, it's almost
  • 41:50 hard to even remember.
  • 41:51 But like, if you put yourself back in whatever this was, like 2021 or something like that,
  • 41:57 like, you know, if someone had described what you're able to do now with Copilot or Cursor,
  • 42:02 and they said, I built a thing that does this, you would be like, your eyes would roll out
  • 42:06 your head.
  • 42:07 And then you'd be like, okay, like, yeah, whatever.
  • 42:09 Like, I've seen a lot of autocomplete.
  • 42:11 Like, it always sucks.
  • 42:13 It just gets in the way.
  • 42:15 It's not useful.
  • 42:16 Like, I write Ruby now.
  • 42:17 The autocomplete in Ruby sucks.
  • 42:19 I don't really care and I don't really miss it anymore because I've got used to it and
  • 42:23 whatever.
  • 42:24 This is just nothing that I care about.
  • 42:26 Right.
  • 42:27 And I tried it.
  • 42:28 And like, my almost immediate reaction was like, even when it was way more limited, was
  • 42:33 like, wow, this is, this is not like radically transformative yet.
  • 42:37 This is not incredibly workflow changing yet, but this is really good.
  • 42:41 And this is a lot better than I expected.
  • 42:43 And ironically, you could build a pretty damn good autocomplete without any
  • 42:49 specific knowledge of Ruby as a language, but just using this kind of LLM technology.
  • 42:54 And I said to the team, I was like, yeah, I assumed this would be complete garbage and
  • 42:59 it's actually good.
  • 43:00 Well done.
  • 43:01 Like, can I keep using this, please?
  • 43:03 So I guess I went from that to using Copilot.
  • 43:06 I just want to chime in.
  • 43:07 That kind of lines up with my early experience with a lot of it where it was, it was a little
  • 43:12 beyond autocomplete and it didn't always give me what I wanted.
  • 43:15 Like, sometimes it was like, you are assuming that I am doing something wildly, drastically
  • 43:20 different from what I'm doing.
  • 43:21 But it was, it was right often enough to where it was like, oh, okay, I'm, I definitely want
  • 43:28 And I think that's the thing, like in the early days, particularly, um, and I think maybe some
  • 43:33 people who tried stuff out too early have over-indexed on this.
  • 43:36 I, I think it was very personal in terms of like, what's, what's the hit rate?
  • 43:41 Because, I mean, I find this with software engineers in general, right?
  • 43:45 Is there some software engineers I know who will look genuine, completely genuinely without
  • 43:51 any sense of irony will express, but this only solves the customer problem 99% of the time.
  • 43:58 Therefore it's pointless 1% of the time, why would you ever do that?
  • 44:03 And so, well, actually for most people, if this makes things a hundred times faster, 99%
  • 44:08 of the time, which I'm not saying AI does, but like in some decorative software cases, things
  • 44:13 do that's probably an enormous amount of business value for a lot of people.
  • 44:16 Right.
  • 44:17 But there's, we have, and I don't think it's necessarily a bad thing, but we, we tend
  • 44:21 to have a streak as a, you know, we're literally the people of zeros and ones.
  • 44:26 So it's like, we want things to be perfect.
  • 44:29 And when things aren't perfect, it's easy to kind of fall into the, like, well, why did
  • 44:33 Like, you know, what's the point?
  • 44:34 Yeah.
  • 44:35 And I, I definitely think there was only LLMs, like, um, the only copilot.
  • 44:39 It's like the auto-completion was, you know, if that's wrong 50% of the time, there's a
  • 44:45 lot of people who just find it really, really annoying.
  • 44:48 Whereas I'm the type of person.
  • 44:49 But it sped me way up.
  • 44:51 Like, whereas I, I think I'm lazy enough that I'm like, if 50% of the time I can just like,
  • 44:57 I'm, I'm a reasonably fast typer.
  • 44:59 I was never one of those like hyper fast.
  • 45:01 I've switched to the Vorak because it gets me an extra 10 per second, whatever, like them
  • 45:07 keyboard warrior types.
  • 45:09 So for me, like, I'm like, oh yeah, you know, like half as much typing some of the
  • 45:13 time is well worth it for me.
  • 45:15 And I, I can, I feel able to ignore the visual noise of it always trying to prompt me to do
  • 45:21 the wrong thing.
  • 45:22 And some people hate that and, and I get it.
  • 45:25 Right.
  • 45:26 But yeah, I guess I would say if you're one of those people that hated that in.
  • 45:29 This episode is brought to you by Spreaker, the platform responsible for a rapidly spreading
  • 45:33 condition known as podcast brain.
  • 45:35 Symptoms include buying microphones you don't need.
  • 45:38 Explaining RSS feeds to confused relatives and saying things like, sorry, I can't talk
  • 45:43 right now.
  • 45:44 I'm editing audio.
  • 45:45 If this sounds familiar, you're probably already a podcaster.
  • 45:48 The good news is Spreaker makes the whole process simple.
  • 45:52 You record your show, upload it once and Spreaker distributes it everywhere people listen.
  • 45:56 Apple podcasts, Spotify, and about a dozen apps your cousin swears are the next big thing.
  • 46:01 Even better, Spreaker helps you monetize your show with ads, meaning your podcast might
  • 46:06 someday pay for more microphones.
  • 46:09 Start your show today at Spreaker.com.
  • 46:12 Spreaker.
  • 46:13 Because if you're going to talk to yourself for an hour, you might as well publish it.
  • 46:17 You know, maybe even six to 12 months ago, like you should check back in because things
  • 46:23 are changing.
  • 46:24 Very fast, right?
  • 46:25 Yeah.
  • 46:27 So kind of getting into the question that I'm asking, I'm enjoying this, right?
  • 46:32 I'm not saying you didn't get to the point.
  • 46:33 What I'm saying is, so like this morning, right?
  • 46:37 Or last night, I think it was last night.
  • 46:38 I started it and then this morning I finished it.
  • 46:40 But, you know, I'm expanding my podcast hosting system, which also does courses and summits
  • 46:47 and coaching and podcasts and screencasts, right?
  • 46:50 Because that's all stuff I want to offer off of the back of the podcast, right?
  • 46:54 I was like, okay, well, I've got this multi-tenant setup going and so I need people to be able
  • 46:59 to sign up, right?
  • 47:00 And actually pay me to use the system.
  • 47:01 And so I said, hey, I need a signup form.
  • 47:04 And I mean, it wrote all the views in Rails.
  • 47:08 It wrote all the management and the admin system.
  • 47:10 It wrote, you know, and it basically worked.
  • 47:14 I mean, I had to tweak a couple of things because, you know, it was like, okay, you know, you
  • 47:19 got this wrong.
  • 47:20 And then when I asked to do something else, it changed it back.
  • 47:22 And I had to go in and say, no, actually you did it wrong the first time.
  • 47:26 But I mean, it would have taken me a day or so to figure out, you know, to actually build
  • 47:33 it out on my own, right?
  • 47:34 Go in and put everything together.
  • 47:37 It's all pretty basic stuff.
  • 47:38 But it, I mean, it just wrote it in like 20 minutes, right?
  • 47:43 And then, and then the tweaking took me probably another 45 minutes.
  • 47:47 And so I can see people looking at it and going, this thing is going to take my job.
  • 47:52 Yeah.
  • 47:53 And I understand why people think that.
  • 47:55 And I guess like, to me, it would be when someone with your level of experience, Charles, is able
  • 48:03 to do that.
  • 48:04 And there is zero tweaking.
  • 48:06 And like, I've done this 100 times in the last two weeks.
  • 48:10 And never at any point have I had to change a single character.
  • 48:14 Like, that would be when I would be more concerned about being like, well, you know, maybe I, I
  • 48:20 still think the job of being a software engineer wouldn't go away in that case.
  • 48:24 Because I think we are even outside of programming, right?
  • 48:30 My, it was cooking some sweet potato in the air fryer yesterday, right?
  • 48:34 And my wife and I both use ChatGPT and I transcribed it using voice.
  • 48:38 And she heard the way in which I speak to ChatGPT and the amount of context I gave it about
  • 48:44 like, here's some facts about my particular sweet potato and how I like it.
  • 48:49 Here's some facts about my air fryer and whatever.
  • 48:51 And she was like, wow, like you, you said a lot of stuff there.
  • 48:54 Whereas I would just be like, cook sweet potato in air fryer, right?
  • 48:58 And the prompt she would get back would be pretty poor.
  • 49:02 And the prompt I get back is amazing, right?
  • 49:03 So I guess some people talk about like prompt engineering or context engineering or whatever.
  • 49:07 But like, I think there's more to it than that.
  • 49:09 And I think there's a reason why the experts in prompt engineering or context engineering
  • 49:15 don't just happen to be like international tennis players or philosophers or whatever.
  • 49:22 Like there's mostly software engineers or at least software adjacent people.
  • 49:26 Cause like, this is still talking to computers and computers still like to be talked to in a,
  • 49:31 like LLMs like to be talked to in a different way to, you know, your CPU,
  • 49:35 but it's still sort of an art and a craft in that way.
  • 49:38 And like, I can definitely imagine almost the worst case scenario of when
  • 49:43 you're going to be writing a lot less codes by hand than you ever were before.
  • 49:46 And for some people that really bums them out and freaks them out.
  • 49:49 But I still think that job of like,
  • 49:52 I take customer requirements and turn them into software.
  • 49:55 And that's still a job, right?
  • 49:57 And that's still a hard job.
  • 49:59 And it's still a job that someone like yourself with a lot of experience,
  • 50:03 you are able to work with LLMs dramatically more effectively than a random person who started coding two months ago.
  • 50:09 Right?
  • 50:10 Yeah, I agree.
  • 50:11 There are a couple of things that you kind of talked through that I want to touch on.
  • 50:16 I mean, one of them is, yeah, you figure out what, essentially what context you have to give it, right?
  • 50:23 Yeah.
  • 50:24 So you give it all of the information it needs so it can break it down and go, okay,
  • 50:28 this is what I'm working with.
  • 50:32 And then, yeah, it'll give you a much better response.
  • 50:34 One other thing that I found that just kind of comes with experience with the LLMs is that,
  • 50:39 and this came up today, like I forgot to tell it, I'm not using Devise on my Rails app.
  • 50:44 And so it actually said, right, because I told it, I was like,
  • 50:48 you need to send an email confirmation when people sign up for the system, right?
  • 50:53 Not just a welcome email, because I need to confirm that their email works.
  • 50:56 And so it turned around and it said, I see that you're using Devise confirmable.
  • 51:01 And I immediately had to get in and stop it and say, I am not using Devise, right?
  • 51:07 And then it did the right thing.
  • 51:08 And so, you know, I had to remember that.
  • 51:10 And so some of that with the prompt engineering, yeah, you figure out what context it needs
  • 51:14 in order to make the right decision, and then you give it to it.
  • 51:17 And a lot of it, too, is just being thorough, right?
  • 51:20 So that it doesn't make any assumptions.
  • 51:23 I know we're kind of anthropomorphizing the LLM, and it's just a predictive language model.
  • 51:28 But, you know, yeah, it doesn't make any assumptions on what you want.
  • 51:32 And so, yeah, some of it's going to just boil down to, yeah, I'm the human that's giving it
  • 51:38 a proper prompt that gives me better outputs.
  • 51:41 But the other thing is, is that, yeah, I still find that I have to tweak it, or at least I have
  • 51:46 to verify it, right?
  • 51:47 Even if I didn't have to touch it, I have to verify that it does the thing, right?
  • 51:50 I have to spin up my app and go and click through it, or if it's a CLI, you know, I have to run
  • 51:56 it a couple of different ways to make sure that it's still doing what I want.
  • 51:59 And so there's that, too.
  • 52:02 And then the last thing that I'm going to just point out is, like, I'm not seeing companies
  • 52:06 laying people off saying, well, you know, we're using the LLMs to enhance the capabilities
  • 52:13 of our programmers, and so we don't need half of them anymore.
  • 52:16 We're not seeing that.
  • 52:17 What we're seeing is we're seeing companies go, we can get 10 times the work done, or,
  • 52:22 you know, five times the work done, or double the work done by having the engineers that
  • 52:26 we have use the tools.
  • 52:28 And I think that just accelerates.
  • 52:30 And I think any company that's short-sighted enough to turn around and go, we're going to
  • 52:35 lay off half of our technical workforce, their competitors are going to come in and eat them
  • 52:40 alive.
  • 52:41 Yeah, I think that's some people that speculate that's the case.
  • 52:45 Some companies hint towards that being the case, but I don't think it's.
  • 52:48 I think what you are seeing, and again, I think if we're talking about things that you can be
  • 52:52 freaked out about, is, like, there's definitely been a big drop in hiring for juniors, right?
  • 52:58 Like, there's measurable decrease in junior engineering positions.
  • 53:02 And I think there is this outstanding question of, like, again, you and I have touched upon
  • 53:07 Like, I say in that post, one of the reasons why I talk about, like, why I think open source
  • 53:12 maintainers are well cut out for the LLM era, right?
  • 53:15 Is that conversation you mentioned before, if you were talking about building something on
  • 53:21 an open source project, you could have equally been describing almost identically some contributor
  • 53:25 you've never worked with before, right?
  • 53:27 It's like, oh, well, you know, I opened an issue and then overnight, some random person
  • 53:31 I never met before appeared.
  • 53:33 They made a PR.
  • 53:34 Like, it was mostly all right, I had to make some tweaks, and then I merged it, right?
  • 53:38 Like, and I actually think the trust and verification process looks very similar, right?
  • 53:43 For someone like yourself, with a lot of experience, someone like me with a lot of experience,
  • 53:47 particularly if you have a lot of experience with one code base you've worked with for a
  • 53:51 long period of time, like, you're able to provide probably very in-depth review of a
  • 53:57 relatively large amount of code in a very short amount of time in a way that makes these tools
  • 54:03 valuable to you, right?
  • 54:04 If you were unable to do that, either because you lack the experience, you lack the context
  • 54:08 with the code base, you lack the programming ability yourself, then all of a sudden you end
  • 54:13 up in this precarious position where it's like, okay, either I go at 100 miles an hour and,
  • 54:17 like, if this stuff breaks, I won't know how to fix it.
  • 54:21 And I won't know even really how to describe to the LLM, like, what's gone wrong.
  • 54:27 Beyond just copy-pasting error messages.
  • 54:29 And when that fails, like, I'm just, shout out, look, right?
  • 54:32 Or I slow down and I say, okay, I just, I'm going to learn software the same way everyone
  • 54:38 learned software before LLMs, right?
  • 54:40 And then the people that I have to kind of have a bit of the FOMO or even potentially my
  • 54:46 management chain being like, hey, all the seniors are like 25, 50% more productive now.
  • 54:52 Why aren't you?
  • 54:54 And it's, I, I'm glad I'm not responsible for social engineering or whatever.
  • 54:58 Cause like, I think that's a really hard question of like, what are we going to do as an industry?
  • 55:04 Because we can't just say we don't hire more juniors anymore because that's not going to
  • 55:10 But at the same time, I don't think we have a really good answer for like what those juniors
  • 55:14 should definitely do to skill up, right?
  • 55:17 Like, yeah, it's hard.
  • 55:19 I like, I like, I completely agree with you.
  • 55:21 I think kind of reading between the lines on your blog post, it seems like part of the
  • 55:26 answer is having juniors or people who are at that level doing open source with it, right?
  • 55:33 Because then it's not, you don't have your boss or your company or the deadlines or things
  • 55:39 like that, where people are going, why are you taking so long?
  • 55:43 And then the other thing is, is that if you do take the extra minute, even if you're still
  • 55:48 generating the code with AI to then ask the LLM, okay, explain to me what you just did.
  • 55:53 Yep.
  • 55:54 Right.
  • 55:55 You, you can start to get context for what it did and why it did it.
  • 55:58 Now it may not be giving you the best practice, but it's giving you at least some context for
  • 56:05 what it's working with.
  • 56:06 And in some cases it is going to be best practice or at least common practice.
  • 56:11 So, and you're seeing that even with the LLMs now, right?
  • 56:13 Like the kind of study mode and chat GPT and things like that, where like I played with
  • 56:18 that a little bit myself when I've been kind of.
  • 56:20 This episode is brought to you by Spreaker, the platform responsible for a rapidly spreading
  • 56:24 condition known as podcast brain.
  • 56:27 Symptoms include buying microphones you don't need, explaining RSS feeds to confused relatives
  • 56:32 and saying things like, sorry, I can't talk right now.
  • 56:35 I'm editing audio.
  • 56:36 If this sounds familiar, you're probably already a podcaster.
  • 56:40 The good news is Spreaker makes the whole process simple.
  • 56:43 You record your show, upload it once, and Spreaker distributes it everywhere people listen.
  • 56:47 Apple Podcasts, Spotify, and about a dozen apps your cousin swears are the next big thing.
  • 56:53 Even better, Spreaker helps you monetize your show with ads, meaning your podcast might
  • 56:57 someday pay for, well, more microphones.
  • 57:00 Start your show today at Spreaker.com.
  • 57:03 Spreaker.
  • 57:04 Because if you're going to talk to yourself for an hour, you might as well publish it.
  • 57:10 Trying to learn new things that I don't want to overly lean on the LLM.
  • 57:14 And, you know, it's kind of trying to do a bit of Socratic method stuff and all this
  • 57:18 But even with, I think it's a great place with open source where, you know, there's a bunch
  • 57:23 of talented homeroom maintainers I know who are, in some cases, haven't had a tech job
  • 57:28 yet or still in college or relatively recently out of college.
  • 57:32 And, like, their code review abilities for typical expectations of, like, a new engineer
  • 57:36 are, like, completely off the charts.
  • 57:38 Like, some of them are dramatically better at code review than I am, having done it, you
  • 57:43 know, probably 10 times as long as they have.
  • 57:45 But they've had a lot of experience doing this.
  • 57:49 And I think that might be part of the junior story is that I think we cycle, we sort of had
  • 57:55 a little bit of an attitude, I think, for a while, at least in some cultures of companies
  • 57:59 I've seen where it's like, well, okay, we'll get everyone to review a bit of code.
  • 58:03 But really, like, the more senior people are going to be more responsible for doing the
  • 58:09 more in-depth, hardcore code review of, like, gnarly stuff, right?
  • 58:13 And that might be the culture that needs to change.
  • 58:16 But we're actually like, okay, rather than saying to the juniors, like, hey, you just
  • 58:20 spend 95% of your time coding.
  • 58:21 Don't worry about this code review stuff too much.
  • 58:23 You'll figure it out as you go along.
  • 58:25 Maybe we need to flip it around and be like, actually, you should spend 95% of your time coding.
  • 58:29 And don't worry about this coding stuff too much.
  • 58:33 If you read enough of other people's code, you're going to figure that out, right?
  • 58:36 And maybe that's where we go.
  • 58:39 And certainly that would be an attitude that would make you more qualified with working with
  • 58:44 LMs better, for sure.
  • 58:45 Right.
  • 58:47 You brought up code reviews, and that kind of reminded me of another thing, since we're
  • 58:50 talking about AI and things like that.
  • 58:52 So yesterday, I put in a PR at work, and I asked some folks to review it.
  • 58:56 And I got on this morning, and it still hadn't been reviewed.
  • 58:59 Whenever people get in and they see the message, I'm sure it'll get done.
  • 59:02 Anyway, when I checked it, GitHub asked me if I wanted Copilot to review my PR.
  • 59:07 So how do you feel about that?
  • 59:09 Yeah.
  • 59:10 I've actually, at Workbrew, and now at Homebrew, and some companies I've done contracting with,
  • 59:18 have enabled...
  • 59:19 In fact, I don't know if I've done this on Homebrew, actually.
  • 59:21 But basically, whenever I can, I enable Copilot review of PRs by default.
  • 59:26 And I think...
  • 59:28 Is it good?
  • 59:29 It's sort of...
  • 59:32 So it has definitely caught a bunch of stuff that humans have not caught on my PRs.
  • 59:38 Again, the false positive rate is pretty high.
  • 59:41 But if what you're concerned about is like, hey, I want to make sure that someone is going
  • 59:47 to catch my typos.
  • 59:48 Again, like another blog post I wrote a long time ago, and at this time, this was whatever,
  • 59:54 2018 or something.
  • 59:55 So we weren't even talking about AI and LLMs.
  • 59:57 But I think it still kind of holds up, is I wrote about like, I called it like robot
  • 1:00:00 pedantry, human empathy, basically.
  • 1:00:02 And what I compared in that post was like, on the one side, like people are like Rubicop,
  • 1:00:08 you can set to be like hyper anal, right?
  • 1:00:11 And like really, really pedantic.
  • 1:00:12 And people could actually be fairly tolerant of that.
  • 1:00:16 I actually quite like that when it's dialed up to 11 like that.
  • 1:00:19 But if you as a human give the same code review feedback as a Rubicop up to 11, all your
  • 1:00:26 coworkers will hate you.
  • 1:00:27 Yeah.
  • 1:00:28 Often, even if you have agreed on these coding guidelines as a group or whatever, there's
  • 1:00:33 something about like that level of pedantry about like if someone typos something 10 times
  • 1:00:38 going through and every single time being like, typo, typo, typo, typo, typo, even if you
  • 1:00:42 use the GitHub suggestion, so it's one click for them to fix it.
  • 1:00:45 Like people don't like that.
  • 1:00:47 They really hate it when humans do that to them.
  • 1:00:48 But that's the expectation that robots will do that.
  • 1:00:51 So that's one thing I found is like useful on that side.
  • 1:00:54 But then again, like I said in that post, so part of why I wrote the post at the time
  • 1:00:59 is like there'd be more and more moves like automation and stuff like that, which I thought
  • 1:01:03 was really healthy and like CI.
  • 1:01:05 But you were starting to see people being like, oh, the first time someone makes a pull request
  • 1:01:09 on my repo, we should congratulate that person.
  • 1:01:12 So let's write a bot to congratulate them.
  • 1:01:14 And I remember talking to a bunch of people and they were saying like, yeah, it just, it
  • 1:01:18 feels completely meaningless when a bot says, well done, good job.
  • 1:01:23 You're a rock star now.
  • 1:01:24 It's like, you know, it's like, I'm in some empty room by myself and, you know, over the
  • 1:01:29 tannoy came a robotic voice saying, you are great.
  • 1:01:31 You know, it's like, whereas if a human says to you, hey, well done, like I'm pumped that
  • 1:01:37 you're here, like that actually has an impact.
  • 1:01:39 So that's, and I think this is the same thing with, with kind of code review and copilot
  • 1:01:45 and these tools and whatever now is just like, you know, like copilot can give you a review
  • 1:01:50 where it points out your typo is more effectively than a human can, but copilot can't say, wow,
  • 1:01:55 that was really cool.
  • 1:01:56 Like you solved this in half the lines of code I thought is possible.
  • 1:01:59 Like this is a really elegant solution.
  • 1:02:00 Great job.
  • 1:02:02 Like, and that's again, much as like the stuff about humans and jobs and whatever, right?
  • 1:02:09 Like most of us are probably not going to be okay with spending 40 hours a week exclusively
  • 1:02:13 communicating to an LLM.
  • 1:02:14 Like we want to deal with humans who say nice things that they actually mean that are not in
  • 1:02:19 the prompt, right?
  • 1:02:20 Like, and that does have more of an impact.
  • 1:02:23 And I, I, that's, I feel the same way with like code review, where it's like, these are
  • 1:02:27 complimentary tools and the human code review and the AI code review are sort of doing different
  • 1:02:31 things, but I'm glad that they're both there and I wouldn't use one to entirely replace
  • 1:02:35 So I guess the other question that I was asking is what AI tools are you using these days?
  • 1:02:40 Yeah.
  • 1:02:41 So for me, I'm mainly using like cursor as my kind of in editor, like code completion
  • 1:02:48 thing.
  • 1:02:49 And like their agent modes kind of sporadically, but again, I use it kind of in the, in editor
  • 1:02:54 And I still use chat GPT mainly for stuff where I'm just like asking it things where
  • 1:02:59 I'm going to probably write the code myself or with a bit of help from cursor, but like
  • 1:03:03 I basically use that instead of Google.
  • 1:03:05 And then the thing that has been interesting to me recently is, so I started, everyone was
  • 1:03:11 being like, all my kind of AI forward friends were like, Oh, you need to use code code, code
  • 1:03:16 So signed up, played around code code.
  • 1:03:18 I was like, okay, this is quite good.
  • 1:03:20 But I think just because I'm an open source maintainer, like there's this GitHub agent PR
  • 1:03:28 thing where you can now, if you have co-pilot for your organization or whatever, I'm not quite
  • 1:03:32 sure how the pricing and the enabling works or whatever.
  • 1:03:34 But it works on Homebrew essentially.
  • 1:03:36 So what you can do is you can just assign an issue to co-pilot and then it will just open
  • 1:03:42 a PR that's like, okay, I've tried to solve this issue for you.
  • 1:03:45 Right.
  • 1:03:46 And this is good that we're having this conversation today because it's fairly timely because in
  • 1:03:50 the last week, Homebrew had, I think eight open bugs on the main kind of package manager
  • 1:03:55 repo that I review everything on.
  • 1:03:57 I was like, I'm just going to assign all of them to co-pilot and see what happens.
  • 1:04:01 And it's similar to the thing you described earlier, right?
  • 1:04:04 Where it was like, in most, in a couple of cases, it was like literally spot on first
  • 1:04:10 In most of the cases, it required me to do the last like 10% of the code.
  • 1:04:16 And then in a couple of cases, it was like 25% of the way they are pretty broken.
  • 1:04:21 I had to have quite a bit of back and forth.
  • 1:04:22 I ended up kind of rewriting half of myself, but even then it sort of solved the empty page
  • 1:04:27 problem for me.
  • 1:04:28 And I think it's just something about me as an open source container that it feels good and
  • 1:04:33 nice to just be like assign issue, PR, review PR, check out PR to finish it off, merge PR.
  • 1:04:41 And like, that's the flow instead of like this thing that lives in my terminal that I need
  • 1:04:45 to check and whatever.
  • 1:04:47 Yeah.
  • 1:04:48 I like, I like you, you brought up the empty page situation that that's a really good way
  • 1:04:53 of putting, right.
  • 1:04:54 Cause I'll sit there and okay, how do I need to put this?
  • 1:04:57 Okay.
  • 1:04:58 And then I can, I kind of have an idea of how I want it to go.
  • 1:05:01 And so I start kind of fiddling with it.
  • 1:05:03 And instead I can just, I can prompt the AI.
  • 1:05:06 This is what I'm building.
  • 1:05:07 And sometimes I'll ask, you know, how should I start?
  • 1:05:10 And sometimes I'll just tell it to go for it.
  • 1:05:13 And I'm sure you found this as well, but like sometimes when it's, even when it's completely
  • 1:05:19 wrong, you probably heard that, like a camera who said this ages ago, that like the quickest
  • 1:05:24 way to get a stack overflow answer is to answer your own questions with the wrong answer.
  • 1:05:31 And then everyone will jump in and be like, no, that person's wrong.
  • 1:05:35 Let me tell you how it actually is.
  • 1:05:36 Sometimes I feel like the same way with the LLM stuff where I'm like, yeah, sometimes it
  • 1:05:40 goes off and it's does something completely fucking terrible.
  • 1:05:43 And I'm like, no, that's not how you do it.
  • 1:05:44 You obviously do it like this.
  • 1:05:45 And I'm like, oh yeah, I figured out how to do it.
  • 1:05:47 Well, what's funny is that there were, there were a couple of things that I was working
  • 1:05:51 on with the, cause I'm using cursor and agent mode.
  • 1:05:54 The main reason is, is because my employer provides us with credits on copilot.
  • 1:06:00 Yep.
  • 1:06:01 On VS code, which is what I kind of gotten used to, but I don't want to use works copilot
  • 1:06:06 credits on my personal stuff.
  • 1:06:08 And so I use cursor for my personal stuff and copilot for their stuff because I'm using the
  • 1:06:12 same GitHub account for both.
  • 1:06:14 And so anyway, um, there've been a couple of times where I've told it to do something and
  • 1:06:18 it sits there and it flails, right?
  • 1:06:20 It's like, yeah, I'm going to do this.
  • 1:06:21 Oh, wait, I think I have a better approach.
  • 1:06:24 So I'm going to delete everything I just did and do it this way.
  • 1:06:26 And it'll do like two or three things.
  • 1:06:27 And yeah, I'll, I'll finally just step in and say, I've been watching you.
  • 1:06:31 And actually, I just want you to do it this way.
  • 1:06:33 And it'll just turn around that.
  • 1:06:35 Of course, it tells me I'm smart for saying that.
  • 1:06:38 Right.
  • 1:06:39 And then again, it's like, you're a machine, you, you know, but do it my way.
  • 1:06:43 And yeah, and so just because it gets it wrong, doesn't mean that it can't get it right.
  • 1:06:47 If you give it just a little more direction.
  • 1:06:49 And to just speculate widely, uh, for a minute, I also have a hypothesis that maybe the reason
  • 1:06:56 why junior hiring could be done is the people who were previously responsible for mentoring
  • 1:07:01 those juniors are now essentially mentoring their LLMs.
  • 1:07:05 Cause like, again, that, that flow you described earlier about like with rails and all they
  • 1:07:11 thought I was using device and I wasn't like that again.
  • 1:07:13 This episode is brought to you by Spreaker, the platform responsible for a rapidly spreading
  • 1:07:18 condition known as podcast brain symptoms include buying microphones.
  • 1:07:22 You don't need explaining RSS feeds to confused relatives and saying things like, sorry, I
  • 1:07:28 I'm editing audio.
  • 1:07:29 If this sounds familiar, you're probably already a podcaster.
  • 1:07:33 The good news is Spreaker makes the whole process simple.
  • 1:07:36 You record your show, upload it once and Spreaker distributes it everywhere.
  • 1:07:40 People listen, Apple podcasts, Spotify, and about a dozen apps.
  • 1:07:44 Your cousin swears are the next big thing.
  • 1:07:46 Even better.
  • 1:07:47 Spreaker helps you monetize your show with ads, meaning your podcast might someday pay for
  • 1:07:52 well, more microphones.
  • 1:07:54 Start your show today at Spreaker.com.
  • 1:07:57 Spreaker, because if you're going to talk to yourself for an hour, you might as well publish
  • 1:08:02 10 years ago, you could have described some new talented junior person that you hired, right?
  • 1:08:07 And oh, wow, they, they saved me so much time.
  • 1:08:10 And I had to do the last little bit to help move the line and whatever.
  • 1:08:13 Like, I think the flow and also like the stuff you like and the stuff that's really frustrating
  • 1:08:19 and exhausting about it is kind of the same.
  • 1:08:21 And I personally couldn't imagine a day where I spend half my days supervising agentic AI
  • 1:08:29 And then the other half doing the same thing with like junior folks who are struggling in
  • 1:08:35 Or the worst of both worlds, which we're seeing in open source now, which is someone who is
  • 1:08:40 junior, who is trying to use an AI agent to create a pull request.
  • 1:08:45 And obviously you can't really prove this, but like I had a PR today where each round
  • 1:08:51 of review, they were responding and then they, they would paste something into an issue comment
  • 1:08:55 with like the slash N characters in there rather than new lines, which makes it look like it
  • 1:09:00 And then I would ask, I'd be like, give them a bunch of comments, but then one of the comments
  • 1:09:05 would be like, Hey, like you've added two extra options to the CLI.
  • 1:09:09 Which one of those are you using?
  • 1:09:11 Do you need both this functionality or just the functionality for one?
  • 1:09:13 Because if we just say the functionality, if you only you need for one, and they would
  • 1:09:17 just completely ignore those questions and just turn it into more code.
  • 1:09:19 And I had that AI feel that I'm sure you're familiar with Charles of just like more code
  • 1:09:25 every time, every time the solution is, we're just going to add more code.
  • 1:09:28 Right.
  • 1:09:29 And it got to the point where I was like, I'm just speaking to someone's code code through
  • 1:09:34 if I wanted that, I would be using code code myself.
  • 1:09:37 So I couldn't prove it, but I just closed the PR because I was like, sorry, feels like
  • 1:09:42 I'm speaking to an AI, not human.
  • 1:09:43 And I thought to myself, I'll probably just assign this issue to copilot later and see
  • 1:09:47 how it does.
  • 1:09:48 And it's probably going to be easier than what we're doing right now.
  • 1:09:51 All right.
  • 1:09:52 Well, I've got to start wrapping up.
  • 1:09:54 So let's go ahead and do some picks and then we'll call it good.
  • 1:09:57 Before we do that, if people want to connect with you, if they have questions about homebrew
  • 1:10:01 or it sounds like you'll help people out for hire, at least you used to.
  • 1:10:06 So if there's a place for people to hire you, I'd love to have that too.
  • 1:10:10 But yeah, how do people connect with you on any of those levels?
  • 1:10:14 Yeah, sure.
  • 1:10:15 Best place for me is my website at mikemcquade.com.
  • 1:10:18 If you go there, that's got links to all my social media.
  • 1:10:20 It's got all my email.
  • 1:10:22 It's got talks or articles and all this type of stuff.
  • 1:10:25 Anything you might want to know about me.
  • 1:10:26 That's basically the best kickoff point there.
  • 1:10:29 All right.
  • 1:10:30 Well, let's go ahead and do some picks.
  • 1:10:31 I will get us started.
  • 1:10:32 Boy, it's been a while since I've done this.
  • 1:10:34 I'm trying to think of what games I've been playing lately.
  • 1:10:36 Here's one that I'll do.
  • 1:10:38 So I don't know if you do board games much, but...
  • 1:10:43 Yeah, I do a little, not a huge amount.
  • 1:10:45 Have you ever played...
  • 1:10:47 Again, like a couple of times.
  • 1:10:49 I've never been a DM or anything like that.
  • 1:10:51 Okay.
  • 1:10:52 So there's a game out there called Betrayal at House on the Hill.
  • 1:10:57 And I think there's a book or a movie or something related to it.
  • 1:11:03 Anyway, essentially, you take your Scooby-Doo gang into a haunted house and you go explore
  • 1:11:09 the house until the haunt starts.
  • 1:11:11 And then you, yeah, one of you becomes the trader.
  • 1:11:17 And so then it's the trader against the explorers until one of you wins, right?
  • 1:11:23 And so it gives you, you know, and there are two books.
  • 1:11:26 There's the trader's tome and there's the explorer's manual.
  • 1:11:29 And so the explorer's manual explains to them how they win and the trader's tome explains
  • 1:11:34 to the trader how they win.
  • 1:11:36 And the reason there are two books is because there are some things that the trader has to
  • 1:11:40 know that the explorers don't need to know or it will let help them win if they knew.
  • 1:11:47 Anyway, so it does that.
  • 1:11:48 Well, there's a version of this called Betrayal at Baldur's Gate.
  • 1:11:51 Baldur's Gate is, there's a video game, Baldur's Gate.
  • 1:11:56 But Baldur's Gate is a D&D location.
  • 1:12:00 And so if you ever look at anything that's Baldur's Gate, you'll notice it's Wizards of
  • 1:12:05 the Coast, which is the company that does D&D.
  • 1:12:07 And so anyway, so Betrayal at Baldur's Gate is Betrayal at House on the Hill with the D&D
  • 1:12:15 elements from Baldur's Gate.
  • 1:12:17 And so instead of exploring rooms, you're exploring areas and you have the cities, like the streets,
  • 1:12:26 you have indoor areas, and then you've got the catacombs underneath the city.
  • 1:12:32 And so you can kind of explore or whatever you want.
  • 1:12:36 And there are some differences.
  • 1:12:37 But yeah, the rest of the elements are the same.
  • 1:12:39 And so if you're kind of like that, it doesn't have like strong story elements.
  • 1:12:44 It really is just a, you know, an explore and then, you know, fight off the monsters game.
  • 1:12:51 But it's fun.
  • 1:12:52 And yeah, I played it with my guys group a couple weeks ago.
  • 1:12:55 Board Game Geek waits it at, I have six.
  • 1:12:58 So, you know, you're casual gamers.
  • 1:13:01 It's mildly complicated, but not so complicated that, you know, folks that just like, you know,
  • 1:13:08 a casual board game among friends wouldn't just pick it up.
  • 1:13:11 So I'm going to pick that up or I'm going to pick that came out in 2017.
  • 1:13:16 I don't know if it's still in print.
  • 1:13:18 That's the only caveat I have on that.
  • 1:13:20 And then on the other picks.
  • 1:13:22 Yeah.
  • 1:13:23 I've really gotten into using the agent mode on Cursor.
  • 1:13:29 And so I'm going to pick that as well.
  • 1:13:31 Incidentally, I was just kind of goofing around and I thought, okay, well, how much work would
  • 1:13:37 it be to get it to essentially VibeCode, a React Native app, a podcast subscription app?
  • 1:13:44 And I have to say that it did pretty good.
  • 1:13:46 It doesn't have all the features I want in it yet, but it's good enough to where I'm starting
  • 1:13:53 to think about whether or not I actually want to release the sucker onto the app stores.
  • 1:13:57 And so, you know, and I'm not a React Native developer by any means, though, again, that's
  • 1:14:03 another technology I want to pick up because we use it at work.
  • 1:14:06 So anyway, so I'm going to pick that as well.
  • 1:14:09 And then within React Native, I'm using Expo.
  • 1:14:12 Very cool.
  • 1:14:14 But yeah, Mike, what picks do you have?
  • 1:14:17 Yeah, so I guess my game related pick would probably be Avowed.
  • 1:14:23 So that was recommended to me by, I don't know if he's been on this pod before, but certainly
  • 1:14:27 legend of the Ruby community, Justin Searles.
  • 1:14:29 Oh, yeah.
  • 1:14:30 It's sort of like, you know, it's made by Obsidian.
  • 1:14:35 It's like a kind of Bethesda-esque, like story-driven RPG.
  • 1:14:40 And it's just, I don't know, like if you liked all those old school RPGs like Oblivion and
  • 1:14:47 Skyrim and whatever, it's got that vibe, but like lots of nice, like quality of life things.
  • 1:14:52 Like, so if a character ever uses a sort of bit of jargon, you can just press a button
  • 1:14:56 and then a glossary pops up that sort of defines the specific bit of jargon they use.
  • 1:15:00 And I'm like, yeah, I want this in every RPG now.
  • 1:15:02 And like, you know, if you're a mage, you have a wand that casts stuff and it doesn't
  • 1:15:08 require mana and, you know, like lots of just like little things that have annoyed me in
  • 1:15:13 So yeah, I'm enjoying just exploring that.
  • 1:15:16 I imagine it's one of those games I'm probably going to 100% just because like the world is
  • 1:15:19 interesting enough.
  • 1:15:20 Yeah.
  • 1:15:21 What's it called again?
  • 1:15:22 It's called Avald, A-V-O-W-E-D.
  • 1:15:27 And then my, I guess if you're not a gamer, like TV wise, we've been watching Tokyo Vice,
  • 1:15:33 which is pretty interesting about this guy who's a journalist and kind of lots of stuff
  • 1:15:37 like organized crime in Japan.
  • 1:15:40 That's, I can't remember what network it's on or whatever, but that's been good.
  • 1:15:44 It's only two seasons of that.
  • 1:15:45 We're about halfway through the second season enjoying that a lot.
  • 1:15:48 And then I guess on the computer land, I guess, yeah, I mentioned it already, but I would
  • 1:15:54 probably say the, the co-pilot agent mode where you can assign it from, assign an issue
  • 1:16:00 and it will then create a PR.
  • 1:16:01 There's a bunch of rough edges there, but there's something about the workflow that feels pretty
  • 1:16:07 different to like running agents locally and has a different trust model in a good way
  • 1:16:11 in that like you can let it just run arbitrary commands and it's running in some random doc container
  • 1:16:16 and GAOPS infrastructure that you don't care about compared to your local machine.
  • 1:16:20 But yeah, but for, if you're someone who lives in PRs all of the time, then it might be worth
  • 1:16:25 seeing if that's an agent flow that works for you more than like some terminal app or some window
  • 1:16:30 in your idea or whatever.
  • 1:16:32 Well, thanks for coming.
  • 1:16:33 This was fun.
  • 1:16:34 Yeah.
  • 1:16:35 Thanks for having me.
  • 1:16:36 Always a fun time.
  • 1:16:38 I'm going to go ahead and wrap us up.
  • 1:16:40 Until next time, folks, Max out.
  • 1:16:42 Max out.
  • 1:16:46 Thank you.