WEBVTT

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

00:00:05.440 --> 00:00:10.960
This is episode 103, recorded November 6, 2018. I'm Michael Kennedy.

00:00:10.960 --> 00:00:11.800
And I'm Brian Okken.

00:00:11.800 --> 00:00:12.600
Hey, Brian. How you doing?

00:00:12.600 --> 00:00:13.940
I am great today.

00:00:13.940 --> 00:00:18.540
Yeah, it's another wonderful day. A lot of cool news in the Python space.

00:00:18.540 --> 00:00:22.280
I have something that I think you all will really like. I'm looking forward to sharing that.

00:00:22.280 --> 00:00:22.660
Cool.

00:00:22.660 --> 00:00:26.200
Yeah, and I know you got some good ones, so I'm looking forward to talking about those as well.

00:00:26.200 --> 00:00:31.400
Before we do, let's say thank you to DigitalOcean. Check them out at pythonbytes.fm/DigitalOcean.

00:00:31.400 --> 00:00:36.300
Get $100 free credit for new users. I'll tell you more about them later.

00:00:36.300 --> 00:00:42.740
Right now, you've got kind of this magical C++ Python combination thing queued up for us, right?

00:00:42.740 --> 00:00:51.160
I do. And I just, we found out about this because a listener, I think it's Sebastian Srebart.

00:00:51.320 --> 00:00:56.540
Wait, Sebastian Srizard. Srizard. Sorry about your last name.

00:00:56.540 --> 00:00:58.940
Thank you, Sebastian, for sending that in.

00:00:58.940 --> 00:00:59.760
Yeah.

00:00:59.760 --> 00:01:05.500
Brian, if anyone else wants to send in some news, you can also butcher their name in honor of them sending that in, right?

00:01:05.500 --> 00:01:06.520
Yeah, it's a tradition.

00:01:06.520 --> 00:01:11.840
As I would as well. I do a lot too. It's becoming a tradition. Thank you, Sebastian. All right, tell us about this thing.

00:01:11.920 --> 00:01:16.840
Well, I think because of the flames in the logo, they actually intended to be pronounced Phoenix.

00:01:16.840 --> 00:01:24.000
It's F-E-N-I-C-S. It's a project. I'm glad that Sebastian sort of translated this for us.

00:01:24.560 --> 00:01:30.260
It's an open source computing platform for solving partial differential equations.

00:01:30.260 --> 00:01:35.100
This is actually really cool. And I'm going to quote right from their site.

00:01:35.100 --> 00:01:41.360
Phoenix enables users to quickly translate scientific models into efficient finite element code

00:01:41.360 --> 00:01:47.540
with the high-level Python and C++ interfaces to help you get started.

00:01:47.540 --> 00:01:52.080
It's got powerful capabilities for experienced programmers, but it's easy to get started.

00:01:52.080 --> 00:01:57.520
And it runs on multiple platforms from laptops to high-performance clusters.

00:01:57.520 --> 00:02:03.440
And it actually looks really pretty cool for anybody dealing with partial differential equations.

00:02:03.440 --> 00:02:06.040
It's a num-focused-backed project.

00:02:06.040 --> 00:02:09.160
So there's money behind it, which is cool.

00:02:09.160 --> 00:02:10.980
Num-focused seems like it's everywhere these days.

00:02:10.980 --> 00:02:12.580
Yeah, well, especially in...

00:02:12.580 --> 00:02:17.940
And it's good to highlight that, to say that this is a backed project,

00:02:17.940 --> 00:02:19.540
because it's a...

00:02:19.540 --> 00:02:23.840
These sorts of things you wouldn't want to depend on and then have them go away.

00:02:23.840 --> 00:02:28.240
Right. Some open source projects, depending upon them, are kind of like getting a puppy, right?

00:02:28.240 --> 00:02:33.440
They're cute and fun, but then you've got to walk them and stuff like that if they get dropped

00:02:33.440 --> 00:02:34.920
or don't work the way you want.

00:02:34.920 --> 00:02:40.600
Yeah. And Sebastian said right off the bat, it looks cool, but there's some features

00:02:40.600 --> 00:02:43.800
features inside that you might not know about right off the bat.

00:02:43.800 --> 00:02:46.240
So I'm going to quote an email that he sent us.

00:02:46.240 --> 00:02:47.160
He said,

00:02:47.160 --> 00:02:51.820
Phoenix is, in fact, a C++ project with a full-featured Python interface.

00:02:51.820 --> 00:02:57.860
The library itself generates C++ code on the fly and be called on the fly from Python.

00:02:57.860 --> 00:02:59.560
It's almost magical.

00:02:59.560 --> 00:03:05.600
Under the hood, it uses SWIG and recently moved to PyBind 11.

00:03:06.200 --> 00:03:11.760
I guess the architecture that was set up to achieve this level of automation might be useful

00:03:11.760 --> 00:03:12.840
for other situations.

00:03:12.840 --> 00:03:14.000
Yeah. So that's crazy.

00:03:14.000 --> 00:03:19.460
You write Python code, this thing writes C++ code, and then calls it all dynamically at runtime.

00:03:19.460 --> 00:03:21.800
Yeah. That's amazing.

00:03:22.480 --> 00:03:40.820
And from the project website, being able to develop the algorithm locally on whatever computer you're on, even a laptop or desktop, and then deploying the same code to run in parallel on thousands of processes, that's just awesome.

00:03:41.040 --> 00:03:43.600
Yeah. I think there's a lot of cool stuff happening here.

