WEBVTT

00:00:00.001 --> 00:00:03.640
It's time for some Pythonic job and career advice with Matt Harrison.

00:00:03.640 --> 00:00:08.480
Listen in as we discuss how most developer jobs never make it to full job listings that

00:00:08.480 --> 00:00:12.160
you actually see out there and available, and how you can get in on them.

00:00:12.160 --> 00:00:16.660
We also discuss his books and avalanche research with the Pandas Library.

00:00:16.660 --> 00:00:22.160
This is Talk Python To Me, episode 111, recorded May 4th, 2017.

00:00:22.160 --> 00:00:51.500
Welcome to Talk Python To Me, a weekly podcast on Python, the language, the libraries, the

00:00:51.500 --> 00:00:53.020
ecosystem, and the personalities.

00:00:53.020 --> 00:00:55.140
This is your host, Michael Kennedy.

00:00:55.140 --> 00:00:57.140
Follow me on Twitter, where I'm @mkennedy.

00:00:57.140 --> 00:01:02.440
Keep up with the show and listen to past episodes at talkpython.fm, and follow the show on Twitter

00:01:02.440 --> 00:01:03.560
via at Talk Python.

00:01:03.560 --> 00:01:07.020
Talk Python To Me is partially supported by our training courses.

00:01:07.020 --> 00:01:10.580
Have you tried to learn Python but got stuck or lost focus?

00:01:10.580 --> 00:01:16.680
We know how it feels to try and jam fact after fact, loop construct after turn hair expression

00:01:16.680 --> 00:01:17.800
into your head.

00:01:17.800 --> 00:01:19.220
At best, it's boring.

00:01:19.380 --> 00:01:21.960
At worst, it can turn you off programming altogether.

00:01:21.960 --> 00:01:25.920
That's why we built our course, Python Jumpstart by Building 10 Apps.

00:01:25.920 --> 00:01:29.160
This course guides you through carefully planned applications.

00:01:29.160 --> 00:01:32.700
It starts simple, but progresses to quite real apps.

00:01:32.700 --> 00:01:35.600
Best of all, you won't be learning dry facts.

00:01:35.600 --> 00:01:40.180
You'll be learning like the pros do, by building real applications and learning in context.

00:01:40.900 --> 00:01:46.060
If you want to start building with Python, just visit talkpython.fm/course to get started.

00:01:46.060 --> 00:01:48.740
Matt, welcome to Talk Python.

00:01:48.740 --> 00:01:49.400
Oh, hi.

00:01:49.400 --> 00:01:50.220
Thanks, Michael.

00:01:50.220 --> 00:01:51.740
Thanks for letting me come on the show.

00:01:51.740 --> 00:01:57.680
Yeah, we've had some conversations on Twitter and sort of brushed shoulders on the internet,

00:01:57.680 --> 00:02:01.060
if you will, and haven't really had a great chance to sit down and talk.

00:02:01.200 --> 00:02:03.480
So let's do it over Skype tonight, huh?

00:02:03.480 --> 00:02:04.400
Sounds good.

00:02:04.400 --> 00:02:06.300
Happy May 4th.

00:02:06.300 --> 00:02:09.680
May the 4th of the force be with you.

00:02:09.680 --> 00:02:11.320
Yes, may the 4th be with you.

00:02:11.320 --> 00:02:11.780
Awesome.

00:02:13.240 --> 00:02:18.580
All right, so we're going to talk about kind of a sampling of things.

00:02:18.580 --> 00:02:22.260
Data science, books, careers.

00:02:22.260 --> 00:02:27.260
These are questions that we both get a lot, and we've had some, I'm not sure I should speak

00:02:27.260 --> 00:02:31.660
for you, but definitely I can say that I've had some non-standard career paths that I think

00:02:31.660 --> 00:02:37.240
is we can definitely exchange some ideas there, maybe help some people, you know, jumpstart their

00:02:37.240 --> 00:02:37.560
career.

00:02:37.560 --> 00:02:40.140
And finally, you've got a cool project going on that we'll talk about.

00:02:40.140 --> 00:02:42.860
But before we get to all of those, let's start at the beginning.

00:02:42.860 --> 00:02:43.520
What's your story?

00:02:43.520 --> 00:02:44.800
How did you get into programming in Python?

00:02:44.800 --> 00:02:45.480
Yeah.

00:02:45.480 --> 00:02:53.120
So I'm, I guess, a child of the 80s, and back in 1983, my dad came home from work one day

00:02:53.120 --> 00:02:55.580
with a box that said Commodore 64 on it.

00:02:55.580 --> 00:03:00.880
And my brother and I proceeded to teach ourselves basic.

00:03:00.880 --> 00:03:05.520
I think mostly he taught it, and I sort of sat and watched him.

00:03:05.520 --> 00:03:07.920
So we were doing pair programming back in 1983.

00:03:07.920 --> 00:03:09.960
We had a byte magazine.

00:03:10.640 --> 00:03:16.680
And we'd just sit down and copy what was in the magazine and learn code from that.

00:03:16.680 --> 00:03:19.440
That was my first foray into that.

00:03:19.440 --> 00:03:24.880
And I can still remember typing peek and poke and changing the background color of that.

00:03:24.880 --> 00:03:32.080
Do you think that that's kind of a lost skill or a lost way of learning of here's a bunch of text.

00:03:32.240 --> 00:03:35.740
I have to literally type this in to make it work, right?

00:03:35.740 --> 00:03:37.200
Like, will that ever come again?

00:03:37.200 --> 00:03:38.140
Probably not, right?

00:03:38.140 --> 00:03:38.740
Not really.

00:03:38.740 --> 00:03:39.680
I doubt it.

00:03:39.680 --> 00:03:43.720
I mean, I think the Raspberry Pi is probably the closest that we have right now.

00:03:43.800 --> 00:03:56.180
But if you think about it, you have, you know, an iPhone or a tablet device that comes with a GUI environment and everything is all these apps on it are.

00:03:56.180 --> 00:03:59.900
A lot of them are hundreds of man years to make.

00:04:00.400 --> 00:04:06.400
And we were plopped into a basic environment and you sort of had to learn to do everything from scratch.

00:04:06.400 --> 00:04:17.700
And it's interesting because I teach kids programming and I think about my experience and it's really different from they want to jump in and start doing 3D programming and games and that.

00:04:17.700 --> 00:04:23.840
And people who are new to computers, they don't appreciate a lot of what's going on underneath, I guess.

00:04:23.840 --> 00:04:29.020
That's an interesting point that you really have different expectations of what you get out, right?

00:04:29.020 --> 00:04:31.720
Like, you're saying like, oh my gosh, I made this green blue.

00:04:31.720 --> 00:04:32.700
It's amazing, right?

00:04:32.700 --> 00:04:35.000
Like, people today wouldn't be amazed with this.

00:04:35.000 --> 00:04:36.120
That's silly.

00:04:36.120 --> 00:04:36.940
But yeah.

00:04:36.940 --> 00:04:38.420
How do I make the dragon fly?

00:04:38.420 --> 00:04:40.240
Yeah, exactly.

00:04:40.240 --> 00:04:48.080
My brother and I messed around on the Commodore for a while and it wasn't until high school that I did much more programming.

00:04:48.080 --> 00:04:52.620
I took the AP computer science class in high school and did Pascal then.

00:04:52.620 --> 00:04:56.580
And I also did a summer program where I did a prologue.

00:04:56.580 --> 00:05:02.800
I felt that programming was important and it changed the way I thought.

00:05:02.800 --> 00:05:04.060
I was in the university.

00:05:04.060 --> 00:05:11.020
It wasn't until the university that I sort of went down the programming path or computer science path and sort of locked in on that.

00:05:11.020 --> 00:05:15.960
And then, you know, the rest is somewhat history.

00:05:15.960 --> 00:05:27.680
I, in school, did Java, Lisp, C, and taught myself Perl at the end of school because I was told that if I knew Perl, then I would be employable.

00:05:27.680 --> 00:05:35.320
Which was sort of funny being in the middle of Silicon Valley and not being employable coming out of school, which just seemed sort of silly.

00:05:35.320 --> 00:05:39.840
So I taught myself Perl and proceeded to get a job doing Perl.

00:05:41.040 --> 00:05:49.680
And eventually I came to Python because the company I was working for, it was a search company.

00:05:49.680 --> 00:05:53.720
And I was tasked with working with all these smart PhDs.

00:05:53.720 --> 00:05:56.520
And one of them was doing Tickle.

00:05:56.520 --> 00:06:04.280
And I needed to do, make a, what we called a term suggester to pick out the relevant terms of the corpus.

00:06:04.900 --> 00:06:07.060
And he wanted to do it in Tickle.

00:06:07.060 --> 00:06:08.920
And I was a Perl person.

00:06:08.920 --> 00:06:12.300
And neither of us wanted to cross that bridge to the other side.

00:06:12.300 --> 00:06:16.500
And so he said, well, I hear there's this cool language called Python.

00:06:16.500 --> 00:06:18.200
I think we should try that.

00:06:18.200 --> 00:06:24.940
Even though, like, white space is important in it, maybe we can get over that and use Python to solve this problem.

00:06:25.540 --> 00:06:30.360
And we sort of both agreed on that, that white space wouldn't be a huge deal.

00:06:30.360 --> 00:06:33.020
And three days later, we had a working prototype.

00:06:33.020 --> 00:06:35.340
And I don't think either of us really looked back.

00:06:35.340 --> 00:06:36.360
We sort of...

00:06:36.360 --> 00:06:37.100
Wow, that's awesome.

00:06:37.100 --> 00:06:38.040
Yeah, yeah.

00:06:38.040 --> 00:06:46.020
We sort of promptly forgot our Perl and Tickle and hid that we were using Python from the rest of the company, but moved forward like that.

00:06:46.020 --> 00:06:50.040
Did Python eventually become something that was widely used within the company?

00:06:50.040 --> 00:06:54.620
Or was it like you guys kind of had this side project and, yeah, we don't talk about how it's implemented.

00:06:54.880 --> 00:06:56.100
It was not looked upon.

00:06:56.100 --> 00:06:59.300
People were sort of disappointed that we were using...

00:06:59.300 --> 00:07:00.280
This is back in 2000.

00:07:00.280 --> 00:07:03.900
So Python was not widely used at the company.

00:07:03.900 --> 00:07:05.780
Everything was Java and .NET.

00:07:05.780 --> 00:07:08.140
That was the cool, cool thing to use at that time.

00:07:08.140 --> 00:07:09.720
Yeah, that was definitely the hotness.

00:07:09.720 --> 00:07:14.740
And, of course, they were doing, like, soap, web service exchange, all sorts of badness.

00:07:14.740 --> 00:07:15.100
Yeah.

00:07:15.100 --> 00:07:19.600
Yeah, we implemented our own version of soap that we called Dove.

00:07:19.600 --> 00:07:24.300
And, yeah, that was the glory days.

00:07:24.720 --> 00:07:28.920
They gave you a nice, creamy hands afterwards that wouldn't dry them out or anything, huh?

00:07:28.920 --> 00:07:31.160
Yeah, you were all enterprise-y.

00:07:31.160 --> 00:07:32.320
Nice.

00:07:32.320 --> 00:07:37.000
So I'm glad the XML-heavy days are behind us, especially the namespaces.

00:07:37.000 --> 00:07:38.820
So the...

00:07:38.820 --> 00:07:40.000
Okay.

00:07:40.400 --> 00:07:44.040
So the search engine stuff sounds really cool.

00:07:44.040 --> 00:07:45.240
Are you still working on that?

00:07:45.240 --> 00:07:46.360
Are you doing something different these days?

00:07:46.360 --> 00:07:50.840
So these days, I spend most of my time doing...

