WEBVTT

00:00:00.001 --> 00:00:02.740
How often have people asked what language or technology you work in?

00:00:02.740 --> 00:00:04.960
When you answer Python, they get a little confused and ask,

00:00:04.960 --> 00:00:07.140
what can you actually build in Python? What type of apps?

00:00:07.140 --> 00:00:10.540
Implication being that Python is just a notch above Bash scripts,

00:00:10.540 --> 00:00:15.320
and that real things aren't built with Python, but rather with Java, C#, Objective-C, and so on.

00:00:15.320 --> 00:00:19.540
Mahmoud Hashemi and I might be able to help put some real evidence behind your responses.

00:00:19.540 --> 00:00:24.460
On episode 54, Talk Python To Me, I talk with Mahmoud about his new online course

00:00:24.460 --> 00:00:26.980
he wrote for O'Reilly called Enterprise Software in Python.

00:00:27.840 --> 00:00:31.560
You'll hear many real-world examples from his experience inside PayPal,

00:00:31.560 --> 00:00:33.280
and many more throughout the industry.

00:00:33.280 --> 00:00:38.380
This is episode 54 of Talk Python To Me, recorded April 4th, 2016.

00:00:55.680 --> 00:01:00.280
It's about design patterns. Anyone can get the job done. It's the execution that matters.

00:01:00.280 --> 00:01:06.900
Welcome to Talk Python To Me, a weekly podcast on Python, the language, the libraries, the ecosystem,

00:01:06.900 --> 00:01:11.640
and the personalities. This is your host, Michael Kennedy. Follow me on Twitter where I'm at,

00:01:11.640 --> 00:01:16.000
mkennedy. Keep up with the show and listen to past episodes at talkpython.fm,

00:01:16.000 --> 00:01:18.580
and follow the show on Twitter via at Talk Python.

00:01:19.380 --> 00:01:25.100
This episode is brought to you by SnapCI and Hired. Thank them for supporting the show on Twitter via

00:01:25.100 --> 00:01:29.160
at Snap underscore CI and at Hired underscore HQ.

00:01:30.000 --> 00:01:34.720
The news this week is all about online courses. You'll want to be sure that you're a friend of the show

00:01:34.720 --> 00:01:40.000
because we have two cool giveaways. Just drop by talkpython.fm and click on Friends of the Show

00:01:40.000 --> 00:01:41.400
in the navbar to become eligible.

00:01:41.400 --> 00:01:46.160
Mahmoud is giving away a copy of his online course which normally sells for $149.

00:01:46.160 --> 00:01:49.880
I'll pick one lucky friend of the show later this week to receive a copy.

00:01:49.880 --> 00:01:53.020
You can find the links to his course in the show notes for this episode.

00:01:53.480 --> 00:01:58.220
Speaking of online courses, my Python jumpstart by building 10 apps is out and people are really loving it.

00:01:58.220 --> 00:02:01.740
I thought I'd join Mahmoud and give away a copy or two this week as well.

00:02:01.740 --> 00:02:05.580
You can see the details of my course at talkpython.fm/course.

00:02:05.580 --> 00:02:07.800
Now let's talk about Enterprise Python.

00:02:07.800 --> 00:02:11.600
Mahmoud, welcome to the show. Welcome back to the show.

00:02:11.600 --> 00:02:13.160
It's great to be back.

00:02:13.160 --> 00:02:18.620
Yeah, I really enjoyed the episodes we've done before and this is actually your third appearance.

00:02:18.620 --> 00:02:26.980
You were on as the main guest in episode four where we talked about the myth of Enterprise Python

00:02:26.980 --> 00:02:28.640
which was based on an article.

00:02:28.640 --> 00:02:31.420
That was sort of when this was kicking all off. That's right.

00:02:31.420 --> 00:02:35.460
Yeah, the 10 myths of Enterprise Python blog posts.

00:02:35.460 --> 00:02:40.980
That's right. This is like the germ or the seed that generated this course that we're going to talk about, right?

00:02:40.980 --> 00:02:43.020
It's been a wild and crazy ride. That's right.

00:02:43.020 --> 00:02:43.920
I bet it has.

00:02:43.920 --> 00:02:51.560
And then you gave some cool inside information on how you guys think about hiring and junior engineers back in episode 41.

00:02:51.560 --> 00:02:53.220
And this is going to be episode 54.

00:02:53.220 --> 00:02:54.900
So I'm instituting a new rule.

00:02:54.900 --> 00:02:58.040
You're not allowed to come back on the show unless there's a four in the number.

00:02:58.040 --> 00:03:00.840
That seems like a fine rule to me.

00:03:00.840 --> 00:03:04.320
I can like, so at least 10 more episodes.

00:03:04.320 --> 00:03:06.300
I can probably drum up something in that time.

00:03:06.300 --> 00:03:08.260
Perfect, perfect.

00:03:08.740 --> 00:03:12.020
All right, so people heard your story back on show four.

00:03:12.020 --> 00:03:17.920
So we won't go sort of through how you got back into programming, even though that's the question I often ask people.

00:03:17.920 --> 00:03:21.240
Instead, I'd like to hear how you got into enterprise programming.

00:03:21.240 --> 00:03:25.540
And what was the step where you went from just, I'm doing programming, I'm doing Python,

00:03:25.540 --> 00:03:31.360
to I'm now working at a company that has more employees than some small towns?

00:03:31.620 --> 00:03:38.700
You know, that's actually something that recently I was forced to sort of ponder a lot on, you know,

00:03:38.700 --> 00:03:42.600
like just had some really deep shower thoughts, as it were.

00:03:42.600 --> 00:03:49.620
And so, yeah, I sort of fell into it, as I'm sure so many do.

00:03:49.620 --> 00:03:55.560
Like you get an internship at a company and they assign you kind of, you know,

00:03:55.560 --> 00:03:59.220
maybe the worst stuff that you can do within three months.

00:03:59.220 --> 00:04:04.820
Like they want you to do something, but they don't want it to be like, you know, super, super glamorous.

00:04:04.820 --> 00:04:07.840
They give that to their star engineers who already have full-time positions.

00:04:07.840 --> 00:04:13.500
So, you know, as an intern, I was doing some really niche log analysis stuff.

00:04:13.500 --> 00:04:20.760
And so, you know, I actually define enterprise software in my course.

00:04:20.760 --> 00:04:26.060
And, you know, one of the main things that makes software enterprise isn't that it's high performance or something like that.

00:04:26.060 --> 00:04:31.200
It's actually that it's very niche, you know, has a very constrained user base that's interested in certain things.

00:04:31.200 --> 00:04:38.160
And so, you know, I just started out doing really niche applications because I love software introspectability so much.

00:04:38.160 --> 00:04:43.480
You know, if you tell me, hey, go analyze these logs, go find out what's slowing this application down,

00:04:43.480 --> 00:04:46.460
that's something that even now I can't really resist.

00:04:46.880 --> 00:04:47.980
Yeah, that's really cool.

00:04:47.980 --> 00:04:51.140
Those types of enterprise apps are pretty different.

00:04:51.140 --> 00:04:57.200
I spent a long time working at a company, I guess probably six, seven years, one of my first jobs,

00:04:57.200 --> 00:05:01.880
working at a company where I think there was maybe a maximum of 25 employees.

00:05:01.880 --> 00:05:07.940
And we were writing internal software to do all sorts of cool stuff at this place where we did eye tracking.

00:05:08.620 --> 00:05:16.940
And we'd write custom apps to sort of, you know, collect various specific studies that the scientists want to do with eye tracking and things like that.

00:05:16.940 --> 00:05:21.760
And I think we wrote some really powerful and beautiful software, but it was for like 10 people.

00:05:21.760 --> 00:05:31.200
You know, and so that's, it's not sort of the scalable sort of advertisement driven concept of like Pinterest and hockey curve growth and all that.

00:05:31.200 --> 00:05:38.000
But it's the people who use that software, like their jobs, like the whole company depends on that software.

00:05:38.000 --> 00:05:40.180
So it's pretty interesting to live in that space.

00:05:40.180 --> 00:05:43.280
They don't really have a, they don't really have a choice, you know.

00:05:43.280 --> 00:05:48.600
So like, I mean, that's kind of what makes a lot of things enterprise.

00:05:48.600 --> 00:05:52.600
That's sort of the stuff that makes a lot of enterprise stuff kind of bad.

00:05:52.600 --> 00:05:54.060
But we can probably go into that later.

00:05:54.060 --> 00:05:55.180
Yeah.

00:05:55.180 --> 00:06:00.100
The whole battleship gray, I don't need to know design, just because I'm a programmer, that kind of thing.

00:06:00.700 --> 00:06:01.960
Yeah, that sort of thing.

00:06:01.960 --> 00:06:04.720
You know, there's no, there's no alternative.

00:06:04.720 --> 00:06:07.340
So you don't spend any time actually making stuff good.

00:06:07.340 --> 00:06:09.200
That's one approach some people take.

00:06:09.200 --> 00:06:11.120
You know, I'm not for that approach personally.

00:06:11.120 --> 00:06:11.680
Yeah.

00:06:11.680 --> 00:06:18.760
I think that used to fly, especially in the 90s when you write enterprise software, it could be seriously unusable.

00:06:18.760 --> 00:06:28.960
But ever since the iPhone came out and people have gotten used to really beautiful, nice computing experiences,

00:06:29.160 --> 00:06:32.200
they're like, why do I have to go to work and have this horrible computing experience, right?

00:06:32.200 --> 00:06:35.720
That has, that has actually left its mark.

00:06:35.720 --> 00:06:36.260
I agree.

00:06:37.120 --> 00:06:39.900
I mean, there are pros to that and there are cons to that.

00:06:39.900 --> 00:06:46.720
Now I see a lot of stuff getting polished a whole lot, but the underlying quality is still lacking.

00:06:46.720 --> 00:06:49.740
So, you know, there are lots of ways to compromise quality.

00:06:49.740 --> 00:06:52.280
And enterprise will always find a new way.

00:06:52.280 --> 00:06:53.860
That's right.

00:06:53.860 --> 00:06:54.080
Yeah.

00:06:54.580 --> 00:07:02.080
So, you know, I have this, like, you know, hopefully we'll get to cover a little bit about, you know, how to sort of mitigate that with the power of Python.

00:07:02.080 --> 00:07:03.080
Yeah, absolutely.

00:07:03.680 --> 00:07:11.940
So, one concept I'd kind of like to introduce near the beginning before we get into the course is just that when you think of enterprise developers,

00:07:11.940 --> 00:07:17.520
and you can maybe put Python to the side for just a moment and just say, like, across all technologies,

00:07:17.780 --> 00:07:35.560
a lot of times there absolutely are super smart people writing amazing software, but maybe they're just going to work and they're just doing their job and they're not going and speaking at the conferences and they're not on Twitter constantly blogging and tweeting about, you know, whatever it is that they're doing.

00:07:35.560 --> 00:07:38.200
They just go do their job and they go away.

00:07:38.200 --> 00:07:48.820
And so I think that we probably underestimate the impact and the number of people that kind of live in this space because they're not necessarily as vocal.

00:07:48.820 --> 00:07:49.880
Yeah.

00:07:49.880 --> 00:07:52.740
And, I mean, I don't know.

00:07:52.740 --> 00:07:56.840
I'm not really for the cult of personality, like, you know, rock star coder type stuff.

00:07:56.840 --> 00:08:02.260
I think that, like, every developer has a rock star within them.

00:08:02.260 --> 00:08:09.640
I know because, I mean, you know, they talk about 10x programmers, like, and some people say, hey, they don't exist.

00:08:09.640 --> 00:08:10.940
And other people say, hey, they do exist.

00:08:10.940 --> 00:08:13.520
And it's, like, a little bit like this big foot of developers.

00:08:13.520 --> 00:08:17.200
And I don't know why it's so controversial, why it has to be like that.

00:08:17.200 --> 00:08:20.140
Everyone has within them, like, a 10x developer.

00:08:20.140 --> 00:08:27.200
If you're struck with the right idea, you know, you will work tirelessly and learn so much within the span of just a couple of weeks.

00:08:27.540 --> 00:08:34.180
And, you know, the rest of the time, like you said, you have a normal work-life balance and you have a day job and that's totally fine.

00:08:34.180 --> 00:08:37.200
But 10x developers do exist and they're within all of us.

00:08:37.200 --> 00:08:38.240
That's what I choose to believe.

00:08:38.240 --> 00:08:39.800
I totally agree with you.

00:08:39.800 --> 00:08:48.200
I think if you were, like you said, struck with inspiration, you can do almost superhuman type of work.

00:08:48.200 --> 00:08:49.780
So focused, so effective.

00:08:49.780 --> 00:08:53.720
And on one hand, it'd be cool if we could always be that focused and effective.

