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

#163: Meditations on the Zen of Python

Published Thu, Jan 9, 2020, recorded Tue, Jan 7, 2020

Sponsored by us! Support us by visiting pythonbytes.fm/biz [courses] and pythonbytes.fm/pytest [book], or becoming a patron at patreon.com/pythonbytes

Brian #1: Meditations on the Zen of Python

  • Moshe Zadka
  • The Zen of Python is not "the rules of Python" or "guidelines of Python". It is full of contradiction and allusion. It is not intended to be followed: it is intended to be meditated upon.
  • Moshe give some of his thoughts on the different lines of the Zen of Python.
  • Full Zen of Python can be found here or in a REPL with import this
  • A few
    • Beautiful is better than ugly
      • Consistency helps. So black, flake8, pylint are useful.
      • “But even more important, only humans can judge what humans find beautiful. Code reviews and a collaborative approach to writing code are the only realistic way to build beautiful code. Listening to other people is an important skill in software development.”
    • Complex is better than complicated.
      • “When solving a hard problem, it is often the case that no simple solution will do. In that case, the most Pythonic strategy is to go "bottom-up." Build simple tools and combine them to solve the problem.”
    • Readability counts
      • “In the face of immense pressure to throw readability to the side and just "solve the problem," the Zen of Python reminds us: readability counts. Writing the code so it can be read is a form of compassion for yourself and others.”

Michael #2: nginx raided by Russian police

  • Russian police have raided today the Moscow offices of NGINX, Inc., a subsidiary of F5 Networks and the company behind the internet's most popular web server technology.
  • Russian search engine Rambler.ru claims full ownership of NGINX code.
  • Rambler claims that Igor Sysoev developed NGINX while he was working as a system administrator for the company, hence they are the rightful owner of the project.
  • Sysoev never denied creating NGINX while working at Rambler. In a 2012 interview, Sysoev claimed he developed NGINX in his free time and that Rambler wasn't even aware of it for years.
  • Update
  • Promptly following the event we took measures to ensure the security of our master software builds for NGINX, NGINX Plus, NGINX WAF and NGINX Unit—all of which are stored on servers outside of Russia. No other products are developed within Russia. F5 remains committed to innovating with NGINX, NGINX Plus, NGINX WAF and NGINX Unit, and we will continue to provide the best-in-class support you’ve come to expect.

Brian #3: I'm not feeling the async pressure

  • Armin Ronacher
  • “Async is all the rage.” But before you go there, make sure you understand flow control and back pressure.
  • “…back pressure is resistance that opposes the flow of data through a system. Back pressure sounds quite negative … but it's here to save your day.”
  • If parts of your system are async, you have to make sure the entire flow throw the system doesn’t have overflow points.
  • An example shown with reader/writer that is way hairier than you’d think it should be.
  • “New Footguns: async/await is great but it encourages writing stuff that will behave catastrophically when overloaded.”
  • “So for you developers of async libraries here is a new year's resolution for you: give back pressure and flow control the importance they deserve in documentation and API.”

Michael #4: codetiming from Real Python

Brian #5: Making Python Programs Blazingly Fast

  • Martin Heinz
    • Seemed like a good followup to the last topic
  • Profiling with
    • command line time python something.py
    • python -m cProfile -s time something.py
    • timing functions with wrapper
    • Misses timeit, but see that also, https://docs.python.org/3.8/library/timeit.html
  • How to make things faster:
    • use built in types over custom types
    • caching/memoization with lru_cache
    • use local variables and local aliases when looping
    • use functions… (kinda duh, but sure).
    • don’t repeatedly access attributes in loops
    • use f-strings over other formatting
    • use generators. or at least experiment with them.
      • the memory savings could result in speedup

Michael #6: LocalStack

  • via Graham Williamson and Jan 'oglop' Gazda
  • A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline!
  • LocalStack spins up the following core Cloud APIs on your local machine:
  • LocalStack builds on existing best-of-breed mocking/testing tools, most notably kinesalite/dynalite and moto. While these tools are awesome (!), they lack functionality for certain use cases. LocalStack combines the tools, makes them interoperable, and adds important missing functionality on top of them
  • Has lots of config and knobs, but runs in docker so that helps

