Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#471: The ORM pattern of 2026?

Published Mon, Mar 2, 2026, recorded Mon, Mar 2, 2026
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Michael #1: Raw+DC: The ORM pattern of 2026?

  • ORMs/ODMs provide great support and abstractions for developers
  • They are not the native language of agentic AI
  • Raw queries are trained 100x+ more than standard ORMs
  • Using raw queries at the data access optimizes for AI coding
  • Returning some sort of object mapped to the data optimizes for type safety and devs

Brian #2: pytest-check releases

  • 3 merged pull requests
  • 8 closed issues
  • at one point got to 0 PR’s and 1 enhancement request
  • Now back to 2 issues and 1 PR, but activity means it’s still alive and being used. so cool
  • Check out changelog for all mods
  • A lot of changes around supporting mypy
    • I’ve decided to NOT have the examples be fully --strict as I find it reduces readability
      • See tox.ini for explanation
    • But src is --strict clean now, so user tests can be --strict clean.

Michael #3: Dataclass Wizard

  • Simple, elegant wizarding tools for Python’s dataclasses.
  • Features
    • 🚀 Fast — code-generated loaders and dumpers
    • 🪶 Lightweight — pure Python, minimal dependencies
    • 🧠 Typed — powered by Python type hints
    • 🧙 Flexible — JSON, YAML, TOML, and environment variables
    • 🧪 Reliable — battle-tested with extensive test coverage
  • No Inheritance Needed

Brian #4: SQLiteo - “native macOS SQLite browser built for normal people”

  • Adam Hill
  • This is a fun tool, built by someone I trust.
  • That trust part is something I’m thinking about a lot in these days of dev+agent built tools
  • Some notes on my thoughts when evaluating
    • I know mac rules around installing .dmg files not from the apple store are picky.
      • And I like that
    • But I’m ok with the override when something comes from a dev I trust
    • The contributors are all Adam
      • I’m still not sure how I feel about letting agents do commits in repos
    • There’s “AGENTS” folder and markdown files in the project for agents, so Ad

Extras

Michael:

Joke: House is read-only!

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:05 This is episode 471, recorded March 2nd, 2026.

00:11 It just still sounds weird.

00:12 And I am Brian Okken.

00:14 I am Michael Kennedy.

00:15 And this episode is sponsored by all of you guys and us.

00:21 So everybody that helps send some money our way through taking a course at Talk Python Training or a pytest course at pythontest.com or reads one of our books.

00:32 We're also Patreon supporters.

00:34 Thank you, Patreon supporters.

00:35 If you would like to send out, we get a lot of, we do a lot of research ourselves, but we also get a lot of tips from other people.

00:42 So if you'd like to have feedback, if you disagree with something or want to add to the conversation, go ahead and connect with us on BlueSky, Mastodon.

00:52 I think that's it.

00:54 Or just at pythonbytes.fm.

00:56 There's a contact form there.

00:58 You can also subscribe to the, actually one of the best ways is you can go over to pythonbytes.fm and subscribe to the email list.

01:06 And when you get an email, then you'll know our email address and then you can just send us stuff through there.

01:12 That gets to us.

01:14 Also, if you'd like to join the show live, that's fun.

01:17 Go ahead over to pythonbytes.fm/live and you can find out how to get, watch the show live.

01:25 With that, let's kick it off with the first topic, Michael.

01:28 Let's do it.

01:29 So this first topic is an article that I wrote, more of a design pattern that I would like to advocate for.

01:36 Okay.

01:37 Now, you see, Brian, I have this friend.

01:40 His name is Claude.

01:41 He's really good at writing code, but he gets super distracted.

01:44 Claude code.

01:45 So I've been thinking a lot about what does agentic programming and people leveraging these tools mean for like design patterns and architecture.

01:55 I'm a big fan of thinking about architecture and so on.

01:57 So I wrote this up.

01:59 It got super popular on Reddit and I thought I would share it here as well.

02:04 You know, popular in the sense that like lots of comments, lots of upvotes, but also a lot of like mean comments because it's Reddit.

02:11 So that's how it goes.

02:12 But good comments too.

02:14 First of all, I want to put this out as a disclaimer.

02:17 As you think about this, don't try to adjudicate whether or not people should be using AI for coding.

02:23 Don't try to adjudicate whether AI coding should exist, whether it is bad or good.

02:29 It exists.

02:29 People are using it.

02:30 If that's true, what should we do as an industry?

02:34 How should we consider, how should we move forward?

02:36 How should we think about this, right?

02:37 Are there things that would make that better or worse, right?

02:40 You yourself can decide you're not using it.

02:41 But as an industry, I think it's pretty clear that it's being highly adopted.

02:44 So that's kind of the goal that I had when I wrote this article.

02:48 Yeah.

02:49 And so the title is Raw Plus DC.

02:52 So as in Raw Database Queries and DC is in Data Classes.

02:57 And the subtitle is The ORM Pattern of 2026?

03:02 And I'm putting that out there because I think this is a pattern that is much,

03:06 much more aligned to the way AI coding works.

03:09 Why do people like ORMs?

03:10 And technically for this, I use what's called an ODM, an Object Document Mapper,

03:14 because I was using the example I extracted it from was written against MongoDB.

03:18 But whatever, like it's immaterial, whether it's Mongo or Postgres, okay?

03:23 Or SQLite.

03:24 People, developers love ORMs and ODMs because they provide type safety, especially with like document databases.

03:33 They constrain what can and cannot go into the database, right?