00:08:53.720 --> 00:08:56.480
But, you know, that's how inspiration works, right?

00:08:56.480 --> 00:09:04.620
If you both have the time and the energy and the idea all coming together, you could be that 10x developer for that project or whatever.

00:09:04.620 --> 00:09:05.140
Right.

00:09:05.140 --> 00:09:09.400
I mean, you won't believe this, you know, looking at my GitHub or my Twitter or whatever, right?

00:09:09.400 --> 00:09:14.180
But I do think that there is much more to life than just code.

00:09:14.180 --> 00:09:16.220
So, yeah.

00:09:16.220 --> 00:09:17.740
Yeah, same here.

00:09:17.740 --> 00:09:21.220
But I try to keep it basically to technology on Twitter as well.

00:09:21.220 --> 00:09:22.220
So it's hard to tell.

00:09:22.220 --> 00:09:26.060
So let's talk about your course.

00:09:26.360 --> 00:09:30.160
So it's called Enterprise Software with Python, right?

00:09:30.160 --> 00:09:32.940
And you're distributing this through O'Reilly.

00:09:32.940 --> 00:09:33.360
Is that right?

00:09:33.360 --> 00:09:34.600
That's right.

00:09:34.600 --> 00:09:45.000
So I think that basically because of the 10 minutes of Enterprise Python blog post, they actually contacted me a little bit before we did episode number four.

00:09:45.000 --> 00:09:52.860
And they're like, hey, would you like to expand upon this and do a project on Enterprise Software?

00:09:53.520 --> 00:09:55.980
And, you know, I really hemmed and hawed.

00:09:55.980 --> 00:09:57.380
I'm sort of more of an engineer.

00:09:57.380 --> 00:09:58.720
I'm a builder, you know.

00:09:58.720 --> 00:10:02.800
And I have a lot of reservations around education.

00:10:02.800 --> 00:10:06.080
Like I'm a firm believer in education, but it's very time consuming.

00:10:06.080 --> 00:10:09.680
My dad, you know, he's a professor of virology, right?

00:10:09.720 --> 00:10:11.040
I have really high standards.

00:10:11.040 --> 00:10:14.840
And I know that if I get involved with something like this, I'm going to go all out.

00:10:14.840 --> 00:10:16.540
And so I hemmed and I hawed.

00:10:16.540 --> 00:10:22.520
But then I finally, like, you know, decided to make it happen in August of last year.

00:10:22.520 --> 00:10:23.840
I started working on it.

00:10:23.840 --> 00:10:31.220
And I chose the video format because of how successful I saw that it was inside the company here.

00:10:31.220 --> 00:10:32.920
And so it's a video course.

00:10:32.920 --> 00:10:39.460
In preparation for it, I actually taught over a dozen internal, like, training courses at PayPal.

00:10:39.460 --> 00:10:48.320
And just covering all sorts of different topics, sort of honing in on the right, the best explanations for various topics in Enterprise Software.

00:10:48.320 --> 00:10:53.100
And I ended up with this course that is about, I would say, like, it's half and half.

00:10:53.100 --> 00:10:59.380
It's like half, you know, Enterprise Software, you know, and half, like, how to do it in Python.

00:10:59.860 --> 00:11:02.460
Python just works really well as an example language.

00:11:02.460 --> 00:11:05.500
And, you know, the ecosystem is very full-bodied.

00:11:05.500 --> 00:11:08.080
So, you know, it really fit well.

00:11:08.080 --> 00:11:12.980
But it has whole segments of it that are not at all Python significant.

00:11:12.980 --> 00:11:16.600
It's almost like a case study of Enterprise Software.

00:11:16.600 --> 00:11:20.940
But from, you know, choosing Python as a specific language.

00:11:20.940 --> 00:11:21.980
That's really cool.

00:11:21.980 --> 00:11:29.660
So one of the things that you ask in this class, and I guess your class is, like, in your blog post,

00:11:29.660 --> 00:11:33.940
it was sort of a, people think these things are inappropriate in Python.

00:11:33.940 --> 00:11:40.940
Let me show you all the ways, the 10 ways, where they've got some false conception, right?

00:11:40.940 --> 00:11:46.380
Python is just a scripting language or something silly like this that gets in their way.

00:11:46.380 --> 00:11:52.540
But this is more like, well, we'll talk about those, but let's actually study the whole thing in a more concrete way, right?

00:11:53.100 --> 00:11:57.680
So one of the questions you sort of started out with, which I thought was interesting, is you said,

00:11:57.680 --> 00:11:59.640
is Python suitable for the enterprise?

00:11:59.640 --> 00:12:02.320
And when should you write Python code?

00:12:02.320 --> 00:12:02.600
Right.

00:12:03.720 --> 00:12:06.720
And that is, I mean, it's a valid question, right?

00:12:06.720 --> 00:12:13.320
You're at a company, and, you know, as an engineer, Python, it's a language of choice, you know,

00:12:13.320 --> 00:12:15.940
which means that, like, engineers are going to choose it.

00:12:15.940 --> 00:12:17.880
Your boss isn't going to choose it for you.

00:12:17.880 --> 00:12:22.840
Usually, like, C-level type people do not choose Python for their company.

00:12:23.920 --> 00:12:27.800
And that's kind of something I'm trying to reverse here.

00:12:27.800 --> 00:12:34.660
Python has been shown to be, like, tremendously successful for many very large-scale, you know, companies.

00:12:34.660 --> 00:12:41.840
YouTube, Yelp, Dropbox, and, you know, I believe CERN uses it.

00:12:41.840 --> 00:12:43.400
It's really all over the place.

00:12:43.400 --> 00:12:47.020
So, I mean, it shouldn't be as controversial as it is.

00:12:47.020 --> 00:12:52.820
And so I go down the list of when you, you know, when we've actually seen it used.

00:12:53.100 --> 00:12:55.780
I'm not saying that, hey, here's where I think you should use it.

00:12:55.780 --> 00:12:58.660
I'm like, no, here is where it has been used successfully.

00:12:58.660 --> 00:13:04.940
And then I give a couple of areas where I don't think it's as common, you know, for enterprise development,

00:13:04.940 --> 00:13:08.180
such as you don't really see it that often in web front end.

00:13:08.180 --> 00:13:10.860
You know, that's pretty much all JavaScript and JavaScript derived.

00:13:10.860 --> 00:13:12.180
You know, there's PyJamas.

00:13:12.180 --> 00:13:14.340
That's not really quite there.

00:13:14.340 --> 00:13:15.100
There's Brython.

00:13:15.100 --> 00:13:18.920
And, like, for browser Python, that's not really quite there yet.

00:13:18.920 --> 00:13:22.280
But, yeah, so, but, yeah,

00:13:22.280 --> 00:13:24.840
Python is absolutely suitable for the enterprise.

00:13:24.840 --> 00:13:30.040
And I don't think that it's just generic organizations that don't understand this.

00:13:30.040 --> 00:13:35.040
Even when we go to conferences and speak with other Python developers,

00:13:35.040 --> 00:13:39.520
they're kind of appalled to hear that we are, like, you know,

00:13:39.520 --> 00:13:42.980
shooting for 100 microsecond response times.

00:13:42.980 --> 00:13:45.680
You know, 100, 200 microsecond response times.

00:13:46.120 --> 00:13:48.960
You know, as served from CPython.

00:13:48.960 --> 00:13:50.420
You know, this isn't even PyPy.

00:13:50.420 --> 00:14:00.780
And so, yeah, I mean, we can hit those enterprise performance type numbers very consistently with some good engineering.

00:14:00.780 --> 00:14:07.340
And I think that this course lays the groundwork for making that sort of software possible in Python.

00:14:07.720 --> 00:14:08.320
I totally agree.

00:14:08.320 --> 00:14:10.700
I think, you know, you brought up CERN, right?

00:14:10.700 --> 00:14:12.000
I talked to Kyle Kranmer.

00:14:12.000 --> 00:14:12.580
Right.

00:14:12.580 --> 00:14:13.520
I listened to that episode.

00:14:13.520 --> 00:14:15.060
That was so excellent.

00:14:15.060 --> 00:14:22.360
And I'm just thinking if Python is appropriate to help collect the data from the Large Hadron Collider

00:14:22.360 --> 00:14:26.720
and win the Nobel Prize for fighting the Higgs boson,

00:14:26.720 --> 00:14:31.260
it's probably not too bad to, like, monitor your log files or something.

00:14:31.260 --> 00:14:36.920
The people think they have these amazing, amazing requirements,

00:14:36.920 --> 00:14:39.880
but a lot of times there's just a bunch of little tools you got to build.

00:14:39.880 --> 00:14:44.700
And, you know, you don't need, I don't know, some super specialized thing.

00:14:45.700 --> 00:14:53.520
Yeah, since the last episode, the main project I've been working on is a sort of a key distribution system

00:14:53.520 --> 00:14:57.120
for securing sensitive data inside of PayPal.

00:14:57.120 --> 00:15:01.920
You know, trust and security is PayPal's, you know, number one, like, selling point.

00:15:01.920 --> 00:15:03.860
That's what the brand is associated with.

00:15:03.860 --> 00:15:06.760
It is the safest way to pay online, that sort of thing.

00:15:06.760 --> 00:15:13.120
And to keep it that way, you know, we have to be innovating in that space.

00:15:13.440 --> 00:15:18.880
And so that's basically as low-level a system as you will find inside of PayPal.

00:15:18.880 --> 00:15:21.140
Like, everything depends on that.

00:15:21.140 --> 00:15:26.380
And, you know, we expect billions of requests per day,

00:15:26.380 --> 00:15:28.460
three, two, three billion requests per day.

00:15:28.460 --> 00:15:31.800
We're already, like, seeing the adoption is happening,

00:15:31.800 --> 00:15:34.420
but we've seen days of 500 million requests per day.

00:15:34.420 --> 00:15:39.540
And, you know, the, you know, average median time that we're shooting for

00:15:39.540 --> 00:15:43.840
is less than two milliseconds for the response.

00:15:43.840 --> 00:15:46.000
So it's not just for logs or whatever.

00:15:46.000 --> 00:15:48.280
It is for these critical systems.

00:15:48.280 --> 00:15:54.700
And it's the main reason that we chose Python was because of its consistency,

00:15:54.700 --> 00:15:57.900
our ability to measure how the software is performing,

00:15:57.900 --> 00:16:02.060
and because we can maintain it with a very small team.

00:16:02.300 --> 00:16:04.720
The security team is not a huge team at PayPal.

00:16:04.720 --> 00:16:06.360
Application security, I should say.

00:16:06.360 --> 00:16:10.060
InfoSec, that's a much larger team.

00:16:10.060 --> 00:16:12.280
But application security is a much smaller team.

00:16:12.280 --> 00:16:13.280
Wow.

00:16:13.280 --> 00:16:18.340
That's really amazing that that app written in Python is at the foundation of all those things.

00:16:18.340 --> 00:16:20.840
Like, billions of requests per day is,

00:16:20.840 --> 00:16:23.800
that's a number that not so many people deal with.

00:16:23.800 --> 00:16:25.040
That's really, really cool.

00:16:25.040 --> 00:16:25.900
And that's written in Python.

00:16:26.020 --> 00:16:28.520
Is it like an HTTP service, or what's the story there?

00:16:28.520 --> 00:16:29.540
Oh, yeah.

00:16:29.540 --> 00:16:31.600
So that's one of the great things.

00:16:31.600 --> 00:16:37.920
So because of Python's easy, like, I mean, it's not just Python.

00:16:37.920 --> 00:16:40.100
You know, we have a framework that we've built on top of that.

00:16:40.100 --> 00:16:43.800
Most of that is open sourced on PayPal's GitHub.

00:16:43.800 --> 00:16:44.720
It's called support.

00:16:44.720 --> 00:16:46.280
It's sort of a reference framework.

00:16:47.280 --> 00:16:54.040
So using a framework, you know, based on that, we have several protocols that we support.

00:16:54.040 --> 00:17:01.600
HTTP is, like, if you're talking HTTP 1.1, 1.0, is kind of slow to parse.

00:17:01.600 --> 00:17:05.020
So we go for lower overhead protocols.

00:17:05.020 --> 00:17:06.940
We're fans of NetString.

00:17:06.940 --> 00:17:08.000
That's a classic.

00:17:08.000 --> 00:17:10.780
You know, it even has sort of roots in the crypto community,

00:17:10.780 --> 00:17:15.680
because DJB, Daniel J. Bernstein, you know, defined it so many years ago.

00:17:15.680 --> 00:17:17.600
It has a Wikipedia page.

00:17:17.600 --> 00:17:18.900
It's extremely simple.

00:17:18.900 --> 00:17:19.840
NetString.

00:17:19.840 --> 00:17:22.760
And then we have something even lower level than that,

