WEBVTT
00:00:00.001 --> 00:00:02.180
Getting started in Python is pretty easy.
00:00:02.180 --> 00:00:04.340
There's even a t-shirt that jokes about it.
00:00:04.340 --> 00:00:06.340
I learned Python. It was a good weekend.
00:00:06.340 --> 00:00:10.140
But to go from knowing how to create variables and writing loops
00:00:10.140 --> 00:00:13.340
to building amazing things like FastAPI and Instagram,
00:00:13.340 --> 00:00:17.000
well, there's this little gap in between those two things, don't you think?
00:00:17.000 --> 00:00:20.460
On this episode, we welcome Eric Matthews to the show.
00:00:20.460 --> 00:00:22.440
He has thought a lot about teaching Python
00:00:22.440 --> 00:00:26.480
and comes to share his 10 tips for going from Python beginner to expert.
00:00:26.980 --> 00:00:33.060
This is Talk Python To Me, episode 427, recorded July 19th, 2023.
00:00:33.060 --> 00:00:49.560
Welcome to Talk Python To Me, a weekly podcast on Python.
00:00:49.560 --> 00:00:51.300
This is your host, Michael Kennedy.
00:00:51.300 --> 00:00:53.960
Follow me on Mastodon, where I'm @mkennedy,
00:00:53.960 --> 00:00:56.420
and follow the podcast using @talkpython.
00:00:56.800 --> 00:00:58.780
Both on fosstodon.org.
00:00:58.780 --> 00:01:01.400
Be careful with impersonating accounts on other instances.
00:01:01.400 --> 00:01:02.360
There are many.
00:01:02.360 --> 00:01:05.900
Keep up with the show and listen to over seven years of past episodes
00:01:05.900 --> 00:01:07.420
at talkpython.fm.
00:01:07.420 --> 00:01:11.420
We've started streaming most of our episodes live on YouTube.
00:01:11.420 --> 00:01:15.200
Subscribe to our YouTube channel over at talkpython.fm/youtube
00:01:15.200 --> 00:01:18.980
to get notified about upcoming shows and be part of that episode.
00:01:18.980 --> 00:01:23.020
This episode is brought to you by GlareDB.
00:01:23.460 --> 00:01:28.480
GlareDB is an open source database for querying distributed and disparate data.
00:01:28.480 --> 00:01:34.360
Connect your data sources and use the Python tools you already know to ask questions and
00:01:34.360 --> 00:01:36.180
integrate data across data sources.
00:01:36.180 --> 00:01:39.440
Get started today at talkpython.fm/GlareDB.
00:01:39.440 --> 00:01:41.560
And it's brought to you by Sentry.
00:01:41.560 --> 00:01:43.820
Don't let those errors go unnoticed.
00:01:43.820 --> 00:01:44.840
Use Sentry.
00:01:45.240 --> 00:01:47.680
Get started at talkpython.fm/sentry.
00:01:47.680 --> 00:01:50.740
Eric, welcome to Talk Python To Me.
00:01:50.740 --> 00:01:51.200
Thank you.
00:01:51.200 --> 00:01:52.180
It's very nice to be here.
00:01:52.180 --> 00:01:53.740
It is very nice to have you here.
00:01:53.740 --> 00:01:58.820
The last time we were sitting around talking was at a beautiful cocktail bar
00:01:58.820 --> 00:02:02.980
at the tail end of PyCon 2023 in Salt Lake City.
00:02:02.980 --> 00:02:04.480
Not a bad place to wrap that up.
00:02:04.480 --> 00:02:05.440
No, it was very nice.
00:02:05.840 --> 00:02:06.560
What a fun event.
00:02:06.560 --> 00:02:11.460
We're going to talk about how people go from being a beginner-ish.
00:02:11.460 --> 00:02:16.340
That's a pretty broad term of what a beginner is in Python and programming.
00:02:16.340 --> 00:02:22.020
And sort of moving towards, you know, how do you take that journey, maybe more deliberately,
00:02:22.020 --> 00:02:26.900
a little more quickly, to the expert side of the software developer spectrum?
00:02:26.900 --> 00:02:28.120
It's going to be a lot of fun.
00:02:28.120 --> 00:02:28.400
Yes.
00:02:28.520 --> 00:02:28.680
Yeah.
00:02:28.680 --> 00:02:32.940
And so before we get into that, though, let's just start with your story.
00:02:32.940 --> 00:02:34.840
How did you get into programming Python?
00:02:34.840 --> 00:02:36.500
How did you end up writing books?
00:02:36.500 --> 00:02:37.500
All those things.
00:02:37.500 --> 00:02:38.100
Oh, boy.
00:02:38.100 --> 00:02:41.180
I have to be careful because it's a long story and I like telling it.
00:02:41.180 --> 00:02:46.960
I was fortunate in that my father was a software engineer in the 70s and 80s.
00:02:46.960 --> 00:02:52.880
And so when I was growing up, we had a kit computer in our basement before most people had home
00:02:52.880 --> 00:02:53.260
computers.
00:02:53.260 --> 00:02:58.060
So I got to write my first program as a basic number guessing game.
00:02:58.320 --> 00:02:59.760
When it was all about the go-tos?
00:02:59.760 --> 00:03:00.300
Yes.
00:03:00.300 --> 00:03:01.160
Line 10.
00:03:01.160 --> 00:03:01.680
Go to 10.
00:03:01.680 --> 00:03:02.720
What is your number?
00:03:02.720 --> 00:03:03.400
Yeah.
00:03:03.400 --> 00:03:03.960
Exactly.
00:03:03.960 --> 00:03:04.240
Yeah.
00:03:04.240 --> 00:03:05.680
I always had an interest in programming.
00:03:05.680 --> 00:03:12.500
And so I got to watch in real time the development from basic to logo for teaching kids to C to
00:03:12.500 --> 00:03:16.260
Pascal, Fortran, and all that variety of languages that led up to Python.
00:03:16.260 --> 00:03:22.080
My journey into Python was I was using Java in the early 2000s.
00:03:22.080 --> 00:03:24.180
And I thought I'd be a Java programmer for life.
00:03:24.180 --> 00:03:26.920
And a friend told me that, hey, you should check out Python.
00:03:27.120 --> 00:03:30.720
Your Java programs would be about a third as long as they are.
00:03:30.720 --> 00:03:33.760
Your programs would be about a third as long as they are in Java.
00:03:33.760 --> 00:03:37.700
And I couldn't really believe that because it's a pretty big claim.
00:03:37.700 --> 00:03:38.720
But I tried to end it.
00:03:38.720 --> 00:03:39.020
Yeah, that's a bold claim.
00:03:39.020 --> 00:03:39.400
Yeah.
00:03:39.400 --> 00:03:40.260
And it worked.
00:03:40.260 --> 00:03:41.140
And I was amazed.
00:03:41.140 --> 00:03:44.160
And people talk about this, but it was just plain fun.
00:03:44.160 --> 00:03:48.600
There was something more fun for me about writing Python code than Java.
00:03:48.600 --> 00:03:50.560
And I have never really looked back.
00:03:50.560 --> 00:03:52.480
That's a bit of an exaggeration.
00:03:52.600 --> 00:03:54.300
I do keep my eye out for other languages.
00:03:54.300 --> 00:03:57.700
I don't always assume that Python is always going to be the best for me.
00:03:57.700 --> 00:04:00.140
And I certainly use other languages as appropriate.
00:04:00.140 --> 00:04:02.340
But my core, I need to do something.
00:04:02.340 --> 00:04:04.400
I don't have a particular reason to choose another language.
00:04:04.400 --> 00:04:05.540
I do everything in Python.
00:04:05.700 --> 00:04:08.460
Yeah, I'm very similar in a lot of ways, actually.
00:04:08.460 --> 00:04:12.800
My background was in C# and C++, not Java.
00:04:12.800 --> 00:04:16.580
So a little bit different, but more similar than different, right?
00:04:16.700 --> 00:04:22.060
And I recall coming to Python and thinking at first, like, it's kind of a weird, interesting,
00:04:22.060 --> 00:04:23.320
but weird language.
00:04:23.320 --> 00:04:24.320
It's white space stuff.
00:04:24.320 --> 00:04:24.960
I don't know.
00:04:24.960 --> 00:04:26.520
Curly braces are pretty tried and true.
00:04:26.520 --> 00:04:27.560
What are we doing with all this?
00:04:27.560 --> 00:04:33.800
And before I really became super comfortable with Python and just like, yeah, that looks at
00:04:33.800 --> 00:04:33.920
it.
00:04:33.920 --> 00:04:34.920
It feels great.
00:04:34.920 --> 00:04:38.180
It feels right from how I perceived programming should be.
00:04:38.260 --> 00:04:43.460
I went, worked with it for a while, went back and why are all these symbols on the page?
00:04:43.460 --> 00:04:45.860
Like how it's just in the way of reading.
00:04:45.860 --> 00:04:50.100
And, you know, I used to thought I had to have the parentheses on the if statement, but it turns
00:04:50.100 --> 00:04:50.780
out you don't.
00:04:50.780 --> 00:04:52.720
So why does this language make you write the parentheses?
00:04:52.720 --> 00:04:54.560
And, you know, all those things, you're just like, what?
00:04:54.560 --> 00:04:55.480
What a hassle.
00:04:55.480 --> 00:05:00.280
Not even the static typing, just the, just the syntax is more syntaxy.
00:05:00.280 --> 00:05:04.420
And I'm kind of interested in how your experience with that was.
00:05:04.420 --> 00:05:07.100
Yeah, I'm going to save that for a little bit because it's going to come up in,
00:05:07.200 --> 00:05:09.000
in the points that we go over.
00:05:09.000 --> 00:05:13.140
I'll share though that for my background, that's one of the big piece that, that plays
00:05:13.140 --> 00:05:13.860
into all this.
00:05:13.860 --> 00:05:20.760
I, I went into college, into undergrad, focus on chemical engineering because I had a really
00:05:20.760 --> 00:05:22.900
good chemistry teacher in high school.
00:05:22.900 --> 00:05:27.440
And I thought I wanted to apply what I knew about chemistry in my intro chemical engineering
00:05:27.440 --> 00:05:27.780
classes.
00:05:27.780 --> 00:05:30.200
We were doing problems about running nuclear power plants.
00:05:30.200 --> 00:05:33.060
And I was like, gosh, I don't want to run a nuclear power plant.
00:05:33.060 --> 00:05:37.180
And I really enjoyed my physics classes because they were just playing about understanding.
00:05:37.180 --> 00:05:38.300
how the world works.
00:05:38.300 --> 00:05:43.720
So I ended up doing an undergrad in physics and I tutored throughout undergrad because so
00:05:43.720 --> 00:05:48.140
many people struggled with math and science, the two subjects that I loved the most.
00:05:48.140 --> 00:05:53.140
And I found that most people who struggled, it was because of how they were taught, not
00:05:53.140 --> 00:05:54.320
the subject material itself.
00:05:54.720 --> 00:05:58.900
And so I got a strong interest in teaching and I wanted to be a particle physicist, but
00:05:58.900 --> 00:06:02.060
I didn't want to be a student forever and get on the PhD track right away.
00:06:02.060 --> 00:06:04.380
So I started teaching and I loved teaching.
00:06:04.380 --> 00:06:10.980
I found that the challenge of reaching every person in a classroom was as hard as hard and
00:06:10.980 --> 00:06:12.320
satisfying as hard science.
00:06:12.440 --> 00:06:14.020
And so I just stayed in teaching.
00:06:14.020 --> 00:06:18.800
So I taught public school, fifth grade through high school for about 20 years.
00:06:18.800 --> 00:06:21.780
And I would, I was a hobbyist programmer throughout all of that.
00:06:21.780 --> 00:06:24.300
And so I taught intro programming classes whenever I could.
00:06:24.300 --> 00:06:29.640
And in the early 2010s ish, I was looking for a Python book that I could give my more motivated
00:06:29.640 --> 00:06:34.000
students and just kind of stand on the sidelines and answer their questions and let them go at
00:06:34.000 --> 00:06:34.580
their own pace.
00:06:34.920 --> 00:06:40.160
But everything either made too many assumptions about what you already knew, or it was written
00:06:40.160 --> 00:06:41.960
for kids and kind of spoke down to you.
00:06:41.960 --> 00:06:46.700
And so that's how I ended up writing a book because the book I wished to teach from did not
00:06:46.700 --> 00:06:47.080
exist.
00:06:47.080 --> 00:06:47.380
Sure.
00:06:47.380 --> 00:06:48.040
I know how that feels.
00:06:48.040 --> 00:06:48.400
Yeah.
00:06:48.400 --> 00:06:48.840
Yeah.
00:06:48.840 --> 00:06:49.860
What's the title of the book?
00:06:49.860 --> 00:06:50.480
Share that with everyone.
00:06:50.480 --> 00:06:51.720
That is Python Crash Course.
00:06:51.720 --> 00:06:52.740
No starts, right?
00:06:52.740 --> 00:06:53.120
Yes.
00:06:53.120 --> 00:06:53.840
From no starts.
00:06:53.840 --> 00:06:57.000
And it's been the bestselling introduction.
00:06:57.000 --> 00:07:01.580
It's been the bestselling Python book for close to 10 years now, which is really satisfying
00:07:01.580 --> 00:07:04.000
because I kind of had a 10 year vision.
00:07:04.000 --> 00:07:09.160
I had the naive notion that I could write a book in the summertime and then revise it during
00:07:09.160 --> 00:07:10.860
the school year and it would be done.
00:07:10.860 --> 00:07:14.740
And it was two and a half years instead of that.
00:07:14.740 --> 00:07:16.240
So I had a 10 year vision.
00:07:16.240 --> 00:07:20.800
I thought if I'm going to do all this work, then I should support the book for 10 year period.
00:07:20.800 --> 00:07:24.660
And so it's been very satisfying to see it be meaningful to so many people over that.
00:07:24.660 --> 00:07:25.040
Yeah.
00:07:25.040 --> 00:07:26.440
That's really awesome.
00:07:26.440 --> 00:07:29.000
So your book is in like LTS, long-term support.
00:07:29.000 --> 00:07:29.480
Say that again?
00:07:29.480 --> 00:07:32.980
It's an LTS release of the book, a long-term support, right?
00:07:32.980 --> 00:07:35.320
Not one of those off-brand releases.
00:07:35.320 --> 00:07:36.220
Right, right.
00:07:36.220 --> 00:07:37.440
No, that's really great.
00:07:37.440 --> 00:07:39.960
And it's cool to connect with so many people.
00:07:39.960 --> 00:07:44.520
You probably go to PyCon and other events and people are like, oh, I read your book.
00:07:44.520 --> 00:07:46.860
And it really, you know, probably have stories to tell you about it.
00:07:46.860 --> 00:07:47.120
Yeah.
00:07:47.120 --> 00:07:47.920
It was amazing.
00:07:47.920 --> 00:07:51.840
You know, you go to PyCon or any of these conferences and you see a bunch of booths
00:07:51.840 --> 00:07:53.520
with people hiring or selling something.
00:07:53.720 --> 00:07:56.920
And I used to go to those booths and just have conversations.
00:07:56.920 --> 00:08:01.980
And a year or two after the book came out, those people started telling me, oh, hey, I
00:08:01.980 --> 00:08:03.100
learned Python from your book.
00:08:03.100 --> 00:08:07.120
And I was amazed at how quickly people could learn Python and then start to work at these
00:08:07.120 --> 00:08:08.520
companies and organizations.
00:08:08.520 --> 00:08:09.120
Yeah.
00:08:09.120 --> 00:08:09.620
Yeah.
00:08:09.620 --> 00:08:10.740
It's interesting.
00:08:10.740 --> 00:08:14.660
So they learn Python through your book and now they're working at Bloomberg or whatever.
00:08:14.660 --> 00:08:16.340
And now they're talking to you through these booths.
00:08:16.340 --> 00:08:16.680
Interesting.
00:08:16.680 --> 00:08:17.160
Got it.
00:08:17.160 --> 00:08:17.600
Yeah.
00:08:17.600 --> 00:08:22.360
And as a teacher says, I'm glad to say I've read that book and learned a lot from
00:08:22.360 --> 00:08:22.540
it.
00:08:22.540 --> 00:08:22.880
Yeah.
00:08:22.880 --> 00:08:23.420
Very cool.
00:08:23.420 --> 00:08:23.700
Yeah.
00:08:23.700 --> 00:08:24.780
I'm glad I worked for you.
00:08:24.780 --> 00:08:25.480
Yeah.
00:08:25.480 --> 00:08:26.700
I was going to say, you know, as a teacher.
00:08:26.700 --> 00:08:27.320
Yeah.
00:08:27.320 --> 00:08:31.880
I have always been happy for my students to end up better at whatever I introduced them
00:08:31.880 --> 00:08:32.660
to than I am.
00:08:32.660 --> 00:08:35.040
My focus has been on teaching for a long time.
00:08:35.040 --> 00:08:38.980
And so I learned my subject well enough to be able to do whatever I need to with them.
00:08:38.980 --> 00:08:43.500
But anybody who chooses to focus on one area over a lifetime is going to be better
00:08:43.500 --> 00:08:44.260
than I am at it.
00:08:44.540 --> 00:08:48.740
And so meeting those people at the booths who are honestly now probably better programmers
00:08:48.740 --> 00:08:50.780
are certainly within their discipline than I am.
00:08:50.780 --> 00:08:51.680
It's a privilege.
00:08:51.680 --> 00:08:52.080
Yeah.
00:08:52.080 --> 00:08:57.500
So along this idea of how do you go from beginner just starting Python to whatever we call intermediate
00:08:57.500 --> 00:08:58.940
or advanced or expert.
00:08:58.940 --> 00:09:01.440
It's an interesting, interesting topic.
00:09:01.440 --> 00:09:03.320
And I think it's one that really deserves some attention.
00:09:03.320 --> 00:09:04.240
I think it does too.
00:09:04.240 --> 00:09:09.440
I think I hear for so many times from beginners, like I'm learning the language or I'm learning
00:09:09.440 --> 00:09:10.600
this or I'm learning that.
00:09:11.080 --> 00:09:15.160
And now I just don't really know what to do to keep making progress.
00:09:15.160 --> 00:09:15.500
Right.
00:09:15.500 --> 00:09:15.840
Right.
00:09:15.840 --> 00:09:21.260
And you mentioned your situation where you are sort of a hobbyist programmer to some degree.
00:09:21.260 --> 00:09:21.500
Right.
00:09:21.500 --> 00:09:25.980
And you just compared it against people who are, you know, maybe scaling out some DevOps
00:09:25.980 --> 00:09:27.640
thing at like a huge tech company.
00:09:27.640 --> 00:09:27.940
Right.
00:09:28.340 --> 00:09:31.040
Those are really different ways you spend your day.
00:09:31.040 --> 00:09:31.520
Right.
00:09:31.520 --> 00:09:34.360
As a hobbyist programmer, you have something you're interested in.
00:09:34.360 --> 00:09:39.020
Maybe you, you poke at it a little bit, you work at it, but you don't have the real
00:09:39.020 --> 00:09:41.760
demands of it's, it's got to work at this crazy scale.
00:09:41.760 --> 00:09:46.680
And also that it something you can, can you focus your entire effort on all day.
00:09:46.680 --> 00:09:46.960
Right.
00:09:46.960 --> 00:09:50.860
Cause you're, you're teaching or you're, you're doing other things besides that.
00:09:50.860 --> 00:09:51.040
Right.
00:09:51.040 --> 00:09:51.680
As a hobbyist.
00:09:51.680 --> 00:09:51.960
Yeah.
00:09:51.960 --> 00:09:57.360
And I think that, you know, when we label ourselves or others, beginner, intermediate
00:09:57.360 --> 00:10:02.420
expert, beginner is the one label that is objective or I've never programmed before.
00:10:02.420 --> 00:10:04.540
I'm a beginner or I have never used Python.
00:10:04.540 --> 00:10:05.780
So I'm a beginner at Python.
00:10:05.780 --> 00:10:08.920
Although even that, if you're experienced in another language, it's hard to call yourself
00:10:08.920 --> 00:10:09.700
a beginner again.
00:10:09.700 --> 00:10:10.180
Exactly.
00:10:10.680 --> 00:10:15.040
And then, you know, when I've looked at say intermediate resources, it's a hard world
00:10:15.040 --> 00:10:18.360
to classify and categorize because what is intermediate?
00:10:18.360 --> 00:10:24.580
And I think it's good to recognize that in the early days of a language, say like mid nineties
00:10:24.580 --> 00:10:29.400
to 2000 for Python, the language was small enough that somebody could call themselves an expert
00:10:29.400 --> 00:10:30.360
at some point.
00:10:30.360 --> 00:10:34.800
I know everything that there is in Python and a language is so big and the ecosystem is so
00:10:34.800 --> 00:10:39.820
huge and it covers so many domains that it's hard for anybody to objectively call themselves
00:10:39.820 --> 00:10:41.220
an expert in Python.
00:10:41.220 --> 00:10:42.280
What does that even mean?
00:10:42.280 --> 00:10:44.380
And so it really is about relative statement.
00:10:44.380 --> 00:10:44.800
Yeah.
00:10:44.800 --> 00:10:46.160
How do you get out of those?
00:10:46.160 --> 00:10:48.600
I'm just learning the language and now I'm using it.
00:10:48.600 --> 00:10:50.480
Those, that evaluation is interesting.
00:10:50.480 --> 00:10:51.360
Yeah, it is.
00:10:51.360 --> 00:10:55.580
And I think one, you know, it's a good point you bring up about when Python was smaller.
00:10:55.580 --> 00:10:57.560
There's this teacher that was a joke.
00:10:57.560 --> 00:10:58.840
It says, I learned Python.
00:10:58.840 --> 00:11:02.280
It was a good weekend, you know, which there's a truth to that.
00:11:02.280 --> 00:11:06.980
And it's, it's also cute, but at the same time, I've been doing this for many years and
00:11:06.980 --> 00:11:09.500
I'm still learning Python all the time, right?
00:11:09.500 --> 00:11:09.800
Yes.
00:11:09.800 --> 00:11:11.300
How do you square those two things?
00:11:11.300 --> 00:11:12.640
How can those both be true?
00:11:12.640 --> 00:11:18.000
And part of what that, the difference is, that's not obvious, I think to beginners, but
00:11:18.000 --> 00:11:19.400
it's obvious to you.
00:11:19.400 --> 00:11:21.920
When that person said, I learned Python, it was a good weekend.
00:11:21.920 --> 00:11:24.120
They meant they rocked the for loop.
00:11:24.120 --> 00:11:29.840
They can create a class and they can create a function, you know, that's, they can do if statements
00:11:29.840 --> 00:11:32.160
and they now write and instead of double ampersand.
00:11:32.160 --> 00:11:35.580
That is one interpretation of what Python is.
00:11:35.580 --> 00:11:41.140
But then you look at PyPI with its, I haven't read the numbers in a few weeks or something,
00:11:41.140 --> 00:11:43.040
but it's close to half million packages.
00:11:43.040 --> 00:11:50.660
If you completely, truly learned a new package every day, you're still falling behind, right?
00:11:50.660 --> 00:11:54.120
Continuously, every day, just nonstop for the rest of your life.
00:11:54.120 --> 00:11:57.640
You're like, ah, Molly, I'm more behind than I started 20 years ago, right?
00:11:57.680 --> 00:11:58.340
In a sense.
00:11:58.340 --> 00:12:00.660
And so what is Python?
00:12:00.660 --> 00:12:05.800
I think when people say, I want to be good at Python, I want to learn Python, I want to
00:12:05.800 --> 00:12:06.760
be an expert in Python.
00:12:06.760 --> 00:12:12.880
You need to understand that there are these different layers or tiers of what that means.
00:12:12.880 --> 00:12:15.800
And you can, you can be focused on one or another.
00:12:15.960 --> 00:12:21.040
But right, it's, it's when people are comparing, like I've done this much and I've got, I'm
00:12:21.040 --> 00:12:21.920
an expert at Python.
00:12:21.920 --> 00:12:23.380
Like, well, are you an expert at the language?
00:12:23.380 --> 00:12:24.960
Are you an expert in FastAPI?
00:12:24.960 --> 00:12:26.560
What are you an expert in?
00:12:26.560 --> 00:12:26.980
Right.
00:12:26.980 --> 00:12:32.000
And so I think just kind of setting the stage with there's different meanings to what I'm
00:12:32.000 --> 00:12:33.220
good at Python is.
00:12:33.220 --> 00:12:33.520
Yeah.
00:12:33.520 --> 00:12:37.520
And I'll, I'll say right now that I have a hard time classifying myself.
00:12:37.520 --> 00:12:38.900
I'm definitely not a beginner.
00:12:39.120 --> 00:12:43.960
I wouldn't necessarily call myself an expert, but I don't even know about intermediate somewhere
00:12:43.960 --> 00:12:45.720
between intermediate and expert.
00:12:45.720 --> 00:12:49.540
And I've been writing a weekly newsletter at mostly Python.
00:12:49.540 --> 00:12:50.720
It's on Substack.
00:12:50.720 --> 00:12:56.560
And I started writing a newsletter because I wanted to get out of that LTS you're mentioning
00:12:56.560 --> 00:12:59.000
about the book where all my writing is about a book.
00:12:59.000 --> 00:13:01.260
It's always about the same material.
00:13:01.460 --> 00:13:06.520
And so writing a weekly newsletter forces me to pick a topic each week and then be able
00:13:06.520 --> 00:13:07.460
to explain that well.
00:13:07.460 --> 00:13:12.580
And I think a lot of people think that somebody in my position just knows all this stuff and
00:13:12.580 --> 00:13:13.880
just write something up each week.
00:13:13.880 --> 00:13:18.080
And really it's a whole bunch of research every time because there's nooks and crannies around
00:13:18.080 --> 00:13:22.160
every topic in Python that I didn't know about after 20 years in the language.
00:13:22.160 --> 00:13:26.520
I mean, it's really enjoyable to fill out that understanding and then explain it well to other
00:13:26.520 --> 00:13:26.800
people.
00:13:26.800 --> 00:13:28.020
Yeah, it really is.
00:13:28.020 --> 00:13:29.620
Maybe final thought on this.
00:13:30.300 --> 00:13:34.260
Tony out there points out and says, adding on to what we were saying, and an expert in
00:13:34.260 --> 00:13:38.900
Python for data science doesn't necessarily look like an expert in Python for web and so
00:13:38.900 --> 00:13:39.080
on.
00:13:39.080 --> 00:13:43.720
Yeah, and I was going to add basically something similar that I would consider myself an expert
00:13:43.720 --> 00:13:48.520
in web development and API stuff and those kinds of things, right?
00:13:48.520 --> 00:13:53.500
I've been running production Python apps for a long time and really just polishing them.
00:13:53.500 --> 00:13:59.640
But put me in front of some machine learning situation or, you know, too much
00:13:59.640 --> 00:14:00.940
advanced pandas.
00:14:00.940 --> 00:14:03.180
And I'm like, well, I'm a beginner over here.
00:14:03.180 --> 00:14:05.480
And those are both also called Python, right?
00:14:05.480 --> 00:14:11.980
So there's just this, all these different contexts and spheres of relevance that I think people
00:14:11.980 --> 00:14:13.220
got to keep in mind, right?
00:14:13.220 --> 00:14:17.560
And it's probably good to hear them say like, you're an expert in some things, but not, it's
00:14:17.560 --> 00:14:18.780
not like you just know it all, right?
00:14:18.780 --> 00:14:19.120
Right.
00:14:19.240 --> 00:14:22.880
It's good to recognize that expertise in one area is oftentimes transferable.
00:14:22.880 --> 00:14:26.200
You aren't immediately an expert in the new domain.
00:14:26.200 --> 00:14:32.020
But what you've learned in one domain is oftentimes makes it easier to gain expertise in another
00:14:32.020 --> 00:14:32.240
one.
00:14:32.240 --> 00:14:32.720
Absolutely.
00:14:32.720 --> 00:14:34.820
Like if the data science side, right?
00:14:34.820 --> 00:14:35.860
You're still good at Git.
00:14:35.860 --> 00:14:38.080
That's not a new thing for you, right?
00:14:38.080 --> 00:14:38.680
You're not like, why?
00:14:38.680 --> 00:14:39.800
What is this source control thing?
00:14:39.800 --> 00:14:41.500
Like you can still completely rock that.
00:14:41.580 --> 00:14:47.120
But maybe you're not embracing the vectorization of style of programming and so on.
00:14:47.120 --> 00:14:51.420
This portion of Talk Python To Me is brought to you by GlareDB.
00:14:51.420 --> 00:14:55.900
GlareDB is an open source database for querying distributed data.
00:14:55.900 --> 00:14:56.760
Here's how it works.
00:14:56.760 --> 00:14:58.680
First, you connect your data sources.
00:14:58.680 --> 00:15:03.060
GlareDB makes it easy to connect to your data, no matter where it's stored, with integrations
00:15:03.060 --> 00:15:06.340
into many popular databases, data warehouses, and more.
00:15:06.800 --> 00:15:11.920
This includes Snowflake, Postgres, MongoDB, BigQuery, and object storage.
00:15:11.920 --> 00:15:13.860
Now you can query everything.
00:15:13.860 --> 00:15:19.380
You use the full power SQL to query your data across these many different data sources, join
00:15:19.380 --> 00:15:23.440
data across production databases and analytical warehouses without limits.
00:15:23.440 --> 00:15:26.980
Finally, you can use the tools you already know and love.
00:15:26.980 --> 00:15:31.740
Visualize and query your data using tools you know from Python's data science stack.
00:15:31.740 --> 00:15:36.720
With just a single import, you can query Pandas and Polars data frames using just
00:15:36.720 --> 00:15:37.100
SQL.
00:15:37.100 --> 00:15:42.520
You'll be asking questions, extracting insights, and driving decisions with your data without
00:15:42.520 --> 00:15:45.060
waiting for an ETL pipeline to move data around.
00:15:45.060 --> 00:15:50.520
So if you have distributed data and disparate data sources, and you love open source, you
00:15:50.520 --> 00:15:52.800
owe it to yourself to give GlareDB a try.
00:15:52.800 --> 00:15:56.720
Visit talkpython.fm/GlareDB to get started.
00:15:56.720 --> 00:15:58.760
The link is in your podcast player show notes.
00:15:58.760 --> 00:16:01.920
And please use the link to let them know that you came from us.
00:16:01.920 --> 00:16:05.200
Thank you to the team at GlareDB for sponsoring the show.
00:16:06.640 --> 00:16:10.340
Maybe this is a good time to start talking about the ideas.
00:16:10.340 --> 00:16:14.220
So what I did is I said, you know, Eric, you've got this cool book.
00:16:14.220 --> 00:16:19.500
How about you try to extract some ideas that you've learned from writing the book and working
00:16:19.500 --> 00:16:25.180
with people for this whole topic of transitioning from beginners towards the expert side of programming.
00:16:25.180 --> 00:16:27.180
So let's go through the list.
00:16:27.180 --> 00:16:27.660
Sure.
00:16:27.660 --> 00:16:29.460
I like, first of all, I like that structuring.
00:16:29.680 --> 00:16:32.800
I kind of forced me to think specifically about what I can say.
00:16:32.800 --> 00:16:33.900
I want to clarify.
00:16:33.900 --> 00:16:35.000
This isn't a countdown.
00:16:35.000 --> 00:16:38.520
A lot of times lists are like, here's the top 10 things you should know about Python.
00:16:38.520 --> 00:16:44.540
So these are ideas for specific things that people can do to move away from wherever you
00:16:44.540 --> 00:16:49.500
were as a beginner and more into that intermediate and expert and be comfortable with justifying
00:16:49.500 --> 00:16:49.740
that.
00:16:49.740 --> 00:16:54.940
So for this kind of list, I start with the most important things first because everything
00:16:54.940 --> 00:16:55.800
else builds on that.
00:16:55.800 --> 00:17:00.960
And so when I think about what do people need to do to move away from beginner and towards
00:17:00.960 --> 00:17:05.700
being fluent and comfortable and competent and able to solve a variety of problems, the
00:17:05.700 --> 00:17:08.140
first thing is when you're learning, know your goals.
00:17:08.140 --> 00:17:09.520
Why are you learning in a program?
00:17:09.520 --> 00:17:11.300
And so we see this all the time.
00:17:11.360 --> 00:17:14.260
If you follow conversations about learning Python, I want to learn Python.
00:17:14.260 --> 00:17:14.960
Okay.
00:17:14.960 --> 00:17:16.460
But should I focus on?
00:17:16.460 --> 00:17:17.760
Well, what are your goals?
00:17:17.760 --> 00:17:18.740
Why are you learning it?
00:17:18.740 --> 00:17:19.520
What do you want to do?
00:17:19.520 --> 00:17:23.780
And I think the answers to that tend to be, I just like programming.
00:17:23.780 --> 00:17:24.840
I'm curious.
00:17:24.840 --> 00:17:26.940
For a lot of people, it is about money.
00:17:26.940 --> 00:17:30.400
People know that software development jobs can pay well.
00:17:30.400 --> 00:17:36.040
And I think it's quite appropriate and reasonable and important to name that if that is one of your
00:17:36.040 --> 00:17:37.780
goals and there's nothing wrong with that.
00:17:37.780 --> 00:17:38.080
Right.
00:17:38.080 --> 00:17:41.140
And also it could be career, but not money in the sense that.
00:17:41.140 --> 00:17:44.260
I have a decent paying job now, but I don't like my job.
00:17:44.260 --> 00:17:49.480
If I could just have the same money, but actually work on programming all day, that would be awesome,
00:17:49.480 --> 00:17:49.840
right?
00:17:49.840 --> 00:17:50.360
Yes.
00:17:50.360 --> 00:17:50.700
Yeah.
00:17:50.700 --> 00:17:55.180
The money thing comes up for me because I'll say one of the things I'm proud of as an author
00:17:55.180 --> 00:18:00.240
is I've replied to pretty much every single email anybody has ever written to me about the book.
00:18:00.240 --> 00:18:05.040
I think that's part of why the book has done well, because I notice I look for patterns.
00:18:05.040 --> 00:18:09.160
And so if people start to write about the same thing, then I adjust the book a little bit to
00:18:09.160 --> 00:18:10.100
address that.
00:18:10.100 --> 00:18:14.280
And so it keeps my email volume reasonable, but also it means it's still meeting the needs
00:18:14.280 --> 00:18:15.100
of readers.
00:18:15.100 --> 00:18:18.720
But it also means I've had interactions with thousands of readers.
00:18:18.720 --> 00:18:23.740
And one of the things that comes up in anything that goes beyond a, can you help me fix this
00:18:23.740 --> 00:18:24.340
one problem?
00:18:24.340 --> 00:18:26.760
I oftentimes ask like, what are you learning this for?
00:18:26.760 --> 00:18:28.080
What's your, what's your story?
00:18:28.080 --> 00:18:30.780
And a lot of those people are doing career transitions.
00:18:31.020 --> 00:18:33.500
It's a mix of people looking for better pay.
00:18:33.500 --> 00:18:35.820
And oftentimes that's tied in with to support my family.
00:18:35.820 --> 00:18:39.780
Those larger life decisions other than just, you know, it's never greed.
00:18:39.780 --> 00:18:41.120
It's never, I want to be rich.
00:18:41.120 --> 00:18:43.740
It's always, I want to, to live reasonable life.
00:18:44.340 --> 00:18:49.100
And what you say, people being tired of a different line of work and looking for something where
00:18:49.100 --> 00:18:52.320
they can have more power, more, more independence, more control.
00:18:52.320 --> 00:18:56.980
You know, when you say know your goals for most people, their goals, it's not one goal.
00:18:56.980 --> 00:18:58.240
It's a balance of those.
00:18:58.340 --> 00:19:03.240
And recognizing where your balance sits is really important because it guides the rest
00:19:03.240 --> 00:19:04.800
of your learning and what you do.
00:19:04.800 --> 00:19:06.180
Yeah, it absolutely does.
00:19:06.180 --> 00:19:07.640
Somebody who's just plain curious.
00:19:07.640 --> 00:19:08.260
Go ahead.
00:19:08.260 --> 00:19:08.460
Sorry.
00:19:08.460 --> 00:19:09.400
Well, yeah.
00:19:09.400 --> 00:19:15.100
And I think when we're talking about beginners, there's a lot of people who get pulled into Python
00:19:15.100 --> 00:19:19.280
without an explicit intent of becoming a software developer.
00:19:19.280 --> 00:19:23.440
In fact, like they would maybe start out by saying, I don't want to be a software developer.
00:19:23.440 --> 00:19:24.880
I'm a biologist.
00:19:24.880 --> 00:19:25.820
I'm an economist.
00:19:25.820 --> 00:19:27.980
I'm a philosopher or whatever.
00:19:27.980 --> 00:19:32.620
But I need a little bit of programming because I learned that if I do these six lines of
00:19:32.620 --> 00:19:37.140
Python, like magic happens way better than if I had to force it through Excel or something.
00:19:37.140 --> 00:19:37.420
Right.
00:19:37.420 --> 00:19:42.320
And I think a lot of the beginners are in that realm of like, well, I'm here now.
00:19:42.320 --> 00:19:43.860
I'm still not a programmer.
00:19:43.860 --> 00:19:45.120
Don't call me one of those.
00:19:45.120 --> 00:19:47.940
But I use programming for my thing.
00:19:47.940 --> 00:19:50.920
And that's also a pretty interesting angle, I think.
00:19:50.920 --> 00:19:51.200
Yeah.
00:19:51.200 --> 00:19:53.860
And I think that's a really, really good thing for people to recognize.
00:19:53.860 --> 00:19:57.800
It is interesting to have this conversation about labels and beginners and intermediate.
00:19:57.800 --> 00:20:00.720
Because how do you know when you're no longer a beginner?
00:20:00.720 --> 00:20:06.860
One of the clearest signs is when you have used programming to solve a real problem that you have.
00:20:06.960 --> 00:20:11.500
And you can throw in like with a level of understanding rather than copy pasting.
00:20:11.500 --> 00:20:13.320
But for a lot of people...
00:20:13.320 --> 00:20:14.920
Or now ChatGPT also.
00:20:14.920 --> 00:20:15.280
Yeah.
00:20:15.280 --> 00:20:16.100
Yeah.
00:20:16.100 --> 00:20:19.000
That's a super interesting dynamic to throw into all of this.
00:20:19.000 --> 00:20:20.720
But that is the end goal.
00:20:20.720 --> 00:20:22.160
It should be the end goal for most people.
00:20:22.160 --> 00:20:29.320
Not just to know how programming works, but to use it to solve a real world problem that you or somebody else has.
00:20:29.780 --> 00:20:34.260
And so as soon as you're doing that, you can start to consider yourself moving out of the beginner place.
00:20:34.260 --> 00:20:34.600
Yeah.
00:20:34.600 --> 00:20:36.900
You might still feel awkward, but you're doing it.
00:20:36.900 --> 00:20:39.780
Really interesting comment that I think is worth highlighting.
00:20:39.780 --> 00:20:42.380
And Foxo says, I'm an anesthesiologist.
00:20:42.380 --> 00:20:45.640
You cannot imagine how much Python has helped me with different tasks.
00:20:45.640 --> 00:20:46.060
Amazing.
00:20:46.060 --> 00:20:47.840
That's really cool.
00:20:47.840 --> 00:20:48.600
Thank you for sharing that.
00:20:48.600 --> 00:20:48.800
Yeah.
00:20:48.800 --> 00:20:49.160
Yeah.
00:20:49.160 --> 00:20:49.660
Yeah.
00:20:49.660 --> 00:20:49.880
Yeah.
00:20:50.200 --> 00:20:50.380
Okay.
00:20:50.380 --> 00:20:53.020
So tip number one, know your goals.
00:20:53.020 --> 00:20:54.420
Like, why are you here?
00:20:54.420 --> 00:20:56.500
Because that'll help guide you somewhat.
00:20:56.500 --> 00:20:56.880
Yes?
00:20:56.880 --> 00:20:57.300
Yes.
00:20:57.300 --> 00:21:01.320
I'm taking a few notes about throwing things in there later in the list.
00:21:01.320 --> 00:21:01.600
Beautiful.
00:21:01.600 --> 00:21:02.000
All right.
00:21:02.000 --> 00:21:02.740
I agree.
00:21:02.740 --> 00:21:04.200
I think it's important to know your goals.
00:21:04.200 --> 00:21:07.980
And there's a lot of reasons why people get into programming, right?
00:21:07.980 --> 00:21:09.260
And so...
00:21:09.260 --> 00:21:09.420
Yeah.
00:21:09.420 --> 00:21:13.660
Last thing on that is if somebody is just plain curious, as far as teaching and learning,
00:21:13.660 --> 00:21:17.660
if somebody is just plain curious, that's their main goal, you have a lot more flexibility
00:21:17.660 --> 00:21:22.360
in the examples you present to them and the pace at which you present material, as opposed
00:21:22.360 --> 00:21:25.960
to somebody who says, you know, I really want to do a career transition as soon as possible.
00:21:25.960 --> 00:21:30.040
That person needs a much more grounded and practical and timely approach.
00:21:30.040 --> 00:21:34.340
Well, and you also might look out and say, okay, web framework do I need to choose?
00:21:34.340 --> 00:21:36.920
What database experience do I need to get?
00:21:36.920 --> 00:21:42.500
Because I'm looking at Indeed job listings and I'm trying to hit the largest set of those
00:21:42.500 --> 00:21:46.300
rather than what project am I trying to work on or what am I curious about?
00:21:46.300 --> 00:21:48.280
You're like, I need to start checking the big boxes.
00:21:48.280 --> 00:21:50.940
Let's check those boxes so I can get a job in six weeks.
00:21:50.940 --> 00:21:51.200
Yep.
00:21:51.200 --> 00:21:51.720
All right.
00:21:51.720 --> 00:21:52.340
Tip number two.
00:21:52.340 --> 00:21:52.620
Yeah.
00:21:52.620 --> 00:21:53.300
Tip number two.
00:21:53.300 --> 00:21:53.780
What do you got?
00:21:53.780 --> 00:21:55.340
Have a project in mind.
00:21:55.340 --> 00:22:00.800
And so whatever your goals are, having a specific project in mind helps put everything else in
00:22:00.800 --> 00:22:01.320
context.
00:22:01.320 --> 00:22:07.160
If you are learning about a for loop and you have a project, I'm going to name one, one of
00:22:07.160 --> 00:22:08.100
the projects that I've worked on.
00:22:08.100 --> 00:22:09.560
I live in Southeast Alaska.
00:22:09.980 --> 00:22:14.760
And one of the impacts of climate change here is an increasing frequency and severity
00:22:14.760 --> 00:22:15.640
of landslides.
00:22:15.640 --> 00:22:20.020
And so Southeast Alaska is a rainforest for anybody who isn't aware of that.
00:22:20.020 --> 00:22:23.040
It's not all snow in Southeast because we're right next to the ocean.
00:22:23.460 --> 00:22:27.980
And so we're still getting as much rain as we always have, but it's coming instead of
00:22:27.980 --> 00:22:31.820
light rain throughout the year with some periods of heavy rain, we're getting a lot more nice
00:22:31.820 --> 00:22:32.080
weather.
00:22:32.080 --> 00:22:36.420
We just had two or three weeks of no rain, which was really unusual here.
00:22:36.420 --> 00:22:40.880
But we'll get heavier fall storms that can lead to landslides.
00:22:41.160 --> 00:22:47.380
And so I had a project that monitored a local river's level to correlate that with landslide
00:22:47.380 --> 00:22:50.640
risk and helped develop a warning system.
00:22:50.640 --> 00:22:55.640
And so a project like that in mind, that's a big project.
00:22:55.640 --> 00:22:59.140
And so if somebody is just learning Python, that's hard to say, like, here's everything
00:22:59.140 --> 00:23:00.800
you need to know to build that project.
00:23:00.800 --> 00:23:05.200
But if you're teaching a for loop and you know that somebody is interested in a project
00:23:05.200 --> 00:23:09.900
about monitoring climate, then you can make your for loops about processing data related
00:23:09.900 --> 00:23:12.700
to rainfall, river levels, things like that.
00:23:12.700 --> 00:23:13.780
Yeah, absolutely.
00:23:13.780 --> 00:23:19.060
And Python is really interesting in that you can, it's pretty good at the IoT thing as well,
00:23:19.060 --> 00:23:23.700
which opens up a lot of, you know, we've got CircuitPython and Adafruit and all those
00:23:23.700 --> 00:23:26.720
areas to play with as well, which is a whole different kind of project.
00:23:26.720 --> 00:23:27.760
Yeah, yeah.
00:23:27.760 --> 00:23:29.740
And so there's an infinite number of projects.
00:23:29.740 --> 00:23:34.900
And so if you have a project in mind, being clear about that with yourself and with anybody
00:23:34.900 --> 00:23:39.480
that you're learning with or from is really helpful as far as tailoring what you're
00:23:39.480 --> 00:23:40.840
learning to your purposes.
00:23:40.840 --> 00:23:41.840
I'm curious.
00:23:41.840 --> 00:23:46.120
It's always easier to teach somebody who has a specific goal in mind than somebody who
00:23:46.120 --> 00:23:46.760
is just vague.
00:23:46.760 --> 00:23:47.640
Just teach me something.
00:23:47.640 --> 00:23:47.940
Yeah.
00:23:47.940 --> 00:23:49.120
Well, because it's focused.
00:23:49.120 --> 00:23:49.420
Yeah.
00:23:49.420 --> 00:23:49.660
Right.
00:23:49.660 --> 00:23:54.540
I find a lot of people try to boil the ocean metaphorically when they're trying to learn
00:23:54.540 --> 00:23:54.880
these things.
00:23:54.880 --> 00:23:58.860
Like, well, I saw somebody saying, well, all these CS topics are really hard for me.
00:23:58.860 --> 00:24:01.800
Like people keep telling me all these CS things I need to know.
00:24:01.800 --> 00:24:03.340
And do I really need to know them?
00:24:03.340 --> 00:24:06.120
Well, maybe eventually, but not all at once.
00:24:06.520 --> 00:24:09.020
You know, like, what are you doing now?
00:24:09.020 --> 00:24:10.820
How big is your program?
00:24:10.820 --> 00:24:12.540
You really need testing.
00:24:12.540 --> 00:24:13.020
Maybe you do.
00:24:13.020 --> 00:24:13.640
Maybe you don't.
00:24:13.640 --> 00:24:14.700
Do you really need classes?
00:24:14.700 --> 00:24:15.300
Maybe you do.
00:24:15.300 --> 00:24:15.980
Maybe you don't.
00:24:15.980 --> 00:24:16.860
Do you need generators?
00:24:16.860 --> 00:24:17.520
Do you need anything?
00:24:17.520 --> 00:24:20.720
Like there's all these things that you probably could say, don't need them now.
00:24:20.720 --> 00:24:22.620
Maybe in a year or two, I can.
00:24:22.780 --> 00:24:23.560
I will need them.
00:24:23.560 --> 00:24:25.400
Then I'll be motivated to learn them.
00:24:25.400 --> 00:24:29.640
And so when you have these projects, you can say, I need these five things or I need these
00:24:29.640 --> 00:24:30.300
four things.
00:24:30.300 --> 00:24:31.440
I need to know them.
00:24:31.440 --> 00:24:34.320
And then my project is working, right?
00:24:34.320 --> 00:24:36.860
Instead of trying to say, well, what do I start with even?
00:24:36.860 --> 00:24:37.220
Yeah.
00:24:37.220 --> 00:24:42.020
And one of the criticisms of many learning resources, and I'm a little sensitive to this
00:24:42.020 --> 00:24:46.300
because I've written many of these examples, is when people do a for loop and the for loop
00:24:46.300 --> 00:24:49.600
is about like kinds of pizza or something or toppings of pizza.
00:24:49.600 --> 00:24:51.880
And people look at that and say, why do I need this?
00:24:51.880 --> 00:24:53.180
I don't care about pizza toppings.
00:24:53.180 --> 00:24:53.900
Okay.
00:24:54.020 --> 00:24:57.960
You need that because the person creating the resource has to have something, some kind
00:24:57.960 --> 00:24:59.120
of context for the example.
00:24:59.120 --> 00:25:03.480
And so when I'm teaching a class in person, I don't come up with, all right, we're going
00:25:03.480 --> 00:25:04.260
to do pizza toppings.
00:25:04.260 --> 00:25:06.720
I ask people in the class, hey, what are you interested in?
00:25:06.720 --> 00:25:10.540
And then we pick something that somebody in the class that day mentions.
00:25:10.540 --> 00:25:13.300
And then there's relevance right there.
00:25:13.300 --> 00:25:18.420
You don't have that if you're learning on your own, but what you can do, if you do know your
00:25:18.420 --> 00:25:22.440
own project, you work through the example about pizza toppings, but then you write a loop
00:25:22.440 --> 00:25:25.220
that relates to the project that you want to work on.
00:25:25.220 --> 00:25:30.000
And so that knowing that project is really helpful, regardless of how you're, you're learning.
00:25:30.000 --> 00:25:30.340
Yeah.
00:25:30.340 --> 00:25:31.680
Let me pull up another comment.
00:25:31.680 --> 00:25:33.580
I think this is worth covering for people as well.
00:25:33.580 --> 00:25:37.540
So Bishnielder says, for me, it was all good while I was learning programming Python.
00:25:37.540 --> 00:25:42.180
But as soon as I was out there in real life, looking for jobs and looking at the requirements,
00:25:42.180 --> 00:25:43.800
it drained a lot of energy out of me.
00:25:43.800 --> 00:25:44.900
Suggestions.
00:25:44.900 --> 00:25:45.720
What do you think?
00:25:45.720 --> 00:25:46.300
Oh boy.
00:25:46.300 --> 00:25:48.440
I don't think there's an easy answer to that.
00:25:48.440 --> 00:25:50.700
And I think it's important to be honest about that.
00:25:51.120 --> 00:25:54.980
Personally, I have never worked as a full-time programmer.
00:25:54.980 --> 00:25:58.580
And that puts me in a weird spot for talking about things like career transitions.
00:25:58.580 --> 00:26:05.080
I have helped thousands of people make career transitions, but I don't sit in the interviewee
00:26:05.080 --> 00:26:05.380
chair.
00:26:05.380 --> 00:26:06.420
Not very often.
00:26:06.420 --> 00:26:07.000
Yeah.
00:26:07.000 --> 00:26:12.340
And having spent a good part of my life as a teacher, teacher hiring and teacher, the
00:26:12.340 --> 00:26:16.040
structure of employment for teachers is so vastly different than programming.
00:26:16.040 --> 00:26:16.340
Yeah.
00:26:16.340 --> 00:26:19.540
The timeframe of teacher teaching jobs is so weird.
00:26:19.540 --> 00:26:25.260
It's like, yes, there's a time sort of once a year often that you can apply or change jobs.
00:26:25.260 --> 00:26:26.460
And otherwise you can't.
00:26:26.460 --> 00:26:28.140
It's not exactly true, but generally true.
00:26:28.140 --> 00:26:28.460
Yeah.
00:26:28.460 --> 00:26:32.560
I'm in an interesting position now where I'd kind of like to work as a professional programmer,
00:26:32.760 --> 00:26:36.700
but honestly, I have to spend 10 to 20 hours a week supporting the book.
00:26:36.700 --> 00:26:39.220
That LDS stuff is ongoing.
00:26:39.220 --> 00:26:40.140
I know.
00:26:40.140 --> 00:26:41.820
I got a bunch of courses and stuff.
00:26:41.820 --> 00:26:42.160
I know.
00:26:42.160 --> 00:26:42.500
Yeah.
00:26:42.500 --> 00:26:46.660
I was just redoing some videos that had a mistake in them that somebody noticed.
00:26:46.800 --> 00:26:48.540
So anything I do is on top of that work.
00:26:48.540 --> 00:26:53.380
And so I can really only consider part-time work and then it becomes a, is this worth
00:26:53.380 --> 00:26:53.560
it?
00:26:53.560 --> 00:27:00.540
So to be more direct, I don't think there's an easy answer to the grind of looking for work.
00:27:00.540 --> 00:27:04.660
And as a network thing of once you have a job, it can be easier to find the next job.
00:27:04.660 --> 00:27:09.420
The couple of things I'll share for people is if you, so we talked about solving real world
00:27:09.420 --> 00:27:09.920
problems.
00:27:09.920 --> 00:27:15.020
If you have a story that you can tell about how you have, you have made something better
00:27:15.020 --> 00:27:20.320
through programming, what employers are looking for is that yes, you have capability for programming.
00:27:20.320 --> 00:27:26.720
You can pass whatever lead code tests or screenings are necessary, but also have you use what you've
00:27:26.720 --> 00:27:28.300
learned about programming to solve something.
00:27:28.300 --> 00:27:33.620
And so the stories I always come back to are people who are working non-programming jobs and
00:27:33.620 --> 00:27:38.380
start to learn programming and then use that to solve something in their work that they weren't
00:27:38.380 --> 00:27:39.280
expected to solve.
00:27:39.280 --> 00:27:41.880
And that becomes a huge selling point in interviews.
00:27:41.880 --> 00:27:45.360
My favorite story is a guy who was working for, I believe it was UPS.
00:27:45.360 --> 00:27:46.620
And this was quite a while ago.
00:27:46.620 --> 00:27:50.360
I feel comfortable telling that story, partly based on time, but they were working for one
00:27:50.360 --> 00:27:55.580
of these large delivery companies and they were aware of people getting fired in warehouses
00:27:55.580 --> 00:27:58.340
for damage to the goods that were supposed to be delivered.
00:27:58.340 --> 00:28:03.640
And so the person was learning Python and they wrote some data analysis and they were able to
00:28:03.640 --> 00:28:09.140
pinpoint that the damage was coming from a manager or management group that was not
00:28:09.140 --> 00:28:11.740
training end line employees well enough.
00:28:11.740 --> 00:28:17.340
And so that was really interesting story because the people being fired were not the people who
00:28:17.340 --> 00:28:18.380
are causing the damage.
00:28:18.380 --> 00:28:22.480
They caused the physical damage, but it was more systemic.
00:28:22.480 --> 00:28:22.920
Yeah.
00:28:22.920 --> 00:28:23.480
Yeah.
00:28:23.560 --> 00:28:27.440
And so that person saved their company millions of dollars and they got like a $5,000 a year
00:28:27.440 --> 00:28:27.800
raise.
00:28:27.800 --> 00:28:34.760
What they really did was they used that story in interviews to gain an actual programming
00:28:34.760 --> 00:28:36.480
position at a different company.
00:28:36.480 --> 00:28:39.980
And so it's hard when you're starting out.
00:28:40.340 --> 00:28:45.100
And so all I can say is look for the selling point for yourself and know that once you do
00:28:45.100 --> 00:28:49.440
get your first break, it becomes easier to stay on that path.
00:28:49.440 --> 00:28:50.860
I have one more thing to add.
00:28:50.860 --> 00:28:54.780
A lot of times when people are looking for their first programming job, they have experience
00:28:54.780 --> 00:28:55.320
somewhere else.
00:28:55.320 --> 00:28:57.200
I realized some people are young.
00:28:57.200 --> 00:28:58.280
They learn programming.
00:28:58.280 --> 00:29:01.020
That's kind of their totality of work experience.
00:29:01.400 --> 00:29:04.780
But a lot of people maybe studied something else and became a programmer like you studied
00:29:04.780 --> 00:29:05.200
physics.
00:29:05.200 --> 00:29:06.840
Embrace that, right?
00:29:06.840 --> 00:29:09.980
So imagine you studied, I don't know, logistics.
00:29:09.980 --> 00:29:13.220
Instead of trying to look for a programming job because you don't want to do logistics,
00:29:13.220 --> 00:29:15.840
look for a programming job at a logistics company.
00:29:15.840 --> 00:29:20.920
Because then you could say, I have programming skills, plus I have an expertise in your area
00:29:20.920 --> 00:29:21.720
of specialization.
00:29:21.720 --> 00:29:27.280
And once you intersect those things, you are in a much smaller set of competitors, right?
00:29:27.280 --> 00:29:29.020
Like I'm looking for a biology job.
00:29:29.020 --> 00:29:30.360
There's a ton of people doing biology.
00:29:30.520 --> 00:29:33.240
If I'm looking for a programming job, there's a ton of people doing programming.
00:29:33.240 --> 00:29:40.100
How many are doing biology and programming maybe in the specific area that you're focused
00:29:40.100 --> 00:29:40.700
in, right?
00:29:40.700 --> 00:29:42.460
That all of a sudden gives you an opportunity.
00:29:42.460 --> 00:29:46.280
But it also means you need to look somewhat differently for jobs, right?
00:29:46.280 --> 00:29:50.800
You don't go apply to FANG the same way that everyone else thinks they should apply to FANG.
00:29:50.800 --> 00:29:55.080
Look for these small companies because not only will they appreciate it more, you'll get a
00:29:55.080 --> 00:29:59.340
better chance to grow because you'll get a bigger responsibility to write more broad software.
00:29:59.640 --> 00:30:04.980
And the interviewing process is not nearly as terrible, I think, for small companies, right?
00:30:04.980 --> 00:30:05.180
Right.
00:30:05.180 --> 00:30:08.860
It's a chat with a couple of people and they're like, we think you can do it.
00:30:08.860 --> 00:30:10.100
Give it a try for a week.
00:30:10.100 --> 00:30:14.140
Whereas places like the large tech companies, right?
00:30:14.140 --> 00:30:18.720
They've got these pretty horrible, here's your take-home exercise, write it.
00:30:18.720 --> 00:30:22.760
We'll consider it if it works out well, maybe amongst the other thousands, right?
00:30:22.800 --> 00:30:24.180
It's like a really different experience.
00:30:24.180 --> 00:30:28.440
I think that first step in the door, that first job is the one that is hard to get.
00:30:28.440 --> 00:30:28.740
Yeah.
00:30:28.740 --> 00:30:31.320
I'll throw one more piece in there and it's a quick thought.
00:30:31.320 --> 00:30:35.220
And that is, you know, contributing to open source projects is something we need to be careful
00:30:35.220 --> 00:30:37.640
about because oftentimes it's privileged work.
00:30:37.640 --> 00:30:40.060
You have some extra time and you can do that.
00:30:40.140 --> 00:30:46.180
But one of the real benefits of making meaningful contributions to established open source projects
00:30:46.180 --> 00:30:52.280
is it throws you all the way into professional workflows of managing, you know, using source
00:30:52.280 --> 00:30:55.600
control and just the bigger piece, communicating with a larger team.
00:30:55.600 --> 00:31:03.080
So as I've gotten more into open source, for me, that scratches that itch of wanting to work
00:31:03.080 --> 00:31:04.120
as a professional programmer.
00:31:04.480 --> 00:31:06.500
It's hard to simulate.
00:31:06.500 --> 00:31:07.040
Yeah.
00:31:07.040 --> 00:31:13.860
It's hard to simulate proper CI, CD, merge conflict, PR discussions on your own little
00:31:13.860 --> 00:31:14.420
hobby project.
00:31:14.420 --> 00:31:14.960
That's for sure.
00:31:14.960 --> 00:31:19.820
This portion of Talk Python To Me is brought to you by Sentry.
00:31:19.820 --> 00:31:24.520
You know Sentry for their error tracking service, but did you know you can take that all the
00:31:24.520 --> 00:31:28.700
way through your multi-tiered and distributed app with their distributed tracing feature?
00:31:28.700 --> 00:31:34.400
Distributed tracing is a debugging technique that involves tracking requests of your system,
00:31:34.720 --> 00:31:38.700
starting from the very beginning, like a user action, all the way to the backend, database
00:31:38.700 --> 00:31:40.080
and third-party services.
00:31:40.080 --> 00:31:45.080
This can help you identify if the cause of an error in one project is due to the error in
00:31:45.080 --> 00:31:45.460
another.
00:31:45.460 --> 00:31:50.340
Every system can benefit from distributed tracing, but they're especially useful for microservices.
00:31:50.340 --> 00:31:55.220
In this architecture, logs won't give you the full picture, so you can't debug every
00:31:55.220 --> 00:31:57.160
request in full just by reading the logs.
00:31:57.160 --> 00:32:02.880
Distributed tracing with a platform like Sentry gives you a visual overview about which services
00:32:02.880 --> 00:32:05.360
were called during the execution of certain requests.
00:32:05.360 --> 00:32:11.300
Aside from debugging and visualizing your architecture, distributed tracing also helps you identify
00:32:11.300 --> 00:32:12.520
performance bottlenecks.
00:32:12.520 --> 00:32:17.540
Through a visual like a Gantt chart, you can see if a particular span in your stack took longer
00:32:17.540 --> 00:32:21.420
than expected and how it could be causing slowdowns in other parts of your app.
00:32:21.420 --> 00:32:26.400
Learn more and see some examples in the tracing section at docs.sentry.io.
00:32:26.400 --> 00:32:31.100
To take advantage of all the features of the Sentry platform, just create your free account.
00:32:31.100 --> 00:32:36.640
And for all of you Talk Python listeners, use the code TALKPYTHON, all one word, and you'll
00:32:36.640 --> 00:32:39.560
activate a free month of their premium paid features.
00:32:39.560 --> 00:32:44.200
Get started today at talkpython.fm/sentry-trace.
00:32:44.200 --> 00:32:47.280
That link is in your podcast player show notes and the episode page.
00:32:47.740 --> 00:32:50.580
Thank you to Sentry for supporting Talk Python To Me.
00:32:52.320 --> 00:32:54.200
So we're number two.
00:32:54.200 --> 00:32:55.720
We'll cover, get a project.
00:32:55.720 --> 00:32:57.560
Yeah, we can go through some of these a little faster.
00:32:57.560 --> 00:32:58.900
Yeah, no, of course we can.
00:32:58.900 --> 00:32:59.840
What's number three?
00:32:59.840 --> 00:33:02.780
Number three is don't limit your learning to what's needed for your project.
00:33:02.780 --> 00:33:07.820
So it's important to have a specific project in mind to give context for what you're learning
00:33:07.820 --> 00:33:13.620
and give purpose and steer you towards feeling success and knowing like what's good enough.
00:33:14.300 --> 00:33:18.900
But always be ready to expand your toolbox and your understanding and it'll serve all your
00:33:18.900 --> 00:33:20.320
projects in the end.
00:33:20.320 --> 00:33:21.380
And learning is fun.
00:33:21.380 --> 00:33:23.000
Learning in good ways is fun.
00:33:23.000 --> 00:33:25.280
Learning with good resources, with good people.
00:33:25.280 --> 00:33:28.760
You want to learn FastAPI, here's your FastAPI worksheet.
00:33:28.760 --> 00:33:29.780
The answers are in the back.
00:33:29.780 --> 00:33:30.120
Yeah.
00:33:30.120 --> 00:33:34.740
I have a kid in middle school, so we shouldn't talk about worksheets.
00:33:34.740 --> 00:33:41.060
But a quick example is I'm working on a project called Django Simple Deploy that automates
00:33:41.060 --> 00:33:43.220
deployment for projects in Django.
00:33:43.220 --> 00:33:44.540
It's not just for beginners.
00:33:44.540 --> 00:33:49.600
When Heroku collapsed its free tier a couple years ago, we saw a bunch of very experienced
00:33:49.600 --> 00:33:53.440
Python web people en masse go look at other platforms.
00:33:53.440 --> 00:33:59.900
And we saw them talking about how difficult it is to go through each platform's documentation
00:33:59.900 --> 00:34:02.820
and get a simple app deployed just to see the process.
00:34:02.820 --> 00:34:07.440
And so this tool is a core command, manage.py simple deploy.
00:34:07.440 --> 00:34:12.320
And then you name the platform and it configures your project for that platform.
00:34:12.840 --> 00:34:14.000
And then you can push it.
00:34:14.000 --> 00:34:20.260
And so it's set up as a core command that then calls out to a platform-specific command
00:34:20.260 --> 00:34:22.420
and configures your project for those commands.
00:34:22.420 --> 00:34:26.900
And so when I first wrote it, my first pass was just a bunch of classes that they work together
00:34:26.900 --> 00:34:29.320
because I wrote them and they're all nice.
00:34:29.320 --> 00:34:33.440
But I had learned about abstract-based classes but never had a purpose for using one.
00:34:33.760 --> 00:34:44.240
And so when this project is becoming, as this project is becoming more refined, I need to enforce a structure so that the platform-specific code works with the platform agnostic code.
00:34:44.740 --> 00:34:54.580
And so if I hadn't, or I should say this the positive way, because I had done some general learning about more advanced object-oriented principles,
00:34:54.580 --> 00:34:59.080
I have some sense of how to enforce that structure as the need arises.
00:34:59.460 --> 00:35:06.580
So it's good to have a project in mind, but don't limit what you're learning just to that project because you'll become a better programmer and you'll do your projects better.
00:35:06.580 --> 00:35:06.860
Sure.
00:35:06.860 --> 00:35:13.140
One of the ideas I think is really powerful is that inspiration is perishable, right?
00:35:13.240 --> 00:35:17.940
If you are inspired about something, you might not be that inspired in a couple of weeks.
00:35:17.940 --> 00:35:19.360
And that doesn't mean it's not cool anymore.
00:35:19.360 --> 00:35:24.020
That just means, you know, you moved on, your focus is elsewhere, whatever.
00:35:24.020 --> 00:35:29.660
And so, yeah, sure, you need to learn the things you need to learn to do your project or to check some boxes.
00:35:29.660 --> 00:35:34.280
But if you find something, you're like, I am really interested in that.
00:35:34.280 --> 00:35:36.680
Like, you know, leverage that inspiration.
00:35:36.680 --> 00:35:44.300
I don't know about other people, but for me, I'm like two or three times more productive in learning and writing code and all sorts of things.
00:35:44.300 --> 00:35:49.280
If I'm like really on fire about something versus like, ah, I guess I'll get in there and like fix that bug.
00:35:49.280 --> 00:35:56.300
And like something that I'm not inspired about is MailChimp just changed their API and deprecated their, you know, shut off their old one.
00:35:56.300 --> 00:35:59.620
So now to have people on my mailing list, I got to go rewrite that.
00:35:59.620 --> 00:36:03.300
There's no, what I get in the end is I get to just keep having them on my mailing list.
00:36:03.300 --> 00:36:04.640
There's zero inspiration there.
00:36:04.640 --> 00:36:12.480
But if I ran across like, oh, there's this new feature in Python 3.12, or there's this new package that I found on PyPI that's awesome.
00:36:12.480 --> 00:36:15.260
Like, and I just really want to like leverage that.
00:36:15.260 --> 00:36:15.520
Right.
00:36:15.520 --> 00:36:18.040
But while it's, while it's there, take advantage of it.
00:36:18.040 --> 00:36:18.460
All right.
00:36:18.460 --> 00:36:19.480
Number four.
00:36:19.480 --> 00:36:20.000
Yeah.
00:36:20.000 --> 00:36:20.480
Number four.
00:36:20.480 --> 00:36:21.000
What do we got?
00:36:21.000 --> 00:36:22.060
Read good code.
00:36:22.060 --> 00:36:29.080
And this is one of those things that I wish I had been told a lot earlier in my programming career than I was.
00:36:29.080 --> 00:36:40.900
I went a long time, decades, just looking at code that was presented in the classes and books I read and then writing my own code and then only reading what I needed to in order to do my projects.
00:36:41.000 --> 00:36:47.680
And then at some point, I forget if I saw a suggestion to do this or if I just started to do it out of curiosity.
00:36:47.680 --> 00:36:53.540
I think it was probably around the time when a lot of code became very visible through platforms like GitHub.
00:36:53.540 --> 00:36:57.640
But if you're using a library like, say, Pandas, that is out in the open.
00:36:57.640 --> 00:37:05.480
And so rather than just using Pandas functions, you can go look at the code that runs that function.
00:37:06.480 --> 00:37:11.340
So Pandas has, I shouldn't say Pandas because I'm just starting to get more fluent with that, more comfortable.
00:37:11.340 --> 00:37:13.000
So I'll say like matplotlib.
00:37:13.000 --> 00:37:19.480
So if you're making a scatterplot, fig.scatter or something like that, you can go look at that scatter function and see what it does.
00:37:19.480 --> 00:37:22.040
You see the full set of arguments that it can take.
00:37:22.040 --> 00:37:23.300
You see all of its capabilities.
00:37:23.300 --> 00:37:30.260
And you see how the people writing and maintaining matplotlib take your information and turn it into a plot.
00:37:30.260 --> 00:37:34.380
And when you look at that code, you're seeing professional quality code.
00:37:34.380 --> 00:37:35.740
It can be overwhelming.
00:37:36.060 --> 00:37:38.980
There's probably going to be parts that you understand and parts that you don't.
00:37:38.980 --> 00:37:40.860
But the more you look at it, the more you understand.
00:37:40.860 --> 00:37:44.780
And you start, your code becomes better because you're seeing high quality code.
00:37:44.780 --> 00:37:50.840
It's good to recognize that those people writing that did not write that polished code the first time they wrote the scatter function.
00:37:50.840 --> 00:37:55.160
So don't think, I'm a bad programmer because my code doesn't look like this.
00:37:55.160 --> 00:38:00.740
The polished code that we look at from large, popular, well-established frameworks has been well-refined.
00:38:00.740 --> 00:38:02.820
And so it's something to aim for.
00:38:02.820 --> 00:38:04.020
Yeah, it totally is.
00:38:04.300 --> 00:38:10.780
It's one of those things that's hard to get experience with if you're kind of not yet working as a professional developer.
00:38:10.780 --> 00:38:16.060
Or even if you are, but you're a one to two person shop where you don't collaborate a lot.
00:38:16.060 --> 00:38:16.440
Right.
00:38:16.440 --> 00:38:16.900
Right.
00:38:17.220 --> 00:38:23.440
It doesn't have to be that you're not working as a pro, you know, working as part of your job in that, right?
00:38:23.440 --> 00:38:26.860
It could be that you just don't have enough collaboration or enough people.
00:38:26.860 --> 00:38:27.400
Yeah.
00:38:27.400 --> 00:38:27.860
Yeah.
00:38:27.860 --> 00:38:28.420
And a good thing.
00:38:28.420 --> 00:38:29.240
So good advice.
00:38:29.240 --> 00:38:30.640
It could be hard to know where to look.
00:38:30.640 --> 00:38:31.400
All right.
00:38:31.400 --> 00:38:34.440
So if I look at the Python source code giant, I have no idea where to look.
00:38:34.440 --> 00:38:35.780
Look at the most recent commits.
00:38:35.780 --> 00:38:44.580
So just pick a commit, look at the files that were changed and get some sense of what people are doing to modify the language and these larger libraries.
00:38:44.580 --> 00:38:46.000
Look at the newest issues.
00:38:46.000 --> 00:38:50.640
What are people discussing about what they're trying to work on and how they're trying to solve that?
00:38:50.640 --> 00:38:52.920
And maybe look at some of the longest open issues.
00:38:52.920 --> 00:38:58.100
What are the hardest problems that people are wrestling with in some of these projects that we all use?
00:38:58.260 --> 00:38:58.960
All good advice.
00:38:58.960 --> 00:39:17.100
I would say the larger the open source project and the more popular, maybe harder it is to read, you know, because it has to be more polished and more optimized and more, you know, it's just it's got that extra layer of, well, it's going to make it harder to read, but it'll make it 2% faster.
00:39:17.100 --> 00:39:18.840
And people will appreciate that.
00:39:18.840 --> 00:39:19.980
So we're going to do that.
00:39:19.980 --> 00:39:27.840
Whereas there's a tier below that of open source things that are professional level, but not yet kind of beyond approachable.
00:39:28.120 --> 00:39:35.420
Yeah, I did two newsletter posts recently about exploring recent Python repositories to get at this exact issue.
00:39:35.420 --> 00:39:38.320
So the idea, if you're looking at contributing to Django, it's hard.
00:39:38.320 --> 00:39:43.140
Django community is doing a lot of work to make it more approachable for people wanting to contribute.
00:39:43.140 --> 00:39:48.700
But it's absolutely true that it's hard to contribute to and get into larger, well-established code bases.
00:39:49.080 --> 00:39:58.260
So I use the GitHub API to find, say, all the Python projects that have pushed to GitHub in the last three weeks that have at least 10 stars.
00:39:58.260 --> 00:40:00.800
And those are the fresh projects that are getting attention.
00:40:00.800 --> 00:40:03.540
We don't have all this long-term stuff.
00:40:03.540 --> 00:40:09.880
And so I ended up actually contributing to one of those projects because it's just what you described earlier, just pulled me in and fascinated me.
00:40:09.880 --> 00:40:14.780
And it's so nice to have some concrete contributions to a project that is in that fresh stage.
00:40:14.780 --> 00:40:15.780
Yeah, that's fantastic.
00:40:15.780 --> 00:40:17.000
All right, what's the next one?
00:40:17.000 --> 00:40:17.900
Know your tools.
00:40:19.440 --> 00:40:28.600
I laugh at this one because I think about this is one of the reasons I transitioned into an equal focus between programming and teaching.
00:40:28.600 --> 00:40:32.860
I used to, my priority was 98% teaching and 2% programming.
00:40:32.860 --> 00:40:36.960
And now I'm probably 60% program, 40% teaching.
00:40:36.960 --> 00:40:39.380
Tools for teachers are terrible.
00:40:39.380 --> 00:40:43.920
Teachers, public school teachers still write most of their lesson plans in Microsoft Word.
00:40:43.920 --> 00:40:48.640
And that sounds like, oh gosh, they just have to like write out onto a blank page.
00:40:48.820 --> 00:40:53.420
But what it really means is we as programmers are used to working with structured data.
00:40:53.420 --> 00:41:01.760
And so if we have a workflow and we're writing something and then we update the structure of our information, we don't have to go back and rewrite everything.
00:41:01.760 --> 00:41:04.980
We have tools that manage restructuring projects.
00:41:04.980 --> 00:41:13.100
If you write three years of lesson plans in Word and then you figure out how to teach better and you want to restructure all your lessons, there's no automated way to do that.
00:41:13.100 --> 00:41:13.820
It's a mess.
00:41:13.820 --> 00:41:23.240
And so I'm grateful as a programmer to have things like IDEs, formatters, linters, Git, any version control system, GitHub hosting platforms.
00:41:23.780 --> 00:41:35.000
And so my core advice here is to, as you're becoming more established as a programmer and as a Python programmer, start to recognize what are the tools that you personally find value in?
00:41:35.000 --> 00:41:36.400
What is your favorite IDE?
00:41:36.400 --> 00:41:38.180
What is your preferred formatter?
00:41:38.180 --> 00:41:40.620
What's your preferred linter version control system?
00:41:41.180 --> 00:41:44.620
And then just take a little time to focus on that tool itself.
00:41:44.620 --> 00:41:50.320
So if you've been using VS Code for six months, spend three days and just read about configuring VS Code.
00:41:50.320 --> 00:41:56.820
You'll almost certainly come up with some things that make your day-to-day work more efficient, more effective, more enjoyable.
00:41:56.820 --> 00:42:00.560
Every time I've taken time to do this, I've come out better for it.
00:42:00.700 --> 00:42:06.220
Yeah, whether it's VS Code or PyCharm, they both have a ton of options that you can pick from.
00:42:06.220 --> 00:42:09.160
They're discoverable or less discoverable in different ways.
00:42:09.160 --> 00:42:18.720
Like PyCharm makes it kind of obvious what all the things it can do, but there's so many things that people are like, well, I'm just going to stick to my lane and just stay over here and do the thing.
00:42:18.720 --> 00:42:21.120
VS Code is a little less discoverable.
00:42:21.120 --> 00:42:28.220
But maybe it makes it even harder to take full advantage of it because it's like the command shift P to pull up the palette and then like, well, there's a huge list.
00:42:28.220 --> 00:42:28.960
What'd I do with this?
00:42:29.340 --> 00:42:30.000
Yes, yes.
00:42:30.000 --> 00:42:33.160
But they're being really good with your editor.
00:42:33.160 --> 00:42:39.700
I know some of the things that are coming as well on your list, this adds on top of it, but it makes a huge difference.
00:42:39.700 --> 00:42:46.540
It makes things like being comfortable navigating your code feel better, testing your code, changing your code, right?
00:42:46.540 --> 00:42:51.440
Doing some of these workflows you talked about, like Git and PRs, all of that stuff.
00:42:51.440 --> 00:42:54.560
All of those things are in those tools, plus way more.
00:42:54.560 --> 00:42:58.500
That's not even talking about the extensions or plugins that you might go after, right?
00:42:58.620 --> 00:43:04.420
And so, but it's easy to see like, well, I've fired it up and then now it's an editor, right?
00:43:04.420 --> 00:43:06.700
It's a thing and then, oh, it has cool autocomplete.
00:43:06.700 --> 00:43:10.560
And then just kind of forget about the hundred other things that it can help you with.
00:43:10.560 --> 00:43:10.880
Yeah.
00:43:10.880 --> 00:43:13.500
And particularly with IDEs, they do a lot for us.
00:43:13.500 --> 00:43:16.400
And that can be a good thing and it can be a bad thing.
00:43:16.400 --> 00:43:24.300
I have steered a lot of people back towards simpler editors like Sublime Text and even Genie is a fantastic one that a lot of people don't know about.
00:43:24.980 --> 00:43:31.340
Because the tools like VS Code, PyCharm, whatnot, when everything's working, what they do for us is fantastic.
00:43:31.340 --> 00:43:36.600
When things stop working, if you don't know what it's trying to do for you, it can just make things much more confusing.
00:43:36.600 --> 00:43:42.580
And particularly that comes down to things like tools that build virtual environment for a new project for you.
00:43:42.780 --> 00:43:46.800
So if you understand what that's doing and it stops working, you can go troubleshoot it.
00:43:46.800 --> 00:43:52.260
But if you don't know what it did for you and now like it says this module is not found, it can be a mess.
00:43:52.260 --> 00:43:53.960
And so, yeah, you can.
00:43:53.960 --> 00:43:58.520
Virtual environments seem to be just like, they just go wrong so often.
00:43:58.520 --> 00:43:58.900
Yeah.
00:43:58.900 --> 00:44:04.240
I'm not in the pure, I've created one on the terminal and like I've acted, like that's solid.
00:44:04.240 --> 00:44:08.980
But in the tooling, it's like, sometimes it finds it, sometimes it doesn't.
00:44:08.980 --> 00:44:10.860
Sometimes it really doesn't want to find it.
00:44:10.860 --> 00:44:12.300
You know, like it's nuts.
00:44:12.300 --> 00:44:12.560
Yeah.
00:44:12.560 --> 00:44:12.960
Yeah.
00:44:12.960 --> 00:44:14.240
And so I'm glad you brought that up.
00:44:14.240 --> 00:44:22.040
So the core advice there for me has always been people have a tendency to want to go find another editor or IDE that's going to manage that better.
00:44:22.040 --> 00:44:27.320
And what I tell them is, no, it's going to manage it differently and you're going to run into the same issue and then you're going to need to solve it.
00:44:27.320 --> 00:44:36.500
So when that stuff happens, taking the time to learn what your editor is doing for you and then be able to troubleshoot that, that's going to serve you well in the long run.
00:44:36.500 --> 00:44:36.840
All right.
00:44:36.840 --> 00:44:37.740
What's next?
00:44:37.740 --> 00:44:39.240
Learn how to test your code.
00:44:40.000 --> 00:44:43.540
And I wrote here, you won't sleep more, but your sleep will be more restful.
00:44:44.220 --> 00:44:47.980
I went probably 20 years programming without ever writing a test.
00:44:47.980 --> 00:44:50.160
And I always had this notion that it was difficult.
00:44:50.160 --> 00:44:51.600
It was separate from programming.
00:44:51.600 --> 00:44:54.900
And the first time I wrote a test, it was so much easier than I thought.
00:44:54.900 --> 00:45:00.160
And so cool to see my program run automatically and have the output validated.
00:45:00.560 --> 00:45:01.300
I love testing.
00:45:01.300 --> 00:45:05.640
It's probably my biggest interest these days beyond deploying Django projects.
00:45:05.640 --> 00:45:09.580
And I love it because, you know, when we write code, we want it to work.
00:45:09.580 --> 00:45:13.720
When we have a project, we want our project to be successful.
00:45:13.720 --> 00:45:15.980
And so testing validates that.
00:45:15.980 --> 00:45:20.100
Testing gives you confidence that your project is working correctly.
00:45:20.100 --> 00:45:22.280
And if you fix a bug, you just fix it once.
00:45:22.840 --> 00:45:25.820
So testing is its own podcast for some people.
00:45:25.820 --> 00:45:29.360
So I'll just say that testing is easier than a lot of people think it is.
00:45:29.360 --> 00:45:30.420
Go use pytest.
00:45:30.420 --> 00:45:33.260
I used to teach unit tests because it's in the standard library.
00:45:33.260 --> 00:45:36.160
But pytest has become well established enough.
00:45:36.160 --> 00:45:41.640
It's one of my favorite Python packages of all because it's one of those few that serves
00:45:41.640 --> 00:45:44.540
pure beginners and experts equally well.
00:45:44.540 --> 00:45:47.000
It's the best way to be introduced to testing.
00:45:47.180 --> 00:45:50.620
And if you're testing professionally, there's no tool better than that.
00:45:50.620 --> 00:45:52.180
That's the Zen of Python, right?
00:45:52.180 --> 00:45:55.880
That it's really serves beginners well, but also experts well.
00:45:55.880 --> 00:45:58.400
I think that's one of its special capabilities.
00:45:58.400 --> 00:45:58.780
Yeah.
00:45:58.780 --> 00:46:00.840
I will encourage people.
00:46:00.840 --> 00:46:03.220
And Michael, I'd be curious if you agree with this or not.
00:46:03.220 --> 00:46:08.360
I'd encourage people to not necessarily look at unit tests right away because unit tests are
00:46:08.360 --> 00:46:09.560
brittle for newer projects.
00:46:09.560 --> 00:46:11.720
I really like end-to-end testing.
00:46:11.720 --> 00:46:15.900
And that is where you run your project, you get some output, and then you run tests against
00:46:15.900 --> 00:46:16.420
that output.
00:46:16.420 --> 00:46:19.920
And that is not testing the implementation of your project.
00:46:19.920 --> 00:46:22.020
That's just saying, does your project work?
00:46:22.020 --> 00:46:26.840
And so the project I've been pulled into recently is one called git-sim, git-sim.
00:46:26.840 --> 00:46:31.600
And you run it against your own project, and it gives you a visualization of all your commits.
00:46:31.600 --> 00:46:35.640
And so for people trying to understand how git works or how git is working for their particular
00:46:35.640 --> 00:46:41.500
project, you run git-sim merge, and it shows you visualization of what that merge would
00:46:41.500 --> 00:46:41.960
look like.
00:46:41.960 --> 00:46:44.440
And so that project is newer, and it had no tests.
00:46:44.440 --> 00:46:46.680
And so I helped write the initial test suite.
00:46:47.240 --> 00:46:52.020
And I told the person, like, we shouldn't test your implementation because you should
00:46:52.020 --> 00:46:56.520
be free to change how you're building this new project, but we should absolutely start
00:46:56.520 --> 00:47:00.660
to test the images that you're generating so that when you do change your implementation,
00:47:00.660 --> 00:47:05.580
you know whether the images that your users are going to see are the ones that you think
00:47:05.580 --> 00:47:07.520
that you've been seeing and you think they're going to see.
00:47:08.000 --> 00:47:13.880
And so that's really nice because you don't have to aim for 100% coverage of your code.
00:47:13.880 --> 00:47:16.340
You just start to get that big picture.
00:47:16.340 --> 00:47:18.680
Yes, my project is still doing what I think it's doing.
00:47:18.680 --> 00:47:23.080
That makes for better sleep, and all of your non-computer activities are more enjoyable because
00:47:23.080 --> 00:47:25.260
you have more confidence that things keep working.
00:47:25.260 --> 00:47:29.760
Yeah, I'm with you on not going too far down the unit test side.
00:47:29.820 --> 00:47:34.180
I used to write tons and tons of very low-level focus unit tests.
00:47:34.180 --> 00:47:39.400
And when I was on a team, I always had a hard time having everybody have buy-in.
00:47:39.400 --> 00:47:40.440
Some people would.
00:47:40.440 --> 00:47:41.660
Some people wouldn't.
00:47:41.660 --> 00:47:43.680
They'd go do something that would break the test.
00:47:43.680 --> 00:47:45.500
You're like, you broke the bill.
00:47:45.500 --> 00:47:47.860
They're like, oh, yeah, I guess I did.
00:47:47.860 --> 00:47:51.260
You're like, you realize that we don't all participate in this.
00:47:51.260 --> 00:47:58.260
It just becomes a hassle for me, chasing after, trying to patch up the tests as you make these
00:47:58.260 --> 00:47:58.580
changes.
00:47:58.580 --> 00:48:04.840
And as you're lower level in the world, that's just a more constant problem.
00:48:04.840 --> 00:48:07.220
And it also requires more effort, right?
00:48:07.220 --> 00:48:08.440
So maybe that effort is worthwhile.
00:48:08.440 --> 00:48:10.820
But if you're new, maybe it's not.
00:48:10.820 --> 00:48:16.000
And so I'm a little bit more on board with just like, let's do the main things at kind of
00:48:16.000 --> 00:48:17.160
top to bottom in the app.
00:48:17.160 --> 00:48:20.920
And if that stuff hangs on, we got a real good chance.
00:48:20.920 --> 00:48:26.380
And over time, my experience has been, for the most part, things blow up hard.
00:48:26.380 --> 00:48:29.440
They don't just like, oh, there's some little subtle problem.
00:48:29.440 --> 00:48:34.500
Generally, not always true, but generally, like if I screw something up, a lot of tests start
00:48:34.500 --> 00:48:38.460
failing, even when they're these high-level things, because something's pretty, pretty messed
00:48:38.460 --> 00:48:38.700
up.
00:48:38.700 --> 00:48:43.620
And in that regard, that other person probably didn't intend to change the output or the overall
00:48:43.620 --> 00:48:46.860
behavior of the app in well-known ways.
00:48:46.860 --> 00:48:51.740
They just changed some implementation detail, and they weren't being sufficiently rigorous
00:48:51.740 --> 00:48:54.320
with their software lifecycle.
00:48:54.320 --> 00:48:56.020
So yes, I'm on board.
00:48:56.020 --> 00:49:01.620
The web equivalent, the easiest web equivalent that I can think of is if you've got a website
00:49:01.620 --> 00:49:06.400
and it has a sitemap, your website should have a sitemap for all of your data-driven pages.
00:49:06.400 --> 00:49:09.180
Just go get the sitemap and request every page.
00:49:09.180 --> 00:49:12.600
Does it give you a 200 or does it give you a 500 or a 404?
00:49:12.600 --> 00:49:16.420
Because 404s and 500s should not be found in your sitemap.
00:49:16.420 --> 00:49:16.760
Right?
00:49:16.760 --> 00:49:19.000
But that's a really easy test, right?
00:49:19.000 --> 00:49:24.340
Like loop over that, call every one of those with your, you know, self.client.get or whatever
00:49:24.340 --> 00:49:26.840
your HTTP test thing looks like.
00:49:26.840 --> 00:49:27.680
And just call all of them.
00:49:27.680 --> 00:49:29.820
That's one thing you could do that's in that category.
00:49:30.020 --> 00:49:34.280
And as an author, I wrote tests for most of the code in Python Crash Course.
00:49:34.280 --> 00:49:38.200
And so Python Crash Course was first written, I think, on Python 3.5.
00:49:38.200 --> 00:49:42.640
And so it's been through like, what, six or seven iterations of Python and all kinds of
00:49:42.640 --> 00:49:45.020
iterations of the libraries that the projects use.
00:49:45.400 --> 00:49:50.220
And so whenever a new issue comes out or new, sorry, version comes out, I just run tests
00:49:50.220 --> 00:49:51.340
on most of the code in the book.
00:49:51.340 --> 00:49:56.780
And it pulls the test pulls the code from the GitHub repository for the book and just runs
00:49:56.780 --> 00:49:57.600
it with the new versions.
00:49:57.600 --> 00:50:02.860
And that's been part of how I've been able to maintain the upkeep and maintenance
00:50:02.860 --> 00:50:05.840
on a 500 page book that covers a lot.
00:50:05.840 --> 00:50:06.160
Yeah.
00:50:06.160 --> 00:50:06.720
Yeah.
00:50:06.720 --> 00:50:07.260
That's awesome.
00:50:07.260 --> 00:50:07.580
Yeah.
00:50:07.580 --> 00:50:08.300
Let's keep going.
00:50:08.300 --> 00:50:13.280
There's a couple of good comments and questions in the audience, but I think we're on, we're on
00:50:13.280 --> 00:50:13.660
a schedule.
00:50:13.660 --> 00:50:14.480
So let's keep going.
00:50:14.480 --> 00:50:14.840
Yeah.
00:50:14.840 --> 00:50:15.060
Yeah.
00:50:15.400 --> 00:50:16.420
Last comment about testing.
00:50:16.420 --> 00:50:20.060
I love it because I think that when you test your code, you learn things about your code
00:50:20.060 --> 00:50:21.920
that makes development better as well.
00:50:21.920 --> 00:50:23.740
So it's not just, does it work?
00:50:23.740 --> 00:50:27.260
It's also gives you insight into, into how your code is working.
00:50:27.260 --> 00:50:29.240
I'm looking forward to exploring more.
00:50:29.240 --> 00:50:29.820
All right.
00:50:29.820 --> 00:50:30.320
Next point.
00:50:30.320 --> 00:50:32.660
Know what's good enough for any given project.
00:50:32.660 --> 00:50:35.860
As a teacher, students would say like, am I done?
00:50:35.860 --> 00:50:36.400
Am I done?
00:50:36.400 --> 00:50:37.120
Is this good enough?
00:50:37.120 --> 00:50:40.980
And I watch other teachers say like, don't ask me that.
00:50:40.980 --> 00:50:41.840
Always work harder.
00:50:41.840 --> 00:50:44.340
And I always tell the students, that's a great question.
00:50:44.580 --> 00:50:45.680
What is good enough?
00:50:45.680 --> 00:50:49.780
And so whatever your project is, knowing your benchmark for what's good enough and when
00:50:49.780 --> 00:50:53.720
it's done, when you can move on to the next thing is really helpful because you'll never
00:50:53.720 --> 00:50:56.840
write perfect code, but you can certainly write good enough code.
00:50:56.980 --> 00:50:57.080
Yeah.
00:50:57.080 --> 00:51:02.820
And there was a really popular article, blog post, something like that, that was, you're
00:51:02.820 --> 00:51:03.420
not Facebook.
00:51:03.420 --> 00:51:04.580
You're not Google.
00:51:04.580 --> 00:51:05.920
You're not Microsoft.
00:51:05.920 --> 00:51:06.840
You're not LinkedIn.
00:51:06.840 --> 00:51:08.280
Something along those lines.
00:51:08.280 --> 00:51:08.540
Right.
00:51:08.540 --> 00:51:14.840
And the admonishment or the advice there was, you might read about how somebody like Google
00:51:14.840 --> 00:51:21.260
has this, all these containers doing all this scale out and failover and geo location.
00:51:21.640 --> 00:51:28.540
Your app that manages like reporting for managers at your app, at your company, there's five managers
00:51:28.540 --> 00:51:29.460
and they do it once a week.
00:51:29.460 --> 00:51:32.380
You don't need global scale out techniques.
00:51:32.380 --> 00:51:36.040
You don't need the zero downtime that containers offer.
00:51:36.240 --> 00:51:38.460
You don't need load balancers.
00:51:38.460 --> 00:51:40.220
Like none of that stuff applies to you.
00:51:40.220 --> 00:51:45.760
And so, in fact, I would say if you start applying those things to it, you make your application
00:51:45.760 --> 00:51:46.960
harder to deploy.
00:51:46.960 --> 00:51:50.620
You make it harder for other people and your team to work on.
00:51:50.620 --> 00:51:53.440
You make it less good for that situation.
00:51:53.440 --> 00:51:56.820
But at Google scale, the opposite is true.
00:51:56.820 --> 00:51:59.120
It's less good if it doesn't have those things.
00:51:59.120 --> 00:52:02.980
And so it's not just, well, this is a crappy project.
00:52:02.980 --> 00:52:05.500
So it gets crappy level CS attention.
00:52:05.840 --> 00:52:07.400
It's a small project.
00:52:07.400 --> 00:52:14.520
So it can be written and managed and worked on in a way that allows for, you know, optimizes
00:52:14.520 --> 00:52:20.360
for small teams, not worrying, not optimize it for uptime and all those kinds of things so
00:52:20.360 --> 00:52:22.840
that you can make it work better in that situation.
00:52:22.840 --> 00:52:24.500
And so I totally agree.
00:52:24.500 --> 00:52:27.420
Knowing what is good enough is super important.
00:52:27.420 --> 00:52:30.220
But what is good enough, it's not like a spectrum.
00:52:30.220 --> 00:52:31.640
Like I'm at the really good level.
00:52:31.640 --> 00:52:34.040
It's like you've got a, it's a multidimensional thing.
00:52:34.040 --> 00:52:37.820
Like you're at a good level for the context that you're in, the situation you're in.
00:52:37.820 --> 00:52:41.940
Hey, you're walking right into bullet point or tip number eight, I think it is.
00:52:41.940 --> 00:52:42.760
We are.
00:52:42.760 --> 00:52:43.220
Yeah.
00:52:43.220 --> 00:52:44.560
And that's embrace refactoring.
00:52:44.560 --> 00:52:48.340
And so my notes about this was that good enough is situational.
00:52:48.560 --> 00:52:52.780
So when a project proves its worth, like say you have an idea for a project, you build it
00:52:52.780 --> 00:52:58.680
out, you get an MVP functional and you've reached your good enough to see whether the idea works.
00:52:58.680 --> 00:53:01.740
If nobody ever uses it, it doesn't catch on.
00:53:01.740 --> 00:53:02.160
It worked.
00:53:02.160 --> 00:53:04.400
It was interesting, but it's just not catching on.
00:53:04.400 --> 00:53:06.060
You move on, move on to something else.
00:53:06.280 --> 00:53:11.100
But if that product has started to gain interest, now good enough moves.
00:53:11.100 --> 00:53:13.220
And so maybe it needs to be more efficient.
00:53:13.220 --> 00:53:14.640
Maybe it needs more testing.
00:53:14.640 --> 00:53:16.640
Maybe it needs to be deployed in a different way.
00:53:16.640 --> 00:53:22.380
And so refactoring tied in with that idea of what is good enough is the road for evolving
00:53:22.380 --> 00:53:22.940
a project.
00:53:23.060 --> 00:53:26.480
And all of these projects that we're talking about, the well-established ones, the Googles,
00:53:26.480 --> 00:53:31.240
the Fangs, those projects are constantly shifting bars of what is good enough.
00:53:31.240 --> 00:53:35.940
And they're constantly being refactored in very careful ways to reach those new goals.
00:53:35.940 --> 00:53:36.260
Yeah.
00:53:36.260 --> 00:53:37.160
I love refactoring.
00:53:37.160 --> 00:53:37.600
Your tools.
00:53:37.600 --> 00:53:38.480
Yeah, I do too.
00:53:38.480 --> 00:53:39.680
I think it's fantastic.
00:53:39.680 --> 00:53:45.380
So many people who are getting started will tell me things like, I'm not sure how to get
00:53:45.380 --> 00:53:45.720
started.
00:53:45.720 --> 00:53:47.920
I don't know what the best way to do this is.
00:53:47.920 --> 00:53:51.240
I'm thinking about it and I've tried something, but it didn't, I wasn't sure.
00:53:51.240 --> 00:53:56.200
So I went back to thinking and the best way to get started is just give it a shot.
00:53:56.200 --> 00:53:57.520
Just create something.
00:53:57.520 --> 00:54:00.720
You'll learn what of that is working and what is not ideal.
00:54:00.720 --> 00:54:04.900
And more importantly, something that's awesome about software is it's plastic, right?
00:54:04.900 --> 00:54:05.940
You can change it.
00:54:05.940 --> 00:54:07.440
Plastic in the soft plastic way.
00:54:07.440 --> 00:54:10.620
You can evolve it as you learn more about it.
00:54:10.620 --> 00:54:14.300
You're like, oh, I thought that should have been a separate module, but this should be just
00:54:14.300 --> 00:54:15.060
part of that class.
00:54:15.060 --> 00:54:20.020
So we're just going to move that in through refactoring and not feeling like you have to
00:54:20.020 --> 00:54:23.140
have a full visibility of what you're working on to get started.
00:54:23.140 --> 00:54:28.020
I think that that's, maybe it sounds counterintuitive, but I feel like that's kind of an expert perspective.
00:54:28.020 --> 00:54:29.900
It's like, I think I need to go that way.
00:54:29.900 --> 00:54:31.600
We're going to start down the path that way.
00:54:31.600 --> 00:54:37.880
And we're going to evolve and sort of course correct as we go rather than completely stressing
00:54:37.880 --> 00:54:39.240
about how do I get started?
00:54:39.240 --> 00:54:42.040
How do I see the whole end line before I start writing it?
00:54:42.040 --> 00:54:47.220
And this is part of why this is not a countdown because, for example, if you have even a small
00:54:47.220 --> 00:54:51.480
set of tests that test your final output, refactoring is easy.
00:54:51.480 --> 00:54:55.560
It's fun because if your tests break and you don't like the idea, you can go back to where
00:54:55.560 --> 00:54:55.960
you started.
00:54:55.960 --> 00:54:59.920
Another fun thing about refactoring is the whole concept of code smells.
00:54:59.920 --> 00:55:04.680
And I think becoming an expert, there's a lot to be learned from the code smells.
00:55:05.080 --> 00:55:08.660
And the idea of the code smells is the code works, but there's something a little bit
00:55:08.660 --> 00:55:08.980
off.
00:55:08.980 --> 00:55:10.200
It kind of makes your nose turn up.
00:55:10.200 --> 00:55:12.120
You're like, oh, oh, okay.
00:55:12.120 --> 00:55:14.100
Yeah, I guess it works, but oh, right.
00:55:14.100 --> 00:55:16.420
You know, it's just, it's just kind of an ooh.
00:55:16.420 --> 00:55:21.960
And that's, there's a lot of lessons of how things get out of control and they get into
00:55:21.960 --> 00:55:23.620
a bad state and how do you fix them?
00:55:23.620 --> 00:55:26.080
And having that intuition, I think is great.
00:55:26.080 --> 00:55:30.780
So some of the code smells are like long method, method with too many arguments.
00:55:30.780 --> 00:55:35.060
One, probably my favorite is code comments because you hear you should comment code
00:55:35.060 --> 00:55:38.480
all the time and there should be places that need a comment.
00:55:38.480 --> 00:55:41.900
There should be comments or help, help strings, whatever.
00:55:41.900 --> 00:55:47.940
But a lot of times code comments are deodorant for these code smells, right?
00:55:47.940 --> 00:55:50.320
It's like, oh, this is kind of gross.
00:55:50.320 --> 00:55:52.400
Let me make a comment about why it's gross.
00:55:52.400 --> 00:55:53.980
Or this is poorly named.
00:55:53.980 --> 00:55:55.420
People won't know what this is.
00:55:55.420 --> 00:55:57.500
So let me make a comment about what it is.
00:55:57.500 --> 00:56:01.720
And like halfway through that comment, you should realize like, oh, what if I just named it?
00:56:01.940 --> 00:56:04.740
The thing I'm trying to tell people, it kind of does.
00:56:04.740 --> 00:56:09.100
Then I don't even need a comment because it has a really good name that is its own thing,
00:56:09.100 --> 00:56:09.380
right?
00:56:09.380 --> 00:56:14.600
And so four names, too many parameters, all these things are deodorant.
00:56:14.600 --> 00:56:18.640
And you're trying to like justify how gross this part of your code is.
00:56:18.640 --> 00:56:22.480
Maybe you could just apply some of these refactoring techniques to make them better.
00:56:22.480 --> 00:56:26.400
Not going into a whole refactoring detail, but I really, really like this idea.
00:56:27.000 --> 00:56:29.360
Yeah, I write a lot of exploratory code.
00:56:29.360 --> 00:56:31.280
So you're describing a lot of my work.
00:56:31.280 --> 00:56:36.400
But because I'm fine with refactoring and enjoy it and I'm comfortable with tests, that workflow
00:56:36.400 --> 00:56:36.780
works.
00:56:36.780 --> 00:56:38.160
And I think it can work for a lot of people.
00:56:38.160 --> 00:56:39.160
Yeah, sure, sure.
00:56:39.160 --> 00:56:42.000
Well, and those things don't necessarily start out that way.
00:56:42.000 --> 00:56:44.500
The long method didn't necessarily start out long.
00:56:44.500 --> 00:56:47.260
Grew and grew until it was a monster.
00:56:47.260 --> 00:56:49.060
Same thing with too many arguments.
00:56:49.060 --> 00:56:52.380
It probably started out with one or two, but then now we need this other one.
00:56:52.380 --> 00:56:53.020
And what about that?
00:56:53.060 --> 00:56:55.620
And then all of a sudden it's like, again, a monster, right?
00:56:55.620 --> 00:56:57.280
And so it's an evolution.
00:56:57.280 --> 00:56:58.500
And it's long because it works.
00:56:58.500 --> 00:57:02.120
And so at some point you pause and clean it up, make sure it still works.
00:57:02.120 --> 00:57:04.380
All right, number nine, write things down.
00:57:04.380 --> 00:57:05.640
Yeah, write things down.
00:57:05.640 --> 00:57:07.320
And I don't say that as a writer.
00:57:07.320 --> 00:57:11.920
Writing for me, I started writing when I was young because I saw somebody else write a journal
00:57:11.920 --> 00:57:13.200
and I was like, oh, I'm going to try writing.
00:57:13.200 --> 00:57:17.840
And so I've just written things all my life and most of it is messy.
00:57:17.840 --> 00:57:22.400
And some of it, very small amount of what I've written has been polished and put out in the public
00:57:22.400 --> 00:57:22.740
world.
00:57:22.740 --> 00:57:28.760
But I have found that almost everybody I talked to who writes in some way, not for public,
00:57:28.760 --> 00:57:31.940
but writes in some way, enjoys their work a little more and does a little better.
00:57:31.940 --> 00:57:34.740
My suggestions are things like keep an ideas notebook.
00:57:34.740 --> 00:57:39.740
Those are once you know how to build things, ideas come to you and you're like, oh, I could
00:57:39.740 --> 00:57:40.580
make that at some point.
00:57:40.580 --> 00:57:44.420
And if you have a place to record those ideas when you're not sure what to do, you can go
00:57:44.420 --> 00:57:44.980
back to it.
00:57:44.980 --> 00:57:47.220
Write comments, despite what Michael said.
00:57:47.220 --> 00:57:53.220
Comments in a professional, well-established project with many collaborators are different
00:57:53.220 --> 00:57:55.380
than comments for your own new projects.
00:57:55.380 --> 00:57:57.760
So whatever you're doing, write comments.
00:57:57.760 --> 00:58:02.060
So do put the information in that needs to be in there to work, let them be cleaned up.
00:58:02.060 --> 00:58:04.080
Yeah, I don't mean to say you shouldn't write comments, right?
00:58:04.080 --> 00:58:09.440
I just, there's a lot of times where the point of the comment is to justify why something's
00:58:09.440 --> 00:58:09.800
bad.
00:58:09.800 --> 00:58:13.140
If that's the case, it probably doesn't need to be bad.
00:58:13.140 --> 00:58:17.360
But if it's help docs, if it's like, well, here's the different stuff that you could pass
00:58:17.360 --> 00:58:20.560
and these are what we expect, there's certainly valid comments, no doubt.
00:58:20.560 --> 00:58:22.420
So write comments to yourself and others.
00:58:22.420 --> 00:58:25.780
And even if nobody else is using your project, if it's something that might be shared at some
00:58:25.780 --> 00:58:26.760
point, those are good.
00:58:26.760 --> 00:58:28.060
Learn to write documentation.
00:58:28.060 --> 00:58:32.580
If you write an ideas notebook, if you write comments, documentation kind of flows out of
00:58:32.580 --> 00:58:32.760
that.
00:58:32.760 --> 00:58:35.200
It just becomes a more polished version of what you're writing.
00:58:35.200 --> 00:58:37.580
Write questions down when you're not sure about something.
00:58:37.580 --> 00:58:39.320
GitHub issues are amazing.
00:58:39.520 --> 00:58:44.340
I haven't used project management software because GitHub issues are so useful.
00:58:44.340 --> 00:58:46.940
And so even if you...
00:58:46.940 --> 00:58:46.940
No Gantt chart.
00:58:46.940 --> 00:58:48.080
No Microsoft project.
00:58:48.080 --> 00:58:49.260
Yeah, yeah.
00:58:49.260 --> 00:58:54.240
Even if you don't ever plan to write anything public, write about the code that you're working
00:58:54.240 --> 00:58:56.380
on and write for yourself.
00:58:56.380 --> 00:58:58.980
And it will almost certainly benefit the work that you do.
00:58:58.980 --> 00:59:03.660
Writing helps you crystallize your thoughts and make sure you have them all coherent, right?
00:59:03.840 --> 00:59:04.160
All right.
00:59:04.160 --> 00:59:04.780
All right.
00:59:04.780 --> 00:59:05.340
Last one.
00:59:05.340 --> 00:59:06.180
Big tip.
00:59:06.180 --> 00:59:07.480
And this is a fun one to close on.
00:59:07.480 --> 00:59:08.380
Go meet people.
00:59:08.380 --> 00:59:13.460
It has long been said about Python that I came for the language and stayed for the community.
00:59:13.460 --> 00:59:16.480
People have talked about that for years because it's still true.
00:59:16.480 --> 00:59:18.380
Join online communities.
00:59:18.380 --> 00:59:22.080
Go to local, regional, national, international conferences when you can.
00:59:22.080 --> 00:59:23.280
Go to coffee shops.
00:59:23.280 --> 00:59:24.180
Ask questions.
00:59:24.180 --> 00:59:24.900
Tell stories.
00:59:24.900 --> 00:59:27.380
You will meet good people like Michael.
00:59:27.900 --> 00:59:30.140
And you, yeah, as we met at PyCon.
00:59:30.140 --> 00:59:32.220
So I think this is really good advice.
00:59:32.220 --> 00:59:38.120
I was thinking as I looked at your list that you are somebody who is not particularly metropolitan
00:59:38.120 --> 00:59:42.540
in terms of like tons of user groups and meetups, I'm guessing, where you live.
00:59:42.540 --> 00:59:45.560
It's probably a little bit of an extra challenge being in Alaska, right?
00:59:45.560 --> 00:59:46.680
Yeah, it's actually...
00:59:46.680 --> 00:59:49.960
I mean, I lived in New York City for seven years before I moved here.
00:59:49.960 --> 00:59:50.180
Right.
00:59:50.180 --> 00:59:51.300
As a contrast, right?
00:59:51.300 --> 00:59:52.000
So...
00:59:52.000 --> 00:59:52.780
Yes, yes.
00:59:53.340 --> 00:59:57.800
But most of my programming work, serious programming work has been done while I've lived here.
00:59:57.800 --> 01:00:00.360
And yeah, I don't know anybody else here who programs.
01:00:00.360 --> 01:00:05.220
And so for me going to conferences, I talk about programming the entire time at conferences
01:00:05.220 --> 01:00:06.960
because I never get to in regular life.
01:00:06.960 --> 01:00:08.460
Honestly, that's true for me as well.
01:00:08.460 --> 01:00:12.880
Even though I'm here in Portland and we have user groups and there are plenty of people who
01:00:12.880 --> 01:00:15.300
do programming, it's not that different for me, right?
01:00:15.300 --> 01:00:19.480
Because I don't go to a company where I have a team of developers.
01:00:19.480 --> 01:00:24.900
Like the people I work with, it's as real as this meeting with you and me here on a video
01:00:24.900 --> 01:00:26.740
screen share sort of thing, right?
01:00:26.740 --> 01:00:32.780
And I think this is the story of more people than just if you live outside of some big metropolis.
01:00:32.780 --> 01:00:33.540
Yeah, yeah.
01:00:33.540 --> 01:00:34.380
Quick story.
01:00:34.380 --> 01:00:38.700
First time I went to PyCon, I was intimidated because I was a teacher and not a programmer.
01:00:38.700 --> 01:00:41.520
And so I thought I would not find my place.
01:00:41.520 --> 01:00:46.820
And I walked into the hotel the first night and people pulled me right into conversation.
01:00:46.820 --> 01:00:51.880
And what I found was that roughly half the people who go to PyCon are primarily programmers
01:00:51.880 --> 01:00:53.140
looking for what to work on.
01:00:53.140 --> 01:00:57.280
And roughly half the people are people who care about some other domain than programming.
01:00:57.280 --> 01:01:01.920
And they're looking to use Python and programming to solve the problems they care about in their
01:01:01.920 --> 01:01:02.240
domain.
01:01:02.240 --> 01:01:03.460
And so it's true.
01:01:03.460 --> 01:01:07.880
Everybody has a place in the Python world if you are respectful and appropriate to other
01:01:07.880 --> 01:01:08.160
people.
01:01:08.160 --> 01:01:14.340
And so if you're shy or intimidated about going out to meet people because you're not sure of
01:01:14.340 --> 01:01:17.720
your place, just go meet people and you will find your place.
01:01:17.720 --> 01:01:18.540
And it's magic.
01:01:18.540 --> 01:01:19.120
Yeah.
01:01:19.120 --> 01:01:22.640
I think I'm hopefully I'm not misremembering this.
01:01:22.640 --> 01:01:26.500
I think almost half the people at PyCon this year were first time attendees.
01:01:26.500 --> 01:01:27.580
So if you're thinking.
01:01:27.580 --> 01:01:28.320
Oh, no.
01:01:28.320 --> 01:01:29.480
It was like 78.
01:01:29.480 --> 01:01:30.600
It was over half.
01:01:30.600 --> 01:01:31.560
It was like 80%.
01:01:31.560 --> 01:01:32.300
Yeah.
01:01:32.300 --> 01:01:32.660
Yeah.
01:01:32.660 --> 01:01:33.280
I was amazed.
01:01:33.280 --> 01:01:33.680
Yeah.
01:01:33.980 --> 01:01:38.560
I'm not sure how much of that's a COVID hangover sort of thing, because not there were not
01:01:38.560 --> 01:01:42.740
as many people who came as say in 2019.
01:01:42.740 --> 01:01:47.920
So maybe they were more icon curious folks than say the people who had been there for the
01:01:47.920 --> 01:01:48.560
last 10 years.
01:01:48.560 --> 01:01:50.380
Like, I still want to skip this one.
01:01:50.380 --> 01:01:51.880
I will see where it shapes up.
01:01:51.880 --> 01:01:55.580
But there's a really high number, whatever that that number turned out to be.
01:01:55.680 --> 01:02:00.680
And the equilibrium is that there's a ton of people at these types of events who are
01:02:00.680 --> 01:02:01.820
like, this is my first time here.
01:02:01.820 --> 01:02:05.920
So if you're concerned about going to these events and feeling like, oh, I'm going to be
01:02:05.920 --> 01:02:09.500
the one newbie and feel out of place, like probably the opposite.
01:02:09.500 --> 01:02:09.820
Yeah.
01:02:09.820 --> 01:02:10.740
You know?
01:02:10.740 --> 01:02:11.220
Yeah.
01:02:11.220 --> 01:02:12.720
You end up with lifelong friends.
01:02:12.720 --> 01:02:13.320
Absolutely.
01:02:13.320 --> 01:02:14.600
People are in a great mood.
01:02:14.600 --> 01:02:15.760
They're on their geek holiday.
01:02:15.760 --> 01:02:16.780
It's all good.
01:02:16.780 --> 01:02:17.140
Yes.
01:02:17.220 --> 01:02:20.220
It's pretty easy to make friends and have a good time there.
01:02:20.220 --> 01:02:24.400
So that could be PyCon or EuroPython or something like that.
01:02:24.400 --> 01:02:25.920
Or it could just be a local.
01:02:25.920 --> 01:02:30.260
There's a lot of regional Python meetups like PyCascades here in the Pacific Northwest,
01:02:30.260 --> 01:02:33.040
PyTexas, PyOhio, all these things.
01:02:33.040 --> 01:02:35.240
And none of those work for you.
01:02:35.240 --> 01:02:37.800
You know, there's forums like this, to be honest.
01:02:37.800 --> 01:02:42.540
Like part of the reason I created the podcast was to kind of get to know people better in a
01:02:42.540 --> 01:02:45.640
way that I knew wouldn't be possible for me.
01:02:45.640 --> 01:02:45.960
Right.
01:02:46.220 --> 01:02:50.000
My goal was, where do I go find the podcast to listen to, to do this?
01:02:50.000 --> 01:02:50.800
And then there was none.
01:02:50.800 --> 01:02:51.600
I was like, all right, fine.
01:02:51.600 --> 01:02:53.120
I'll create the podcast so we can do this.
01:02:53.120 --> 01:02:57.740
But my intent was just to listen to a podcast to kind of get to know people like this.
01:02:57.740 --> 01:03:00.640
It's a pretty one-way conversation as a podcast listener.
01:03:00.640 --> 01:03:03.160
Not 100% as people have seen in the audience.
01:03:03.160 --> 01:03:09.000
But it's still valuable to like eavesdrop in a sense on these conversations if you're a new
01:03:09.000 --> 01:03:09.320
person.
01:03:09.320 --> 01:03:09.700
Right.
01:03:09.700 --> 01:03:10.340
Absolutely.
01:03:10.340 --> 01:03:11.040
Yeah.
01:03:11.040 --> 01:03:11.920
All right, Eric.
01:03:11.920 --> 01:03:13.720
Well, what a fun conversation.
01:03:13.720 --> 01:03:16.000
Thank you for the awesome list.
01:03:16.500 --> 01:03:21.800
And hopefully you've inspired a lot of people out there to, you know, make forward progress
01:03:21.800 --> 01:03:23.440
on this journey that they're on.
01:03:23.440 --> 01:03:24.320
Well, thank you for having me.
01:03:24.320 --> 01:03:28.020
I've listened to you for a long time and really enjoyed your work and very happy to connect.
01:03:28.020 --> 01:03:28.320
Yeah.
01:03:28.320 --> 01:03:28.800
Same here.
01:03:28.800 --> 01:03:30.320
So final call to action.
01:03:30.320 --> 01:03:31.440
People are interested.
01:03:31.440 --> 01:03:33.760
You know, maybe tell them how to check out your book.
01:03:33.760 --> 01:03:36.240
Tell them how to put some of these ideas into action.
01:03:36.380 --> 01:03:38.820
My book is Python Crash Course from No Starch Press.
01:03:38.820 --> 01:03:40.580
Third edition came out this year.
01:03:40.580 --> 01:03:41.760
And so everything works.
01:03:41.760 --> 01:03:42.320
It's good.
01:03:42.320 --> 01:03:43.040
I keep it updated.
01:03:43.040 --> 01:03:46.180
If you buy it, you get a copy with the newest updates.
01:03:46.180 --> 01:03:46.860
Yes.
01:03:46.860 --> 01:03:49.780
I also write weekly at MostlyPython.
01:03:49.780 --> 01:03:51.880
And that's MostlyPython.substack.
01:03:51.880 --> 01:03:54.380
There are paid subscriptions, but there are also free subscriptions.
01:03:54.840 --> 01:03:59.980
And so the only advantage for paid subscriptions is that some posts are locked for six weeks.
01:03:59.980 --> 01:04:03.120
Everything I write, I want to be available to everyone.
01:04:03.120 --> 01:04:08.400
And so if you're curious about what I'm thinking about on a weekly basis, MostlyPython.
01:04:08.400 --> 01:04:08.780
Excellent.
01:04:08.780 --> 01:04:09.440
All right.
01:04:09.440 --> 01:04:10.880
Well, thanks again for being here.
01:04:10.880 --> 01:04:11.580
See you later.
01:04:11.580 --> 01:04:12.560
Thanks everyone for listening.
01:04:12.560 --> 01:04:12.880
Yes.
01:04:12.880 --> 01:04:13.540
Thank you.
01:04:15.340 --> 01:04:17.640
This has been another episode of Talk Python To Me.
01:04:17.640 --> 01:04:19.460
Thank you to our sponsors.
01:04:19.460 --> 01:04:21.060
Be sure to check out what they're offering.
01:04:21.060 --> 01:04:22.500
It really helps support the show.
01:04:22.500 --> 01:04:28.040
GlareDB is an open source database for querying distributed and disparate data.
01:04:28.040 --> 01:04:33.920
Connect your data sources and use the Python tools you already know to ask questions and
01:04:33.920 --> 01:04:35.740
integrate data across data sources.
01:04:35.740 --> 01:04:39.020
Get started today at talkpython.fm/GlareDB.
01:04:39.020 --> 01:04:41.300
Take some stress out of your life.
01:04:41.300 --> 01:04:46.780
Get notified immediately about errors and performance issues in your web or mobile applications with
01:04:46.780 --> 01:04:47.080
Sentry.
01:04:47.080 --> 01:04:52.080
Just visit talkpython.fm/sentry and get started for free.
01:04:52.080 --> 01:04:55.680
And be sure to use the promo code talkpython, all one word.
01:04:55.680 --> 01:04:57.040
Want to level up your Python?
01:04:57.040 --> 01:05:01.100
We have one of the largest catalogs of Python video courses over at Talk Python.
01:05:01.100 --> 01:05:06.260
Our content ranges from true beginners to deeply advanced topics like memory and async.
01:05:06.260 --> 01:05:08.940
And best of all, there's not a subscription in sight.
01:05:08.940 --> 01:05:11.840
Check it out for yourself at training.talkpython.fm.
01:05:11.840 --> 01:05:13.740
Be sure to subscribe to the show.
01:05:13.740 --> 01:05:16.520
Open your favorite podcast app and search for Python.
01:05:16.520 --> 01:05:17.840
We should be right at the top.
01:05:17.840 --> 01:05:22.980
You can also find the iTunes feed at /itunes, the Google Play feed at /play,
01:05:22.980 --> 01:05:27.180
and the direct RSS feed at /rss on talkpython.fm.
01:05:27.180 --> 01:05:30.620
We're live streaming most of our recordings these days.
01:05:30.620 --> 01:05:34.040
If you want to be part of the show and have your comments featured on the air,
01:05:34.040 --> 01:05:38.460
be sure to subscribe to our YouTube channel at talkpython.fm/youtube.
01:05:38.460 --> 01:05:40.300
This is your host, Michael Kennedy.
01:05:40.300 --> 01:05:41.600
Thanks so much for listening.
01:05:41.600 --> 01:05:42.780
I really appreciate it.
01:05:42.780 --> 01:05:44.680
Now get out there and write some Python code.
01:05:44.680 --> 01:06:05.340
We'll see you next time.
01:06:05.340 --> 01:06:35.320
Thank you.
00:00:00.001 --> 00:00:02.180
Getting started in Python is pretty easy.
00:00:02.180 --> 00:00:04.340
There's even a t-shirt that jokes about it.
00:00:04.340 --> 00:00:06.340
I learned Python. It was a good weekend.
00:00:06.340 --> 00:00:10.140
But to go from knowing how to create variables and writing loops
00:00:10.140 --> 00:00:13.340
to building amazing things like FastAPI and Instagram,
00:00:13.340 --> 00:00:17.000
well, there's this little gap in between those two things, don't you think?
00:00:17.000 --> 00:00:20.460
On this episode, we welcome Eric Matthews to the show.
00:00:20.460 --> 00:00:22.440
He has thought a lot about teaching Python
00:00:22.440 --> 00:00:26.480
and comes to share his 10 tips for going from Python beginner to expert.
00:00:26.980 --> 00:00:33.060
This is Talk Python To Me, episode 427, recorded July 19th, 2023.
00:00:33.060 --> 00:00:49.560
Welcome to Talk Python To Me, a weekly podcast on Python.
00:00:49.560 --> 00:00:51.300
This is your host, Michael Kennedy.
00:00:51.300 --> 00:00:53.960
Follow me on Mastodon, where I'm @mkennedy,
00:00:53.960 --> 00:00:56.420
and follow the podcast using @talkpython.
00:00:56.800 --> 00:00:58.780
Both on fosstodon.org.
00:00:58.780 --> 00:01:01.400
Be careful with impersonating accounts on other instances.
00:01:01.400 --> 00:01:02.360
There are many.
00:01:02.360 --> 00:01:05.900
Keep up with the show and listen to over seven years of past episodes
00:01:05.900 --> 00:01:07.420
at talkpython.fm.
00:01:07.420 --> 00:01:11.420
We've started streaming most of our episodes live on YouTube.
00:01:11.420 --> 00:01:15.200
Subscribe to our YouTube channel over at talkpython.fm/youtube
00:01:15.200 --> 00:01:18.980
to get notified about upcoming shows and be part of that episode.
00:01:18.980 --> 00:01:23.020
This episode is brought to you by GlareDB.
00:01:23.460 --> 00:01:28.480
GlareDB is an open source database for querying distributed and disparate data.
00:01:28.480 --> 00:01:34.360
Connect your data sources and use the Python tools you already know to ask questions and
00:01:34.360 --> 00:01:36.180
integrate data across data sources.
00:01:36.180 --> 00:01:39.440
Get started today at talkpython.fm/GlareDB.
00:01:39.440 --> 00:01:41.560
And it's brought to you by Sentry.
00:01:41.560 --> 00:01:43.820
Don't let those errors go unnoticed.
00:01:43.820 --> 00:01:44.840
Use Sentry.
00:01:45.240 --> 00:01:47.680
Get started at talkpython.fm/sentry.
00:01:47.680 --> 00:01:50.740
Eric, welcome to Talk Python To Me.
00:01:50.740 --> 00:01:51.200
Thank you.
00:01:51.200 --> 00:01:52.180
It's very nice to be here.
00:01:52.180 --> 00:01:53.740
It is very nice to have you here.
00:01:53.740 --> 00:01:58.820
The last time we were sitting around talking was at a beautiful cocktail bar
00:01:58.820 --> 00:02:02.980
at the tail end of PyCon 2023 in Salt Lake City.
00:02:02.980 --> 00:02:04.480
Not a bad place to wrap that up.
00:02:04.480 --> 00:02:05.440
No, it was very nice.
00:02:05.840 --> 00:02:06.560
What a fun event.
00:02:06.560 --> 00:02:11.460
We're going to talk about how people go from being a beginner-ish.
00:02:11.460 --> 00:02:16.340
That's a pretty broad term of what a beginner is in Python and programming.
00:02:16.340 --> 00:02:22.020
And sort of moving towards, you know, how do you take that journey, maybe more deliberately,
00:02:22.020 --> 00:02:26.900
a little more quickly, to the expert side of the software developer spectrum?
00:02:26.900 --> 00:02:28.120
It's going to be a lot of fun.
00:02:28.120 --> 00:02:28.400
Yes.
00:02:28.520 --> 00:02:28.680
Yeah.
00:02:28.680 --> 00:02:32.940
And so before we get into that, though, let's just start with your story.
00:02:32.940 --> 00:02:34.840
How did you get into programming Python?
00:02:34.840 --> 00:02:36.500
How did you end up writing books?
00:02:36.500 --> 00:02:37.500
All those things.
00:02:37.500 --> 00:02:38.100
Oh, boy.
00:02:38.100 --> 00:02:41.180
I have to be careful because it's a long story and I like telling it.
00:02:41.180 --> 00:02:46.960
I was fortunate in that my father was a software engineer in the 70s and 80s.
00:02:46.960 --> 00:02:52.880
And so when I was growing up, we had a kit computer in our basement before most people had home
00:02:52.880 --> 00:02:53.260
computers.
00:02:53.260 --> 00:02:58.060
So I got to write my first program as a basic number guessing game.
00:02:58.320 --> 00:02:59.760
When it was all about the go-tos?
00:02:59.760 --> 00:03:00.300
Yes.
00:03:00.300 --> 00:03:01.160
Line 10.
00:03:01.160 --> 00:03:01.680
Go to 10.
00:03:01.680 --> 00:03:02.720
What is your number?
00:03:02.720 --> 00:03:03.400
Yeah.
00:03:03.400 --> 00:03:03.960
Exactly.
00:03:03.960 --> 00:03:04.240
Yeah.
00:03:04.240 --> 00:03:05.680
I always had an interest in programming.
00:03:05.680 --> 00:03:12.500
And so I got to watch in real time the development from basic to logo for teaching kids to C to
00:03:12.500 --> 00:03:16.260
Pascal, Fortran, and all that variety of languages that led up to Python.
00:03:16.260 --> 00:03:22.080
My journey into Python was I was using Java in the early 2000s.
00:03:22.080 --> 00:03:24.180
And I thought I'd be a Java programmer for life.
00:03:24.180 --> 00:03:26.920
And a friend told me that, hey, you should check out Python.
00:03:27.120 --> 00:03:30.720
Your Java programs would be about a third as long as they are.
00:03:30.720 --> 00:03:33.760
Your programs would be about a third as long as they are in Java.
00:03:33.760 --> 00:03:37.700
And I couldn't really believe that because it's a pretty big claim.
00:03:37.700 --> 00:03:38.720
But I tried to end it.
00:03:38.720 --> 00:03:39.020
Yeah, that's a bold claim.
00:03:39.020 --> 00:03:39.400
Yeah.
00:03:39.400 --> 00:03:40.260
And it worked.
00:03:40.260 --> 00:03:41.140
And I was amazed.
00:03:41.140 --> 00:03:44.160
And people talk about this, but it was just plain fun.
00:03:44.160 --> 00:03:48.600
There was something more fun for me about writing Python code than Java.
00:03:48.600 --> 00:03:50.560
And I have never really looked back.
00:03:50.560 --> 00:03:52.480
That's a bit of an exaggeration.
00:03:52.600 --> 00:03:54.300
I do keep my eye out for other languages.
00:03:54.300 --> 00:03:57.700
I don't always assume that Python is always going to be the best for me.
00:03:57.700 --> 00:04:00.140
And I certainly use other languages as appropriate.
00:04:00.140 --> 00:04:02.340
But my core, I need to do something.
00:04:02.340 --> 00:04:04.400
I don't have a particular reason to choose another language.
00:04:04.400 --> 00:04:05.540
I do everything in Python.
00:04:05.700 --> 00:04:08.460
Yeah, I'm very similar in a lot of ways, actually.
00:04:08.460 --> 00:04:12.800
My background was in C# and C++, not Java.
00:04:12.800 --> 00:04:16.580
So a little bit different, but more similar than different, right?
00:04:16.700 --> 00:04:22.060
And I recall coming to Python and thinking at first, like, it's kind of a weird, interesting,
00:04:22.060 --> 00:04:23.320
but weird language.
00:04:23.320 --> 00:04:24.320
It's white space stuff.
00:04:24.320 --> 00:04:24.960
I don't know.
00:04:24.960 --> 00:04:26.520
Curly braces are pretty tried and true.
00:04:26.520 --> 00:04:27.560
What are we doing with all this?
00:04:27.560 --> 00:04:33.800
And before I really became super comfortable with Python and just like, yeah, that looks at
00:04:33.800 --> 00:04:33.920
it.
00:04:33.920 --> 00:04:34.920
It feels great.
00:04:34.920 --> 00:04:38.180
It feels right from how I perceived programming should be.
00:04:38.260 --> 00:04:43.460
I went, worked with it for a while, went back and why are all these symbols on the page?
00:04:43.460 --> 00:04:45.860
Like how it's just in the way of reading.
00:04:45.860 --> 00:04:50.100
And, you know, I used to thought I had to have the parentheses on the if statement, but it turns
00:04:50.100 --> 00:04:50.780
out you don't.
00:04:50.780 --> 00:04:52.720
So why does this language make you write the parentheses?
00:04:52.720 --> 00:04:54.560
And, you know, all those things, you're just like, what?
00:04:54.560 --> 00:04:55.480
What a hassle.
00:04:55.480 --> 00:05:00.280
Not even the static typing, just the, just the syntax is more syntaxy.
00:05:00.280 --> 00:05:04.420
And I'm kind of interested in how your experience with that was.
00:05:04.420 --> 00:05:07.100
Yeah, I'm going to save that for a little bit because it's going to come up in,
00:05:07.200 --> 00:05:09.000
in the points that we go over.
00:05:09.000 --> 00:05:13.140
I'll share though that for my background, that's one of the big piece that, that plays
00:05:13.140 --> 00:05:13.860
into all this.
00:05:13.860 --> 00:05:20.760
I, I went into college, into undergrad, focus on chemical engineering because I had a really
00:05:20.760 --> 00:05:22.900
good chemistry teacher in high school.
00:05:22.900 --> 00:05:27.440
And I thought I wanted to apply what I knew about chemistry in my intro chemical engineering
00:05:27.440 --> 00:05:27.780
classes.
00:05:27.780 --> 00:05:30.200
We were doing problems about running nuclear power plants.
00:05:30.200 --> 00:05:33.060
And I was like, gosh, I don't want to run a nuclear power plant.
00:05:33.060 --> 00:05:37.180
And I really enjoyed my physics classes because they were just playing about understanding.
00:05:37.180 --> 00:05:38.300
how the world works.
00:05:38.300 --> 00:05:43.720
So I ended up doing an undergrad in physics and I tutored throughout undergrad because so
00:05:43.720 --> 00:05:48.140
many people struggled with math and science, the two subjects that I loved the most.
00:05:48.140 --> 00:05:53.140
And I found that most people who struggled, it was because of how they were taught, not
00:05:53.140 --> 00:05:54.320
the subject material itself.
00:05:54.720 --> 00:05:58.900
And so I got a strong interest in teaching and I wanted to be a particle physicist, but
00:05:58.900 --> 00:06:02.060
I didn't want to be a student forever and get on the PhD track right away.
00:06:02.060 --> 00:06:04.380
So I started teaching and I loved teaching.
00:06:04.380 --> 00:06:10.980
I found that the challenge of reaching every person in a classroom was as hard as hard and
00:06:10.980 --> 00:06:12.320
satisfying as hard science.
00:06:12.440 --> 00:06:14.020
And so I just stayed in teaching.
00:06:14.020 --> 00:06:18.800
So I taught public school, fifth grade through high school for about 20 years.
00:06:18.800 --> 00:06:21.780
And I would, I was a hobbyist programmer throughout all of that.
00:06:21.780 --> 00:06:24.300
And so I taught intro programming classes whenever I could.
00:06:24.300 --> 00:06:29.640
And in the early 2010s ish, I was looking for a Python book that I could give my more motivated
00:06:29.640 --> 00:06:34.000
students and just kind of stand on the sidelines and answer their questions and let them go at
00:06:34.000 --> 00:06:34.580
their own pace.
00:06:34.920 --> 00:06:40.160
But everything either made too many assumptions about what you already knew, or it was written
00:06:40.160 --> 00:06:41.960
for kids and kind of spoke down to you.
00:06:41.960 --> 00:06:46.700
And so that's how I ended up writing a book because the book I wished to teach from did not
00:06:46.700 --> 00:06:47.080
exist.
00:06:47.080 --> 00:06:47.380
Sure.
00:06:47.380 --> 00:06:48.040
I know how that feels.
00:06:48.040 --> 00:06:48.400
Yeah.
00:06:48.400 --> 00:06:48.840
Yeah.
00:06:48.840 --> 00:06:49.860
What's the title of the book?
00:06:49.860 --> 00:06:50.480
Share that with everyone.
00:06:50.480 --> 00:06:51.720
That is Python Crash Course.
00:06:51.720 --> 00:06:52.740
No starts, right?
00:06:52.740 --> 00:06:53.120
Yes.
00:06:53.120 --> 00:06:53.840
From no starts.
00:06:53.840 --> 00:06:57.000
And it's been the bestselling introduction.
00:06:57.000 --> 00:07:01.580
It's been the bestselling Python book for close to 10 years now, which is really satisfying
00:07:01.580 --> 00:07:04.000
because I kind of had a 10 year vision.
00:07:04.000 --> 00:07:09.160
I had the naive notion that I could write a book in the summertime and then revise it during
00:07:09.160 --> 00:07:10.860
the school year and it would be done.
00:07:10.860 --> 00:07:14.740
And it was two and a half years instead of that.
00:07:14.740 --> 00:07:16.240
So I had a 10 year vision.
00:07:16.240 --> 00:07:20.800
I thought if I'm going to do all this work, then I should support the book for 10 year period.
00:07:20.800 --> 00:07:24.660
And so it's been very satisfying to see it be meaningful to so many people over that.
00:07:24.660 --> 00:07:25.040
Yeah.
00:07:25.040 --> 00:07:26.440
That's really awesome.
00:07:26.440 --> 00:07:29.000
So your book is in like LTS, long-term support.
00:07:29.000 --> 00:07:29.480
Say that again?
00:07:29.480 --> 00:07:32.980
It's an LTS release of the book, a long-term support, right?
00:07:32.980 --> 00:07:35.320
Not one of those off-brand releases.
00:07:35.320 --> 00:07:36.220
Right, right.
00:07:36.220 --> 00:07:37.440
No, that's really great.
00:07:37.440 --> 00:07:39.960
And it's cool to connect with so many people.
00:07:39.960 --> 00:07:44.520
You probably go to PyCon and other events and people are like, oh, I read your book.
00:07:44.520 --> 00:07:46.860
And it really, you know, probably have stories to tell you about it.
00:07:46.860 --> 00:07:47.120
Yeah.
00:07:47.120 --> 00:07:47.920
It was amazing.
00:07:47.920 --> 00:07:51.840
You know, you go to PyCon or any of these conferences and you see a bunch of booths
00:07:51.840 --> 00:07:53.520
with people hiring or selling something.
00:07:53.720 --> 00:07:56.920
And I used to go to those booths and just have conversations.
00:07:56.920 --> 00:08:01.980
And a year or two after the book came out, those people started telling me, oh, hey, I
00:08:01.980 --> 00:08:03.100
learned Python from your book.
00:08:03.100 --> 00:08:07.120
And I was amazed at how quickly people could learn Python and then start to work at these
00:08:07.120 --> 00:08:08.520
companies and organizations.
00:08:08.520 --> 00:08:09.120
Yeah.
00:08:09.120 --> 00:08:09.620
Yeah.
00:08:09.620 --> 00:08:10.740
It's interesting.
00:08:10.740 --> 00:08:14.660
So they learn Python through your book and now they're working at Bloomberg or whatever.
00:08:14.660 --> 00:08:16.340
And now they're talking to you through these booths.
00:08:16.340 --> 00:08:16.680
Interesting.
00:08:16.680 --> 00:08:17.160
Got it.
00:08:17.160 --> 00:08:17.600
Yeah.
00:08:17.600 --> 00:08:22.360
And as a teacher says, I'm glad to say I've read that book and learned a lot from
00:08:22.360 --> 00:08:22.540
it.
00:08:22.540 --> 00:08:22.880
Yeah.
00:08:22.880 --> 00:08:23.420
Very cool.
00:08:23.420 --> 00:08:23.700
Yeah.
00:08:23.700 --> 00:08:24.780
I'm glad I worked for you.
00:08:24.780 --> 00:08:25.480
Yeah.
00:08:25.480 --> 00:08:26.700
I was going to say, you know, as a teacher.
00:08:26.700 --> 00:08:27.320
Yeah.
00:08:27.320 --> 00:08:31.880
I have always been happy for my students to end up better at whatever I introduced them
00:08:31.880 --> 00:08:32.660
to than I am.
00:08:32.660 --> 00:08:35.040
My focus has been on teaching for a long time.
00:08:35.040 --> 00:08:38.980
And so I learned my subject well enough to be able to do whatever I need to with them.
00:08:38.980 --> 00:08:43.500
But anybody who chooses to focus on one area over a lifetime is going to be better
00:08:43.500 --> 00:08:44.260
than I am at it.
00:08:44.540 --> 00:08:48.740
And so meeting those people at the booths who are honestly now probably better programmers
00:08:48.740 --> 00:08:50.780
are certainly within their discipline than I am.
00:08:50.780 --> 00:08:51.680
It's a privilege.
00:08:51.680 --> 00:08:52.080
Yeah.
00:08:52.080 --> 00:08:57.500
So along this idea of how do you go from beginner just starting Python to whatever we call intermediate
00:08:57.500 --> 00:08:58.940
or advanced or expert.
00:08:58.940 --> 00:09:01.440
It's an interesting, interesting topic.
00:09:01.440 --> 00:09:03.320
And I think it's one that really deserves some attention.
00:09:03.320 --> 00:09:04.240
I think it does too.
00:09:04.240 --> 00:09:09.440
I think I hear for so many times from beginners, like I'm learning the language or I'm learning
00:09:09.440 --> 00:09:10.600
this or I'm learning that.
00:09:11.080 --> 00:09:15.160
And now I just don't really know what to do to keep making progress.
00:09:15.160 --> 00:09:15.500
Right.
00:09:15.500 --> 00:09:15.840
Right.
00:09:15.840 --> 00:09:21.260
And you mentioned your situation where you are sort of a hobbyist programmer to some degree.
00:09:21.260 --> 00:09:21.500
Right.
00:09:21.500 --> 00:09:25.980
And you just compared it against people who are, you know, maybe scaling out some DevOps
00:09:25.980 --> 00:09:27.640
thing at like a huge tech company.
00:09:27.640 --> 00:09:27.940
Right.
00:09:28.340 --> 00:09:31.040
Those are really different ways you spend your day.
00:09:31.040 --> 00:09:31.520
Right.
00:09:31.520 --> 00:09:34.360
As a hobbyist programmer, you have something you're interested in.
00:09:34.360 --> 00:09:39.020
Maybe you, you poke at it a little bit, you work at it, but you don't have the real
00:09:39.020 --> 00:09:41.760
demands of it's, it's got to work at this crazy scale.
00:09:41.760 --> 00:09:46.680
And also that it something you can, can you focus your entire effort on all day.
00:09:46.680 --> 00:09:46.960
Right.
00:09:46.960 --> 00:09:50.860
Cause you're, you're teaching or you're, you're doing other things besides that.
00:09:50.860 --> 00:09:51.040
Right.
00:09:51.040 --> 00:09:51.680
As a hobbyist.
00:09:51.680 --> 00:09:51.960
Yeah.
00:09:51.960 --> 00:09:57.360
And I think that, you know, when we label ourselves or others, beginner, intermediate
00:09:57.360 --> 00:10:02.420
expert, beginner is the one label that is objective or I've never programmed before.
00:10:02.420 --> 00:10:04.540
I'm a beginner or I have never used Python.
00:10:04.540 --> 00:10:05.780
So I'm a beginner at Python.
00:10:05.780 --> 00:10:08.920
Although even that, if you're experienced in another language, it's hard to call yourself
00:10:08.920 --> 00:10:09.700
a beginner again.
00:10:09.700 --> 00:10:10.180
Exactly.
00:10:10.680 --> 00:10:15.040
And then, you know, when I've looked at say intermediate resources, it's a hard world
00:10:15.040 --> 00:10:18.360
to classify and categorize because what is intermediate?
00:10:18.360 --> 00:10:24.580
And I think it's good to recognize that in the early days of a language, say like mid nineties
00:10:24.580 --> 00:10:29.400
to 2000 for Python, the language was small enough that somebody could call themselves an expert
00:10:29.400 --> 00:10:30.360
at some point.
00:10:30.360 --> 00:10:34.800
I know everything that there is in Python and a language is so big and the ecosystem is so
00:10:34.800 --> 00:10:39.820
huge and it covers so many domains that it's hard for anybody to objectively call themselves
00:10:39.820 --> 00:10:41.220
an expert in Python.
00:10:41.220 --> 00:10:42.280
What does that even mean?
00:10:42.280 --> 00:10:44.380
And so it really is about relative statement.
00:10:44.380 --> 00:10:44.800
Yeah.
00:10:44.800 --> 00:10:46.160
How do you get out of those?
00:10:46.160 --> 00:10:48.600
I'm just learning the language and now I'm using it.
00:10:48.600 --> 00:10:50.480
Those, that evaluation is interesting.
00:10:50.480 --> 00:10:51.360
Yeah, it is.
00:10:51.360 --> 00:10:55.580
And I think one, you know, it's a good point you bring up about when Python was smaller.
00:10:55.580 --> 00:10:57.560
There's this teacher that was a joke.
00:10:57.560 --> 00:10:58.840
It says, I learned Python.
00:10:58.840 --> 00:11:02.280
It was a good weekend, you know, which there's a truth to that.
00:11:02.280 --> 00:11:06.980
And it's, it's also cute, but at the same time, I've been doing this for many years and
00:11:06.980 --> 00:11:09.500
I'm still learning Python all the time, right?
00:11:09.500 --> 00:11:09.800
Yes.
00:11:09.800 --> 00:11:11.300
How do you square those two things?
00:11:11.300 --> 00:11:12.640
How can those both be true?
00:11:12.640 --> 00:11:18.000
And part of what that, the difference is, that's not obvious, I think to beginners, but
00:11:18.000 --> 00:11:19.400
it's obvious to you.
00:11:19.400 --> 00:11:21.920
When that person said, I learned Python, it was a good weekend.
00:11:21.920 --> 00:11:24.120
They meant they rocked the for loop.
00:11:24.120 --> 00:11:29.840
They can create a class and they can create a function, you know, that's, they can do if statements
00:11:29.840 --> 00:11:32.160
and they now write and instead of double ampersand.
00:11:32.160 --> 00:11:35.580
That is one interpretation of what Python is.
00:11:35.580 --> 00:11:41.140
But then you look at PyPI with its, I haven't read the numbers in a few weeks or something,
00:11:41.140 --> 00:11:43.040
but it's close to half million packages.
00:11:43.040 --> 00:11:50.660
If you completely, truly learned a new package every day, you're still falling behind, right?
00:11:50.660 --> 00:11:54.120
Continuously, every day, just nonstop for the rest of your life.
00:11:54.120 --> 00:11:57.640
You're like, ah, Molly, I'm more behind than I started 20 years ago, right?
00:11:57.680 --> 00:11:58.340
In a sense.
00:11:58.340 --> 00:12:00.660
And so what is Python?
00:12:00.660 --> 00:12:05.800
I think when people say, I want to be good at Python, I want to learn Python, I want to
00:12:05.800 --> 00:12:06.760
be an expert in Python.
00:12:06.760 --> 00:12:12.880
You need to understand that there are these different layers or tiers of what that means.
00:12:12.880 --> 00:12:15.800
And you can, you can be focused on one or another.
00:12:15.960 --> 00:12:21.040
But right, it's, it's when people are comparing, like I've done this much and I've got, I'm
00:12:21.040 --> 00:12:21.920
an expert at Python.
00:12:21.920 --> 00:12:23.380
Like, well, are you an expert at the language?
00:12:23.380 --> 00:12:24.960
Are you an expert in FastAPI?
00:12:24.960 --> 00:12:26.560
What are you an expert in?
00:12:26.560 --> 00:12:26.980
Right.
00:12:26.980 --> 00:12:32.000
And so I think just kind of setting the stage with there's different meanings to what I'm
00:12:32.000 --> 00:12:33.220
good at Python is.
00:12:33.220 --> 00:12:33.520
Yeah.
00:12:33.520 --> 00:12:37.520
And I'll, I'll say right now that I have a hard time classifying myself.
00:12:37.520 --> 00:12:38.900
I'm definitely not a beginner.
00:12:39.120 --> 00:12:43.960
I wouldn't necessarily call myself an expert, but I don't even know about intermediate somewhere
00:12:43.960 --> 00:12:45.720
between intermediate and expert.
00:12:45.720 --> 00:12:49.540
And I've been writing a weekly newsletter at mostly Python.
00:12:49.540 --> 00:12:50.720
It's on Substack.
00:12:50.720 --> 00:12:56.560
And I started writing a newsletter because I wanted to get out of that LTS you're mentioning
00:12:56.560 --> 00:12:59.000
about the book where all my writing is about a book.
00:12:59.000 --> 00:13:01.260
It's always about the same material.
00:13:01.460 --> 00:13:06.520
And so writing a weekly newsletter forces me to pick a topic each week and then be able
00:13:06.520 --> 00:13:07.460
to explain that well.
00:13:07.460 --> 00:13:12.580
And I think a lot of people think that somebody in my position just knows all this stuff and
00:13:12.580 --> 00:13:13.880
just write something up each week.
00:13:13.880 --> 00:13:18.080
And really it's a whole bunch of research every time because there's nooks and crannies around
00:13:18.080 --> 00:13:22.160
every topic in Python that I didn't know about after 20 years in the language.
00:13:22.160 --> 00:13:26.520
I mean, it's really enjoyable to fill out that understanding and then explain it well to other
00:13:26.520 --> 00:13:26.800
people.
00:13:26.800 --> 00:13:28.020
Yeah, it really is.
00:13:28.020 --> 00:13:29.620
Maybe final thought on this.
00:13:30.300 --> 00:13:34.260
Tony out there points out and says, adding on to what we were saying, and an expert in
00:13:34.260 --> 00:13:38.900
Python for data science doesn't necessarily look like an expert in Python for web and so
00:13:38.900 --> 00:13:39.080
on.
00:13:39.080 --> 00:13:43.720
Yeah, and I was going to add basically something similar that I would consider myself an expert
00:13:43.720 --> 00:13:48.520
in web development and API stuff and those kinds of things, right?
00:13:48.520 --> 00:13:53.500
I've been running production Python apps for a long time and really just polishing them.
00:13:53.500 --> 00:13:59.640
But put me in front of some machine learning situation or, you know, too much
00:13:59.640 --> 00:14:00.940
advanced pandas.
00:14:00.940 --> 00:14:03.180
And I'm like, well, I'm a beginner over here.
00:14:03.180 --> 00:14:05.480
And those are both also called Python, right?
00:14:05.480 --> 00:14:11.980
So there's just this, all these different contexts and spheres of relevance that I think people
00:14:11.980 --> 00:14:13.220
got to keep in mind, right?
00:14:13.220 --> 00:14:17.560
And it's probably good to hear them say like, you're an expert in some things, but not, it's
00:14:17.560 --> 00:14:18.780
not like you just know it all, right?
00:14:18.780 --> 00:14:19.120
Right.
00:14:19.240 --> 00:14:22.880
It's good to recognize that expertise in one area is oftentimes transferable.
00:14:22.880 --> 00:14:26.200
You aren't immediately an expert in the new domain.
00:14:26.200 --> 00:14:32.020
But what you've learned in one domain is oftentimes makes it easier to gain expertise in another
00:14:32.020 --> 00:14:32.240
one.
00:14:32.240 --> 00:14:32.720
Absolutely.
00:14:32.720 --> 00:14:34.820
Like if the data science side, right?
00:14:34.820 --> 00:14:35.860
You're still good at Git.
00:14:35.860 --> 00:14:38.080
That's not a new thing for you, right?
00:14:38.080 --> 00:14:38.680
You're not like, why?
00:14:38.680 --> 00:14:39.800
What is this source control thing?
00:14:39.800 --> 00:14:41.500
Like you can still completely rock that.
00:14:41.580 --> 00:14:47.120
But maybe you're not embracing the vectorization of style of programming and so on.
00:14:47.120 --> 00:14:51.420
This portion of Talk Python To Me is brought to you by GlareDB.
00:14:51.420 --> 00:14:55.900
GlareDB is an open source database for querying distributed data.
00:14:55.900 --> 00:14:56.760
Here's how it works.
00:14:56.760 --> 00:14:58.680
First, you connect your data sources.
00:14:58.680 --> 00:15:03.060
GlareDB makes it easy to connect to your data, no matter where it's stored, with integrations
00:15:03.060 --> 00:15:06.340
into many popular databases, data warehouses, and more.
00:15:06.800 --> 00:15:11.920
This includes Snowflake, Postgres, MongoDB, BigQuery, and object storage.
00:15:11.920 --> 00:15:13.860
Now you can query everything.
00:15:13.860 --> 00:15:19.380
You use the full power SQL to query your data across these many different data sources, join
00:15:19.380 --> 00:15:23.440
data across production databases and analytical warehouses without limits.
00:15:23.440 --> 00:15:26.980
Finally, you can use the tools you already know and love.
00:15:26.980 --> 00:15:31.740
Visualize and query your data using tools you know from Python's data science stack.
00:15:31.740 --> 00:15:36.720
With just a single import, you can query Pandas and Polars data frames using just
00:15:36.720 --> 00:15:37.100
SQL.
00:15:37.100 --> 00:15:42.520
You'll be asking questions, extracting insights, and driving decisions with your data without
00:15:42.520 --> 00:15:45.060
waiting for an ETL pipeline to move data around.
00:15:45.060 --> 00:15:50.520
So if you have distributed data and disparate data sources, and you love open source, you
00:15:50.520 --> 00:15:52.800
owe it to yourself to give GlareDB a try.
00:15:52.800 --> 00:15:56.720
Visit talkpython.fm/GlareDB to get started.
00:15:56.720 --> 00:15:58.760
The link is in your podcast player show notes.
00:15:58.760 --> 00:16:01.920
And please use the link to let them know that you came from us.
00:16:01.920 --> 00:16:05.200
Thank you to the team at GlareDB for sponsoring the show.
00:16:06.640 --> 00:16:10.340
Maybe this is a good time to start talking about the ideas.
00:16:10.340 --> 00:16:14.220
So what I did is I said, you know, Eric, you've got this cool book.
00:16:14.220 --> 00:16:19.500
How about you try to extract some ideas that you've learned from writing the book and working
00:16:19.500 --> 00:16:25.180
with people for this whole topic of transitioning from beginners towards the expert side of programming.
00:16:25.180 --> 00:16:27.180
So let's go through the list.
00:16:27.180 --> 00:16:27.660
Sure.
00:16:27.660 --> 00:16:29.460
I like, first of all, I like that structuring.
00:16:29.680 --> 00:16:32.800
I kind of forced me to think specifically about what I can say.
00:16:32.800 --> 00:16:33.900
I want to clarify.
00:16:33.900 --> 00:16:35.000
This isn't a countdown.
00:16:35.000 --> 00:16:38.520
A lot of times lists are like, here's the top 10 things you should know about Python.
00:16:38.520 --> 00:16:44.540
So these are ideas for specific things that people can do to move away from wherever you
00:16:44.540 --> 00:16:49.500
were as a beginner and more into that intermediate and expert and be comfortable with justifying
00:16:49.500 --> 00:16:49.740
that.
00:16:49.740 --> 00:16:54.940
So for this kind of list, I start with the most important things first because everything
00:16:54.940 --> 00:16:55.800
else builds on that.
00:16:55.800 --> 00:17:00.960
And so when I think about what do people need to do to move away from beginner and towards
00:17:00.960 --> 00:17:05.700
being fluent and comfortable and competent and able to solve a variety of problems, the
00:17:05.700 --> 00:17:08.140
first thing is when you're learning, know your goals.
00:17:08.140 --> 00:17:09.520
Why are you learning in a program?
00:17:09.520 --> 00:17:11.300
And so we see this all the time.
00:17:11.360 --> 00:17:14.260
If you follow conversations about learning Python, I want to learn Python.
00:17:14.260 --> 00:17:14.960
Okay.
00:17:14.960 --> 00:17:16.460
But should I focus on?
00:17:16.460 --> 00:17:17.760
Well, what are your goals?
00:17:17.760 --> 00:17:18.740
Why are you learning it?
00:17:18.740 --> 00:17:19.520
What do you want to do?
00:17:19.520 --> 00:17:23.780
And I think the answers to that tend to be, I just like programming.
00:17:23.780 --> 00:17:24.840
I'm curious.
00:17:24.840 --> 00:17:26.940
For a lot of people, it is about money.
00:17:26.940 --> 00:17:30.400
People know that software development jobs can pay well.
00:17:30.400 --> 00:17:36.040
And I think it's quite appropriate and reasonable and important to name that if that is one of your
00:17:36.040 --> 00:17:37.780
goals and there's nothing wrong with that.
00:17:37.780 --> 00:17:38.080
Right.
00:17:38.080 --> 00:17:41.140
And also it could be career, but not money in the sense that.
00:17:41.140 --> 00:17:44.260
I have a decent paying job now, but I don't like my job.
00:17:44.260 --> 00:17:49.480
If I could just have the same money, but actually work on programming all day, that would be awesome,
00:17:49.480 --> 00:17:49.840
right?
00:17:49.840 --> 00:17:50.360
Yes.
00:17:50.360 --> 00:17:50.700
Yeah.
00:17:50.700 --> 00:17:55.180
The money thing comes up for me because I'll say one of the things I'm proud of as an author
00:17:55.180 --> 00:18:00.240
is I've replied to pretty much every single email anybody has ever written to me about the book.
00:18:00.240 --> 00:18:05.040
I think that's part of why the book has done well, because I notice I look for patterns.
00:18:05.040 --> 00:18:09.160
And so if people start to write about the same thing, then I adjust the book a little bit to
00:18:09.160 --> 00:18:10.100
address that.
00:18:10.100 --> 00:18:14.280
And so it keeps my email volume reasonable, but also it means it's still meeting the needs
00:18:14.280 --> 00:18:15.100
of readers.
00:18:15.100 --> 00:18:18.720
But it also means I've had interactions with thousands of readers.
00:18:18.720 --> 00:18:23.740
And one of the things that comes up in anything that goes beyond a, can you help me fix this
00:18:23.740 --> 00:18:24.340
one problem?
00:18:24.340 --> 00:18:26.760
I oftentimes ask like, what are you learning this for?
00:18:26.760 --> 00:18:28.080
What's your, what's your story?
00:18:28.080 --> 00:18:30.780
And a lot of those people are doing career transitions.
00:18:31.020 --> 00:18:33.500
It's a mix of people looking for better pay.
00:18:33.500 --> 00:18:35.820
And oftentimes that's tied in with to support my family.
00:18:35.820 --> 00:18:39.780
Those larger life decisions other than just, you know, it's never greed.
00:18:39.780 --> 00:18:41.120
It's never, I want to be rich.
00:18:41.120 --> 00:18:43.740
It's always, I want to, to live reasonable life.
00:18:44.340 --> 00:18:49.100
And what you say, people being tired of a different line of work and looking for something where
00:18:49.100 --> 00:18:52.320
they can have more power, more, more independence, more control.
00:18:52.320 --> 00:18:56.980
You know, when you say know your goals for most people, their goals, it's not one goal.
00:18:56.980 --> 00:18:58.240
It's a balance of those.
00:18:58.340 --> 00:19:03.240
And recognizing where your balance sits is really important because it guides the rest
00:19:03.240 --> 00:19:04.800
of your learning and what you do.
00:19:04.800 --> 00:19:06.180
Yeah, it absolutely does.
00:19:06.180 --> 00:19:07.640
Somebody who's just plain curious.
00:19:07.640 --> 00:19:08.260
Go ahead.
00:19:08.260 --> 00:19:08.460
Sorry.
00:19:08.460 --> 00:19:09.400
Well, yeah.
00:19:09.400 --> 00:19:15.100
And I think when we're talking about beginners, there's a lot of people who get pulled into Python
00:19:15.100 --> 00:19:19.280
without an explicit intent of becoming a software developer.
00:19:19.280 --> 00:19:23.440
In fact, like they would maybe start out by saying, I don't want to be a software developer.
00:19:23.440 --> 00:19:24.880
I'm a biologist.
00:19:24.880 --> 00:19:25.820
I'm an economist.
00:19:25.820 --> 00:19:27.980
I'm a philosopher or whatever.
00:19:27.980 --> 00:19:32.620
But I need a little bit of programming because I learned that if I do these six lines of
00:19:32.620 --> 00:19:37.140
Python, like magic happens way better than if I had to force it through Excel or something.
00:19:37.140 --> 00:19:37.420
Right.
00:19:37.420 --> 00:19:42.320
And I think a lot of the beginners are in that realm of like, well, I'm here now.
00:19:42.320 --> 00:19:43.860
I'm still not a programmer.
00:19:43.860 --> 00:19:45.120
Don't call me one of those.
00:19:45.120 --> 00:19:47.940
But I use programming for my thing.
00:19:47.940 --> 00:19:50.920
And that's also a pretty interesting angle, I think.
00:19:50.920 --> 00:19:51.200
Yeah.
00:19:51.200 --> 00:19:53.860
And I think that's a really, really good thing for people to recognize.
00:19:53.860 --> 00:19:57.800
It is interesting to have this conversation about labels and beginners and intermediate.
00:19:57.800 --> 00:20:00.720
Because how do you know when you're no longer a beginner?
00:20:00.720 --> 00:20:06.860
One of the clearest signs is when you have used programming to solve a real problem that you have.
00:20:06.960 --> 00:20:11.500
And you can throw in like with a level of understanding rather than copy pasting.
00:20:11.500 --> 00:20:13.320
But for a lot of people...
00:20:13.320 --> 00:20:14.920
Or now ChatGPT also.
00:20:14.920 --> 00:20:15.280
Yeah.
00:20:15.280 --> 00:20:16.100
Yeah.
00:20:16.100 --> 00:20:19.000
That's a super interesting dynamic to throw into all of this.
00:20:19.000 --> 00:20:20.720
But that is the end goal.
00:20:20.720 --> 00:20:22.160
It should be the end goal for most people.
00:20:22.160 --> 00:20:29.320
Not just to know how programming works, but to use it to solve a real world problem that you or somebody else has.
00:20:29.780 --> 00:20:34.260
And so as soon as you're doing that, you can start to consider yourself moving out of the beginner place.
00:20:34.260 --> 00:20:34.600
Yeah.
00:20:34.600 --> 00:20:36.900
You might still feel awkward, but you're doing it.
00:20:36.900 --> 00:20:39.780
Really interesting comment that I think is worth highlighting.
00:20:39.780 --> 00:20:42.380
And Foxo says, I'm an anesthesiologist.
00:20:42.380 --> 00:20:45.640
You cannot imagine how much Python has helped me with different tasks.
00:20:45.640 --> 00:20:46.060
Amazing.
00:20:46.060 --> 00:20:47.840
That's really cool.
00:20:47.840 --> 00:20:48.600
Thank you for sharing that.
00:20:48.600 --> 00:20:48.800
Yeah.
00:20:48.800 --> 00:20:49.160
Yeah.
00:20:49.160 --> 00:20:49.660
Yeah.
00:20:49.660 --> 00:20:49.880
Yeah.
00:20:50.200 --> 00:20:50.380
Okay.
00:20:50.380 --> 00:20:53.020
So tip number one, know your goals.
00:20:53.020 --> 00:20:54.420
Like, why are you here?
00:20:54.420 --> 00:20:56.500
Because that'll help guide you somewhat.
00:20:56.500 --> 00:20:56.880
Yes?
00:20:56.880 --> 00:20:57.300
Yes.
00:20:57.300 --> 00:21:01.320
I'm taking a few notes about throwing things in there later in the list.
00:21:01.320 --> 00:21:01.600
Beautiful.
00:21:01.600 --> 00:21:02.000
All right.
00:21:02.000 --> 00:21:02.740
I agree.
00:21:02.740 --> 00:21:04.200
I think it's important to know your goals.
00:21:04.200 --> 00:21:07.980
And there's a lot of reasons why people get into programming, right?
00:21:07.980 --> 00:21:09.260
And so...
00:21:09.260 --> 00:21:09.420
Yeah.
00:21:09.420 --> 00:21:13.660
Last thing on that is if somebody is just plain curious, as far as teaching and learning,
00:21:13.660 --> 00:21:17.660
if somebody is just plain curious, that's their main goal, you have a lot more flexibility
00:21:17.660 --> 00:21:22.360
in the examples you present to them and the pace at which you present material, as opposed
00:21:22.360 --> 00:21:25.960
to somebody who says, you know, I really want to do a career transition as soon as possible.
00:21:25.960 --> 00:21:30.040
That person needs a much more grounded and practical and timely approach.
00:21:30.040 --> 00:21:34.340
Well, and you also might look out and say, okay, web framework do I need to choose?
00:21:34.340 --> 00:21:36.920
What database experience do I need to get?
00:21:36.920 --> 00:21:42.500
Because I'm looking at Indeed job listings and I'm trying to hit the largest set of those
00:21:42.500 --> 00:21:46.300
rather than what project am I trying to work on or what am I curious about?
00:21:46.300 --> 00:21:48.280
You're like, I need to start checking the big boxes.
00:21:48.280 --> 00:21:50.940
Let's check those boxes so I can get a job in six weeks.
00:21:50.940 --> 00:21:51.200
Yep.
00:21:51.200 --> 00:21:51.720
All right.
00:21:51.720 --> 00:21:52.340
Tip number two.
00:21:52.340 --> 00:21:52.620
Yeah.
00:21:52.620 --> 00:21:53.300
Tip number two.
00:21:53.300 --> 00:21:53.780
What do you got?
00:21:53.780 --> 00:21:55.340
Have a project in mind.
00:21:55.340 --> 00:22:00.800
And so whatever your goals are, having a specific project in mind helps put everything else in
00:22:00.800 --> 00:22:01.320
context.
00:22:01.320 --> 00:22:07.160
If you are learning about a for loop and you have a project, I'm going to name one, one of
00:22:07.160 --> 00:22:08.100
the projects that I've worked on.
00:22:08.100 --> 00:22:09.560
I live in Southeast Alaska.
00:22:09.980 --> 00:22:14.760
And one of the impacts of climate change here is an increasing frequency and severity
00:22:14.760 --> 00:22:15.640
of landslides.
00:22:15.640 --> 00:22:20.020
And so Southeast Alaska is a rainforest for anybody who isn't aware of that.
00:22:20.020 --> 00:22:23.040
It's not all snow in Southeast because we're right next to the ocean.
00:22:23.460 --> 00:22:27.980
And so we're still getting as much rain as we always have, but it's coming instead of
00:22:27.980 --> 00:22:31.820
light rain throughout the year with some periods of heavy rain, we're getting a lot more nice
00:22:31.820 --> 00:22:32.080
weather.
00:22:32.080 --> 00:22:36.420
We just had two or three weeks of no rain, which was really unusual here.
00:22:36.420 --> 00:22:40.880
But we'll get heavier fall storms that can lead to landslides.
00:22:41.160 --> 00:22:47.380
And so I had a project that monitored a local river's level to correlate that with landslide
00:22:47.380 --> 00:22:50.640
risk and helped develop a warning system.
00:22:50.640 --> 00:22:55.640
And so a project like that in mind, that's a big project.
00:22:55.640 --> 00:22:59.140
And so if somebody is just learning Python, that's hard to say, like, here's everything
00:22:59.140 --> 00:23:00.800
you need to know to build that project.
00:23:00.800 --> 00:23:05.200
But if you're teaching a for loop and you know that somebody is interested in a project
00:23:05.200 --> 00:23:09.900
about monitoring climate, then you can make your for loops about processing data related
00:23:09.900 --> 00:23:12.700
to rainfall, river levels, things like that.
00:23:12.700 --> 00:23:13.780
Yeah, absolutely.
00:23:13.780 --> 00:23:19.060
And Python is really interesting in that you can, it's pretty good at the IoT thing as well,
00:23:19.060 --> 00:23:23.700
which opens up a lot of, you know, we've got CircuitPython and Adafruit and all those
00:23:23.700 --> 00:23:26.720
areas to play with as well, which is a whole different kind of project.
00:23:26.720 --> 00:23:27.760
Yeah, yeah.
00:23:27.760 --> 00:23:29.740
And so there's an infinite number of projects.
00:23:29.740 --> 00:23:34.900
And so if you have a project in mind, being clear about that with yourself and with anybody
00:23:34.900 --> 00:23:39.480
that you're learning with or from is really helpful as far as tailoring what you're
00:23:39.480 --> 00:23:40.840
learning to your purposes.
00:23:40.840 --> 00:23:41.840
I'm curious.
00:23:41.840 --> 00:23:46.120
It's always easier to teach somebody who has a specific goal in mind than somebody who
00:23:46.120 --> 00:23:46.760
is just vague.
00:23:46.760 --> 00:23:47.640
Just teach me something.
00:23:47.640 --> 00:23:47.940
Yeah.
00:23:47.940 --> 00:23:49.120
Well, because it's focused.
00:23:49.120 --> 00:23:49.420
Yeah.
00:23:49.420 --> 00:23:49.660
Right.
00:23:49.660 --> 00:23:54.540
I find a lot of people try to boil the ocean metaphorically when they're trying to learn
00:23:54.540 --> 00:23:54.880
these things.
00:23:54.880 --> 00:23:58.860
Like, well, I saw somebody saying, well, all these CS topics are really hard for me.
00:23:58.860 --> 00:24:01.800
Like people keep telling me all these CS things I need to know.
00:24:01.800 --> 00:24:03.340
And do I really need to know them?
00:24:03.340 --> 00:24:06.120
Well, maybe eventually, but not all at once.
00:24:06.520 --> 00:24:09.020
You know, like, what are you doing now?
00:24:09.020 --> 00:24:10.820
How big is your program?
00:24:10.820 --> 00:24:12.540
You really need testing.
00:24:12.540 --> 00:24:13.020
Maybe you do.
00:24:13.020 --> 00:24:13.640
Maybe you don't.
00:24:13.640 --> 00:24:14.700
Do you really need classes?
00:24:14.700 --> 00:24:15.300
Maybe you do.
00:24:15.300 --> 00:24:15.980
Maybe you don't.
00:24:15.980 --> 00:24:16.860
Do you need generators?
00:24:16.860 --> 00:24:17.520
Do you need anything?
00:24:17.520 --> 00:24:20.720
Like there's all these things that you probably could say, don't need them now.
00:24:20.720 --> 00:24:22.620
Maybe in a year or two, I can.
00:24:22.780 --> 00:24:23.560
I will need them.
00:24:23.560 --> 00:24:25.400
Then I'll be motivated to learn them.
00:24:25.400 --> 00:24:29.640
And so when you have these projects, you can say, I need these five things or I need these
00:24:29.640 --> 00:24:30.300
four things.
00:24:30.300 --> 00:24:31.440
I need to know them.
00:24:31.440 --> 00:24:34.320
And then my project is working, right?
00:24:34.320 --> 00:24:36.860
Instead of trying to say, well, what do I start with even?
00:24:36.860 --> 00:24:37.220
Yeah.
00:24:37.220 --> 00:24:42.020
And one of the criticisms of many learning resources, and I'm a little sensitive to this
00:24:42.020 --> 00:24:46.300
because I've written many of these examples, is when people do a for loop and the for loop
00:24:46.300 --> 00:24:49.600
is about like kinds of pizza or something or toppings of pizza.
00:24:49.600 --> 00:24:51.880
And people look at that and say, why do I need this?
00:24:51.880 --> 00:24:53.180
I don't care about pizza toppings.
00:24:53.180 --> 00:24:53.900
Okay.
00:24:54.020 --> 00:24:57.960
You need that because the person creating the resource has to have something, some kind
00:24:57.960 --> 00:24:59.120
of context for the example.
00:24:59.120 --> 00:25:03.480
And so when I'm teaching a class in person, I don't come up with, all right, we're going
00:25:03.480 --> 00:25:04.260
to do pizza toppings.
00:25:04.260 --> 00:25:06.720
I ask people in the class, hey, what are you interested in?
00:25:06.720 --> 00:25:10.540
And then we pick something that somebody in the class that day mentions.
00:25:10.540 --> 00:25:13.300
And then there's relevance right there.
00:25:13.300 --> 00:25:18.420
You don't have that if you're learning on your own, but what you can do, if you do know your
00:25:18.420 --> 00:25:22.440
own project, you work through the example about pizza toppings, but then you write a loop
00:25:22.440 --> 00:25:25.220
that relates to the project that you want to work on.
00:25:25.220 --> 00:25:30.000
And so that knowing that project is really helpful, regardless of how you're, you're learning.
00:25:30.000 --> 00:25:30.340
Yeah.
00:25:30.340 --> 00:25:31.680
Let me pull up another comment.
00:25:31.680 --> 00:25:33.580
I think this is worth covering for people as well.
00:25:33.580 --> 00:25:37.540
So Bishnielder says, for me, it was all good while I was learning programming Python.
00:25:37.540 --> 00:25:42.180
But as soon as I was out there in real life, looking for jobs and looking at the requirements,
00:25:42.180 --> 00:25:43.800
it drained a lot of energy out of me.
00:25:43.800 --> 00:25:44.900
Suggestions.
00:25:44.900 --> 00:25:45.720
What do you think?
00:25:45.720 --> 00:25:46.300
Oh boy.
00:25:46.300 --> 00:25:48.440
I don't think there's an easy answer to that.
00:25:48.440 --> 00:25:50.700
And I think it's important to be honest about that.
00:25:51.120 --> 00:25:54.980
Personally, I have never worked as a full-time programmer.
00:25:54.980 --> 00:25:58.580
And that puts me in a weird spot for talking about things like career transitions.
00:25:58.580 --> 00:26:05.080
I have helped thousands of people make career transitions, but I don't sit in the interviewee
00:26:05.080 --> 00:26:05.380
chair.
00:26:05.380 --> 00:26:06.420
Not very often.
00:26:06.420 --> 00:26:07.000
Yeah.
00:26:07.000 --> 00:26:12.340
And having spent a good part of my life as a teacher, teacher hiring and teacher, the
00:26:12.340 --> 00:26:16.040
structure of employment for teachers is so vastly different than programming.
00:26:16.040 --> 00:26:16.340
Yeah.
00:26:16.340 --> 00:26:19.540
The timeframe of teacher teaching jobs is so weird.
00:26:19.540 --> 00:26:25.260
It's like, yes, there's a time sort of once a year often that you can apply or change jobs.
00:26:25.260 --> 00:26:26.460
And otherwise you can't.
00:26:26.460 --> 00:26:28.140
It's not exactly true, but generally true.
00:26:28.140 --> 00:26:28.460
Yeah.
00:26:28.460 --> 00:26:32.560
I'm in an interesting position now where I'd kind of like to work as a professional programmer,
00:26:32.760 --> 00:26:36.700
but honestly, I have to spend 10 to 20 hours a week supporting the book.
00:26:36.700 --> 00:26:39.220
That LDS stuff is ongoing.
00:26:39.220 --> 00:26:40.140
I know.
00:26:40.140 --> 00:26:41.820
I got a bunch of courses and stuff.
00:26:41.820 --> 00:26:42.160
I know.
00:26:42.160 --> 00:26:42.500
Yeah.
00:26:42.500 --> 00:26:46.660
I was just redoing some videos that had a mistake in them that somebody noticed.
00:26:46.800 --> 00:26:48.540
So anything I do is on top of that work.
00:26:48.540 --> 00:26:53.380
And so I can really only consider part-time work and then it becomes a, is this worth
00:26:53.380 --> 00:26:53.560
it?
00:26:53.560 --> 00:27:00.540
So to be more direct, I don't think there's an easy answer to the grind of looking for work.
00:27:00.540 --> 00:27:04.660
And as a network thing of once you have a job, it can be easier to find the next job.
00:27:04.660 --> 00:27:09.420
The couple of things I'll share for people is if you, so we talked about solving real world
00:27:09.420 --> 00:27:09.920
problems.
00:27:09.920 --> 00:27:15.020
If you have a story that you can tell about how you have, you have made something better
00:27:15.020 --> 00:27:20.320
through programming, what employers are looking for is that yes, you have capability for programming.
00:27:20.320 --> 00:27:26.720
You can pass whatever lead code tests or screenings are necessary, but also have you use what you've
00:27:26.720 --> 00:27:28.300
learned about programming to solve something.
00:27:28.300 --> 00:27:33.620
And so the stories I always come back to are people who are working non-programming jobs and
00:27:33.620 --> 00:27:38.380
start to learn programming and then use that to solve something in their work that they weren't
00:27:38.380 --> 00:27:39.280
expected to solve.
00:27:39.280 --> 00:27:41.880
And that becomes a huge selling point in interviews.
00:27:41.880 --> 00:27:45.360
My favorite story is a guy who was working for, I believe it was UPS.
00:27:45.360 --> 00:27:46.620
And this was quite a while ago.
00:27:46.620 --> 00:27:50.360
I feel comfortable telling that story, partly based on time, but they were working for one
00:27:50.360 --> 00:27:55.580
of these large delivery companies and they were aware of people getting fired in warehouses
00:27:55.580 --> 00:27:58.340
for damage to the goods that were supposed to be delivered.
00:27:58.340 --> 00:28:03.640
And so the person was learning Python and they wrote some data analysis and they were able to
00:28:03.640 --> 00:28:09.140
pinpoint that the damage was coming from a manager or management group that was not
00:28:09.140 --> 00:28:11.740
training end line employees well enough.
00:28:11.740 --> 00:28:17.340
And so that was really interesting story because the people being fired were not the people who
00:28:17.340 --> 00:28:18.380
are causing the damage.
00:28:18.380 --> 00:28:22.480
They caused the physical damage, but it was more systemic.
00:28:22.480 --> 00:28:22.920
Yeah.
00:28:22.920 --> 00:28:23.480
Yeah.
00:28:23.560 --> 00:28:27.440
And so that person saved their company millions of dollars and they got like a $5,000 a year
00:28:27.440 --> 00:28:27.800
raise.
00:28:27.800 --> 00:28:34.760
What they really did was they used that story in interviews to gain an actual programming
00:28:34.760 --> 00:28:36.480
position at a different company.
00:28:36.480 --> 00:28:39.980
And so it's hard when you're starting out.
00:28:40.340 --> 00:28:45.100
And so all I can say is look for the selling point for yourself and know that once you do
00:28:45.100 --> 00:28:49.440
get your first break, it becomes easier to stay on that path.
00:28:49.440 --> 00:28:50.860
I have one more thing to add.
00:28:50.860 --> 00:28:54.780
A lot of times when people are looking for their first programming job, they have experience
00:28:54.780 --> 00:28:55.320
somewhere else.
00:28:55.320 --> 00:28:57.200
I realized some people are young.
00:28:57.200 --> 00:28:58.280
They learn programming.
00:28:58.280 --> 00:29:01.020
That's kind of their totality of work experience.
00:29:01.400 --> 00:29:04.780
But a lot of people maybe studied something else and became a programmer like you studied
00:29:04.780 --> 00:29:05.200
physics.
00:29:05.200 --> 00:29:06.840
Embrace that, right?
00:29:06.840 --> 00:29:09.980
So imagine you studied, I don't know, logistics.
00:29:09.980 --> 00:29:13.220
Instead of trying to look for a programming job because you don't want to do logistics,
00:29:13.220 --> 00:29:15.840
look for a programming job at a logistics company.
00:29:15.840 --> 00:29:20.920
Because then you could say, I have programming skills, plus I have an expertise in your area
00:29:20.920 --> 00:29:21.720
of specialization.
00:29:21.720 --> 00:29:27.280
And once you intersect those things, you are in a much smaller set of competitors, right?
00:29:27.280 --> 00:29:29.020
Like I'm looking for a biology job.
00:29:29.020 --> 00:29:30.360
There's a ton of people doing biology.
00:29:30.520 --> 00:29:33.240
If I'm looking for a programming job, there's a ton of people doing programming.
00:29:33.240 --> 00:29:40.100
How many are doing biology and programming maybe in the specific area that you're focused
00:29:40.100 --> 00:29:40.700
in, right?
00:29:40.700 --> 00:29:42.460
That all of a sudden gives you an opportunity.
00:29:42.460 --> 00:29:46.280
But it also means you need to look somewhat differently for jobs, right?
00:29:46.280 --> 00:29:50.800
You don't go apply to FANG the same way that everyone else thinks they should apply to FANG.
00:29:50.800 --> 00:29:55.080
Look for these small companies because not only will they appreciate it more, you'll get a
00:29:55.080 --> 00:29:59.340
better chance to grow because you'll get a bigger responsibility to write more broad software.
00:29:59.640 --> 00:30:04.980
And the interviewing process is not nearly as terrible, I think, for small companies, right?
00:30:04.980 --> 00:30:05.180
Right.
00:30:05.180 --> 00:30:08.860
It's a chat with a couple of people and they're like, we think you can do it.
00:30:08.860 --> 00:30:10.100
Give it a try for a week.
00:30:10.100 --> 00:30:14.140
Whereas places like the large tech companies, right?
00:30:14.140 --> 00:30:18.720
They've got these pretty horrible, here's your take-home exercise, write it.
00:30:18.720 --> 00:30:22.760
We'll consider it if it works out well, maybe amongst the other thousands, right?
00:30:22.800 --> 00:30:24.180
It's like a really different experience.
00:30:24.180 --> 00:30:28.440
I think that first step in the door, that first job is the one that is hard to get.
00:30:28.440 --> 00:30:28.740
Yeah.
00:30:28.740 --> 00:30:31.320
I'll throw one more piece in there and it's a quick thought.
00:30:31.320 --> 00:30:35.220
And that is, you know, contributing to open source projects is something we need to be careful
00:30:35.220 --> 00:30:37.640
about because oftentimes it's privileged work.
00:30:37.640 --> 00:30:40.060
You have some extra time and you can do that.
00:30:40.140 --> 00:30:46.180
But one of the real benefits of making meaningful contributions to established open source projects
00:30:46.180 --> 00:30:52.280
is it throws you all the way into professional workflows of managing, you know, using source
00:30:52.280 --> 00:30:55.600
control and just the bigger piece, communicating with a larger team.
00:30:55.600 --> 00:31:03.080
So as I've gotten more into open source, for me, that scratches that itch of wanting to work
00:31:03.080 --> 00:31:04.120
as a professional programmer.
00:31:04.480 --> 00:31:06.500
It's hard to simulate.
00:31:06.500 --> 00:31:07.040
Yeah.
00:31:07.040 --> 00:31:13.860
It's hard to simulate proper CI, CD, merge conflict, PR discussions on your own little
00:31:13.860 --> 00:31:14.420
hobby project.
00:31:14.420 --> 00:31:14.960
That's for sure.
00:31:14.960 --> 00:31:19.820
This portion of Talk Python To Me is brought to you by Sentry.
00:31:19.820 --> 00:31:24.520
You know Sentry for their error tracking service, but did you know you can take that all the
00:31:24.520 --> 00:31:28.700
way through your multi-tiered and distributed app with their distributed tracing feature?
00:31:28.700 --> 00:31:34.400
Distributed tracing is a debugging technique that involves tracking requests of your system,
00:31:34.720 --> 00:31:38.700
starting from the very beginning, like a user action, all the way to the backend, database
00:31:38.700 --> 00:31:40.080
and third-party services.
00:31:40.080 --> 00:31:45.080
This can help you identify if the cause of an error in one project is due to the error in
00:31:45.080 --> 00:31:45.460
another.
00:31:45.460 --> 00:31:50.340
Every system can benefit from distributed tracing, but they're especially useful for microservices.
00:31:50.340 --> 00:31:55.220
In this architecture, logs won't give you the full picture, so you can't debug every
00:31:55.220 --> 00:31:57.160
request in full just by reading the logs.
00:31:57.160 --> 00:32:02.880
Distributed tracing with a platform like Sentry gives you a visual overview about which services
00:32:02.880 --> 00:32:05.360
were called during the execution of certain requests.
00:32:05.360 --> 00:32:11.300
Aside from debugging and visualizing your architecture, distributed tracing also helps you identify
00:32:11.300 --> 00:32:12.520
performance bottlenecks.
00:32:12.520 --> 00:32:17.540
Through a visual like a Gantt chart, you can see if a particular span in your stack took longer
00:32:17.540 --> 00:32:21.420
than expected and how it could be causing slowdowns in other parts of your app.
00:32:21.420 --> 00:32:26.400
Learn more and see some examples in the tracing section at docs.sentry.io.
00:32:26.400 --> 00:32:31.100
To take advantage of all the features of the Sentry platform, just create your free account.
00:32:31.100 --> 00:32:36.640
And for all of you Talk Python listeners, use the code TALKPYTHON, all one word, and you'll
00:32:36.640 --> 00:32:39.560
activate a free month of their premium paid features.
00:32:39.560 --> 00:32:44.200
Get started today at talkpython.fm/sentry-trace.
00:32:44.200 --> 00:32:47.280
That link is in your podcast player show notes and the episode page.
00:32:47.740 --> 00:32:50.580
Thank you to Sentry for supporting Talk Python To Me.
00:32:52.320 --> 00:32:54.200
So we're number two.
00:32:54.200 --> 00:32:55.720
We'll cover, get a project.
00:32:55.720 --> 00:32:57.560
Yeah, we can go through some of these a little faster.
00:32:57.560 --> 00:32:58.900
Yeah, no, of course we can.
00:32:58.900 --> 00:32:59.840
What's number three?
00:32:59.840 --> 00:33:02.780
Number three is don't limit your learning to what's needed for your project.
00:33:02.780 --> 00:33:07.820
So it's important to have a specific project in mind to give context for what you're learning
00:33:07.820 --> 00:33:13.620
and give purpose and steer you towards feeling success and knowing like what's good enough.
00:33:14.300 --> 00:33:18.900
But always be ready to expand your toolbox and your understanding and it'll serve all your
00:33:18.900 --> 00:33:20.320
projects in the end.
00:33:20.320 --> 00:33:21.380
And learning is fun.
00:33:21.380 --> 00:33:23.000
Learning in good ways is fun.
00:33:23.000 --> 00:33:25.280
Learning with good resources, with good people.
00:33:25.280 --> 00:33:28.760
You want to learn FastAPI, here's your FastAPI worksheet.
00:33:28.760 --> 00:33:29.780
The answers are in the back.
00:33:29.780 --> 00:33:30.120
Yeah.
00:33:30.120 --> 00:33:34.740
I have a kid in middle school, so we shouldn't talk about worksheets.
00:33:34.740 --> 00:33:41.060
But a quick example is I'm working on a project called Django Simple Deploy that automates
00:33:41.060 --> 00:33:43.220
deployment for projects in Django.
00:33:43.220 --> 00:33:44.540
It's not just for beginners.
00:33:44.540 --> 00:33:49.600
When Heroku collapsed its free tier a couple years ago, we saw a bunch of very experienced
00:33:49.600 --> 00:33:53.440
Python web people en masse go look at other platforms.
00:33:53.440 --> 00:33:59.900
And we saw them talking about how difficult it is to go through each platform's documentation
00:33:59.900 --> 00:34:02.820
and get a simple app deployed just to see the process.
00:34:02.820 --> 00:34:07.440
And so this tool is a core command, manage.py simple deploy.
00:34:07.440 --> 00:34:12.320
And then you name the platform and it configures your project for that platform.
00:34:12.840 --> 00:34:14.000
And then you can push it.
00:34:14.000 --> 00:34:20.260
And so it's set up as a core command that then calls out to a platform-specific command
00:34:20.260 --> 00:34:22.420
and configures your project for those commands.
00:34:22.420 --> 00:34:26.900
And so when I first wrote it, my first pass was just a bunch of classes that they work together
00:34:26.900 --> 00:34:29.320
because I wrote them and they're all nice.
00:34:29.320 --> 00:34:33.440
But I had learned about abstract-based classes but never had a purpose for using one.
00:34:33.760 --> 00:34:44.240
And so when this project is becoming, as this project is becoming more refined, I need to enforce a structure so that the platform-specific code works with the platform agnostic code.
00:34:44.740 --> 00:34:54.580
And so if I hadn't, or I should say this the positive way, because I had done some general learning about more advanced object-oriented principles,
00:34:54.580 --> 00:34:59.080
I have some sense of how to enforce that structure as the need arises.
00:34:59.460 --> 00:35:06.580
So it's good to have a project in mind, but don't limit what you're learning just to that project because you'll become a better programmer and you'll do your projects better.
00:35:06.580 --> 00:35:06.860
Sure.
00:35:06.860 --> 00:35:13.140
One of the ideas I think is really powerful is that inspiration is perishable, right?
00:35:13.240 --> 00:35:17.940
If you are inspired about something, you might not be that inspired in a couple of weeks.
00:35:17.940 --> 00:35:19.360
And that doesn't mean it's not cool anymore.
00:35:19.360 --> 00:35:24.020
That just means, you know, you moved on, your focus is elsewhere, whatever.
00:35:24.020 --> 00:35:29.660
And so, yeah, sure, you need to learn the things you need to learn to do your project or to check some boxes.
00:35:29.660 --> 00:35:34.280
But if you find something, you're like, I am really interested in that.
00:35:34.280 --> 00:35:36.680
Like, you know, leverage that inspiration.
00:35:36.680 --> 00:35:44.300
I don't know about other people, but for me, I'm like two or three times more productive in learning and writing code and all sorts of things.
00:35:44.300 --> 00:35:49.280
If I'm like really on fire about something versus like, ah, I guess I'll get in there and like fix that bug.
00:35:49.280 --> 00:35:56.300
And like something that I'm not inspired about is MailChimp just changed their API and deprecated their, you know, shut off their old one.
00:35:56.300 --> 00:35:59.620
So now to have people on my mailing list, I got to go rewrite that.
00:35:59.620 --> 00:36:03.300
There's no, what I get in the end is I get to just keep having them on my mailing list.
00:36:03.300 --> 00:36:04.640
There's zero inspiration there.
00:36:04.640 --> 00:36:12.480
But if I ran across like, oh, there's this new feature in Python 3.12, or there's this new package that I found on PyPI that's awesome.
00:36:12.480 --> 00:36:15.260
Like, and I just really want to like leverage that.
00:36:15.260 --> 00:36:15.520
Right.
00:36:15.520 --> 00:36:18.040
But while it's, while it's there, take advantage of it.
00:36:18.040 --> 00:36:18.460
All right.
00:36:18.460 --> 00:36:19.480
Number four.
00:36:19.480 --> 00:36:20.000
Yeah.
00:36:20.000 --> 00:36:20.480
Number four.
00:36:20.480 --> 00:36:21.000
What do we got?
00:36:21.000 --> 00:36:22.060
Read good code.
00:36:22.060 --> 00:36:29.080
And this is one of those things that I wish I had been told a lot earlier in my programming career than I was.
00:36:29.080 --> 00:36:40.900
I went a long time, decades, just looking at code that was presented in the classes and books I read and then writing my own code and then only reading what I needed to in order to do my projects.
00:36:41.000 --> 00:36:47.680
And then at some point, I forget if I saw a suggestion to do this or if I just started to do it out of curiosity.
00:36:47.680 --> 00:36:53.540
I think it was probably around the time when a lot of code became very visible through platforms like GitHub.
00:36:53.540 --> 00:36:57.640
But if you're using a library like, say, Pandas, that is out in the open.
00:36:57.640 --> 00:37:05.480
And so rather than just using Pandas functions, you can go look at the code that runs that function.
00:37:06.480 --> 00:37:11.340
So Pandas has, I shouldn't say Pandas because I'm just starting to get more fluent with that, more comfortable.
00:37:11.340 --> 00:37:13.000
So I'll say like matplotlib.
00:37:13.000 --> 00:37:19.480
So if you're making a scatterplot, fig.scatter or something like that, you can go look at that scatter function and see what it does.
00:37:19.480 --> 00:37:22.040
You see the full set of arguments that it can take.
00:37:22.040 --> 00:37:23.300
You see all of its capabilities.
00:37:23.300 --> 00:37:30.260
And you see how the people writing and maintaining matplotlib take your information and turn it into a plot.
00:37:30.260 --> 00:37:34.380
And when you look at that code, you're seeing professional quality code.
00:37:34.380 --> 00:37:35.740
It can be overwhelming.
00:37:36.060 --> 00:37:38.980
There's probably going to be parts that you understand and parts that you don't.
00:37:38.980 --> 00:37:40.860
But the more you look at it, the more you understand.
00:37:40.860 --> 00:37:44.780
And you start, your code becomes better because you're seeing high quality code.
00:37:44.780 --> 00:37:50.840
It's good to recognize that those people writing that did not write that polished code the first time they wrote the scatter function.
00:37:50.840 --> 00:37:55.160
So don't think, I'm a bad programmer because my code doesn't look like this.
00:37:55.160 --> 00:38:00.740
The polished code that we look at from large, popular, well-established frameworks has been well-refined.
00:38:00.740 --> 00:38:02.820
And so it's something to aim for.
00:38:02.820 --> 00:38:04.020
Yeah, it totally is.
00:38:04.300 --> 00:38:10.780
It's one of those things that's hard to get experience with if you're kind of not yet working as a professional developer.
00:38:10.780 --> 00:38:16.060
Or even if you are, but you're a one to two person shop where you don't collaborate a lot.
00:38:16.060 --> 00:38:16.440
Right.
00:38:16.440 --> 00:38:16.900
Right.
00:38:17.220 --> 00:38:23.440
It doesn't have to be that you're not working as a pro, you know, working as part of your job in that, right?
00:38:23.440 --> 00:38:26.860
It could be that you just don't have enough collaboration or enough people.
00:38:26.860 --> 00:38:27.400
Yeah.
00:38:27.400 --> 00:38:27.860
Yeah.
00:38:27.860 --> 00:38:28.420
And a good thing.
00:38:28.420 --> 00:38:29.240
So good advice.
00:38:29.240 --> 00:38:30.640
It could be hard to know where to look.
00:38:30.640 --> 00:38:31.400
All right.
00:38:31.400 --> 00:38:34.440
So if I look at the Python source code giant, I have no idea where to look.
00:38:34.440 --> 00:38:35.780
Look at the most recent commits.
00:38:35.780 --> 00:38:44.580
So just pick a commit, look at the files that were changed and get some sense of what people are doing to modify the language and these larger libraries.
00:38:44.580 --> 00:38:46.000
Look at the newest issues.
00:38:46.000 --> 00:38:50.640
What are people discussing about what they're trying to work on and how they're trying to solve that?
00:38:50.640 --> 00:38:52.920
And maybe look at some of the longest open issues.
00:38:52.920 --> 00:38:58.100
What are the hardest problems that people are wrestling with in some of these projects that we all use?
00:38:58.260 --> 00:38:58.960
All good advice.
00:38:58.960 --> 00:39:17.100
I would say the larger the open source project and the more popular, maybe harder it is to read, you know, because it has to be more polished and more optimized and more, you know, it's just it's got that extra layer of, well, it's going to make it harder to read, but it'll make it 2% faster.
00:39:17.100 --> 00:39:18.840
And people will appreciate that.
00:39:18.840 --> 00:39:19.980
So we're going to do that.
00:39:19.980 --> 00:39:27.840
Whereas there's a tier below that of open source things that are professional level, but not yet kind of beyond approachable.
00:39:28.120 --> 00:39:35.420
Yeah, I did two newsletter posts recently about exploring recent Python repositories to get at this exact issue.
00:39:35.420 --> 00:39:38.320
So the idea, if you're looking at contributing to Django, it's hard.
00:39:38.320 --> 00:39:43.140
Django community is doing a lot of work to make it more approachable for people wanting to contribute.
00:39:43.140 --> 00:39:48.700
But it's absolutely true that it's hard to contribute to and get into larger, well-established code bases.
00:39:49.080 --> 00:39:58.260
So I use the GitHub API to find, say, all the Python projects that have pushed to GitHub in the last three weeks that have at least 10 stars.
00:39:58.260 --> 00:40:00.800
And those are the fresh projects that are getting attention.
00:40:00.800 --> 00:40:03.540
We don't have all this long-term stuff.
00:40:03.540 --> 00:40:09.880
And so I ended up actually contributing to one of those projects because it's just what you described earlier, just pulled me in and fascinated me.
00:40:09.880 --> 00:40:14.780
And it's so nice to have some concrete contributions to a project that is in that fresh stage.
00:40:14.780 --> 00:40:15.780
Yeah, that's fantastic.
00:40:15.780 --> 00:40:17.000
All right, what's the next one?
00:40:17.000 --> 00:40:17.900
Know your tools.
00:40:19.440 --> 00:40:28.600
I laugh at this one because I think about this is one of the reasons I transitioned into an equal focus between programming and teaching.
00:40:28.600 --> 00:40:32.860
I used to, my priority was 98% teaching and 2% programming.
00:40:32.860 --> 00:40:36.960
And now I'm probably 60% program, 40% teaching.
00:40:36.960 --> 00:40:39.380
Tools for teachers are terrible.
00:40:39.380 --> 00:40:43.920
Teachers, public school teachers still write most of their lesson plans in Microsoft Word.
00:40:43.920 --> 00:40:48.640
And that sounds like, oh gosh, they just have to like write out onto a blank page.
00:40:48.820 --> 00:40:53.420
But what it really means is we as programmers are used to working with structured data.
00:40:53.420 --> 00:41:01.760
And so if we have a workflow and we're writing something and then we update the structure of our information, we don't have to go back and rewrite everything.
00:41:01.760 --> 00:41:04.980
We have tools that manage restructuring projects.
00:41:04.980 --> 00:41:13.100
If you write three years of lesson plans in Word and then you figure out how to teach better and you want to restructure all your lessons, there's no automated way to do that.
00:41:13.100 --> 00:41:13.820
It's a mess.
00:41:13.820 --> 00:41:23.240
And so I'm grateful as a programmer to have things like IDEs, formatters, linters, Git, any version control system, GitHub hosting platforms.
00:41:23.780 --> 00:41:35.000
And so my core advice here is to, as you're becoming more established as a programmer and as a Python programmer, start to recognize what are the tools that you personally find value in?
00:41:35.000 --> 00:41:36.400
What is your favorite IDE?
00:41:36.400 --> 00:41:38.180
What is your preferred formatter?
00:41:38.180 --> 00:41:40.620
What's your preferred linter version control system?
00:41:41.180 --> 00:41:44.620
And then just take a little time to focus on that tool itself.
00:41:44.620 --> 00:41:50.320
So if you've been using VS Code for six months, spend three days and just read about configuring VS Code.
00:41:50.320 --> 00:41:56.820
You'll almost certainly come up with some things that make your day-to-day work more efficient, more effective, more enjoyable.
00:41:56.820 --> 00:42:00.560
Every time I've taken time to do this, I've come out better for it.
00:42:00.700 --> 00:42:06.220
Yeah, whether it's VS Code or PyCharm, they both have a ton of options that you can pick from.
00:42:06.220 --> 00:42:09.160
They're discoverable or less discoverable in different ways.
00:42:09.160 --> 00:42:18.720
Like PyCharm makes it kind of obvious what all the things it can do, but there's so many things that people are like, well, I'm just going to stick to my lane and just stay over here and do the thing.
00:42:18.720 --> 00:42:21.120
VS Code is a little less discoverable.
00:42:21.120 --> 00:42:28.220
But maybe it makes it even harder to take full advantage of it because it's like the command shift P to pull up the palette and then like, well, there's a huge list.
00:42:28.220 --> 00:42:28.960
What'd I do with this?
00:42:29.340 --> 00:42:30.000
Yes, yes.
00:42:30.000 --> 00:42:33.160
But they're being really good with your editor.
00:42:33.160 --> 00:42:39.700
I know some of the things that are coming as well on your list, this adds on top of it, but it makes a huge difference.
00:42:39.700 --> 00:42:46.540
It makes things like being comfortable navigating your code feel better, testing your code, changing your code, right?
00:42:46.540 --> 00:42:51.440
Doing some of these workflows you talked about, like Git and PRs, all of that stuff.
00:42:51.440 --> 00:42:54.560
All of those things are in those tools, plus way more.
00:42:54.560 --> 00:42:58.500
That's not even talking about the extensions or plugins that you might go after, right?
00:42:58.620 --> 00:43:04.420
And so, but it's easy to see like, well, I've fired it up and then now it's an editor, right?
00:43:04.420 --> 00:43:06.700
It's a thing and then, oh, it has cool autocomplete.
00:43:06.700 --> 00:43:10.560
And then just kind of forget about the hundred other things that it can help you with.
00:43:10.560 --> 00:43:10.880
Yeah.
00:43:10.880 --> 00:43:13.500
And particularly with IDEs, they do a lot for us.
00:43:13.500 --> 00:43:16.400
And that can be a good thing and it can be a bad thing.
00:43:16.400 --> 00:43:24.300
I have steered a lot of people back towards simpler editors like Sublime Text and even Genie is a fantastic one that a lot of people don't know about.
00:43:24.980 --> 00:43:31.340
Because the tools like VS Code, PyCharm, whatnot, when everything's working, what they do for us is fantastic.
00:43:31.340 --> 00:43:36.600
When things stop working, if you don't know what it's trying to do for you, it can just make things much more confusing.
00:43:36.600 --> 00:43:42.580
And particularly that comes down to things like tools that build virtual environment for a new project for you.
00:43:42.780 --> 00:43:46.800
So if you understand what that's doing and it stops working, you can go troubleshoot it.
00:43:46.800 --> 00:43:52.260
But if you don't know what it did for you and now like it says this module is not found, it can be a mess.
00:43:52.260 --> 00:43:53.960
And so, yeah, you can.
00:43:53.960 --> 00:43:58.520
Virtual environments seem to be just like, they just go wrong so often.
00:43:58.520 --> 00:43:58.900
Yeah.
00:43:58.900 --> 00:44:04.240
I'm not in the pure, I've created one on the terminal and like I've acted, like that's solid.
00:44:04.240 --> 00:44:08.980
But in the tooling, it's like, sometimes it finds it, sometimes it doesn't.
00:44:08.980 --> 00:44:10.860
Sometimes it really doesn't want to find it.
00:44:10.860 --> 00:44:12.300
You know, like it's nuts.
00:44:12.300 --> 00:44:12.560
Yeah.
00:44:12.560 --> 00:44:12.960
Yeah.
00:44:12.960 --> 00:44:14.240
And so I'm glad you brought that up.
00:44:14.240 --> 00:44:22.040
So the core advice there for me has always been people have a tendency to want to go find another editor or IDE that's going to manage that better.
00:44:22.040 --> 00:44:27.320
And what I tell them is, no, it's going to manage it differently and you're going to run into the same issue and then you're going to need to solve it.
00:44:27.320 --> 00:44:36.500
So when that stuff happens, taking the time to learn what your editor is doing for you and then be able to troubleshoot that, that's going to serve you well in the long run.
00:44:36.500 --> 00:44:36.840
All right.
00:44:36.840 --> 00:44:37.740
What's next?
00:44:37.740 --> 00:44:39.240
Learn how to test your code.
00:44:40.000 --> 00:44:43.540
And I wrote here, you won't sleep more, but your sleep will be more restful.
00:44:44.220 --> 00:44:47.980
I went probably 20 years programming without ever writing a test.
00:44:47.980 --> 00:44:50.160
And I always had this notion that it was difficult.
00:44:50.160 --> 00:44:51.600
It was separate from programming.
00:44:51.600 --> 00:44:54.900
And the first time I wrote a test, it was so much easier than I thought.
00:44:54.900 --> 00:45:00.160
And so cool to see my program run automatically and have the output validated.
00:45:00.560 --> 00:45:01.300
I love testing.
00:45:01.300 --> 00:45:05.640
It's probably my biggest interest these days beyond deploying Django projects.
00:45:05.640 --> 00:45:09.580
And I love it because, you know, when we write code, we want it to work.
00:45:09.580 --> 00:45:13.720
When we have a project, we want our project to be successful.
00:45:13.720 --> 00:45:15.980
And so testing validates that.
00:45:15.980 --> 00:45:20.100
Testing gives you confidence that your project is working correctly.
00:45:20.100 --> 00:45:22.280
And if you fix a bug, you just fix it once.
00:45:22.840 --> 00:45:25.820
So testing is its own podcast for some people.
00:45:25.820 --> 00:45:29.360
So I'll just say that testing is easier than a lot of people think it is.
00:45:29.360 --> 00:45:30.420
Go use pytest.
00:45:30.420 --> 00:45:33.260
I used to teach unit tests because it's in the standard library.
00:45:33.260 --> 00:45:36.160
But pytest has become well established enough.
00:45:36.160 --> 00:45:41.640
It's one of my favorite Python packages of all because it's one of those few that serves
00:45:41.640 --> 00:45:44.540
pure beginners and experts equally well.
00:45:44.540 --> 00:45:47.000
It's the best way to be introduced to testing.
00:45:47.180 --> 00:45:50.620
And if you're testing professionally, there's no tool better than that.
00:45:50.620 --> 00:45:52.180
That's the Zen of Python, right?
00:45:52.180 --> 00:45:55.880
That it's really serves beginners well, but also experts well.
00:45:55.880 --> 00:45:58.400
I think that's one of its special capabilities.
00:45:58.400 --> 00:45:58.780
Yeah.
00:45:58.780 --> 00:46:00.840
I will encourage people.
00:46:00.840 --> 00:46:03.220
And Michael, I'd be curious if you agree with this or not.
00:46:03.220 --> 00:46:08.360
I'd encourage people to not necessarily look at unit tests right away because unit tests are
00:46:08.360 --> 00:46:09.560
brittle for newer projects.
00:46:09.560 --> 00:46:11.720
I really like end-to-end testing.
00:46:11.720 --> 00:46:15.900
And that is where you run your project, you get some output, and then you run tests against
00:46:15.900 --> 00:46:16.420
that output.
00:46:16.420 --> 00:46:19.920
And that is not testing the implementation of your project.
00:46:19.920 --> 00:46:22.020
That's just saying, does your project work?
00:46:22.020 --> 00:46:26.840
And so the project I've been pulled into recently is one called git-sim, git-sim.
00:46:26.840 --> 00:46:31.600
And you run it against your own project, and it gives you a visualization of all your commits.
00:46:31.600 --> 00:46:35.640
And so for people trying to understand how git works or how git is working for their particular
00:46:35.640 --> 00:46:41.500
project, you run git-sim merge, and it shows you visualization of what that merge would
00:46:41.500 --> 00:46:41.960
look like.
00:46:41.960 --> 00:46:44.440
And so that project is newer, and it had no tests.
00:46:44.440 --> 00:46:46.680
And so I helped write the initial test suite.
00:46:47.240 --> 00:46:52.020
And I told the person, like, we shouldn't test your implementation because you should
00:46:52.020 --> 00:46:56.520
be free to change how you're building this new project, but we should absolutely start
00:46:56.520 --> 00:47:00.660
to test the images that you're generating so that when you do change your implementation,
00:47:00.660 --> 00:47:05.580
you know whether the images that your users are going to see are the ones that you think
00:47:05.580 --> 00:47:07.520
that you've been seeing and you think they're going to see.
00:47:08.000 --> 00:47:13.880
And so that's really nice because you don't have to aim for 100% coverage of your code.
00:47:13.880 --> 00:47:16.340
You just start to get that big picture.
00:47:16.340 --> 00:47:18.680
Yes, my project is still doing what I think it's doing.
00:47:18.680 --> 00:47:23.080
That makes for better sleep, and all of your non-computer activities are more enjoyable because
00:47:23.080 --> 00:47:25.260
you have more confidence that things keep working.
00:47:25.260 --> 00:47:29.760
Yeah, I'm with you on not going too far down the unit test side.
00:47:29.820 --> 00:47:34.180
I used to write tons and tons of very low-level focus unit tests.
00:47:34.180 --> 00:47:39.400
And when I was on a team, I always had a hard time having everybody have buy-in.
00:47:39.400 --> 00:47:40.440
Some people would.
00:47:40.440 --> 00:47:41.660
Some people wouldn't.
00:47:41.660 --> 00:47:43.680
They'd go do something that would break the test.
00:47:43.680 --> 00:47:45.500
You're like, you broke the bill.
00:47:45.500 --> 00:47:47.860
They're like, oh, yeah, I guess I did.
00:47:47.860 --> 00:47:51.260
You're like, you realize that we don't all participate in this.
00:47:51.260 --> 00:47:58.260
It just becomes a hassle for me, chasing after, trying to patch up the tests as you make these
00:47:58.260 --> 00:47:58.580
changes.
00:47:58.580 --> 00:48:04.840
And as you're lower level in the world, that's just a more constant problem.
00:48:04.840 --> 00:48:07.220
And it also requires more effort, right?
00:48:07.220 --> 00:48:08.440
So maybe that effort is worthwhile.
00:48:08.440 --> 00:48:10.820
But if you're new, maybe it's not.
00:48:10.820 --> 00:48:16.000
And so I'm a little bit more on board with just like, let's do the main things at kind of
00:48:16.000 --> 00:48:17.160
top to bottom in the app.
00:48:17.160 --> 00:48:20.920
And if that stuff hangs on, we got a real good chance.
00:48:20.920 --> 00:48:26.380
And over time, my experience has been, for the most part, things blow up hard.
00:48:26.380 --> 00:48:29.440
They don't just like, oh, there's some little subtle problem.
00:48:29.440 --> 00:48:34.500
Generally, not always true, but generally, like if I screw something up, a lot of tests start
00:48:34.500 --> 00:48:38.460
failing, even when they're these high-level things, because something's pretty, pretty messed
00:48:38.460 --> 00:48:38.700
up.
00:48:38.700 --> 00:48:43.620
And in that regard, that other person probably didn't intend to change the output or the overall
00:48:43.620 --> 00:48:46.860
behavior of the app in well-known ways.
00:48:46.860 --> 00:48:51.740
They just changed some implementation detail, and they weren't being sufficiently rigorous
00:48:51.740 --> 00:48:54.320
with their software lifecycle.
00:48:54.320 --> 00:48:56.020
So yes, I'm on board.
00:48:56.020 --> 00:49:01.620
The web equivalent, the easiest web equivalent that I can think of is if you've got a website
00:49:01.620 --> 00:49:06.400
and it has a sitemap, your website should have a sitemap for all of your data-driven pages.
00:49:06.400 --> 00:49:09.180
Just go get the sitemap and request every page.
00:49:09.180 --> 00:49:12.600
Does it give you a 200 or does it give you a 500 or a 404?
00:49:12.600 --> 00:49:16.420
Because 404s and 500s should not be found in your sitemap.
00:49:16.420 --> 00:49:16.760
Right?
00:49:16.760 --> 00:49:19.000
But that's a really easy test, right?
00:49:19.000 --> 00:49:24.340
Like loop over that, call every one of those with your, you know, self.client.get or whatever
00:49:24.340 --> 00:49:26.840
your HTTP test thing looks like.
00:49:26.840 --> 00:49:27.680
And just call all of them.
00:49:27.680 --> 00:49:29.820
That's one thing you could do that's in that category.
00:49:30.020 --> 00:49:34.280
And as an author, I wrote tests for most of the code in Python Crash Course.
00:49:34.280 --> 00:49:38.200
And so Python Crash Course was first written, I think, on Python 3.5.
00:49:38.200 --> 00:49:42.640
And so it's been through like, what, six or seven iterations of Python and all kinds of
00:49:42.640 --> 00:49:45.020
iterations of the libraries that the projects use.
00:49:45.400 --> 00:49:50.220
And so whenever a new issue comes out or new, sorry, version comes out, I just run tests
00:49:50.220 --> 00:49:51.340
on most of the code in the book.
00:49:51.340 --> 00:49:56.780
And it pulls the test pulls the code from the GitHub repository for the book and just runs
00:49:56.780 --> 00:49:57.600
it with the new versions.
00:49:57.600 --> 00:50:02.860
And that's been part of how I've been able to maintain the upkeep and maintenance
00:50:02.860 --> 00:50:05.840
on a 500 page book that covers a lot.
00:50:05.840 --> 00:50:06.160
Yeah.
00:50:06.160 --> 00:50:06.720
Yeah.
00:50:06.720 --> 00:50:07.260
That's awesome.
00:50:07.260 --> 00:50:07.580
Yeah.
00:50:07.580 --> 00:50:08.300
Let's keep going.
00:50:08.300 --> 00:50:13.280
There's a couple of good comments and questions in the audience, but I think we're on, we're on
00:50:13.280 --> 00:50:13.660
a schedule.
00:50:13.660 --> 00:50:14.480
So let's keep going.
00:50:14.480 --> 00:50:14.840
Yeah.
00:50:14.840 --> 00:50:15.060
Yeah.
00:50:15.400 --> 00:50:16.420
Last comment about testing.
00:50:16.420 --> 00:50:20.060
I love it because I think that when you test your code, you learn things about your code
00:50:20.060 --> 00:50:21.920
that makes development better as well.
00:50:21.920 --> 00:50:23.740
So it's not just, does it work?
00:50:23.740 --> 00:50:27.260
It's also gives you insight into, into how your code is working.
00:50:27.260 --> 00:50:29.240
I'm looking forward to exploring more.
00:50:29.240 --> 00:50:29.820
All right.
00:50:29.820 --> 00:50:30.320
Next point.
00:50:30.320 --> 00:50:32.660
Know what's good enough for any given project.
00:50:32.660 --> 00:50:35.860
As a teacher, students would say like, am I done?
00:50:35.860 --> 00:50:36.400
Am I done?
00:50:36.400 --> 00:50:37.120
Is this good enough?
00:50:37.120 --> 00:50:40.980
And I watch other teachers say like, don't ask me that.
00:50:40.980 --> 00:50:41.840
Always work harder.
00:50:41.840 --> 00:50:44.340
And I always tell the students, that's a great question.
00:50:44.580 --> 00:50:45.680
What is good enough?
00:50:45.680 --> 00:50:49.780
And so whatever your project is, knowing your benchmark for what's good enough and when
00:50:49.780 --> 00:50:53.720
it's done, when you can move on to the next thing is really helpful because you'll never
00:50:53.720 --> 00:50:56.840
write perfect code, but you can certainly write good enough code.
00:50:56.980 --> 00:50:57.080
Yeah.
00:50:57.080 --> 00:51:02.820
And there was a really popular article, blog post, something like that, that was, you're
00:51:02.820 --> 00:51:03.420
not Facebook.
00:51:03.420 --> 00:51:04.580
You're not Google.
00:51:04.580 --> 00:51:05.920
You're not Microsoft.
00:51:05.920 --> 00:51:06.840
You're not LinkedIn.
00:51:06.840 --> 00:51:08.280
Something along those lines.
00:51:08.280 --> 00:51:08.540
Right.
00:51:08.540 --> 00:51:14.840
And the admonishment or the advice there was, you might read about how somebody like Google
00:51:14.840 --> 00:51:21.260
has this, all these containers doing all this scale out and failover and geo location.
00:51:21.640 --> 00:51:28.540
Your app that manages like reporting for managers at your app, at your company, there's five managers
00:51:28.540 --> 00:51:29.460
and they do it once a week.
00:51:29.460 --> 00:51:32.380
You don't need global scale out techniques.
00:51:32.380 --> 00:51:36.040
You don't need the zero downtime that containers offer.
00:51:36.240 --> 00:51:38.460
You don't need load balancers.
00:51:38.460 --> 00:51:40.220
Like none of that stuff applies to you.
00:51:40.220 --> 00:51:45.760
And so, in fact, I would say if you start applying those things to it, you make your application
00:51:45.760 --> 00:51:46.960
harder to deploy.
00:51:46.960 --> 00:51:50.620
You make it harder for other people and your team to work on.
00:51:50.620 --> 00:51:53.440
You make it less good for that situation.
00:51:53.440 --> 00:51:56.820
But at Google scale, the opposite is true.
00:51:56.820 --> 00:51:59.120
It's less good if it doesn't have those things.
00:51:59.120 --> 00:52:02.980
And so it's not just, well, this is a crappy project.
00:52:02.980 --> 00:52:05.500
So it gets crappy level CS attention.
00:52:05.840 --> 00:52:07.400
It's a small project.
00:52:07.400 --> 00:52:14.520
So it can be written and managed and worked on in a way that allows for, you know, optimizes
00:52:14.520 --> 00:52:20.360
for small teams, not worrying, not optimize it for uptime and all those kinds of things so
00:52:20.360 --> 00:52:22.840
that you can make it work better in that situation.
00:52:22.840 --> 00:52:24.500
And so I totally agree.
00:52:24.500 --> 00:52:27.420
Knowing what is good enough is super important.
00:52:27.420 --> 00:52:30.220
But what is good enough, it's not like a spectrum.
00:52:30.220 --> 00:52:31.640
Like I'm at the really good level.
00:52:31.640 --> 00:52:34.040
It's like you've got a, it's a multidimensional thing.
00:52:34.040 --> 00:52:37.820
Like you're at a good level for the context that you're in, the situation you're in.
00:52:37.820 --> 00:52:41.940
Hey, you're walking right into bullet point or tip number eight, I think it is.
00:52:41.940 --> 00:52:42.760
We are.
00:52:42.760 --> 00:52:43.220
Yeah.
00:52:43.220 --> 00:52:44.560
And that's embrace refactoring.
00:52:44.560 --> 00:52:48.340
And so my notes about this was that good enough is situational.
00:52:48.560 --> 00:52:52.780
So when a project proves its worth, like say you have an idea for a project, you build it
00:52:52.780 --> 00:52:58.680
out, you get an MVP functional and you've reached your good enough to see whether the idea works.
00:52:58.680 --> 00:53:01.740
If nobody ever uses it, it doesn't catch on.
00:53:01.740 --> 00:53:02.160
It worked.
00:53:02.160 --> 00:53:04.400
It was interesting, but it's just not catching on.
00:53:04.400 --> 00:53:06.060
You move on, move on to something else.
00:53:06.280 --> 00:53:11.100
But if that product has started to gain interest, now good enough moves.
00:53:11.100 --> 00:53:13.220
And so maybe it needs to be more efficient.
00:53:13.220 --> 00:53:14.640
Maybe it needs more testing.
00:53:14.640 --> 00:53:16.640
Maybe it needs to be deployed in a different way.
00:53:16.640 --> 00:53:22.380
And so refactoring tied in with that idea of what is good enough is the road for evolving
00:53:22.380 --> 00:53:22.940
a project.
00:53:23.060 --> 00:53:26.480
And all of these projects that we're talking about, the well-established ones, the Googles,
00:53:26.480 --> 00:53:31.240
the Fangs, those projects are constantly shifting bars of what is good enough.
00:53:31.240 --> 00:53:35.940
And they're constantly being refactored in very careful ways to reach those new goals.
00:53:35.940 --> 00:53:36.260
Yeah.
00:53:36.260 --> 00:53:37.160
I love refactoring.
00:53:37.160 --> 00:53:37.600
Your tools.
00:53:37.600 --> 00:53:38.480
Yeah, I do too.
00:53:38.480 --> 00:53:39.680
I think it's fantastic.
00:53:39.680 --> 00:53:45.380
So many people who are getting started will tell me things like, I'm not sure how to get
00:53:45.380 --> 00:53:45.720
started.
00:53:45.720 --> 00:53:47.920
I don't know what the best way to do this is.
00:53:47.920 --> 00:53:51.240
I'm thinking about it and I've tried something, but it didn't, I wasn't sure.
00:53:51.240 --> 00:53:56.200
So I went back to thinking and the best way to get started is just give it a shot.
00:53:56.200 --> 00:53:57.520
Just create something.
00:53:57.520 --> 00:54:00.720
You'll learn what of that is working and what is not ideal.
00:54:00.720 --> 00:54:04.900
And more importantly, something that's awesome about software is it's plastic, right?
00:54:04.900 --> 00:54:05.940
You can change it.
00:54:05.940 --> 00:54:07.440
Plastic in the soft plastic way.
00:54:07.440 --> 00:54:10.620
You can evolve it as you learn more about it.
00:54:10.620 --> 00:54:14.300
You're like, oh, I thought that should have been a separate module, but this should be just
00:54:14.300 --> 00:54:15.060
part of that class.
00:54:15.060 --> 00:54:20.020
So we're just going to move that in through refactoring and not feeling like you have to
00:54:20.020 --> 00:54:23.140
have a full visibility of what you're working on to get started.
00:54:23.140 --> 00:54:28.020
I think that that's, maybe it sounds counterintuitive, but I feel like that's kind of an expert perspective.
00:54:28.020 --> 00:54:29.900
It's like, I think I need to go that way.
00:54:29.900 --> 00:54:31.600
We're going to start down the path that way.
00:54:31.600 --> 00:54:37.880
And we're going to evolve and sort of course correct as we go rather than completely stressing
00:54:37.880 --> 00:54:39.240
about how do I get started?
00:54:39.240 --> 00:54:42.040
How do I see the whole end line before I start writing it?
00:54:42.040 --> 00:54:47.220
And this is part of why this is not a countdown because, for example, if you have even a small
00:54:47.220 --> 00:54:51.480
set of tests that test your final output, refactoring is easy.
00:54:51.480 --> 00:54:55.560
It's fun because if your tests break and you don't like the idea, you can go back to where
00:54:55.560 --> 00:54:55.960
you started.
00:54:55.960 --> 00:54:59.920
Another fun thing about refactoring is the whole concept of code smells.
00:54:59.920 --> 00:55:04.680
And I think becoming an expert, there's a lot to be learned from the code smells.
00:55:05.080 --> 00:55:08.660
And the idea of the code smells is the code works, but there's something a little bit
00:55:08.660 --> 00:55:08.980
off.
00:55:08.980 --> 00:55:10.200
It kind of makes your nose turn up.
00:55:10.200 --> 00:55:12.120
You're like, oh, oh, okay.
00:55:12.120 --> 00:55:14.100
Yeah, I guess it works, but oh, right.
00:55:14.100 --> 00:55:16.420
You know, it's just, it's just kind of an ooh.
00:55:16.420 --> 00:55:21.960
And that's, there's a lot of lessons of how things get out of control and they get into
00:55:21.960 --> 00:55:23.620
a bad state and how do you fix them?
00:55:23.620 --> 00:55:26.080
And having that intuition, I think is great.
00:55:26.080 --> 00:55:30.780
So some of the code smells are like long method, method with too many arguments.
00:55:30.780 --> 00:55:35.060
One, probably my favorite is code comments because you hear you should comment code
00:55:35.060 --> 00:55:38.480
all the time and there should be places that need a comment.
00:55:38.480 --> 00:55:41.900
There should be comments or help, help strings, whatever.
00:55:41.900 --> 00:55:47.940
But a lot of times code comments are deodorant for these code smells, right?
00:55:47.940 --> 00:55:50.320
It's like, oh, this is kind of gross.
00:55:50.320 --> 00:55:52.400
Let me make a comment about why it's gross.
00:55:52.400 --> 00:55:53.980
Or this is poorly named.
00:55:53.980 --> 00:55:55.420
People won't know what this is.
00:55:55.420 --> 00:55:57.500
So let me make a comment about what it is.
00:55:57.500 --> 00:56:01.720
And like halfway through that comment, you should realize like, oh, what if I just named it?
00:56:01.940 --> 00:56:04.740
The thing I'm trying to tell people, it kind of does.
00:56:04.740 --> 00:56:09.100
Then I don't even need a comment because it has a really good name that is its own thing,
00:56:09.100 --> 00:56:09.380
right?
00:56:09.380 --> 00:56:14.600
And so four names, too many parameters, all these things are deodorant.
00:56:14.600 --> 00:56:18.640
And you're trying to like justify how gross this part of your code is.
00:56:18.640 --> 00:56:22.480
Maybe you could just apply some of these refactoring techniques to make them better.
00:56:22.480 --> 00:56:26.400
Not going into a whole refactoring detail, but I really, really like this idea.
00:56:27.000 --> 00:56:29.360
Yeah, I write a lot of exploratory code.
00:56:29.360 --> 00:56:31.280
So you're describing a lot of my work.
00:56:31.280 --> 00:56:36.400
But because I'm fine with refactoring and enjoy it and I'm comfortable with tests, that workflow
00:56:36.400 --> 00:56:36.780
works.
00:56:36.780 --> 00:56:38.160
And I think it can work for a lot of people.
00:56:38.160 --> 00:56:39.160
Yeah, sure, sure.
00:56:39.160 --> 00:56:42.000
Well, and those things don't necessarily start out that way.
00:56:42.000 --> 00:56:44.500
The long method didn't necessarily start out long.
00:56:44.500 --> 00:56:47.260
Grew and grew until it was a monster.
00:56:47.260 --> 00:56:49.060
Same thing with too many arguments.
00:56:49.060 --> 00:56:52.380
It probably started out with one or two, but then now we need this other one.
00:56:52.380 --> 00:56:53.020
And what about that?
00:56:53.060 --> 00:56:55.620
And then all of a sudden it's like, again, a monster, right?
00:56:55.620 --> 00:56:57.280
And so it's an evolution.
00:56:57.280 --> 00:56:58.500
And it's long because it works.
00:56:58.500 --> 00:57:02.120
And so at some point you pause and clean it up, make sure it still works.
00:57:02.120 --> 00:57:04.380
All right, number nine, write things down.
00:57:04.380 --> 00:57:05.640
Yeah, write things down.
00:57:05.640 --> 00:57:07.320
And I don't say that as a writer.
00:57:07.320 --> 00:57:11.920
Writing for me, I started writing when I was young because I saw somebody else write a journal
00:57:11.920 --> 00:57:13.200
and I was like, oh, I'm going to try writing.
00:57:13.200 --> 00:57:17.840
And so I've just written things all my life and most of it is messy.
00:57:17.840 --> 00:57:22.400
And some of it, very small amount of what I've written has been polished and put out in the public
00:57:22.400 --> 00:57:22.740
world.
00:57:22.740 --> 00:57:28.760
But I have found that almost everybody I talked to who writes in some way, not for public,
00:57:28.760 --> 00:57:31.940
but writes in some way, enjoys their work a little more and does a little better.
00:57:31.940 --> 00:57:34.740
My suggestions are things like keep an ideas notebook.
00:57:34.740 --> 00:57:39.740
Those are once you know how to build things, ideas come to you and you're like, oh, I could
00:57:39.740 --> 00:57:40.580
make that at some point.
00:57:40.580 --> 00:57:44.420
And if you have a place to record those ideas when you're not sure what to do, you can go
00:57:44.420 --> 00:57:44.980
back to it.
00:57:44.980 --> 00:57:47.220
Write comments, despite what Michael said.
00:57:47.220 --> 00:57:53.220
Comments in a professional, well-established project with many collaborators are different
00:57:53.220 --> 00:57:55.380
than comments for your own new projects.
00:57:55.380 --> 00:57:57.760
So whatever you're doing, write comments.
00:57:57.760 --> 00:58:02.060
So do put the information in that needs to be in there to work, let them be cleaned up.
00:58:02.060 --> 00:58:04.080
Yeah, I don't mean to say you shouldn't write comments, right?
00:58:04.080 --> 00:58:09.440
I just, there's a lot of times where the point of the comment is to justify why something's
00:58:09.440 --> 00:58:09.800
bad.
00:58:09.800 --> 00:58:13.140
If that's the case, it probably doesn't need to be bad.
00:58:13.140 --> 00:58:17.360
But if it's help docs, if it's like, well, here's the different stuff that you could pass
00:58:17.360 --> 00:58:20.560
and these are what we expect, there's certainly valid comments, no doubt.
00:58:20.560 --> 00:58:22.420
So write comments to yourself and others.
00:58:22.420 --> 00:58:25.780
And even if nobody else is using your project, if it's something that might be shared at some
00:58:25.780 --> 00:58:26.760
point, those are good.
00:58:26.760 --> 00:58:28.060
Learn to write documentation.
00:58:28.060 --> 00:58:32.580
If you write an ideas notebook, if you write comments, documentation kind of flows out of
00:58:32.580 --> 00:58:32.760
that.
00:58:32.760 --> 00:58:35.200
It just becomes a more polished version of what you're writing.
00:58:35.200 --> 00:58:37.580
Write questions down when you're not sure about something.
00:58:37.580 --> 00:58:39.320
GitHub issues are amazing.
00:58:39.520 --> 00:58:44.340
I haven't used project management software because GitHub issues are so useful.
00:58:44.340 --> 00:58:46.940
And so even if you...
00:58:46.940 --> 00:58:46.940
No Gantt chart.
00:58:46.940 --> 00:58:48.080
No Microsoft project.
00:58:48.080 --> 00:58:49.260
Yeah, yeah.
00:58:49.260 --> 00:58:54.240
Even if you don't ever plan to write anything public, write about the code that you're working
00:58:54.240 --> 00:58:56.380
on and write for yourself.
00:58:56.380 --> 00:58:58.980
And it will almost certainly benefit the work that you do.
00:58:58.980 --> 00:59:03.660
Writing helps you crystallize your thoughts and make sure you have them all coherent, right?
00:59:03.840 --> 00:59:04.160
All right.
00:59:04.160 --> 00:59:04.780
All right.
00:59:04.780 --> 00:59:05.340
Last one.
00:59:05.340 --> 00:59:06.180
Big tip.
00:59:06.180 --> 00:59:07.480
And this is a fun one to close on.
00:59:07.480 --> 00:59:08.380
Go meet people.
00:59:08.380 --> 00:59:13.460
It has long been said about Python that I came for the language and stayed for the community.
00:59:13.460 --> 00:59:16.480
People have talked about that for years because it's still true.
00:59:16.480 --> 00:59:18.380
Join online communities.
00:59:18.380 --> 00:59:22.080
Go to local, regional, national, international conferences when you can.
00:59:22.080 --> 00:59:23.280
Go to coffee shops.
00:59:23.280 --> 00:59:24.180
Ask questions.
00:59:24.180 --> 00:59:24.900
Tell stories.
00:59:24.900 --> 00:59:27.380
You will meet good people like Michael.
00:59:27.900 --> 00:59:30.140
And you, yeah, as we met at PyCon.
00:59:30.140 --> 00:59:32.220
So I think this is really good advice.
00:59:32.220 --> 00:59:38.120
I was thinking as I looked at your list that you are somebody who is not particularly metropolitan
00:59:38.120 --> 00:59:42.540
in terms of like tons of user groups and meetups, I'm guessing, where you live.
00:59:42.540 --> 00:59:45.560
It's probably a little bit of an extra challenge being in Alaska, right?
00:59:45.560 --> 00:59:46.680
Yeah, it's actually...
00:59:46.680 --> 00:59:49.960
I mean, I lived in New York City for seven years before I moved here.
00:59:49.960 --> 00:59:50.180
Right.
00:59:50.180 --> 00:59:51.300
As a contrast, right?
00:59:51.300 --> 00:59:52.000
So...
00:59:52.000 --> 00:59:52.780
Yes, yes.
00:59:53.340 --> 00:59:57.800
But most of my programming work, serious programming work has been done while I've lived here.
00:59:57.800 --> 01:00:00.360
And yeah, I don't know anybody else here who programs.
01:00:00.360 --> 01:00:05.220
And so for me going to conferences, I talk about programming the entire time at conferences
01:00:05.220 --> 01:00:06.960
because I never get to in regular life.
01:00:06.960 --> 01:00:08.460
Honestly, that's true for me as well.
01:00:08.460 --> 01:00:12.880
Even though I'm here in Portland and we have user groups and there are plenty of people who
01:00:12.880 --> 01:00:15.300
do programming, it's not that different for me, right?
01:00:15.300 --> 01:00:19.480
Because I don't go to a company where I have a team of developers.
01:00:19.480 --> 01:00:24.900
Like the people I work with, it's as real as this meeting with you and me here on a video
01:00:24.900 --> 01:00:26.740
screen share sort of thing, right?
01:00:26.740 --> 01:00:32.780
And I think this is the story of more people than just if you live outside of some big metropolis.
01:00:32.780 --> 01:00:33.540
Yeah, yeah.
01:00:33.540 --> 01:00:34.380
Quick story.
01:00:34.380 --> 01:00:38.700
First time I went to PyCon, I was intimidated because I was a teacher and not a programmer.
01:00:38.700 --> 01:00:41.520
And so I thought I would not find my place.
01:00:41.520 --> 01:00:46.820
And I walked into the hotel the first night and people pulled me right into conversation.
01:00:46.820 --> 01:00:51.880
And what I found was that roughly half the people who go to PyCon are primarily programmers
01:00:51.880 --> 01:00:53.140
looking for what to work on.
01:00:53.140 --> 01:00:57.280
And roughly half the people are people who care about some other domain than programming.
01:00:57.280 --> 01:01:01.920
And they're looking to use Python and programming to solve the problems they care about in their
01:01:01.920 --> 01:01:02.240
domain.
01:01:02.240 --> 01:01:03.460
And so it's true.
01:01:03.460 --> 01:01:07.880
Everybody has a place in the Python world if you are respectful and appropriate to other
01:01:07.880 --> 01:01:08.160
people.
01:01:08.160 --> 01:01:14.340
And so if you're shy or intimidated about going out to meet people because you're not sure of
01:01:14.340 --> 01:01:17.720
your place, just go meet people and you will find your place.
01:01:17.720 --> 01:01:18.540
And it's magic.
01:01:18.540 --> 01:01:19.120
Yeah.
01:01:19.120 --> 01:01:22.640
I think I'm hopefully I'm not misremembering this.
01:01:22.640 --> 01:01:26.500
I think almost half the people at PyCon this year were first time attendees.
01:01:26.500 --> 01:01:27.580
So if you're thinking.
01:01:27.580 --> 01:01:28.320
Oh, no.
01:01:28.320 --> 01:01:29.480
It was like 78.
01:01:29.480 --> 01:01:30.600
It was over half.
01:01:30.600 --> 01:01:31.560
It was like 80%.
01:01:31.560 --> 01:01:32.300
Yeah.
01:01:32.300 --> 01:01:32.660
Yeah.
01:01:32.660 --> 01:01:33.280
I was amazed.
01:01:33.280 --> 01:01:33.680
Yeah.
01:01:33.980 --> 01:01:38.560
I'm not sure how much of that's a COVID hangover sort of thing, because not there were not
01:01:38.560 --> 01:01:42.740
as many people who came as say in 2019.
01:01:42.740 --> 01:01:47.920
So maybe they were more icon curious folks than say the people who had been there for the
01:01:47.920 --> 01:01:48.560
last 10 years.
01:01:48.560 --> 01:01:50.380
Like, I still want to skip this one.
01:01:50.380 --> 01:01:51.880
I will see where it shapes up.
01:01:51.880 --> 01:01:55.580
But there's a really high number, whatever that that number turned out to be.
01:01:55.680 --> 01:02:00.680
And the equilibrium is that there's a ton of people at these types of events who are
01:02:00.680 --> 01:02:01.820
like, this is my first time here.
01:02:01.820 --> 01:02:05.920
So if you're concerned about going to these events and feeling like, oh, I'm going to be
01:02:05.920 --> 01:02:09.500
the one newbie and feel out of place, like probably the opposite.
01:02:09.500 --> 01:02:09.820
Yeah.
01:02:09.820 --> 01:02:10.740
You know?
01:02:10.740 --> 01:02:11.220
Yeah.
01:02:11.220 --> 01:02:12.720
You end up with lifelong friends.
01:02:12.720 --> 01:02:13.320
Absolutely.
01:02:13.320 --> 01:02:14.600
People are in a great mood.
01:02:14.600 --> 01:02:15.760
They're on their geek holiday.
01:02:15.760 --> 01:02:16.780
It's all good.
01:02:16.780 --> 01:02:17.140
Yes.
01:02:17.220 --> 01:02:20.220
It's pretty easy to make friends and have a good time there.
01:02:20.220 --> 01:02:24.400
So that could be PyCon or EuroPython or something like that.
01:02:24.400 --> 01:02:25.920
Or it could just be a local.
01:02:25.920 --> 01:02:30.260
There's a lot of regional Python meetups like PyCascades here in the Pacific Northwest,
01:02:30.260 --> 01:02:33.040
PyTexas, PyOhio, all these things.
01:02:33.040 --> 01:02:35.240
And none of those work for you.
01:02:35.240 --> 01:02:37.800
You know, there's forums like this, to be honest.
01:02:37.800 --> 01:02:42.540
Like part of the reason I created the podcast was to kind of get to know people better in a
01:02:42.540 --> 01:02:45.640
way that I knew wouldn't be possible for me.
01:02:45.640 --> 01:02:45.960
Right.
01:02:46.220 --> 01:02:50.000
My goal was, where do I go find the podcast to listen to, to do this?
01:02:50.000 --> 01:02:50.800
And then there was none.
01:02:50.800 --> 01:02:51.600
I was like, all right, fine.
01:02:51.600 --> 01:02:53.120
I'll create the podcast so we can do this.
01:02:53.120 --> 01:02:57.740
But my intent was just to listen to a podcast to kind of get to know people like this.
01:02:57.740 --> 01:03:00.640
It's a pretty one-way conversation as a podcast listener.
01:03:00.640 --> 01:03:03.160
Not 100% as people have seen in the audience.
01:03:03.160 --> 01:03:09.000
But it's still valuable to like eavesdrop in a sense on these conversations if you're a new
01:03:09.000 --> 01:03:09.320
person.
01:03:09.320 --> 01:03:09.700
Right.
01:03:09.700 --> 01:03:10.340
Absolutely.
01:03:10.340 --> 01:03:11.040
Yeah.
01:03:11.040 --> 01:03:11.920
All right, Eric.
01:03:11.920 --> 01:03:13.720
Well, what a fun conversation.
01:03:13.720 --> 01:03:16.000
Thank you for the awesome list.
01:03:16.500 --> 01:03:21.800
And hopefully you've inspired a lot of people out there to, you know, make forward progress
01:03:21.800 --> 01:03:23.440
on this journey that they're on.
01:03:23.440 --> 01:03:24.320
Well, thank you for having me.
01:03:24.320 --> 01:03:28.020
I've listened to you for a long time and really enjoyed your work and very happy to connect.
01:03:28.020 --> 01:03:28.320
Yeah.
01:03:28.320 --> 01:03:28.800
Same here.
01:03:28.800 --> 01:03:30.320
So final call to action.
01:03:30.320 --> 01:03:31.440
People are interested.
01:03:31.440 --> 01:03:33.760
You know, maybe tell them how to check out your book.
01:03:33.760 --> 01:03:36.240
Tell them how to put some of these ideas into action.
01:03:36.380 --> 01:03:38.820
My book is Python Crash Course from No Starch Press.
01:03:38.820 --> 01:03:40.580
Third edition came out this year.
01:03:40.580 --> 01:03:41.760
And so everything works.
01:03:41.760 --> 01:03:42.320
It's good.
01:03:42.320 --> 01:03:43.040
I keep it updated.
01:03:43.040 --> 01:03:46.180
If you buy it, you get a copy with the newest updates.
01:03:46.180 --> 01:03:46.860
Yes.
01:03:46.860 --> 01:03:49.780
I also write weekly at MostlyPython.
01:03:49.780 --> 01:03:51.880
And that's MostlyPython.substack.
01:03:51.880 --> 01:03:54.380
There are paid subscriptions, but there are also free subscriptions.
01:03:54.840 --> 01:03:59.980
And so the only advantage for paid subscriptions is that some posts are locked for six weeks.
01:03:59.980 --> 01:04:03.120
Everything I write, I want to be available to everyone.
01:04:03.120 --> 01:04:08.400
And so if you're curious about what I'm thinking about on a weekly basis, MostlyPython.
01:04:08.400 --> 01:04:08.780
Excellent.
01:04:08.780 --> 01:04:09.440
All right.
01:04:09.440 --> 01:04:10.880
Well, thanks again for being here.
01:04:10.880 --> 01:04:11.580
See you later.
01:04:11.580 --> 01:04:12.560
Thanks everyone for listening.
01:04:12.560 --> 01:04:12.880
Yes.
01:04:12.880 --> 01:04:13.540
Thank you.
01:04:15.340 --> 01:04:17.640
This has been another episode of Talk Python To Me.
01:04:17.640 --> 01:04:19.460
Thank you to our sponsors.
01:04:19.460 --> 01:04:21.060
Be sure to check out what they're offering.
01:04:21.060 --> 01:04:22.500
It really helps support the show.
01:04:22.500 --> 01:04:28.040
GlareDB is an open source database for querying distributed and disparate data.
01:04:28.040 --> 01:04:33.920
Connect your data sources and use the Python tools you already know to ask questions and
01:04:33.920 --> 01:04:35.740
integrate data across data sources.
01:04:35.740 --> 01:04:39.020
Get started today at talkpython.fm/GlareDB.
01:04:39.020 --> 01:04:41.300
Take some stress out of your life.
01:04:41.300 --> 01:04:46.780
Get notified immediately about errors and performance issues in your web or mobile applications with
01:04:46.780 --> 01:04:47.080
Sentry.
01:04:47.080 --> 01:04:52.080
Just visit talkpython.fm/sentry and get started for free.
01:04:52.080 --> 01:04:55.680
And be sure to use the promo code talkpython, all one word.
01:04:55.680 --> 01:04:57.040
Want to level up your Python?
01:04:57.040 --> 01:05:01.100
We have one of the largest catalogs of Python video courses over at Talk Python.
01:05:01.100 --> 01:05:06.260
Our content ranges from true beginners to deeply advanced topics like memory and async.
01:05:06.260 --> 01:05:08.940
And best of all, there's not a subscription in sight.
01:05:08.940 --> 01:05:11.840
Check it out for yourself at training.talkpython.fm.
01:05:11.840 --> 01:05:13.740
Be sure to subscribe to the show.
01:05:13.740 --> 01:05:16.520
Open your favorite podcast app and search for Python.
01:05:16.520 --> 01:05:17.840
We should be right at the top.
01:05:17.840 --> 01:05:22.980
You can also find the iTunes feed at /itunes, the Google Play feed at /play,
01:05:22.980 --> 01:05:27.180
and the direct RSS feed at /rss on talkpython.fm.
01:05:27.180 --> 01:05:30.620
We're live streaming most of our recordings these days.
01:05:30.620 --> 01:05:34.040
If you want to be part of the show and have your comments featured on the air,
01:05:34.040 --> 01:05:38.460
be sure to subscribe to our YouTube channel at talkpython.fm/youtube.
01:05:38.460 --> 01:05:40.300
This is your host, Michael Kennedy.
01:05:40.300 --> 01:05:41.600
Thanks so much for listening.
01:05:41.600 --> 01:05:42.780
I really appreciate it.
01:05:42.780 --> 01:05:44.680
Now get out there and write some Python code.
01:05:44.680 --> 01:06:05.340
We'll see you next time.
01:06:05.340 --> 01:06:35.320
Thank you.