00:07:50.840 --> 00:07:54.820
I'm working at a company called Far Better, and we're creating a business travel app.

00:07:55.040 --> 00:08:03.060
So the idea is to use computers to do something that computers are good at, like searching a lot of different options.

00:08:03.060 --> 00:08:06.100
And so the elevator pitch for that is to...

00:08:06.100 --> 00:08:10.000
You enter where you want to go and when you want to be there and hit go.

00:08:10.000 --> 00:08:21.840
And in a minute, we have a complete itinerary plan that crawls 100 million different options and picks the best flight for you based on your preferences, be it brand or cost or schedule.

00:08:22.160 --> 00:08:22.780
That's really awesome.

00:08:22.780 --> 00:08:24.440
We're definitely going to have to dig into that.

00:08:24.440 --> 00:08:25.320
That sounds really fun.

00:08:25.320 --> 00:08:27.940
So you're still doing plenty of Python there, I presume?

00:08:27.940 --> 00:08:29.660
Yeah, doing Python there.

00:08:29.660 --> 00:08:34.200
And occasionally, you know, every couple of weeks, I'll do a training as well.

00:08:34.200 --> 00:08:40.120
So my employer is nice enough to give me a little time to actually do training as well.

00:08:40.120 --> 00:08:42.280
So I'm still involved doing training as well.

00:08:42.280 --> 00:08:42.720
Okay.

00:08:42.720 --> 00:08:46.480
Speaking of training, you're giving a couple of tutorials coming up at PyCon.

00:08:46.480 --> 00:08:48.340
And like you said, it's May 4th.

00:08:48.340 --> 00:08:50.280
And what is that?

00:08:50.340 --> 00:08:53.460
That's like 15 days until PyCon.

00:08:53.460 --> 00:08:55.640
Maybe even sooner for your tutorials, right?

00:08:55.640 --> 00:08:55.820
Yeah.

00:08:55.820 --> 00:08:56.720
The days before then.

00:08:56.720 --> 00:08:58.120
Two weeks away.

00:08:58.120 --> 00:08:58.760
Yeah, two weeks.

00:08:58.760 --> 00:08:59.460
Yeah.

00:08:59.460 --> 00:09:00.320
What tutorials are you doing?

00:09:00.320 --> 00:09:05.920
So I'm giving beginning hands-on Python and intermediate hands-on Python.

00:09:05.920 --> 00:09:12.140
So I've been giving some version of these tutorials for probably about 10 years now.

00:09:12.140 --> 00:09:19.560
So it's definitely a great way to get involved and sort of share, I guess, my love of Python

00:09:19.560 --> 00:09:21.540
and help others learn Python.

00:09:21.540 --> 00:09:24.100
I've tweaked them a little bit this year.

00:09:24.100 --> 00:09:28.360
Traditionally, they've been more of a, here's some labs and go and do these labs.

00:09:28.360 --> 00:09:34.080
And this year I've tweaked them and we're going to build a Markov chain from scratch and sort

00:09:34.080 --> 00:09:37.560
of introduce all the basic constructs in the beginning class.

00:09:37.560 --> 00:09:42.120
And then in the intermediate class, we're going to go over sort of the meaty parts of Python.

00:09:42.120 --> 00:09:49.460
So talk about generators and decorators and all that fun stuff and introduce those in the

00:09:49.460 --> 00:09:52.040
context of making a Markov chain generator.

00:09:52.380 --> 00:09:53.220
So it should be fun.

00:09:53.220 --> 00:09:53.700
Interesting.

00:09:53.700 --> 00:09:54.960
Yeah, that sounds awesome.

00:09:54.960 --> 00:09:59.420
Do you find that people, like there, obviously there's plenty of people who are super experts

00:09:59.420 --> 00:10:03.760
in Python, but do you find there's a large number of people that maybe like can read the

00:10:03.760 --> 00:10:07.860
basic syntax and they do the basic things they know how to do from C, but they don't really

00:10:07.860 --> 00:10:08.920
take advantage of the language?

00:10:08.920 --> 00:10:10.580
I guess that was my experience.

00:10:10.580 --> 00:10:14.140
And I, you know, doing training where Python is right now.

00:10:14.140 --> 00:10:19.900
I mean, a lot of my training is enterprise big companies that are migrating people from,

00:10:20.240 --> 00:10:22.420
ironically, Java and C# to Python.

00:10:22.420 --> 00:10:29.420
And so, you know, my experience was very similar to that, where I said we learned Python in three

00:10:29.420 --> 00:10:32.720
days and that's in three days we had a working prototype in Python.

00:10:32.720 --> 00:10:38.400
And, you know, once you get past sort of the replace curly braces with colons and indent,

00:10:38.400 --> 00:10:42.900
you can sort of read Python and you can be pretty proficient with it.

00:10:43.620 --> 00:10:49.780
And so I've seen that people will sort of say, well, I can understand this.

00:10:49.780 --> 00:10:50.360
I can read it.

00:10:50.360 --> 00:10:52.020
Let's sort of do that.

00:10:52.020 --> 00:10:58.100
And then you sort of throw in like decorators and yields and people's eyes sort of glaze

00:10:58.100 --> 00:11:00.520
over and they just sort of ignore those sorts of things.

00:11:00.520 --> 00:11:00.760
Right.

00:11:00.800 --> 00:11:06.640
And I think I was sort of in that camp for a while as well and didn't really appreciate

00:11:06.640 --> 00:11:08.800
those or didn't really see the need for them.

00:11:08.800 --> 00:11:15.060
And part of my tutorials sort of to get across the point of, yeah, you can get around with

00:11:15.060 --> 00:11:20.640
basic Python and you can be proficient in it and program like it, see your Java and whatnot.

00:11:20.640 --> 00:11:28.320
But there's a lot of syntax sugar that's pretty nice in Python that you can do cool stuff with.

00:11:28.320 --> 00:11:34.280
And so you can take advantage of that and wrap your eyes or wrap your brain around closures

00:11:34.280 --> 00:11:37.260
and decorators and generators.

00:11:37.260 --> 00:11:39.520
You can do a lot of cool stuff with that.

00:11:39.520 --> 00:11:43.800
So and you can apply it to a lot of problems that are pretty common in programming.

00:11:43.800 --> 00:11:44.520
Yeah, for sure.

00:11:44.520 --> 00:11:45.520
And get more out of the language.

00:11:45.520 --> 00:11:46.080
Yeah.

00:11:46.080 --> 00:11:49.700
So it sounds like your intermediate tutorial would kind of cover that stuff.

00:11:49.700 --> 00:11:50.060
That's cool.

00:11:50.060 --> 00:11:51.820
And then you're also running the Young Coders Workshop.

00:11:51.820 --> 00:11:52.360
What's that?

00:11:52.360 --> 00:11:52.840
Yeah.

00:11:52.840 --> 00:11:54.200
Kind of know about it, but tell everyone about it.

00:11:54.200 --> 00:11:54.420
Yeah.

00:11:54.420 --> 00:11:59.280
So I believe it's for 12 to 16 year olds.

00:11:59.280 --> 00:12:03.340
You can bring your kids and or your kids can come to it.

00:12:03.340 --> 00:12:04.220
You don't have to bring them.

00:12:04.220 --> 00:12:09.680
And we're just going to give them a Raspberry Pi and they can get an introduction to Python

00:12:09.680 --> 00:12:10.400
for the day.

00:12:10.400 --> 00:12:15.640
So I'm doing the beginning workshop that will be on Saturday at PyCon.

00:12:15.640 --> 00:12:17.720
So that should be fun.

00:12:17.800 --> 00:12:23.440
I've done elementary kids in the past and was hoping to get my kids up there.

00:12:23.440 --> 00:12:26.680
But it turns out they actually have scheduling conflicts.

00:12:26.680 --> 00:12:30.020
So they won't be up there, but I'll still be doing that.

00:12:30.020 --> 00:12:31.120
So it should be good.

00:12:31.460 --> 00:12:33.700
I like learning and helping other people learn.

00:12:33.700 --> 00:12:35.160
So that should be fun.

00:12:35.160 --> 00:12:35.440
Yeah.

00:12:35.440 --> 00:12:36.120
That's really cool.

00:12:36.120 --> 00:12:37.700
And are these pretty much sold out?

00:12:37.700 --> 00:12:38.240
Yeah.

00:12:38.240 --> 00:12:45.360
I believe I got an email from the tutorial organizer and they said that every tutorial session was

00:12:45.360 --> 00:12:47.840
sold out, which, yeah, it's awesome.

00:12:48.040 --> 00:12:54.340
I mean, I think my first PyCon was 2005 and there was 300 something people there.

00:12:54.340 --> 00:13:00.180
And now, you know, there's a conference has just grown to a really big conference.

00:13:00.180 --> 00:13:03.280
And it's crazy that it's awesome.

00:13:03.280 --> 00:13:09.320
But it's really good to see the growth and see, you know, like I said, enterprises coming

00:13:09.320 --> 00:13:11.620
to Python and wholeheartedly accepting it.

00:13:11.620 --> 00:13:12.640
So great timing.

00:13:12.640 --> 00:13:12.820
Yeah.

00:13:12.820 --> 00:13:16.480
It's no longer tucked under the corner in that broom closet on that one project.

00:13:16.480 --> 00:13:16.800
Right.

00:13:16.800 --> 00:13:18.380
Now it's the thing they're seeking out.

00:13:18.380 --> 00:13:18.700
Yeah.

00:13:18.700 --> 00:13:19.140
Yeah.

00:13:19.460 --> 00:13:20.320
So that's awesome.

00:13:20.320 --> 00:13:20.840
Yeah.

00:13:20.840 --> 00:13:21.260
Yeah.

00:13:21.260 --> 00:13:25.460
So I, I, I've tried to hit this message like beginning of this year, you know, PyCon's

00:13:25.460 --> 00:13:26.000
going to sell out.

00:13:26.000 --> 00:13:26.960
Everybody get your tickets.

00:13:26.960 --> 00:13:29.860
And I've, you know, if you don't get them, you're going to be sad.

00:13:29.860 --> 00:13:30.520
Don't wait.

00:13:30.520 --> 00:13:34.220
And I've heard from a few people that said, I'm going to go to PyCon.

00:13:34.220 --> 00:13:35.020
I'm getting my tickets.

00:13:35.020 --> 00:13:36.080
I'm just thinking, oh no.

00:13:36.080 --> 00:13:37.420
A little bit later.

00:13:37.420 --> 00:13:37.800
Nope.

00:13:37.800 --> 00:13:38.740
No more tickets.

00:13:38.740 --> 00:13:39.160
Yeah.

00:13:39.160 --> 00:13:42.580
I've had people asking me like, how is there like a back door?

00:13:42.580 --> 00:13:45.340
Do you know someone I can, yeah, I can get tickets from?

00:13:45.340 --> 00:13:49.300
Well, you should have got them when everyone was saying they're going to

00:13:49.300 --> 00:13:53.780
sell out, but yeah, well it's, you know, there's an, I don't want to go too far

00:13:53.780 --> 00:13:57.560
down this because we want to stay in the other topics, but they could choose larger places.

00:13:57.560 --> 00:14:01.620
They could do Moscone center in San Francisco, but they're really trying to strike the balance

00:14:01.620 --> 00:14:07.780
between not having too huge of a conference, holding it in locations like Portland or Ohio

00:14:07.780 --> 00:14:11.220
or wherever, where it's not super expensive to come to.

00:14:11.220 --> 00:14:16.280
And so there's this, this trade-off between sort of growing to fit the size of as many

00:14:16.280 --> 00:14:19.180
people as want to come, but then also like maybe pricing.

00:14:19.180 --> 00:14:20.360
people out or making it difficult.

