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


Transcript #366: Put It In The Backlog

Return to episode page view on github
Recorded on Tuesday, Jan 9, 2024.

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

00:05 This is episode 366, recorded January 9th, 2024.

00:10 Welcome to the new year.

00:13 I'm Michael Kennedy.

00:14 - And I'm Brian Okken.

00:15 - And Brian, this episode is sponsored by us.

00:17 Support our work by taking our courses, the Talk Python Training ones, the complete pytest course, and as well as through our Patreon supporters.

00:25 All those links are at the top of your show notes in your podcast player, episode page, and so on.

00:30 Connect with us over on Mastodon.

00:32 You'll find us all on Fosstodon.

00:35 That's right, Michael, Brian, and the show.

00:38 It has its own pronouns and gets thrown in the group and has its own website and all that.

00:43 So come see Python Bytes over there as well.

00:45 And if you wanna be part of the live stream, you're welcome.

00:49 That's certainly not required to take part and enjoy the show, but if you wanna be part of the live stream, pythonbytes.fm/live.

00:55 Usually you'll see some scheduled upcoming one.

00:58 You can click, you can smash the bell, crush the subscribe, all the things they say over there.

01:03 Yeah, Brian, it's been a while.

01:04 Welcome back to the show.

01:05 - It has been a while.

01:06 I'm excited to be back.

01:08 - I am too.

01:09 Thanks everyone for being patient with us while we took a little break over the winter break.

01:15 It's always a little bit tricky to juggle that kind of stuff, especially, Brian, when you're on a beach and it's 80 degrees Fahrenheit or 20 degrees Celsius, 22, something like that.

01:26 It was a windy day.

01:27 There was one day it was windy.

01:29 It was rough.

01:30 - I'm really sorry about that.

01:32 - Thank you, thank you.

01:33 I appreciate your bonuses.

01:35 - Yeah, Brian, can we maybe skip this episode because I'm in Hawaii, hanging out on the beach, sipping drinks.

01:44 Yeah, no problem.

01:45 - Yeah, no, it was lovely.

01:46 It's good to get away, but it's also really good to be back.

01:48 So yeah.

01:50 - And I missed you.

01:51 - Yeah, I missed you too.

01:52 - And everyone missed the audience.

01:55 Shall we jit it off for 2024?

01:58 Let's jit it.

01:59 - Let's jit started.

02:00 - Let's jit started.

02:03 - Okay, so Anthony Shaw.

02:06 So one of the things that's possibly, hopefully coming into Python 13 is Python 3.13.

02:12 Sorry, we're not all the way up to Python 13 yet.

02:14 We're still in 3.13 is a jit compiler.

02:18 It's, and I'm with, because of like, you know, Java and other languages, I'm familiar with jit compilers, but Python's is gonna be a little different.

02:29 So Anthony Shaw was kind enough to write up a article kind of walking through it.

02:35 And it's a really nice, there's a couple of things that I recommend reading it if you don't really know what a jit compiler is, or if like me, you didn't know what a copy and paste jit compiler or jit whatever implementation is.

02:49 So that's kind of where he goes with this.

02:51 And he starts off talking about really what a jit is.

02:55 And really it's something that basically generates your compiled code.

03:02 For a lot of times it's compiled code, machine code, but for Python, it's going to be the, not the compiled code, but the byte code.

03:10 So getting the byte code ready, I think.

03:12 I may have gotten this wrong, but he walks through kind of what a compiler is, or a jit compiler is, with the, as if you were writing it in Python.

03:25 So he goes through a little example of making your own Python version of the CPython interpreter, which is actually written in C.

03:33 But if you were to write in Python, it might look like this, like switching on op code of load construct, load constant, and things like that.

03:41 And you can see what those primitives are by using the dis module for disassembler.

03:47 And that's fun.

03:49 And then he walks through kind of, okay, so that's what a jit compiler might be.

03:56 What is a copy and patch jit compiler, not a copy and paste, copy and patch.

04:01 And that's a little bit more harder to describe over audio, but Anthony does a really good job describing it.

04:10 And then talking about really this thing, instead of like copying a piece and then running it, it copies like more than one bit, like the entire function, and then running the whole thing.

04:22 And it's a little bit faster.

04:24 And then we're gonna do something like that.

04:27 It's gonna be something like that for Python inside of the Python C interpreter.