00:03:43.600 --> 00:03:48.220
I mean, not everyone is solving using finite element methods to solve PDs, right?

00:03:48.220 --> 00:03:59.520
I understand that's a limited group, but there's a lot of projects that may find what this project is doing interesting from a performance perspective and a dynamic meets compiled language perspective.

00:03:59.720 --> 00:04:12.040
Yeah. And it's also one more example of problems being solved in Python that you wouldn't have thought you could solve with Python because they're just to take too much high performance computing.

00:04:12.040 --> 00:04:13.800
That's a super interesting point.

00:04:13.800 --> 00:04:18.060
So often I hear people who are not that familiar with Python say, well, Python's slow.

00:04:18.060 --> 00:04:18.960
I'm like, hold on.

00:04:19.540 --> 00:04:21.800
What do you mean that Python is slow?

00:04:21.800 --> 00:04:27.200
Like you have to say doing this operation in Python is slow because there's so many variations.

00:04:27.200 --> 00:04:32.720
I mean, it can be, well, Python is slow and CPython, so you can use PyPy, but it could be way more interesting.

00:04:32.720 --> 00:04:44.340
Like, well, yes, but you would actually use a, say some kind of library that has C level compilation elements like SQLAlchemy or NumPy or something.

00:04:44.340 --> 00:04:49.380
And so when you actually talk about that, like you're doing C, you're not doing Python at the hotspots.

00:04:49.380 --> 00:04:53.720
And then you get, you know, way out there with things like Dask and like this and so on.

00:04:53.720 --> 00:04:55.000
And it's pretty awesome.

00:04:55.000 --> 00:04:56.040
Yeah, definitely.

00:04:56.040 --> 00:04:57.120
It's neat to see.

00:04:57.120 --> 00:04:58.900
You're kind of a fan of regular expressions, aren't you?

00:04:58.900 --> 00:04:59.740
Yes.

00:04:59.740 --> 00:05:01.460
I like regular expressions.

00:05:01.460 --> 00:05:05.520
Are you a fan of cursive language, like the fancy calligraphy type stuff?

00:05:05.520 --> 00:05:06.580
Like, do you write that way often?

00:05:06.580 --> 00:05:08.040
Well, I like it.

00:05:08.040 --> 00:05:09.440
I don't write that way, but.

00:05:09.440 --> 00:05:11.480
I don't write it that way either.

00:05:12.480 --> 00:05:24.400
This next project I want to talk about is its goal, I think, primarily is to make regular expressions more easy to indicate their intent and easier to maintain.

00:05:24.400 --> 00:05:29.180
I like to joke that regular expressions are kind of a write-only language.

00:05:29.180 --> 00:05:31.940
You know, you write them, but then you can't read them anymore.

00:05:31.940 --> 00:05:33.600
But they're magic and they do their thing, right?

00:05:33.840 --> 00:05:37.200
So we got this project called cursive underscore RE.

00:05:37.200 --> 00:05:40.580
And RE is, of course, the regular expression module in Python, right?

00:05:40.580 --> 00:05:41.160
Yeah.

00:05:41.160 --> 00:05:44.760
This comes from Chris Patty of Podcasting at Fame.

00:05:44.760 --> 00:05:47.440
And it's actually created by Bogdan Popa.

00:05:47.440 --> 00:05:51.320
My turn to hopefully take a shot at getting the name not too wrong.

00:05:51.320 --> 00:05:57.100
But this is a library for doing regular expressions in modern Python.

00:05:57.100 --> 00:05:58.580
So 3, 6 and above.

00:05:58.580 --> 00:06:03.200
And the idea is instead of writing in Python,

00:06:03.200 --> 00:06:13.100
the string symbols like you normally would, you know, bracket 9, 0-9 dot, you know, close bracket dot, that sort of thing,

00:06:13.100 --> 00:06:18.420
you write in this higher-level language of combinators, they call them.

00:06:18.420 --> 00:06:24.680
And then that overrides the operators in Python to generate a regular expression.

00:06:24.680 --> 00:06:29.800
So this is like all sounds kind of wonky and crazy, but if you've seen an example, it's super clear.

00:06:30.240 --> 00:06:33.240
So you can go and define, say, like a hex color.

00:06:33.240 --> 00:06:44.740
And the way you define it is you say, I would like to create a, you say, beginning of line plus this hash symbol plus group repeated hex digit

00:06:44.740 --> 00:06:49.420
or repeated other hex digit exactly three times plus end of line.

00:06:49.580 --> 00:06:55.300
And you write it in these things that are symbolic of what regular expressions do.

00:06:55.300 --> 00:07:00.580
And they can be, you know, sort of orred and and together and added together and so on.

00:07:00.580 --> 00:07:05.060
And then if you call the string representation of them, you get the actual regular expression.

00:07:05.060 --> 00:07:05.660
Okay.

00:07:05.660 --> 00:07:09.280
So it's a library to build regular expressions.

00:07:09.280 --> 00:07:09.760
Yeah.

00:07:09.760 --> 00:07:11.360
It's a library to build regular expressions.

00:07:11.360 --> 00:07:21.960
The way Bogdan describes it is he says, it's a tiny Python library made up of these combinators to help you write regular expressions that you can read and modify six months down the line.

00:07:21.960 --> 00:07:23.340
Yeah.

00:07:23.340 --> 00:07:24.140
Yeah.

00:07:24.520 --> 00:07:30.780
Definitely one of the problems with regular expressions is they're they're terse and that's good and bad.

00:07:30.780 --> 00:07:32.720
You they're too terse sometimes.

00:07:32.720 --> 00:07:34.380
So, yeah, sometimes.