00:14:20.360 --> 00:14:21.440
So it's, it's tough.

00:14:21.440 --> 00:14:21.800
Yeah.

00:14:21.800 --> 00:14:22.820
And kudos to them.

00:14:22.820 --> 00:14:24.780
I think the organizers do a great job.

00:14:24.780 --> 00:14:27.980
So it's not something that I would want to do.

00:14:27.980 --> 00:14:30.120
So yes, absolutely.

00:14:30.120 --> 00:14:30.700
Absolutely.

00:14:30.700 --> 00:14:32.880
I've organized like small training events.

00:14:32.880 --> 00:14:34.340
This seems harder.

00:14:34.340 --> 00:14:34.840
Yeah.

00:14:34.840 --> 00:14:35.420
Yeah.

00:14:35.420 --> 00:14:41.040
So speaking of things that are harder, writing books, you, you've been doing, you know,

00:14:41.040 --> 00:14:45.640
I knew about your pandas book and then I started to look on Amazon and you have a lot

00:14:45.640 --> 00:14:46.140
of books.

00:14:46.560 --> 00:14:46.720
Yeah.

00:14:46.720 --> 00:14:50.300
I guess it's sort of misleading how many books I have there.

00:14:50.300 --> 00:14:57.280
I sort of have three books and then one of the books has been sold as sort of sub booklets.

00:14:57.280 --> 00:15:00.220
And, and so, well, I guess, yeah.

00:15:00.220 --> 00:15:01.660
So yeah, some of them aren't huge.

00:15:01.660 --> 00:15:03.420
They're like 60 or 80 pages, right?

00:15:03.560 --> 00:15:03.860
Yeah.

00:15:03.860 --> 00:15:04.240
Yeah.

00:15:04.240 --> 00:15:04.780
Yeah.

00:15:04.780 --> 00:15:06.740
So I guess I now have four books.

00:15:06.740 --> 00:15:14.920
I just recently released this tiny Python 3.6 notebook, which people lament the name because

00:15:14.920 --> 00:15:16.240
it's not a Jupyter notebook.

00:15:16.240 --> 00:15:18.740
It's just a little teeny book.

00:15:18.740 --> 00:15:20.060
It's like literally a notebook.

00:15:20.060 --> 00:15:23.960
It's like the thing that was where you put your notes before all this computer stuff.

00:15:23.960 --> 00:15:24.460
Yeah.

00:15:24.460 --> 00:15:24.900
Yeah.

00:15:24.900 --> 00:15:25.700
I Python, right?

00:15:26.440 --> 00:15:28.760
namespaces, namespace clash there.

00:15:28.760 --> 00:15:29.260
Exactly.

00:15:29.260 --> 00:15:30.560
It sounds great though.

00:15:30.560 --> 00:15:31.120
So what's in there?

00:15:31.120 --> 00:15:31.520
Yeah.

00:15:31.520 --> 00:15:38.440
So that's just a little book that I wanted to give to attendees of my training classes that

00:15:38.440 --> 00:15:41.220
just had, here's the basic syntax of Python.

00:15:41.220 --> 00:15:47.440
And if you forget something, you can look up decorators or generators or the basic syntax

00:15:47.440 --> 00:15:51.920
and have it all in a physical place if you're a physical person.

00:15:51.920 --> 00:15:55.940
And so that's my latest book.

00:15:55.940 --> 00:16:02.880
And that came out, I think a month or two ago, I actually experimented and put the source up

00:16:02.880 --> 00:16:03.440
on GitHub.

00:16:03.440 --> 00:16:09.440
So that's freely available to anyone who wants to look at it or peruse it.

00:16:09.760 --> 00:16:16.300
And, you know, if you want a physical version, you can get those on Amazon or whatnot.

00:16:16.300 --> 00:16:18.180
But yeah, it's there.

00:16:18.180 --> 00:16:21.700
And people have offered to translate it into other languages and whatnot.

00:16:21.700 --> 00:16:28.100
And, you know, as they've sort of started that process, but I think they got bored.

00:16:28.100 --> 00:16:29.800
So we'll see what happens.

00:16:29.800 --> 00:16:35.180
But it's fun to see what happens when you throw something out over the fence like that.

00:16:35.180 --> 00:16:36.360
That sounds really cool.

00:16:36.360 --> 00:16:38.460
And so you basically self-published this?

00:16:38.460 --> 00:16:38.920
Yeah.

00:16:39.120 --> 00:16:44.240
Yeah, I don't want to get into like a big self-publishing versus publishing.

00:16:44.240 --> 00:16:48.280
But for me, I think self-publishing sort of made sense.

00:16:48.280 --> 00:16:50.580
And so I went down that route.

00:16:50.580 --> 00:16:57.060
And with my prior books, I had made a tool chain that allows me using restructured text

00:16:57.060 --> 00:17:02.700
to easily publish e-books and LaTeX from the same source.

00:17:02.840 --> 00:17:06.820
So it's pretty easy to do that for me.

00:17:06.820 --> 00:17:09.780
So that's what I've done there.

00:17:09.780 --> 00:17:13.280
And I think the feedback's been pretty good on it so far.

00:17:13.280 --> 00:17:14.520
I think people have liked it.

00:17:14.520 --> 00:17:17.700
And it's sold a little bit.

00:17:17.700 --> 00:17:18.520
People have liked it.

00:17:18.520 --> 00:17:21.220
And so I'm happy for that.

00:17:21.220 --> 00:17:21.800
That's cool.

00:17:21.960 --> 00:17:25.460
So you say 3.6 notebook, not Python 3 notebook.

00:17:25.460 --> 00:17:26.120
Yeah.

00:17:26.120 --> 00:17:30.100
Is there going to be like a 3.7 next December or whenever that ships?

00:17:30.100 --> 00:17:32.960
I guess there could be if I get patches for it.

00:17:33.620 --> 00:17:35.240
Why is it 3.6 versus 3?

00:17:35.240 --> 00:17:38.380
The new 3.6 features came out.

00:17:38.380 --> 00:17:39.060
f-strings.

00:17:39.060 --> 00:17:40.380
I wanted to put those in there.

00:17:40.380 --> 00:17:42.500
The async and await stuff.

00:17:42.500 --> 00:17:43.540
I put that in there.

00:17:43.540 --> 00:17:45.980
I guess I can go on a little rant.

00:17:45.980 --> 00:17:50.260
I think 3.6, I don't know how much I should say here.

00:17:50.260 --> 00:17:53.160
3.6 is a good version of Python 3.

00:17:53.160 --> 00:17:54.180
Let's leave it at that.

00:17:54.180 --> 00:17:57.660
I think if you're going to use Python 3, you should use 3.6.

00:17:57.660 --> 00:17:58.480
Yeah, for sure.

00:17:58.480 --> 00:18:04.580
There's a ton of internal improvements like speed and memory usage on dictionaries and objects and all sorts of stuff.

00:18:04.580 --> 00:18:07.040
So yeah, a lot of non-obvious things as well.

00:18:07.040 --> 00:18:12.120
So then you have a couple of books that seem like they're a little bit like your tutorials,

00:18:12.120 --> 00:18:16.520
like a foundational one and an intermediate one with the things that we talked about before, right?

00:18:16.520 --> 00:18:17.000
Yeah.

00:18:17.000 --> 00:18:21.700
Those actually, the impetus for those books actually came from my tutorials.

00:18:21.700 --> 00:18:32.580
So I had given my tutorials at PyCon and I got accepted to give one at OSCON, the O'Reilly Open Source Conference.

00:18:32.580 --> 00:18:38.940
And I thought, well, instead of just rewriting my slides, I'll write a book instead of rewriting my slides,

00:18:38.940 --> 00:18:45.060
which clearly I underestimated the amount of time and effort it goes to create a book.

00:18:45.260 --> 00:18:48.460
The conference was like three months away and I thought, oh, I can whip this out.

00:18:48.460 --> 00:18:52.500
And it was probably almost a year or so, maybe nine months.

00:18:52.500 --> 00:18:54.100
What is that, a week of work?

00:18:54.100 --> 00:18:55.140
Yeah, yeah, yeah.

00:18:55.140 --> 00:18:55.900
Oh my God, this.

00:18:55.900 --> 00:18:57.000
And so...

00:18:57.000 --> 00:18:57.680
Do that this evening.

00:18:57.680 --> 00:18:59.940
There's a ton of work that goes into a book.

00:18:59.940 --> 00:19:02.580
I feel like I'm a creator.

00:19:02.580 --> 00:19:03.920
I like to create things.

00:19:03.920 --> 00:19:09.100
And this is the book that I want, that I would have wanted.

00:19:09.100 --> 00:19:13.980
And so it was sort of inside of me and I wanted to put it out.

00:19:13.980 --> 00:19:17.380
And so I guess that was my therapy or something to write a book.

00:19:17.380 --> 00:19:18.800
That's really great.

00:19:18.800 --> 00:19:19.420
Yeah.

00:19:19.420 --> 00:19:20.640
Or your affliction.

00:19:20.640 --> 00:19:21.560
Yeah.

00:19:21.560 --> 00:19:25.420
The other one I want to talk about is you have a book called Learning the Pandas Library,

00:19:25.420 --> 00:19:29.200
Python Tools for Data Munging Analysis and Visualization.

00:19:29.200 --> 00:19:33.100
So I know Pandas is a really great library.

00:19:33.100 --> 00:19:39.680
I've seen some of the data loading, transformation, cleaning type of tricks you can do to it.

00:19:39.680 --> 00:19:40.800
And it seems really cool.

00:19:40.800 --> 00:19:45.220
But we've not really talked about Pandas very much on the show.

00:19:45.220 --> 00:19:46.960
We've mentioned it, but not really.

00:19:46.960 --> 00:19:48.020
What is it?

00:19:48.020 --> 00:19:48.720
Why do you use it?

00:19:48.720 --> 00:19:51.860
Maybe give everyone listening who doesn't know the overview of Pandas.

00:19:51.860 --> 00:19:52.620
Sure, sure.

00:19:52.620 --> 00:19:55.180
So Pandas, what's a good way to describe Pandas?

00:19:55.180 --> 00:20:02.940
I think in my book, I describe Pandas as a way to create in-memory database and do database

00:20:02.940 --> 00:20:06.960
type operations on tabular data in Python.

00:20:06.960 --> 00:20:09.460
And some people might not like that definition.

00:20:09.460 --> 00:20:16.640
But basically, if you have tabular data and you need to filter it or tweak it or do operations

00:20:16.640 --> 00:20:19.380
on it, Pandas is a great tool to do that.

00:20:19.380 --> 00:20:23.040
And you can even combine the different data frames, right?

00:20:23.040 --> 00:20:24.520
In sort of a join-like way?

00:20:24.520 --> 00:20:28.620
Yeah, basically anything you can do with a database, you can do in Pandas.

00:20:28.620 --> 00:20:34.900
So there are basically two main data structures that most people worry about.

00:20:34.900 --> 00:20:35.780
One is a series.

00:20:35.780 --> 00:20:43.680
And you can think of a series as a column of data and a data frame as a bunch of columns,

00:20:43.680 --> 00:20:45.040
which turns out to be a row.

00:20:45.040 --> 00:20:52.580
And I say columns versus rows because typically Pandas is used more for doing analytics than

00:20:52.580 --> 00:20:53.860
more of an OLTP.

00:20:53.860 --> 00:20:54.980
OLTP type database.

00:20:54.980 --> 00:21:00.480
And so most analytical databases tend to be columnar versus row oriented.

00:21:00.480 --> 00:21:06.700
And that gives you some advantages in that most of your columns are homogenous.

00:21:06.700 --> 00:21:12.680
And so Pandas can do some fancy things there where rather than implementing this in pure Python,

