Python Bytes - #366 Put It In The Backlog

Episode Date: January 9, 2024

Topics covered in this episode: Python 3.13 gets a JIT UniDep - Unified Conda and Pip Dependency Management Don’t Start Pull Requests from Your Main Branch instld: The simplest package management... Extras Joke See the full show notes for this episode on the website at pythonbytes.fm/366

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 366, recorded January 9th, 2024. Welcome to the new year. I'm Michael Kennedy. And I'm Brian Hocken. And Brian, this episode is sponsored by us. Support our work by taking our courses, the TalkPython training ones, the complete PyTest course, and as well as through our Patreon supporters. All those links are at the top of your show notes and your podcast player episode page
Starting point is 00:00:29 and so on. Connect with us over on Mastodon. You'll find us all on Fostodon. That's right. Michael, Brian, and the show. It has its own pronouns and gets thrown in the group and it's its own website and all that. So come see a Python By bytes over there as well and if you want to be part of the live stream you're welcome that's
Starting point is 00:00:49 certainly not required to take part and enjoy the show but if you want to be part of the live stream pythonbytes.fm live usually you'll see some scheduled upcoming one you can click you can you know smash the bell crush the subscribe all the things they say over there yeah brian it's been a while welcome back to the show it has been a while. Welcome back to the show. It has been a while. I'm excited to be back. I am too. Thanks, everyone, for being patient with us while we took a little break over the winter
Starting point is 00:01:14 break. 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. It was, it was a windy day. It was, there was one day it was windy.
Starting point is 00:01:28 It was, it was rough. Uh, I'm really sorry about that. Thank you. Thank you. I appreciate your. Yeah.
Starting point is 00:01:36 Brian, can I, can we maybe not skip this episode because I'm in Hawaii hanging out on the beach, just sipping drinks. Yeah, no, no, no, it was lovely. It's good to get away, but it's also really, sipping drinks. Yeah, no problem.
Starting point is 00:01:46 Yeah, no, it was lovely. It's good to get away, but it's also really good to be back. So, yeah. And I missed you. Yeah, I missed you too. And everyone missed the audience. Shall we jit it off for 2024? Let's jit it.
Starting point is 00:02:00 Let's jit started. Let's jit started. Okay. So, Anthony Shaw, so one of the things that's possibly hopefully coming into python 13 is python 3 13 sorry we're not all the way up to python 13 yet we're still in 3 3.13 is a jit compiler it's um and uh and i'm i'm with because of like you know java and other languages i'm familiar with jit compil, but Python's is going to be a little different. So Anthony Shaw was kind enough to write up a article kind of walking through it. And it's a really nice.
Starting point is 00:02:36 There's a couple things that I recommend reading it if 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. So that's kind of where he goes with this. And he, um, he starts off talking about really what a, what a JIT is. And really it's, um, it's something that basically generates your, uh, your semi your compiled code for a lot of times it's compiled code machine code. Um, but for Python, it's going to be, uh, the, not the compiled code, for a lot of times it's compiled code, machine code. But for Python, it's going to be not the compiled code, but the bytecode. So getting the bytecode ready, I think. I may have gotten this wrong. But he walks through kind of what a compiler is or a JIT compiler is as if you were writing
Starting point is 00:03:24 it in Python. So it goes through a little example of making your own Python version of the C Python interpreter, which is actually written in C. But if you were to write in Python, it might look like this, like switching on opcode of load construct, load const, and things like that. And you can see what those primitives
Starting point is 00:03:43 are by using the dis module for disassembler. And, and that's fun. The and then he walks through kind of, okay, so that's what a what a JIT compiler might be. What is a copy and patch JIT compiler, not copy and paste copy and patch. And, and that's a little a little bit more harder to describe over audio but he uh but but anthony does a really good job describing it and um and then talking about really this thing it 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 and it's a little bit faster and and then we're going to do something like that it's going to be something like that for python inside of the python c
Starting point is 00:04:30 interpreter and how that's it's just a good walkthrough to kind of understand what is going on what are these people doing and why and the why is it's going to be a couple of things. It's going to be faster. And in his, there's some benchmarks that show it's from like two to 9% faster, which is great. I mean, actually anytime you can make things a little faster, it's good. But,
Starting point is 00:04:54 but is it worth it for this? And it's, it's worth it for this partly because mostly it doesn't make it slower, which is the good part because, because of this JIT compiler, there's other tricks that they can do down the line to make things a lot faster. So this is great news and a good explanation. Yeah, it's super exciting. And you're on top of the news today, Brian, like this came
Starting point is 00:05:15 out this morning. So well, well done. This is brand new from Anthony Shaw. Anthony, excellent work writing this up and all the things. So one part that's interesting is 2% to 9% is great. Like, that's still really good to make things faster. But he also points out that this is just the foundation. 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? They can say, well, you wrote this code, but I know we have these specific machine instructions,
Starting point is 00:05:52 specialized machines instructions on this CPU. So let's make it do that. Or I see that you could actually inline this function. Instead of just make it run faster, we could inline it over here and here and here, and then, you know, function calls in Python are expensive. So maybe they just become not function calls, right? There's a lot of possibility for where things go. It would be interesting, I wonder, if you could even do things like, you know, compile stuff to C and use C optimizations as part of the JIT compiler, right? Like maybe there's a bunch of like layers that could happen.
Starting point is 00:06:24 I don't know. But yeah, basically this is, you know, a foot in the door for compiler optimizations that we've not had before in Python. Yeah. Yeah, it's pretty exciting. So, yep. Excellent. Excellent.
Starting point is 00:06:36 So the future is bright. Also compounding is interesting, right? All right. We're supposed to get Python much, much faster by making it like a little a little bit faster over five years continuously right and this is just part of that right so you keep adding these things up and the python i don't know 3 14 15 versus 3 10 when this started could be super super different yeah all right let's i hope people like deploying packaging bundling talking about
Starting point is 00:07:02 managing your projects because that's all I got this week, Brian. I got one after another. So let's start out with this Mastodon post by Bass Niholt. And Bass 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. Sometimes they kind of work together, but they're pulling from different sources. So you can like in a condo virtual environment you could pip install a thing i believe and it would still install but here's the deal like you can create a single requirements.yaml file and say i depend on these different projects those two come from conda conda forge or something these three come from pip ipi interesting huh i'm actually
Starting point is 00:07:46 excited about this this is very interesting yeah it's super interesting it works with pyproject.toml and setup.py it also is good for mono repos so why is this good for mono repos mono repos are i don't want to have to switch projects on github i just want one ginormous one for a whole company so let's just have one, right? Which is kind of an insane way of working, but it's also pretty interesting, right? Like I've got two libraries, they depend on each other. It's just all on the same project structure. So you just version them together, but that's literally every project for your company. And there's different teams potentially working with different versions and with different things. So maybe there's some data science folks and there's some web API folks.
Starting point is 00:08:29 And the web API folks are maybe PIP and the data science folks are Conda. So here you could express all of the requirements for the different projects through these different sources, right? Because some might be Conda, some might be PIP, but here's one way to express it. Also, it'll create consistent Ca lock files for multiple projects. It has platform support and you can just unidep install if you want. It's pretty cool. So looking over at the GitHub here, yeah, pretty much, honestly, pretty much says the same thing. But it shows you some examples of, you know, how you might express, you know, what is,
Starting point is 00:09:07 what is a conda dependency? What is a pip dependency? So like in your requirements.eml, you just have dependencies. 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?
Starting point is 00:09:23 And look at this. You can even include other you have like nested requirements.emo which maybe talks to the mono repo type of thing or multiple projects just in one repository right like this thing actually requires these four other things this this is even interesting you know we were talking about uh courses and i know you're going to mention something about your course later this is actually would be really nice for courses as well to do i suspect you probably could do with pip. I just, it never crossed my mind, right? I might have chapter one, let's do fast API stuff.
Starting point is 00:09:52 Chapter two, let's add Beanie and MongoDB. And like those have different requirements files. And you might want to just be able to express like, well, just run this one, just run this thing. You have everything you need for the course, but you also want to not like talk about everything before you get to it. Right. 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. Oh, interesting.
Starting point is 00:10:16 That's cool. Right. Yeah. I've never thought to do that. I haven't either, but it seems like I should, I've just been copying that stuff around. It seems like I shouldn't do that really. Awesome though.
Starting point is 00:10:25 Yeah, so Unidep, it's brand new. 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. And it really is kind of a time of like a thousand flowers blooming in the packaging and dependency managing space.
Starting point is 00:10:44 Like previously we talked about Hatch. I have more to say about Hatch later as well. MARK MANDELBAUM CHEYENNEY- Do you remember, did you say that you can use a pyproject.toml instead of a YAML? MARK MIRCHANDANI- Yes, you can. MARK MIRCHANDANI- OK. MARK MIRCHANDANI- Yes. It's a da, da, da, da, da.
Starting point is 00:10:57 MARK MIRCHANDANI- Because there's already enough YAML in my life. MARK MIRCHANDANI- Yeah. Yeah, you can use a pyproject.toml. MARK MIRCHANDANI- Cool. MARK MIRCHANDANI- Alternatively, one can configure the dependencies in the pyproject. all under the tool dot uni depth section. All right. Nice. There you go. Yeah. All right. Well, over to you. work over the holiday break since we also took a break from podcasting a bit i've been doing some open source work and i ran into this is timely because i ran into uh some problems with um with
Starting point is 00:11:33 pull requests and wanting changes 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. And so, and it causes problems. And so instead of having to write this up as to why you should not do this, Hinnick 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? When I first started using Git at work, even at work,
Starting point is 00:12:08 the so personally, I when I was started using Git, I just use main and, and just checked, I just had one branch. And that's no big deal with my own stuff. With a with a team, we had to decide where we're going to use branches or forks, and possibly not both, but you can use both. And in open source, it's common to use both. And what we mean is you fork the repository and you create a branch. Why do you do both? Because it seems like if you're going to make a change, you just need one or the other, right? And you can't do a branch because you don't have permission. So you do a fork, but you do both a fork and a branch for reasons. And the reasons are spelled out here. First, if you, if you didn't do that, he's, he's giving the reasons in the sense of if you did
Starting point is 00:12:56 main instead, why that's bad is first, you can only do one pull request at a time. If you were going to 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. You can't do another fix because you've already used up your main. Whereas if you do a branch off of that, you can have as many fixes as you want. So that's reason number one. But people might think, I don't care about multiple stuff. I'm just fixing the one thing I care about. Great. If it takes a while, so somebody on the other end is going to have to pull, like, review it, maybe ask you for changes to maybe merge it even. That's great. end up merging your pull request that's awesome but the what happens then is it'll that branch
Starting point is 00:13:45 will have changes of both the uh both the main line and your branch all in this branch your main branch now that has conflicts and you're not able to pull it back to your local repository so pulls won't work and you just you i don't know what you do at that point you blow away your fork and start over delete you delete your about story you start over yeah uh lame um okay the third reason is um is the pragmatic one of getting something done and this is the one that bit me uh a couple weeks ago is um there's two reasons you're um uh i may i might be like messing this up but um 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 your lockdown um then uh and you don't want you want allow it's allow edits from maintainers is meaningless at that point.
Starting point is 00:14:47 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 like tweak it. Like maybe the, I don't know, the naming convention's wrong and it's not a big deal. I can just change it before I merge the pull request. You can't. If that's locked down, the original, the person pulling into their repository can't do that edit. And it's just not nice and it's not fun. So just remember to do fork and branch, don't do just fork. So that's the public service announcement for today.
Starting point is 00: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. And then you're like, oh, no, now what? I've done that once or twice. I'm like, I'm going to make a change and do a pull request and submit it. And what if they don't accept it? Then your main is out of sync forever. You can never sync your fork up again.
Starting point is 00:15:50 And like, there's this all sorts of, 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, to merge your stuff in,
Starting point is 00:16:01 but they're merging other things too. And maybe they grabbed a few other things first now they they really would like to have the merge from yours be really clean and just see the changes so the great thing to do is to merge your the new main to your new main and then resolve it with your forked brand your branch first before going all the way back and if you don't have that it just doesn't work. Yeah, that's a good point too. Indeed. Indeed. All right. Let's get back to deployment. Okay. This one's different. Okay. Installed. This is kind of like a little bit of a web 2.0 name installed, but zero vowels installed in S I N S T L D. So this is an interesting project. When I first saw it, I was like, this seems like a bad idea. I don't know. This seems like just a bad idea. Let's not
Starting point is 00:16:54 do this. And then people kept recommending it and saying stuff like, you know what, actually, that's kind of cool, actually. So here's the deal. Previously, what we talked about is like the right way, right? You're going to create your requirements, your dependencies. You're going to have pin versions. You're going to have lock files. Someone is going to create a virtual environment or a Docker container or something like that. Then you're going to install all of those things, right? Right.
Starting point is 00:17:19 What if you don't? What if you have, Brian, what if you have a single dot py file you want to give to somebody and you want to just let them run it, but you know, it needs like one or two dependencies. Like maybe you really, really, really want to 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? So you want to be able to handle one of your coworkers or somebody else, one of these things and say, just run it. Well, just run it becomes all of a sudden a conversation about virtual environments and all these things, right? And like, ah, geez, just, just want to format it just a little. Could we somehow, well, installed is
Starting point is 00:17:58 kind of aiming to solve that problem, right? So it's not like a high-end production sort of thing. It's a, let me be able to pass a file around without going through the whole process of you know like pi installer because like well oh geez i made it exe for you that's right you're on windows let me recompile it like okay great no so here's the deal it lets you run python code without installing the dependencies without mentioning the dependencies, without having any awareness said dependencies so exist. With one huge caveat, and that's you must have installed,
Starting point is 00:18:34 installed, OK? Once this thing isn't there, it can then bootstrap everything else. So maybe if this was a thing you were doing with your co-worker story, I said, OK,, well everyone pip install dash dash user installed or pipx installed or I don't know, something like that. Right. 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. You just Python space your thing off it goes. Also, if you were in a really weird situation,
Starting point is 00:19:06 but you had to do it, you could use two versions of the same library package within a single execution of a program. Okay, interesting. Which you might do that because you have incompatible libraries. Like I've talked before about, there are times where I literally cannot
Starting point is 00:19:21 pip install dash R, my requirements, right? It's just like, nope, this old janky version of some library depends, it's pinned less than something else, some other library, and then like another library is greater than that same library. Well, modern pip just says,
Starting point is 00:19:38 guess we can't run your program, take a hike, right? So this would let you sort of say, this part of the code uses the old janky thing let's use it and then get rid of it and then go back and use another all right it also doesn't leave behind junk on your hard drive it basically deletes everything so how does this thing work so basically in your code you can say you have to import installed and then you use a context manager you can say with installed some package, and then you can, like within that context manager, you have access to that. Pretty wild, huh? Okay. So basically that context manager will make sure that it's installed on your system. It'll download it, all those
Starting point is 00:20:15 things. And then like when, presumably when it closes, it'll delete it. You can also do it as a REPL. So you can, you know, interact with just like the Python REPL, you can interact with it that way. You can run a script, you can say installed some script, and then it'll be executed as if you were running it like regular Python, but it'll, you can also pass in dependencies that it might need to run it, right? If you're, check this out, if your program has imports of any packages other than the built-in ones, they be installed automatically oh right so you just say installed some python file and it goes oh you're saying import this stuff you import you know httpx hopefully you got the names right yeah exactly so yeah anyway uh you can do a bunch of bunch of more advanced
Starting point is 00:21:01 stuff you can talk about there you can pin the versions you can specify um which ipi which package repository it comes from if you like a the example here is a test one but if you've got like a private whitelist server and so on so there's a lot going on here i don't know how does this how does this hit you seeing this you know the w i was i was thinking i don't need it up until just a second ago. I know. 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.
Starting point is 00:21:51 And I do that usually outside in talks to be able to install a different environment, set up a different environment with those different things installed. But to be able to do it all in one run, that's pretty interesting actually. It all in one run, that's pretty interesting, actually. It is interesting, yeah.
Starting point is 00:22:07 Yeah, so I might play with that. It's pretty interesting. Apparently when it runs, it spits out basically the pip output. You know what I mean? It comes, but in the context manager, you can say catch output equals true, and then it's kind of invisible to your users.
Starting point is 00:22:22 It just takes a little startup time as it does the dependency stuff, you know? yeah yeah pretty wild so when i first saw this i thought ah this seems like it's encouraging people to do the wrong thing but it's it's also some interesting flexibility so there you have it and sold and sometimes people need to be encouraged to do the wrong thing that's right how else do you learn to do the right thing? No, just kidding. All right. What do you got for our extras? I got a couple extras. I am super excited. The other thing, one of the things I was doing is open source code this break, but I also was
Starting point is 00:22:56 completing the complete PyTest course. So I named it the complete PyTest course before it was complete. Now it actually is complete all 16 chapters. However, it's not, it's never really going to be done because this isn't a printed book. It is a, is a project. It's it's a course that's up on the web and I'm going to update it if I need to. 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. Like PyTest 8 is coming out. And I don't think that I'll have to change anything.
Starting point is 00:23:35 But if I do have to change stuff, I'll change it here first. Yeah, you can just do a find and replace for a 7 to 8 in your code and then you'll be fine. I don't actually put 7 in there anywhere. I know, I know uh but there might be some new toys that we want to play with and there already were so one of the one of the fun things was uh was get in getting this is um is going through and being able to say oh i do things a little differently now like one of the parts is building a a pytest plugin and i package a little differently now than I did several years ago. So I got to use the new, new way and we're keeping that up to date. So that's the first thing. The other thing is this course took a lot of my time actually to get this to,
Starting point is 00:24:14 to the point where it is now. And, and so some things went on the back burner and a couple of things were the other podcasts. So Python people and Python test. Python people has new people. Will Vincent. And I've got a whole bunch more than I need to release. But Will Vincent was on in October. And I finally got this released.
Starting point is 00:24:32 And we talk about Django and writing technical books. And Will's awesome. He also is the host of Django Chat podcast. 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 they're not recorded yet but 16 are planned
Starting point is 00:24:50 so these will come out in the next few months so stay tuned awesome awesome how about you? well I have a whole bunch of talk Python stuff coming I think I have 12 scheduled or something it's kind of out of control to be honest but I've got some extras that are more relevant here.
Starting point is 00:25:05 You cannot see the joke yet. That is the end. All right, so Ophek 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. However, one small correction. Remember, I was so
Starting point is 00:25:27 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. I'm like, how are they doing this? How do they get away with doing this? Well, they're not. So 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. Those are your certificates problems. So we're back to signing our own apps again and dealing with Apple and
Starting point is 00:25:55 Microsoft and all that stuff. Okay. But it makes more sense, right? Okay. Next. This is just interesting. High PI had new user registration temporarily suspended
Starting point is 00:26:08 there um the volume of malicious users and projects being created outpaced the ability to respond to it in timely fashion so like uh we just need to slow down no action required this is from last week just interesting and i guess you know thank you everyone for being on top of this honestly because what a hassle um i also would i don't know what they're doing right now but at least i would recommend um i don't know if it would really help but like cloudflare um turnstile at least stop stop the bots you know which is a way way way way way better way better thing than the google recaptcha thing so maybe if some kind of gate like that would be awesome then put that up anyway that's news 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
Starting point is 00:27:00 will be really fun with martina pugliese about data doodling. 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. And so we're just going to talk through some really fun doodles. And it's all visuals, which is why it's YouTube only and not on DocPython. Exactly. But so if you're interested, please come and click the get notified to register and quotes to be part of that live event.
Starting point is 00:27:34 So hopefully people will. That'd be really cool. I think she's got some beautiful, beautiful work and you'll appreciate when we get there. And wrote an article called, which maybe should have R in the front r ai features a waste of time so my premise is that uh 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 you know so i just lay out like a couple issues like look at all these
Starting point is 00:28:05 these examples of apps that just like they're adding ai for the sake of adding ai but it's not you know not bashing on like chat gpt or something like it's just like oh you can click this to like correct the date by ai's like i just type the date why do i need this stupid thing right and uh another this example i use with spark email which has this really cool um brian see how beautiful that is you can write beautiful emails in spark love it right but if you try to proofread it with ai it deletes all the content to the images and it just like jams it back as plain text like response from chat gpt or something like dude that's not what i wanted when i asked for you to proofread it.
Starting point is 00:28:46 This app is full of little tiny bugs, and they're adding this. Who would ever use that if this is the outcome of what you get? Anyway, another example would be the Dropbox fiasco, where they just silently turned on, hey, we're sending all your documents to OpenAI. I hope you don't mind. Do you have anything private? Probably not.
Starting point is 00:29:04 It's fine. Right? You're like, wait, why did you add that? Nobody wants this. Why hope you don't mind. Do you have anything private? Probably not. It's fine, right? And you're like, wait, why did you add that? Nobody wants this. Why do you turn this on? And why are you sending my data out of Dropbox? This is not right. So anyway, hopefully people will enjoy this article. I have another fun one.
Starting point is 00:29:16 Let's say another fun one coming. I forgot to turn that off. Oh, well, you can ask ChatGPT about that. Go on now. Yeah, no, honestly, it doesn't actually send it unless you interact with one of the, like a text box. It says, do you want to ask this thing and the AI about your doc?
Starting point is 00:29:35 But if you ask it, then it's on, right? So it's not clear by like entering that text box, that input, you're now sharing your data with some other company, right? Like, can we just have like more reliable integration with Finder and Explorer and better sync? Like, I don't need this AI stuff. I had actually on the topic, though, I had like a really cool AI experience. I went to the dentist, and they took x rays. And, and she showed me the x ray picture. 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.
Starting point is 00:30:13 That's awesome. And things like that, like helping a professional make sure they don't miss things. Great use of AI. Yeah. Proofreading? Less. No, that's an awesome, awesome use of it. Yeah. Okay. Ready for the joke? I'm almost. I want to show one more thing I forgot to mention for a lot of people, New Year's resolutions time for a lot of people. And if your New Year's resolution is get better at testing, the celebrate the Py test or the complete pi test course you're getting
Starting point is 00:30:45 done the coupon code 2024 is open through january for 10 off so just mention that so now i'm ready for a joke all right this one has to do with uh managers and sprints and super agile stuff okay it was from work chronicles or chronicles.. Put it in the backlog with dashes. So there's a programmer, clearly a business, actually it says project manager, but whatever, like somebody on the tech team. And here comes a person, very cheery. Hey, I have a new feature idea. And the person, a little bit bugged, getting interrupted from work, says, awesome.
Starting point is 00:31:21 Just put it in the backlog. Person says, where's it? Where's the backlog? Holds up the trash can. Oh, dear. put it in the backlog person says where is it where's the backlog holds up the trash can oh dear put it in the backlog just go back we're busy yeah anyway um we actually we've got a real backlog but the things that are marked low priority it's never gonna happen just run a filter that just hides all the priority things yeah we're done backlog's all caught up no i know there's that feature i put in there oh It's never going to happen. Just run a filter that just hides all the priority things. Yeah, we're done.
Starting point is 00:31:47 Backlog's all cut up. No, I know there's that feature I put in there. Oh yeah, it must be a little priority. Got it. Oh, it's prioritized. We'll get to it. Beautiful. All right.
Starting point is 00:31:57 Well, fantastic to be back with you and everyone else, Brian. Good to be back. Yeah. Bye all. Bye.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.