00:17:22.760 --> 00:17:26.660
which is similar to NetString, but it's called TLV, tag length value.

00:17:26.660 --> 00:17:32.260
And so you do have to go for, like, lower level protocols there.

00:17:32.260 --> 00:17:36.500
But because it's Python, you know, we can maintain an HTTP interface

00:17:36.500 --> 00:17:40.220
for development purposes so that people can mock things out.

00:17:40.220 --> 00:17:43.860
without having to worry about the details of TLV.

00:17:43.860 --> 00:17:46.300
I guess if you're going to get two millisecond response time,

00:17:46.300 --> 00:17:49.260
you're more or less down raw sockets almost, right?

00:17:49.260 --> 00:17:51.440
Yeah, yeah.

00:17:51.440 --> 00:17:55.040
No, we don't shy away from raw sockets.

00:17:55.040 --> 00:17:57.260
We have a little buffered socket that we've written on top of that.

00:17:57.260 --> 00:18:02.260
But when you want to hit sub-millisecond, deep sub-millisecond times,

00:18:02.840 --> 00:18:08.380
then you do have to basically be counting the, you know,

00:18:08.380 --> 00:18:12.300
bytecode instructions that you're going to be, like, executing.

00:18:12.300 --> 00:18:14.520
So every line does count.

00:18:14.520 --> 00:18:16.540
You know, every line does have its cost.

00:18:16.540 --> 00:18:18.780
But Python makes it easy to gauge that cost.

00:18:18.780 --> 00:18:21.160
And because you can get your features done in time,

00:18:21.160 --> 00:18:24.620
you can actually start down that performance path much sooner than other stacks.

00:18:24.620 --> 00:18:27.480
And that's the big selling point for us.

00:18:27.960 --> 00:18:31.540
Yeah, you can do the testing and experiment and find the right answer

00:18:31.540 --> 00:18:36.200
probably before the first prototype would be even finished in C++, right?

00:18:36.200 --> 00:18:37.520
Oh, yeah.

00:18:37.520 --> 00:18:42.020
I mean, in fact, we have had literal, I mean, I wouldn't call them competitions, right?

00:18:42.020 --> 00:18:42.880
We're inside a company.

00:18:42.880 --> 00:18:43.860
We're all one team, right?

00:18:43.860 --> 00:18:48.300
But, like, we've had cases where that exact stuff was happening.

00:18:48.300 --> 00:18:51.360
Like, you know, we were done months ahead of time

00:18:51.360 --> 00:18:53.840
and already, like, iterating on our performance.

00:18:53.920 --> 00:18:56.040
By the time C++ came around with their stuff,

00:18:56.040 --> 00:18:59.880
they couldn't even get within an order of magnitude of our scalability.

00:18:59.880 --> 00:19:01.120
Wow, that's awesome.

00:19:01.120 --> 00:19:04.360
So let's take it back to the beginning for a moment.

00:19:04.360 --> 00:19:06.020
You talked about your first enterprise app,

00:19:06.020 --> 00:19:10.400
and that was kind of that log file monitoring thing, I think, right?

00:19:10.400 --> 00:19:10.560
Right, right.

00:19:10.560 --> 00:19:14.220
And you said there was a couple of lessons you learned from it,

00:19:14.220 --> 00:19:15.560
and I thought they were really good.

00:19:15.560 --> 00:19:16.720
Maybe you could talk about those a bit.

00:19:17.660 --> 00:19:24.320
Well, so that first version of that log analysis web front end was actually written in PHP.

00:19:24.320 --> 00:19:27.200
You know, that was my last PHP project.

00:19:27.200 --> 00:19:32.120
And, yeah, I got it done in time, but it had some problems.

00:19:32.120 --> 00:19:34.260
Number one is that, like, it was written in PHP,

00:19:34.260 --> 00:19:39.020
so, like, maintenance wasn't really, you know, on my side.

00:19:39.260 --> 00:19:44.720
And then I actually had to keep fixing bugs and running the service.

00:19:44.720 --> 00:19:49.140
And I basically was left with no time to actually do other projects.

00:19:49.140 --> 00:19:53.680
And so I didn't want to be the guy that just maintains log analysis tool, you know,

00:19:53.680 --> 00:19:55.140
so I shut it down after about a year.

00:19:55.140 --> 00:19:58.900
But, you know, from then on in, I gave a lot more thought to,

00:19:58.900 --> 00:20:01.120
what is the maintenance curve going to look like?

00:20:01.240 --> 00:20:08.480
Is this something that I'm going to be able to sort of set aside and move on to new things

00:20:08.480 --> 00:20:10.340
so I'll always have something new?

00:20:10.340 --> 00:20:12.480
But that old stuff can keep, like, running.

00:20:12.480 --> 00:20:17.560
I don't want to be, you know, one of those flash-in-the-pan project sort of guys.

00:20:17.560 --> 00:20:22.020
You know, I like to build up a lot of different services that I run

00:20:22.020 --> 00:20:25.040
that help people in real situations.

00:20:25.540 --> 00:20:29.480
The exact lessons were basically, like, choose your dependencies

00:20:29.480 --> 00:20:31.900
and avoid doing it all at once.

00:20:31.900 --> 00:20:34.820
So you can, if you can rely on your organization,

00:20:34.820 --> 00:20:36.460
I mean, you're working at a large organization.

00:20:36.460 --> 00:20:39.080
Find ways to rely on the organization.

00:20:39.080 --> 00:20:40.720
Offload some of that maintenance.

00:20:40.720 --> 00:20:45.540
And finally, like, that longevity, it doesn't come easy.

00:20:45.540 --> 00:20:48.200
It's the result of a lot of critical decisions.

00:20:48.200 --> 00:20:50.940
And it's more than just regular software, I think.

00:20:50.940 --> 00:20:53.440
Like, you could write...

00:20:53.440 --> 00:20:54.720
Yeah, there's a lot of soft skills involved.

00:20:54.720 --> 00:20:55.520
Oh, absolutely.

00:20:55.520 --> 00:21:00.680
So you could write the software if you were kind of doing this little app on your own

00:21:00.680 --> 00:21:03.380
and it could do its own little thing.

00:21:03.380 --> 00:21:06.840
But if it's going to continue to live on and be used,

00:21:06.840 --> 00:21:13.140
you have to know the sort of invisible connective tissue of the software of your company, right?

00:21:13.140 --> 00:21:14.800
Like, this is the way things are done.

00:21:14.800 --> 00:21:17.400
And this is the way it will actually be useful to people.

00:21:17.400 --> 00:21:19.640
Yes, I should design it this way if it was from scratch.

00:21:19.640 --> 00:21:20.680
But people don't do that.

00:21:20.680 --> 00:21:21.200
They do this.

00:21:21.200 --> 00:21:22.640
And so I'm going to do this other weird thing

00:21:22.640 --> 00:21:25.780
because then it'll get used for a long time and so on, right?

00:21:25.780 --> 00:21:27.100
Right, right.

00:21:27.100 --> 00:21:30.560
Like, I mean, I'm all for going against the grain a little bit.

00:21:31.620 --> 00:21:34.860
But, and actually innovating, changing things and so forth.

00:21:34.860 --> 00:21:40.940
But if you try to do it all by yourself or all at once, you're setting yourself up for,

00:21:40.940 --> 00:21:44.900
I mean, you know, let's be frank, you're going to burn yourself out, right?

00:21:44.900 --> 00:21:47.460
And you're not going to be able to do those future projects.

00:21:47.460 --> 00:21:52.160
And that's the whole point, you know, is to continue building things because there's a lot of things to be done.

00:21:52.160 --> 00:22:09.940
Continuous delivery isn't just a buzzword.

00:22:09.940 --> 00:22:13.600
It's a shift in productivity that will help your whole team become more efficient.

00:22:13.600 --> 00:22:19.760
With SnapCI's continuous delivery tool, you can test, debug, and deploy your code quickly and reliably.

00:22:19.760 --> 00:22:25.660
Get your product in the hands of your users faster and deploy from just about anywhere at any time.

00:22:25.660 --> 00:22:30.860
And did you know that ThoughtWorks literally wrote the book on continuous integration and continuous delivery?

00:22:30.860 --> 00:22:36.020
Connect Snap to your GitHub repo and they'll build and run your first pipeline automagically.

00:22:36.520 --> 00:22:42.620
Thanks SnapCI for sponsoring this episode by trying them for free at snap.ci slash talkpython.

00:22:42.620 --> 00:23:02.440
Yeah, and you had some really interesting statistics about the types of apps and the numbers of services and so on inside PayPal in your course.

00:23:02.440 --> 00:23:06.400
And it just makes me kind of laugh thinking like, oh my gosh, this is crazy to think, you know,

00:23:06.420 --> 00:23:12.480
So when I'm talking about like, how do people within the company work and how does software normally connect?

00:23:12.480 --> 00:23:19.460
You had like a graph that was basically so dense it was illegible, but showing the interconnections between services.

00:23:19.460 --> 00:23:20.900
Can you talk about that for a sec?

00:23:20.900 --> 00:23:21.880
Sure.

00:23:21.880 --> 00:23:27.520
So PayPal is a service oriented architecture company going back over a decade.

00:23:27.520 --> 00:23:29.820
It started as a monolith.

00:23:29.820 --> 00:23:33.340
And there's nothing wrong with that when you're starting something out.

00:23:33.480 --> 00:23:36.500
Like a monolith is a really good way to get things done.

00:23:36.500 --> 00:23:48.060
But as you are expanding both in terms of customer base, computers running your software, people working on that software, most importantly,

00:23:48.060 --> 00:23:51.420
then you, it starts to become a burden.

00:23:51.920 --> 00:23:57.500
And eventually that hit a technical wall for PayPal where that monolith called WebScr.

00:23:57.500 --> 00:23:59.460
I think I can talk about that.

00:23:59.460 --> 00:24:01.220
W-E-B-S-C-R.

00:24:01.220 --> 00:24:03.820
If you look in some PayPal URLs, you'll still see it.

00:24:03.820 --> 00:24:06.720
It's a C++ executable.

00:24:06.720 --> 00:24:11.900
And it reached over a gigabyte and a half.

00:24:11.900 --> 00:24:13.360
One program.

00:24:13.980 --> 00:24:15.800
And I don't want to talk about that in the course.

00:24:15.800 --> 00:24:16.980
It's C++, not Python.

00:24:16.980 --> 00:24:19.460
So, but it hit like one and a half gigabytes.

00:24:19.460 --> 00:24:24.580
You can't even put debug symbols in there in order to debug what live issues are going to be.

00:24:24.580 --> 00:24:30.320
So, it became completely, it got completely out of hand.

00:24:30.920 --> 00:24:38.900
And they, at that point, like they knew that they had to switch to something more distributed so that they could work on it with more engineers.

00:24:38.900 --> 00:24:44.360
And so, you have these service-oriented architectures sort of for human reasons.

00:24:44.360 --> 00:24:46.400
You know, you want to have a user team.

00:24:46.400 --> 00:24:48.940
You want to have, you know, payments team.

00:24:48.940 --> 00:24:52.020
You want to have a, you know, front-end team or whatever.

00:24:52.020 --> 00:24:58.960
There's, you know, and so you have to start segmenting things by layers and domains.

00:24:59.700 --> 00:25:03.720
And so, at PayPal, we've done this in the extreme.

00:25:03.720 --> 00:25:05.580
We have one huge product.

00:25:05.580 --> 00:25:07.480
You know, Google, they have Gmail.

00:25:07.480 --> 00:25:08.780
They have Maps.

00:25:08.780 --> 00:25:12.800
And even they have sort of monolithic development structure in a way.

00:25:12.800 --> 00:25:16.140
But these are all separate products is what I'd like to emphasize.

00:25:16.140 --> 00:25:18.840
At PayPal, there's not that many different products.

00:25:18.840 --> 00:25:20.300
It's pretty much PayPal.com.

00:25:20.300 --> 00:25:28.560
And so, just for PayPal.com, you have over 3,000 service, over 3,000 service endpoints, logical endpoints.

00:25:29.060 --> 00:25:32.420
You know, there are tens of thousands of machines running the code.

00:25:32.420 --> 00:25:36.940
And just within the mid-tier, over 3,000 endpoints.

00:25:36.940 --> 00:25:40.420
And that's, like, you know, representing hundreds of code bases.

00:25:40.420 --> 00:25:43.700
And so, this is all communicating with a variety of protocols.

00:25:43.700 --> 00:25:45.180
I've listed off a few already.

00:25:45.260 --> 00:25:46.940
But it's pretty much those ones.

00:25:46.940 --> 00:25:50.420
HTTP, you know, RESTful, et cetera.

00:25:50.420 --> 00:25:53.800
Then you have NetString for some of the lower level, older stuff.

00:25:53.800 --> 00:25:58.780
That's pretty much, we have one, like, proprietary one that's really old and will never go away.