00:21:12.680 --> 00:21:17.920
it can take advantage of things like NumPy and Cython under the covers.

00:21:18.320 --> 00:21:23.880
And so you can get some pretty big speed ups when you're doing numerical processing on these columns.

00:21:23.880 --> 00:21:30.960
That's 10 or another magnitude faster than you would get if it was pure Python.

00:21:30.960 --> 00:21:36.940
And you're also saving on memory spaces as well because you don't have a Python object under the covers there.

00:21:36.940 --> 00:21:37.460
Right.

00:21:37.460 --> 00:21:40.700
A lot of it is like C structures, much like NumPy.

00:21:40.700 --> 00:21:41.240
Yeah.

00:21:41.240 --> 00:21:41.640
Yeah.

00:21:41.640 --> 00:21:48.040
So you can, when you load data, you can say, I want to treat this as a float.

00:21:48.040 --> 00:21:49.540
I want to treat this as an integer.

00:21:50.060 --> 00:21:56.780
Or, you know, if you have string type data, you can say, I want to treat this as a categorical value.

00:21:56.780 --> 00:22:04.340
And so it can do some optimizations under the covers to make those things performant and memory efficient as well.

00:22:04.340 --> 00:22:07.960
That's a pretty brief introduction to Pandas.

00:22:07.960 --> 00:22:23.660
But yeah, and then once you go from that, you can, there's a semi-famous tweet from, I think it's Big Data Borat or some Borat avatar where he says 80% of data science is cleaning your data.

00:22:23.660 --> 00:22:26.920
And the other 20% is complaining about cleaning your data.

00:22:26.920 --> 00:22:30.360
And so something like that.

00:22:30.360 --> 00:22:31.300
I just butchered it.

00:22:31.300 --> 00:22:42.880
But the gist is that Pandas is that tool that allows Big Data Borat to do the 100% there of taking his data and clean it and munch it and whatnot.

00:22:42.880 --> 00:22:44.300
Big Data Borat.

00:22:44.300 --> 00:22:44.840
That's awesome.

00:22:44.840 --> 00:22:49.760
Yeah, I suppose there's probably a bunch of good things on Twitter that I'm missing out there.

00:22:49.760 --> 00:22:56.500
So you go through in your book and you talk about these data structures and, like you said, series and data frames and some of the database operations.

00:22:56.500 --> 00:22:59.520
And you do some kind of analysis, right?

00:22:59.520 --> 00:23:01.340
Like on avalanches, you said?

00:23:01.340 --> 00:23:01.880
Yeah.

00:23:01.880 --> 00:23:05.040
I live in Utah and snow is in Utah.

00:23:05.040 --> 00:23:06.900
And so I like to take advantage of the snow.

00:23:06.900 --> 00:23:08.420
And so I ski.

00:23:08.420 --> 00:23:13.920
And so sometimes I do backcountry skiing, which involves hiking up a mountain and then skiing down.

00:23:13.920 --> 00:23:26.660
And that invariably when you're out in nature and you don't have someone taking care of the avalanches for you, you have to be careful about where you ski.

00:23:26.660 --> 00:23:33.020
Because a lot of times those good places to ski are also good places for avalanches to occur.

00:23:33.020 --> 00:23:39.600
And so, you know, there's websites and whatnot that track this sort of thing.

00:23:39.980 --> 00:23:42.380
And there's a Utah avalanche website.

00:23:42.380 --> 00:23:57.020
And so the sort of capstone chapter, I guess, in my book, I go through an example analysis where I took, scraped the data off of this website and did some analysis and figured out, you know, how many slides there are per year.

00:23:57.020 --> 00:24:06.840
How many people typically die, sadly, and avalanches per year and where avalanches occur and elevations and aspects and that sort of thing.

00:24:06.840 --> 00:24:13.080
So just showing an example of taking something that isn't easily accessible.

00:24:13.080 --> 00:24:22.680
There's no CSV floating around with this avalanche data and using Python sort of end to end to grab the data, do some munging on it.

00:24:22.680 --> 00:24:32.200
And I ended up doing a little infographic that the Utah avalanche center used and basically all done in Python.

00:24:32.200 --> 00:24:35.340
So pretty good testament to the power of Python.

00:24:35.340 --> 00:24:37.520
That sounds really pretty interesting.

00:24:37.640 --> 00:24:39.920
I like the fact that it's like it wasn't accessible.

00:24:39.920 --> 00:24:41.900
You had to go like scrape it off the website.

00:24:41.900 --> 00:24:45.360
Like, no, this we're getting this and we're going to use this.

00:24:45.360 --> 00:24:46.040
It's going to be great.

00:24:46.040 --> 00:24:50.120
I was actually trapped by an avalanche up at Snowbird.

00:24:50.120 --> 00:24:55.020
One time I was supposed to be doing a training class in Salt Lake City and instead was stuck up there.

00:24:55.020 --> 00:24:59.960
And if you guys find me at PyCon, we can grab a beer and talk about being stuck in avalanches.

00:24:59.960 --> 00:25:02.300
So I definitely can see why you would study those there.

00:25:02.420 --> 00:25:10.940
So one of the things that that you decided to do after writing this book was like, hey, maybe I'll make a video course because that's also quick and easy.

00:25:10.940 --> 00:25:11.140
Right.

00:25:11.140 --> 00:25:11.760
Was that a week?

00:25:11.760 --> 00:25:12.240
Yeah.

00:25:12.240 --> 00:25:12.620
Yeah.

00:25:12.620 --> 00:25:14.640
And that's another couple of days.

00:25:14.640 --> 00:25:15.600
And you're good with that.

00:25:15.600 --> 00:25:15.800
Yeah.

00:25:15.960 --> 00:25:21.420
So I made a video course, basically, that O'Reilly's published.

00:25:21.420 --> 00:25:24.140
So Introduction to Pandas for Developers.

00:25:24.140 --> 00:25:36.380
And that basically takes the contents of the book and puts them into Jupyter Notebooks and goes over all your basics, taking you from zero to hero in pandas.

00:25:36.820 --> 00:25:41.580
And it also goes over that avalanche example as well.

00:25:41.580 --> 00:25:44.000
And if people prefer video form.

00:25:44.000 --> 00:25:51.680
So that was, you know, another thing where I sort of said, hey, I'm a creator and I'll create this.

00:25:51.680 --> 00:25:54.500
And it was a good experience for me to get it out there.

00:25:54.500 --> 00:25:55.700
Therapeutic, I guess.

00:25:55.700 --> 00:25:56.880
Yeah, that's good.

00:25:56.880 --> 00:26:03.140
So I'll be sure to link to all those things if people want to check them out, especially learn more about pandas, which sounds really fun.

00:26:03.140 --> 00:26:05.020
Check out the avalanche analysis.

00:26:05.020 --> 00:26:05.400
Cool.

00:26:05.400 --> 00:26:05.760
Yeah.

00:26:05.760 --> 00:26:06.240
Thanks.

00:26:06.580 --> 00:26:06.700
Yeah.

00:26:06.700 --> 00:26:09.460
I'm interested in hearing about your avalanche.

00:26:09.460 --> 00:26:11.100
So we'll have to catch up at PyCon.

00:26:11.100 --> 00:26:11.880
Absolutely.

00:26:11.880 --> 00:26:13.560
That sounds like a good story.

00:26:13.560 --> 00:26:14.160
Yeah.

00:26:14.160 --> 00:26:16.560
It was quite the stressful day, but it turned out to be pretty fun.

00:26:16.560 --> 00:26:18.040
Hey, everyone.

00:26:18.040 --> 00:26:18.560
Michael here.

00:26:18.560 --> 00:26:21.900
Let me take just a moment and thank one of our sponsors who makes this show possible.

00:26:21.900 --> 00:26:25.040
This portion of Talk Python and May has been brought to you by Rollbar.

00:26:25.040 --> 00:26:28.520
One of the frustrating things about being a developer is dealing with errors.

00:26:28.520 --> 00:26:36.140
Relying on users to report errors, digging through log files, trying to debug them, or a million alerts just flooding your inbox and ruining your day.

00:26:36.340 --> 00:26:43.160
With Rollbar's full stack error monitoring, you get the context, insight, and control you need to find and fix bugs faster.

00:26:43.320 --> 00:26:47.980
Adding the Rollbar Python SDK is just as easy as pip install Rollbar.

00:26:47.980 --> 00:26:51.720
You can start tracking production errors and deployments in eight minutes or less.

00:26:51.720 --> 00:27:01.200
Rollbar works with all the major languages and frameworks, including the Python ones like Django, Flask, Pyramid, as well as Ruby, .NET, Node, iOS, and Android.

00:27:01.440 --> 00:27:03.900
You can integrate Rollbar into your existing workflow.

00:27:03.900 --> 00:27:09.840
Send error alerts to Slack or HipChat or automatically create new JIRA issues, pivotal tracker issues, and a lot more.

00:27:09.840 --> 00:27:12.320
They have a special offer for Talk Python To Me listeners.

00:27:12.320 --> 00:27:14.940
Visit talkpython.fm/rollbar.

00:27:14.940 --> 00:27:17.880
Sign up and get the bootstrap plan free for 90 days.

00:27:17.880 --> 00:27:20.280
That's 100,000 errors tracked for free.

00:27:20.380 --> 00:27:24.140
But, you know, just between you and me, I hope you don't encounter that many errors.

00:27:24.140 --> 00:27:26.040
Give Rollbar a try today.

00:27:26.040 --> 00:27:28.820
Just go to talkpython.fm/rollbar.

00:27:29.420 --> 00:27:33.880
And if you happen to be going to PyCon this year, be sure to stop by Rollbar's booth.

00:27:33.880 --> 00:27:36.360
Get a live demo and pick up some of their swag.

00:27:36.360 --> 00:27:46.000
You know, doing all this stuff, all this writing these books, video courses, training, like this is not your standard career, right?

00:27:46.000 --> 00:27:50.360
And one of the things that we both kind of talked about when we planned out the show was,

00:27:50.360 --> 00:27:56.480
let's talk a little bit about helping people, you know, supercharge their career as a Python developer, right?

00:27:56.480 --> 00:28:06.720
Yeah, this is something that I've experienced as a person who's been doing Python for more than, you know, since the turn of the century.

00:28:06.720 --> 00:28:10.380
And, you know, someone who's now training people to use Python.

00:28:10.380 --> 00:28:16.140
And also, I run the Utah Python user group for about five years.

00:28:16.140 --> 00:28:22.540
And so I've seen sort of the change in demand and the basic, I mean, it's...

00:28:22.540 --> 00:28:23.960
Yeah, you talked about PyCon.

00:28:23.960 --> 00:28:27.740
It's like 10x from what it was, you know, 10 years ago.

00:28:27.740 --> 00:28:28.080
Yeah.

00:28:28.080 --> 00:28:31.640
And there's a huge demand for people who can program.

00:28:31.640 --> 00:28:34.420
And there's a huge demand for Python right now.

00:28:34.420 --> 00:28:40.600
I mean, I just, the other day went over, like, Hacker News has the who's hiring post every month.

00:28:40.600 --> 00:28:47.780
And Python's right up there, number one or number two, behind JavaScript in the most desired languages.

00:28:48.100 --> 00:28:51.140
So it's a great time to be a Python developer.

00:28:51.140 --> 00:28:56.800
Yeah, I did a thing that covered basically the active GitHub repositories.

00:28:56.800 --> 00:29:03.680
And Python is number two for the language of most active GitHub repositories, non-trivial ones.

00:29:03.680 --> 00:29:05.280
JavaScript being ahead of it.

00:29:05.280 --> 00:29:07.240
But I think JavaScript's over-counted, right?