00:07:34.380 --> 00:07:37.580
And then the other problem is there's a lot of special symbol.

00:07:37.580 --> 00:07:40.600
Like regular expressions are basically nothing but symbols.

00:07:40.600 --> 00:07:40.800
Right.

00:07:40.800 --> 00:07:45.060
They're like a symbol like exploded and its guts came out all over this text.

00:07:45.060 --> 00:07:45.320
Right.

00:07:45.520 --> 00:07:45.920
Yeah.

00:07:45.920 --> 00:07:52.180
But the problem is like some of those symbols are have to be escaped if you actually want to search for them.

00:07:52.180 --> 00:07:53.500
But it's always kind of hard to know.

00:07:53.500 --> 00:07:54.700
Well, which ones do I have to escape?

00:07:54.700 --> 00:08:02.760
So it also does things like if you tell it I'm looking for the text of like square bracket, square bracket, it'll escape properly in regular expression format.

00:08:02.760 --> 00:08:05.600
The the text representation of that.

00:08:05.600 --> 00:08:05.840
Right.

00:08:05.840 --> 00:08:07.560
Because bracket normally means something else.

00:08:07.560 --> 00:08:09.880
Like it's a set of characters or something like that.

00:08:09.880 --> 00:08:10.580
Yeah.

00:08:10.580 --> 00:08:13.940
So I really like that it is sort of a safe way as well.

00:08:14.020 --> 00:08:19.080
Like it's a more you talk about what you want and if it has to be escaped or whatever it does.

00:08:19.080 --> 00:08:20.900
So, yeah, it's I like this.

00:08:20.900 --> 00:08:21.780
This is great.

00:08:21.780 --> 00:08:22.060
Yeah.

00:08:22.060 --> 00:08:22.320
Yeah.

00:08:22.320 --> 00:08:23.420
I do, too.

00:08:23.420 --> 00:08:26.700
I can certainly see myself using this if I'm writing regular expressions.

00:08:26.700 --> 00:08:27.540
It's great.

00:08:27.540 --> 00:08:29.600
Speaking of seeing yourself.

00:08:29.600 --> 00:08:31.160
Seeing yourself.

00:08:31.160 --> 00:08:31.560
Yes.

00:08:31.560 --> 00:08:37.360
Actually, for a long time, I've been following and paying attention to what Adrian Rosebrock.

00:08:37.360 --> 00:08:38.840
This is even an easy one.

00:08:38.840 --> 00:08:40.120
And I even mass record this.

00:08:40.120 --> 00:08:42.040
Adrian Rosebrock.

00:08:42.120 --> 00:08:44.380
He has a site called Py Image Search.

00:08:44.380 --> 00:08:59.580
And essentially, Adrian is teaching people about OpenCV and Python and actually a lot of AI stuff and doing some really cool things with Python and like cameras and webcams and stuff.

00:08:59.580 --> 00:09:03.900
And even on Raspberry Pis and stuff and doing lots of neat things.

00:09:03.900 --> 00:09:06.700
And I don't have a particular article to point to.

00:09:06.700 --> 00:09:08.880
We just haven't covered it before, I don't think.

00:09:08.880 --> 00:09:10.740
And people should know about it.

00:09:10.740 --> 00:09:16.500
So Adrian has both paid and free resources to teach people all about computer vision.

00:09:16.500 --> 00:09:18.060
And I think he's doing a cool job.

00:09:18.180 --> 00:09:19.420
Yeah, he's doing a real cool job.

00:09:19.420 --> 00:09:22.000
And there's so many great examples over there.

00:09:22.000 --> 00:09:23.440
I think OpenCV is great.

00:09:23.440 --> 00:09:27.500
And this is probably the best resource for OpenCV and Python intersected, right?

00:09:27.500 --> 00:09:35.060
I get emails from him every now and then with boxes detecting things running around on videos or something like that.

00:09:35.060 --> 00:09:35.660
It's great.

00:09:35.780 --> 00:09:42.420
So if you've got to do anything with computer vision and you want to use Python to do it and why wouldn't you want that, then this is a cool place, right?

00:09:42.420 --> 00:09:42.800
Yeah.

00:09:42.800 --> 00:09:53.580
And he has some like tons of cool projects that he's done over the years of, you know, hooking up a Raspberry Pi with a camera to detect people coming to your door and stuff like that.

00:09:53.580 --> 00:09:55.220
And it's some cool stuff.

00:09:55.220 --> 00:09:59.580
And then you brought up that he had one of the most successful Kickstarters ever.

00:09:59.820 --> 00:10:03.340
Yeah, he did a Kickstarter called Deep Learning for Computer Vision with Python.

00:10:03.340 --> 00:10:07.520
And yeah, it's definitely one of the most successful Kickstarters ever.

00:10:07.520 --> 00:10:10.380
So if you want to check out that book, that's really good.

00:10:10.380 --> 00:10:14.040
I think he has some videos that are coming along with it, but I linked to the Kickstarter as well.

00:10:14.040 --> 00:10:16.320
Yeah, it did okay.

00:10:16.320 --> 00:10:18.220
Okay.

00:10:18.220 --> 00:10:24.160
Speaking of doing very, very well, I want to tell everyone about DigitalOcean before we move on.

00:10:24.160 --> 00:10:27.220
And I decided it's time to think about this a little bit differently.

00:10:27.400 --> 00:10:29.840
You think about DigitalOcean and you're hosting and stuff a little bit differently.

00:10:29.840 --> 00:10:33.100
So, you know, most of us, I think you brought this up.