03:37 You got to match the class and then the class goes in the database.

03:40 You don't just stick dictionaries in there, which is otherwise the case.

03:43 They prevent SQL injection or Mongo query injection because they always,

03:49 by the way they work, use parameterized queries.

03:51 They're a nice abstraction.

03:52 Also for developers, they provide really good IDE auto-completion.

03:57 So I have a function.

03:58 I give it a type or even the type is just discovered through type inference that it returns this class.

04:03 When I get one back and I say thing from the database dot, it gives me a list of all the stuff I can do in the database.

04:08 All these things are awesome, right?

04:10 Yeah.

04:10 But here's the thing.

04:12 I ran to this literally this morning working on this project that I've not yet released,

04:17 but we'll talk about pretty soon.

04:18 These AI tools are trained so much more on raw queries than they are on any particular ORM.

04:27 So for example, I was using Beanie on this project.

04:30 Beanie is downloaded 1.4 million times a month, which actually is really impressive.

04:34 So Beanie is the ODM for talking to MongoDB.

04:37 The underlying library that lets you talk in the native query syntax is downloaded 74 million times per month.

04:44 That's 53 times more.

04:45 And there's other libraries for talking directly to Mongo as well, right?

04:49 So there's like 50, 75 times more bits of code out there that are actually just talking directly to the database than using this particular ORM.

05:00 Okay.

05:00 And that's true for SQL as well.

05:02 Like for just sticking with Mongo, right?

05:04 PyMongo is the Python version of this, but there's also people doing the native query syntax in Node, Deno, Bun, PHP, .NET, whatever, right?

05:13 Like all these other languages.

05:15 So if you actually do that sort of cross product, it's probably a thousand times more that AIs see raw database queries than they see any particular ORM, even if that ORM is popular, right?

05:27 Because it's for a technology and then it's sliced down into who uses that ORM rather than across all programming.

05:33 The other thing is, so these ORMs go unmaintained, right?

05:40 I mean, Django ORM probably won't go unmaintained, but they come and they go in sort of their popularity.

05:46 So for example, Beanie, it had only like three releases in the entire year of 2025.

05:51 Its last release was four months ago to close some minor issue.

05:54 And it's got a bunch, like almost a hundred open issues, even though it's downloaded over a million times a month, it's kind of gone unmaintained.

06:01 And before that I was using Mongo engine, which is way more unmaintained than Beanie.

06:05 Like Beanie was the exciting new one, right?

06:07 And so what do I have to do if this changes?

06:09 If I decide that it's too unmaintained, I have to completely rewrite it in a different ORM.

06:13 But if it was written in a regular, just straight query syntax, that doesn't change, right?

06:18 That's been identical for SQL since the databases came out, identical for Mongo since Mongo came out.

06:24 I mean, they add to it a little bit, right?

06:25 Like if they add a feature or something.

06:26 But generally, it's going to be the same.

06:29 So I don't have to worry about it.

06:30 These things are going on the same.

06:31 Go ahead.

06:32 I want to interject a little bit.

06:33 You threw out Django.

06:34 I was going to comment that Django might be an outlier there in that a lot of, I know there are people that use other ORMs or raw SQL with Django.

06:46 But I think it's probably a lion's share of the Django users that use the Django ORM.

06:51 And I don't think that's going away anytime soon.

06:55 I totally 100% agree with you.

06:57 But what if you decide you want to change your project to a different web framework?

07:01 Well, I would probably say the same argument is that you could probably switch to this raw SQL plus data classes from Django, the Django ORM, because there's a ton of Django stuff out there.

07:17 I'm pretty sure that the models are trained on lots of Django.

07:20 Yeah, they were pretty well trained.

07:22 So this maintained argument is not go for everything.

07:24 But it's definitely another angle, right?

07:27 Yeah, and also, I think that you probably touched on this already, but just one less dependency is one less thing you have to keep up on.

07:38 Yes, absolutely.

07:39 And it's not usually just one dependency, right?

07:42 It's like this thing depends on four others, which depend on three.

07:45 And now there's a CVE in one of them.

07:46 You're like, ah, man.

07:47 Okay, so let's – but there's reasons people like these ORMs.

07:52 I am a huge fan of ORMs because they give you back classes that are great.

07:56 So my proposed way of working is create a nice data access layer, put functions in there that are very clear, like create user, update password, whatever.

08:06 And then inside, let it be raw queries.

08:10 Let Claude write however Claude wants.

08:12 But when stuff comes out of there, it has to return some kind of class.

08:15 So I propose data classes, okay?

08:18 And I think data classes are pretty interesting here for a couple reasons.

08:22 One, they're typed, right?

08:23 They look like – you can tell them use slots.

08:26 That's just good for memory and performance.

08:28 They're typed just like if you use Pydantic or if you use any ORM generally.

08:33 So that's really good.

08:34 They're also built in, so no dependencies, as you pointed out.

08:37 And they're very, very lightweight, which is great.

08:39 Now, they have type safety in the terms of like type checking type safety.

08:44 But they don't have runtime type safety like, say, Pydantic, right?

08:47 Yeah.

08:48 So if you want – another very reasonable option would be to do a Pydantic plus raw queries.

08:53 I didn't use Pydantic because this means every query that comes back from the database gets validated.

08:59 And there's a whole bunch of machinery that runs when you're reading from the database.

09:04 But if the data in the database is wrong, it's already too late.

09:07 It doesn't matter if your class says it's too bad.

09:09 It's like, no, it's saved.

09:10 It's too bad.