Extras:

Michael:

Joke: Types of software jobs.

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:04 your earbuds. This is episode 163, recorded live on location here at the Portland West Python

00:11 Meetup. Hello, everyone. And it was recorded January 7th, 2020. Brian, it's 2020. Yeah,

00:20 was that difficult to remember? It's, you know, I'm really not used to it. I just got used to

00:24 2019. So we're having problems, but we'll get there. Yeah, well, it's really great to be here

00:28 with everyone. This is the first time we've done a live recording in a while. We do this at PyCon a

00:32 lot, but PyCon's not that frequent. So here we are in Portland. It's great. Yeah, thanks. And thanks

00:36 for everybody for coming out. This is wonderful. Yeah, absolutely. I've got the first one, right?

00:40 You've got the first item. So some Zen. I think it's a new year. It's a new decade. Let's kick it

00:46 off with a little Zen. Yeah, a little Zen. So we're going to take 20 minutes and just meditate. So the

00:51 first one I want to talk about, there's probably going to get this name wrong. Why did I pick this?

00:55 Zadka. It's a pretty cool name, though. I wrote an article called Meditations on the Zen of Python.

01:01 And if you don't know about the Zen of Python, hopefully you do. We're going to put a link in

01:05 the show notes. But there's also in any REPL, you can say import this and it will show you a whole bunch

01:12 of little cones, a little snippets of the Zen of Python. One of the cooler things you can do in Python,

01:17 second only to import anti-gravity. Yeah, that's good. So Moshe says that this is a,

01:23 the Zen of Python is not the rules of Python or the guidelines of Python. It is full of contradictions

01:28 and illusions. It is not intended to be followed. It is intended to be meditated upon. So you can read

01:36 these and think about your code. And actually, I kind of like it, like that idea, because when I've read

01:41 through them, there are some that contradict each other. I want to bring out a few of them that he

01:45 points out. The first is beautiful is better than ugly. And one of his comments is that consistency

01:51 helps. So things like Black and Flake 8 and PyLint are very useful in making consistent looking code.

01:57 Right. But those are only table stakes, right? It's just not ugly. It's not beautiful because of that.

02:01 Right. So even more important, only humans can judge what humans find beautiful. So code reviews and

02:06 collaboration and a collaborative approach to writing code are the only realistic way to build

02:12 beautiful code. So listening to other people is an important skill in software development. And also

02:17 just looking at code and seeing if you think it looks nice. I think it's good. So a couple more.

02:23 Complex is better than complicated. And that one always like threw me. I wasn't sure why that was in

02:30 there. Moshe says, when solving a hard problem, it's often a case that no simple solution will do. In that

02:36 case, the most Pythonic strategy is to go from the bottom up, build simple tools and combine them to solve

02:43 the problem. That's kind of a Unix style. So is that how you view the complex is better than

02:48 complicated?

02:48 I don't know if I've ever thought of in these terms. And I do like this article because it did make me

02:52 think like that. But I certainly think about software that way. I feel like so many people get caught

02:56 trying to overthink it. And they're like, oh, I can't get started. I'm trying to like get the right,

03:00 the exact right thing before I can write my first line of code. And it's like, no, you're never going to

03:05 know until you work on it for two days. Then you're like, oh, I should have done this. But well,

03:09 you didn't know what you knew now. So what are you going to do? Just get started. Yeah. It's my

03:13 philosophy. And the last one I want to talk about is readability counts. So in the face of immense

03:17 pressure to throw readability to the side and just solve a problem, the Xenopython reminds us that

03:23 readability counts. Writing code so it can be read is a form of compassion for yourself and others.

03:28 And one of the reasons why I highlighted this is we're going to talk about optimization and speed later

03:33 on. And speed is great, but making sure that your program is readable and maintainable is very

03:39 important. I really liked this article. Well done because we've all heard about the Xenopython.

03:43 We've probably all typed import this, but it's a little vague. And this is not, here's what it

03:49 means. This is, here's, here's me trying to think about it sort of philosophically. And, you know,

03:54 I've never seen anyone write that way about it before. And I thought it was really cool.

03:57 I'd love to other people to like come up with their ideas about it. So that'd be cool.