00:10:33.100 --> 00:10:34.000
You're not Netflix.

00:10:34.000 --> 00:10:35.100
You're not Google.

00:10:35.100 --> 00:10:36.260
You're not Facebook, right?

00:10:36.260 --> 00:10:36.760
Remember that?

00:10:36.760 --> 00:10:37.300
You're not LinkedIn.

00:10:37.300 --> 00:10:37.800
Yeah.

00:10:37.800 --> 00:10:39.360
You don't need these crazy architectures.

00:10:39.360 --> 00:10:45.640
And yet some of the most popular hosting platforms out there, you know, like AWS or Azure,

00:10:45.640 --> 00:10:56.520
they are built with thousands and thousands of knobs so that you could be Netflix with 50,000 servers running continuous chaos experiments and all that crazy stuff, right?

00:10:57.000 --> 00:11:09.520
But if you are actually just building what 99.9% of us are, more standard applications, then all that stuff is just overhead and complexity and cost.

00:11:09.520 --> 00:11:20.880
So you can join companies like Slack, WeWork, Docker, GitLab, and of course, us over at DigitalOcean and pay like five times less than what you would for AWS or Azure, right?

00:11:20.980 --> 00:11:24.100
So, for example, bandwidth is one cent instead of nine per gigabyte.

00:11:24.100 --> 00:11:28.640
Servers are five bucks instead of, you know, 50 or whatever a reserved instance is over at AWS.

00:11:28.640 --> 00:11:30.940
It's not just about price.

00:11:30.940 --> 00:11:31.820
Keep it simple.

00:11:31.820 --> 00:11:33.380
Use what you need.

00:11:33.380 --> 00:11:40.060
Don't have all these crazy, crazy features that you probably don't actually need because you're not building Netflix or Facebook or LinkedIn.

00:11:40.060 --> 00:11:43.780
Anyway, try them out at pythonbytes.fm/digital ocean.

00:11:43.980 --> 00:11:48.320
Get $100 credit for new users and see why we all love it for their infrastructure.

00:11:48.320 --> 00:11:48.960
Awesome.

00:11:48.960 --> 00:11:49.540
Thanks.

00:11:49.540 --> 00:11:50.080
Indeed.

00:11:50.080 --> 00:11:56.980
So, Brian, this next one, have you watched this video here that I'm about to talk about?

00:11:56.980 --> 00:11:58.940
I don't think I have.

00:11:58.940 --> 00:11:59.600
Maybe I have.

00:11:59.600 --> 00:11:59.960
All right.

00:12:00.300 --> 00:12:02.880
So, while we're talking, click this and open it up.

00:12:02.880 --> 00:12:03.340
Okay.

00:12:03.340 --> 00:12:04.620
And I'll tell people about it.

00:12:04.620 --> 00:12:06.660
Maybe mute your YouTube that it's going.

00:12:06.660 --> 00:12:07.040
Okay.

00:12:07.040 --> 00:12:07.360
Okay.

00:12:07.360 --> 00:12:15.800
So, this thing that I want to talk about is a visualization of Python development from original origin way back in the day up until 2012.

00:12:15.800 --> 00:12:22.380
And it's using this underlying system called GORCE, G-O-U-R-C-E, GORCE, I'm guessing.

00:12:23.020 --> 00:12:29.500
And the idea is GORCE is a visualization library that visualizes trees and stuff like this, like graph trees, not real trees.

00:12:29.500 --> 00:12:35.040
And what you can do is you can point it at a source repository.

00:12:35.040 --> 00:12:36.080
It could be SVN.

00:12:36.080 --> 00:12:39.320
It even supports CVS, but Git and Mercurial.

00:12:39.320 --> 00:12:46.620
And you can point it there, and it will do an animated over time visualization of that source library.

00:12:46.620 --> 00:12:47.800
So, not just Python.

00:12:47.800 --> 00:12:49.960
Any of these repositories you can point it at.

00:12:50.480 --> 00:12:59.900
And it will have the files as they grow, the size of the repository, and these little animated characters come in and start editing files and interacting with it.

00:12:59.900 --> 00:13:06.440
So, if you play this video that we're linking to, this is a GORCE animation of Python development up until 2012.

00:13:06.440 --> 00:13:10.540
And you see it starts out, and Gito is cruising around, adding little bits.

00:13:10.540 --> 00:13:11.620
Then a few more people come.

00:13:11.620 --> 00:13:16.280
And then if you start skipping further and further ahead, it gives just madness at the end.

00:13:16.280 --> 00:13:18.020
People are swirling all over the place.

00:13:18.020 --> 00:13:27.020
And it's just a really great way to, like, see the growth of Python visually through animation, at least in terms of who is participating in building it.

00:13:27.020 --> 00:13:28.060
What do you think?

00:13:28.060 --> 00:13:29.000
Yeah, it is cool.

00:13:29.000 --> 00:13:37.340
And one of the fun things to see is that there's sometimes some people that just sort of sit around one area, which makes sense.

00:13:37.400 --> 00:13:41.160
And then other people that fly around and edit all sorts of stuff.

00:13:41.160 --> 00:13:43.340
Yeah, it's really interesting, right?

00:13:43.340 --> 00:13:45.660
And you can see people appear, and then they'll fade away.

00:13:45.660 --> 00:13:48.680
They'll come and make some contributions, and then they'll, like, leave the scene.

00:13:48.680 --> 00:13:51.480
So, anyway, I think this is really cool.

00:13:51.480 --> 00:13:51.840
Yeah.