09:10 It's too late.

09:11 And so maybe on the outside layer, you could use Pydantic, but in the data access layer, you could use something lighter.

09:16 That was my – that's my take.

09:18 When I posted this on Reddit, people probably like 50 times like, well, why aren't you just using Pydantic?

09:22 It's like, well, Pydantic is great.

09:24 It doesn't have to be used for everything.

09:25 So anyway, I'm going to follow up with one more thing that's pretty cool around that.

09:29 But yeah, so if you look at the performance really quick here as well, I did a nice graph of a bunch of different things.

09:37 What's like 1,000 reads look like?

09:38 What does 1,000 writes and so on?

09:40 And this graph is based on doing just raw queries without any class component because that's really the foundational – like they all have to do that, right?

09:50 So how much overhead does each style add?

09:52 And it's not exactly perfect because this raw data class style can't be faster than writing itself.

10:00 In a lot of places, it's literally the same code.

10:02 So it's just like fluctuations in the machine.

10:04 But if you look at, say, Beanie, which is based on Pydantic, so this is more or less just Pydantic.

10:10 What would Pydantic look like in this model?

10:13 It's a lot of times pretty close, but sometimes it's like five times slower.

10:16 If you look at Mongo Engine, which is another one, 15 times slower, 10 times slower, it's a big difference.

10:23 It's quite a big difference.

10:24 So this style is actually almost native speed.

10:28 There's just a few times where the serialization maybe doubles the time to read, say, 1,000 or 100 orders or something like that, but barely.

10:36 Anyway, I think it's pretty interesting.

10:37 What do you think?

10:37 Yeah, I think that one of the reasons to go with an ORM was speed of development because a lot of people don't know SQL queries that well.

10:49 But a good SQL query is not that hard to read.

10:53 Well, it can be.

10:54 But generally, they can be decent to read.

10:59 Trying to figure out how to write it might be tricky.

11:02 So that's where I think your argument of around using agents and stuff to help with this, they're going to know how to write a decent one.

11:11 And you can probably, even if it's ugly, you might be able to say, can you clean that up so it's easier to read?

11:16 Yeah, or explain it to me.

11:18 Yeah.

11:20 But anyway, I think it's valid.

11:23 It's definitely valid.

11:24 I think it's more valid now than it has been in the last couple decades.

11:28 So, yeah.

11:28 Yeah, just this morning, I asked Claude to do this thing with Beanie.

11:32 I said, oh, it would be way better if I just used a projection.

11:35 And for projections in Beanie, you have to create a subclass or a different class and then use that.

11:41 And it's like, oh, I could just use dictionaries.

11:42 Then it crashed.

11:43 Oh, I don't think I can do that.

11:44 Let me try the aggregation pipeline through Beanie.

11:46 And that didn't work.

11:47 I'm just like, could you just do it directly?

11:49 And it's like, oh, yeah, that works.

11:50 It's just, you know, it's kind of a little bit clunky.

11:53 One other thing that was really popular in the conversation about this article was what Kiva Birb is asking is, what about migrations?

12:01 Not relevant to ODMs, but certainly relevant to ORMs.

12:03 You do what everyone else does if you write straight SQL.

12:06 You write your migrations yourself.

12:08 But the thing is, like, my assumption is this pattern is most adapted to agentic coding.

12:13 If you're just doing raw straight coding yourself, stick with ORMs.

12:17 That'll handle it.

12:17 But if you're doing agentic, like, Claude Code can write a heck of a migration.

12:22 It doesn't care.

12:22 It's going to be great at that.

12:24 Yeah.

12:24 I guess I've just sort of leaned on migrations a lot.

12:29 And I actually don't really know what they do under the hood.

12:32 Yeah, I mean, what are migrations?

12:33 They are basically, they are a statically generated, like, pre-generated SQL script that says, add this field, change this field, change this type, copy these things.

12:42 It's a set of SQL steps for transforming the schema of the database.

12:48 And typically the way migrations work is it looks at the old version of the class and the new version of the class and goes, what do I got to do to write the SQL to make one go from one to the other?

12:57 You can just ask Cloud to do that.

12:59 I also really like the comment about have a data access layer, because I think that that's a good idea, even if you are using an ORM.

13:08 Yeah, thanks.

13:09 All right.

13:10 Well, that is plenty on that.

13:11 I mean, you should definitely test your code if you're going to take on this way of programming.

13:15 Yeah.

13:16 Nice transition.

13:17 I've been spending some time in the last week cleaning up, giving some love to pytestCheck.

13:24 So pytestCheck is a little plugin I wrote a really long time ago, many, many years ago.

13:31 But the last release before recently was in November, I think.

13:38 So yeah, October, November, something like that.

13:41 So I've decided to spend some time getting it back up to date.

13:45 And I did, I like all the stuff on GitHub, the activity, pulse activities thing.

13:53 So there's been three merged pull requests.

13:56 Sorry to everybody for taking so long, but it was only, I guess I only annoyed three people.

14:00 And there is, yeah, I closed a bunch of issues, eight closed issues.

14:05 Now, I did get to the point where I had only one enhancement request and no actual issues and no pull requests.

14:13 That, you know, that doesn't last very long for projects that are being used.

14:18 And I hadn't checked the little stats thing recently.

14:23 And it's used by almost 1.3-ish thousand projects.

14:29 That's fun.

14:30 Anyway, I just wanted to bring it up that that's still in the live project.

14:38 And I'm going to keep it up.

14:40 I'm still having fun with it.

