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
0:00
00:39:23
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




Subscribe to Python Bytes