00:29:07.240 --> 00:29:09.940
Like, if you do Django, you're also a JavaScript developer.

00:29:09.940 --> 00:29:12.300
If you do Flask or Pyramid, you're a JavaScript developer.

00:29:12.500 --> 00:29:15.180
If you do Ruby on Rails, you're a JavaScript developer, right?

00:29:15.180 --> 00:29:16.500
Like, you can't avoid JavaScript.

00:29:16.500 --> 00:29:17.000
Yeah.

00:29:17.000 --> 00:29:21.260
For better or for worse, JavaScript is the lingua franca of the web, right?

00:29:21.260 --> 00:29:24.280
I mean, that's, everyone's browser speaks JavaScript.

00:29:24.280 --> 00:29:24.880
Yeah.

00:29:24.880 --> 00:29:29.200
And the thing that I think is interesting about that is, like, how much does that skew these statistics?

00:29:29.200 --> 00:29:35.020
Like, JavaScript being on the top all the time, is that because it's pervasive everywhere, so you just have to have it?

00:29:35.020 --> 00:29:39.440
Or is it really JavaScript is so much in demand as its own individual thing?

00:29:39.440 --> 00:29:41.240
I don't know the answer to that.

00:29:41.240 --> 00:29:41.680
Yeah.

00:29:41.680 --> 00:29:47.020
I mean, anecdotally, I think I searched for Node as I was looking in those hacker news posts.

00:29:47.020 --> 00:29:49.300
And I don't think Node appeared as much as Python.

00:29:49.300 --> 00:29:52.580
So maybe there's some solace in that.

00:29:52.580 --> 00:29:53.520
Yeah, sure.

00:29:53.520 --> 00:29:55.840
Server-side JavaScript versus client-side, something like that.

00:29:55.840 --> 00:30:02.100
So you said you think that the way people pursue jobs these days is somewhat broken.

00:30:02.100 --> 00:30:03.660
What do you mean by that?

00:30:03.920 --> 00:30:14.100
As, you know, the leader or the, not the leader, I guess the person who ran the user group and someone whose people come up to me and say, hey, I want to get a job.

00:30:14.100 --> 00:30:15.480
How do I get a job?

00:30:15.480 --> 00:30:26.140
It seems that, you know, emailing some jobs at randomcompany.com and dropping your resume there is probably the worst way to get a job.

00:30:26.140 --> 00:30:31.300
I sort of speak from experience of, like, there's got to be a better way to do it.

00:30:31.300 --> 00:30:43.900
And it seems like a lot of times people who are interested in development and whatnot are also the more introverted type or don't want to sort of put themselves out there.

00:30:43.900 --> 00:30:44.340
Yeah.

00:30:44.340 --> 00:30:50.940
And whatever that means, you know, it's just hard for people to feel vulnerable, I guess.

00:30:50.940 --> 00:30:53.640
And so you can randomly send off.

00:30:53.640 --> 00:30:53.980
Yeah.

00:30:53.980 --> 00:30:57.020
Like, go give a talk at your meetups.

00:30:57.020 --> 00:31:00.900
Write a, create a blog and consistently write for it.

00:31:00.900 --> 00:31:02.760
Create open source projects.

00:31:02.760 --> 00:31:04.240
Speak at conferences.

00:31:04.660 --> 00:31:09.280
All of these things, you know, carry some inhibitions with them, right?

00:31:09.280 --> 00:31:09.680
Yeah.

00:31:09.680 --> 00:31:11.360
And it can be hard, right?

00:31:11.360 --> 00:31:17.780
I mean, the internet can be a ruthless place where, you know, if you're out there, you're going to get trolled or whatnot.

00:31:18.160 --> 00:31:22.880
And so that can be pretty daunting for a lot of people.

00:31:22.880 --> 00:31:29.600
My advice to people has consistently been, though, the best way to get a job is to network.

00:31:29.600 --> 00:31:34.260
And you can, you know, try and not do that.

00:31:34.260 --> 00:31:40.480
But your job search is going to be less effective than it could be otherwise if you're not out there networking.

00:31:40.980 --> 00:31:55.240
Well, I want to hear what you, what you mean by networking, but I'm going to add that I feel like the experience with the companies that I've worked for, when we go to hire somebody, has largely been, let's try to find somebody.

00:31:55.240 --> 00:32:00.200
And if we have to, we'll post a public job listing and people can submit their resumes.

00:32:00.200 --> 00:32:01.880
But that's like a last resort.

00:32:01.880 --> 00:32:02.520
Yeah.

00:32:02.520 --> 00:32:03.580
And so.

00:32:03.580 --> 00:32:04.060
Yeah.

00:32:04.240 --> 00:32:16.380
There's like, like sort of these dark matter jobs, which make up the majority of, of like getting, moving around and getting going in programming jobs where it's like, I know Sarah, she's an awesome programmer.

00:32:16.380 --> 00:32:17.860
Like she can really do this.

00:32:17.860 --> 00:32:18.680
Let's just talk to her.

00:32:18.680 --> 00:32:19.320
Like, oh, great.

00:32:19.320 --> 00:32:20.500
We don't have to interview anybody.

00:32:20.500 --> 00:32:22.140
Sarah's in, right?

00:32:22.140 --> 00:32:24.760
Like that sort of thing happens a lot.

00:32:24.760 --> 00:32:29.660
And so you've got to get out there and be present with these people, right?

00:32:29.660 --> 00:32:30.860
So what do you mean by networking though?

00:32:31.000 --> 00:32:31.160
Yeah.

00:32:31.160 --> 00:32:40.020
I mean, I agree with you a hundred percent in that a lot of these finding a job or hiring people is expensive for a company as well.

00:32:40.020 --> 00:32:49.880
And unless you're the Google type who are going to have some process where they churn and they're okay with rejecting good people because they just don't want to hire bad people.

00:32:49.880 --> 00:32:53.520
Not every, you know, most companies aren't, aren't that way.

00:32:53.520 --> 00:32:54.320
And so.

00:32:54.320 --> 00:32:55.520
You just don't have the scale, right?

00:32:55.520 --> 00:32:58.820
To go through, we can't hire a hundred new people and keep 50 of them.

00:32:58.820 --> 00:33:00.220
Like that just doesn't work.

00:33:00.320 --> 00:33:00.520
Yeah.

00:33:00.520 --> 00:33:08.180
And, and a lot of companies, like you said, have positions and don't want, they'd rather just go through people they know and, and hire it that way.

00:33:08.180 --> 00:33:10.080
Cause it's a lot cheaper and a lot easier.

00:33:10.080 --> 00:33:12.040
And it's, they know what they're getting.

00:33:12.700 --> 00:33:20.560
And so I think networking there, you know, you can call it various things, but it doesn't have to be necessarily work related.

00:33:20.560 --> 00:33:23.180
I guess I, you know, there's meetups and whatnot.

00:33:23.180 --> 00:33:24.400
And it's interesting.

00:33:24.400 --> 00:33:30.680
You go to like a meetup and like the Utah meetup every time they start off with, okay, who's hiring?

00:33:30.680 --> 00:33:33.920
And there'll be, you know, a handful of people who stand up and say, this is what we're hiring for.

00:33:33.920 --> 00:33:37.500
And you can go up and talk to them and sort of figure out what they're doing.

00:33:37.720 --> 00:33:40.760
And also there's a handful, they say, who needs a job?

00:33:40.760 --> 00:33:43.960
And there are a handful of people who stand up and say, this is what I'm looking for.

00:33:43.960 --> 00:33:49.120
And there's connections that are made there, which is a lot better than randomly sending an email.

00:33:49.120 --> 00:33:52.100
But I would sort of even go further.

00:33:52.100 --> 00:33:54.400
Like networking doesn't even have to be like this.

00:33:54.400 --> 00:33:54.900
Okay.

00:33:54.900 --> 00:33:56.760
I need to go talk about code.

00:33:56.760 --> 00:34:02.780
I, when I lived in the Bay area, I played ultimate Frisbee a lot.

00:34:02.780 --> 00:34:10.360
And so, you know, I played a game down in Palo Alto with their VCs playing in that game.

00:34:10.360 --> 00:34:14.300
And I played a game that was a block away from the Apple campus.

00:34:14.300 --> 00:34:16.860
And I played in a league down there.

00:34:16.860 --> 00:34:23.100
And you think about, this is back in the early 2000s, but like all the big companies, the Oracles

00:34:23.100 --> 00:34:29.060
and the IBMs and Microsoft and Google, like I knew people at all those companies just from

00:34:29.060 --> 00:34:34.560
playing Frisbee and networking doesn't have to be like drudgery.

00:34:34.560 --> 00:34:40.340
It can be something in sports, you know, here in Utah, there's a bunch of geeks who go

00:34:40.340 --> 00:34:43.820
skiing, you know, backcountry skiing and will go skiing before work.

00:34:43.820 --> 00:34:45.160
It can be church.

00:34:45.160 --> 00:34:52.580
If you're involved in a church group or whatnot, or school or conferences and meetups are sort

00:34:52.580 --> 00:34:58.360
of what people classically think of as networking, but it doesn't have to be limited to sort of

00:34:58.360 --> 00:34:59.820
technical pursuits per se.

00:34:59.820 --> 00:35:00.300
Yeah.

00:35:00.300 --> 00:35:02.660
If you're really bold, you could put on something, right?

00:35:02.660 --> 00:35:06.060
Like the data science hiking group or something, right?

00:35:06.540 --> 00:35:06.820
Yeah.

00:35:06.820 --> 00:35:10.880
And maybe in Silicon Valley, the odds are that, you know, you're playing Frisbee.

00:35:10.880 --> 00:35:16.080
Someone in Palo Alto, it's pretty, pretty high odds that someone there or most of the people

00:35:16.080 --> 00:35:20.700
there are going to be like some, have some tech related job or whatnot.

00:35:20.700 --> 00:35:26.880
But even here in Utah, I'm involved in Frisbee groups here and there I've seen jobs.

00:35:26.880 --> 00:35:29.100
People have gotten jobs by playing Frisbee.

00:35:29.100 --> 00:35:30.920
So put yourself out there.

00:35:30.920 --> 00:35:31.200
Yeah.

00:35:31.200 --> 00:35:35.420
You might have a master's degree, but the thing that really did it was that, ultimate Frisbee

00:35:35.420 --> 00:35:37.880
game that could be a culture fit for some people.

00:35:37.880 --> 00:35:38.480
Yeah, for sure.

00:35:38.480 --> 00:35:44.420
I feel like there's sort of two different groups, like getting into the programming space is a

00:35:44.420 --> 00:35:45.780
huge step change.

00:35:45.780 --> 00:35:52.440
Like to go from, no, I've, I have no experience to like, I have my first job seems really pretty

00:35:52.440 --> 00:35:54.460
challenging and like a big step.

00:35:54.460 --> 00:35:58.800
And then it feels to me like once you're kind of in the door, people are like, oh, you can

00:35:58.800 --> 00:35:59.180
program.

00:35:59.180 --> 00:36:01.580
We need programmers to some degree, right?

00:36:01.580 --> 00:36:02.000
Yeah.

00:36:02.160 --> 00:36:05.720
So what advice, especially do you have for like the people on there trying to make that

00:36:05.720 --> 00:36:06.260
first step?

00:36:06.260 --> 00:36:11.080
I talked to a lot of people who come from maybe a QA or they're doing tech support or something

00:36:11.080 --> 00:36:12.400
and they want to get into programming.

00:36:12.400 --> 00:36:18.160
And I think if you want to get into programming, the thing that you need to show is you need

00:36:18.160 --> 00:36:20.140
to show that you can program.

00:36:20.560 --> 00:36:27.060
And so that might be taking some project and sort of implementing it from end to end, or