14:41 I still use it every day.

14:42 So that's one of the reasons.

14:44 The changes, there's not a lot of extra features.

14:48 There was a support for raises parameter when you're doing xfail.

14:55 That works now, which that's really kind of a bug fix, but it was extra feature.

15:01 So that was a pull request.

15:02 So thank you.

15:03 But some documentation things that I've been noticing this at work, too.

15:08 If you have a new feature and you don't document it, it's like invisible work.

15:12 Why did you do that work?

15:13 So I added some documentation things.

15:17 But a lot of it was around my Pi because a lot of people are using my type checkers and

15:22 using Pi test check.

15:24 So I updated a lot of stuff.

15:27 But I guess I have got a question or kind of an open thing.

15:33 I was going to try to make it like strict compatible, but I don't think I like it.

15:38 So with strict compatible, you have to do things like return none and have a lot of extra decorations.

15:46 It's a test.

15:47 We know that Pi test tests return none.

15:50 They have to.

15:51 I think this is overkill most of the time.

15:53 So for most of I think it's cleaner just to not show that.

15:58 These are supposed to be examples of how to use it, how to use a tool.

16:02 I think it's fine to not have a lot of that stuff.

16:05 So I still do type checking on the examples, but I'm not doing strict.

16:10 So anyway, that was my two cents on that, I guess.

16:14 I think it's fine to not have type safe or type clean types, clean strict type checking results on example code.

16:24 I think it can be too much.

16:25 I think it has certainly a value, but there's plenty of times where it's just too much.

16:29 And these type checkers can definitely get out of control.

16:32 Like I had something similar with Flask where I had a Flask view method and I had a custom decorator.

16:38 And the custom decorator didn't declare its types in a way that it was identical to this really complicated, you know, app at app dot get sort of signature.

16:48 And I got these huge crazy warnings saying this function has a mismatch on the signature.

16:52 I'm like, it's called by Flask.

16:54 No one calls this function.

16:55 I don't care about expressing what its signature.

16:58 It works fine.

16:59 Just leave it alone.

17:00 You know what I mean?

17:01 Yeah.

17:01 It can go way too far.

17:03 There's some things that I need to also things I need to look at.

17:07 Because like for an example, for a test, doing something like assert one equals two makes sense.

17:13 You know that's going to fail.

17:14 That's a great example, I think.

17:16 But like the mypyth says that that's an error.

17:19 And because what, int constants aren't comparable?

17:24 I can't remember the error, but it's weird.

17:28 Interesting.

17:29 Yeah.

17:29 It can be over that last one or two percent is just, it's folly.

17:33 That's what I say.

17:35 So anyway, thanks to everybody.

17:37 And yeah, if you don't, this isn't a dead project.

17:41 Yay.

17:41 Cool.

17:42 Yeah.

17:42 Yeah.

17:42 It looks awesome.

17:43 And over a thousand projects using it.

17:45 That's pretty good.

17:46 Yeah.

17:46 And some of those have lots of stars.

17:49 So.

17:49 Nice.

17:50 Transitive stars are piling up.

17:51 Feel it.

17:52 Anyway.

17:54 Okay.

17:55 What you got next?

17:55 What I got next is I want to talk about what, something I learned through that whole discussion

18:02 around that raw plus DC design pattern that I talked about.

18:06 Somebody, somebody said, look, you are so close, but where's your validation?

18:10 I'm like, you know what?

18:11 I'm not really sure I need runtime validation when I'm reading from the database.

18:14 Maybe writing to it.

18:16 Maybe.

18:16 But anyway, I learned about a couple of really cool tools that you can use.

18:20 So for data classes, there's this thing called the data class wizard.

18:24 Ooh, a wizard has a cool wizard hat.

18:26 It's simple, elegant wizarding tools for Python's data classes.

18:30 So this is actually a super neat project here.

18:32 So, and fun docs, behold the power of data class wizard.

18:36 So what you can do, there's different ways you can use it.

18:38 You can use it through what are called mixins, which are like, they add some functionality,

18:43 you know, through inheritance.

18:45 Okay.

18:46 You know, maybe like a from JSON function, something like that.

18:49 But also lets you specify other interesting things.

18:54 Like, I didn't even know you could do this in the class definition, but basically pass

18:59 configuration values to a class, the class constructor for the type, I guess.

19:04 Anyway, you can say, hey, I have a regular data class.

19:07 But in fact, I would like it to be unconcerned with the case of the inbound data.

19:14 So somebody doesn't say C# and they write Pascal case things, right?

19:18 Like lowercase and then uppercase second bit or, you know, camel case type of things like

19:24 we do for classes for their fields.

19:26 But I want to express them as, you know, snake case is active Tupa with underscores and not

19:31 capital A, capital T sort of thing.

19:33 You can just say, oh, that doesn't matter.

19:35 And if I ever dump it out, put it back out in camel case, because that's what the people

19:38 who are working with this API want.

19:41 So this data class wizard is like a, it's like data classes, but it adds that type of functionality

19:46 to it.

19:46 Right?

19:47 Cool.

19:47 Which is super cool because my example, I said, oh, well, you just got to write a from

19:50 JSON function that like turns it into, they're like, why would you write that?

19:53 You could use the wizard.

19:55 Like, cause I didn't know about the wizard.

19:56 Tell me about this thing.

19:58 But there's other ways to use it as well.

20:00 You can have just a regular data class and mix in the JSON wizard mix in.

20:05 So then you get to and from JSON, kind of like I just described.

20:08 This is super cool.