00:25:58.780 --> 00:26:01.760
You know, I talk about that in the course, too.

00:26:01.760 --> 00:26:03.880
There's a sort of design permanence.

00:26:05.680 --> 00:26:06.860
It's indelible.

00:26:06.860 --> 00:26:08.320
Yeah, absolutely.

00:26:08.320 --> 00:26:11.860
But, so, yeah, we have these thousands and thousands endpoints.

00:26:11.860 --> 00:26:14.860
And they, you know, rely on each other in really complicated ways.

00:26:14.860 --> 00:26:26.060
And each individual team has to consider how those runtime dependencies and logical dependencies are going to affect the scalability and performance of their application.

00:26:26.500 --> 00:26:30.060
That's a lot to keep in your mind and sort of juggle, right?

00:26:30.060 --> 00:26:38.000
Like, if I call this service and that service and this one calls that one, like, what is the latency and scalability considerations I have to actually worry about?

00:26:38.000 --> 00:26:42.180
Well, I mean, some people don't even get to the point where they're able to worry about that stuff.

00:26:42.180 --> 00:26:43.260
That's kind of the problem.

00:26:43.260 --> 00:26:52.380
You know, due to other decisions, you know, they end up, like, you know, constantly having to fix bugs or work around issues.

00:26:52.380 --> 00:26:56.200
And they don't get to have those important spare cycles to build quality.

00:26:56.200 --> 00:26:59.420
So, you did talk about scalability a bit in your course.

00:26:59.420 --> 00:27:06.340
And I thought that was interesting that you said scalability is not itself a feature of software.

00:27:06.340 --> 00:27:13.960
But it's actually, like, a composition of three or four bits or more sort of atomic units of, like, throughput and so on.

00:27:13.960 --> 00:27:15.060
Yeah.

00:27:15.060 --> 00:27:16.480
So, I thought about it a bunch.

00:27:16.480 --> 00:27:23.060
And I couldn't really find an ontology of what makes up software.

00:27:23.900 --> 00:27:28.400
What are the aspects of software that really applied to what I saw happening at PayPal?

00:27:28.400 --> 00:27:32.180
And so, I sort of had to come up with one of my own.

00:27:32.180 --> 00:27:39.160
So, yeah, we came up with this ontology, talking to coworkers and so forth, of six different software aspects.

00:27:39.160 --> 00:27:41.660
And so, the first is, like, usability.

00:27:41.660 --> 00:27:44.140
You know, that has to be first.

00:27:44.300 --> 00:27:50.020
If your software is not usable, if it doesn't have features to use, then it's really nothing at all.

00:27:50.020 --> 00:27:52.080
So, you have to have usability.

00:27:52.080 --> 00:27:55.420
And then, you know, we have availability.

00:27:55.420 --> 00:27:56.900
That's kind of the reliability.

00:27:56.900 --> 00:27:59.020
We have the introspectability.

00:27:59.020 --> 00:28:03.260
So, that's how good your logging is and other instrumentation.

00:28:03.720 --> 00:28:05.680
Then, we have performance.

00:28:05.680 --> 00:28:10.340
Everyone, when they think of enterprise software, they think about, like, they think I'm talking about performance.

00:28:10.340 --> 00:28:12.020
And that's just one aspect here.

00:28:12.020 --> 00:28:17.200
And within performance, I'm referring to, like, latency, throughput, and utilization.

00:28:17.200 --> 00:28:19.540
There are many aspects within each of these aspects.

00:28:19.540 --> 00:28:21.900
But fifth has to be security.

00:28:21.900 --> 00:28:25.320
Security really makes everything so much harder.

00:28:25.700 --> 00:28:37.500
I can tell you for a fact that one of the reasons why other companies can move, like, faster than how PayPal, like, moves is because they don't have to worry about locking down access to all these secure resources.

00:28:37.500 --> 00:28:43.040
Our deploy process is primarily convoluted because of that security consideration.

00:28:43.040 --> 00:28:47.160
Normal developers do not have access to where their code runs.

00:28:47.160 --> 00:28:51.860
So, that, you know, brings me to my sixth aspect, which is the agility, right?

00:28:51.860 --> 00:28:54.880
Your ability to deploy quickly, change things quickly.

00:28:55.400 --> 00:29:04.000
Everyone talks about, like, oh, everyone on their first day should be able to change one line of code and deploy within one hour or something like that.

00:29:04.000 --> 00:29:17.360
And I'm like, okay, man, like, you know, one line of HTML, you know, changing the styling of a button or something is very different than, like, one line that impacts everyone's, you know, security.

00:29:17.360 --> 00:29:23.740
Yeah, that token, that security service you were talking about that does almost a billion requests per day.

00:29:23.740 --> 00:29:25.360
Two, three billion, yeah.

00:29:25.360 --> 00:29:33.240
Yeah, that one you don't want, like, the new guy to, or girl, to, like, modify necessarily on the first day.

00:29:33.240 --> 00:29:33.960
Right, right.

00:29:33.960 --> 00:29:44.120
And so, I mean, and these six aspects, they're all, like, interconnected, like, better introspectability, we find correlates and causes better performance.

00:29:45.020 --> 00:29:49.400
And because you can actually see the effect that you can actually see the effect that your changes are having.

00:29:49.400 --> 00:30:00.720
And so, these six things sort of create, like, software hexagon or whatever, kind of like the project management triangle, which, aka the pick any two, right?

00:30:00.720 --> 00:30:02.360
Fast, good, and cheap.

00:30:02.680 --> 00:30:12.620
Like, you can make something that is very usable and you can deploy it very quickly, but maybe its availability is not so great because you don't have a good throttling scheme.

00:30:13.340 --> 00:30:15.700
It's like you have to choose a balance of these things.

00:30:15.700 --> 00:30:20.420
And as a result of choosing a good balance of these six aspects, you can build scalable software.

00:30:20.420 --> 00:30:21.060
Yeah.

00:30:21.060 --> 00:30:21.980
Very interesting.

00:30:22.380 --> 00:30:33.040
I think the good, fast, and cheap triad is a very effective mechanism for speaking to people who are not developers and developers as well, but it comes through really well.

00:30:33.040 --> 00:30:33.560
Right.

00:30:33.560 --> 00:30:36.120
But, I mean, good is just so nuanced.

00:30:36.120 --> 00:30:38.420
Fast, that's just a certain amount of time.

00:30:38.420 --> 00:30:40.540
Cheap, that's just a certain amount of money.

00:30:40.540 --> 00:30:41.580
Those are easy to quantify.

00:30:41.580 --> 00:30:42.700
But what does good mean?

00:30:42.700 --> 00:30:45.280
You have to expand that, and that's where these six aspects come from.

00:30:45.280 --> 00:30:51.600
So, you sort of set out to define a spectrum of enterprise software, if you will.

00:30:51.600 --> 00:30:59.340
You said, okay, a thing is not either enterprise software or not enterprise software, but it might live somewhere along a continuum.

00:30:59.340 --> 00:31:03.660
And you have, like, nine points that would push it one way or the other.

00:31:03.660 --> 00:31:05.120
Do you want to talk about those?

00:31:05.120 --> 00:31:06.700
I thought they were really on point.

00:31:06.700 --> 00:31:07.780
Yeah.

00:31:07.780 --> 00:31:09.620
Enterprise, it's either enterprise or it's not enterprise.

00:31:09.620 --> 00:31:19.560
That black and white view is not actually really helpful in helping people find, you know, just corollaries and analogies to the work that they're doing.

00:31:19.560 --> 00:31:24.440
You know, we want to make something that people can actually relate it to what they are working on.

00:31:24.440 --> 00:31:26.580
I created a list of these.

00:31:27.780 --> 00:31:31.400
And, you know, I'll probably release this as a blog post or something like that as well.

00:31:31.400 --> 00:31:36.580
But I think that this one is one of the free clips that you can view.

00:31:37.660 --> 00:31:45.840
But just to run down the list real quickly, you can have any number of these and it sort of defines how much, how enterprise your software is.

00:31:46.000 --> 00:31:48.420
So number one is that it's used by business.

00:31:48.420 --> 00:31:52.700
Number two is that it's sort of tailor made, like it's custom.

00:31:53.060 --> 00:32:06.280
And number three is that you have a specific user base, like we talked about before, that it's a, you know, if there's just two or three people using your software, it's going to have a really different development feed and flow.

00:32:06.820 --> 00:32:09.240
Then you have strict runtime requirements.

00:32:09.240 --> 00:32:10.820
That's where the performance comes in.

00:32:10.820 --> 00:32:17.320
You know, that I need this with an SLA 95 percentile of like, you know, two milliseconds, 200 milliseconds, whatever.

00:32:18.120 --> 00:32:21.500
Then you have that your software is part of a larger system.

00:32:21.500 --> 00:32:37.440
And so at PayPal, you know, if you have to, we have to integrate not just internally with thousands of service endpoints, but also externally with financial processors and, you know, all of these highly regulated, basically legacy systems.

00:32:37.440 --> 00:32:42.900
And so that brings me to the next one, which is legacy integration.

00:32:42.900 --> 00:32:47.400
If you have to integrate with legacy, you know, I just got to give that a special shout out.

00:32:47.400 --> 00:32:48.640
That's enterprise.

00:32:48.640 --> 00:32:53.060
That moves you far down the spectrum to the right, doesn't it?

00:32:53.060 --> 00:32:54.220
Exactly.

00:32:54.220 --> 00:33:00.400
And, you know, so and that feeds into kind of the design permanence.

00:33:00.400 --> 00:33:04.480
And so people worry a lot about making the right decisions.

00:33:04.480 --> 00:33:07.180
And we talk a lot about technical debt.

00:33:07.180 --> 00:33:16.020
But one person's technical debt is another person's like, you know, just software longevity, you know, software that has to run on airplanes.

00:33:16.680 --> 00:33:18.480
And satellites and so forth.

00:33:18.480 --> 00:33:20.820
I mean, it's not technical debt.

00:33:20.820 --> 00:33:23.480
It's just a different kind of investment.

00:33:24.200 --> 00:33:28.420
And so design permanence is definitely a hallmark of enterprise software.

00:33:28.420 --> 00:33:38.500
Because of all of the things involved when you're doing all these integrations, if there are a lot of negotiated timelines and promises being made about, like, you know, delivery dates and so forth.

00:33:39.260 --> 00:33:43.200
You know, some people will just say, hey, that's just waterfall and that's bad.

00:33:43.200 --> 00:33:49.260
But that's how a lot of systems have to work when you have these deep dependency trees of software.

00:33:49.660 --> 00:33:51.420
Like, you know, dependency, I guess.

00:33:51.420 --> 00:33:51.860
Reli.

00:33:51.860 --> 00:33:55.680
People relying on you having something done at a certain time.

00:33:56.400 --> 00:34:12.040
And finally, like, you know, when you are handing software off to another team to be run, you know, if you have a separate operations group, a separate site reliability engineering group, SRE, if you have a separate security group that's going to audit your stuff.

00:34:12.200 --> 00:34:17.040
If there's all these specialized groups, that's another aspect of enterprise software.

00:34:17.040 --> 00:34:28.700
And so if you look at these nine different, like, hallmarks, you can see that in consumer ecosystems, which consumer is the opposite of enterprise, these aren't really the case.

00:34:28.700 --> 00:34:31.860
You know, for instance, specific user base.

00:34:31.860 --> 00:34:37.580
Usually in consumer software, you're just putting an app on an app store and people will either like it or they won't like it.

00:34:37.580 --> 00:34:38.100
There's a market.

00:34:38.100 --> 00:34:38.860
There's choice.

00:34:39.020 --> 00:34:46.860
You know, a user base that's going to be using my first Python project at PayPal, you know, changes the prices of PayPal.

00:34:46.860 --> 00:34:50.220
There's a good reason why we don't want thousands of people using that.

00:34:50.220 --> 00:34:56.260
It basically has 10 users or so who can actually modify the values in there.

00:34:56.260 --> 00:34:59.080
And they're still using my code, you know.

00:34:59.080 --> 00:35:02.900
And it's being maintained by a different group.

00:35:02.900 --> 00:35:07.900
So I consider that enterprise software, even though it only gets hundreds of requests a day at most.

00:35:08.280 --> 00:35:09.680
It has a specific user base.

00:35:09.680 --> 00:35:11.640
It's part of a larger system.

00:35:11.640 --> 00:35:12.660
Legacy integration.

00:35:12.660 --> 00:35:13.280
Tailor-made.

00:35:13.280 --> 00:35:13.740
Right.

00:35:13.740 --> 00:35:14.640
It's tailor-made.

00:35:14.640 --> 00:35:18.860
I mean, I use Django, of course, but at that time.