04:01 Yeah, absolutely. So Python and the web doesn't usually have like a James Bond sort of

04:07 places getting raided by the police, secret service, international angle to it. But this

04:16 next item does. Really? Yeah, it does. So you know what the most popular web server is in the

04:21 world? Used to be Apache. Now it's Nginx. Our stuff runs on Nginx, for example. However, there

04:27 was some news a few weeks ago. The Nginx offices in Russia were raided by the Russian police and

04:34 some of the core developers were detained. And the reason is, this is not as interesting as I made it

04:40 out to be, I don't really think. But the reason was, the guy who created it, I have his name here,

04:45 Sisyov, he created it. And he, at the time, he was working for Rambler.ru. And Rambler.ru is like a

04:52 Google Yandex type of company search engine in Russia. And he worked on this in his spare time. And he

04:58 open-sourced Nginx and then later turned it into a company. Well, Rambler came along and said, hey,

05:03 you know what? You worked on that while we were employing you. Nginx is ours. We're taking it over.

05:10 Meanwhile, Nginx has been bought by F5, an American company, and they own it. And so there's all this

05:16 intrigue around it. And yeah, so that happened.

05:20 So a bunch of my friends from Spokane that, when Agilent closed down there, went to work for F5,

05:25 and I'd never even heard of them before. And then they show up in this news article.

05:29 Yeah.

05:29 It's pretty interesting.

05:30 Yeah, they're all about the networks, but apparently servers. So I received an update,

05:34 an email from Nginx a few days later. And I'll just read it so I get it right. They said,

05:39 promptly following this event that I just described, we took measures to ensure the security of our

05:44 master software builds for Nginx, Nginx Plus, Nginx WAF, and Nginx Unit, all of which are stored on

05:52 servers outside of Russia. No other products are developed in Russia. F5 remains committed to

05:58 innovating with Nginx, Nginx Plus, et cetera, et cetera, all the products. And we continue to provide

06:03 the best-in-class support. You can expect that to come. So who knows where this is going to go?

06:09 That's pretty interesting.

06:09 If you use Nginx, should you worry about this?

06:13 That was why I brought it up. Because if it's the most popular web server in the world,

06:17 some folks, their ears are going to perk up and say, wait a minute, what? I mean,

06:21 I don't think this is like Russia trying to impose its will on the world. I think this is just a

06:26 dispute between a Russian company and some Russian folks who created Nginx, but it could have knock-on

06:32 effects quite far. So yeah, it's pretty interesting. I think just keep an eye on it, really.

06:37 This episode is brought to you by, well, us.

06:41 Really?

06:41 Yeah, normally it's brought to you by other companies, but this time, you know, we both

06:44 have interesting things to talk about and we have a gap. So I just want to tell you about

06:48 some of our stuff. So if you want to check out the courses that I'm creating or, you know,

06:53 set up the business stuff, just visit pythonbytes.fm/biz. And here there's something about

06:59 testing over at pythonbytes.fm/pytest. And people can check that out there as well.

07:04 Cool. Did you set up a URL redirect from there?

07:07 I don't want to say the whole name of the whole domain name and URL. So yeah, that's yours.

07:11 It points to Python testing with pytest, which I was published in 2017, but I still think is the

07:18 very best way to get up to speed very quickly on pytest.

07:20 Yeah, absolutely. And you also, we also have a Patreon that you set up at pythonbytes,

07:23 at patreon.com slash pythonbytes. So I have some thoughts on this next one, but why don't you

07:28 kick it off? This one's from the creator of Flask, but not the current maintainer of Flask.

07:33 Oh, that's true. Right. So I brought this up because I was curious what your thoughts were.

07:38 So the next one is from Armin...

07:40 Armin...

07:41 Armin Ronecker.

07:42 Armin Ronecker. Thank you. He wrote an article called, I'm Not Feeling the Async Pressure. The idea is like, async is all the rage. We've actually talked

07:50 about async quite a bit on the podcast. And I think a lot of people are concerned about it. And

07:55 it's one of the reasons why it's going in place is because I think there's some pressure of people

08:00 to leave Python to go to Go or other things.

08:02 Node.js was an early example of that, yeah.