20:09 You can have a, an env wizard.

20:11 So I can then have a data class that derives from env wizard.

20:14 And then it reads as you just instantiate it.

20:17 It reads from the environment variables.

20:20 That's neat, right?

20:21 Yeah.

20:21 So you just have a config file and has all these variables and you just say, guess what?

20:25 Those come out of my environment or doctor variables or whatever.

20:29 And yeah, pretty neat.

20:31 They've got the JSON wizard, the list wizard.

20:34 Cause sometimes you get a set of JSON and it starts as a list instead of curly braces.

20:40 And then it's hard to parse.

20:41 So, files, Toml, Toml and YAML.

20:45 You can also get ones that'll read and write Toml and YAML data classes that basically naturally

20:49 know that type.

20:50 And if you just keep going, it says you don't have to use inheritance either.

20:54 You can just create standard data classes, even hierarchical data classes.

20:58 Like here has an A class, which has a list of B types.

21:02 And those are also data classes.

21:03 And then you can just use the from dict from data class wizard.

21:08 Say it's this type and here's the dictionary.

21:11 And then boom, it's like a little factory method sort of thing.

21:14 Oh, that's especially great if the classes come from somebody else.

21:17 Exactly.

21:17 And it also does really interesting parsing.

21:21 I can't remember where it is in their documentation, but it does, coercion or of types.

21:27 I don't know exactly how they refer to it there.

21:29 But if I've got, say I have a list of integers like Pydantic, it does, or at least used to

21:34 do like one.

21:35 And then the quote two is the second entry it'll, and it knows it's supposed to be an

21:39 end.

21:39 It'll turn that into an end and stuff.

21:40 So it kind of brings a lot of what Pydantic offers to data classes, but only when you want

21:44 them.

21:45 Cool.

21:45 You're like in this place, I want to parse it and validate it, but not other times,

21:49 you know what I mean?

21:50 Stuff like that.

21:51 So anyway, I present to you the data class wizard.

21:54 It's pretty cool.

21:55 Yeah.

21:55 And hopefully it stays maintained.

21:58 Okay.

21:58 That's a good question.

21:59 Let's go.

21:59 Let's, let's go to the GitHub.

22:01 It says 3.14, I think tested at least.

22:05 Yeah.

22:05 Okay.

22:05 Two months ago it had an update.

22:07 It only has two open pull requests.

22:09 So that's pretty good.

22:10 It doesn't have 200.

22:12 Yeah.

22:13 Anyway.

22:13 Yeah.

22:14 Pretty neat.

22:14 I'm liking it.

22:15 I haven't really had a chance to use it because I just learned about it, but I like the idea

22:18 of it a lot.

22:19 Yeah.

22:20 That looks fun.

22:21 I have got a, another project that is in a similar boat that I haven't, I haven't really

22:27 tried it that much.

22:28 I downloaded it and installed it.

22:30 and what it is, is SQL light.

22:34 Oh, SQL, IDO, SQL.

22:36 SQL IDO.

22:37 I think it's gotta be SQL IDO.

22:39 That's the fun.

22:39 That's the fun.

22:39 SQL IDO.

22:41 So this is, this is a new little toy from, Adam Hill.

22:46 And, I noticed, I can't remember what, I think I saw a social media post on it or

22:52 something.

22:52 Anyway, it's a macOS SQL light browser built for normal people, apparently.

22:58 so, but it looks good.

23:01 It looks in with the little, all the emojis.

23:04 I'm thinking, wow, I think he used, maybe some agents to help build it.

23:08 And that's kind of what I want to talk about.

23:10 But, but I do like, it, it does look good.

23:13 the, the, oops, error loading page.

23:16 I don't know.

23:16 Can't, I can't look at the over the overview pictures that much more, but, it looks

23:21 like a very nice, interface to, you know, look at your SQL light databases on Mac.

23:28 So that's cool.

23:29 so why am I bringing this up?

23:30 I'm bringing it up kind of because, there was a caveat with installing it and it said,

23:37 it's a, it's a, it's, you could download the DMG and then you drag that to your app

23:43 folder or just double click it and then you start querying, but there is, it's not verified.

23:49 So it's not through the app store.

23:51 it's, it doesn't have a developer certificate yet.

23:55 so why, why am I okay with like trying this out?

23:59 Well, I think it trust is a big thing.

24:01 I trust Adam Hill.

24:02 I've seen a lot of his work.

24:04 I've seen him comment on stuff.

24:05 He works on open source projects.

24:07 and so there's some inherent trust there.

24:10 If you don't know who Adam Hill is, you don't have that of course.

24:13 but there's, there's other things I was looking at.

24:16 So I was looking at the source code a little bit and he's openly saying there's agents there.

24:22 there's an eight.

24:24 Well, cause there's an agent's file or something talking about.

24:27 Yeah.

24:27 Interesting.

24:28 It looks like it was built with Gemini.

24:30 Okay.

24:30 There's not a Claude.md, but there's a Gemini.md.

24:33 Yeah.

24:33 And that's just pointing to the agent, his agent at MD file.

24:36 and then there's, there's like some other stuff on, like there's a directory with

24:42 some to-do list ideas and stuff.

24:44 And I think, I think just being like not hiding it, I think is good.

24:48 And also another thing I checked out is the contributor because there's, I don't, so all

24:54 the contributors are him.

24:56 So I, I, I'm thinking that even if like there's a bunch of code written by agents, he's

25:03 at least looking at it enough.

25:04 And I don't know.