04:32 And it's just a good walkthrough to kind of understand what is going on, what are these people doing and why?

04:39 And the why is it's gonna be a couple of things.

04:43 It's gonna be faster.

04:45 And there's some benchmarks that show it's from like two to 9% faster, which is great.

04:51 I mean, actually anytime you can make things a little faster, it's good.

04:54 But is it worth it for this?

04:56 And it's worth it for this partly because mostly it doesn't make it slower, which is the good part.

05:01 Because of this jit compiler, there's other tricks that they can do down the line to make things a lot faster.

05:08 So this is great news and a good explanation.

05:11 - It's super exciting.

05:12 Yeah, it's super exciting.

05:13 And you're on top of the news today, Brian.

05:15 Like this came out this morning.

05:17 (laughing)

05:18 Well done.

05:19 This is brand new from Anthony Shaw.

05:20 Anthony, excellent work writing this up and all the things.

05:25 So one part that's interesting is two to 9% is great.

05:30 Like that's still really good to make things faster.

05:33 But he also points out that this is just the foundation.

05:37 Like once you have a jit, there's all kinds of interesting things that jits can do on a per hardware architecture, per platform story, right?

05:47 They can say, well, you wrote this code, but I know we have these specific machine instructions, specialized machines instructions on this CPU.

05:55 So let's make it do that.

05:57 Or I see that you could actually inline this function.

06:00 Instead of just make it run faster, we could inline it over here and here and here.

06:03 And then, you know, function calls in Python are expensive.

06:06 So maybe they just become not function calls, right?

06:09 There's a lot of possibility for where things go.

06:12 It would be interesting, I wonder, you could even do things like, you know, compile stuff to C and you see optimizations as part of the JIT compiler, right?

06:21 Like maybe there's a bunch of like layers that could happen, I don't know.

06:25 But yeah, basically this is, you know, a foot in the door for compiler optimizations that we've not had before in Python.

06:32 - Yeah, yeah, it's pretty exciting.

06:34 So, yep.

06:35 Excellent, excellent.

06:36 So the future is bright.

06:38 Also compounding is interesting, right?

06:40 All right, we're supposed to get Python much, much faster by making it like a little bit faster over five years continuously, right?

06:48 And this is just part of that, right?

06:49 So you keep adding these things up and the Python, I don't know, 3.14.15 versus 3.10 when they started could be super, super different.

06:57 - Yeah.

06:58 - All right, I hope people like deploying, packaging, bundling, talking about managing your projects because that's all I got this week, right?

07:05 I got one after another.

07:06 So let's start out with this Mastodon post by Bas Nijholt.

07:11 And Bas says, "We're launching Unidep, which is a unified Conda and pip dependency management system." Okay, so we've got the Conda world, we've got the pip world.

07:22 Sometimes they kind of work together, but they're pulling from different sources.

07:26 So you can like in a Conda virtual environment, you could pip install a thing, I believe, and it would still install.

07:32 But here's the deal.

07:33 Like you can create a single requirements.yaml file and say, I depend on these different projects.

07:39 Those two come from Conda, Conda Forge or something.

07:42 These three come from PIP, IPI.

07:44 Interesting, huh?

07:46 - I'm actually excited about this.

07:48 This is very interesting.

07:49 - Yeah, it's super interesting.

07:50 It works with pyproject.toml and setup.py.

07:52 It also is good for monorepos.

07:54 So why is this good for monorepos?

07:56 Monorepos are, I don't wanna have to switch projects on GitHub.

08:02 I just want one ginormous one for a whole company.

08:04 So let's just have one, right?

08:06 Which is kind of an insane way of working, but it's also pretty interesting, right?

08:10 Like I've got two libraries, they depend on each other.

08:12 It's just all on the same project structure.

08:14 So, you know, you just version them together.

08:16 But that's literally every project for your company.

08:20 And there's different teams potentially working with different versions and with different things.

08:24 So maybe there's some data science folks and there's some web API folks and the web API folks are maybe pip and the data science folks are Conda.

08:33 So here you could express all of the requirements for the different projects through these different sources, right?

08:40 - Yeah.

08:41 - Some might be Conda, some might be PIP, but here's one way to express it.

08:44 Also, it'll create consistent Conda lock files for multiple projects.

08:48 It has a platform support and you can just uni-dep install if you want.

08:54 It's pretty cool.