00:35:18.860 --> 00:35:28.560
And but it had to integrate with a lot of these systems and a lot of these human processes in a way that, you know, is just different than consumer software.

00:35:28.800 --> 00:35:36.460
So just defining something as enterprise based on its performance requirements excludes this other part of the spectrum.

00:35:36.460 --> 00:35:37.840
And that's not really that great.

00:35:37.840 --> 00:35:40.680
I'm not saying that that application is the most enterprise.

00:35:40.680 --> 00:35:50.360
Probably the most enterprise software that can occur to me is the ADA code that runs, you know, on the 737, 747, whatever, you know, airplanes.

00:35:50.740 --> 00:35:53.560
I mean, that's far more enterprise than I will ever write.

00:35:53.560 --> 00:35:56.680
It's even more enterprise than like the security stuff, I think.

00:35:56.680 --> 00:35:58.160
You know, there are lives at stake.

00:35:58.160 --> 00:36:00.220
So medical software.

00:36:00.220 --> 00:36:01.560
I consider that enterprise.

00:36:02.400 --> 00:36:09.520
Yeah, I think I think that's an interesting sort of nine dimensional spectrum that your code can live in.

00:36:09.520 --> 00:36:12.200
And I think it hits a lot of interesting points.

00:36:12.200 --> 00:36:23.760
You know, one thing that sort of struck me when you're talking about that with the tailor-made specific user base and thinking about how it fits into a larger system.

00:36:23.760 --> 00:36:26.920
You know, I think I've heard less of it lately.

00:36:26.920 --> 00:36:41.280
I don't know why, but for quite a while and still to some degree, people make very strong comparisons to architecture as in a person who builds a bridge, an engineer, maybe a civil engineer who builds a bridge.

00:36:41.280 --> 00:36:41.580
Sure.

00:36:41.580 --> 00:36:42.500
And software.

00:36:42.500 --> 00:36:50.200
And they're like, the civil engineer can build a bridge within 10% of time estimates, materials estimates, and so on.

00:36:50.200 --> 00:36:53.880
And, you know, people say, well, why can't we do this with software?

00:36:53.880 --> 00:36:58.360
Well, the reason is software is an immature discipline and we need to get more mature.

00:36:58.360 --> 00:37:01.420
But I think actually what is totally that totally misses the point.

00:37:01.420 --> 00:37:04.620
The thing is, it's the tailor-made part, right?

00:37:04.620 --> 00:37:05.240
Like, right.

00:37:05.240 --> 00:37:10.740
If the software existed and you could just plug it in, then bridges you can't copy.

00:37:10.740 --> 00:37:16.120
If you have 100 bridges that are real similar, you got to have 100 times build it, 100 experiences it.

00:37:16.120 --> 00:37:16.280
Right.

00:37:16.280 --> 00:37:19.700
But if it's software you use, you just you sell it, you know?

00:37:20.620 --> 00:37:36.020
Any web dev shop, any studio can give you a very accurate estimate how long it's going to take to set up your CMS if you do not have, like, really high, you know, customization requirements.

00:37:36.020 --> 00:37:39.820
And, in fact, when people go further, I don't know who's sponsoring these days, right?

00:37:39.820 --> 00:37:41.620
It's Squarespace or whatever, right?

00:37:41.780 --> 00:37:44.080
Like, they've automated it.

00:37:44.080 --> 00:37:51.040
And so the main thing that's different in, like, the real world versus the virtual is the construction aspect, right?

00:37:51.360 --> 00:37:59.860
So, I mean, there's no, like, special construct – there's very little special construction setup, especially in these smaller applications.

00:37:59.860 --> 00:38:06.240
If you go look at ERP integrations, I think those still take, like, you know, a decade.

00:38:06.240 --> 00:38:08.540
I, you know, for better or worse.

00:38:08.540 --> 00:38:09.820
For better or worse.

00:38:09.820 --> 00:38:10.700
Yeah.

00:38:10.700 --> 00:38:14.540
So that is as enterprise as it gets.

00:38:14.540 --> 00:38:16.680
It's maybe more enterprise than it has to be.

00:38:16.900 --> 00:38:20.780
But I'm not going to sit over here and, you know, judge about that.

00:38:20.780 --> 00:38:21.360
Yeah.

00:38:21.360 --> 00:38:28.020
I think what your sort of list here highlights is you might say these are the requirements we have.

00:38:28.020 --> 00:38:32.860
But it has to fit into a very unique and largely invisible bigger structure.

00:38:32.860 --> 00:38:33.060
Right.

00:38:33.060 --> 00:38:36.740
And it's for a specific user base who's never had this piece of software before.

00:38:36.740 --> 00:38:45.380
And so, like, there's just so many unknowns and sort of one-offs that these analogies between, well, why can't we build software like we build bridges?

00:38:46.500 --> 00:38:49.860
Become more obvious when you think about all the stuff going on there.

00:38:49.860 --> 00:38:50.900
Right.

00:38:50.900 --> 00:38:52.960
And I think that we do need to think more about it.

00:38:52.960 --> 00:38:54.520
Like, and we need to talk more about it.

00:38:54.520 --> 00:38:59.340
I don't really like, you know – this is sort of my reservation about what you said about the iPhone, right?

00:38:59.340 --> 00:39:05.080
Like, you know, you can't really reduce every aspect of design to whatever Apple is doing.

00:39:05.080 --> 00:39:05.760
Right?

00:39:05.760 --> 00:39:08.380
Like, Apple doesn't make very much enterprise software.

00:39:08.380 --> 00:39:12.180
And, I mean, internally, I'm sure they have many enterprise systems.

00:39:12.180 --> 00:39:12.960
Don't get me wrong.

00:39:14.600 --> 00:39:18.240
It's not going to represent a whole industry.

00:39:18.240 --> 00:39:19.420
It's just one company.

00:39:19.420 --> 00:39:19.900
Yeah.

00:39:19.900 --> 00:39:20.220
You know?

00:39:20.220 --> 00:39:22.500
So, yeah.

00:39:22.500 --> 00:39:26.020
There's a lot of – I'm all for more variability in designs.

00:39:26.020 --> 00:39:27.020
Yeah, absolutely.

00:39:38.600 --> 00:39:40.880
This episode is brought to you by Hired.

00:39:40.880 --> 00:39:46.480
Hired is a two-sided, curated marketplace that connects the world's knowledge workers to the best opportunities.

00:39:46.480 --> 00:39:53.960
Each offer you receive has salary and equity presented right up front, and you can view the offers to accept or reject them before you even talk to the company.

00:39:54.760 --> 00:39:59.720
Typically, candidates receive five or more offers within the first week, and there are no obligations – ever.

00:39:59.720 --> 00:40:01.260
Sounds awesome, doesn't it?

00:40:01.260 --> 00:40:02.920
Well, did I mention the signing bonus?

00:40:02.920 --> 00:40:06.320
Everyone who accepts a job from Hired gets a $1,000 signing bonus.

00:40:06.320 --> 00:40:09.120
And, as Talk Python listeners, it gets way sweeter.

00:40:09.120 --> 00:40:14.820
Use the link Hired.com slash Talk Python To Me, and Hired will double the signing bonus to $2,000.

00:40:14.820 --> 00:40:16.980
Opportunity's knocking.

00:40:17.260 --> 00:40:20.400
Visit Hired.com slash Talk Python To Me and answer the call.

00:40:20.400 --> 00:40:36.300
One of the things you talked about in the class that I thought was surprising that you'd bring it up a little ways into it was you said, let's talk about what is Python.

00:40:36.300 --> 00:40:42.080
You said that this actually has several answers, almost depending on who you're talking to, to some degree.

00:40:42.080 --> 00:40:43.780
Yeah, it has to.

00:40:44.420 --> 00:40:53.580
Yeah, pretty deep into the course, I talk about what is Python, and that's because this course is sort of targeted at people who are self-taught, you know.

00:40:53.580 --> 00:40:57.480
And so maybe they learned programming from Python.

00:40:57.480 --> 00:40:58.700
They've taken a beginner course.

00:40:58.700 --> 00:41:00.120
This is an intermediate course.

00:41:00.120 --> 00:41:04.000
So they've taken a beginner course, and they're looking to get into professional software development.

00:41:04.660 --> 00:41:14.520
And at that point, you know, the Python that they learned as a beginner, we need to expand that definition, flesh out that definition to work in the professional setting.

00:41:15.180 --> 00:41:24.180
And, of course, there are also people who are coming to this from an enterprise software perspective, and they are learning more Python from this, and they can use – I mean, I deal with a lot of those – I mean, not deal with.

00:41:24.180 --> 00:41:32.620
I interact with a lot of those people at PayPal who – I mean, you know, they are expanding their skill set.

00:41:32.620 --> 00:41:36.500
They know a lot of Java, C++, JavaScript, and they want to learn Python.

00:41:36.860 --> 00:41:39.440
And so, you know, I give them my definition of Python.

00:41:39.440 --> 00:41:44.480
And so there are three levels at which, you know, we say Python.

00:41:44.480 --> 00:41:46.800
So number one is the language.

00:41:46.800 --> 00:41:48.740
You know, it's the language of choice.

00:41:48.740 --> 00:41:49.620
It's so clear.

00:41:49.620 --> 00:41:53.720
You know, some people don't like the white space stuff, but that's part of the language.

00:41:53.720 --> 00:42:03.540
For many years, that language that we all love, it was directly implemented by more or less just one runtime.

00:42:03.920 --> 00:42:08.660
You know, like CPython, the reference implementation, was synonymous with Python.

00:42:08.660 --> 00:42:10.900
I don't run CPython at my command line.

00:42:10.900 --> 00:42:11.620
I run Python.

00:42:11.620 --> 00:42:16.900
And so many of the benefits of Python are actually benefits of CPython.

00:42:16.900 --> 00:42:30.580
When I talk about the consistency and, you know, rich runtime, those things are – many of those are runtime-specific from CPython, implementation from CPython that may be copied in other runtimes.

00:42:30.700 --> 00:42:36.440
So other runtimes might include, like, Jython, IronPython, PyPy, you know, P-Y-P-Y, and PyPy.

00:42:36.440 --> 00:42:40.200
And, you know, now there are some other ones, too, Pidgin and stuff.

00:42:40.200 --> 00:42:43.360
And then, finally, there's the platform.

00:42:43.940 --> 00:42:51.960
So executives and managers, when you talk about Python with them, they're not really, you know, that interested in what the language looks like.

00:42:51.960 --> 00:42:55.240
Some of them might be, but that's, you know, kind of micromanager-y.

00:42:55.240 --> 00:43:00.980
Anyways, they're more curious about how is Python going to help the organization.

00:43:01.500 --> 00:43:05.220
And so that means Python as a platform, as a community.

00:43:05.220 --> 00:43:07.460
And there are many benefits to Python there.

00:43:07.460 --> 00:43:13.680
You know, you have a lot more education adoption, so you have a lot more sort of pre-training when you're doing your hiring.

00:43:13.680 --> 00:43:16.660
Like, basically, people are coming in already knowing the language.

00:43:16.660 --> 00:43:23.460
And then you have a big open-source ecosystem, you know, 70,000-plus packages on PyPy.

00:43:24.140 --> 00:43:26.760
So there's language, runtime, and platform.

00:43:26.760 --> 00:43:36.480
And when you're having a meeting, it will be most effective if you can be explicit, if you can be clear about which part you're referencing, you know.

00:43:36.480 --> 00:43:39.400
So those three levels of Python.

00:43:39.400 --> 00:43:51.820
Yeah, I think even for experienced developers, a lot of times, if you're talking, like, let's say you're talking to a Java person and maybe a Node.js person and a Python person,

00:43:51.820 --> 00:43:55.720
and they're saying, you know, Python is really good in this way, right?

00:43:55.720 --> 00:43:59.320
You've got – but there's a lot of comparisons that will be made.

00:43:59.320 --> 00:44:01.000
And you have to say, are we comparing the language?

00:44:01.000 --> 00:44:03.660
Are we comparing the implementation with the standard library?

00:44:03.660 --> 00:44:06.380
Are we comparing the entire ecosystem, including PyPI?

00:44:06.380 --> 00:44:11.760
Like, before you say this is this feature or it doesn't or whatever, right, like, we need to know what we're talking about.

00:44:11.760 --> 00:44:13.360
So that was really interesting, I thought.

00:44:13.360 --> 00:44:16.720
Yeah, with Java, I mean, you know, Java is a language.

00:44:16.720 --> 00:44:17.600
Python is a language.

00:44:17.600 --> 00:44:18.920
CPython is a runtime.

00:44:19.380 --> 00:44:21.620
You know, you might be using an IBM JVM.

00:44:21.620 --> 00:44:22.840
That's your runtime.

00:44:22.840 --> 00:44:26.940
And people say – people do compare.

00:44:26.940 --> 00:44:28.380
This is sort of why I brought it up.