25:06 I'm still on the fence.

25:07 I don't know how I feel about people giving agents control of, commits, on a project

25:13 or not.

25:13 I think I'm not here for it.

25:16 You're not.

25:16 No.

25:17 So, but like what I would, if I would was, what, what would I be okay with?

25:23 having somebody, do this stuff and then commit themselves because you would

25:29 assume that they're looking at it.

25:30 But what if you just do that on a branch?

25:32 If you had, if you had the agent working on a branch committing stuff, you could always

25:35 just throw it away.

25:36 And if you're happy with it, you can merge it.

25:38 I don't know how it's different.

25:40 so.

25:41 I hear you.

25:42 I hear you.

25:42 I certainly think your branch makes it better.

25:44 A feature branch, some exploration branch.

25:46 But it would still show up as a contributor in the history.

25:48 so that's, I guess that's where I'm going with that.

25:51 Yeah.

25:51 By default, if you ask Claude to create a GitHub, a Git message, it'll put, or PR,

25:58 it'll put co-contributor at Claude.

26:00 Yeah.

26:01 So I still, I'm not, I'm still not sure how I feel about all that, but, but I do,

26:06 there's, there's just, there's other things.

26:08 So I'm thinking, I trust the developer.

26:10 I trust that I look, I look at the contributor list and I look at some of the commits.

26:15 what else am I looking at?

26:16 I'm looking to make sure that there's tests, even though, I can't read a Swift test very

26:21 well.

26:21 I don't know.

26:22 I mean, there's at least some testing going on.

26:24 so, so that, that, I guess that's, that's where I'm, I'm at with, some of

26:30 these things.

26:30 I, and I bring this up partly because I review a lot of projects, you know, for this, for

26:36 this, podcast looking at projects.

26:38 And if it looks like there are signs like a bunch of emojis, that's not necessarily bad,

26:43 but it's a sign that somebody had agents help them with it.

26:46 And actually a lot of people are really bad at writing read me.

26:49 So I'm okay with people having help writing read me.

26:52 but I'm looking for tests.

26:53 I'm looking for what the contributor things I'm looking for a lot of stuff, and trusting

27:00 the developers a big thing still, I think.

27:02 So yeah, a hundred percent with a command book, my app for managing like long running

27:08 terminal like commands.

27:09 Yeah.

27:10 I had to go through the same thing, had to get it digitally signed.

27:13 Both the app bundle itself is digitally signed.

27:16 And then you have to go through a separate process to sign digitally sign the DMG as well,

27:21 which is an utter pain for sure.

27:23 So it is a hassle, but if you have an Apple developer account, it's not too bad.

27:28 It's way less bad than iOS and app store review and those kinds of things.

27:32 It's just running it through like a series of tools.

27:34 So if Adam Hill, if you're out there listening and you want, a quick bit of help, happy

27:38 to help you get over that last hump there.

27:40 Okay, cool.

27:42 it doesn't say yet.

27:43 So I think he's planning on it.

27:44 So I know it's just, it's brutal, but like, here's another thing.

27:47 I like, I ask, I ask Claude, I'm like, all right, Claude, you got to help me.

27:50 I I'm lost here.

27:51 I do not know how to notarize this thing.

27:54 It's which is what it's called.

27:54 And then like, do I have to notarize the DMG as well?

27:57 And how do I pack it?

27:58 And I'm like, okay, here's a big long list of steps I got to set up.

28:02 And I got like, it was pretty helpful actually.

28:04 And that another thing, I guess a little bit of a tangent, right away from the trust thing.

28:09 I think this seems like a tool that Adam wanted.

28:12 And because of agents, he found time in his schedule to build it.

28:17 and we wouldn't, without it, we probably wouldn't have this tool as something we can

28:22 look at.

28:23 now trying to get people to stay maintaining projects that they can open source in a few

28:28 hours, over the time is a different story.

28:31 But anyway, I guess enough on that.

28:34 I guess I do think we're entering an entirely different era of highly personalized software.

28:40 I made this for me because I could do it in an hour and exactly it solves my problem.

28:44 maybe it's interested in you, but it's not built to be general.

28:47 It's built for me.

28:48 Yeah.

28:48 Yeah.

28:49 There's going to be some of that, but why open source it at that point?

28:51 yeah, fair.

28:53 Anyway.

28:54 Well, that would be extra work, wouldn't it?

28:56 Yeah.

28:56 Do we have any extras?

28:58 I do.

28:58 Do you got any while your screen's up?

29:00 Yeah, sure.

29:00 I'll do.

29:01 and it's all on the same sort of topic.

29:03 So, an article on, htmx.org blog, called yes.

29:09 And from Carson gross, this says, I teach computer science at Montana university,

29:15 Montana state university, and father of three sons.

29:18 And he gets the question given AI, should I still consider being a computer programmer?

29:23 Or I would translate that is into is a CS degree still worth it?

29:27 and his response is yes.

29:30 And, and I do, I, it's a great article.

29:34 enjoy reading it.

29:35 the top level thing is, programming is fundamentally problem solving using computers

29:41 and learning to control complexity while solving this problems.

29:45 I would say that that's, that's computer science.

29:48 but that's, and then a bunch of other stuff.

29:51 I think it's experience helps even, and, and background knowledge helps even if you're

29:57 using AI to help, then that's the same kind of a similar sentiment over on, Simon

30:03 Willison's blog, hoard the things, you know, how to do.

30:06 one of his recommendations here is, a big part of a big part of the skill building