00:13:51.840 --> 00:13:55.760
And it's, you know, there's not a lot to take away from it other than it's just nice to appreciate it.

00:13:55.760 --> 00:13:59.440
I would say watch the first minute and then just, like, skip minute by minute and watch a little bit.

00:13:59.500 --> 00:14:00.580
Because it's 14 minutes.

00:14:00.580 --> 00:14:01.960
You don't really want to watch the whole thing.

00:14:01.960 --> 00:14:02.820
I think I do.

00:14:02.820 --> 00:14:06.000
But you could just leave it running for the rest of the show.

00:14:06.000 --> 00:14:06.340
Yeah.

00:14:06.780 --> 00:14:08.500
So, here's what I think.

00:14:08.500 --> 00:14:09.600
The call out to the audience.

00:14:09.600 --> 00:14:16.120
One, who wants to build this for 2012 to present on Python, you know, again?

00:14:16.120 --> 00:14:22.700
And I think this would make an amazing lightning talk if you built that video, and then you, like, went up there and just did a four-minute animation.

00:14:22.700 --> 00:14:23.800
Wouldn't that be cool?

00:14:23.800 --> 00:14:28.680
It'd be cool to just have that going on in the background while you did some other talk.

00:14:28.680 --> 00:14:29.300
Right, yeah.

00:14:29.300 --> 00:14:33.480
Or run this at, like, between sessions at a conference.

00:14:33.480 --> 00:14:34.380
I think it'd be great.

00:14:34.560 --> 00:14:37.240
Anyway, I think people will appreciate checking it out.

00:14:37.240 --> 00:14:37.520
Cool.

00:14:37.520 --> 00:14:46.200
So, one of the things, Brian, that you hear a lot in software development is that there's often a wide range of skills and productivity between developers.

00:14:46.200 --> 00:14:51.580
And I've done a lot of training and interacted with, you know, literally thousands of people in person.

00:14:51.580 --> 00:14:56.580
And I think it's something of a myth, but I think largely there's a lot to this.

00:14:56.580 --> 00:14:58.120
Yeah.

00:14:58.120 --> 00:15:02.920
Some people that just fly and they're just focused and others that just kind of bounce around the keyboard randomly.

00:15:02.920 --> 00:15:04.520
What do you think?

00:15:04.520 --> 00:15:06.580
So, I know that it's a bit controversial.

00:15:06.580 --> 00:15:09.120
There is this notion of a 10x developer.

00:15:09.120 --> 00:15:12.860
And often there's a backlash against it also.

00:15:12.860 --> 00:15:19.960
But I think people think of it as, like, somebody that's really 10 times better than the average good developer.

00:15:19.960 --> 00:15:21.460
And I don't think that's it at all.

00:15:21.460 --> 00:15:30.920
I think that it's just a notion that there is sometimes orders of magnitude between the most effective person in an organization and the least effective.

00:15:31.400 --> 00:15:33.980
And I don't know how you argue against that.

00:15:33.980 --> 00:15:38.260
And if you've ever been at large organizations, it just is.

00:15:38.260 --> 00:15:42.700
At least maybe it's not 10 times, but there's definitely – there's a lot to it.

00:15:42.700 --> 00:15:45.200
It's a multiplicative factor in there, I would say, for sure.

00:15:45.300 --> 00:15:45.640
Yeah.

00:15:45.640 --> 00:15:50.160
And so, this is – regardless of what you want to take away, there's some good advice in this article.

00:15:50.160 --> 00:15:55.600
There's an article I'm linking to that's what any developer can learn from the best.

00:15:55.600 --> 00:15:57.720
And I think these are good things.

00:15:57.720 --> 00:16:08.760
So, one of the things – the idea around it is just this isn't magical and it isn't something that is – it isn't just about skills and hard skills.

00:16:08.860 --> 00:16:10.000
It's other stuff too.

00:16:10.000 --> 00:16:12.520
And there's a clear path to excellence.

00:16:12.520 --> 00:16:14.940
People are not born great developers.

00:16:14.940 --> 00:16:17.420
They get there through focused, deliberate practice.

00:16:17.420 --> 00:16:19.760
And here's a few traits.

00:16:19.760 --> 00:16:25.980
They just listed some traits of things that they see in good developers versus not so great.

00:16:26.500 --> 00:16:30.620
So, great developers are – a few of the traits are problem solving.

00:16:30.620 --> 00:16:32.680
They're skilled at what they're doing.

00:16:32.680 --> 00:16:34.120
They're mentors and teachers.

00:16:34.120 --> 00:16:37.780
They're excellent learners and passionate about stuff.

00:16:37.780 --> 00:16:48.060
So, the problem solver bit I think is really interesting because often the 10x or the multiplier doesn't come in from that they do the same work faster.

00:16:48.720 --> 00:16:57.920
It's sometimes they can just look at things differently because of experience, because of playing around with lots of different things and say, oh, let's just solve this problem differently.

00:16:57.920 --> 00:17:04.060
And it just gets done faster because they take that – take a different approach.

00:17:04.060 --> 00:17:07.700
One of the – I was talking with somebody about databases recently.

00:17:08.380 --> 00:17:17.120
And there's some – for instance, there's some problems that can be solved with graph databases easily that are almost impossible with a relational database.

00:17:17.120 --> 00:17:21.100
It's just using the right tool for the right job sometimes.

00:17:21.100 --> 00:17:21.580
Yeah.

00:17:21.580 --> 00:17:28.320
And I think a lot of that is the – it's not that knowing that means you're 10x smarter or 10x better.