08:55 So looking over at the GitHub here, yeah, pretty much, honestly, pretty much does the same thing.

09:02 But it shows you some examples of, you know, how you might express, you know, what is a Conda dependency?

09:09 What is a pip dependency?

09:10 So like in your requirements.yaml, you just have dependencies.

09:14 Let's just say numpy or you'd say conda colon, Python graph is, or you'd say pip colon graph is if you wanted that one and so on, right?

09:23 And look at this, you can even include other, you have like nested requirements.yaml, which maybe talks to the monorepo type of thing or multiple projects just in one repository, right?

09:34 Like this thing actually requires these four other things.

09:37 This is even interesting.

09:38 You know, we were talking about courses and I know you're gonna mention something about your course later.

09:43 This is actually would be really nice for courses as well to do.

09:46 And I suspect you probably could do with PIP.

09:48 I just, it never crossed my mind, right?

09:50 I might have chapter one, let's do FastAPI stuff.

09:52 Chapter two, let's add Beanie and MongoDB.

09:56 And like those have different requirements files and you might wanna just be able to express like, well, just run this one, just run this thing.

10:02 You have everything you need for the course, but you also wanna not like talk about everything before you get to it, right?

10:07 You could have like one at the top of your course repository and then every chapter have its own one of these and then just like pull them together with this, like this.

10:15 - Oh, interesting. - So they're nesting.

10:16 That's cool, right?

10:17 - Yeah, I've never really thought to do that.

10:18 - I haven't either, but it seems like I should.

10:20 I've just been copying that stuff around.

10:21 Seems like I shouldn't do that really.

10:23 Awesome though.

10:26 So, UniDepth, it's brand new.

10:29 I don't know if this thing's gonna take off and be super, super popular or if it's gonna be kind of niche, but it seems like it's solving a unique problem.

10:37 And it really is kind of a time of like a thousand flowers blooming in the packaging and dependency managing space.

10:44 Like previously we talked about Hatch.

10:45 I have more to say about Hatch later as well.

10:47 - Do you remember, did you say that it, you can use a pyproject.toml instead of a-

10:53 - Yes, you can.

10:54 - Okay. - Yes.

10:55 - It's a-

10:56 - 'Cause there's already enough YAML in my life.

11:00 - Yeah. (laughs)

11:01 Yeah, you can use a pyproject.toml.

11:03 - Cool.

11:04 - Alternatively, one can configure the dependencies in the pyproject.toml under the tool.uni-depth section.

11:10 - All right, nice.

11:11 - There you go, yeah.

11:12 All right.

11:13 Well, over to you.

11:15 - Well, I, like a lot of people, I've been doing some work over the holiday break since we also took a break from podcasting a bit.

11:24 I've been doing some open source work and I ran into, this is timely, because I ran into some problems with pull requests and wanting changes in pull requests and having some of the problems with if somebody does a pull request and their fork is on main instead of on a branch.

11:46 And so, and it causes problems.

11:49 And so instead of having to write this up as to why you should not do this, Henik beat me to the punch and wrote this great article saying, "Don't start pull requests from your main branch." And it's tempting, right?

12:04 When I first started using Git at work, even at work, so personally, when I started using Git, I just used main and just checked, I just had one branch and that's no big deal with my own stuff.

12:19 With a team, we had to decide, were we gonna use branches or forks?

12:25 And possibly not both, but you can use both.

12:28 And in open source, it's common to use both.

12:30 And what we mean is you fork the repository and you create a branch.

12:35 Why do you do both?

12:37 Because it seems like if you're gonna make a change, you just need one or the other, right?

12:41 And you can't do a branch because you don't have permission.

12:43 So you do a fork, but you do both a fork and a branch for reasons.

12:47 And the reasons are spelled out here.

12:50 First, if you didn't do that, he's giving the reasons in the sense of if you did main instead.

12:58 Why that's bad is first, you can only do one pull request at a time.

13:03 If you were gonna do your pull request off of your main branch and it's not been accepted yet, well, you can't go and do another pull request for a different change.

13:12 You can't do another fix because you've already used up your main.

13:16 Whereas if you do a branch off of that, you can have as many fixes as you want.

13:20 So that's reason number one.

13:22 But people might think, ah, I don't care about multiple stuff.

13:25 I'm just fixing the one thing I care about.

13:26 Great.

13:27 So somebody on the other end is gonna have to pull, like review it, maybe ask you for changes to maybe merge it even.