30:12 softwares understanding what is possible and what isn't, and having at least a rough idea

30:16 of how those things can be accomplished.

30:19 And this helps with directing agents.

30:21 You wouldn't ask it to do things that, you know, is going to be a completely ridiculous,

30:25 I mean, an agent might go off and do something dumb, but if you ask it to, you just,

30:32 you do have to have experience to know what dumb is and what it possible is, I guess.

30:37 So, yeah, I agree with Carson that yes.

30:40 And I think I basically the short version is I believe Jevon's paradox is real and that

30:45 we're going to have more software rather than no software developers.

30:49 And we need people to oversee and guide and make decisions and trade-offs about that.

30:54 Right.

30:55 It's very hard for AI to make proper trade-offs.

30:57 Like, yes, I know I could, yes, I know I could make this an app, but my company doesn't have

31:02 a culture of putting apps out.

31:04 And we actually have this other backend system we want to, you know what I mean?

31:08 There's just like all this information that it doesn't know, or like in our industry,

31:12 here's how we do this.

31:14 And there's just a bunch of stuff that humans can bring plus the ability to break it down

31:18 into smaller problems and then give that to an AI.

31:21 You're way more likely to be successful than just like, Hey, guess what?

31:24 I need a CRM build that.

31:25 I'll be back by lunch.

31:26 Like you're going to get some form of something, but it's again, it's not highly personalized.

31:31 It's just super generic.

31:32 And if that's all you want, just go get a CMS from like some SAS and you're done.

31:36 I think one of the really interesting things is like, why do we build software at all?

31:39 You know, there's this term software engineer, right?

31:42 How well it applies.

31:43 I don't know, but a lot of times, especially in the early days of like talking about architecture

31:46 and engineering, it was all tied back to like, well, how do civil engineers do it?

31:50 And they have all these, these formalities of how they work.

31:53 And maybe that should be brought into computer engineering and programming and software engineering

31:58 and so on.

31:59 There's a really big difference.

32:01 Civil engineers built a bridge 50 times because there are 50 places the bridge need to be built.

32:06 If you build a piece of software that solves the same problem once, like you just run it again,

32:11 you copy it and run it, you build new software because you're solving a problem that in some

32:15 way has never been solved before.

32:17 So there's a difference.

32:19 There's like this, this, the part where it's never been solved before.

32:22 That's where the human brings in the stuff to the AI and the AI goes, well, there's all

32:25 these Lego blocks that we already know.

32:27 Like, all right, put those together.

32:28 But for this, I think that's what software engineering is going to become.

32:31 Yeah.

32:31 I mean, I think it has become that already.

32:33 And electrical engineering has been that way for a long time.

32:38 So, yeah.

32:38 I mean, already with like packages on PyPI and things like that, it's kind of like that.

32:42 But like with AI, it's instead of, I need an auth library so I can build a login page.

32:46 It's like, I make a login page.

32:48 Now click that together with it.

32:50 You know, it's just like another level up.

32:51 But that doesn't mean that people necessarily go away.

32:54 I hope not.

32:55 At least for another 20 years.

32:56 Yeah.

32:56 Give it, give it till, till Brian and I retire then.

32:59 All right, I got some fun extras as well.

33:02 Okay.

33:02 So, first of all, how would you like to unplug your Python and get a bit of an MTV vibe?

33:09 But it's PyTV.

33:10 Yeah, it's so fun.

33:11 So, our friends at JetBrains and a bunch of our friends who are speaking at this conference,

33:16 but are not necessarily at JetBrains, are putting on a free online Python conference,

33:20 the best Python, straight into your living room.

33:23 I feel like Max Headroom should kick off the keynote, honestly, don't you?

33:26 I love Max Headroom, yeah.

33:28 I know I did too.

33:29 But there's a bunch of great people speaking here.

33:31 Carol Willing, Sarah Boyce, Marlene, Gina, Carlton, a lot of folks we know.

33:38 And so, yeah, check this out.

33:39 It's a free online conference.

33:41 And is it this week?

33:43 When is it?

33:44 Let me look.

33:44 It must have a date, surely.

33:46 I know.

33:46 I think it is this week.

33:47 Yeah, March 4th.

33:48 So, we're recording on March 2nd.

33:49 That would be Wednesday.

33:50 So, everybody be on top of your listening to the show or miss out.

33:54 Okay.

33:54 So, that's one.

33:55 Quick shout out to that.

33:56 Next is, is AI a fad and a bubble?

34:00 Or is it an actual thing with real value that's going to change the world?

34:04 Yes.

34:04 So, remember we talked about the Sasspocalypse where like some of the legal companies and

34:11 other stuff where like their stock went way down because Anthropic published 13 markdown

34:15 files.

34:16 Well, IBM, IBM, big blue stock crashes 11% because Anthropic released some kind of markdown file

34:24 that helps convert Cobalt.

34:25 Because Anthropic threatens the Cobalt empire.

34:28 I think there's a lot of interesting stuff here.

34:30 I think Cobalt is a very interesting analogy for like pre and post agentic written code.

34:36 I can see in 20 years are like, that's some pre AI code.

34:39 We need some humans that know how to type still to come in here and look at this.

34:42 Right.

34:42 I think there's going to be that kind of like difference as we go on.

34:45 And so, I don't know.

34:46 I just wanted to throw that out there.

34:47 It's an interesting read for folks.

34:49 Yeah.

34:49 The language stuff is an interesting thing.

34:52 With things like Anthropic around, I am less scared of looking at code bases like Swift

