WEBVTT
00:00:00.020 -->
00:00:01.480Hello and welcome to Python Bytes,
00:00:01.650 -->
00:00:04.700where we deliver Python news and headlines directly to your earbuds.
00:00:05.110 -->
00:00:09.520This is episode 463, recorded December 22, 2025.
00:00:10.360 -->
00:00:11.060I'm Brian Okken.
00:00:11.360 -->
00:00:12.240And I am Michael Kennedy.
00:00:12.560 -->
00:00:14.560And this episode is sponsored by us.
00:00:14.880 -->
00:00:19.780So support us by heading over to Michael's courses,
00:00:20.140 -->
00:00:23.940my courses, Talk Python Training or python test.com,
00:00:24.600 -->
00:00:28.740or just go over and see what we got at the pythonbytes.fm.
00:00:29.840 -->
00:00:34.380Let me add one more thing real quick there, Brian. Sorry to hijack your intro, but hey,
00:00:34.900 -->
00:00:41.520we're coming up on 2026 and it's about time to be scheduling sponsors on the ad calendar for the
00:00:41.640 -->
00:00:45.560next year. So if companies out there, if you're listening, you're like, why does my company not
00:00:45.780 -->
00:00:50.000support Python Bytes and sponsor it? Yes, a fine question you should be taking up with your
00:00:50.160 -->
00:00:54.660marketing team. Have them reach out to me. And right now there's a bunch of openings. We'll see
00:00:54.720 -->
00:00:57.040if they get bought up or not as things go.
00:00:57.200 -->
00:00:58.620But yeah, just send me an email.
00:00:58.900 -->
00:01:00.480Yeah, actually, that'd be great.
00:01:00.660 -->
00:01:02.820I'd love to have more sponsors on the show.
00:01:04.640 -->
00:01:07.980If you want to reach us for sponsoring
00:01:08.120 -->
00:01:09.260or any other ways,
00:01:11.380 -->
00:01:16.020there's links on the show page, pythonbytes.fm.
00:01:16.740 -->
00:01:19.080You can also find links to all of our socials.
00:01:19.540 -->
00:01:21.500We're at Mastodon and Fosstodon,
00:01:21.820 -->
00:01:23.900both us individually and the show.
00:01:24.660 -->
00:01:27.820And also, if you'd like to watch us live,
00:01:28.200 -->
00:01:31.180you can go to pythonbytes.com/live
00:01:31.240 -->
00:01:33.280and see what it is and find the links.
00:01:33.600 -->
00:01:35.720And then as well, while you're there,
00:01:36.020 -->
00:01:37.660sign up for the mailing list
00:01:37.840 -->
00:01:39.700so we can send you all the links we talk about
00:01:40.000 -->
00:01:40.980directly to your inbox.
00:01:41.640 -->
00:01:43.940Alrighty, oh, one more thing before we get started.
00:01:44.620 -->
00:01:48.400We are taking, normally we record on Monday mornings
00:01:48.960 -->
00:01:51.400and we are taking next week off
00:01:51.820 -->
00:01:53.500and we will be back in 2026.
00:01:54.160 -->
00:01:56.120All right. Kick us off, Michael.
00:01:56.740 -->
00:02:01.780It's end of the year. As you said, we'll be back first week of January.
00:02:02.240 -->
00:02:07.180But it's a little bit of an introspective end of the year is what I want to leave people with.
00:02:07.840 -->
00:02:13.680So people may have noticed I usually cover tools, libraries, or updates to those kinds of things and so on.
00:02:14.000 -->
00:02:20.280But on this episode, I want to cover two articles that I came across recently that I think they'll make you think.
00:02:20.540 -->
00:02:23.280They'll make you really evaluate the situation.
00:02:23.740 -->
00:02:29.960One has to do with agentic coding and one has to do with why open source won and continues to win.
00:02:30.540 -->
00:02:34.280But more importantly, what is one of the really key ingredients?
00:02:34.690 -->
00:02:40.640So as we look towards the future for more sustainability, let's not kill the golden goose by changing that thing.
00:02:40.830 -->
00:02:45.740So the first one is, has the cost of building software just dropped 90 percent?
00:02:46.260 -->
00:02:48.500That's a pretty stark headline, isn't it?
00:02:48.860 -->
00:02:49.020Yeah.
00:02:49.270 -->
00:02:50.480And what are the consequences? Right.
00:02:50.660 -->
00:02:56.600Does that mean, does that mean like, well, you thought it was hard to get a job earlier as a junior and just hang on to your pants now?
00:02:57.100 -->
00:02:58.260Or does it mean something else?
00:02:58.330 -->
00:02:58.600We'll see.
00:02:58.860 -->
00:03:02.140Well, at least we'll see what Martin Alderson said, because that's the article.
00:03:02.190 -->
00:03:06.140He wrote this article and I think it is super insightful and interesting.
00:03:06.460 -->
00:03:10.720So I kind of want to just pull out some highlights and put it out there for you all to think about as you got some downtime.
00:03:10.800 -->
00:03:23.180So the premise is basically that many of the recent programming quote advancements that are like gonna change the world, gonna actually absolutely change the way things work, haven't really.
00:03:23.680 -->
00:03:33.100For example, test-driven development, cloud computing, especially hyperscale clouds, microservices, complex front ends like React and so on, Angular, whatever.
00:03:33.640 -->
00:03:38.340Kubernetes, sure, they're advancements and they help in some way or another for various things,
00:03:38.560 -->
00:03:42.980but they're not bending the curve dramatically on how we write software, how much more we get done,
00:03:43.260 -->
00:03:49.520and so on. Somewhat, but not massively. But they say, let me see if I can find it. Yeah, here we go.
00:03:50.360 -->
00:03:56.760The economics have dramatically changed now with agentic coding. And I agree. I think it really
00:03:57.380 -->
00:04:02.540has. And I know a lot of people are frustrated with AI or they don't want to use AI and so on.
00:04:02.900 -->
00:04:08.060I'm not here to make people do that, but I am here to put on your radar that this is something you're going to have to be paying attention to.
00:04:08.480 -->
00:04:09.520And Martin thinks so as well.
00:04:09.690 -->
00:04:13.400Says in 2026 is going to catch a lot of people off guard.
00:04:13.520 -->
00:04:14.320And I think so too.
00:04:14.740 -->
00:04:24.360So it kind of goes through the history a little bit of like changes, how open source actually made a huge change, how cloud was supposed to make a big change, but it just added a crap ton of complexity.
00:04:25.150 -->
00:04:25.900A lot of other things.
00:04:26.240 -->
00:04:30.880So in a lot of just sort of how complexity has grown over time, instead of these things
00:04:31.070 -->
00:04:35.420making us able to write more software or better software, a lot of times it's just handle
00:04:35.530 -->
00:04:37.560more complex software or kind of doing the same thing.
00:04:37.820 -->
00:04:40.640So where's the 90% savings come from?
00:04:41.040 -->
00:04:46.660So he says, like you, probably I was incredibly skeptical of a lot of AI coding tools at the
00:04:46.800 -->
00:04:49.360beginning of the year, but things are changing fast.
00:04:49.840 -->
00:04:55.120And previously, if I want to, let's say I want to add some small capability to my app.
00:04:55.290 -->
00:04:55.840How do you do it?
00:04:55.940 -->
00:04:57.380Well, you're going to assemble a team of people.
00:04:57.600 -->
00:04:58.860You're going to set up continuous integration.
00:04:59.460 -->
00:05:00.940You're going to build out data access patterns,
00:05:01.160 -->
00:05:03.060and you're going to plan that out in an architecture meeting.
00:05:03.480 -->
00:05:06.140Really, it's just a bunch of crud, but people make a big deal out of it.
00:05:06.820 -->
00:05:09.500So you're going to over-engineer it probably.
00:05:10.100 -->
00:05:11.920And you're going to set up some testing and so on.
00:05:12.320 -->
00:05:13.500And that's just direct labor, right?
00:05:13.760 -->
00:05:14.440You've got all the management.
00:05:14.820 -->
00:05:16.780And one of the things that's really interesting about this article
00:05:17.300 -->
00:05:20.020is the mythical man month aspect of this.
00:05:20.220 -->
00:05:21.660Like, okay, well, that's going to take two weeks.
00:05:21.920 -->
00:05:23.380Well, what if we add four people to it?
00:05:23.580 -->
00:05:24.560Well, it'll take one and a half weeks.
00:05:24.720 -->
00:05:26.440Like, wait, why is that not half a week?
00:05:26.800 -->
00:05:28.860You know, it's like the coordination, the communication,
00:05:29.360 -->
00:05:33.040the in factorial ways in which there can be like blocking
00:05:33.560 -->
00:05:36.780or communication or meetings or coordination and so on.
00:05:37.020 -->
00:05:39.200And so these coding tools have got really, really good.
00:05:39.580 -->
00:05:42.800And as you add one of these coding tools in,
00:05:43.260 -->
00:05:45.340you don't have to have meetings with it.
00:05:45.620 -->
00:05:48.520You don't have to have it working with three other ones of them
00:05:48.920 -->
00:05:51.580so that it can coordinate different skill sets and so on.
00:05:51.700 -->
00:05:56.380And so in a sense, it really lowers the number of connections in that mythical man month,
00:05:56.410 -->
00:05:57.600but still adds a lot of capabilities.
00:05:57.630 -->
00:05:58.300So pretty interesting.
00:05:58.660 -->
00:06:02.600So final takeaway is like on the face of it, this seems like incredibly bad news for the
00:06:02.710 -->
00:06:03.800software development industry.
00:06:04.970 -->
00:06:05.080Indeed.
00:06:05.820 -->
00:06:07.040But a look at history.
00:06:07.680 -->
00:06:07.980Let's see.
00:06:08.270 -->
00:06:16.660So Jevons paradox comes from back in the day when coal usage became super efficient, right?
00:06:16.780 -->
00:06:21.660Instead of just burning it in an open pit or whatever to like heat something, we put it
00:06:21.680 -->
00:06:27.460know the steam engines and it does way more work per you know joule of energy or whatever right
00:06:27.660 -->
00:06:32.440it says look at least this guy martin thinks this applies jevon's paradox also is going to apply to
00:06:32.640 -->
00:06:37.220software that when something becomes cheaper to produce it's not that we just use it less it's
00:06:37.300 -->
00:06:41.940like well we've got five developers but now they're way more efficient so let's get rid of four of them
00:06:42.260 -->
00:06:45.900that's one possible outcome the other is like let's just build five times as much software
00:06:46.200 -->
00:06:47.220as we used to, right?
00:06:47.580 -->
00:06:49.240And so an example is from history
00:06:49.520 -->
00:06:51.920is when coal became way cheaper,
00:06:52.420 -->
00:06:54.100its use skyrocketed,
00:06:54.440 -->
00:06:56.060not cheaper, efficient, right?
00:06:56.200 -->
00:06:58.020Like you didn't need to spend as much coal
00:06:58.340 -->
00:06:58.960to get stuff done.
00:06:59.180 -->
00:07:02.400But in fact, it actually blew up way, way more.
00:07:02.620 -->
00:07:03.660So super interesting.
00:07:03.900 -->
00:07:04.900And I think there's something to that.
00:07:04.900 -->
00:07:07.860I think there's a ton of latent demand for software.
00:07:08.500 -->
00:07:10.660So anyway, there's a whole section on that
00:07:10.740 -->
00:07:11.900that's pretty interesting, I think.
00:07:12.540 -->
00:07:14.260Yeah, I think there is a lot of,
00:07:14.840 -->
00:07:17.640I've mixed emotions about this.
00:07:17.640 -->
00:07:19.160I think there is a lot of light in demand.
00:07:19.540 -->
00:07:27.460I am dealing with both agent-driven or agent-developed software on a professional basis,
00:07:27.880 -->
00:07:32.520both from experts and from novices in a company.
00:07:33.460 -->
00:07:39.580And it's producing five times as much code, but you get five times as much bad code from
00:07:39.960 -->
00:07:40.520bad developers.
00:07:41.180 -->
00:07:50.280I'm just saying, there is a, like, let's say we have five times the amount of code or five times the product, you know, do more things.
00:07:50.900 -->
00:07:55.200That's 5xing your code base that you have to maintain in the future, too.
00:07:55.620 -->
00:08:04.060And we really haven't figured out how to deal with the increased maintenance cost of this agent-driven software yet.
00:08:04.840 -->
00:08:06.080Yeah, I agree with that.
00:08:06.420 -->
00:08:12.780Also, the test-driven development, I think we didn't get the gains out of that because people were teaching it wrong.
00:08:14.240 -->
00:08:16.100Just kind of a point from my book.
00:08:16.980 -->
00:08:17.640Of course.
00:08:17.870 -->
00:08:24.260But I think also there's a difference between full-on extreme programming and just, hey, let's make sure we have tests for our code.
00:08:25.020 -->
00:08:28.480Yeah, there's also, should we test our code and should we unit test it?
00:08:28.780 -->
00:08:31.700And that's the big part that I get.
00:08:32.050 -->
00:08:35.919But also, can we scroll up to that complexity chart?
00:08:36.400 -->
00:08:37.320or the little graph,
00:08:37.760 -->
00:08:42.060I think that AI agents are going to not drive down complexity.
00:08:42.979 -->
00:08:45.940I think we might get efficiency gains,
00:08:46.220 -->
00:08:47.240but I don't think,
00:08:47.370 -->
00:08:48.320I think we're going to get some,
00:08:48.640 -->
00:08:51.060the complexity is going to go up just like it did with cloud.
00:08:52.500 -->
00:08:54.460You know, what's really interesting about all this discussion,
00:08:54.840 -->
00:08:56.220and I'm not disagreeing with you on this.
00:08:56.530 -->
00:08:57.760I think it's,
00:08:58.180 -->
00:09:01.280if people have the opinion that are just going to like cut,
00:09:01.520 -->
00:09:03.180set these things loose on code bases,
00:09:03.350 -->
00:09:05.100or especially on greenfield projects,
00:09:05.460 -->
00:09:08.980you're going to end up with all sorts of mishmashes of stuff.
00:09:09.030 -->
00:09:11.400Like, oh, this time it decided it wanted to react,
00:09:11.640 -->
00:09:12.660but last time it used Vue.
00:09:12.750 -->
00:09:13.900Like, now I have to know two frameworks.
00:09:13.990 -->
00:09:15.280Like, why am I doing this, right?
00:09:15.580 -->
00:09:15.860Yeah.
00:09:16.120 -->
00:09:19.920There are a bunch of engineering practices and tools
00:09:20.100 -->
00:09:22.760to apply to this stuff to get much more constrained,
00:09:23.240 -->
00:09:26.260uniform output out of it than just letting it go free, right?
00:09:26.460 -->
00:09:28.740And also, to Martin's defense, he says, like, look,
00:09:29.120 -->
00:09:30.340this is not vibe coding.
00:09:30.480 -->
00:09:32.180This is not just letting the thing go.
00:09:32.340 -->
00:09:34.580This is, like, engineer plus...
00:09:34.580 -->
00:09:35.100Working with it.
00:09:35.180 -->
00:09:40.320these tools right like human in the loop all the way and even if we can get like your expert
00:09:40.600 -->
00:09:44.740engineers at your company to work twice as fat like get twice as much productivity out of them
00:09:44.920 -->
00:09:50.100and they're going to actually be happier because they're um it's like they've got a second brain
00:09:50.440 -->
00:09:57.460working with them even 2x like is incredible to get incredible yeah to get your best engineers
00:09:58.140 -->
00:10:05.140um to get to figure out stuff faster also um even not generating code but even just having stuff
00:10:05.160 -->
00:10:08.340explain it to you. Like, how does this algorithm work? What should I care about?
00:10:09.820 -->
00:10:15.160Asking it what tests you should write, asking it where the problem areas might be. Those are
00:10:15.340 -->
00:10:20.820incredible things that we couldn't do before without trying to pull other people off of their
00:10:20.820 -->
00:10:25.900own projects. So, yeah. Yeah, absolutely. So two more thoughts before we wrap this up quickly.
00:10:27.120 -->
00:10:33.240One down at the bottom here talks about, hold on before I lose track of where I was. Yeah,
00:10:33.400 -->
00:10:37.860Greenfield. Okay. So one objection is just not in a header sort of thing. One objection that I hear
00:10:37.860 -->
00:10:42.940a lot is LLMs are only good at Greenfield projects. And you were kind of talking about that as well,
00:10:43.080 -->
00:10:48.720Brian, but I actually strongly disagree with this based on my experience. And so does Martin,
00:10:48.840 -->
00:10:54.920by the way. Yeah, I do too. So I think when you turn an agentic LLM loose on a Greenfield project,
00:10:55.340 -->
00:11:00.340it just does whatever is popular on the internet that it's done, or it thinks it's trained on or
00:11:00.360 -->
00:11:04.520whatever, when you turn it loose on a greenfield project, if you're careful and you set up the
00:11:04.640 -->
00:11:08.860guidelines, it can follow the same patterns that are already established in the code and use the
00:11:08.980 -->
00:11:15.460same libraries and use the same techniques. And I just used, I spent, I would say probably an hour
00:11:15.880 -->
00:11:22.000coming up with a prompt to do a security review for some of my code, an hour before I started,
00:11:22.400 -->
00:11:28.640even before I try that, working on exactly what I wanted it to do, how I wanted to do it,
00:11:28.700 -->
00:11:30.300how I wanted to go about fixing it.
00:11:30.480 -->
00:11:36.600And I got what looks like top tier security pen testing analysis on a code base.
00:11:36.980 -->
00:11:38.240And I thought that is awesome.
00:11:38.380 -->
00:11:40.380And that's because it was not a greenfield project.
00:11:40.780 -->
00:11:44.760It was thousands and thousands of lines of code that had been around for a long time
00:11:44.880 -->
00:11:46.560with established patterns of solving things.
00:11:46.700 -->
00:11:48.260And it was very, very, very good.
00:11:48.540 -->
00:11:53.200So yeah, I would like to put it on the world that that is when done right.
00:11:53.340 -->
00:11:56.600That is not, I think greenfield projects are less good, not better.
00:11:56.960 -->
00:11:57.060Yeah.
00:11:57.200 -->
00:11:58.560Because they have nothing to go on.
00:11:58.680 -->
00:12:02.740right they just go on whatever they feel like i haven't really done a lot of greenfield on
00:12:03.030 -->
00:12:10.840stuff i think greenfield for for throwaway code or for just like uh like scripts that you it just has
00:12:10.840 -->
00:12:16.560to get the job done sort of the internal thing i think those are fine but um oh gosh i had an
00:12:16.960 -->
00:12:23.160incredible recent experience with just um getting stuck on an algorithm that was too slow and uh
00:12:23.300 -->
00:12:31.120i spent an hour with an llm uh and an agent um trying to um get it faster and it was like an
00:12:31.360 -->
00:12:37.840intense hour you know yeah exactly and then i just threw it in a branch and slept on it and
00:12:37.980 -->
00:12:43.200came back the next day and made spent another hour trying to make sure i understood all of it
00:12:43.370 -->
00:12:48.800and i and um and tweaking it more there were some non-pythonic things that i got rid of it had
00:12:48.700 -->
00:12:53.140recursion in there and i'm like let's get rid of that and we actually made it faster than we did
00:12:53.300 -->
00:12:59.300before so spending a like don't don't stop with it works go a little bit further to make sure that
00:12:59.400 -->
00:13:03.740you can maintain it in the future it doesn't take that much extra time and you're going to still be
00:13:03.840 -->
00:13:08.620proud of it and it was an incredible experience and i'm definitely going to do that again so yeah
00:13:09.280 -->
00:13:15.519definitely should be partners like a like a super excited coding buddy not not just a junior you just
00:13:16.420 -->
00:13:22.460send stuff to and make it go and then i but i also spent some time an hour recently or two
00:13:22.960 -->
00:13:30.000reviewing some test code from a junior developer and i obviously this stuff was just spit out by a
00:13:30.140 -->
00:13:38.980agent and um and it didn't make sense and i and so it just took time away for me to review bad code
00:13:39.110 -->
00:13:44.660and that's going to take away from your experts as well so yeah yeah that's a very good
00:13:44.460 -->
00:13:44.540Good point.
00:13:45.060 -->
00:13:46.220It is indeed.
00:13:47.400 -->
00:13:47.720All right.
00:13:47.760 -->
00:13:49.240We should have a warning or something about that, Brian.
00:13:49.360 -->
00:13:50.460A warning, yeah.
00:13:50.730 -->
00:13:54.600So last episode, we talked about deprecation warnings.
00:13:55.480 -->
00:13:59.180And I have to admit, I didn't do enough research on that.
00:13:59.250 -->
00:14:01.160So I'm glad that listeners chimed in.
00:14:01.820 -->
00:14:03.380We got a couple of listener feedbacks.
00:14:03.400 -->
00:14:06.500One of them I'm going to credit because we got his email right up here.
00:14:06.660 -->
00:14:12.140John Hagan mentioned you should totally use from warnings, import deprecated,
00:14:12.360 -->
00:14:17.500And instead of calling your own, calling warn, use the decorator deprecating.
00:14:17.820 -->
00:14:20.900And I totally, now after playing with it, totally agree.
00:14:21.120 -->
00:14:21.420It's awesome.
00:14:21.580 -->
00:14:22.940So let's back up a little bit.
00:14:23.100 -->
00:14:29.440We started with this Seth Larson article about deprecations via warnings don't work for Python libraries.
00:14:29.760 -->
00:14:34.860And I kind of agree after experimenting because I played with it a bit.
00:14:35.020 -->
00:14:41.880And one of the things that I found out was in, so in the Python documentation, one of the things that's cool.
00:14:42.020 -->
00:14:45.440somebody mentioned this and I didn't really know about it is development mode.
00:14:45.690 -->
00:14:51.220So there's dash X dev and you can also set it with a Python dev mode environmental variable.
00:14:52.740 -->
00:14:57.020And it sets a bunch of stuff, including setting the default warnings to W.
00:14:57.340 -->
00:15:00.320And the reason why that's important, I'm like, why is that important?
00:15:00.680 -->
00:15:04.900The reason is important in Seth alludes to it, but doesn't point it out directly,
00:15:05.300 -->
00:15:10.820is in the dash WR argument for Python, you could say just ignore,
00:15:11.420 -->
00:15:12.640like ignore all warnings.
00:15:13.420 -->
00:15:14.720And I think it's just,
00:15:14.880 -->
00:15:16.200you can either ignore all warnings
00:15:16.440 -->
00:15:18.140or it even tells you, for example,
00:15:18.520 -->
00:15:20.300to ignore all your deprecation warnings,
00:15:20.440 -->
00:15:20.920do this.
00:15:21.400 -->
00:15:24.360Ouch, I kind of wish they hadn't mentioned that.
00:15:25.520 -->
00:15:26.960Don't encourage people, come on.
00:15:27.160 -->
00:15:28.000Don't encourage people.
00:15:28.400 -->
00:15:29.980Instead of ignore, somebody else,
00:15:30.540 -->
00:15:33.280and then again, sorry for whoever mentioned this,
00:15:33.280 -->
00:15:36.480but somebody mentioned just use once.
00:15:36.860 -->
00:15:40.180Ignore, like dash W once makes any warning
00:15:40.180 -->
00:15:42.960in your code show up once and not a whole bunch of times.
00:15:43.200 -->
00:15:47.220And it's the whole bunch of times that I think people turn it off for because it fills up
00:15:47.220 -->
00:15:48.860your CI logs and everything like that.
00:15:49.240 -->
00:15:50.680But you really should see it at least once.
00:15:51.000 -->
00:15:51.640I like the once.
00:15:51.820 -->
00:15:53.020You know what else I like about once?
00:15:53.120 -->
00:15:57.140The W once is the pronunciation is the same as just once.
00:15:57.460 -->
00:15:58.320That's just once.
00:15:58.780 -->
00:15:58.900Yeah.
00:16:00.040 -->
00:16:00.200Okay.
00:16:00.360 -->
00:16:01.540So I played with it.
00:16:01.580 -->
00:16:03.340I looked at this deprecation warning thing.
00:16:04.900 -->
00:16:10.160And we'll link to the documentation in Python as well.
00:16:10.560 -->
00:16:14.980But you can do it, combine both solutions, which I love.
00:16:15.200 -->
00:16:20.240So you can just go ahead and declare your own warning and use the deprecated.
00:16:20.560 -->
00:16:23.020And so I tried this out.
00:16:24.340 -->
00:16:30.580So what you do is you just say, create your own, just a class and derive it from user warning.
00:16:31.040 -->
00:16:32.660And you don't have to import anything for this.
00:16:32.820 -->
00:16:33.700This is just built in.
00:16:34.320 -->
00:16:36.100It doesn't have to do anything, just a passing class.
00:16:36.450 -->
00:16:49.140But then if you use this deprecated decorator and pass your new warning category as deprecated,
00:16:49.280 -->
00:16:52.120and this sounds complicated on the air, it's not.
00:16:53.860 -->
00:16:54.800We'll do a code example.
00:16:55.580 -->
00:17:01.360But what you get is this, I had it, warning both.
00:17:01.620 -->
00:17:03.880Oh, yeah, it's over just right on the same screenshot.
00:17:04.400 -->
00:17:12.140The cool thing is that mypy and other type checkers, when you use the deprecated, will flag that it's a problem.
00:17:13.100 -->
00:17:14.500And I was doing it.
00:17:14.520 -->
00:17:18.839I think PyCharm does the same thing, but I was doing it in VS Code.
00:17:19.060 -->
00:17:24.800And what happens if you've got this deprecated decorator is that the IDE will just cross it out.
00:17:25.180 -->
00:17:26.760And they're like, why is this crossed out?
00:17:26.860 -->
00:17:29.500And if you hover over it, it'll say, oh, this is deprecated.
00:17:29.820 -->
00:17:30.880Yeah, it's like a strikethrough.
00:17:30.880 -->
00:17:31.780It says, don't use it.
00:17:31.780 -->
00:17:32.220I love it.
00:17:32.460 -->
00:17:36.360Yeah, it's very visual and it will make you like look at it.
00:17:36.390 -->
00:17:41.600So I think that instead of just calling more and yeah, please use the deprecated.
00:17:42.500 -->
00:17:44.840And then I was playing with pytest as well.
00:17:45.440 -->
00:17:46.740And what did we get?
00:17:47.620 -->
00:17:49.220I wrote it down in the show notes.
00:17:50.900 -->
00:17:54.260Yeah, you want to pass in the dash W just like you would for Python.
00:17:54.460 -->
00:18:02.260If you do dash W error within pytest, at least in one of your tests to find out actually all of the tests.
00:18:02.360 -->
00:18:03.220So that'll turn.
00:18:03.630 -->
00:18:07.320Well, even by default, pytest will warn you and do the warnings.
00:18:07.700 -->
00:18:10.060But if you're in CI, maybe you're not watching those.
00:18:10.990 -->
00:18:18.060So in CI, having a check for those deprecation warnings with dash W error will flag all those failures.
00:18:18.620 -->
00:18:22.540So anyway, lots of great information from readers.
00:18:22.770 -->
00:18:23.920So thank you for listening.
00:18:24.420 -->
00:18:28.720We got, if they read the newsletter you send, they could be readers.
00:18:29.160 -->
00:18:30.060Yeah, they could be readers.
00:18:31.040 -->
00:18:34.520John pointed out that you can set an environment variable,
00:18:34.980 -->
00:18:39.660and people may be hesitant to just set an environment variable for their computer
00:18:40.020 -->
00:18:44.160to turn Python into dev mode, which makes it slower potentially.
00:18:44.580 -->
00:18:47.920But if you create a virtual environment, which you should be doing,
00:18:48.360 -->
00:18:51.000there's an activation script in that virtual environment,
00:18:51.420 -->
00:18:56.520And you can just go and export that environment variable
00:18:56.860 -->
00:18:59.220set to debug or whatever mode you want to set it to.
00:18:59.300 -->
00:18:59.620- Oh yeah.
00:19:00.500 -->
00:19:02.560- Only when you activate that virtual environment.
00:19:02.630 -->
00:19:03.920So if you're on a particular project,
00:19:04.160 -->
00:19:05.040you're like this one really,
00:19:05.470 -->
00:19:06.540I don't care about speed right now,
00:19:06.540 -->
00:19:07.800I just care about getting things right.
00:19:08.300 -->
00:19:09.340Tweak its virtual environment,
00:19:09.960 -->
00:19:11.580that doesn't have really many knock on effects.
00:19:11.760 -->
00:19:13.400So that's a cool hack I think.
00:19:13.740 -->
00:19:15.760- Yeah, it's a great place to throw in
00:19:15.940 -->
00:19:19.340temporary pytest flags as well or any runtime flags.
00:19:19.780 -->
00:19:21.380- Exactly, it's not just about
00:19:21.400 -->
00:19:24.240This dev thing, like it's like a little shell script basically.
00:19:24.760 -->
00:19:24.840Yeah.
00:19:25.380 -->
00:19:25.500Indeed.
00:19:26.020 -->
00:19:27.320You could do it for open source things, Brian.
00:19:27.720 -->
00:19:28.540I love open source.
00:19:29.580 -->
00:19:30.260So, oh yeah.
00:19:30.280 -->
00:19:31.220So here's another article.
00:19:31.680 -->
00:19:36.340And this one is by Thomas Dupree called How Foss One and Why It Matters.
00:19:36.440 -->
00:19:38.060This is a pretty interesting article.
00:19:38.620 -->
00:19:43.940And what it looks at open source, free and open source software angle from is not just
00:19:44.320 -->
00:19:46.520why do people like writing open source software?
00:19:46.820 -->
00:19:56.060Why do they like it better than having locked away software or having to pay or having bugs you can't fix or black box security issues potentially?
00:19:56.460 -->
00:20:00.820As we've seen lately, open source has its whole supply chain story on that.
00:20:00.940 -->
00:20:02.600That's different in a different way.
00:20:02.740 -->
00:20:09.300But anyway, it really looks at it from why has it won from a company perspective, especially large companies.
00:20:09.800 -->
00:20:09.880Okay.
00:20:10.240 -->
00:20:10.440Okay.
00:20:10.660 -->
00:20:13.120So it's really interesting.
00:20:13.600 -->
00:20:16.360So it says like, look, why did it win?
00:20:16.500 -->
00:20:17.680Well, people want to pay less.
00:20:19.000 -->
00:20:23.320So paying less, aka free software, that's great, right?
00:20:23.720 -->
00:20:25.420Well, how do companies make more money?
00:20:25.680 -->
00:20:30.280They either make more profit or they have fewer expenses for a fixed level of profit.
00:20:30.480 -->
00:20:32.140So not paying for software is great.
00:20:32.420 -->
00:20:34.400But that's not just open source software.
00:20:34.560 -->
00:20:35.660That's for everything.
00:20:35.940 -->
00:20:38.620And so companies implement what's called cost control.
00:20:38.880 -->
00:20:44.020So business term for making buying things painful, hard, and time consuming as possible.
00:20:44.100 -->
00:20:47.220So employees will either not or hate doing it.
00:20:47.520 -->
00:20:47.760All right.
00:20:48.580 -->
00:20:54.300So an example is like, hey, I need a cool date picker for our site that imagine open source doesn't exist.
00:20:54.740 -->
00:21:00.320Well, someone's going to have to start by creating a ticket to get this date picker.
00:21:00.420 -->
00:21:04.480And then, well, we have to research the various commercial options.
00:21:05.000 -->
00:21:07.060We could go to procurement and have them find it.
00:21:07.060 -->
00:21:08.260But what do they know about date pickers?
00:21:08.360 -->
00:21:09.260So we're going to do that ourself.
00:21:09.440 -->
00:21:10.460We're going to get a report.
00:21:10.840 -->
00:21:12.640We're going to bring it to procurement.
00:21:13.000 -->
00:21:15.780And when we get there, then procurement says, okay, great.
00:21:16.320 -->
00:21:17.820You're going to go with this company? Fine.
00:21:17.960 -->
00:21:21.460So what we're going to do is first we're going to need to set up a vendor agreement with them
00:21:21.600 -->
00:21:23.700because it turns out they're not currently a vendor of ours.
00:21:24.480 -->
00:21:29.460So we have contracts, we have reviews, we have negotiations, all for a stupid date picker, right?
00:21:30.440 -->
00:21:31.880It's just like, what is going on?
00:21:32.660 -->
00:21:37.480And then on top of it, there's all these copyright laws like indemnification of like,
00:21:37.520 -->
00:21:42.620you prove you haven't stolen from another company then to resell this to me in like some other way
00:21:42.640 -->
00:21:47.180of that stuff, it's like eventually you get permission to buy the thing and then you could
00:21:47.210 -->
00:21:51.860start using it. So open source software enters the scene. It says this comes with a pre-agreed,
00:21:52.010 -->
00:21:57.800pre-reviewed license, MIT, Apache, whatever. And so the lawyers are already like, yep,
00:21:57.890 -->
00:22:01.320we know what that is. We know how to deal with that. There's no pain. So there's no
00:22:01.780 -->
00:22:07.640vendor research, vendor approval, contracts, copyright, all that kind of stuff. And so it
00:22:07.620 -->
00:22:13.440really interesting like is this hack to skip around this like make buying stuff at companies
00:22:13.980 -->
00:22:19.240super hard right so it wasn't always that way though it took a long time for companies to
00:22:19.390 -->
00:22:24.040realize that open source was fine yes that's for sure i mean they did have to work through it but
00:22:24.040 -->
00:22:28.120i think once they kind of it feels like they had to go through this the same process we're kind of
00:22:28.280 -->
00:22:33.620describing once in a sort of an abstract sense like okay then well now you can just go you know
00:22:33.460 -->
00:22:38.700know what I mean? It says, Hey, look, it also works both ways. If you're a FOSS maintainer,
00:22:39.010 -->
00:22:43.980the miracle of your software passing, bypassing copyright laws and liabilities and procurement
00:22:44.520 -->
00:22:49.360means that you can get your software out there and have people use it pretty easy, right? Because
00:22:49.880 -->
00:22:55.440your stuff is much easier to adopt because it's open source. I mean, I've been on the vendor side
00:22:55.440 -->
00:23:03.340of these negotiations and paperwork and accounting and legal more than once. And it sucks. It sucks.
00:23:03.480 -->
00:23:05.880I mean, look, Hey, people want to put me in as a vendor and buy stuff.
00:23:06.040 -->
00:23:06.520I'm here for it.
00:23:06.600 -->
00:23:08.620But at the same time, it is not fun.
00:23:08.900 -->
00:23:08.960Right.
00:23:09.020 -->
00:23:11.540And there needs to be like, if you're just a hobbyist, like, well, no.
00:23:12.000 -->
00:23:12.260All right.
00:23:12.520 -->
00:23:16.240So the final bit of this article, the final bit of this thought piece is you can't go back.
00:23:16.800 -->
00:23:22.400So if we're trying to solve, if we're trying to solve the sustainability of open source
00:23:22.680 -->
00:23:27.140software, you have to keep in mind the reason, one of the main reasons it's so popular is
00:23:27.200 -->
00:23:29.920it skipped the copyright rule stuff.
00:23:30.040 -->
00:23:33.260It skipped the vendor onboarding and all these things.
00:23:33.340 -->
00:23:41.180So if your solution to fix sustainability is to recreate any of the supply chain framework problem, your solution is dead on arrival.
00:23:41.420 -->
00:23:45.220So I think that's what this is why I wanted to bring up this article.
00:23:45.430 -->
00:23:46.720I put it at the end of the year.
00:23:46.780 -->
00:23:50.920It's kind of like I would love to see more sustainability options for open source.
00:23:51.130 -->
00:23:54.060But I do think that this guy is on to something here.
00:23:54.310 -->
00:23:59.360I do think that Thomas is on to something with his skipping the legal, skipping the procurement.
00:23:59.920 -->
00:24:02.780And if we put it back and say, well, you got to set up a vendor agreement with us again.
00:24:02.900 -->
00:24:06.800And then you're unraveling a lot of the things that made it a really good fit.
00:24:07.360 -->
00:24:07.580Yeah.
00:24:08.740 -->
00:24:11.860The article does a lot more detailed explanation than I did,
00:24:11.960 -->
00:24:13.340but they're for people to think about.
00:24:13.580 -->
00:24:16.580I hope this, yeah, I hope we don't go back.
00:24:17.340 -->
00:24:19.480There are pressures to push it back.
00:24:20.160 -->
00:24:23.880Like you were saying, there's the projects that just, they can't,
00:24:24.120 -->
00:24:27.520they know that enterprise is using it and they're not getting paid.
00:24:27.820 -->
00:24:29.320And that isn't as a bummer.
00:24:31.000 -->
00:24:34.660And if you're not charging anything, you can't just make it up in volume.
00:24:37.160 -->
00:24:39.500We've tripled our revenue from what it was last year.
00:24:39.620 -->
00:24:40.040Still zero.
00:24:40.280 -->
00:24:51.520With things like trying to secure the supply chain, we are, I mean, even open source is part of the supply chain, whether or not you want to believe it is.
00:24:51.780 -->
00:25:00.200And so there are pressures to, you know, put SBOMs on or the software bill of materials to verify all your subcomponents and all that stuff.
00:25:01.020 -->
00:25:07.660Python is helping to make that easier for individual maintainers of projects, which is cool.
00:25:08.280 -->
00:25:10.580But it's still some extra work.
00:25:10.620 -->
00:25:14.720And I don't think it's fair that maintainers are having to do that work.
00:25:15.020 -->
00:25:17.040And they don't benefit from it.
00:25:17.120 -->
00:25:17.880The companies benefit.
00:25:19.459 -->
00:25:26.480And we do need to find a way to get money to vendors better or money to contributors.
00:25:27.300 -->
00:25:28.420Yeah, I 100% agree.
00:25:28.720 -->
00:25:29.000I do.
00:25:30.660 -->
00:25:31.180But yeah.
00:25:31.540 -->
00:25:35.160I don't have a great direct, like force them to do it type of answer.
00:25:35.440 -->
00:25:35.960But yeah.
00:25:36.280 -->
00:25:39.520Hopefully many of them will see like, hey, we benefit from this thing.
00:25:39.860 -->
00:25:42.900If we were a major sponsor of this project,
00:25:43.440 -->
00:25:45.920we could have the ear of the maintainer team
00:25:46.330 -->
00:25:47.680to get the thing that we really want.
00:25:47.860 -->
00:25:49.500I think that's a possibility.
00:25:50.380 -->
00:25:54.500Yeah, there might also be some like maintenance agreements sort of stuff.
00:25:55.900 -->
00:25:57.280It's definitely open source,
00:25:57.500 -->
00:26:01.300but also whoever the main maintainer is,
00:26:02.639 -->
00:26:06.960is for a small fee promising to look at your defect reports
00:26:08.039 -->
00:26:09.280or things like that.
00:26:09.820 -->
00:26:13.400Yeah, there's this whole productized consulting sort of thing
00:26:13.580 -->
00:26:14.400I think would be pretty good,
00:26:14.500 -->
00:26:15.760where it's like you're going to pay,
00:26:15.860 -->
00:26:17.620basically I'm going to pay you a retainer
00:26:17.860 -->
00:26:20.020and you have a certain amount of credits you can redeem
00:26:20.300 -->
00:26:21.540that expire at the end of the month
00:26:21.800 -->
00:26:24.220for me to potentially come and do exactly like what you're suggesting.
00:26:24.700 -->
00:26:25.740And if you don't use it, that's fine.
00:26:25.800 -->
00:26:29.400but I'm here at the drop of a hat if you need me, sort of.
00:26:29.660 -->
00:26:29.980Yeah.
00:26:30.060 -->
00:26:33.300You pay me $5,000 a month and I may or may not have to work for you that month,
00:26:33.480 -->
00:26:35.000but you know what, that'd be good.
00:26:35.360 -->
00:26:38.720But at the very least, or even having lower ones so more people do it
00:26:38.940 -->
00:26:42.940and to make sure that things are actually stayed maintained
00:26:43.640 -->
00:26:45.420because there's a lot of stuff that's just done
00:26:45.660 -->
00:26:48.140and you can't tell whether or not it's really maintained.
00:26:48.440 -->
00:26:48.540Anyway.
00:26:49.220 -->
00:26:50.700Yeah, that's 100%.
00:26:51.480 -->
00:26:51.880100%.
00:26:52.280 -->
00:26:55.080In fact, you might even want to go and find just a complete,
00:26:55.200 -->
00:26:56.640I don't even put it on GitHub anymore.
00:26:56.840 -->
00:26:58.640That's how much I'm changing my mind about open source.
00:26:59.440 -->
00:27:08.520Yeah, so this next topic was going to be about looking for GitHub alternatives.
00:27:09.300 -->
00:27:11.360And so I just left it as the title.
00:27:12.600 -->
00:27:14.400Should I be looking for GitHub alternatives?
00:27:14.570 -->
00:27:16.200And why am I talking about that?
00:27:16.290 -->
00:27:17.160I mean, GitHub's awesome.
00:27:17.270 -->
00:27:17.700Why would you?
00:27:18.060 -->
00:27:19.140Anyway, I think it's great.
00:27:19.740 -->
00:27:20.860I'm still happy with GitHub.
00:27:21.300 -->
00:27:23.020But they sort of fumbled recently.
00:27:23.150 -->
00:27:24.820Did you hear about all this, Michael?
00:27:25.680 -->
00:27:31.380yes with the billing oh yes I heard about oh yeah so so what happened what bothers me more even is
00:27:31.500 -->
00:27:38.080the the clear lack of craftsmanship and care around the code that runs these it's like you get janky
00:27:38.200 -->
00:27:42.460code and we're gonna charge you oh and our bug is also gonna sometimes make it run for hours and
00:27:42.460 -->
00:27:48.420then we'll charge you still for that too yeah so there's some pricing changes and the message
00:27:49.160 -->
00:27:53.920pricing changes and they like released it on December 15th and then they they think and then
00:27:53.880 -->
00:27:59.860just recently updated it i can't i don't know when the update was on oh the original announcement
00:27:59.920 -->
00:28:07.820was on the 16th um there's an update to it so they um the gav actions it's way popular than they
00:28:08.000 -->
00:28:12.760thought it would be and actually like just tons of people just switched from and it happened at a
00:28:13.020 -->
00:28:17.340similar a lot of times where people were like travis was imploding so people were trying to
00:28:17.560 -->
00:28:23.840uh leave travis and were like oh you have actions is here let's just use that um that's part of it
00:28:24.200 -->
00:28:26.500But it also benefited GitHub a lot.
00:28:26.510 -->
00:28:29.820A lot of projects started using it more.
00:28:31.100 -->
00:28:34.560However, I get that they have to pay for that compute somehow.
00:28:35.060 -->
00:28:37.800However, they've said, let's see,
00:28:38.590 -->
00:28:42.740they're going to have GitHub or hosted runners
00:28:43.320 -->
00:28:46.260are going to reduce their price by 39%.
00:28:46.280 -->
00:28:48.180And I actually didn't realize that they were charging
00:28:48.480 -->
00:28:51.680because apparently I don't use it enough to get billed for it.
00:28:52.240 -->
00:28:58.260But in the announcement, they also said that you could see the hosted the non hosted runner.
00:28:58.310 -->
00:29:03.080So like the code that you you've got your own computer set up to run your stuff.
00:29:03.470 -->
00:29:04.920They were going to charge for that, too.
00:29:05.600 -->
00:29:08.660Look, I think that's insane.
00:29:09.120 -->
00:29:09.960It was not a lot.
00:29:09.960 -->
00:29:13.940It was like two tenths of a cent per minute or something like that.
00:29:14.580 -->
00:29:21.240But but that's like it's just sitting there waiting for your GitHub runner, your get runner to finish.
00:29:21.580 -->
00:29:22.860Why would they charge for that?
00:29:23.070 -->
00:29:23.720Anyway, I don't know.
00:29:24.480 -->
00:29:25.260There's been a change.
00:29:25.620 -->
00:29:29.180So we're going to link to the announcement of the pricing change.
00:29:29.290 -->
00:29:33.260I didn't get too much into the details of the pricing change,
00:29:34.380 -->
00:29:37.680but it's kind of weird to charge the same amount for both,
00:29:37.950 -->
00:29:40.220whether or not you're using a hosted runner or your own runner.
00:29:41.140 -->
00:29:41.560That's weird.
00:29:41.820 -->
00:29:43.220So they've actually backed off.
00:29:43.440 -->
00:29:49.580So they're going to postpone the billing for the self-hosted.
00:29:49.880 -->
00:29:51.640They didn't say they're going to not do it, though.
00:29:51.800 -->
00:29:52.440It's just postponed.
00:29:52.520 -->
00:29:53.200Yeah, that's weird.
00:29:53.340 -->
00:30:00.640So I get the argument like, wow, we thought we'd have to buy 100 computers and we're on our 100,000th VM.
00:30:00.820 -->
00:30:02.140We've set up this as a little out of control.
00:30:02.490 -->
00:30:03.880That doesn't apply to self-hosted.
00:30:04.840 -->
00:30:10.480Well, I mean, the actions are still running, so they're not really charging that much for the actions.
00:30:10.840 -->
00:30:16.840Just the, I mean, all the rest of the stuff is mostly coming for free.
00:30:17.320 -->
00:30:17.740It's just.
00:30:17.770 -->
00:30:18.120Right, right.
00:30:18.280 -->
00:30:21.220But I mean, if you have a self-hosted GitHub Action runner,
00:30:21.780 -->
00:30:23.500they're not paying for the compute to run it
00:30:23.500 -->
00:30:25.720because you're self-hosting.
00:30:26.060 -->
00:30:26.280Yeah.
00:30:27.100 -->
00:30:30.020Like maybe, like, and if they are having to,
00:30:30.320 -->
00:30:32.060I mean, they have to have something that sits around
00:30:32.130 -->
00:30:33.320and like waits for it or something.
00:30:33.410 -->
00:30:33.780I don't know.
00:30:34.320 -->
00:30:37.480But figure out how to do that way cheaper.
00:30:37.570 -->
00:30:39.480It should be like super cheap.
00:30:40.140 -->
00:30:41.200Anyway, because that's like,
00:30:41.440 -->
00:30:43.380that's one of the reasons why people have their own runner
00:30:43.600 -->
00:30:45.480is to save on compute.
00:30:45.820 -->
00:30:46.940So yeah, that was weird.
00:30:47.360 -->
00:30:50.640So I went ahead and like, you know, why not look at other stuff?
00:30:50.690 -->
00:30:51.860So let's look at some other.
00:30:52.500 -->
00:30:53.420That's the warning thing.
00:30:53.880 -->
00:30:54.920Some other alternatives.
00:30:55.280 -->
00:30:56.280So I found this article.
00:30:56.690 -->
00:30:57.560I just searched for it.
00:30:57.820 -->
00:31:01.700There's four GitHub alternatives that are just as good or better.
00:31:02.100 -->
00:31:03.760And there's some that I hadn't heard of.
00:31:03.960 -->
00:31:04.740So this is kind of fun.
00:31:05.260 -->
00:31:06.300I hadn't heard of Codeberg.
00:31:06.740 -->
00:31:13.980So nonprofit community-led effort that provides Git hosting and other services for free and open source projects.
00:31:14.400 -->
00:31:18.800Okay, so it's not for private projects or something, but there's a lot here.
00:31:19.040 -->
00:31:20.440So maybe something to look into.
00:31:21.480 -->
00:31:24.340But I don't think that GitHub is charging that much for open source either.
00:31:26.550 -->
00:31:28.100But it's fun to look at some of these alternatives.
00:31:28.500 -->
00:31:32.220Yeah, I think Codeberg only lets you have open source.
00:31:32.440 -->
00:31:33.660Just only open source.
00:31:33.680 -->
00:31:34.780Yeah, it's like free.
00:31:34.850 -->
00:31:37.520You almost got to apply to a join sort of thing.
00:31:39.060 -->
00:31:40.300And then Bitbucket.
00:31:40.620 -->
00:31:44.040I mean, like, I didn't, I guess I forgot it's around.
00:31:44.680 -->
00:31:45.380Sorry, Bitbucket.
00:31:45.380 -->
00:31:45.400I did too.
00:31:46.160 -->
00:31:53.440I use Sourcetree all the time, which was, I believe, made sort of as the front end of Bitbucket if you want to desktop thing.
00:31:53.780 -->
00:31:53.920Yeah.
00:31:54.120 -->
00:31:55.540And still, I forgot Bitbucket exists.
00:31:57.660 -->
00:32:03.340So, Bitbucket, yeah, it's not, oldest established competitor of GitHub.
00:32:03.700 -->
00:32:05.120I think it predates GitHub.
00:32:05.360 -->
00:32:05.780I'm not sure.
00:32:06.380 -->
00:32:09.140But it launched around the same time in 2008.
00:32:09.220 -->
00:32:14.140it's still maintained it's still there so you can um and the interface is a lot better than it was
00:32:14.250 -->
00:32:21.480way back in the 2008 9 10 time frame when i was using it but uh bit bucket git lab and actually
00:32:21.860 -->
00:32:28.680git lab's a solid alternative i use uh git lab at work and um the thing that yeah i like git lab
00:32:28.890 -->
00:32:37.459uh definitely a an option to look into it uh git ea g g-i-t-e-a haven't heard of this before but
00:32:37.480 -->
00:32:42.480it's around as well and then while i was looking around for this i also came up came around some
00:32:42.820 -->
00:32:48.480some comments on socials about tangled it's an alpha it's a new it's a new thing it came out
00:32:48.650 -->
00:32:56.780this year i think um a uh tightly knit social coding so they're really trying to um and they're
00:32:57.260 -->
00:33:04.220launching as a lightweight lightweight GitHub repo get repo hosting but the way they're
00:33:04.220 -->
00:33:09.420dealing with it, I think, is the pipelines and the runs are running. I don't know if they have
00:33:09.600 -->
00:33:14.580runners in the cloud. I think it looks like they're mainly trying to get you to run your own runners.
00:33:15.100 -->
00:33:21.500So it's interesting. I could be wrong, but there are definitely some different options around there
00:33:21.680 -->
00:33:27.380if you really do want to get off GitHub. I like GitLab and GitHub mostly.
00:33:28.460 -->
00:33:33.280I'm always tempted to do some self-hosted thing. I love the idea of it so much.
00:33:33.600 -->
00:33:33.740Yeah.
00:33:34.460 -->
00:33:36.400So I have to talk myself off the ledge periodically.
00:33:37.460 -->
00:33:40.400And if you're doing something just for you,
00:33:40.420 -->
00:33:43.200I think it's cool to pick something based on features, right?
00:33:43.400 -->
00:33:46.180Or some kind of philosophy of the company.
00:33:46.300 -->
00:33:48.860Like this one is only open source, or this one is super privacy,
00:33:48.940 -->
00:33:52.260or this one is European-based or whatever, right?
00:33:52.580 -->
00:33:54.920However, if you're doing open source
00:33:55.200 -->
00:33:57.500and you actually want it to be used by people,
00:33:57.880 -->
00:33:58.860there's no other option than GitHub.
00:33:59.600 -->
00:34:00.520Well, okay.
00:34:00.880 -->
00:34:05.220I think if you really want people to interact with it,
00:34:05.860 -->
00:34:07.720GitHub, and contribute.
00:34:07.740 -->
00:34:09.220I mean, contributors, yes, exactly.
00:34:09.639 -->
00:34:13.700And file defects and all that sort of stuff, GitHub.
00:34:14.060 -->
00:34:17.840But I've seen a lot of projects that a lot of the community
00:34:17.980 -->
00:34:21.159is just complaining, either complaining
00:34:21.520 -->
00:34:24.100or asking for features that aren't even part of it.
00:34:24.399 -->
00:34:28.940So you're doing, basically, if you don't want interact,
00:34:29.179 -->
00:34:32.080if you want people to use it, it needs to be on PyPI for Python.
00:34:32.409 -->
00:34:38.340But if you really don't want people to file defects and contribute junk,
00:34:39.310 -->
00:34:42.600yeah, I think switching to GitLab or something like that totally makes sense.
00:34:42.899 -->
00:34:43.139Yeah.
00:34:43.350 -->
00:34:45.679I mean, it's like saying, I don't like that Twitter went away,
00:34:45.919 -->
00:34:48.379so I'm going to set up my own private social media
00:34:48.550 -->
00:34:49.720and then invite my friends to join.
00:34:50.240 -->
00:34:52.379They may or may, they probably are not going to come.
00:34:52.710 -->
00:34:55.200If they do, they're probably going to not visit it after three days.
00:34:55.379 -->
00:34:55.679You know what I mean?
00:34:55.840 -->
00:34:58.199It's like, even though these things are awesome in GitHub
00:34:58.220 -->
00:35:00.140as being not ideal in some ways.
00:35:00.500 -->
00:35:00.700Yeah.
00:35:01.060 -->
00:35:02.480The truth of social stuff
00:35:02.540 -->
00:35:03.880is you got to be where the people are.
00:35:04.280 -->
00:35:05.480Otherwise, it's tough to work with.
00:35:05.660 -->
00:35:08.580So anyway, that's mostly a note to myself in the future.
00:35:08.940 -->
00:35:10.340Anyway, okay.
00:35:11.600 -->
00:35:11.960All right.
00:35:12.340 -->
00:35:13.400How are we feeling about extras?
00:35:13.960 -->
00:35:15.900I have a couple extras, but why don't you go?
00:35:16.260 -->
00:35:16.360Okay.
00:35:16.820 -->
00:35:18.700Let's talk about PyCharm for a second.
00:35:19.040 -->
00:35:21.060So I'm a big fan of Ruff.
00:35:21.500 -->
00:35:22.540No doubt about that.
00:35:22.740 -->
00:35:25.020I'm also a fan of Pyrefly,
00:35:25.260 -->
00:35:26.380which I've been using a lot lately,
00:35:26.740 -->
00:35:29.520And ty, which I believe ty just went into beta.
00:35:29.820 -->
00:35:30.760Shouldn't that be one of our items?
00:35:30.930 -->
00:35:31.940I believe it should be.
00:35:31.940 -->
00:35:32.680It probably should.
00:35:33.060 -->
00:35:39.820But ty, the one from Astral, that is sort of the high-performance companion or frenemy of Pyrefly,
00:35:40.250 -->
00:35:43.640they both are now in beta mode.
00:35:44.300 -->
00:35:49.740And with the latest release of PyCharm, it expands its LSP support
00:35:49.810 -->
00:35:54.940so that it has native integration for Ruff, ty, and Pyrefly plus Pyrite.
00:35:55.300 -->
00:35:57.660And this news comes to us from Daniel Muldmer, if I haven't said so.
00:35:57.690 -->
00:35:58.820So thanks, Dean, for sending that in.
00:35:59.180 -->
00:36:06.140And there's actually a whole link, a page which I'll link to about the LSP support and how you turn that on if you want.
00:36:06.150 -->
00:36:09.440So you can have, like, native Ruff integration and so on.
00:36:09.760 -->
00:36:11.060So anyway, shout out.
00:36:11.620 -->
00:36:12.260Shout out to that.
00:36:12.560 -->
00:36:15.360Also, RUF's page has a setup for how to do it in reverse.
00:36:15.840 -->
00:36:19.260The LSP being for language servers always throws me.
00:36:19.380 -->
00:36:21.760So I'm like, PyCharm now supports LISP, but that's weird.
00:36:22.240 -->
00:36:22.740I know.
00:36:24.640 -->
00:36:27.440Also, it feels redundant, an LSP server.
00:36:28.080 -->
00:36:29.420It's already a language server.
00:36:29.880 -->
00:36:31.420I guess a language server, protocol server.
00:36:31.960 -->
00:36:32.840Shouldn't it just be a language server?
00:36:33.040 -->
00:36:33.460I don't know.
00:36:33.820 -->
00:36:38.180It's like saying it's an HTTP website or something.
00:36:38.260 -->
00:36:38.680I don't know.
00:36:39.700 -->
00:36:41.420It's HTTP protocol.
00:36:41.940 -->
00:36:42.020Yeah.
00:36:42.200 -->
00:36:42.300Right.
00:36:42.380 -->
00:36:45.200It's an HTTP protocol website that you access with your browser now.
00:36:45.520 -->
00:36:45.660Okay.
00:36:45.880 -->
00:36:46.140Last thing.
00:36:46.660 -->
00:36:52.219I didn't save the link to this, but I thought this was a fun...
00:36:52.240 -->
00:36:55.380I saw this on xTwitter, and it's just like a little sign off,
00:36:55.780 -->
00:36:57.560like sort of wishing you well or like,
00:36:57.980 -->
00:36:59.220take care till next time I see you.
00:36:59.510 -->
00:37:00.680But here's the developer version.
00:37:01.030 -->
00:37:02.800May your bug tracker be forever empty.
00:37:03.100 -->
00:37:03.600Oh, nice.
00:37:03.800 -->
00:37:04.400Yeah, very nice.
00:37:04.540 -->
00:37:06.820It's a little bit of a play on Hunger Games, I believe.
00:37:07.100 -->
00:37:08.280May the odds be forever in your favor.
00:37:08.620 -->
00:37:09.160You know, that sort of thing.
00:37:09.300 -->
00:37:11.380Yeah, and like I was saying, if you really
00:37:11.540 -->
00:37:14.140want your bug tracker to be empty, move it away from GitHub.
00:37:15.119 -->
00:37:15.480Yep.
00:37:17.200 -->
00:37:19.560A couple of things, just a reminder to people,
00:37:20.100 -->
00:37:25.220I am taking this the rest of December off from updates to the lean TDD book,
00:37:25.560 -->
00:37:25.680but,
00:37:25.940 -->
00:37:29.960but this is an attempt to explain to people how to actually get productivity
00:37:30.200 -->
00:37:31.420gains from test driven development.
00:37:32.740 -->
00:37:33.760But I'll pick it up in January.
00:37:34.000 -->
00:37:35.180I'm hoping actually to finish the,
00:37:35.490 -->
00:37:36.980finish the entire first draft in January.
00:37:37.220 -->
00:37:37.640That's the goal.
00:37:37.960 -->
00:37:38.220That's a,
00:37:38.500 -->
00:37:39.400that's an aggressive goal,
00:37:39.700 -->
00:37:39.840but,
00:37:40.440 -->
00:37:41.740but I have all the stuff I want to do.
00:37:41.840 -->
00:37:42.260So we'll see.
00:37:43.400 -->
00:37:43.540Okay.
00:37:44.140 -->
00:37:44.360Finally,
00:37:45.060 -->
00:37:45.240pie,
00:37:45.660 -->
00:37:46.500the pie test course.
00:37:46.730 -->
00:37:48.200I just had somebody asked me this morning,
00:37:48.480 -->
00:37:51.240sent me an email and said, hey, I bought the book.
00:37:51.770 -->
00:37:53.780Love the Python Testament by this book.
00:37:54.600 -->
00:37:56.020And I'd like the course.
00:37:56.160 -->
00:37:56.740Can I get a discount?
00:37:57.040 -->
00:37:58.880And I just love people that just ask.
00:37:59.160 -->
00:38:01.320So I gave him a discount, of course,
00:38:01.540 -->
00:38:04.340but also so you can always email and ask.
00:38:04.840 -->
00:38:08.580But I also just decided to throw a 50% off sale
00:38:08.920 -->
00:38:10.040for the Christmas time.
00:38:10.240 -->
00:38:12.440So last minute Christmas shopping for yourself.
00:38:13.000 -->
00:38:14.320I'll put this in the show notes,
00:38:14.460 -->
00:38:18.620But if you use the code Xmas, X-M-A-S 2025,
00:38:19.480 -->
00:38:20.440I'll give you 50% off.
00:38:21.420 -->
00:38:22.240Very, very nice.
00:38:22.420 -->
00:38:24.280And I'm looking forward to a more efficient
00:38:24.980 -->
00:38:27.780and error-free 2026 Christmas
00:38:28.320 -->
00:38:31.120after Rudolph and team use your discount,
00:38:31.620 -->
00:38:32.860learn test-driven better.
00:38:33.320 -->
00:38:34.780And then, you know, next year round,
00:38:35.020 -->
00:38:36.540their deliveries will be more error-free.
00:38:36.980 -->
00:38:38.120You're doing a service for all the kids.
00:38:39.840 -->
00:38:39.940Yeah.
00:38:41.080 -->
00:38:41.200All right.
00:38:41.340 -->
00:38:41.680All right.
00:38:42.120 -->
00:38:43.220We got a couple of funny things.
00:38:43.680 -->
00:38:44.000We do.
00:38:44.200 -->
00:38:45.400One is mine, one is yours.
00:38:46.519 -->
00:38:48.560So what if you have errors in your code?
00:38:49.000 -->
00:38:52.920Well, that's what structured error handling is for.
00:38:53.200 -->
00:38:56.640Exceptions, you know, try, catch, try, accept, depending on your language.
00:38:57.080 -->
00:38:59.320But what do you do when the error happens, Brian?
00:38:59.700 -->
00:39:00.840What do you do when the error happens?
00:39:01.040 -->
00:39:02.580One possibility is to log it.
00:39:02.780 -->
00:39:04.320You've got to already have your login set up.
00:39:04.500 -->
00:39:05.780So, you know, there's a few steps.
00:39:05.840 -->
00:39:06.820I guess you could print it.
00:39:06.960 -->
00:39:07.780That's a bit of a help.
00:39:07.980 -->
00:39:11.320Maybe you just have a beep, play the beep sound when an exception happens.
00:39:11.420 -->
00:39:11.820I don't know.
00:39:12.100 -->
00:39:16.620Well, this person decided to write a simple two-liner.
00:39:17.080 -->
00:39:19.920This is in JavaScript in the example, but it could be just as well.
00:39:20.660 -->
00:39:25.080It says, if I catch an exception, I'm going to create a string that's
00:39:25.300 -->
00:39:29.860HTTP colon slash slash stackoverflow.com slash search question mark Q equals.
00:39:30.540 -->
00:39:34.440And you put the exception message in the end and then you open a browser to that.
00:39:34.760 -->
00:39:35.020Wow.
00:39:35.370 -->
00:39:35.780Problem solved.
00:39:36.260 -->
00:39:36.620Old school.
00:39:37.000 -->
00:39:37.540That's old school.
00:39:37.570 -->
00:39:40.980I think the modern version is to just call an OpenAI API.
00:39:41.720 -->
00:39:48.320Yeah, just ask your agent to run it, catch all exceptions, and fix it for you with PRs.
00:39:48.560 -->
00:39:49.000Exactly.
00:39:49.320 -->
00:39:52.380Yeah, just feel free to go ahead and auto-commit and publish it at production.
00:39:52.480 -->
00:39:53.320I don't need to review it.
00:39:53.740 -->
00:39:58.720Yeah, but be sure to label it with the prompt for that we discussed last week.
00:39:58.980 -->
00:39:59.260Exactly.
00:40:00.240 -->
00:40:00.580Let's see.
00:40:01.340 -->
00:40:01.920Any good comments?
00:40:02.120 -->
00:40:02.640Is this real?
00:40:02.900 -->
00:40:04.220This is hilarious, whether or not.
00:40:04.480 -->
00:40:09.620This is perfectly fine for local prod as well, as far as I'm concerned, production as in live.
00:40:10.700 -->
00:40:11.880Cutting out the middle, man.
00:40:12.540 -->
00:40:14.420Literally saves a precious three seconds.
00:40:14.820 -->
00:40:16.6803.531, actually.
00:40:18.580 -->
00:40:23.220Oh, and someone literally did write a ChatGPT alternative in the comments.
00:40:23.380 -->
00:40:23.480Nice.
00:40:24.240 -->
00:40:24.760Yeah, there you go.
00:40:25.160 -->
00:40:25.640Yeah, perfect.
00:40:26.060 -->
00:40:27.820So it even came up with a prompt for you.
00:40:28.000 -->
00:40:29.900Following error, it's occurred in my JavaScript application.
00:40:30.340 -->
00:40:31.880Please write code that resolves this issue.
00:40:31.980 -->
00:40:32.940Respond only with code.
00:40:33.000 -->
00:40:33.600Here's the exception.
00:40:35.840 -->
00:40:36.620Oh, yeah.
00:40:36.920 -->
00:40:37.180Pretty good.
00:40:37.360 -->
00:40:37.800Pretty good stuff.
00:40:37.920 -->
00:40:38.140All right.
00:40:38.460 -->
00:40:38.940This one's for you.
00:40:39.180 -->
00:40:39.580You got it.
00:40:40.180 -->
00:40:40.340Okay.
00:40:40.540 -->
00:40:44.000So last week, what did we title our podcast episode?
00:40:44.260 -->
00:40:46.920Something like LinkedIn something?
00:40:47.270 -->
00:40:52.860Anyway, somebody responded with, oh, LinkedIn Cringe.
00:40:53.100 -->
00:40:59.560Somebody called Archtoad said, LinkedIn Cringe made me think of this.
00:40:59.980 -->
00:41:02.120It's AI blockchain kombucha startup.
00:41:02.380 -->
00:41:09.739Anyway, this comes from Archtoad referring to a post by Tim Kellogg
00:41:10.000 -->
00:41:16.140using nano banana prompt, create a super annoying LinkedIn profile, which is amazing.
00:41:17.060 -->
00:41:19.040So the profile is great.
00:41:19.240 -->
00:41:26.780The with a with a like a hero image with somebody giving a speech and the on the screen is disrupt
00:41:26.880 -->
00:41:30.040or die, which is great, great screen capture.
00:41:30.980 -->
00:41:33.200But the let's see, let's read his profile.
00:41:33.620 -->
00:41:42.440He's a visionary, 10X growth ninja, chief evangelist at stealth mode, at a stealth mode AI blockchain kombucha startup.
00:41:43.640 -->
00:41:44.060That's awesome.
00:41:45.020 -->
00:41:49.680Helping Fortune 500 CEOs maximize human synergy means nothing.
00:41:51.040 -->
00:41:52.840A TEDx speaker applicant.
00:41:56.260 -->
00:41:58.300Not even TED, just like a TEDx.
00:41:58.600 -->
00:42:00.620Yeah, sure, TEDx, which is like the original.
00:42:01.300 -->
00:42:03.040I applied to speak.
00:42:03.280 -->
00:42:05.100I didn't get it, but I applied.
00:42:06.720 -->
00:42:08.280Forbes 30 Under 30 nominee.
00:42:08.340 -->
00:42:09.000Oh, my gosh.
00:42:09.280 -->
00:42:10.860A dog dad, coffee addict.
00:42:12.040 -->
00:42:13.800Why are you still reading this?
00:42:13.980 -->
00:42:14.540Let's connect.
00:42:17.360 -->
00:42:19.560About Bryden just doesn't just work.
00:42:19.720 -->
00:42:21.280Bryden shifts paradigms.
00:42:22.480 -->
00:42:23.600That's awesome.
00:42:24.020 -->
00:42:30.260Anyway, really good things I'd like to see in a LinkedIn profile.
00:42:30.260 -->
00:42:30.860This is pretty good.
00:42:31.200 -->
00:42:33.900I didn't realize that this originally came from Nana Banana.
00:42:34.070 -->
00:42:37.060I feel like the challenge is on for the follow-ups.
00:42:39.080 -->
00:42:39.200Yeah.
00:42:40.160 -->
00:42:40.680Pretty amazing.
00:42:40.930 -->
00:42:41.300Pretty amazing.
00:42:43.160 -->
00:42:49.600Anyway, it's been an amazing run for us and an amazing 2025, I think.
00:42:49.780 -->
00:42:50.400Things are going good.
00:42:50.820 -->
00:42:55.240And, I mean, aside from, like, you know, our entire country imploding.
00:42:55.720 -->
00:42:58.540But, you know, other than that, things have been going pretty good for you and I.
00:42:58.840 -->
00:43:04.600So it's been a, you know, the backhanded compliment curses, may you live in interesting
00:43:04.820 -->
00:43:05.880times while things are interesting.
00:43:06.340 -->
00:43:07.100Definitely interesting.
00:43:07.540 -->
00:43:11.760I do want to say though, thank you to everyone for listening this year, all the years and
00:43:11.860 -->
00:43:12.960here's to 2026.
00:43:13.560 -->
00:43:13.740Yeah.
00:43:14.060 -->
00:43:16.800happy holidays and hope everybody has a good new year.
00:43:17.120 -->
00:43:17.220Yep.
00:43:17.500 -->
00:43:17.560Bye.
00:43:17.800 -->
00:43:17.860Bye.
00:43:18.060 -->
00:43:18.280Thanks, Brian.