00:36:27.060 --> 00:36:33.320
that might be going to some coding bootcamp and figuring out that, yeah, I can do all this

00:36:33.320 --> 00:36:35.860
stuff and have something to show after it.

00:36:35.860 --> 00:36:39.640
But you need to have something that allows you to get a foot in the door.

00:36:39.780 --> 00:36:43.460
And after that, you know, if you've got a foot in the door and you're sort of legitimate,

00:36:43.460 --> 00:36:46.280
then you shouldn't have a problem.

00:36:46.280 --> 00:36:52.960
But getting that first little project or it can be a challenge for a lot of people.

00:36:52.960 --> 00:36:53.320
Yeah.

00:36:53.320 --> 00:36:58.020
You know, one of the things people often ask me, I got a question today from somebody,

00:36:58.020 --> 00:37:04.280
a listener saying, look, I know I want to get into programming in Python and I have some

00:37:04.280 --> 00:37:08.400
experience, but I'm like you said, I'm coming from some slightly, slightly different area.

00:37:08.400 --> 00:37:10.280
What should I learn?

00:37:10.280 --> 00:37:10.920
Right?

00:37:10.920 --> 00:37:13.120
Like, should I learn web development?

00:37:13.120 --> 00:37:14.480
Should I learn databases?

00:37:14.480 --> 00:37:15.640
Should I learn data science?

00:37:15.640 --> 00:37:16.740
Like, what should I learn?

00:37:16.740 --> 00:37:18.020
What would you tell that person?

00:37:18.020 --> 00:37:20.200
Assuming it's restricted to Python somehow.

00:37:20.200 --> 00:37:21.580
It's restricted to Python.

00:37:21.580 --> 00:37:22.740
What should they learn in Python?

00:37:22.740 --> 00:37:23.240
Yeah.

00:37:23.240 --> 00:37:23.500
Yeah.

00:37:23.500 --> 00:37:26.300
Like that a standard Python developer might do.

00:37:26.300 --> 00:37:26.880
Yeah.

00:37:26.880 --> 00:37:29.100
Or data scientists using Python might do.

00:37:29.100 --> 00:37:29.480
Yeah.

00:37:29.480 --> 00:37:32.240
I talk about that a lot in my courses.

00:37:32.240 --> 00:37:37.700
It's like one of the big draws of Python is that it's not basically limited to development,

00:37:37.700 --> 00:37:38.160
right?

00:37:38.160 --> 00:37:42.820
I mean, you have these data scientists who are determining what ads we click on and whatnot.

00:37:42.820 --> 00:37:48.220
And a lot of them aren't classical programmers per se, but they're using Python.

00:37:48.220 --> 00:37:53.840
That's Jupyter notebook and Python tooling and day in and day out.

00:37:53.840 --> 00:37:56.800
And a lot of the DevOps type stuff as well.

00:37:56.800 --> 00:38:01.060
You know, with like SaltStack, these people aren't programmers either.

00:38:01.060 --> 00:38:03.280
They're more DevOps type.

00:38:03.280 --> 00:38:06.040
And there's a lot of Python in that world as well.

00:38:06.140 --> 00:38:10.760
I personally trained a lot of people specifically to use Python.

00:38:10.760 --> 00:38:13.480
And that's what they're using it for.

00:38:13.480 --> 00:38:22.820
So I think pigeonholing Python into just for strictly programmers maybe does a disservice to that, right?

00:38:22.820 --> 00:38:23.480
Yeah, I agree.

00:38:23.720 --> 00:38:27.540
One of the big draws of the language is that it's so flexible.

00:38:27.540 --> 00:38:35.300
And if you think of Ruby, you think of like Rails and you think of like PHP, you think of the web or you think of R and you think of data science.

00:38:36.000 --> 00:38:42.440
But Python sort of has communities and groups that are sort of in all those camps.

00:38:42.440 --> 00:38:47.320
And, you know, it's not just a breadth thing, but it's pretty deep as well.

00:38:47.320 --> 00:38:48.780
There's deep tools in Python.

00:38:48.780 --> 00:38:57.280
So I think someone's got to figure out, you know, if they want to be a programmer, yeah, that you can go down that programming route in Python.

00:38:57.280 --> 00:39:06.480
But there are other avenues for making a living using Python that don't necessarily require that your title be software engineer.

00:39:06.480 --> 00:39:08.520
Yeah, I think that's a pretty good point.

00:39:08.520 --> 00:39:11.520
I threw it out there super vague because that's the way I always get it, right?

00:39:11.520 --> 00:39:16.480
But I feel like people have to decide, like, what general direction you want to go?

00:39:16.480 --> 00:39:17.500
Do you want to do web development?

00:39:17.500 --> 00:39:20.280
Okay, then I can tell you what you probably need to work on.

00:39:20.280 --> 00:39:21.160
You want to do DevOps?

00:39:21.160 --> 00:39:22.540
I can tell you what you need to work on.

00:39:22.540 --> 00:39:23.500
You want to do data science?

00:39:23.500 --> 00:39:24.060
Same.

00:39:24.060 --> 00:39:27.660
But if you just say, I want to do Python, what do I do?

00:39:27.660 --> 00:39:31.100
Like, it's not quite differentiated enough to really decide, right?

00:39:31.100 --> 00:39:31.720
Yeah.

00:39:31.720 --> 00:39:38.060
I mean, I guess I would say if you want to do Python, then mobile apps is probably what you don't want to do, right?

00:39:38.060 --> 00:39:40.920
Or 3D games is probably what you don't want to do.

00:39:40.920 --> 00:39:41.260
Yeah.

00:39:41.260 --> 00:39:44.900
Although, you know, you say that and I probably would have said the same thing.

00:39:44.900 --> 00:39:52.560
But, I mean, they've got all the process pipelining stuff done in Python for even the big game shops, right?

00:39:52.780 --> 00:39:54.360
I mean, obviously, you wouldn't write the game in Python.

00:39:54.360 --> 00:39:54.780
Yeah.

00:39:54.780 --> 00:39:55.660
No, no, that's true.

00:39:55.660 --> 00:39:58.240
Python is in a great place right now.

00:39:58.240 --> 00:40:03.760
And it's, you'd be, I'm not you, but I mean, it's amazing at all the places they're using Python.

00:40:03.760 --> 00:40:05.400
Yeah, for sure it is.

00:40:05.400 --> 00:40:11.360
I also feel like people don't often enough take, like, what is their specialty and think,

00:40:11.460 --> 00:40:16.200
how can I take my specialty plus Python and make it, like, supercharged, right?

00:40:16.200 --> 00:40:17.200
Like, do you know biology?

00:40:17.200 --> 00:40:26.580
Find a way to work with biologists where, like, they're totally missing the game of, like, having automation and computers solve their problems.

00:40:26.580 --> 00:40:27.160
Yeah.

00:40:27.240 --> 00:40:31.140
Or if you're in finance or if you're whatever, you know, like, like, how do you put those together?

00:40:31.140 --> 00:40:32.760
Because that'll give you a huge boost, I think.

00:40:32.760 --> 00:40:33.020
Yeah.

00:40:33.020 --> 00:40:49.940
And a lot of, like, when you read data science career type things, it's like some people are of the opinion that it's easier to take someone who has domain knowledge and sort of make them, give them data science skills than the reverse of, like, giving someone who has data science skills domain knowledge in some specific niche.

00:40:50.100 --> 00:40:50.300
Yeah.

00:40:50.300 --> 00:40:52.540
I think I agree with that for the most part.

00:40:52.540 --> 00:40:56.780
You know, two random people, not maybe some expert programmer, right?

00:40:56.780 --> 00:40:57.060
Yeah.

00:40:57.060 --> 00:40:57.220
Who knows?

00:40:57.220 --> 00:41:01.240
This portion of Talk Python To Me is brought to you by Hired.

00:41:01.240 --> 00:41:04.640
Hired is the platform for top Python developer jobs.

00:41:04.640 --> 00:41:10.100
Create your profile and instantly get access to thousands of companies who will compete to work with you.

00:41:10.100 --> 00:41:13.340
Take it from one of Hired's users who recently got a job and said,

00:41:13.340 --> 00:41:17.280
I had my first offer within four days and I ended up getting eight offers in total.

00:41:17.580 --> 00:41:20.480
I've worked with recruiters in the past, but they were pretty hit and miss.

00:41:20.480 --> 00:41:23.320
I tried LinkedIn, but I found Hired to be the best.

00:41:23.320 --> 00:41:27.520
I really like knowing the salary up front and privacy was also a huge seller for me.

00:41:27.520 --> 00:41:29.540
Well, that sounds pretty awesome, doesn't it?

00:41:29.540 --> 00:41:31.400
But wait until you hear about the signing bonus.

00:41:31.400 --> 00:41:34.960
Everyone who accepts a job from Hired gets a $300 signing bonus.

00:41:34.960 --> 00:41:37.960
And as Talk Python listeners, it gets even sweeter.

00:41:37.960 --> 00:41:43.340
Use the link talkpython.fm/Hired and Hired will double the signing bonus to $600.

00:41:43.340 --> 00:41:45.420
Opportunity is knocking.

00:41:45.820 --> 00:41:49.120
Visit talkpython.fm/Hired and answer the door.

00:41:49.160 --> 00:42:07.320
I guess the takeaway is like really the thing that carries the weight in all of this is people who hire programmers hire them because they have proof or they can show experience of actually doing the thing.

00:42:07.320 --> 00:42:09.740
Unlike so many other jobs, right?

00:42:09.740 --> 00:42:11.520
Where like I have a business degree.

00:42:11.520 --> 00:42:14.840
Well, I must be great at running businesses because it came from a good school.

00:42:14.840 --> 00:42:16.000
So you're hired, right?

00:42:16.000 --> 00:42:19.300
No, you have to show that I can do these things.

00:42:19.300 --> 00:42:27.220
And so building up stuff for that proof in advance over time, like not the week before you want to try this, right?

00:42:27.260 --> 00:42:30.600
But like have a GitHub repository with as much interesting things you can do.

00:42:30.600 --> 00:42:32.000
Contribute to open source projects.

00:42:32.000 --> 00:42:33.020
Write a blog.

00:42:33.020 --> 00:42:34.000
Work on things, right?

00:42:34.000 --> 00:42:40.500
Like build this up because those are hard to sort of do all at once and make that not seem like you just threw it together.

00:42:40.500 --> 00:42:40.820
Yeah.

00:42:40.820 --> 00:42:46.520
You see young, I say young people like teenagers who have contributed to repositories and get jobs.

00:42:46.660 --> 00:42:53.320
And so it's not like you have to spend years doing this sort of thing, but you know, you do have to show that you can do it.

00:42:53.320 --> 00:42:53.660
Right.

00:42:53.660 --> 00:43:06.480
And I think another skill that is pretty essential is that you, especially if you're starting out, is that you have the aptitude and ability to like learn and are sort of willing to be taught.

00:43:06.480 --> 00:43:13.080
Because a lot of stuff that, you know, even that I'm using today, this stuff didn't exist a few years ago.

00:43:13.080 --> 00:43:16.740
So it's sort of constant churn of learning new things.

00:43:16.740 --> 00:43:17.040
Yeah.

00:43:17.040 --> 00:43:19.200
If you don't want to learn new things, you're going to hate this job.

00:43:19.200 --> 00:43:20.320
Yeah.

00:43:20.320 --> 00:43:23.560
Speaking of jobs, let's talk about your job.

00:43:23.560 --> 00:43:29.700
You're working on a startup based on Python and I'm always excited about businesses running on Python.

00:43:29.700 --> 00:43:32.060
So let's talk about what you guys are doing there a little bit.