13:38 That's great.

13:39 If they end up merging your pull request, that's awesome.

13:42 But what happens then is that branch will have changes of both the main line and your branch all in this branch, your main branch.

13:52 Now that has conflicts and you're not able to pull it back to your local repository.

13:58 So pulls won't work.

13:59 And you just, I don't know what you do at that point.

14:02 You blow away your fork and start over.

14:04 - You delete your repository and you start over.

14:08 - Yeah, lame.

14:09 Okay, the third reason is the pragmatic one of getting something done.

14:16 And this is the one that bit me a couple of weeks ago is there's two reasons you're, I may be like messing this up, but you can, if you have it on main, it's and you have branch protection on, which a lot of repos do, most of most, a lot of big open source projects, the main is are locked down.

14:38 Then, and you don't want, you want to allow, it's allow edits from maintainers is meaningless at that point, because what I want to do is if there's, if somebody does a pull request and I want to accept it, but there's a minor change to it that I want to tweak it, like maybe the, I don't know, the naming conventions wrong.

14:57 And it's not a big deal.

14:58 I can just change it before I merge the pull request.

15:02 You can't, if that's locked down, the original, the person pulling it into their repository can't do that edit.

15:10 And it's just not nice and it's not fun.

15:14 So just remember to do fork and branch, don't do just fork.

15:19 So that's the public service announcement for today.

15:23 - Yeah, I mean, fork is required because a lot of times you don't have right access to the main repo, contributor access, but doing it from your main, doing it from like some other, the main branch instead of some other one is, yeah, you only learn that that's a bad idea when you do it.

15:38 And then you're like, oh no, now what?

15:40 I've done that once or twice.

15:42 I'm like, I'm gonna make a change and do a pull request and submit it.

15:45 And what if they don't accept it?

15:46 Then your main is out of sync forever.

15:48 You can never sync your fork up again.

15:50 And like, there's this all sorts of problems.

15:52 - And even if there's no ugliness there, let's say there's, and this has happened to me many times, you, and somebody wants to merge your stuff in, but they're merging other things too.

16:03 And maybe they grabbed a few other things first.

16:05 Now they really would like to have the merge from yours be really clean and just see the changes.

16:12 So the great thing to do is to merge the new main to your new main and then resolve it with your forked branch, your branch first, before going all the way back.

16:22 And if you don't have that, this doesn't work.

16:25 - Yeah, that's a good point too.

16:27 Indeed, indeed.

16:28 All right, let's get back to deployment.

16:31 - Okay.

16:31 - This one's different, okay?

16:32 Installed, this is kind of like a, like a little bit of a web 2.0 name, installed, but zero vowels, installed.

16:42 - Oh.

16:43 - In S, I-N-S-T-L-D.

16:46 So this is an interesting project.

16:48 When I first saw it, I was like, this seems like a bad idea.

16:52 I don't know, this seems like just a bad idea.

16:54 Let's not do this.

16:55 And then people kept recommending it and saying stuff.

16:57 I'm like, you know what, actually, that's kind of cool, actually.

17:00 So here's the deal.

17:01 Previously, what we talked about is like the right way, right, you're gonna create your requirements, your dependencies, you're gonna have pin versions, you're gonna have lock files.

17:11 Someone is gonna create a virtual environment or a Docker container or something like that.

17:15 Then you're going to install all of those things, right?

17:19 Great, what if you don't?

17:21 What if you have, Brian, what if you have a single .py file you wanna give to somebody and you wanna just let them run it?

17:28 But you know, it needs like one or two dependencies.

17:31 Like maybe you really, really, really wanna use rich because Will's project is awesome and you just don't want it to look plain white, unformatted, you want it to look good, right?

17:42 So you wanna be able to handle one of your coworkers or somebody else, one of these things and say, just run it.

17:47 Well, just run it becomes all of a sudden a conversation about virtual environments and all these things, right?

17:52 And like, ah, geez, just wanna format it just a little.

17:56 Could we somehow?

17:57 Well, installed is kind of aiming to solve that problem, right, so it's not like a high-end production sort of thing.

18:04 It's a, let me be able to pass a file around without going through the whole process of, you know, like Py installer, because like, well, oh geez, I made it AXE for you.

18:13 That's right, you're on Windows.

18:14 Let me recompile it.