08:04 Yeah. But before you go towards async, Armin is warning people to make sure you understand flow

08:10 control and backpressure. And I had never heard of backpressure, but backpressure is the resistance

08:16 that opposes the flow of data through a system. Backpressure sounds quite negative, but is here to

08:23 save your day. If parts of your system are async, you have to make sure the entire flow through the

08:29 system doesn't have overflow points. And then Armin goes through an example with a reader and writer,

08:35 and it seemed like simple code, but it really got hairy really kind of fast. And the example,

08:41 yeah, got hairier than I expected. And he says, async brings you new foot guns. Async and await are

08:48 great ways to encourage writing stuff that will behave catastrophically when overloaded.

08:53 For you developers of async libraries, here's a new year's resolution for you. Give backpressure and

08:58 flow control the importance they deserve in documentation and API. And there's just some

09:05 hidden things within buffers and things like that. So yeah, well, this is a pretty nuanced article

09:10 and it's pretty interesting. It comes from someone who knows a thing or two about the network programming,

09:15 Armin being the original creator of Flask. That said, my reaction to reading it,

09:21 my reaction was there were a lot of examples of, and here's if you overpressure the system when you

09:27 write an async system, it will fall down, right? Imagine you only allow 50 database connections and

09:33 suddenly you get 10,000. My sort of reaction to this was, well, what is the response of the system

09:39 going to be when it's single threaded and you give it 10,000 connections requests? They're all going to

09:44 time out except for a call. It's just going to crash.

09:46 Yeah.

09:46 So does it crash in an async world or does it crash in a non-async world? With enough traffic,

09:52 yes. But at the same time, if you can write basically the same code, put async and await in

09:57 front of a few bits and you can get 10 or a hundred times the amount of performance out of a given piece

10:02 of hardware before it crashes, that seems better to me. So I mean, I'm sympathetic to the problem,

10:08 but at the same time, it's always like, well, if we give it way too much pressure,

10:13 it's going to crash. Well, if it wasn't parallel, it would crash before then.

10:16 My thoughts were like, can you, are there ways to throttle? Because I don't know enough about all

10:21 the way to do network stuff. So if I'm setting up a web service, for instance, can I throttle the input

10:27 to say to not allow 10,000 connections and just allow 5,000 or something?

10:32 Right, right. Potentially. So maybe with something like UVicorn or something, you could set that up.

10:36 I honestly don't know. It seems to me the danger that he's addressing is when the system itself is

10:43 generating the input. Like we had this example of a guy who sent us a message and said, Hey,

10:47 I had this web scraping thing. It was really slow. We turned async loose on it and it crashed the server

10:53 because it ran out of memory because it processed it too quickly, right? Like there, you need to find

10:57 a way to slow it down. But when you're running a web server, you don't control how many people want

11:01 to get to it. There's just people want to get to it and they either can or they can't.

11:04 And with async, more of them would be able to than otherwise. That's my thoughts.

11:09 Okay. And I guess that my thoughts would be if you're going to throw async at a problem,

11:14 make sure that you do capacity testing on it as well.

11:18 Yeah. Well, it's going to fail somewhere else, right? And so you're going to,

11:22 maybe your database isn't set up for it. Maybe your microservices can't handle all the traffic.

11:25 Like there's going to be something, right? It's just going to show up somewhere else. But

11:29 in general, I think you're going to get better scalability with it than without it. So

11:33 if you're not generating that pressure, if you're not generating the traffic, then I don't know what

11:37 choice you have. Okay. But that's my thought. It was an interesting read.

11:39 Yeah, it definitely was. It definitely was. Let's go for something a lot simpler than like a deep

11:44 thing on streaming and buffers and async. How about a new way to time your code?

11:49 Yeah, that sounds good.

11:50 Yeah. So this one comes to us from Doug Farrell, who works on the RealPython team. And as part of their

11:56 work, they've got to time all sorts of things for their articles. You know, Dan Bader and crew over there.

12:01 And so they came up with this thing. Either they came out of RealPython,

12:05 I think, or possibly they were just using it a lot. But this thing called code timing.

12:11 So if you've got some code and you want to know how long it takes to run, you could say, you know,