00:44:28.380 --> 00:44:29.760
They compare Python to Node.js.

00:44:29.760 --> 00:44:32.200
I'm like, okay, you know, Python is a language.

00:44:32.200 --> 00:44:34.600
JavaScript is a language of Node.js.

00:44:34.600 --> 00:44:35.740
Node.js is the runtime.

00:44:35.740 --> 00:44:37.520
CPython is the runtime.

00:44:37.520 --> 00:44:40.280
Let's, like, you know, compare these things side by side.

00:44:40.280 --> 00:44:41.780
So people say Python is slow.

00:44:41.780 --> 00:44:43.940
I'm like, okay, man, a language can't be slow.

00:44:43.940 --> 00:44:46.480
CPython is not jitted.

00:44:46.900 --> 00:44:47.840
You can use PyPy.

00:44:47.840 --> 00:44:49.540
You can get certain performance benefits.

00:44:49.540 --> 00:44:53.340
You know, Node.js doesn't support threads.

00:44:53.340 --> 00:44:57.280
That's, you know, another aspect of the runtime.

00:44:57.280 --> 00:45:03.000
I think that you could probably make a thread-safe ECMAScript, like implementation or something like that.

00:45:03.000 --> 00:45:05.320
But I haven't really looked too deeply into it, honestly.

00:45:05.320 --> 00:45:06.560
I'm sure it's possible.

00:45:06.560 --> 00:45:08.240
But also not done, right?

00:45:08.240 --> 00:45:11.900
So one of the things I thought was – yeah, maybe it's been done.

00:45:11.900 --> 00:45:16.000
One thing that's interesting is sort of the soft skills story here.

00:45:16.000 --> 00:45:22.820
Like, when you go and talk to executives or managers, it's not just – you don't want to get too technical, right?

00:45:22.820 --> 00:45:24.380
You want to say, like, we're talking about the ecosystem.

00:45:24.380 --> 00:45:27.180
We're talking about – take it as a whole, right?

00:45:27.180 --> 00:45:30.140
And the truth is that businesses are run by people.

00:45:30.860 --> 00:45:35.360
And your sort of skills to work with these people and convince them and speak their language really matter still.

00:45:35.360 --> 00:45:36.400
Yeah.

00:45:36.400 --> 00:45:44.160
So what I usually tell them – and so this is all just expanding that 10 myths thing, just blowing it wide open and approaching it from a more positive aspect.

00:45:44.160 --> 00:45:46.180
It's not just rejecting myths, right?

00:45:46.660 --> 00:45:49.580
It's saying, okay, well, what do you talk about instead?

00:45:49.580 --> 00:45:53.240
And, you know, Python created in 1991.

00:45:53.240 --> 00:46:05.060
It's like it had a nice, long, slow bake all the way until it sort of hockey-sticked for a lot of web things between 2003 and 2006 or so.

00:46:05.700 --> 00:46:14.280
And so as a result, you have this, like, really, like, you know, well-tested, well-understood core reference implementation.

00:46:14.280 --> 00:46:16.480
And you have a huge open source library.

00:46:16.480 --> 00:46:18.440
It's used in education a lot.

00:46:18.440 --> 00:46:23.220
And one that I like the most is – I have to tell people, it's organizationally neutral.

00:46:23.220 --> 00:46:25.700
So a lot of people still haven't heard of Python.

00:46:25.700 --> 00:46:26.720
You would be surprised.

00:46:26.720 --> 00:46:29.840
People paid far more than I am.

00:46:29.840 --> 00:46:31.340
I mean, they haven't heard of it even.

00:46:32.180 --> 00:46:44.640
And one of the reasons for this is that Python is organizationally neutral, where IBM and Sun and Oracle – or, you know, Sun used to, but IBM and Oracle, like, you know, sell and sold Java.

00:46:44.640 --> 00:46:48.680
You know, there's no company that is selling Python.

00:46:48.680 --> 00:46:51.600
You know, there's no joyance of Python.

00:46:51.600 --> 00:46:53.260
I mean, there's Continuum Analytics.

00:46:53.260 --> 00:46:53.920
I mean, they're great.

00:46:53.920 --> 00:46:55.100
You know, there's InThought.

00:46:55.100 --> 00:46:57.400
But these are, like, you know, pretty small companies.

00:46:57.400 --> 00:47:04.500
Your company wouldn't have, like, an enterprise license agreement with Python as a thing, right?

00:47:04.500 --> 00:47:07.580
There are probably some groups that do it.

00:47:07.580 --> 00:47:09.180
But no, it's not like that.

00:47:09.180 --> 00:47:10.360
It's not a sold thing.

00:47:10.360 --> 00:47:14.580
Instead, engineers choose it, and they use it, and they succeed, you know?

00:47:14.580 --> 00:47:18.020
And you can get support contracts for it, but that's not really the Python way.

00:47:18.020 --> 00:47:25.180
The other thing that you kind of touched on in that whole section is the idea of a foundational technology.

00:47:26.040 --> 00:47:31.660
This is – managers especially, but basically everyone has this to a certain degree.

00:47:31.660 --> 00:47:34.840
Like, people get really anxious about doing things the right way.

00:47:34.840 --> 00:47:40.180
Basically, everywhere you look in technology, people are telling you that things are changing, okay?

00:47:40.180 --> 00:47:41.360
This changes it all.

00:47:41.360 --> 00:47:43.500
This is new, and it's going to change it all.

00:47:43.500 --> 00:47:47.600
And, you know, I think we all know this, but we don't really get to think about it.

00:47:47.600 --> 00:47:50.360
It's like a year later, you just don't hear about it ever again.

00:47:50.840 --> 00:47:56.900
We've been fed this line about software being ephemeral and, you know, tools not mattering, only delivery.

00:47:56.900 --> 00:47:57.620
You know?

00:47:57.620 --> 00:48:00.660
This whole ephemeral technology thing, I don't buy it.

00:48:00.660 --> 00:48:02.700
Foundational technologies are real.

00:48:03.340 --> 00:48:07.620
So, specifically, like, Linux, BSD, and in general, the POSIX standard.

00:48:07.620 --> 00:48:14.420
There are people who, if they woke up one day and read the news and said, hey, Linux is over.

00:48:14.420 --> 00:48:16.100
You know, Linux is gone.

00:48:16.100 --> 00:48:19.000
They'd be like, well, yeah, what did you expect?

00:48:19.000 --> 00:48:21.000
I mean, you know, open source.

00:48:21.000 --> 00:48:22.520
And it's just things are crazy.

00:48:22.520 --> 00:48:26.420
You know, it's like they could actually buy that sort of reality.

00:48:26.920 --> 00:48:28.500
But these things are permanent.

00:48:28.500 --> 00:48:30.340
There's, like, long traditions.

00:48:30.340 --> 00:48:31.280
There are long histories.

00:48:31.280 --> 00:48:33.620
We don't usually get time to read into them.

00:48:33.620 --> 00:48:37.220
But these foundational technologies are real.

00:48:37.220 --> 00:48:38.900
Another would be the C programming language.

00:48:38.900 --> 00:48:46.860
And CPython is a really, I mean, Python and CPython are really natural extensions, you know, relying on the C programming language.

00:48:46.860 --> 00:48:54.980
So, I feel confident, you know, grouping Python with these foundational technologies, largely because C is so foundational.

00:48:54.980 --> 00:48:57.220
You know, C is not going away.

00:48:57.220 --> 00:48:59.160
You know, you can take it even further.

00:48:59.160 --> 00:49:02.720
There are people I know, I mean, highly paid people here at my work.

00:49:02.720 --> 00:49:04.400
They'll come up to me.

00:49:04.400 --> 00:49:06.660
They're like, oh, man, but you're like the Python guy.

00:49:06.660 --> 00:49:09.780
You know, you like new programming languages and stuff.

00:49:09.780 --> 00:49:10.720
You know what I think?

00:49:10.720 --> 00:49:16.360
I've heard that this visual programming thing, this is going to be the next big thing.

00:49:16.360 --> 00:49:22.300
And it's like they see one demo and they think that, you know, procedural programming is going to go away.

00:49:22.300 --> 00:49:31.100
That, like, top to bottom execution of code is in the future at some point not going to be something viable within their lifetime, within their work span.

00:49:31.100 --> 00:49:34.340
And it's just such a wasteful conversation to have.

00:49:34.340 --> 00:49:38.520
I talk about it a little bit in the course, that sort of navel-gazing sort of thing.

00:49:38.520 --> 00:49:40.340
Which language is the best language?

00:49:40.340 --> 00:49:42.140
Instead, I try to refocus them.

00:49:42.140 --> 00:49:44.760
You know, I tell them maintenance is real.

00:49:45.180 --> 00:49:46.640
And, like, longevity is possible.

00:49:46.640 --> 00:49:48.480
And the tools and methods matter.

00:49:48.480 --> 00:49:50.900
You have to use stuff that has been baked.

00:49:50.900 --> 00:50:00.380
So the underlying spirit of the course is that if you choose your architecture, dependencies, and practices wisely, you know, you can rest easy thanks to these foundational technologies.

00:50:00.620 --> 00:50:10.260
Yeah, and I think you're more likely to experience or run into the deep history of them at enterprises, right?

00:50:10.260 --> 00:50:15.480
Like, at a startup, all the code is, what, a year old or whatever, besides maybe the package you grab.

00:50:15.760 --> 00:50:20.400
But if you go to a company that's been using a technology for a long time, you could go to source control.

00:50:21.220 --> 00:50:24.980
And the last check-in or the first check-in you would see might be, like, 1995.

00:50:24.980 --> 00:50:29.220
And that's because you switched version controls and couldn't carry the history over or something like that, right?

00:50:29.220 --> 00:50:29.380
Right.

00:50:29.380 --> 00:50:31.180
No, you hit it right on the head, man.

00:50:31.180 --> 00:50:36.860
I mean, like, I was blown away when, I think it was 2012, beginning of 2013.

00:50:37.280 --> 00:50:39.520
I was actually, like, curious.

00:50:39.520 --> 00:50:41.660
This is when I first started getting into the security stuff.

00:50:41.660 --> 00:50:43.020
I was curious how something was implemented.

00:50:43.020 --> 00:50:46.440
We needed to re-implement it in Python to enable running on 64-bit.

00:50:46.440 --> 00:50:53.880
You know, PayPal primarily runs on 32-bit stuff because they have old SOs that are just linked in.

00:50:53.880 --> 00:50:55.160
They're checked into the repo and stuff.

00:50:55.160 --> 00:51:00.100
So, I mean, 64-bit was not a thing when PayPal was written.

00:51:00.760 --> 00:51:10.680
And so, you know, 80% of our, I should say, too, like, 80% of our revenue or something like that is still going through the, quote, unquote, legacy stack, right?

00:51:10.680 --> 00:51:21.120
But, you know, when you're actually, like, there re-implementing and reverse engineering Max Levchin's code, you're like, wow, software really is actually a lot more permanent than I was taught.

00:51:21.120 --> 00:51:25.040
So, you know, by the Internet or whatever.

00:51:25.040 --> 00:51:25.840
Yeah, yeah, yeah.

00:51:25.840 --> 00:51:28.620
By the person with the latest framework that's super excited about it.

00:51:28.620 --> 00:51:29.660
Exactly.

00:51:29.920 --> 00:51:39.580
And so you have to learn to distinguish between a press release and, you know, actual, like, neutral academic whatever, you know?

00:51:39.580 --> 00:51:46.180
There's press releases and then there's real experience, real education.

00:51:46.180 --> 00:51:46.800
Yeah.

00:51:46.800 --> 00:51:54.920
So one of the things you talked about was sort of Greenfield versus Brownfield or, like, brand new software versus legacy software, if you will.

00:51:54.920 --> 00:51:56.080
Yeah.

00:51:56.080 --> 00:52:07.560
I think you sort of convinced me that there's more value in these Brownfield apps and people that work on them and can evolve them and really add features and understand them.

00:52:07.560 --> 00:52:10.360
I deserve maybe more respect than the industry gives them.

00:52:10.980 --> 00:52:13.180
Yeah, that is definitely the case.

00:52:13.180 --> 00:52:15.340
It's just a culture thing within technology.

00:52:15.340 --> 00:52:17.100
The new is always emphasized.

00:52:17.100 --> 00:52:21.500
But the old stuff is what we're using right now.

00:52:21.500 --> 00:52:22.760
That's what's working right now.

00:52:22.760 --> 00:52:24.980
That's what's causing money to move.

00:52:25.500 --> 00:52:32.460
And disrespecting it and, you know, being productivist about it doesn't actually get us any further in technology progress.

00:52:32.460 --> 00:52:38.320
You know, we have a lot of people who come in and they try to, you know, plow the whole field under.