00:43:32.060 --> 00:43:32.600
Yeah.

00:43:32.600 --> 00:43:34.080
Startups called Far Better.

00:43:34.080 --> 00:43:35.460
And what's the URL?

00:43:35.460 --> 00:43:37.440
Farbetter.com.

00:43:37.440 --> 00:43:39.980
F-A-R-B-E-T-T-E-R.

00:43:39.980 --> 00:43:44.420
And there's a little video there that explains the basic gist of it.

00:43:44.420 --> 00:43:55.000
But hopefully we're just finishing putting the dots in the I's and crossing the T's and get something out to our beta users here pretty soon.

00:43:55.000 --> 00:44:02.360
But again, the idea here is that, you know, I've done a lot of traveling and traveling is somewhat annoying.

00:44:02.560 --> 00:44:09.440
You know, if I want to go to the Bay Area, it says where you're what airport you're flying out of, what airport are you flying into.

00:44:10.020 --> 00:44:12.200
And in the Bay Area, there are three different airports.

00:44:12.200 --> 00:44:15.720
And I don't really actually care which airport.

00:44:15.720 --> 00:44:18.100
I care what's the most convenient for me.

00:44:18.100 --> 00:44:23.700
And so we think we've got a pretty good UE where we just say, where do you want to go and when you need to be there?

00:44:23.700 --> 00:44:25.020
Don't even worry about the airport.

00:44:25.720 --> 00:44:32.640
And we go out and figure out what the inventory is, what the nearest airports are to you and to where you're going.

00:44:32.640 --> 00:44:36.600
And then we sort of figure out all the different combinations.

00:44:36.600 --> 00:44:52.580
And we take advantage of AWS and figure out based on your preferences, what would be the best trip for you based on, you know, if you're a Delta person or I guess Delta is the good airline these days.

00:44:52.580 --> 00:44:54.620
Well, I shouldn't be brand sensitive.

00:44:54.620 --> 00:44:58.100
But, you know, based on your priorities, right?

00:44:58.480 --> 00:44:59.080
But it does.

00:44:59.080 --> 00:45:02.260
Yeah, it does matter which one, because a lot of times you have frequent flyer miles.

00:45:02.260 --> 00:45:04.300
You might get a free upgrade on one and not the other.

00:45:04.300 --> 00:45:09.640
If you fly a lot, you care that you're not stuck onto like some cheapo thing.

00:45:09.640 --> 00:45:15.120
We're based on, you know, the idea here is that business travelers are going to fly once or more a month.

00:45:15.120 --> 00:45:18.200
And business travelers actually are really brand sensitive.

00:45:18.200 --> 00:45:21.500
So they want to get their trip to Hawaii at the end of the year.

00:45:21.500 --> 00:45:25.880
And I want to fly Delta or whatever airline every time if I can.

00:45:26.300 --> 00:45:38.540
But, you know, if I'm going to miss that, if I'm not going to make that deal because another airline, because I have a layover, maybe I'll take the direct flight, even if it's off brand, because I'll get the million dollar deal or whatnot.

00:45:38.540 --> 00:45:39.060
Right.

00:45:39.060 --> 00:45:42.260
And so schedule could trump that.

00:45:42.260 --> 00:45:52.040
And so we've got a system written in Python that in under a minute will figure out a customized itinerary based on your preferences.

00:45:52.360 --> 00:45:53.800
So it's pretty cool.

00:45:53.800 --> 00:45:58.800
And it's kind of fun to see something come together like that.

00:45:58.800 --> 00:46:03.920
And it's gratifying to after working on something for a while, actually see it come out.

00:46:03.920 --> 00:46:05.720
Yeah, that sounds like a really cool project.

00:46:05.720 --> 00:46:11.220
And you said originally it was written in Clojure and then you guys have converted it to Python 3, right?

00:46:11.220 --> 00:46:28.220
Originally it was written in Clojure and we implemented it and did a microservice style of architecture there, which I think was great and was probably super scalable and whatnot.

00:46:28.220 --> 00:46:31.720
But the problem was the engineers weren't scaling.

00:46:32.260 --> 00:46:39.080
And so, you know, with two engineers and having half a dozen or more microservices, it's kind of hard to keep track of everything.

00:46:39.080 --> 00:46:56.440
And having 15 plus years of Python experience and less than that of Clojure experience, we decided that let's simplify this a little bit, keep it simple and start from scratch and take advantage of Python.

00:46:56.440 --> 00:47:01.260
And we've taken advantage of the async stuff in 3.6 and that's pretty cool.

00:47:01.260 --> 00:47:06.780
And I think our only regret is that we didn't port to Python a little bit earlier.

00:47:06.780 --> 00:47:07.620
Yeah, sure.

00:47:07.620 --> 00:47:08.720
Well, that sounds really interesting.

00:47:08.720 --> 00:47:18.300
You said that you had a bunch of microservices and you've actually like condensed that down to a Django app plus AWS Lambda.

00:47:18.300 --> 00:47:19.040
Yeah.

00:47:19.220 --> 00:47:20.780
And I'm seeing this as a trend.

00:47:20.780 --> 00:47:23.540
I think it's happening quite a bit.

00:47:23.540 --> 00:47:31.840
I mean, the idea of microservices was we're going to take some big monolithic app and break it into these little bits of functionality.

00:47:31.840 --> 00:47:34.440
Like maybe here's the thing that charges the credit card.

00:47:34.440 --> 00:47:35.200
That's a service.

00:47:35.200 --> 00:47:37.380
And here's the thing that does login.

00:47:37.380 --> 00:47:40.420
And here's the thing that, you know, creates a user or whatever.

00:47:40.420 --> 00:47:44.060
And these are like little services that you piece together in your app.

00:47:45.120 --> 00:47:47.160
But now we have things like Lambda.

00:47:47.160 --> 00:47:47.820
Yeah.

00:47:47.820 --> 00:47:50.420
You want to talk about the trade-offs and how that's working?

00:47:50.420 --> 00:47:50.820
Yeah.

00:47:50.820 --> 00:47:52.880
The serverless architecture, I guess.

00:47:52.880 --> 00:47:53.760
Or I don't know.

00:47:53.760 --> 00:47:57.020
Maybe I think someone called it milli-services now instead of micro.

00:47:57.020 --> 00:47:58.840
But yeah.

00:47:58.840 --> 00:48:02.780
I mean, again, it comes back to the point of like you've always got to be learning.

00:48:02.780 --> 00:48:06.460
Like this Lambda stuff when we started this project didn't exist.

00:48:06.460 --> 00:48:08.840
And so it wasn't really an option.

00:48:08.840 --> 00:48:10.760
But it is now.

00:48:10.760 --> 00:48:11.420
And it...

00:48:11.420 --> 00:48:12.900
Maybe tell people what Lambda is really quick.

00:48:13.020 --> 00:48:13.240
Yeah.

00:48:13.240 --> 00:48:19.540
So if you're not familiar with Lambda, it's basically a way to expose a function and scale

00:48:19.540 --> 00:48:25.780
out a function where you can say, I'm going to let you run 100 versions of this function

00:48:25.780 --> 00:48:28.260
at the same time and pull back the answers.

00:48:28.260 --> 00:48:32.240
And you don't have to necessarily start up 100 VMs or whatnot.

00:48:32.240 --> 00:48:34.460
Amazon takes care of that for you.

00:48:34.460 --> 00:48:38.820
You just tell it what function you want to run and you can call it, depending on what your

00:48:38.820 --> 00:48:42.860
service level agreement is, X number of times concurrently.

00:48:42.860 --> 00:48:44.380
So it makes so much sense to me.

00:48:44.380 --> 00:48:48.880
I mean, with microservices, while it's cool to break your stuff up into these small pieces,

00:48:48.880 --> 00:48:53.760
you really end up with like 10 little servers to babysit and manage and configure.

00:48:53.760 --> 00:48:54.260
Yeah.

00:48:54.260 --> 00:48:56.440
Like many of them are down like charge credit card.

00:48:56.440 --> 00:48:57.440
Well, like that's a function.

00:48:57.440 --> 00:49:01.920
Maybe we could just make it a function that runs like magically on AWS, right?

00:49:02.040 --> 00:49:02.240
Yeah.

00:49:02.240 --> 00:49:07.480
And, you know, one of the nice things about Lambda is that it supports Python out of the

00:49:07.480 --> 00:49:07.760
box.

00:49:07.760 --> 00:49:15.460
And up till last week or two weeks ago, it was Python 2, but they recently now support Python

00:49:15.460 --> 00:49:16.180
3.6.

00:49:16.180 --> 00:49:20.680
So I think you have Python, Java and .NET.

00:49:20.680 --> 00:49:25.840
So pretty limited choices there, but we're good with Python there.

00:49:25.840 --> 00:49:27.340
And it's pretty cool.

00:49:27.540 --> 00:49:34.340
So, you know, the architecture of this app has changed, but it's radically been simplified,

00:49:34.340 --> 00:49:38.080
but it still scales out, which is pretty cool.

00:49:38.080 --> 00:49:38.700
That's cool.

00:49:38.700 --> 00:49:43.140
And how much like supporting infrastructure can you have on Lambda?

00:49:43.140 --> 00:49:46.820
Like I haven't really tried to use it in, you know, in anger, right?

00:49:46.820 --> 00:49:53.940
Like if I've got like say pandas or I've got, you know, SQLAlchemy and I want to talk to

00:49:53.940 --> 00:49:58.620
RDS or, you know, like how much like foundational dependencies can you ship up there?

00:49:58.620 --> 00:50:06.160
I think there's a limit of, I want to say like a hundred megabytes of how much you can pack

00:50:06.160 --> 00:50:07.120
up into a function.

00:50:07.120 --> 00:50:09.000
Don't quote me on that.

00:50:09.040 --> 00:50:14.480
But basically, since we're developing on Mac, you've got to basically take a Docker image

00:50:14.480 --> 00:50:20.620
and then get all of the dependencies in that Docker image and then zip that up and then send

00:50:20.620 --> 00:50:24.560
that tarball or zip file up to, up to AWS.

00:50:25.080 --> 00:50:29.980
And so there's some work in, in doing that, unless it's pure Python, right?

00:50:29.980 --> 00:50:35.540
If you, if you want to take advantage of like pandas or something, you've got to use a Linux

00:50:35.540 --> 00:50:42.480
version and not any random, you know, Mac or Windows version because AWS isn't running on

00:50:42.480 --> 00:50:42.820
that.

00:50:42.820 --> 00:50:44.160
Yeah.

00:50:44.160 --> 00:50:46.200
I'd be surprised if they had Macs back there somewhere.

00:50:46.200 --> 00:50:48.020
Not likely.

00:50:48.020 --> 00:50:48.940
Yeah.

00:50:48.940 --> 00:50:49.940
Probably not going to happen.

00:50:49.940 --> 00:50:50.940
No, probably not.

00:50:50.940 --> 00:50:52.700
Very interesting.

00:50:52.700 --> 00:50:54.800
So this whole architecture is working out for you though.

00:50:54.800 --> 00:50:58.180
like sort of consolidating a little bit and just going in like all these little microservices,

00:50:58.180 --> 00:50:59.900
these are now Lambda functions.

00:50:59.900 --> 00:51:00.880
We're going to push those out.

00:51:00.880 --> 00:51:01.240
Yeah.

00:51:01.240 --> 00:51:04.100
Does the rest of your app also run in like an EC2 or something like that?

00:51:04.100 --> 00:51:04.460
Mm-hmm.

00:51:04.460 --> 00:51:10.540
We've got the elastic load balancer in front and then we've got the Django app that's stateless

00:51:10.540 --> 00:51:14.460
and then we've got DynamoDB on our backend.