00:17:28.320 --> 00:17:37.640
That means you are curious enough to keep looking and to continuously be on the lookout for, well, okay, I now totally know all about relational databases.

00:17:37.940 --> 00:17:38.720
What else can I learn?

00:17:38.720 --> 00:17:39.860
How do I compare it?

00:17:39.860 --> 00:17:59.720
And I think that's one of the biggest traits that I've noticed among people that have some number of multiplier of efficiency or skills is not that they are necessarily more skilled or have more natural talent, but they're just continuously learning and really passionate about it.

00:17:59.720 --> 00:18:04.420
And they're just – they're just always picking up these little things that help you at each step, right?

00:18:04.420 --> 00:18:04.900
Yeah.

00:18:04.900 --> 00:18:04.940
Yeah.

00:18:04.940 --> 00:18:08.840
And there's an honesty of just like – this isn't just about developers.

00:18:08.840 --> 00:18:10.220
I think it's in every field.

00:18:10.220 --> 00:18:22.440
For instance, somebody that's working with tools and stuff, somebody that needs to hammer in a lot of nails might be smart enough to go, hey, I should go get a nail gun.

00:18:22.440 --> 00:18:24.240
I could do this a lot faster with a nail gun.

00:18:24.340 --> 00:18:25.520
You know what that makes me think of?

00:18:25.520 --> 00:18:34.640
Like you could say I need to have the rings on my engine or my transmission fixed on my car and you take it to a regular place.

00:18:34.640 --> 00:18:35.100
You're like, great.

00:18:35.100 --> 00:18:36.340
We'll have it back in three weeks.

00:18:36.340 --> 00:18:39.300
You go watch something like IndyCar or Formula One.

00:18:39.300 --> 00:18:42.260
They'll pull in and they'll like change the transmission in two laps.

00:18:42.260 --> 00:18:42.740
Yeah.

00:18:42.740 --> 00:18:42.920
Right?

00:18:42.980 --> 00:18:44.360
Those are both mechanics.

00:18:44.360 --> 00:18:45.460
Yeah.

00:18:45.460 --> 00:18:46.420
Those are not the same.

00:18:46.420 --> 00:18:47.140
Right.

00:18:47.140 --> 00:18:47.640
Exactly.

00:18:47.640 --> 00:18:50.060
The deliberate practice is important.

00:18:50.060 --> 00:19:02.060
And I think some people forget that the difference between being an average or a below average developer and being an above average developer is mostly just deciding that you're going to do that.

00:19:02.620 --> 00:19:10.480
And setting aside some of your time in your life to pick something you want to improve and then go and do it.

00:19:10.480 --> 00:19:12.080
Figure out what you want to learn and go do it.

00:19:12.080 --> 00:19:12.580
So.

00:19:12.580 --> 00:19:12.940
Yeah.

00:19:12.940 --> 00:19:13.840
Anyway.

00:19:13.840 --> 00:19:18.140
I guess what I would say is to take away from this article is it's really interesting.

00:19:18.140 --> 00:19:20.040
It's numerically based.

00:19:20.040 --> 00:19:20.240
Right?

00:19:20.240 --> 00:19:24.320
There's a lot of it's based on a survey the guy did with like a thousand folks or something.

00:19:24.320 --> 00:19:27.100
And most importantly, it's about a growth mindset.

00:19:27.100 --> 00:19:27.440
Right?

00:19:27.440 --> 00:19:32.280
It's not to say, well, there's these people and they're just smarter than you or they're smarter than other people or whatever.

00:19:32.960 --> 00:19:37.200
It's here's how those people got that way and you can do it too.

00:19:37.200 --> 00:19:39.360
And I think that's the right message.

00:19:39.360 --> 00:19:39.880
Right.

00:19:39.880 --> 00:19:47.340
And the person that wrote the article said this is from a lot of he's taught a lot of people and there's a lot of people that want to be better, but they don't know how to.

00:19:47.340 --> 00:19:51.380
So this is just sort of some direction on what things to work on.

00:19:51.380 --> 00:19:51.720
So.

00:19:51.720 --> 00:19:52.360
Yeah.

00:19:52.360 --> 00:19:52.980
It's a good article.

00:19:52.980 --> 00:19:54.060
Yep.

00:19:54.060 --> 00:19:54.900
And a nice find.

00:19:54.900 --> 00:19:57.040
Let's close this out with a bit of chaos.

00:19:57.040 --> 00:19:57.920
Sure.

00:19:57.920 --> 00:19:59.400
Why change tradition?

00:19:59.400 --> 00:19:59.720
Right?

00:19:59.720 --> 00:20:00.780
That's right.

00:20:01.500 --> 00:20:05.300
So you've heard of, I'm sure you've heard, I'm pretty sure you've been out on your show.

00:20:05.300 --> 00:20:10.400
If I remember correctly, you've talked about the chaos monkey and things like that, right?

00:20:10.400 --> 00:20:10.700
Yeah.

00:20:10.700 --> 00:20:14.680
Tell people what the, yeah, he's from Netflix, right?

00:20:14.680 --> 00:20:15.640
He used to be.

00:20:15.640 --> 00:20:15.900
Yes.

00:20:15.900 --> 00:20:16.180
Okay.

00:20:16.180 --> 00:20:19.220
So I think the idea of the chaos monkey originated there.

00:20:19.220 --> 00:20:20.640
Tell us what the chaos monkey is.

00:20:20.840 --> 00:20:36.840
Well, I'm probably going to get this wrong, but there's this notion of taking parts of your system and intentionally breaking parts or shutting down, especially in a distributed system, taking some nodes and just killing them every once in a while and seeing how your system recovers from it.