00:52:38.320 --> 00:52:44.180
And, you know, their tractor, their plow, whatever, just, like, you know, hits one rock.

00:52:44.740 --> 00:52:50.520
And then they declare victory with the small patch that they turned, you know, green.

00:52:50.520 --> 00:52:52.660
And they, you know, move on.

00:52:52.660 --> 00:52:58.540
But, you know, and then you end up with this patchwork environment, you know, where it's like, well, that was green.

00:52:58.540 --> 00:53:01.260
That was greened by so-and-so that long ago.

00:53:01.260 --> 00:53:03.320
And, you know, that part over there they never reached.

00:53:03.440 --> 00:53:07.020
And so you just end up with this very untended wilderness.

00:53:07.020 --> 00:53:09.780
It's interesting.

00:53:09.780 --> 00:53:10.760
It's a really fun environment.

00:53:10.760 --> 00:53:20.280
You know, this is why, you know, you can see I get carried away just daydreaming about, like, the complexity inherent in a system as complex as PayPal's.

00:53:20.280 --> 00:53:22.740
So we don't have a lot of time left in the show.

00:53:22.740 --> 00:53:23.720
We're sort of getting to the end.

00:53:23.720 --> 00:53:32.020
But I wanted to maybe talk about some of the stuff farther down, like some of the best practices that you're talking about.

00:53:32.100 --> 00:53:33.340
One of my thoughts was interesting.

00:53:33.340 --> 00:53:38.640
It was sort of a pull request, designer view type of experience.

00:53:38.640 --> 00:53:39.900
Right, right.

00:53:39.900 --> 00:53:45.120
So the way that the course is structured, you know, is I got an intro and then I defined the basics.

00:53:45.120 --> 00:53:46.100
I just do some definitions.

00:53:46.100 --> 00:53:49.940
And then I have this dry segment in the middle about architecture and design.

00:53:49.940 --> 00:54:00.420
And so those first three parts are, like, I mean, especially the architecture and design part, those are just, like, processes and soft skills that, you know, you can use in the enterprise world.

00:54:00.740 --> 00:54:05.960
Then we get to, like, the real meat, which is this, like, 12 segment best practices.

00:54:06.600 --> 00:54:24.720
And this is sort of, like, you know, adjustments to, you know, your knowledge and pointers to how to do things that should be generic for most organizations, most legacy environments, and how you can put Python in them and create new software.

00:54:25.580 --> 00:54:34.500
So once you get past, like, you know, just, you know, editors, dev tools, issue tracking, you know, how to start a Python project and some design patterns.

00:54:34.500 --> 00:54:37.060
You know, people always ask me about design patterns.

00:54:37.060 --> 00:54:38.940
They're coming from, like, a Java and C++ background.

00:54:39.340 --> 00:54:40.880
And so I threw a segment in there.

00:54:40.880 --> 00:54:45.640
It's, like, well, design patterns in Python tend to be, like, so small you barely even see them.

00:54:45.640 --> 00:54:50.240
So I said, here's how to, like, actually look and see Python design patterns.

00:54:50.240 --> 00:54:54.760
But, you know, eventually, like, so the first half of best practices is building new code.

00:54:54.760 --> 00:54:58.400
And the second half is maintaining that code and building quality.

00:54:58.640 --> 00:55:01.740
And I think that the first one of those is code review.

00:55:01.740 --> 00:55:10.100
And this is one of my favorite segments because, you know, I get to do a little bit of, like, black hat, white hat sort of role playing with myself one weekend.

00:55:10.100 --> 00:55:21.300
And so one day I just wrote some really bad code that I tried to build in every anti-pattern that a, you know, budding developer will accidentally stumble upon.

00:55:21.300 --> 00:55:23.140
And I put it up on GitHub.

00:55:23.140 --> 00:55:25.020
And I just, like, had to sleep on it.

00:55:25.020 --> 00:55:25.860
I just, like, went to sleep.

00:55:26.160 --> 00:55:29.700
And the next day I came back and I just, like, tore into myself.

00:55:29.700 --> 00:55:34.920
I just, I mean, well, that's not true, actually.

00:55:34.920 --> 00:55:41.040
Like, I did a precise code review stating why there were problems, where there were problems.

00:55:41.040 --> 00:55:47.020
And I did my best to be nice about it to promote the actual, like, you know, positive interactions you try to have.

00:55:47.020 --> 00:55:54.700
And so all of that is available on the GitHub repo for the class where I sort of have this example project,

00:55:54.880 --> 00:55:59.640
which is useful for about a quarter of the class, just as sort of a reference.

00:56:00.300 --> 00:56:07.960
And so that's github.com forward slash Mahmood forward slash SP metrics, ESPY metrics.

00:56:07.960 --> 00:56:08.720
Yeah.

00:56:08.720 --> 00:56:11.060
And I'll link to the link to the show notes as well.

00:56:11.060 --> 00:56:11.700
Great.

00:56:11.700 --> 00:56:11.960
Great.

00:56:11.960 --> 00:56:17.100
And so there's just a pull request in there that I will never merge because it does everything the wrong way.

00:56:17.100 --> 00:56:22.420
And so I have a bad implementation, all the comments on it, and then a good implementation.

00:56:22.940 --> 00:56:26.140
And you can, you know, sort of do an apples to apples comparison there.

00:56:26.140 --> 00:56:29.780
And, you know, it was interesting.

00:56:29.780 --> 00:56:31.220
Yeah.

00:56:31.220 --> 00:56:38.340
I think that's something that a lot of enterprise developers who maybe haven't spent a lot of time in open source don't get to really experience a lot.

00:56:38.340 --> 00:56:41.940
The sort of GitHub pull request style of work, right?

00:56:42.420 --> 00:56:42.940
That is true.

00:56:42.940 --> 00:56:47.360
When I started at PayPal, we were using, I think, something you've probably heard of.

00:56:47.360 --> 00:56:48.500
We were using ClearCase.

00:56:48.500 --> 00:56:55.420
ClearCase was maybe worse than I could ever imagine for a version control system.

00:56:56.700 --> 00:57:00.180
You know, it was like every file, like it was a file by file thing.

00:57:00.180 --> 00:57:01.640
You could get these evil twins.

00:57:01.640 --> 00:57:04.920
And I just, you know, I know that some people still have to use it.

00:57:04.920 --> 00:57:06.840
I run into them here in like the valley.

00:57:06.840 --> 00:57:08.460
And, you know, it's kind of a shame.

00:57:08.460 --> 00:57:13.580
But, yeah, so we did actually not too long ago get GitHub Enterprise.

00:57:13.580 --> 00:57:18.460
And I think that it's a much, much healthier way to develop.

00:57:18.460 --> 00:57:22.780
You know, you have a decent branching strategy to keep things like sane.

00:57:23.300 --> 00:57:26.420
And then you, this like very useful UI.

00:57:26.420 --> 00:57:29.600
And I'm sure that like Bitbucket has similar stuff.

00:57:29.600 --> 00:57:34.780
Yeah, the code reviews is actually exactly what, this is exactly the sort of thing that we do at PayPal as well.

00:57:34.780 --> 00:57:40.260
And that's one of the reasons I did it because we have an internal DL as part of the community.

00:57:40.260 --> 00:57:45.180
We have an internal listserv where people can request code reviews from other teams.

00:57:45.180 --> 00:57:49.260
You know, and so that's one of the services we provide as the Python infrastructure team at work

00:57:49.260 --> 00:57:51.640
is that we'll code review any Python code you give us.

00:57:52.060 --> 00:57:56.480
And I just did my best to export that in an organizationally neutral way.

00:57:56.480 --> 00:58:00.640
Yeah, so you've had a chance to look at both good and bad examples.

00:58:00.640 --> 00:58:03.480
And you brought them to the class, yeah?

00:58:03.480 --> 00:58:04.760
Well, and yeah.

00:58:04.760 --> 00:58:11.460
And so that is like actually one thing you just reminded me, right, is that a big part of the class is evaluating dependencies.

00:58:11.460 --> 00:58:13.960
I think that that's a great way to learn Python.

00:58:13.960 --> 00:58:15.760
That's a massive way that I learned Python.

00:58:15.760 --> 00:58:16.920
Reading Django code.

00:58:16.920 --> 00:58:18.320
Reading bottle PY code.

00:58:18.500 --> 00:58:23.140
You know, when I was doing all this web development, actually digging a little bit deeper, you know,

00:58:23.140 --> 00:58:30.120
Python ships with its source code and you can see your actual code, like what your dependencies are doing, what you're relying on.

00:58:30.200 --> 00:58:35.080
And so, you know, don't constantly live in the sausage factory looking at how things are made.

00:58:35.080 --> 00:58:41.500
But take your time to evaluate dependencies because it will help you avoid some really horrible architectural nightmares.

00:58:41.500 --> 00:58:45.140
At PayPal, I mean, I think we all know about the left pad thing at this point.

00:58:45.140 --> 00:58:48.760
So anyways, at PayPal, we have a typical Python team.

00:58:48.760 --> 00:58:52.540
It's small and we always have like 10 things to do.

00:58:53.080 --> 00:58:59.020
So we have to make choices that favor stability and to make sure that when we finish something, it stays off of our plate.

00:58:59.020 --> 00:59:03.260
As such, like we're really big advocates of vendoring in libraries.

00:59:03.260 --> 00:59:08.980
So that means that we copy dependency into the project.

00:59:08.980 --> 00:59:14.920
This isn't something you'll see a lot in open source projects because there's the Python packaging index, PyPI.

00:59:15.580 --> 00:59:21.180
But we view like copying in this library at a certain version as sort of the Python equivalent of static linking.

00:59:21.180 --> 00:59:23.760
Yeah, we do that too with our C libraries.

00:59:23.760 --> 00:59:26.580
But we build projects with the dependencies built in.

00:59:26.580 --> 00:59:29.560
And this way, teams can just clone the repository and go.

00:59:29.560 --> 00:59:36.100
And then when you package an RPM or DEB or whatever, there's no install time dependencies.

00:59:36.100 --> 00:59:37.700
And so there are minimal side effects.

00:59:37.700 --> 00:59:41.080
Basically, repeatable deploys are critically important in any environment.

00:59:41.080 --> 00:59:50.800
And whether you achieve them via RPMs, DEBs, containers, whatever, as long as you have those repeatable deploys, you're going to be in a lot better spot.

00:59:50.800 --> 00:59:51.660
Yeah, definitely.

00:59:51.660 --> 00:59:55.160
Repeatable and automated are the key element, right?

00:59:55.160 --> 00:59:57.260
Yeah, I talk about CI in here.

00:59:57.260 --> 01:00:01.000
We definitely use Jenkins and so forth.

01:00:01.000 --> 01:00:05.720
I don't know if I'd recommend Jenkins specifically, but another team is running the Jenkins.

01:00:05.720 --> 01:00:06.520
That's the thing.

01:00:06.520 --> 01:00:09.640
We have a group that manages Jenkins for us.

01:00:09.640 --> 01:00:13.820
And so if that's one more thing we don't need to do, that's one more thing of our own that we can do.

01:00:13.820 --> 01:00:14.720
Yeah, that's awesome.

01:00:14.720 --> 01:00:15.960
All right.

01:00:15.960 --> 01:00:18.500
So I think for the course, we'll just have to leave it there.

01:00:18.500 --> 01:00:19.460
We're out of time.

01:00:19.460 --> 01:00:20.480
Let me ask you.

01:00:20.480 --> 01:00:20.880
Oh, wow.

01:00:20.880 --> 01:00:21.480
Yeah.

01:00:21.480 --> 01:00:23.760
Let me ask the questions I ask everyone.

01:00:23.760 --> 01:00:28.880
So first of all, I know I asked you this way back, like a year ago, but maybe it's changed.

01:00:28.880 --> 01:00:29.560
Favorite editor?

01:00:29.560 --> 01:00:31.520
No, I mean, it hasn't changed.

01:00:31.520 --> 01:00:32.520
Emacs.

01:00:32.520 --> 01:00:35.600
I still use Emacs primarily in the console.

01:00:36.020 --> 01:00:43.480
Yeah, because this is interesting because now there's going to be like Ubuntu on Windows, sort of a GNU NT thing.

01:00:43.480 --> 01:00:52.620
So I've actually considered getting a Windows laptop and running Emacs natively in it because we have so many Windows users here at PayPal to help support them.

01:00:53.040 --> 01:00:56.660
Yeah, you'll be able to live the life they have to live and sort of experience it.

01:00:56.660 --> 01:00:56.940
Yeah.

01:00:56.940 --> 01:01:01.700
That was just announced last this week or no, last week at Build.

01:01:01.700 --> 01:01:02.940
So yeah.

01:01:02.940 --> 01:01:03.280
Yeah, yeah.

01:01:03.280 --> 01:01:05.900
Basically, Ubuntu running natively on Windows.