12:16 create a time, like capture the daytime, do some work, capture dot now again and do a delta.

12:23 Or you could even use performance counters and other things. But you can use this library.

12:27 You just, there's a bunch of different things you can do. You create a timer class and you can call

12:31 start, do some work, stop. And out comes the time. Or you can put it in a context manager,

12:36 like a width block. Soon as it goes to the width block, when it's done, that bit is timed.

12:40 Or you can use it as a decorator. And you can also wire up a logger, which is kind of cool.

12:45 So you can see like, it'll just output standard Python logging with time information of when it's

12:50 doing bits of its thing. Give it a name and it'll tell you how long it took.

12:53 Cool. Well, they should add statistics too, so I can get min, max, and average, and standard deviation.

12:58 Yeah, that would actually be cool. Well, it's, you know, open source, I bet they accept PRs.

13:02 Actually, there's a bunch of features I want to add to it. And I started messing around with it.

13:05 And I'm like, put it down. I have other things to do. I'm already too busy. I don't need this.

13:11 I'm going to leave it alone. But yeah, it's a pretty cool little timer class. And I'm going to

13:15 probably use that. I like it.

13:15 Yeah. I thought this, a nice follow-on for this, the timer would be an article called

13:21 Making Python Programs Blazingly Fast.

13:24 That sounds good. We all want that.

13:25 You need to time stuff. You should never, I mean, hopefully we've all learned that

13:29 premature optimization is one of the most horrible things you can do as a programmer.

13:34 What I've learned is it's incredibly hard to guess where something is slow. Even if you know,

13:38 this takes a second, you look at the code, I'm like, oh, I bet it's there. Like, no, no, no. That's

13:42 like 5%. It's over here.

13:44 Yeah. Because it's super hard to know.

13:45 You're throwing the first version of the rough draft of your code down and you write something down and

13:52 you go like, I know I can do this better, but I'm going to just make it work.

13:55 here. And you know, you're going to have to optimize that. And it turns out to not be the

13:59 slow part.

13:59 Right. Exactly.

14:00 Yeah. So you need to find out where the slow part is. So this article called Making Python

14:04 Programs Blazingly Fast by Martin Hines goes through a few things. He doesn't cover this timer,

14:10 but there's a few other ways you can time it. There's a, you can use the command line time

14:14 function to just time how long something runs.

14:17 That might work. You might just go, I made a change. It was five seconds. Is it more or less?

14:22 Yeah, exactly. That'll tell you.

14:23 Python-mcprofile can tell you a whole bunch about your program.

14:27 Do you use cprofile much?

14:29 I don't really.

14:30 Yeah. I've used it. So it's, it's pretty awesome actually.

14:32 Yeah. And then he goes through an example of writing a wrapper function for a timer,

14:36 which is similar to what this last article was.

14:40 It's one facet of GoTimer.

14:42 One of the things that he doesn't cover is the time it function within that's built into Python,

14:47 which allows you to just run a single function a whole bunch of times and then tells you how,

14:52 how long that takes.

14:53 Yeah. Then you get your average and your deviation, all that.

14:56 But then the article goes through how to make things faster. So once you've found the slow parts,

15:02 how do you make it faster? And these are some good suggestions. Use built-in types over custom types.

15:08 Use caching and memoization through LRU cache, which is a built-in thing into Python.

15:14 Local variables and local aliases while, when looping. This is something I didn't expect. This

15:20 is something like if you've got a multiple dot, dot, dot, dot, something into a function call,

15:26 creating a local copy of that makes things run faster.

15:30 Every traversal of that dot is expensive in Python, whereas like C++, not so much.

15:35 Yeah. Especially if it's in a loop. So I use functions. I don't understand why this was there.

15:41 Kind of duh, but you know.

15:43 Well, apparently the variable lookup in a function scope is faster than a global variable lookup or

15:50 something like that that he was talking about. So by forcing all the variables into the function

15:55 scope, they actually come out faster. So there's all these like little weird edge cases.

15:58 Yeah. I don't have any code that's not in a function. So don't repeatedly access attributes

16:03 in loops. Okay. There's a similar sort of thing. One of the things I didn't realize is the F