18:16 Like, okay, great, no.

18:17 So here's the deal.

18:19 It lets you run Python code without installing the dependencies, without mentioning the dependencies, without having any awareness said dependencies so exist.

18:30 With one huge caveat, and that's you must have installed installed, okay?

18:36 Once this thing isn't there, it can then bootstrap everything else.

18:40 So maybe like if this was a thing you were doing with your co-worker story, I said like, okay, well, everyone pip install dash dash user installed or pip X installed or I don't know, something like that.

18:52 But once that's there, then you can run and use arbitrary things from PyPI without having them installed or requirements file or going through a step.

19:00 Just Python space, your thing, off it goes.

19:03 Also, if you were in a really weird situation where you had to do it, you could use two versions of the same library package within a single execution of a program, okay?

19:13 Interesting.

19:14 Which you might do that because you have incompatible libraries.

19:17 Like I've talked before about there are times where I literally cannot pip install dash R my requirements, right?

19:25 It's just like, nope, this old janky version of some library depends, it's pinned less than something else, some other library.

19:32 And then like another library is greater than that same library.

19:36 Well, modern pip just says, guess we can't run your program, take a hike, right?

19:40 So this would let you sort of say this part of the code uses the old janky thing.

19:46 Let's use it and then get rid of it and then go back and use another.

19:48 All right.

19:49 And also doesn't leave behind junk on your hard drive.

19:52 It basically deletes everything.

19:53 So how does this thing work?

19:54 So basically in your code, you can say, you have to import installed and then you use a context manager and say with installed some package and then you can, like within that context manager, you have access to that.

20:08 Pretty wild, huh?

20:09 Okay.

20:10 So basically that context manager will make sure that it's installed on your system.

20:14 It'll download it, all those things.

20:16 And then like when, presumably when it closes, it'll delete it.

20:19 You can also do it as a REPL.

20:21 So you can interact with just like the Python REPL, you can interact with it that way.

20:27 You can run a script.

20:28 You can say installed some script and then it'll be executed as if you were running it like regular Python, but you can also pass in dependencies that it might need to run it.

20:40 Right?

20:41 Check this out.

20:42 If your program has imports of any packages other than the built-in ones, they'll be installed automatically.

20:47 - Oh.

20:48 - Right?

20:49 So you just say installed some Python file and it goes, oh, you're saying import this stuff.

20:52 You import, you know, HTTPX.

20:54 - Hopefully you got the names right.

20:55 - Yeah, exactly.

20:56 (laughs)

20:58 So yeah, anyway, you can do a bunch of more advanced stuff you can talk about there.

21:03 You can pin the versions.

21:04 You can specify which package repository it comes from.

21:09 If you have like a, the example here is a test one, but if you've got like a private whitelist server and so on.

21:16 So there's a lot going on here.

21:17 I don't know, how does this hit you seeing this?

21:20 - You know, I was thinking I don't need it up until just a second ago where when you, with the, being able to do multiple versions in the same file, even to say like with, like as an example, normally I test against multiple versions of pytest for instance, or multiple versions of something like in my own stuff, I'm testing against maybe a few different versions of a particular package.

21:52 And I do that usually outside in talks to be able to install a different environment, set up a different environment to, with those different things installed.

22:01 But to be able to do it all in one run, that's pretty interesting actually.

22:06 - It is interesting, yeah.

22:07 - Yeah, so I might play with that.

22:09 - It's pretty interesting.

22:10 Apparently when it runs, it spits out basically the pip output.

22:14 You know what I mean?

22:15 It just comes, but in the context manager, you can say catch output equals true.

22:20 And then it's kind of invisible to your users.

22:22 It just takes a little startup time as it does the dependency stuff, you know?

22:26 So yeah, pretty wild.

22:28 So when I first saw this, I thought, this seems like it's encouraging people to do the wrong thing, but it's also some interesting flexibility.

22:35 So there you have it, installed.

22:37 - Sometimes people need to be encouraged to do the wrong thing.

22:40 - That's right.

22:41 How else do you learn to do the right thing?

22:43 No, just kidding.

22:44 All right, what do you got for our extras?

22:47 - I got a couple extras.

22:49 I am super excited.

22:52 The other thing, one of the things I was doing is open source code this break, but I also was, (laughs)

22:59 I was completing the complete pytest course.

23:02 So I named it the complete pytest course before it was complete.