01:01:05.900 --> 01:01:07.780
It's weird to be excited about Windows feature.

01:01:07.780 --> 01:01:09.520
For me, it's weird to be excited about Windows feature.

01:01:09.520 --> 01:01:13.300
I could only get more excited if they told me that they're going to build in Python.

01:01:13.300 --> 01:01:13.920
Maybe they will.

01:01:13.920 --> 01:01:14.820
That would be intense.

01:01:14.820 --> 01:01:22.520
You know, when Windows 10 was under development, I was using the community preview or whatever they called it.

01:01:22.520 --> 01:01:26.980
And they had a user voice set up for you could recommend features and get votes.

01:01:26.980 --> 01:01:35.260
And I recommended that they install Python and ship Python 3 and Python 2 as built in to Windows.

01:01:35.260 --> 01:01:40.120
And I got, I think, over a thousand votes from the community to say, yes, Microsoft, build this.

01:01:40.120 --> 01:01:41.480
Absolutely.

01:01:41.720 --> 01:01:43.340
And sadly, it went nowhere.

01:01:43.340 --> 01:01:44.660
Nowhere.

01:01:44.660 --> 01:01:46.820
I mean, maybe somebody heard it.

01:01:46.820 --> 01:01:48.200
You know, that's one thing with the enterprise.

01:01:48.200 --> 01:01:51.740
Like, you know, there are so many, like, moving parts inside of it.

01:01:51.740 --> 01:01:56.900
You know, you can, just because you don't see anything happen on the surface doesn't mean that people aren't hearing it inside.

01:01:56.900 --> 01:01:57.460
Yeah.

01:01:57.460 --> 01:01:58.220
It doesn't mean it'll go anywhere.

01:01:58.220 --> 01:02:00.040
I'm not, I can't make promises for Microsoft.

01:02:00.040 --> 01:02:00.840
Right.

01:02:00.960 --> 01:02:04.900
Yeah, just the show I just recorded before this one was Steve Dower.

01:02:04.900 --> 01:02:12.300
And he works at Microsoft on doing a lot of really interesting stuff with Python and Visual Studio and Windows.

01:02:12.300 --> 01:02:16.200
And so there's, there's, there's a chance someone will pick it up.

01:02:16.200 --> 01:02:16.500
We'll see.

01:02:16.500 --> 01:02:17.800
We'll keep putting the idea out there.

01:02:17.800 --> 01:02:19.100
I'm hopeful.

01:02:19.100 --> 01:02:20.240
Yeah, absolutely.

01:02:21.620 --> 01:02:22.220
All right.

01:02:22.220 --> 01:02:24.620
And favorite PyPI package?

01:02:24.620 --> 01:02:26.260
What do you, what do you find recently?

01:02:26.260 --> 01:02:26.780
That's awesome.

01:02:26.780 --> 01:02:29.480
This was all, like, this was really, really tough.

01:02:29.480 --> 01:02:33.120
I mean, I don't think I said this last time.

01:02:33.120 --> 01:02:38.020
I mean, G event and Greenlit, we use it so much at work that, like, I just have to give it a shout out.

01:02:38.020 --> 01:02:39.800
G event and Greenlit.

01:02:39.800 --> 01:02:43.440
But, you know, we have Twisted users here.

01:02:43.440 --> 01:02:46.040
Twisted is a very respectable code base as well.

01:02:46.040 --> 01:02:48.000
And, you know, I'll give a little shout out.

01:02:48.000 --> 01:02:53.720
I'm working on a, a stats post that, like, you know, statistics for engineers and whatnot.

01:02:53.720 --> 01:03:01.440
And a lot of that is motivated by a new project I'm working on called Lithoxal, which is sort of next generation logging and instrumentation.

01:03:01.440 --> 01:03:06.580
You know, it's not public yet, but I know that some people on the podcast are probably early adopters.

01:03:06.580 --> 01:03:08.380
And, you know, it's good to get some feedback.

01:03:08.380 --> 01:03:12.440
So, L-I-T-H-O-X-Y-L.

01:03:12.440 --> 01:03:13.120
Awesome.

01:03:13.120 --> 01:03:14.540
Weird name, good library.

01:03:14.540 --> 01:03:15.480
That's awesome.

01:03:16.540 --> 01:03:19.260
We're going to give away a copy of your class, right?

01:03:19.260 --> 01:03:19.820
Absolutely.

01:03:19.820 --> 01:03:20.340
Yeah.

01:03:20.340 --> 01:03:20.800
All right.

01:03:20.800 --> 01:03:24.900
So, if you're listening and you want to check out the course, it is on O'Reilly.

01:03:24.900 --> 01:03:29.380
All you have to do to be eligible to win is be a friend of the show.

01:03:29.380 --> 01:03:31.100
So, visit talkbythumb.fm.

01:03:31.100 --> 01:03:41.080
Go to the nav bar, click friends of the show in your email address, and then we will randomly choose somebody later in the week and give you a free copy of the course.

01:03:41.080 --> 01:03:42.860
If not, how do they find it?

01:03:42.860 --> 01:03:44.740
Like, if people want to check out the course, where do they go?

01:03:44.940 --> 01:03:46.560
So, there are several places to find it.

01:03:46.560 --> 01:03:51.540
So, one major reason I went with O'Reilly is because so many large organizations have Safari.

01:03:51.540 --> 01:03:57.180
And so, I waited until the course propagated to all of the Safari-like installations.

01:03:57.180 --> 01:04:05.560
So, if you have TechBus or, let's see, I mean, you can just go to Safari Books Online and type in Enterprise Software with Python.

01:04:05.920 --> 01:04:11.440
Otherwise, you can go to straight up O'Reilly.com, and it's called Enterprise Software with Python.

01:04:11.440 --> 01:04:12.560
And so, you can just search it.

01:04:12.560 --> 01:04:13.800
I think it may even be Google-able.

01:04:13.800 --> 01:04:17.040
The one thing is it has a price, right?

01:04:17.040 --> 01:04:20.820
If you're someone who can't afford it, just get in touch, right?

01:04:21.320 --> 01:04:23.640
This is something that I'm passionate about.

01:04:23.640 --> 01:04:29.940
And, you know, I want to make sure that everyone has a chance to get into the professional Python software development world.

01:04:29.940 --> 01:04:30.840
Yeah.

01:04:30.840 --> 01:04:32.140
It's a really great course.

01:04:32.140 --> 01:04:34.500
I totally enjoyed going through it.

01:04:34.500 --> 01:04:36.820
So, nice work.

01:04:36.820 --> 01:04:37.520
You have a course as well.

01:04:37.520 --> 01:04:37.960
I do.

01:04:37.960 --> 01:04:42.820
I just released one a month ago, Python Jumpstart by Building 10 Apps.

01:04:42.820 --> 01:04:44.280
And that's been really well received.

01:04:44.280 --> 01:04:45.680
That was cool to do it on Kickstarter.

01:04:45.680 --> 01:04:53.300
And I just announced this week, I think, yes, Monday, that I'm working on a new one called Python for Entrepreneurs.

01:04:53.300 --> 01:04:59.760
And basically, you know, if you've ever built a business, it's only like 30% product.

01:04:59.760 --> 01:05:01.280
It's only 30% technology.

01:05:01.280 --> 01:05:02.520
And there's all this other stuff.

01:05:02.520 --> 01:05:03.780
Like, how do I accept credit cards?

01:05:03.780 --> 01:05:05.640
You know, speaking of PayPal and that sort of thing.

01:05:06.400 --> 01:05:09.440
How do I gather emails and send newsletters?

01:05:09.440 --> 01:05:11.800
And just all, how do I do deployments?

01:05:11.800 --> 01:05:12.800
How do I do SSL?

01:05:12.800 --> 01:05:13.980
All that kind of stuff.

01:05:13.980 --> 01:05:14.220
Oh, yeah.

01:05:14.220 --> 01:05:14.940
It can be intimidating.

01:05:14.940 --> 01:05:15.480
Yeah.

01:05:15.480 --> 01:05:21.120
When you think you've finished your app and whatnot, you know, you're like, okay, well, I'm almost ready to release it.

01:05:21.120 --> 01:05:22.600
No, you're like 30% of what you're done.

01:05:22.600 --> 01:05:25.420
So, I wanted to create a class that would help people close that gap.

01:05:25.420 --> 01:05:25.980
Great.

01:05:25.980 --> 01:05:26.720
Yeah.

01:05:26.720 --> 01:05:29.640
No, I've already, I think, bought a copy.

01:05:29.640 --> 01:05:34.660
And, you know, we're going to actually have a little powwow with the Python community here at PayPal.

01:05:34.660 --> 01:05:35.440
Oh, awesome.

01:05:35.440 --> 01:05:36.200
Well, thank you so much.

01:05:36.200 --> 01:05:36.800
That's great.

01:05:36.800 --> 01:05:38.300
Yeah, it's good stuff.

01:05:38.300 --> 01:05:38.800
Cool.

01:05:38.800 --> 01:05:41.280
Well, Mahmoud, this is fun as always.

01:05:41.280 --> 01:05:44.800
Your original 10 Myths post was super inspirational.

01:05:44.800 --> 01:05:47.740
I think to a lot of people, it certainly was to me.

01:05:47.740 --> 01:05:50.000
And I was really glad to feature as one of the early shows.

01:05:50.000 --> 01:05:53.080
And this is kind of like the rounding out of that story.

01:05:53.080 --> 01:05:55.380
So, everyone go check out his course.

01:05:55.380 --> 01:05:55.760
It's great.

01:05:55.760 --> 01:05:56.240
Yeah.

01:05:56.660 --> 01:05:58.760
Thanks, everyone, for all the support, frankly.

01:05:58.760 --> 01:05:59.200
Yeah.

01:05:59.200 --> 01:06:03.560
I don't think I could have done it without at least some of you.

01:06:04.100 --> 01:06:04.700
That's awesome.

01:06:04.700 --> 01:06:04.700
That's awesome.

01:06:04.700 --> 01:06:06.000
So, yeah, that's great.

01:06:06.000 --> 01:06:06.520
All right.

01:06:06.640 --> 01:06:07.540
See you later, Mahmoud.

01:06:07.540 --> 01:06:07.920
Thanks.

01:06:07.920 --> 01:06:08.420
Yeah.

01:06:08.420 --> 01:06:09.160
Bye-bye-bye.

01:06:09.160 --> 01:06:09.200
Bye-bye.

01:06:10.100 --> 01:06:12.720
This has been another episode of Talk Python To Me.

01:06:13.240 --> 01:06:17.780
Today's guest was Mahmoud Hashemi, and this episode has been sponsored by SnapCI and Hired.

01:06:17.780 --> 01:06:19.460
Thank you guys for supporting the show.

01:06:19.460 --> 01:06:22.400
SnapCI is modern continuous integration delivery.

01:06:22.400 --> 01:06:26.360
Build, test, and deploy your code directly from GitHub, all in your browser with debugging,

01:06:26.360 --> 01:06:28.000
Docker, and parallelism included.

01:06:28.000 --> 01:06:30.700
Try them for free at snap.ci slash talkpython.

01:06:30.700 --> 01:06:33.260
Hired wants to help you find your next big thing.

01:06:33.260 --> 01:06:37.580
Visit hired.com slash talkpython to me to get five or more offers of a salary and equity

01:06:37.580 --> 01:06:40.640
right up front and a special listener signing bonus of $2,000.

01:06:41.420 --> 01:06:43.300
Are you or a colleague trying to learn Python?

01:06:43.300 --> 01:06:47.140
Have you tried boring books and videos that just cover the topic point by point?

01:06:47.140 --> 01:06:52.640
Well, check out my online course, Python Jumpstart, by building 10 apps at training.talkpython.fm.

01:06:52.640 --> 01:06:58.620
You can find the links from today's show at talkpython.fm/episodes slash show slash 54.

01:06:58.620 --> 01:07:00.700
Be sure to subscribe to the show.

01:07:00.700 --> 01:07:03.780
Open your favorite podcatcher and search for Python, which should be right at the top.

01:07:03.780 --> 01:07:07.700
You can also find the iTunes and direct RSS feeds in the footer of the website.

01:07:07.700 --> 01:07:11.380
Our theme music is Developers, Developers, Developers by Corey Smith.

01:07:11.380 --> 01:07:12.360
It goes by Smix.

01:07:12.360 --> 01:07:15.200
You can hear the entire song on talkpython.fm.

01:07:15.200 --> 01:07:16.400
This is your host, Michael Kennedy.

01:07:16.400 --> 01:07:18.760
I really appreciate you guys taking the time to listen.

01:07:18.760 --> 01:07:20.980
Smix, let's get out of here.

01:07:21.480 --> 01:07:23.920
Outro Music

01:07:23.920 --> 01:07:42.920
Outro Music