16:07 strings have been tuned to be very fast. So if you're doing string formatting, use f-strings over

16:12 other things.

16:12 How many of you out there are using f-strings these days?

16:14 Right on. Like that's five, 10 times faster. I don't know. There was a thing by Raymond Hedinger

16:20 that's mentioned in that article.

16:22 Yeah. So it's way, way faster than the other ways that it was awesome.

16:25 And then use generators because I added at least experiment with generators because generators

16:30 are really about saving memory. But if you're really dealing with some large data, memory saving

16:36 could result in speed up. So I would say throw those in and see if it's faster.

16:40 As soon as you start hitting that page file, you're done.

16:42 I love generators. I throw them everywhere.

16:45 I do too.

16:46 Anyway, I think this was an interesting article on speeding up Python. And I warned people against

16:51 a premature optimization though. So, but it's fun.

16:54 Perfect. Yeah. This is a really good one. I like it. And it's a good follow on to the

16:57 other ones we have. Brian, yeah, you're here. So you spoke about CDK, the cloud development

17:04 kit from AWS. One of the big gives I have with working with the cloud is I work from home.

17:11 I want to go work in a coffee shop. Maybe I'm traveling. I want to work from the hotel and

17:14 the internet's bad. I still want to be able to work on my code and know the internet is not

17:19 available. Whoops. I guess my app won't run anymore. Right? Well, that is a problem, which

17:26 I mostly solve by avoiding the cloud directly. But there's another cool project called local

17:31 stack. Talked about Moto before, which is a way to like mock out AWS. And this is actually

17:37 built on Moto, but it actually does quite a bit more. This comes to us from Graham Williamson

17:41 and Jan Gazda. So thank you both for sending this in. And basically what it is, is it's

17:47 like a local AWS, not just a little bit, like a lot of local AWS. It has S3. It has SES for

17:56 simple email. It has EC2. It has DynamoDB as Lambda has elastic search, all of that stuff locally.

18:02 He showed us like tons of a huge list though. They have all that stuff.

18:06 It has a bunch. I don't know how many it has, but I would say it's somewhere on the order of,

18:11 I don't know, 2025 different services.

18:14 Probably the most common ones.

18:15 Yeah. Yeah. Probably the most common ones. And then apparently there's also like some kind of pro

18:18 thing I've not used, but then you get more services if you buy the pro version, but the lesser one,

18:24 I guess is open source, which is pretty cool.

18:25 That's neat. That's great. Like if you're on an airplane or something.

18:28 Yeah. Or you just, you want to have like a little local dev environment.

18:31 You don't have to pay for that, even though it's less than pennies, but yeah.

18:34 It depends what you're doing, I guess. But yeah. So yeah, basically it brings together some of these

18:38 tools. It brings together Modo. It brings together this thing called Dynalite and puts sort of a

18:43 unifying layer on top of it. So it's pretty cool. A lot of it runs in Docker. It helps to kind of

18:49 get a repeatable experience there.

18:50 That sounds neat.

18:51 Yeah, absolutely. All right. Well, that's it for our main items, everyone. Got any extras you want to

18:56 share with folks?

18:56 Well, I just, I don't know if we've covered this before. I saw an advert for the Python job board

19:03 on python.org.

19:05 Yeah. Yeah. I saw that. I hadn't seen it before, but yeah, apparently there's the, there's now,

19:10 yeah, we're joking around. We're laughing because the internet's not quite cooperating. That's fine.

19:16 We don't need it. Who needs the internet? What did I say about the cloud? What did I just say,

19:19 Ryan? You better hope you're not trying to test something right now. Carry on. Yeah. So the job board is

19:25 cool. Right. I hadn't noticed it either, but it's on python.org.

19:27 I don't know if you have to pay for stuff, but you can just list jobs. So that's cool.

19:31 Yeah. And Python's in demand. People want to have jobs writing code in Python, right? Like,

19:36 you know.

19:37 Do you have any extras for us?

19:38 I do have a couple. Let me pull these up here for the audience as well. So I have pictures

19:43 because some of these are very, very graphical. So there's this really cool one. You never asked him

19:47 probably heard of the guy who created Python. So he was interviewed, he's Dutch. He was interviewed by this