23:06 Now it actually is complete, all 16 chapters.

23:08 However, it's never really gonna be done because this isn't a printed book.

23:14 It is a project.

23:16 It's a course that's up on the web and I'm gonna update it if I need to.

23:21 So I've got a good community going with it already and we're going to make sure that it's up to date with new versions of pytest.

23:30 Like pytest 8 is coming out and I don't think that I'll have to change anything, but if I do have to change stuff, I'll change it here first.

23:39 - Yeah, you can just do a find and replace for a seven to eight in your code and then you'll be fine.

23:43 - I don't actually put seven in there anywhere.

23:45 - I know, I know.

23:47 - But there might be some new toys that we wanna play with and there already were.

23:50 - So one of the fun things in getting this is going through and being able to say, oh, I do things a little differently now.

23:58 Like one of the parts is building a pytest plugin and I package a little differently now than I did several years ago.

24:05 So I got to use the new way and we're keeping that up to date.

24:09 So that's the first thing.

24:10 The other thing is this course took a lot of my time actually to get this to the point where it is now.

24:15 And so some things went on the back burner and a couple of things were the other podcasts.

24:20 So Python People and Python Test.

24:24 Python People has new people, Will Vincent, and I've got a whole bunch more that I need to release, but Will Vincent was on in October and I finally got this released.

24:32 And we talk about Django and writing technical books and Will's awesome.

24:36 He also is the host of Django Chat podcast.

24:41 And then I don't have any, the last Python Test episode was out December 15th, but I've got a whole 16 of them planned.

24:48 They're not recorded yet, but 16 are planned.

24:50 So these will come out in the next few months.

24:52 So stay tuned.

24:53 - Awesome, awesome.

24:54 - How about you?

24:55 - Well, I have a whole bunch of talk Python stuff coming.

24:58 I think I have 12 scheduled or something.

25:00 It's kind of out of control to be honest, but I've got some extras that are more relevant here.

25:05 - Okay.

25:06 - Not see the joke yet, that is the end.

25:07 All right, so Ofec just sent us a follow-up and it's a little unfortunate that we talked about this big release of Hatch 1.8 and then went on a two week break because like the next day he said, great coverage on Hatch 1.8, thanks.

25:24 However, one small correction.

25:26 Remember I was so impressed and psyched that the binaries of your apps, if you made apps with Hatch, which is a cool, cool feature of it, would be signed.

25:35 I'm like, how are they doing this?

25:36 How do they get away with doing this?

25:38 Well, they're not.

25:40 So the one small correction, only the binaries for Hatch themselves are signed by the certificate of the PSF, not the binaries created by Hatch for you.

25:49 Those are your certificates problems.

25:51 So we're back to signing our own apps again and dealing with Apple and Microsoft and all that stuff.

25:58 But it makes more sense, right?

25:59 Okay, next, this is just interesting.

26:03 PyPI had new user registration temporarily suspended.

26:08 The volume of malicious users and projects being created outpaced the ability to respond to it in timely fashion.

26:16 So like, we just need to slow down.

26:18 No action required.

26:19 This is from last week, just interesting.

26:21 And I guess, thank you everyone for being on top of this, honestly, 'cause what a hassle.

26:26 I also would, I don't know what they're doing right now, but at least I would recommend, I don't know if it would really help, but like Cloudflare, turnstile, at least stop the bots, which is a way, way, way, way, way better, way better thing than the Google reCAPTCHA thing.

26:45 So maybe if some kind of gate like that would be awesome, then put that up.

26:49 Anyway, that's news.

26:50 Also coming up next February, February 12th, which is in 33 days, I'm doing a YouTube only thing on Talk Python that I think will be really fun with Martina Puglisi about data doodling.

27:05 So she's got this whole cool series she's doing where she's doing data science by just sketching it out and just drawing pictures and trying to understand data before jumping into like notebooks and stuff.

27:17 And so we're just gonna talk through some really fun doodles and it's all visuals, which is why it's YouTube only and not on Talk Python.

27:24 - Nice.

27:25 - Exactly, but so if you're interested, please come and click the get notified to register in quotes to be part of that live event.

27:34 So hopefully people will, that'd be really cool.

27:36 I think she's got some beautiful, beautiful work and you'll appreciate when we get there.

27:41 And wrote an article called, maybe should have R in the front, R AI features a waste of time.