00:20:36.900 --> 00:21:06.880
Yeah, exactly.

00:21:06.880 --> 00:21:10.600
And then in production, it does it.

00:21:10.820 --> 00:21:12.820
And then, you know, you just have to build.

00:21:12.820 --> 00:21:17.360
So, cause you know, the chaos monkey is coming and it means like, well, a standard failure is like nothing.

00:21:17.360 --> 00:21:19.100
Cause the chaos monkey is a madman, right?

00:21:19.100 --> 00:21:20.200
He's running around all the time.

00:21:20.200 --> 00:21:26.080
So this is not a bad philosophy for large organizations or large bits of software.

00:21:26.440 --> 00:21:29.380
However, you're not Netflix, probably people listening.

00:21:29.380 --> 00:21:31.180
So how are you going to build that up?

00:21:31.180 --> 00:21:31.360
Right.

00:21:31.360 --> 00:21:32.460
How are you going to create these things?

00:21:32.460 --> 00:21:36.520
So there's this cool thing I found called chaos toolkit.

00:21:36.520 --> 00:21:45.520
So chaos toolkit is a library built in Python that will help create these chaos monkey like things.

00:21:45.520 --> 00:21:46.580
Cool.

00:21:46.720 --> 00:21:56.400
So chaos engineering is what they call is the discipline of experimenting on distributed systems in order to build confidence in the system's capability to withstand turbulent conditions in production.

00:21:56.400 --> 00:21:57.220
All right.

00:21:57.220 --> 00:22:00.900
So we talked about the chaos monkey and the friends, right?

00:22:00.900 --> 00:22:09.280
There's other types of chaos things that Netflix, but here's a way that you can easily build those types of experiments and systems.

00:22:09.940 --> 00:22:15.640
And it integrates with Kubernetes, AWS, Google cloud, Microsoft Azure, some other, other things like that.

00:22:15.640 --> 00:22:16.160
Right.

00:22:16.160 --> 00:22:29.900
So just to give you a sense of what it can do, like if you look at the AWS API, it'll say, you can do things like go to AWS Lambda and call a delete function concurrency that removes the concurrency limit on any specific Lambda.

00:22:29.900 --> 00:22:34.360
Or you can go just call stop instance on an EC2 instance or, you know, whatever you want.

00:22:34.360 --> 00:22:34.680
Right.

00:22:34.680 --> 00:22:37.140
And presumably it's going to put that back.

00:22:37.140 --> 00:22:37.980
I'm not entirely sure.

00:22:38.700 --> 00:22:46.160
But I guess you probably got to call start instance again on it or set, you know, add function concurrency or set, something like that.

00:22:46.160 --> 00:22:46.560
All right.

00:22:46.560 --> 00:22:54.660
But there's this infrastructure to help you change these types of settings and these types of things around your cloud providers and, you know, make sure your system can take it.

00:22:54.660 --> 00:22:55.040
Nice.

00:22:55.040 --> 00:22:55.780
Yeah.

00:22:55.780 --> 00:22:57.500
You cannot plan for the best.

00:22:57.500 --> 00:22:59.440
So you plan for what you can for.

00:22:59.440 --> 00:23:00.640
That's right.

00:23:00.640 --> 00:23:01.520
Yeah.

00:23:01.520 --> 00:23:03.860
So you build it so that it doesn't have to be perfect.

00:23:03.860 --> 00:23:05.420
And then you're in pretty good shape.

00:23:05.420 --> 00:23:07.940
The stuff that the folks at Netflix are doing is insane, though.

00:23:08.000 --> 00:23:09.220
Like they take it to another level.

00:23:09.220 --> 00:23:10.040
Well, yeah.

00:23:10.040 --> 00:23:19.680
One of the things I remember talking with them about is the reason why they test and do all this in production is because their system is so large.

00:23:19.680 --> 00:23:20.320
You can't.

00:23:20.320 --> 00:23:21.820
It's essentially the world.

00:23:21.820 --> 00:23:22.380
You cannot.

00:23:22.380 --> 00:23:29.460
You can't have a test bed that's similar enough to the real world environment.

00:23:29.740 --> 00:23:31.700
So they don't have that luxury.

00:23:31.700 --> 00:23:32.420
Right.

00:23:32.420 --> 00:23:34.060
So they just test it in production.

00:23:34.060 --> 00:23:36.640
And I've not seen Netflix really go down.

00:23:36.640 --> 00:23:37.920
So I'm saying they're doing it.

00:23:37.920 --> 00:23:38.120
Yeah.

00:23:38.120 --> 00:23:38.440
All right.

00:23:38.440 --> 00:23:39.720
That's it for our main news.

00:23:39.720 --> 00:23:40.760
I have a couple of quick ones.

00:23:40.760 --> 00:23:41.740
You got anything you want to share, Brian?

00:23:41.740 --> 00:23:42.180
Yeah.

00:23:42.300 --> 00:23:45.220
Just on the Python bytes episode 100.

00:23:45.220 --> 00:23:49.480
We one of the things we talked about was pyproject.toml.

00:23:49.480 --> 00:23:51.460
And I wanted to take a deep dive.

00:23:51.460 --> 00:23:58.380
So the last episode of testing code is me talking to Brett Cannon and talking about that for almost an hour or so.

00:23:58.380 --> 00:23:59.340
Oh, nice.

00:23:59.340 --> 00:24:00.480
I definitely want to check that out.

00:24:00.480 --> 00:24:01.120
That's a good one.