35:00 or Cobalt.

35:01 I haven't looked at Cobalt, but I wouldn't be afraid now.

35:04 I might be able to just.

35:04 A hundred percent.

35:05 Yeah.

35:06 You need like 20% the capability you used to need to get something done or to get like,

35:12 I don't understand this.

35:13 Explain it to me.

35:14 Like, okay, now it makes sense.

35:15 Whereas before, I was just like, I don't understand it.

35:17 Well, especially if you write a test for it.

35:18 So, you write it like maybe there's a bug in some Cobalt code and you say, and you write

35:23 a test for it.

35:23 And now the agent, you can kind of trust the agent to fix it.

35:27 It'll do good review, of course.

35:29 But yeah.

35:29 Yeah.

35:30 Okay.

35:31 Quick update.

35:32 I'm absolutely in love with my 40 inch curved monitor that I told people about for.

35:37 When I first got it, I was a little wigged out by how big and rappy around it is.

35:41 It took some getting used to, but this like 5k monitor that is so giant is absolutely perfect

35:46 for all the type of work we do these days.

35:49 Next up, update est, update est, not ist.

35:53 I tried to search for it.

35:54 Update ist, I-S-T.

35:56 No, it's E-S-T.

35:57 So here's a really cool macOS bit of software.

36:00 And what you do is you just install it and it looks for all different kinds of apps that

36:05 are out of date on your system.

36:08 It looks for auto updating apps.

36:10 It looks for stuff from the app store.

36:11 It looks at homebrew.

36:13 It looks at CLI tools and it manages all of them.

36:16 So you go, oh, look, this thing's actually, that was been depending on.

36:18 It's actually out of date.

36:19 Let me push the button.

36:20 And super cool.

36:21 It's got a really nice UI.

36:22 It costs, it has money, but very little.

36:25 It costs $13 once for your entire life.

36:28 So anyway, it's pretty, seems pretty fair to me.

36:30 So very cool app.

36:31 Also Swift UI app, I believe.

36:33 I like Adam Hills.

36:34 Wait, how do you update it though?

36:36 Oh my God.

36:37 I believe it does auto update.

36:38 Okay.

36:38 If it doesn't, that would be deeply bad.

36:41 I think it uses the same thing that Command Book uses, which is called Sparkle, which is one of the most common ways to do it.

36:47 And actually it looks at all the Sparkle update feeds of all the apps installed on your system too, which is cool.

36:51 Okay.

36:52 People may have heard of Bartender, which is another Mac app.

36:55 That's cool.

36:55 Like compresses all the little widget thingies you got at the top on the right by the clock.

36:59 I love all those things.

37:00 So I go way overboard and I needed something to manage it, especially on small like recording screens.

37:05 So I had Bartender, they got bought in like a sort of underhanded way.

37:09 Like they got sold, but then nobody said they were sold for like months.

37:14 It was like, they wouldn't announce.

37:15 Anyway, it was weird.

37:16 So a lot of people moved to open source stuff.

37:18 So there's a one called Ice for the Mac menu bar, but it had its last updates like six months ago and it's clearly abandoned.

37:25 So you got ice.

37:27 Well, what if it gets stuck and frozen?

37:29 You got to thaw it out.

37:30 So now there's a popular one called Thaw, a fork of ice, the menu bar manager.

37:34 So anyway, here's a free open source menu bar manager for Mac.

37:38 That's pretty cool.

37:39 Following that weird chain of events over the last couple of years.

37:42 I don't even remember what I have.

37:45 On this computer, I still have ice running because I haven't had a chance to update it.

37:49 I just learned about this week, but it's getting thaw.

37:51 It's getting thawed out when I get done with this recording.

37:53 Getting thawed.

37:54 Yeah.

37:55 I have something that minimizes it, but I can't remember what it is.

38:00 I don't know.

38:01 Yeah.

38:01 Okay.

38:03 Well, shall we make a joke?

38:04 Yeah.

38:05 Something funny.

38:06 I know you got kids.

38:07 I have kids.

38:08 Anyone out there who has kids, well, maybe roommates as well, but especially kids.

38:13 Like they're so messy.

38:14 This joke will appreciate.

38:15 This is like a programmer take on that situation.

38:19 And the title of the joke is The House is Read Only.

38:23 Okay.

38:23 The House is Read Only.

38:25 So here's a woman named Kelly on X that posted.

38:29 It says, I have cleaned the house.

38:31 The house is now read only.

38:32 Please do not edit the house.

38:36 Yes.

38:37 Yes.

38:37 Kids.

38:38 I just put the dishes in the dishwasher.

38:41 Why is the sink full of dishes again?

38:43 I just went up to the back to clean up the other stuff.

38:46 I came back in and now it's messy again.

38:47 I can't take it anymore.

38:48 The house is read only.

38:49 It's so good.

38:50 I need this for my mother-in-law.

38:51 Yeah.

38:52 If you don't pay the mortgage, you don't get to put holes in the walls.

38:56 Just saying.

38:57 Houses read only.

38:58 Please do not edit the house.

39:02 Nice.

39:03 That's funny.

39:04 Yeah.

39:06 It's been a crazy week outside of programming.

39:09 So I'm trying to concentrate on programming.

39:12 Escape to the well-known world of structured text.

39:16 Let's go.

39:17 Anyway.

39:17 It was a fun episode.

39:19 Thanks everybody for showing up and we'll see you all next week.

39:21 Yeah.

39:22 Thank you.

39:22 Bye.


Want to go deeper? Check our projects