Python Bytes - #122 Give Me Back My Monolith

Episode Date: March 22, 2019

Topics covered in this episode: [play:0:55] Combining and separating dictionaries [play:3:02] Why I Avoid Slack [play:7:57] Hunting for Memory Leaks in Python applications [play:13:06] Give Me Back... My Monolith [play:18:23] Famous Laws Of Software Development [play:20:54] Beer Garden Plugins Extras Joke See the full show notes for this episode on the website at pythonbytes.fm/122

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 butts. This is episode 122, recorded March 20th, 2019. I'm Michael Kennedy. And I'm Brian Ocken. And this episode is brought to you by DigitalOcean. They have some big news to share with you. I'll tell you all about that shortly. You can check them out at pythonbytes.fm slash DigitalOcean and get a $100 credit for new users.
Starting point is 00:00:23 So, tell you more about that later. Brian, how are you doing? I'm doing good. And if I chuckle, it's because you got your mic up and you kind of look like a rapper doing the thing. Yeah, I'm going to drop it at the end of this episode. Yeah. Anyway, no, things are good.
Starting point is 00:00:37 People can't see. Yeah, like, so I've got my microphone on a different stand. So we'll see how it sounds. But yeah, I think it's working all right. Yeah. Nice. All right. So I find dictionaries sometimes get used in Python.
Starting point is 00:00:49 Like every now and then people will make use of that fancy data structure. Yeah, definitely. One of the hard things, and I don't have a link to this. Maybe we could drop it. But one of the things you need to do with dictionaries is pull them apart and put them together and stuff. There's a PEP 584. It's to add the plus and minus operators to the built-in dict class. Yeah, that makes a lot of sense to me. I mean, we already have it for list. Well, not the minus, but we have the plus. List makes sense
Starting point is 00:01:16 because operators are neat, and the thing that throws me off is the massive difference between if you do dictionary one plus dictionary two it's different than dictionary two plus dictionary one because the second thing always wins right if there's duplicate keys the second one it's going to overwrite the first one so you're saying that addition might not be commutative that might be a problem well maybe but i mean like strings are like that like if you've got i don't know that's true you don't get the same result of like hello plus world or world plus hello yeah exactly so maybe it's okay we're linking to the pep actually i think
Starting point is 00:01:57 it's nice because if you look at the alternates the alternates are gross like you can unpack both dictionaries and then create a new dictionary, or you can copy one and then update it with the other. All of those are not obvious. And so I think plus would be good. So we're going to link to that article. But also Guido van Rossum wrote an article called Why Operators Are Useful that partly talks about this. And then also there's an email link of why apparently one of the options for combining dictionaries was to use the pipe operator instead of plus. And so I've got a link to that too. But actually, so this is just a, we don't know if it'll go in.
Starting point is 00:02:38 It's in draft status and it just got proposed. But I think this would be a neat thing to add to Python. Yeah, I'm honestly a little bit surprised it's not already there. It would be nice. I certainly prefer plus over pipe. Pipe is not something that's commonly used in Python for combining stuff. Maybe if this was C or something, I don't know, but it certainly in the Python world, plus seems like a more natural choice here.
Starting point is 00:03:01 So this next one comes from Matthew Rockland, a guy behind Dask and other data sciencey things i recently interviewed him on talk python but you know time shifting it will be in the future when that comes out but i was reading through some of his articles and found something i thought you know well at least it's super resonating with me i don't know how your world is Brian, but mine is like a constant stream of like inbound inquiries, requests, comments, like watch the talk Python Twitter account at my personal Twitter account. We share watching the Python bites Twitter account. I have a getter channel. I'm on a couple of slacks. I'm on like Cisco teams or something like this. Email is insane. And there's just too many places that stuff comes
Starting point is 00:03:46 at me. And I spend like, there's times where I'll take a week and I'll take a full two days off to just write email and respond to messages. And I'm still not all the way caught up. It's like, it's really a problem. So when I read this article called why I avoid Slack by Matthew Rocklin, I'm like, Oh yes, this definitely resonates with me because when you get that much inbound stuff, like anything that's transient is super hard to keep track of, right? Like at mentions on Twitter, like maybe I'll catch them, but if I don't like, I'm sorry, but I just, you know, it's, I'd lost it. It went by in the stream somehow on accident or something on Slack, right? Like it's a hundred messages back and I dropped in there and I didn't check it,
Starting point is 00:04:28 marked the messages red and left and now it's just gone, right? It's never gonna come back. So I feel like those kinds of things, while kind of fun and interesting and more lively are also just adding stress and not really positive. So Matthew wrote this cool article saying, why avoid
Starting point is 00:04:45 slack focused on for open source maintainers of projects right like should we have a slack channel for open source project he says no so he says uh instead of doing something like that i mean i guess a getter channel would be basically equivalent says i encourage colleagues to have technical and design conversations on GitHub or some other system that is public, permanent, searchable,
Starting point is 00:05:08 and cross-referenceable. What do you think? Actually, especially for that case of open source projects and those types of conversations, I think I totally agree.
Starting point is 00:05:18 Yeah. So he says, you know, a couple reasons why, like, say, GitHub, public GitHub repos and their issues
Starting point is 00:05:22 and their conversations and PRs and whatnot around it are better than Slack would be because you can engage collaborators who aren't on Slack. Not everyone is on Slack, but if you're working with a person who doesn't have a web browser, that's probably okay. You can ignore that person. But most people can get to the web and they can read or even Google search and then find some kind of thing. Also, you can record the conversation because it sounds like his life's a little bit like mine. Like, hey, everybody just needs a couple of minutes of your time every couple of minutes. And it completely derails any form of productivity.
Starting point is 00:05:59 So it's super hard. And the reason is they'll drop in a Slack channel or some other conversation and go, hey, why is it like this? Or just quick question about that. And it's like, if you have it in an issue and discussed or something, you can say, that's issue 17725. We talked about it for a week. Here's a whole detail, right? Also, you can serve the silent majority. That is people who go to Google and they type in a thing and say, I need help with this thing or why does this work that way, GitHub ranks super high on Google. And those issues often come up. And you can see the whole conversation.
Starting point is 00:06:32 That's a great idea. Yeah. The other one is encourage more thoughtful discourse. So if you're writing like one-on-one or a couple of people on a Slack channel, you're willing to just throw out kind of quick off-the-cuff comments. If you're writing in a public permanent forum that's associated with your GitHub profile, it's much more likely that you're going to write something thoughtful. And finally, you get a cross-reference issues. So you can say, we talked about part of it here and part of it over there on this other issue. And then there was this PR and then we're bringing it back here. Slack is siloed. You can't cross-reference people and
Starting point is 00:07:05 conversations and things like that. So here's a call to say, enjoy Slack, chat in Slack, but don't use Slack for design decisions and other stuff, right? Like maintainers come and go. Maybe you want to have a history of these things and not just a transient chat stream. Yeah. And the bigger a Slack channel gets, the more useful it is in some respects. You get answers really quickly. But also, the more it reflects like kind of just a topical party at somebody's house with lots of conversations going on. Right. There was a cool chat about this thing on the couch, but that's not the same as like, we wrote up our thoughts on that thing. Yeah, exactly. I'll have to read this. Yeah, it's pretty good. It's not much longer than actually what I talked about, but it's still really helpful, I think. Yeah, exactly. Oh, I'll have to read this. Yeah, it's pretty good. It's not much longer than actually what I talked about,
Starting point is 00:07:45 but it's still really helpful, I think. Yeah. What's the next one you got for us? That reminds me, actually. No, I had a leak in my memory. No, that's bad. That's pretty good, actually. It's so bad, it's good.
Starting point is 00:07:56 I like it. There's an article from Zendesk from Y.C. Yao that's called Hunting for Memory Leaks in Python Applications. And we've covered memory leak stuff before, but I really like this write-up.
Starting point is 00:08:09 And it's specifically, they've got, Zendesk has a bunch of machine learning in Python written, and one of the problems they run into is some of them will have really big memory spikes or memory leaks, and they want to try to figure that out. So this was a specific use case. So he's not covering all of the options, just some of the tools that were used there. And I think it's cool.
Starting point is 00:08:33 I didn't know some of these things were around. So for example, there's a combination of the memory profiler package with matplotlib, where you can easily run, without doing anything to your code you can you can run some python code and then get a visual graph of the memory utilization which is cool if you're hunting into stuff and trying to break things around there was a discussion of using adding some code to your code to use it looks like muppy m-u-p-P-P-Y. Yeah, Muppy. That will dump, heap dump in certain places. So if you think, sometimes time really doesn't help you too much, but you can add certain places where you think you're at a stable state doing a heap dump,
Starting point is 00:09:14 especially if it's something that's looping, you might be able to catch something there. A reference to object graph or object graph to profile profile memory object lineage so objects that create other objects yeah that can be tricky because you've got maybe you have some object it's a class and it's got some field that field it's a list in that list it has a bunch of objects one of those happens to hold on to a pointer to some other huge dictionary that you thought like should be gone but right there's still some reference keeping it alive right so this object graph will like tell you that basically yeah nice like for example when he dumped some of the heap dumps some of those examples it's just you've got like so many megabytes towards strings well i don't know if that really helps you too much having a finding out where it came from
Starting point is 00:10:01 might be helpful yep and then he ends the article with a bunch of tips. Do quick feedback. If you think something, one of the things I liked, which is probably really good, is if you have memory intensive tasks or something you think might be the problem, separate that into a separate process
Starting point is 00:10:16 so you can debug it separately. The Python built-in PDB has a bunch of stuff that can help you as well. And then also watch out for leaky packages because the leak might not be in yours. It might be in your dependencies. Yeah, you might have pip installed a memory leak for sure. Which I was surprised that he said, for example, pandas. And I'm like, really?
Starting point is 00:10:36 Pandas must be tested the heck out of it. But apparently there's some known pandas problems in some corner cases. But oh well. Yeah, it probably is kind of tricky with like the C layer holding on to PyObject references and all sorts of funkiness, right? My first reaction to dealing with memory in Python is like, well, we're not supposed to have to, so it must be a real pain in the rear. But these tools don't look that bad to work with if you need to.
Starting point is 00:11:01 This object graph looks really cool. And it will actually create a PNG visual graph of the relationships, which is cool. And you can even ask for back references. Like, it seems like this is the thing that has all the memory. It should be gone, but why is it not garbage collected or cleaned up?
Starting point is 00:11:17 And you can say, draw me a graph or not like a mathematical graph, not a parabola type graph, a graph theory graph of all the back references to this object which is nice yeah so you can ask it in both directions yeah right if you think it should have been deleted and it's not it's because somebody's still referencing it right so who is that tell me about that i need to know about that right now yeah yeah that looks really cool it's definitely uh something i'd like to explore actually let me rephrase that i don't
Starting point is 00:11:43 want to explore it i don't want to have memory leaks. But if I do, I will find it very useful. Yes, definitely. There you go. Also useful, DigitalOcean. Let me tell you a cool thing that they just released. And this came from one of the listeners. They sent me a message like,
Starting point is 00:11:56 hey, this looks really cool. Do you know about this? So they announced this thing called the DigitalOcean Marketplace. So the idea is that different companies and other people can create these pre-configured virtual machines, and then you can just do one-click app install them.
Starting point is 00:12:12 Like if you want a GhostBlog server configured with Nginx and all that, you just click GhostBlog server, pay your $5, and now you have one. Nice. Or maybe you want like GitLab Enterprise, a MongoDB server, or even you can say i want a
Starting point is 00:12:26 django server and it'll give you django nginx g unicorn postgres certbot a whole bunch of stuff pre-configured all to work together like in a few seconds that's pretty cool right yeah definitely yeah yeah so i think this is a really nice feature you know it's it's already great to run infrastructure there and now if you can like get it much closer to the end, it's a little bit, I'm sure it's a Docker inspired, right? It seems like that, but for their infrastructure,
Starting point is 00:12:49 you still have to figure all that stuff out and to be able to throw a few dollars to the people who are willing to do the work to put it together. That's great. Yeah, that's beautiful. All right. So check them out over at pythonbytes.fm slash digital ocean, create an account.
Starting point is 00:13:00 And then once you get into your account, there's a little marketplace tab over there. So super cool. So speaking ofcker and all these other things there's a cool article by craig kirstens and it's called give me my monolith back or give me back my monolith as opposed to a whole bunch of microservices right so there's been a lot of hype excitement i don't know take your choose your side of the fence around microservices. And this is the idea of like, yeah, you have a web app and it's got like 500 Python files
Starting point is 00:13:34 and maybe it's doing all these different things. And wouldn't it be better if we could take the credit card processing and make it its own service with its own database? If we could make the caching its own service, its user accounts, its own service, all that kind of stuff. And then that user account part is super simple, right? Because the whole purpose of this application is, who are you? What can you do? Can you log in? Can you reset your password or something like this, right? That seems good,
Starting point is 00:13:59 yeah? Yeah. There's a lot of really good uses for this. Like if you have a large team of people working on a large web app, it might make more sense to break into these small pieces and have some people in charge of each piece. I think that actually legitimately makes a lot of sense. It's easy to bring on a junior developer who can say, all right, I'm going to work on this caching bit or whatever, and I don't have to know the whole thing.
Starting point is 00:14:21 I just got to work on my little API. It does court async or whatever it does. That makes a lot of sense. But most people who are working on web apps aren't in that space of having like 30 people on their team, right? That's really rare, right? You've gotten down this rant of you're not Google, you're not Facebook, you're not LinkedIn, right?
Starting point is 00:14:37 You don't need all these patterns because you are not them. You're a little relatively smaller company or project anyway this guy feels like you know that adds a lot of complexity and challenges and he lays them out of like why does the world have to be so hard wasn't it easy before and now it's not not from the article but just a thought of mine like when i think of this microservice architecture what you're doing is you're taking code complexity and you're moving it to infrastructure complexity. Yeah, definitely. Instead of having one kind of complicated bit of code,
Starting point is 00:15:11 I now have 12 super simple bits of code, but they all have to work together in like fairly complicated network environments, failover, you know, all this kind of stuff, this topography and whatnot. So my thought is at least, well, which of those two things are you good at, infrastructure or code?
Starting point is 00:15:29 That drives a lot of these decisions. But he runs down a couple of things that he said used to be simple, but now we get to revisit them. Get to. So setup went from chemistry to quantum mechanics. A lot of this has to do with bringing new people onto a team or junior developers and things like that. So it says onboarding a new engineer,
Starting point is 00:15:51 at least for the initial environment, used to be like half a day. And now we've ventured into microservices. This onboarding time has skyrocketed, and it's super complicated for them to understand all the moving pieces. And then the next one is so long for understanding our systems. Back when we had monolithic apps, you had an error. It had a stack trace. You click on the hyperlink generated by your little editor
Starting point is 00:16:13 to take you to the line where the stack trace is. And now you have different services that talk to another service that cue something on a message bus that another service pulls it out, and then you get an error. What caused that? How do you follow that through? How do you debug that? So it says, well, if we can't debug them, maybe we can test them talks about the challenges of continuous integration, and whatnot, but also talks about some services that were made into some apps that were made into microservices are now moving back, sort of in a reverse migration to these monoliths.
Starting point is 00:16:46 And, you know, I got to say, I'm pretty sympathetic with this. Like I see the value of microservices, but I also know that I'm not Google, right? And so, yeah, anyway, for me, I don't think this whole microservice world makes as much sense in my space, but I don't know. What do you think? We should go back to HTMLtml and pearl that's right can't we just have static files all this like logic is cgi used to be easy uh no no it actually was never ever easy i think that there's different ways to solve problems and i think that
Starting point is 00:17:18 making sure that you're paying attention to it i think is a good good idea and make sure that people understand that microservices are a, sometimes it's a funny, it's a shiny new thing to go learn. And sometimes that's not bad if you're willing to take on the risks, but changing from what you know to what you don't know is a risk. It's definitely exciting. I mean, you can bring in Docker and Kubernetes and do all sorts of fun stuff, But at the same time, just be aware of the trade-offs you're making. Some of the things that it's solved are now solved by async.
Starting point is 00:17:51 Yeah, that's true. Absolutely. One of the things also is if you're in a single language or not. So one of the things that microservices gives you is the different teams can do whatever language they want, as long as they provide an interface that's compatible with everybody the authentication bits in node.js the the caching tiers and something else and you know the front ends in python or whatever yeah definitely yeah makes sense again it's not something you will do that often when you're just a couple of people but if you're a big team or set of teams then sure makes a lot of sense yeah right. So I know of some famous laws and rules in software development, like the solid principles, single responsibility principle, open-close principle.
Starting point is 00:18:31 These are all good. You found some more amusing ones, didn't you? Yeah. Some of them are serious and some are amusing. All of them have kind of a little bit of truth. And this is an older article, so I'm not really sure how i got a hold of it but it's the famous laws of software development and there are 13 listed i think i counted that many i'm not going to read all 13 i guess it was written in 2017 it's not that old but uh okay so hofstetter's law which is great it always takes longer than you expect even when
Starting point is 00:19:03 you take into account hofstetter's law so it's self-referencing. I love it. Yeah, I love it. There's some money good ones here. So that's just funny. There's a Conway's law, which it's not supposed to be funny, but it's sometimes depressing. Any piece of software reflects the organizational structure that produced it. Yeah, I think that's true. Like microservices are great for lots of teams. One team, one monolith or something. I don't know. But I've seen that before. Also, the hierarchy of different teams shows up in the software as well.
Starting point is 00:19:37 And then, of course, a couple more I'd like to point out. The peer principle. In any hierarchy, every employee tends to rise to his level of incompetence. Sounds like a quote from the Despair calendars or posters. That's great. Yeah. And then the 90-90 rule, which I haven't actually heard before, but it's just hilarious. Have you heard this before? No. The first 90% of the code takes 10% of the time. The remaining 10% takes The first 90% of the code takes 10% of the time. The remaining 10% takes the other 90% of the time. That sounds about right to me. Yeah,
Starting point is 00:20:11 it's definitely, it feels like things just drag on and on right at the end of these projects. So the comments are good too. I noticed that some people guiding Corey through in a thing and said, I'm shocked that Cunningham's law isn't on the list. Cunningham's law, the fastest way to get help over the internet is not to ask a question, but instead to answer it wrong. And then someone also responds, maybe its omission was the consul's choice to invoke it. That's awesome. Yeah, it's really good. There's a bunch of nice ones in there. Yeah, that's like real though. I mean, the best way to get people to help you on the internet is start blogging the wrong stuff.
Starting point is 00:20:49 Yeah, enable comments and start writing. Yeah, that's cool. I got a quick one to round it out here. We talked about a plugin architecture before for building plugins that ran like within your app. So basically ways to let people interface like simple bits of code into your other systems and version plugins and all that.
Starting point is 00:21:09 There's another one called beer garden plugins, which is pretty fun. And one of the listeners suggested this. So the idea is it's a framework that will convert your functions. These are like regular Python scripts. They don't know anything about the web or plugins or whatever.
Starting point is 00:21:25 Convert those into composable,able production ready services as in restful http services with minimal overhead so if you have a class you can just go say this is a system and then the functions on the class you go these are services and they take these parameters and you describe what they take things like that and it will it will just go serve that. And it even does cool stuff like it does swagger documentation of the services and whatnot. So yeah, it's a pretty interesting little quick way to convert code that was not meant to be a service into services.
Starting point is 00:21:57 Oh, very cool. Yeah, it's pretty cool. It's apparently based on MongoDB, RabbitMQ, and it supports modern Python. So that's pretty cool. It talks about what you have to do to get it running. Or something that's kind of nice is it also comes in a Docker and Docker Compose form. So you can just clone the Docker Compose bit from GitHub, and then you say Docker Compose up, and now it's up and running. And then you can give it these
Starting point is 00:22:22 little apps and whatnot. It's pretty cool. Nice. Yeah, so I think the idea is you run your code and it plugs into the server there. So yeah, anyway, it's pretty neat. People can check that out if that sounds like something they're looking for. All right, well, that's it for official items. Anything else you want to cover here at the end?
Starting point is 00:22:40 Just had a really cool interview the other day. This will go out as a test and code 69, which should be available for everybody before you listen to this. But it was with Andy Hunt, who is now at the head of Pragmatic Programmer. Yeah, he's one of the original founders of it, right? Him and one other guy, I think. Yeah, Andy Hunt and Dave Thomas wrote the Pragmatic Programmer, and that was released in 99. And then in 2003,
Starting point is 00:23:07 they formed their own publishing company and they've been going strong. And the PyTest book was under their publishing company. And so now Dave doesn't have a play an active role in the publishing anymore, but Andy does.
Starting point is 00:23:19 And so it's a really cool conversation. Andy was also one of the original signers of the Agile Manifesto. And so we talk a lot about. Oh, right. That's cool. Yeah, we talk a lot about that and quite a few other things. So that's a fun thing to listen to.
Starting point is 00:23:33 Excellent. I'm definitely going to check it out when you release it. That's a good one. How about you? So I have two quick things to share with you. First, there's this thing called Firefox Send. Have you heard of this? I have not.
Starting point is 00:23:44 Yeah. So Firefox Send is actually not something built into Firefox, but it's more like a Mozilla project to make the web better, right? So here's what it does. It lets you share files securely, large files, like up to two and a half gigs per file. And it does end-to-end encryption where the decryption key is actually stored in the URL.
Starting point is 00:24:09 So if you don't share the URL, like even the Firefox send people can't decrypt it or whatever. Okay, interesting. So basically it's a way to serve these files around without putting it into Dropbox or OneDrive or Google Drive or whatever where it's like permanently there. It's going to be backed up. It's, you know, who knows, like if you would ever truly delete that thing, right?
Starting point is 00:24:30 Whereas here, the maximum life of one of these files is seven days. And you can even say it can only be downloaded one time and delete it in an hour or something like that. And, of course, the encryption key is not stored with the Firefox folks. So, like if it gets lost, you know, it's not that big of a deal. Interesting is not stored with the firefox folks so like if it gets lost you know it's not that big of a deal interesting i have to check that out yeah it's a free quick little thing you can either sign in and have a larger larger file options or smaller ones if you want to say and stay anonymous but yeah definitely i think it fills a cool need and it's kind of nice to see mozilla just you know making the web better in that way and it's it doesn't
Starting point is 00:25:04 depend on Firefox. It just happens to be made by them. Nice. Speaking of making stuff better, do you know what I really hate? I hate going to weather.com and them saying, oh, it looks like you're running an ad blocker. We want to serve you crap ads from an ad network that may have malicious content and JavaScript in it,
Starting point is 00:25:23 so please whitelist us and every time i see that i think if you and these are not small little blogs or like little article sites these are cnn the weather channel like major major places right and i always think you know look if you want to serve ads to me why don't you do it on a system that is not broken on a way that will not put my computer and my information and everything else at risk? You could easily talk to your sponsors, put an image on your site, let people click on it, and it takes them to their offer. But no, they want to run all sorts of retargeting and tracking. And they want to figure out like, Oh, are you, you are, are you a woman who is 36, who is also search for this, right? Like it's really shady. So this is not a change for us. But this is more of a make it
Starting point is 00:26:17 explicit for us on Python bytes.fm. And also talk Python.fm. We don't pop up these, hey, it looks like you're running an ad blocker, please stop it because our ads still show when there's an ad blocker because all they are is images and we're not trying to retarget anyone in that cool. That is very cool. Yeah. Yeah. So there's this move I've seen on the internet to talk. This is sort of a pushback on that to say, no, these are ethical ads. You know, you see this on read the docs and other places. So I put a little note under our ad saying, these ads are served ethically, we don't track you, we don't retarget you, we don't do anything. But here's our sponsor, if you like it, if you like the product, you want to support us, click on it. And that will, that will, they'll know that you
Starting point is 00:26:59 came from us because of the URL. And that's all you need, right? So I really wish all these places that say, please whitelist us instead said, could we have a better business model where we don't have to track people and do all sorts of nefarious stuff. So we're opting out. Good job. Yeah. Thanks. All right. Well, I believe it's time to laugh a little bit. Yeah. All right. Go first. I really like this joke that Derek Chambers submitted. It is, what do you call it when a Python programmer refuses to implement custom objects? What's that? I don't know. Self-deprivation.
Starting point is 00:27:36 And then he adds, sorry, that joke was really classless. Yeah, that's pretty good. I love it. The classless, classless Python. Cool. So I have another one for you. And I pretty much have an infinite supply of these now that i've pip x installed py jokes okay so i ran this before ours episode and this one came up said i had a problem so i thought i'd use java now i have a problem factory
Starting point is 00:27:56 i love it anyway that's uh that's the jokes and jokes. And if you find yourself wanting more jokes between now and the next episode release, you can always pipx install PyJokes and get your fix on the command line. Yeah. Oh, here's one more. Okay. I just ran it. I got to do this one also. There's only two hard problems in computer science.
Starting point is 00:28:19 Cache invalidation, naming things, and off by one errors. Nice. Yeah, there's good jokes in that PyJokes set. I love it. Yeah, there's not an infinite number, so people still keep sending us jokes. We love them. Yeah, we're going to hit the limit eventually. It's got to happen, but definitely fun.
Starting point is 00:28:35 So thank you for sending that in, Derek. And Brian, thanks for doing this with me every week. Yep, thank you. You bet. Talk to you later. Thank you for listening to Python Bytes. Follow the show on Twitter via at Python Bytes. That's Python Bytes as in B-Y-T-E-S.
Starting point is 00:28:48 And get the full show notes at PythonBytes.fm. If you have a news item you want featured, just visit PythonBytes.fm and send it our way. We're always on the lookout for sharing something cool. On behalf of myself and Brian Ocken, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.

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