00:51:14.460 --> 00:51:23.260
And so it's been very simplified and you've got JSON sort of talking over the place and, but

00:51:23.260 --> 00:51:25.640
it does the job and it's pretty cool.

00:51:25.640 --> 00:51:26.000
That's cool.

00:51:26.000 --> 00:51:27.120
What do you think of DynamoDB?

00:51:27.120 --> 00:51:35.020
And that's one of the more extreme cloud hosted NoSQL databases I would say if I describe it.

00:51:35.020 --> 00:51:35.500
Yeah.

00:51:35.500 --> 00:51:41.140
I have sort of mixed feelings about AWS and that like there's a huge amount of vendor lock-in,

00:51:41.140 --> 00:51:44.380
which is good for Amazon, right?

00:51:44.440 --> 00:51:46.360
because you get sort of gets sucked in there.

00:51:46.360 --> 00:51:52.460
But, you know, if you have, if you can take advantage of their functionality and it works for you,

00:51:52.460 --> 00:51:53.620
you should do that.

00:51:53.620 --> 00:51:57.020
And not everything needs to be in the relational database.

00:51:57.020 --> 00:52:01.460
So I think it just sort of depends on what your architecture is.

00:52:01.460 --> 00:52:01.780
Sure.

00:52:02.780 --> 00:52:03.180
Yeah.

00:52:03.180 --> 00:52:07.380
I share your concerns with the lock-in and these cloud platforms as well.

00:52:07.380 --> 00:52:14.640
I mean, they're even more lock-in than OSs in some ways, which is kind of crazy, but yeah,

00:52:14.640 --> 00:52:19.100
it's going to be an interesting world in 10 or 20 years when there's a few of these giant things that

00:52:19.100 --> 00:52:20.160
just run everything.

00:52:20.160 --> 00:52:20.680
Yeah.

00:52:21.160 --> 00:52:26.320
I imagine that like this serverless, I imagine Google would probably come out with something

00:52:26.320 --> 00:52:29.560
if they haven't already or, you know, there'll be competition there.

00:52:29.560 --> 00:52:35.480
But it seems like Amazon, everyone's just sort of following Amazon and can't really compete

00:52:35.480 --> 00:52:37.180
with this giant behemoth right now.

00:52:37.180 --> 00:52:39.380
But competition's good.

00:52:39.380 --> 00:52:43.780
So hopefully, hopefully there'll be some competition and that will keep everyone in check.

00:52:43.780 --> 00:52:44.380
I hope so.

00:52:44.380 --> 00:52:44.800
I hope so.

00:52:44.800 --> 00:52:46.100
All right.

00:52:46.100 --> 00:52:50.760
Well, we're getting a little bit short on time, so I guess we should probably leave it there.

00:52:50.820 --> 00:52:51.560
But that sounds fun.

00:52:51.560 --> 00:52:55.240
I guess one more question, like what kind of machine learning, data science, AI stuff

00:52:55.240 --> 00:52:56.820
you got going on to make that happen there?

00:52:56.820 --> 00:53:02.260
Basic idea is that we've spent a lot of time making a mathematical model that represents a

00:53:02.260 --> 00:53:04.720
trip, which isn't necessarily trivial.

00:53:04.720 --> 00:53:12.500
And then throwing a bunch of computing power at going through that search space and figuring

00:53:12.500 --> 00:53:15.780
out based on your preferences what those best trips are.

00:53:15.780 --> 00:53:19.720
You know, over time, we want to put some machine learning into that and saying, you know,

00:53:19.780 --> 00:53:24.460
you said that brand was really important to you, but it turned out the cost was really

00:53:24.460 --> 00:53:25.200
important to you.

00:53:25.200 --> 00:53:30.700
So we're going to, you know, on the back end, tweak your preferences based on what you're

00:53:30.700 --> 00:53:31.300
really doing.

00:53:31.300 --> 00:53:31.580
Right.

00:53:31.580 --> 00:53:35.720
You say this matters more, but you're not actually behaving that way, right?

00:53:35.720 --> 00:53:36.040
Yeah.

00:53:36.040 --> 00:53:39.220
Based on behavior and not what you think your behavior is.

00:53:39.220 --> 00:53:41.220
But we're not there yet.

00:53:41.220 --> 00:53:42.380
No, it sounds really cool.

00:53:42.380 --> 00:53:42.560
Yeah.

00:53:42.560 --> 00:53:46.120
I don't want to don't want you to spill the secret sauce, but it's cool to hear what you're

00:53:46.120 --> 00:53:46.280
doing.

00:53:46.280 --> 00:53:46.660
Yeah.

00:53:46.860 --> 00:53:47.300
All right, Matt.

00:53:47.300 --> 00:53:48.560
So final two questions.

00:53:48.560 --> 00:53:49.140
Okay.

00:53:49.140 --> 00:53:52.420
If you're going to write some Python code, what editor do you open up?

00:53:52.420 --> 00:53:57.440
I use Emacs and I'm currently using the Space Max variant of that.

00:53:57.440 --> 00:54:04.540
So, I mean, I've used that since late nineties and I guess you can pry it from my cold dead

00:54:04.540 --> 00:54:05.500
fingers or whatever.

00:54:05.500 --> 00:54:09.300
I duck as people throw their Vim flavored tomatoes at me.

00:54:09.300 --> 00:54:10.160
Yes, exactly.

00:54:10.160 --> 00:54:11.920
Well, it's just going to hit their screens.

00:54:11.920 --> 00:54:12.660
It won't really hurt you.

00:54:12.660 --> 00:54:13.100
Yeah.

00:54:13.100 --> 00:54:15.340
But when I'm teaching, I typically use idle.

00:54:15.340 --> 00:54:18.340
So you can cringe at that as well.

00:54:18.340 --> 00:54:18.860
Okay.

00:54:18.860 --> 00:54:20.020
Sure.

00:54:20.020 --> 00:54:21.680
All right.

00:54:21.680 --> 00:54:22.040
Awesome.

00:54:22.040 --> 00:54:25.280
And then sort of notable PyPI package.

00:54:25.280 --> 00:54:27.840
You have over a hundred thousand to pick from these days.

00:54:27.840 --> 00:54:28.700
That's pretty incredible.

00:54:28.700 --> 00:54:30.760
I guess we'll bring it back to the start.

00:54:30.760 --> 00:54:38.800
One that we've liked at work is a package called Zeep, which is a modern soap package in Python.

00:54:38.800 --> 00:54:43.060
So it has Python 3 async support.

00:54:43.060 --> 00:54:50.960
And so you're sort of blending the old enterprise stuff with the latest and greatest of Python.

00:54:50.960 --> 00:54:52.000
So Zeep.

00:54:52.000 --> 00:54:52.900
Z-E-E-P.

00:54:52.900 --> 00:54:53.560
All right.

00:54:53.560 --> 00:54:54.120
It sounds cool.

00:54:55.080 --> 00:54:55.320
Okay.

00:54:55.320 --> 00:54:56.480
So final call to action.

00:54:56.480 --> 00:54:58.960
People, there's a lot of stuff they can check out.

00:54:58.960 --> 00:55:00.860
They can check out your travel company.

00:55:00.860 --> 00:55:02.440
You've got your books.

00:55:02.440 --> 00:55:05.220
You've got your, probably they can meet you at PyCon, right?

00:55:05.220 --> 00:55:05.780
Yeah.

00:55:05.780 --> 00:55:07.000
I'll be at PyCon.

00:55:07.000 --> 00:55:09.040
Be at the tutorials.

00:55:09.040 --> 00:55:12.720
I'm going to be at O'Reilly's booth, I think on Friday.

00:55:12.720 --> 00:55:15.700
So if you want to meet me there, I'll be around as well.

00:55:15.700 --> 00:55:18.260
Saturday, I'll be in the Young Coders camp.

00:55:18.260 --> 00:55:20.800
But come up and talk with me if you want to.

00:55:21.120 --> 00:55:24.500
Otherwise, I guess you can follow me on Twitter if you want to.

00:55:24.500 --> 00:55:28.100
Dunder M. Harrison is my handle on Twitter.

00:55:28.100 --> 00:55:28.860
Nice.

00:55:28.860 --> 00:55:30.200
And I'll put that in the show notes as well.

00:55:30.200 --> 00:55:30.640
Cool.

00:55:30.640 --> 00:55:31.100
All right.

00:55:31.100 --> 00:55:32.460
Well, Matt, thank you for being on the show.

00:55:32.460 --> 00:55:36.020
It's been great to chat with you about all these projects and see what you're up to.

00:55:36.020 --> 00:55:36.420
Yeah.

00:55:36.420 --> 00:55:36.860
Thanks.

00:55:36.860 --> 00:55:37.620
I appreciate it.

00:55:37.620 --> 00:55:37.880
Bet.

00:55:37.880 --> 00:55:38.440
Talk to you later.

00:55:38.440 --> 00:55:38.900
Okay.

00:55:38.900 --> 00:55:39.480
We'll see you.

00:55:39.480 --> 00:55:43.820
This has been another episode of Talk Python To Me.

00:55:43.820 --> 00:55:46.580
Today's guest was Matt Harrison.

00:55:46.580 --> 00:55:49.620
And this episode is sponsored by Rollbar and Hired.

00:55:50.700 --> 00:55:52.520
Rollbar takes the pain out of errors.

00:55:52.520 --> 00:55:56.500
They give you the context and insight you need to quickly locate errors that might have

00:55:56.500 --> 00:55:59.660
otherwise gone unnoticed until your users complain to you, of course.

00:55:59.660 --> 00:56:03.860
As Talk Python To Me listeners, you can track a ridiculous number of errors for free.

00:56:03.860 --> 00:56:07.240
Just go to rollbar.com slash Talk Python To Me to get started.

00:56:07.240 --> 00:56:10.680
Hired wants to help you find your next big thing.

00:56:10.680 --> 00:56:16.500
Visit talkpython.fm/Hired to get five or more offers with salary and equity presented

00:56:16.500 --> 00:56:19.240
right up front and a special listener signing bonus of $600.

00:56:20.280 --> 00:56:22.420
Are you or your colleagues trying to learn Python?

00:56:22.420 --> 00:56:25.460
Well, be sure to visit training.talkpython.fm.

00:56:25.460 --> 00:56:31.280
We now have year-long course bundles and a couple of new classes released just this week.

00:56:31.280 --> 00:56:32.240
Have a look around.

00:56:32.240 --> 00:56:33.720
I'm sure you'll find a class you'll enjoy.

00:56:33.720 --> 00:56:36.140
Be sure to subscribe to the show.

00:56:36.140 --> 00:56:38.340
Open your favorite podcatcher and search for Python.

00:56:38.340 --> 00:56:39.580
We should be right at the top.

00:56:39.580 --> 00:56:45.360
You can also find the iTunes feed at /itunes, Google Play feed at /play, and

00:56:45.360 --> 00:56:48.860
direct RSS feed at /rss on talkpython.fm.

00:56:48.860 --> 00:56:53.980
Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.

00:56:53.980 --> 00:56:58.680
Corey just recently started selling his tracks on iTunes, so I recommend you check it out at

00:56:58.680 --> 00:57:00.660
Talk Python.fm slash music.

00:57:00.820 --> 00:57:05.100
You can browse his tracks he has for sale on iTunes and listen to the full-length version

00:57:05.100 --> 00:57:06.020
of the theme song.

00:57:06.020 --> 00:57:08.100
This is your host, Michael Kennedy.

00:57:08.100 --> 00:57:09.380
Thanks so much for listening.

00:57:09.380 --> 00:57:10.560
I really appreciate it.

00:57:10.560 --> 00:57:12.720
Smix, let's get out of here.

00:57:12.720 --> 00:57:35.000
Stay tuned.