19:51 Dutch newspaper about programming. And the title, my Dutch is a little off, but it's like Python is

19:58 half my life. Right. So I worked on a Python for half my life or something like this. And they said,

20:02 we're going to, this is like a developer thing. Let's put some code and show some Python.

20:07 Yeah.

20:07 What code do we see there?

20:09 I don't know. Is it JavaScript?

20:10 Document.getElementByID. Yeah. Not so much. Not so much. That was a pretty interesting little

20:17 thing that actually happened. The next one that's pretty interesting. I don't have a picture for it.

20:21 It would just be like a bar that's rusting or something, but no, it's pretty cool.

20:24 Though Microsoft, you know, they're all about C and C++, right? Like Windows is based on C and C++.

20:30 They are actually been doing experimentations with Rust and they're coming out with a Rust

20:35 based programming language for like rewriting things like Windows and Rust. That's a pretty big

20:41 jump for Rust. And the reason is Rust is especially good at memory management and memory ownership. So

20:49 things like buffer overflow vulnerabilities and stuff just go away in Rust, which is like,

20:55 you know, every first Tuesday, here's the seven buffer overflows. They're going to like lose all

21:00 your data if you don't patch by the next two days that you get. And like, they're trying to avoid that,

21:04 I'm guessing. So that sounds interesting.

21:05 Do you know Rust yet?

21:06 I've looked at Rust. It looked like C. I said, I'm going to go back to Python.

21:09 I mean, not exactly, but it looked like C-ish.

21:12 Maybe I should take a look at it.

21:14 Yeah, it's pretty interesting. Two more quick things. So I'm doing a webcast of Python for

21:18 the .NET developer, kind of interactive one hour thing at Crowdcast on the Crowdcast platform. I

21:23 think that'll be fun. So links in there. It's free to sign up. People can check that out. And then

21:27 Reuven Lerner was talking to him today and he has a new free course that he released called

21:32 Ace Python Interviews. So people are out there looking for a Python job. Here's like 50

21:38 little exercises and questions answered live and like live coding responses to 50 interview questions

21:46 that are explained.

21:47 Reuven's a really cool guy. So I think that'd be cool to look at.

21:50 Yeah, yeah, absolutely. It looks really good. And that was also free. So no harm, no foul there.

21:54 People can check that out.

21:54 And I've got a job opening. So if anybody's looking, I'm mostly, last time I interviewed was for Python

22:01 person. So I'm probably just going to take some of these things and convert them to C++.

22:07 So, you know. So if you want to pass Brian's interview, it may be a good idea to take this

22:11 course. Don't tell my boss.

22:12 Yeah, yeah. All right. So are we ready for a joke? We always end up podcasts with a joke.

22:16 Yeah.

22:16 This one's very visual. So I'm going to put this up on the screen for you as well.

22:19 And this is really like a sort of infographic. I'm a fan of infographics. And this one helps you

22:24 understand like the different types of jobs in software development, which can be very tricky,

22:28 right? Like what is the difference between a lead developer and a full stack developer and a coder?

22:33 Well, here we go. So it says, there's this person and pretty much it's the same looking

22:37 person for every job description. And it says there's a coder. There's a little caption that

22:43 says he writes. Software engineer, he writes code. Lead developer, he writes code. DevOps,

22:49 well, he writes code. Infrastructure is code, right? Data engineer, actually, what does he do?

22:56 He writes code.

22:56 He writes code. Full stack developer, he writes code alone.

22:59 Computer programmer, he writes code too. Sysadmin, he writes, this is actually a guy eating donuts

23:07 with a big beard and looking very disheveled. It says he writes, in fact, we don't really know

23:12 what he does. All right. Well, that's the joke for Dave. I guess that's the podcast for today as

23:17 well. So thanks a lot. Yeah. Thanks a bunch. And thank you everyone.

23:20 Bye.

23:24 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. And get the full show notes at

23:34 Pythonbytes.fm. If you have a news item you want featured, just visit Pythonbytes.fm and send it our

23:39 way. We're always on the lookout for sharing something cool. On behalf of myself and Brian Okken,

23:44 This is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.


Want to go deeper? Check our projects