00:24:01.120 --> 00:24:02.240
So how about you?

00:24:02.240 --> 00:24:07.460
I have two other things that I don't think justify a whole segment, but I just want to throw them out there.

00:24:07.460 --> 00:24:18.600
Remember a while back we talked about that there was potentially some experiments or something where some college researcher had put some malicious, potentially malicious libraries on PyPI?

00:24:18.600 --> 00:24:19.180
Yeah.

00:24:19.180 --> 00:24:23.400
Well, it turns out recently someone actually put malicious libraries on PyPI.

00:24:23.400 --> 00:24:26.400
So this is October 27, 2018.

00:24:26.400 --> 00:24:31.900
And apparently 12 packages were discovered with various levels of vulnerabilities and stuff.

00:24:32.040 --> 00:24:32.840
So I'm linking to that.

00:24:32.840 --> 00:24:33.960
People should check that out.

00:24:33.960 --> 00:24:38.700
If you don't know how to spell Django, you're going to have a bad time, by the way.

00:24:38.700 --> 00:24:40.060
Yeah.

00:24:40.060 --> 00:24:45.280
So it's a lot of this typo squatting like, oh, I forgot the J, so now I have a virus.

00:24:45.280 --> 00:24:46.140
Something like that.

00:24:46.140 --> 00:24:46.880
Yeah.

00:24:46.880 --> 00:24:48.200
That's sort of lame.

00:24:48.200 --> 00:24:48.460
Yeah.

00:24:48.460 --> 00:24:49.120
It's upsetting.

00:24:49.120 --> 00:24:57.240
At least they've done some work over at PyPI to block properly spelled things that are not actually packages, like RE, for example, right?

00:24:57.240 --> 00:24:58.520
The built-in stuff.

00:24:58.520 --> 00:24:59.000
Well, yeah.

00:24:59.060 --> 00:25:05.520
That's one of the things that's, yeah, was an issue is people can try to pip install things that are in their standard library.

00:25:05.520 --> 00:25:07.080
You don't have to do that.

00:25:07.080 --> 00:25:07.820
Yes, exactly.

00:25:07.820 --> 00:25:09.400
Exactly.

00:25:09.400 --> 00:25:10.120
Don't do that.

00:25:10.120 --> 00:25:15.240
Then the other one was just a quick little Twitter message that someone sent my way.

00:25:15.860 --> 00:25:17.200
And it's pretty cool.

00:25:17.200 --> 00:25:20.300
This guy, not the one who sent it to me.

00:25:20.300 --> 00:25:21.060
I'm sorry.

00:25:21.060 --> 00:25:21.980
I don't remember who sent it.

00:25:21.980 --> 00:25:22.880
I should have written it down.

00:25:22.880 --> 00:25:35.040
But this person called Xtrek, something to that effect, on Twitter, decided to go scanning the standard library source code for interesting things like, what is the longest class name?

00:25:35.040 --> 00:25:36.260
What is the longest function name?

00:25:36.280 --> 00:25:36.760
And so on.

00:25:36.760 --> 00:25:48.760
So they found out that actually in CPython, the longest class name is 200 characters, just the letter A 200 times, which is some kind of test case.

00:25:48.760 --> 00:25:59.180
But for the real ones, there's one called test, mutually exclusive optionals and positions, mixed parent, as the longest class name is there.

00:25:59.180 --> 00:26:11.240
In the longest function name, they believe it's test underscore parser underscore regression underscore special underscore character underscore in parameter column of doctrine first line, which is 84 characters long.

00:26:11.760 --> 00:26:14.040
And then there's other examples.

00:26:14.040 --> 00:26:21.180
Someone says there's actually a test C types that has 33 million characters in it.

00:26:21.180 --> 00:26:26.260
Anyway, it's an interesting thread if you're just wondering what the really long names are.

00:26:26.260 --> 00:26:26.620
Yeah.

00:26:26.620 --> 00:26:28.200
It's almost competitive.

00:26:28.200 --> 00:26:30.480
It almost could compete with Java names.

00:26:30.480 --> 00:26:31.320
Yeah, exactly.

00:26:31.320 --> 00:26:33.300
Standard types right there.

00:26:33.300 --> 00:26:34.560
Awesome.

00:26:34.560 --> 00:26:34.900
All right.

00:26:34.900 --> 00:26:37.900
Well, definitely fun to share all this news with you, Brian.

00:26:37.900 --> 00:26:39.520
As always, thanks for doing it.

00:26:39.520 --> 00:26:39.880
All right.

00:26:39.880 --> 00:26:40.420
Thank you.

00:26:40.420 --> 00:26:40.640
Bye.

00:26:40.640 --> 00:26:40.940
You bet.

00:26:40.940 --> 00:26:41.200
Bye.

00:26:41.200 --> 00:26:41.240
Bye.

00:26:41.240 --> 00:26:43.360
Thank you for listening to Python Bytes.

00:26:43.360 --> 00:26:45.880
Follow the show on Twitter via at Python Bytes.

00:26:45.880 --> 00:26:48.780
That's Python Bytes as in B-Y-T-E-S.

00:26:48.780 --> 00:26:52.180
And get the full show notes at Python Bytes.fm.

00:26:52.180 --> 00:26:56.540
If you have a news item you want featured, just visit Python Bytes.fm and send it our way.

00:26:56.540 --> 00:26:59.240
We're always on the lookout for sharing something cool.

00:26:59.240 --> 00:27:02.620
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:27:02.620 --> 00:27:06.140
Thank you for listening and sharing this podcast with your friends and colleagues.