27:48 So my premise is that I was just wondering like how many cumulative programmer hours have been utterly wasted on adding very mediocre AI features to every app imaginable that you rarely ever want to use.

28:02 So I just lay out like a couple issues, like look at all these examples of apps that just like they're adding AI for the sake of adding AI, but it's not bashing on like chat to PT or something like, it was just like, oh, you can click this to like correct the date by AI.

28:18 It's like, I just type the date.

28:19 Why do I need this stupid thing?

28:21 And another, this example I use with Spark email, which has this really cool, Brian see how beautiful that is?

28:28 You can write beautiful emails in Spark, love it.

28:31 But if you try to proofread it with AI, it deletes all the content, it deletes the images and it just like jams it back as plain text, like response from ChatGPT or something.

28:41 You're like, dude, that's not what I wanted.

28:42 I want to ask for you to proofread it.

28:45 Like why, why there's this app is full of little tiny bugs and like they're adding this, like who would ever use that if this is the outcome of what you get, you know?

28:54 Anyway, another example would be the Dropbox fiasco where they just silently turned on, hey, we're sending all your documents to open AI.

29:02 Hope you don't mind.

29:03 Do you have anything private?

29:04 Probably not, it's fine, right?

29:05 And you're like, wait, why did you add, nobody wants this.

29:07 Why do you turn this on and why are you sending my data out of Dropbox?

29:11 This is not right.

29:12 So anyway, hopefully people will enjoy this article.

29:15 I have another fun one, let's just say, another fun one coming.

29:18 - I forgot to turn that off.

29:20 - Oh, well, you can ask ChatGPT about that.

29:23 - Can I now?

29:24 (laughing)

29:26 - Yeah, no, honestly, it doesn't actually send it unless you interact with one of the, like a text box.

29:33 It says, do you want to ask this thing?

29:34 And the AI about your doc, but if you ask it, then it's on, right?

29:38 So it's not clear by like entering that text box, that input, you're now sharing your data with some other company, right?

29:44 Like, can we just have like more reliable integration with Finder and Explorer and better sync?

29:51 Like, I don't need this AI stuff.

29:52 - I had, actually on the topic though, I had like a really cool AI experience.

29:58 I went to the dentist and they took x-rays and she showed me the x-ray picture.

30:05 And then she showed me the picture right next to it where an AI highlighted areas that might be problems that the dentist should check out and take a look at.

30:13 - That's awesome.

30:14 - And things like that, like helping a professional make sure they don't miss things, great use of AI.

30:20 - Yeah, proofreading, less.

30:22 (laughing)

30:23 No, that's an awesome, awesome use of it, yeah.

30:26 Okay, ready for the joke?

30:28 - I'm almost.

30:30 I wanna show one more thing I forgot to mention for a lot of people, New Year's resolution's time for a lot of people.

30:37 And if your New Year's resolution is get better at testing, the celebrate the pytest or the complete pytest course you're getting done, the coupon code to 2024 is open through January for 10% off.

30:51 So just wanted to mention that.

30:53 Now I'm ready for a joke.

30:54 - All right, this one has to do with managers and sprints and super agile stuff.

30:59 - Okay, this is from workchronicles.com.

31:04 Put it in the backlog with dashes.

31:06 So there's a programmer, clearly, actually it's a project manager, but whatever, like somebody on the tech team.

31:13 And here comes a person, very cheery.

31:15 Hey, I have a new feature idea.

31:17 And the person a little bit bugged, getting interrupted from work, says, awesome, just put it in the backlog.

31:22 Person says, where's the backlog?

31:25 Holds up the trash can.

31:26 (laughing)

31:27 - Oh dear.

31:28 - Put it in the backlog.

31:29 - Just go to the back.

31:31 We're busy.

31:31 - Yeah.

31:33 - Anyway.

31:33 - We actually, we've got a real backlog, but the things that are marked low priority, it's never gonna happen.

31:41 - Just run a filter that just hides all the priority things.

31:44 (laughing)

31:46 Yeah, we're done, backlog's all cut up.

31:48 No, I know there's that feature I put in there.

31:49 Oh yeah, it must be a little priority, got it.

31:51 - Oh, it's prioritized, we'll get to it.

31:53 - Beautiful.

31:54 All right, well, fantastic to be back with you and everyone else, Brian.

31:58 - Good to be back.

31:59 Bye all.

Back to show page