Today, we're turning tiny tips into big wins.
Khuyen Tran, creator of CodeCut.ai, has shipped hundreds of bite-sized Python and data science snippets across four years.
We dig into open source tools you can use right now, cleaner workflows, and why notebooks and scripts don't have to be enemies.
If you want faster insights with fewer yak shaves, this one's packed with takeaways you can apply before lunch.
Let's get into it.
This is Talk Python To Me, Episode 522, recorded September 4th, 2025.
Welcome to Talk Python To Me, the number one podcast for Python developers and data scientists.
This is your host, Michael Kennedy.
I'm a PSF fellow who's been coding for over 25 years.
Let's connect on social media.
You'll find me and Talk Python on Mastodon, Bluesky, and X.
The social links are all in the show notes.
You can find over 10 years of past episodes at talkpython.fm.
And if you want to be part of the show, you can join our recording live streams.
That's right.
We live stream the raw, uncut version of each episode on YouTube.
Just visit talkpython.fm/youtube to see the schedule of upcoming events.
And be sure to subscribe and press the bell so you'll get notified anytime we're recording.
This episode is brought to you by Sentry.
Don't let those errors go unnoticed.
Use Sentry like we do here at Talk Python.
Sign up at talkpython.fm/sentry.
And it's brought to you by Agency.
Discover agentic AI with Agency.
Their layer lets agents find, connect, and work together.
Any stack, anywhere.
Start building the Internet of Agents at talkpython.fm/agency spelled A-G-N-T-C-Y.
I'm super excited to tell you that I just released my first solo book.
It's called Talk Python in Production.
It's the inside look at how we host all the Talk Python sites, APIs, and more.
The core idea is that I believe most hosting stories sold to developers and data scientists are way overcomplicated and overpriced.
You've heard me say that you're not Google and you're not Facebook, so you shouldn't run your infrastructure the way they do.
But if not that, then what?
This book is both a blueprint for what I chose at Talk Python and a story arc of 10 years of running our own infrastructure from complete newbie to pretty neat infrastructure as code DevOps style.
You'll find the book right on talkpython.fm.
Just click book in the nav bar.
I've made the first third of the book available for free for everyone to read online.
After that, you can grab the DRM-free EPUB and Kindle editions from that same page.
I hope this book resonates with you.
People have asked me to share the details of how I run our sites at Talk Python, and now here it is in detail.
If you're interested, grab the ebook at talkpython.fm.
Today, I'm working on the paperback version as well.
It should be out soon.
Getting the book is a great way to support the podcast.
Khuyen, welcome to Talk Python.
Great to have you here.
Happy to be here.
Yes, I'm happy to have you here. It's going to be a super fun data science topic. You've got a really cool project over at CodeCut.ai. And one of our listeners reached out and said, you have Khuyen on because she's doing amazing stuff over at CodeCut.ai. And I'm really getting a lot of value out of it. And I'd love to hear more about this project and maybe dive into some of the topics there.
So we're going to have a really great time talking about that.
But before we get to those, really quick introduction for everyone.
Who are you?
Yeah.
Hi, everybody.
I'm Quynh Truong.
I'm a developer advocate at Nixler.
I am also the founder of CodeCut, where I share daily tips on both LinkedIn and my news through my newsletter.
and I send out short tips which have about data science and Python in the form of code snippets that is very easy to digest in two minutes or three times a week.
Three times a week.
Yeah.
That's a lot.
Yes, it's a lot of work, but I have been doing it for four years, I think.
So I have been writing tips,
writing Python snippets for like basically every day of the week on the weekday for four years.
Yeah, very fun.
And you also have longer form articles there.
Yes, that is correct.
I also enjoy writing long form articles that dive deeper into open source.
So majority of the time, like 95% of the time, I write about open source, Python, data science, so very specific.
And I like to really explore how, you know, what should data scientists use this tool and how they use it.
And my assumption for every article is data scientists are very busy.
And if they only have five minutes to read this article, they will be able to get some takeaway from this tool and be able to apply right away.
So you will see that as a common theme for snippets, micro snippets, as for a newsletter, like very short, very easy to digest.
As well as article, even though it's long form, but also very, like if they want to, they can skim it, get something out of it.
Or if they really want to like die deeper, you can sit down and like call along and most will work for getting out of it.
Yeah, I agree.
I read a bunch of your articles and I think you can certainly get it a lot even if you just have only time to skim them.
I learned a couple of extra new tools.
I think that we're going to have a lot of fun to talk about as well.
So how do people get your code snippets?
Is that through your newsletter or how you do that?
Yeah, people get my code snippets through my newsletter.
And if you go to the front page, see if you find how it looks like.
Yes, that's how it looks.
So just for the audience who's listening, so the form of my newsletter is I would, so I would extract like some specific feature out of the tool, right?
because if the one tool can have many features and you don't want to talk about all the features in one code snippet, it will be really difficult to digest.
So I pick one feature.
I compare it with something that people already know.
For example, in the screen we see we are comparing between a regular expression, REC-X, library, and DFLIP.
And we try, I want to compare something people already know, something that is less than all to highlight, okay we see the typical problem with the tool that people all know and here's a solution and this tool offers the solution and so that's true code snippet my my philosophy when it comes to teaching people is it's better to show than to tell so i put a lot of effort into making it very easy for people to when they look at the code snippet they can understand but of course there's supported text. So if you scroll down a bit more, you can see the format.
Yeah, we see the problem solutions. The problem is, I'll just read it out loud here.
RegEx pre-processing achieves exact matching but fails completely on typos like iPhone 14 Pro with like two double R max. Dolution diffused provides similarity scoring that tolerates typos and and character variations, enabling approximate matching where red X pairs.
And they can view the full article if you want.
But it needs to be digested within the newsletter.
Yeah, I think you could probably read that and get a good bit of information out of that in like one minute.
That's really nice.
And the idea you're highlighting here is like, sure, you can search if you're doing data science, text, NLP type of stuff.
If you search with regular expressions, you might find things.
But what if the spacing is different between them or somebody puts a comma or they put iPhone 14 without a space between the 14 and the iPhone, right?
Like all those things are really tricky to catch every variation.
So there's better tools like DiffLib, which we'll probably talk about again later in an article, right?
And in the article, I highlight a lot more tools.
So it's from like Red X to DiffLib.
And then if you want to like even better, then fuzzy matching, right?
And then if even you want semantic capture, and that's another tool.
And then, of course, you can go down all the spaCy route and into LLMs and like the whole spectrum, right?
But just knowing about this, because sometimes you don't want full machine learning.
You just want kind of like regular expressions,
but not so hard.
That's correct.
Like something that gets the job done.
To me, the iNew tool is something that is like works right out of the box without a lot of boilerplate code and not too many dependencies.
Yeah, that's really, really important. So let's talk about the origins of CodeCut.ai.
Why did you start it?
So I started when I was in college, so four years. So I started to, I didn't start the website. So I start sharing my tips first i started on linkedin right so i make a commitment to myself that i'm gonna so i i initially i write a lot of articles and i i push out through two to three articles on towards data science every week and i i make the commitment i'm gonna do that every week and then i um i was not very active on linkedin and then i read a book called share your book and it say how know that how messy your work is you should just share and i was very into open source tools and i often you know just send a message to my friends say hey like check this out this is so cool uh and i was like what if i could share with more people so i started to you know put out some of the things that i excited about on linkedin and initially i was so afraid we were like what are talking about you don't know what you're talking about yeah but uh people also very excited about it and i i was like oh great like i shared something i'm excited about and i didn't have some other people and everybody excited about the tour i love that so i keep doing it initially i do it like every day so seven days per week share every day later i was okay i'll be myself the weekend off um but i started to do i think over 500 tips and then people was like where can i find the old one, right? Because if you want to, let's say, if you are interested in machine learning tools or data processing tools, how do you find it on LinkedIn? There's no way for you to categorize.
So I started to go back to most of my, it's, it's, there's so many. So I try as many as I can, put it into a website. So it was at the time I just find like some domain, it's called mass data simplified and then I just put a bunch there and then I sent out some newsletter so very very not Polish at all and but I just want to have a place to capture it and then later I figured out that people was a lot of time people do have typo when they type because it's very long um URL so I try to make it something very short and actually capture what I
we do in cold cut so it become cold cut yeah i like the aesthetic of it it looks nice it's got
this these soft warm colors thank you yeah i try to um you know keep everything kind of like a
cotton candy so like blue and pink yeah it does yeah cotton candy definitely comes through i can see that for sure what platform did you use to build it i use wordpress uh but i so for articles
I'm creating a workflow where basically I write all my articles in Quarto, like DocQS.
Yeah, yeah, yeah.
I realized that, so I write and also run my code in Quarto.
And then I use a WordPress API to push it to my article in blog.
So I do a lot.
It's easier than, I don't use a WordPress editor to create the article.
I use VS Code through QMD.
But for the aesthetic, why I like progress because I can drag and drop.
I'm not a front-end developer, but it works for me.
Yeah.
You know, it's interesting.
I think a lot of people who are developers get hung up feeling like they have to create their website in the same language or technology that they're an expert in.
If you're a Python developer, you're like, well, how do I create a website in Python for my blog or whatever language, right?
But I think there's a lot of value in just saying, it's just a tool, I'm just gonna pick it and it's gonna be great.
Like for example, I had for a long time, I had my stuff in WordPress under my own domain for my blog and other things.
And I finally decided to move on to Hugo, but Hugo is also not Go, it's not Python, it's Go.
And it's just build static sites.
And I think it's really, it's good if you know the technology, but it's certainly not something I think people should get overly.
No.
Hung up on because you lose out on good tools that way, right?
Yeah, exactly.
And I mean, you can learn, like, you can learn any language, right?
If you know one language, you can learn, you're kind of guessing another, especially now with AI.
Yeah, that's such an interesting topic.
I do think that's actually really changed a lot of things.
It's like, well, I could work with this, but I know I'll get stuck on something.
And now you can just ask an agentic AI, like, I'm stuck on this.
Okay, here you go.
And even if it's not perfect, it really, really helps handle, juggle different types of technology.
Yes, exactly.
Yeah, super cool.
So tell me more about this Quarto thing.
I didn't intend to talk about this, but I find it really interesting.
Do you write in Markdown?
Do you write in HTML?
What do you write in and then publish?
Yeah, okay.
So I write in Quarto.
It is in Markdown, right?
So somebody knows it's in Markdown, but it's basically really similar to.md.
The only difference is you can execute the code.
So my really favorite stack is in VS Code.
I have Quanto on the left side, and then I open a doc.qmd file.
People can just imagine it's like a doc.md file.
But you can click the button, and you can execute.
So it's very similar to a notebook, right?
But I like it.
I really enjoy running in Markdown.
And it's just like a very clean, right?
Compared to a notebook.
It's a big QMD.
You can think of like a Markdown notebook.
Just Markdown.
And you can execute the code.
And then after I have the image, I have the code, everything.
I will create some Python functions to clean it up a bit.
For example, if there's some cell that I wrote, I don't want to show it on WordPress, on my website, I will say echo is false, right?
It's just like a comment, Python comment on the top of the cell, as you will not show in the website, which is great.
And then I can just run publish to WordPress and it's publish to WordPress.
What is nice about it is let's say later some of the content is I want to change.
Let's say in three articles, I mentioned something, like a link to something, but now it's broken.
So what I can do is I can just like, you know, click search by all the instances of it, update it.
And then I run the function sync to WordPress and then it will sync.
And hey, I don't need to manually go through each of it.
Yeah, that's really nice.
And it'll just fix all the articles that needed to be changed.
Yeah.
Okay.
This portion of Talk Python To Me is brought to you by Sentry.
Over at Talk Python, Sentry has been incredibly valuable for tracking down errors in our web apps, our mobile apps, and other code that we run.
I've told you the story how more than once I've learned that a user was encountering a bug through Sentry and then fixed the bug and let them know it was fixed before they contacted me.
That's pretty incredible.
Let me walk you through the few simple steps that you need to add error monitoring and distributed tracing to your Python web app.
Let's imagine we have a Flask app with a React front end, and we want to make sure there are no errors during the checkout process for some e-commerce page.
I don't know about you, but anytime money and payments are involved, I always get a little nervous writing code.
We start by simply instrumenting the checkout flow.
To do that, you enable distributed tracing and error monitoring in both your Flask backend and your React frontend.
Next, we want to make sure that you have enough context that the front-end and back-end actions can be correlated into a single request.
So we enrich a Sentry span with data context.
In your React checkout.jsx, you'd wrap the submit handler in a Sentry start span call.
Then it's time to see the request live in a dashboard.
We build a real-time Sentry dashboard.
You spin up one using span metrics to track key attributes like cart size, checkout duration, and so on, giving you one pain for both performance and error data.
That's it.
When an error happens, you open the error on Sentry and you get end-to-end request data and error tracebacks to easily spot what's going on.
If your app and customers matter to you, you definitely want to set up Sentry like we have here at Talk Python.
Visit talkpython.fm/sentry and use the code TALKPYTHON, all caps, just one word.
That's talkpython.fm/sentry, code TALKPYTHON.
Thank you to Sentry for supporting the show.
Notebooks are awesome.
And the idea of notebooks are, you know, they really changed the game, I think, a lot.
But you don't necessarily want to see all of that when your goal is mostly writing, right?
Like you don't necessarily need to see all the import statements if you're only going to focus on one cell worth of code.
It's not about the import, right?
Right.
Especially when my goal is to make it as easy as possible for data scientist to scheme.
And, you know, when you skip, you're on block of code, you're like, okay, I skip, I'm done.
Like, I'll read this the next time.
But my goal is always raise small code snippet and highlight the core features of the tool.
And a lot of time, like, you need to hide the unnecessary code, right, you know, for that to happen.
Yeah, yeah, I totally agree.
People can get hung up on completeness, and it really takes away from the essence of just, like, skimming it.
And also, I think that this workflow, it sounds like this is one of the things that made it possible for you to do this frequently, like three, four times a week instead of getting overwhelmed, right?
Yeah, I really need to learn so many tricks in order to, I guess it's a good thing, right?
It pushed me to be more productive.
Like I learned a bunch of shortcuts because, you know, without shortcuts, I cannot get things done quickly.
So I know a lot of VSCO shortcuts.
And like I use a text expansion tool.
It's called Expansal.
And it's game changer.
I can like, you know, like view the code.
This article, right?
If you can just colon, doc, something, something, like two words.
And then it's expand the whole text.
And then you can fill in the blank.
Yeah, I need to learn multiple tricks.
And also like just automate things is how I can get it out.
But yeah, what I still find is, so by doing that, right, I can actually focus on the essence of the blog, which is to make it as easy as possible to digest as well as researching, which is very important.
Yeah, absolutely.
I love your philosophy here.
I can see why the site is popular.
And, you know, the show your work, I think that's a great philosophy as well.
It's like get it out there even if it's messy and get it out there even if it's incomplete, right?
That's the idea?
Yes, exactly.
And I really do recommend it for especially people who try to find a job, right?
At the time, I kind of like another side effect of it is you show people what you know.
Because so many people, they know a lot, but they don't share, right?
And if you let employers to find you by guessing what you know or look at your resume, it's very hard because now with AI, everybody has very polished, very nice resume.
So why should they choose you over another person?
But by showing your work, by showing even the messy one, they will be able to see, okay, this is what they're interested in.
This is what makes them excited about.
And this is what they know.
then they will be able to imagine how they can use you in their company.
And that's how, because of me sharing my articles, as well as LinkedIn posts early on in when I was in college, I was able to get multiple internships in data science.
Yeah, super neat.
And, you know, you're in developer relations, and I think there's a strong communication aspect of that as well.
And this is just another example of like, yeah, you want to hire me for this thing, I'm already doing it, right?
Like one of my first important jobs I got, I was doing a lot of speaking at user groups and meetups.
They weren't called meetups then because meetup.com didn't exist, but you know, they were meetups and I got a message from a company and they said, Hey, we saw you're talking to this place and that place and you're doing that for free.
We'd pay you if you want to do this for a job.
I'm like, great.
Where do I sign up?
I didn't even have to apply.
They just reached out to me and the timing was perfect because I had quit my longtime job a week before and I'm like okay well I was about to start looking for a new job but I guess
wow you're so brave you look for a new job after you quit your job that's very brave when you like intended to take a break or something no I was not as brave as it
sounded I am my wife got her PhD and finished and she was getting her first professor job on the other side of the country and so I was like well I'll wait till we get there and look for a job because it was San Diego to New Jersey level of travel.
It was far, right?
So I figured I'll find something there.
I see.
And then you got a new job.
Yeah, yeah.
I think I'd quit my job, but I was still working for a month because I knew I was going to be moving in a while.
And so like, okay, guys, I'm leaving in a month, six weeks or whatever.
And about that time, people reached out.
So it was a perfect, perfect deal.
I see.
But just like you said, it's because of the stuff I was doing out in public, right?
Right.
Yeah.
Yeah. Okay. So let's dive in. Let's dive into CodeCut here. And the idea I thought is maybe we could just go through a handful of articles. We picked 10. I don't know how much time we have to go through all of them. We probably can get through all of them, but I think this will give people an idea of what they can get from CodeCut. But also I just think there's a bunch of interesting data science ideas and tools. Yeah. Kind of like that diff lib that we talked about. So I think it'll be a good blend of that type of stuff to talk about. So let's start with an article called Goodbye pip and Poetry, Why uv Might Be All That You Need. So tell us about this and then we can dive
in a bit. Yeah, so I think a lot of people have heard of uv, which is like dependency management tool. But let me, for people who don't know about it, just kind of give some quick reason why uv is might be something that you want to look into so a lot of data scientists know conda and no peep right i think poultry is a little bit less common um but uh for a while poultry is like a modern tool that allows you to do is manage so many things right like um dependency management and virtual environment and you can um it handle anyway so there's a lot of things in poultry but uv is but something that i didn't like about poultry is it's pretty slow for dependency management but when it comes to uv is quick every like it replaces many things and even if you are using you don't want to learn new tool basically you can just use uv pip install something something and you have a speed boost um and it's yeah so i i grow entire article about uv and i also compared with the existing tools to give people some motivation on switching it to uv.
It's so easy to switch, so why not?
Yeah, I think I am a huge fan of uv.
I actually just interviewed Charlie Marsh for his next project, pyx.
Oh, nice.
Two days ago, yeah.
So uv is going to get even better.
I just pulled up the performance story for uv compared to poetry and Pipsync.
And yeah, it's, what is that?
20 times faster than poetry and way faster than everything else.
Insane.
Yeah.
Rust because of the rust.
I think rust.
And then also they just rethought the caching and other.
They just, it's rust plus a bunch of new ideas that came together to make it work really, really well.
And honestly, I feel a little bit, I feel a little bit bad for the other tools.
Like I'm a big fan of pip-tools and PipX.
Me too.
And, you know, those things are really great.
And we'll come back and talk about them a bit, I think, as well.
But I think those tools laid the foundation for what uv is doing.
And uv sort of naturally brought these together.
But whenever I think of the contributors and maintainers of those projects, I feel a little bit bad because they're not getting as much love as they used to.
But they're still great.
But uv is definitely making a splash.
Yeah, that's a good way to think about it.
I get excited about new tools very quickly.
I don't often think about how the maintainers of the old data tools are less popular think.
Yeah, it's the natural way of things, I think, but it's also tough.
So the speed is important.
One thing I think is interesting, while I think this is especially interesting for data science, and you touched on this already, is I come more from the web API side of Python, I would say.
And over there, it's been pip all day long.
It's been pip the whole time.
But in the data science side, it's really largely been Conda, Anaconda distributions, that kind of thing, Conda environments.
There's been kind of this separation.
And obviously, those are all pulling from the same projects.
They're all on GitHub and so on.
But there has been a little bit of a difference.
And I feel like uv has made a really big splash in data science and kind of bringing those two worlds back together.
What do you think?
Yeah, I agree.
I actually have an article a long time ago.
I think it's probably in cold court still.
It's called Peep vs. Conduct vs. Coalty.
So basically, I was trying to give a very fair comparison.
I was in favor of Coalty.
But, you know, I compared everything.
And something that I had, to be honest, I was not a fan of Conduct.
And after the comparison, I was not even more of a fan of Conduct because I felt like it's very heavy.
You can use, I think, Miniconda, so it's quicker.
But at the same time, it installs many dependencies that you didn't ask for.
So it's kind of like a solution where you have a lot of dependencies out of the box, right?
But I find that a lot of times, you didn't ask for some dependencies installed, so you don't really have control over what's being installed as well as the way that it solves dependencies or not.
I find it's very slow.
But with, so, so poultry was better because, you know, it's cleaner.
You can see like what you put in.
You can see like everything in a file.
Like there's a separate file, right?
One for, one is what, piproject.com and one is a log.
You want to see all the sub-dependencies.
And now uv is, to me, it's like that.
But to like poultry, but better.
the fact that it can run very fast. So one drawback of poetry was sometimes it's think very hard about and take a long time to solve, install new dependencies.
And also, you replace X, you know, like it kind of like an all-in-one-place tool, which is, I think, very necessary, especially for, I mean, for everybody who use Python, but For data scientists, you know, they already have so many things going on and tell them to learn, you know, good practices.
You know, let's say they want to upgrade, right, from Python 3.5 to 3.6 to 3.7 to, you know, use other tools to do it.
It seems like a lot.
If you can just use one tool and then you can run it, like upgrading in one command line, then we're not.
Yeah, 100%.
I think it's great.
it has a lot of compatibility with previous workflows.
For example, you can use uv pip install instead of using its project management thing, like with add and sync, right?
So you don't necessarily have to adopt its style.
You can just say, instead of pip install, you can say uv pip install.
One of the things that used to bother me, and I honestly just haven't looked for a while, about Ponda was coming from a non-data science side.
some of the libraries, say, like requests or Flask or something like that.
Yeah.
Pyramid.
Those were held back quite a bit because, you know, they try to make sure there's like a compatibility
between the versions that they ship through Condit,
which is, I think that's good for like data science or reproducibility.
But when it comes to web frameworks, you've got to be super on top of updates in case there's a security vulnerability.
You know, you want to release that thing, the day the vulnerability is announced.
You want to upgrade your website because as soon as it's announced, people start scanning the internet for any website that could possibly be susceptible to that problem, right?
And so like the web tools were held back a lot.
So that's one of the reasons I never really embraced Conda.
Yeah, now that you mentioned it, another, I also found it as one thing I didn't like about Conda is, you know, like there's, let's say data science is like Pandas, right?
If this Pandas version is available, a lot of time, sometimes it's not available in Condor.
That's one thing.
But another thing is data scientists, they collaborate with other engineers.
So as someone, they need to hand over to the engineers, like machine learning engineers, data engineers, to use their code.
And I think in my previous company, they didn't use Condor.
So for them to need to install Condor, there's a way for you from Condor to peep.
But then the dependencies look very messy, and it's not like a one-to-one translation.
Sometimes you don't get the same environment.
Sure, interesting.
Not the trouble for handing over, right?
And reproducible is a big thing when it comes to data science, and dependencies play a big part of it.
So if you make it hard to reproduce the dependencies, then there will be some bugs.
there will be some errors and even work silent errors.
This portion of Talk Python To Me is brought to you by Agency.
Build the future of multi-agent software with Agency spelled A-G-N-T-C-Y.
Now an open source Linux foundation project, Agency is building the internet of agents.
Think of it as a collaboration layer where AI agents can discover, connect, and work across any framework.
Here's what that means for developers.
The core pieces engineers need to deploy multi-agent systems now belong to everyone who builds on agency.
You get robust identity and access management, so every agent is authenticated and trusted before it interacts.
You get open, standardized tools for agent discovery, clean protocols for agent-to-agent communication, and modular components that let you compose scalable workflows instead of wiring up brittle glue code.
Agency is not a walled garden.
You'll be contributing alongside developers from Cisco, Dell Technologies, Google Cloud, Oracle, Red Hat, and more than 75 supporting companies.
The goal is simple.
Build the next generation of AI infrastructure together in the open so agents can cooperate across tools, vendors, and runtimes.
Agencies dropping code, specs, and services with no strings attached.
Sound awesome?
Well, visit talkpython.fm/agency to contribute.
That's talkpython.fm/A-G-N-T-C-Y.
The link is in your podcast player's show notes and on the episode page.
Thank you, as always, to Agency for supporting Talk Python To Me.
Next article, let's talk about, I think this is a big one, reproducibility, maintainability, that kind of thing.
I mean, what you talked about there was kind of a good lead into it, right?
It's like the production engineers need to make sure that what they're running runs the same as what the data scientists have tested and come up with.
And if the situation is different, right, the runtime environment is different, well, maybe it's going to give different answers because of different versions or something.
Yeah, exactly. And dependency is a big thing, but there's also other things that come into it, right?
And we can talk about it too.
Yeah, so what are some of the core ideas of reproducibility?
Yeah, so reproducibility, I think, is, and at the heart of reproducibility is you want to, let's say, especially for data scientists, when they create code, right, create machine learning models, it depends on some, there's a lot when it packages dependencies, but also like depends on parameters that you use.
and like, you know, even you use everything the same from experiment to experiment, it can produce slightly different accuracy.
So you want to be able to, let's say one data scientist say, I got a 0.9 accuracy.
Then they give it, head it over to their teammate to deploy.
And then it's degrading the performance.
It's no longer have a 0.9 accuracy.
It probably can be, you know, without 0.8.
And so reproducibility is very important in terms of, you know, you want people, if you produce some result, you want other people to be able to reproduce the same results so that your company can profit out of it.
But another thing is choice, right? Let's say if you data center, you create something that is good, but then you hand it over and it's bad, then it reduces the choice from your co-workers.
The third thing about it is, let's say if data scientists create some project and then later they want to reuse it, right? Like for another project, they cannot reproduce the same results.
then it's kind of like throw it away, creating everything from scratch.
So it also time consuming.
And another big theme after producing, I think go hand in hand is maintainability.
But yeah, you can go ahead.
Yeah, no, I totally agree.
The maintainability part is super important as well.
And so what are some of the pieces that go into that?
I mean, the first thing that comes to mind for me is pinning your dependencies, either through using something like uv init, uv add, uv sync, or just a requirements.txt file or pinning your requirements, you know, through some other means like with poetry, but somehow clearly documenting what's used.
I think it can be easy for data scientists to just import some things in a notebook and then do a magic, well, uv pip install that right here and let's just keep going.
But then like, why won't it run later, you know?
Yeah, are you talking about maintainability or reproducibility?
Well, I was thinking maintainability, but both, yeah.
So maintainability, another thing is, another aspect that comes into maintainability is readability, right?
And I think this is a big thing for data scientists.
A lot of data scientists don't write readable code and modular code.
what you will see is like a big chunk of code with like nested if else or using global variables inside a function or not using function at all and there's a lot of duplicate in the code and I mean that is great for quick experimentation like you want to get something out of it but at the same time it's create a lot of technical debt in terms of this multiple thing that leads to not readable, right? So read and I can go deeper. I just want to list it out. Readability and then reproducibility. And readability, you want your code to be readable because data scientists collaborate with other engineers. And if your code and also another problem I saw is data scientists, they cannot read their old code in like a couple of months. They forgot. They won't be right. They're really like, what did I write? And they spend quite bit of time to understand what they write and if they cannot understand or they don't trust it right if you don't understand in a full level you cannot trust it and you cannot use the next project a lot of times they write things from scratch again so readability also if your code is not written well readability and reproducibility you cannot it's harder to reproduce the same result because let's say global variables, you use global variables and it affects your code, then it's hard.
You might introduce some external factors that make the code different the next time you run.
So, management really is very important
and that comes with, sorry, write readable code, version control, dependencies management, configuration management, meaning you don't want a hard code the values into your code.
Yeah, this is a really great article here because it shows you so many tools and techniques, I think.
Yeah, thank you.
And I also,
so writing a maintainable data science project has been my passion for a long period of time.
And it actually has become a book like this.
This is the article form, but I also recently wrote a book about this, finished a book about this.
It's called Production Ready Data Science.
Yeah, congratulations.
That's amazing.
When did you finish it?
When did you publish it?
Two months ago, I think.
Okay.
So really recently, yeah.
Very recently.
It took me quite a while.
I have other materials because I've been writing about this.
I have so many materials who put it together and also make it less in an article style.
Explaining more of the why before the how is also what I focus a lot on this book.
Yeah, that's a super important part.
Now, I am a huge fan of thinking a lot about readability and spending a lot of time on readability.
And I agree with you.
I think we're on the same page for sure on that one.
Because if your code is not readable, that doesn't mean it can't be read.
It just means it's harder to read, right?
If your code is not readable, it's harder to maintain it.
It's harder to see the bugs.
It's harder to read.
All the things that you've pointed out.
And I think it's a little bit ironic that the notebook style of development
that is meant to communicate.
Like it's supposed to be more communication compared to regular programming, right?
It's got the markdown cells, it's got the pictures, it's got little tables for like df.head, that kind of stuff, right?
It's natural way of programming it leads to less maintainable reusable code, right?
Because it does not encourage functions.
So like it's really hard to do reuse
if you don't think, oh, maybe I need to write a function in this cell, collapse the cell and then use the function later, right?
That happens, but not very much.
I was doing some research for, or just looking around, really.
Research is a little bit high, putting it in a high position compared to what it was.
I was looking around for some examples, and I found this really cool JPL collection of notebooks for studying, I think, galaxies, like studying the brightness of galaxies and trying to understand things about them.
They had a bunch of cool notebooks in there, and they were like 1,500 lines of code.
and stuff in there. One function. One. I'm like, oh, that is probably, I mean, maybe this is necessary, but it's probably not necessary. And this is JPL, right? This is like a polished published thing, not just a random notebook I ran across, right? The Jet Propulsion Laboratory
in Pasadena, which is, I consider them to be pretty amazing. So maybe speak to a little bit
about that, like this maintainability thing in juxtaposition with like notebook style.
Yeah, definitely. That's the thing. I think five years ago, I wrote an article that got very popular, but also a lot of controversy. It's called, I think, something about seven reasons why I switched from notebook to Python script or something.
So anyway, so the thing about Notebook is a lot of people argue, yeah, you can write functions.
It's just Python, right?
You can write functions.
You can write whatever you want, just like a Python script.
But the interactive style of it kind of discourages you from doing it.
Like, why should I write a function when I can just see the result and then I build upon it?
Because in Notable, what is so great about it is you can see the results and then you can build up upon it in the next cell, next cell, next cell.
So people are less likely to build a function, which like if you create a function, then like it's hide inside a function.
It's not execute the code.
So that's one thing.
Another thing problematic about Notable is it's encouraged hard coding.
You know, like a lot of time, because if you want to see the result, you want to put your value in there to see the result.
another thing is a very big problem is self execution right if you execute self the fact that it gives you the ability to execute in different
orders is nice but
also a disadvantage in a way that if you run it in the wrong order then it will like you get like some can get some result right now that is different from result that you want to run
right if you forget to run a particular cell, you go back up, run that to refresh it, and then you skip back down.
Something in the middle was important and you don't rerun it. That's probably not good.
Yeah, exactly. And that's, I remember when I worked in notebook before, it just gave me a headache because I would run something. I said, oh, did I rerun this? Like, did I run that score or did I not?
Just to make sure I'll rerun it. So it's something, and then later when I come back to notebook, I was like, I'm not going to reuse this notebook again because I don't know what's going on here.
Yeah.
I don't want people to think that I'm completely anti-notebook.
I'm not.
But I do think that there are some techniques and some tips that you can use.
So when I was riffing on functions, one thing I think you could do, and you touched on it as well, is you could take the parts of your code that you want to reuse and put that in a Python script next to your notebook and import it, right?
And then you can use it.
A lot of times, I think there's a bunch of cells in notebooks that don't really have to do with the presentation or the important part.
They're just there like, well, I need to load this thing or I need to like clean up that or something.
And it has to go before what you actually want to show people.
You could put that in a script
and you could just import it
and then show the important part.
It's more readable, more reusable.
It's more modular.
Like in all ways, almost, it's better.
Yes, I agree.
The thing about, yeah, Sam, like notebook is great.
It's very good for presentation.
But I think the problem is a lot of time people use it more than what it's supposed to design for, which is, I mean, it's prototype, right?
It's to showcase something, to showcase it with either non-technical or technical people.
It's not used for like everything.
And I think that's a problem.
Like a lot of data scientists use it for everything, including writing production, writing code.
And again, that's another argument, right?
Like, can you shoot your production-ready code in notebooks?
And Netflix did that.
Netflix created production-ready code in notebooks, and that's great.
Paper mill and all that stuff, yeah.
Yeah, that technology allows you to do it.
I feel like it's still...
But then Temtem, it's a tool that if you use the right, then it will serve you.
Yeah, it's interesting.
Speaking of tools, I know you've talked a little bit about Marimo.
What do you think about that?
I think this is a really interesting one.
I just did a sort of, I did a course called Just Enough Python and it's software engineering for data scientists.
Nice.
And I was trying, thanks.
Yeah, and it's like, okay, a lot of themes that you talk about as well, like you should probably learn Git, you know, and so on.
But one of the things I really struggled with was I really wanted to use Marimo as the foundation, but, you know, 90% or more data scientists use Jupyter.
So I ended up using Jupyter, But I think Marimo actually might be a little bit better in terms of software engineering and a little bit better in terms of this order of operations you talked about.
Because Marimo tracks like, hey, this cell depends upon that cell.
So if you rerun this one, we've got to rerun that one first.
It'll catch those kind of things.
But you want to maybe talk about this real quick?
Because I know you wrote about it a little bit.
Yeah, I really like Marimo.
I think it's great.
It has been.
So I was actually in the middle of writing the book.
Right.
And I know that people, data scientists love Notebook and I don't want it to be like, Hey, let's just write Python script.
But at the same time, I really think that Notebook is really hard to write production radical.
And that's, you know, my book is about production radical.
So how do you find the middle ground between, you know, an interactive version of Notebook and production radical?
So Marimor came out and I dig deep into it.
It solved a lot of problems.
And first is a self-execution order, right?
So the problem in Notebook is, let's say you cell 1, cell 2, cell 3.
You change something in cell 1, for example.
You all run it, but then you change something in cell 1.
If you forgot to rerun cell 3, then the result is not going to reflect what you have changed in cell 1.
But with Marimor, it can detect the dependencies.
And if you change cell 1 and cell 3 depend on cell 1, depend on the variable in cell 1, then it will execute it automatically, which is great.
Another big thing is, you know, notebook, not disadvantage, notebook is JavaScript, right?
So it's very big, unreadable, hard to, if you want to use it or hand it over, reuse it.
It's really hard.
Right. It's so common to get a Git conflict when you try to pull a new version just because the output has changed.
And that shouldn't even be taken into account, right?
And yeah, that shouldn't be taken into account.
And also the output can be big.
But with Marimode, not only just a Python script under the hood.
So you have the...
And what great thing about Python script is you can reuse it.
You can import it in another Python script.
but also for CI/CD, right?
And you can write unit tests.
You know, like with unit tests are important, but with in Notebook, you can write unit tests.
There's a hacker out, but it's a hack.
And sometimes people need to put their tests inside Notebook, which is not modular, right?
It's not, it's make it very messy with code and then tests inside the same place.
But if you write notebook that is Python script under the hood, then you can write unit tests and you can run it with pytest.
Yeah, very cool.
I think this is a neat one.
I generally wanted to use it, but I'm like, but at the same time, I probably got to speak the same language of the people doing that.
Exactly.
Yeah, yeah.
Another thing I want to talk about here, actually this maintainability article has just got so much good stuff in it.
Something I think that might be new to folks is Hydra, right?
Let's talk about this idea of managing configuration files with Hydra.
Yeah, I love Hydra.
So Hydra is developed by Facebook Research, and I think I use it.
It has been my two goals.
So I have some core tools.
I go back for every data science project, and Hydra is one of them.
I guess if you think about Hydra is a configuration management tool, you can write your configuration inside a YAML file, and then you can call things.
You can access the variables inside the YAML file inside a Python script.
That is nothing new.
People know about there's a YAML muting library in Python that allows you to work with YAML.
But something I like about HIDL a lot is reduce the boilerplate code.
So you can just add an app like a decorator to your Python function.
And then it will be able to access everything underneath inside the Python function.
And instead of using a bracket notation, like for example, if to access a nested value, you might need to use mutual nested function.
But instead, you can use dot notation, which is very clean.
Other things are, oh, you can, as your project getting bigger, right?
I mean, for a small project, maybe a YAML is enough.
As your project getting bigger, let's say you have, you want to be able to use, especially in like data science experimentation, you want to use different values.
You want to experiment with different way of processing.
You want to experiment with different parameters for your models, and that can get messy.
Your YAML file becomes very big.
So a good way to handle this is you want to break it into smaller configuration.
But if you want to do that without Hydra, then you need to write Python functions to access it, to composite it, to put it together, put the pieces of puzzle together.
With Hydra, you can basically, everything is handled for you.
So you can break it apart and then you can refer to different part of the pieces.
You can, like in one YAML file, you can refer to the other part of the YAML file.
It's kind of like an import, right?
Import in Python.
And you can override it.
Another thing I realized, you can override the parameter from the command line.
Yeah, that's a cool feature.
Yeah, so you don't need to go back into the...
Because a lot of time you want to experiment with different parameters or inside the production environment and the development environment, you might use different parameters.
And if you can override from the command line, which is used a lot in, you know, different platforms, then that will be amazing.
Yeah, it's super neat.
Basically, you provide a bunch of default values instead of hard coding them.
And then if you need to override them, you can do that through the command line or you could just do it in code or whatever, right?
Yeah, exactly.
Yeah, excellent.
And you bring it all together here in your article, uv run process.
So you got your Hydra, you got your uv run coming together, all that stuff.
So you actually have a whole article.
I originally started talking about it because it was in the maintainability section.
But you have a whole article called Hydra for Python Configuration, right?
I, that, the other article is more like a high level, but then I have smaller articles that talk about each tool.
Super. Okay. Well, we're not making very good progress through this, but that's okay.
Because these are really interesting topics.
Another one that you talk a lot about is doing proper logging.
And you recommend Log Guru, which I love Log Guru. I think it's really great.
I used Log Book for a long time from Armin Roeneker.
But then I've been slowly moving towards Log Guru.
Nice.
Yeah, I really like.
So another thing about, you know, like a lot of data scientists, they use print, which nothing wrong with print.
Like, in fact, you shouldn't use, I think it's overkill.
You use print in a notebook, right?
But when it comes to like, if you want to run production ready code, if you have a bunch of prints, because a lot of times you had debugging prints, right?
And if, yeah, you can go back and delete them and everything.
But wouldn't it be great?
But then if you go back to the development environment, then you need to put it back.
Or if you don't do it at all, if you keep all the print inside your code, you go into development, now you have a bunch of noise when you see the output.
So with logging, just a simple way of you thinking about, I think a big advantage of logging is you can do logging and you can use different modes like debug, info, warning, error.
so you can set the level based on, you can show, let's say if you're in development environment, you want to show the debug level.
If you're going to the production environment, then you might want to do like the info level only.
But one drawback of logging is, I think it's quite a bit of boilerplate code.
That's the first thing.
So it really, even if you can pop in paste, even it's like one barrier.
you know, like one barrier to use logging.
Why should I do all of this code when I can just use print?
Right, it's got like, you got to register handlers and all sorts of funky stuff, yeah.
But what if you can have the advantage of print, like so easy to use and the benefit of logging?
Then that's why I'm such a big fan of Loggeroo, which have the best of both worlds and other things that it allows this beautiful app in the box.
So the login output, it looks colorful.
It's very easy to see.
With a standard login, you need to do a lot of, you know, what do you want to show?
You want to show this.
You want to show the lines of code.
You want to show the function where the output is coming from.
All of those configurations with LogGuru, you can just say from LogGuru import logger and then logger.info something, something.
and the output is very beautiful.
Yeah, I really like it.
You can basically just, if you wanted to kind of keep your print style, you don't have to, you can just import it and use it and it's prints, right?
Yeah.
The other thing, like you pointed out, this is a super big, for people who are primarily data scientists who haven't worked with logging a lot or new programming, instead of just saying logger print, you say logger debug or logger info or logger error.
And then you can say, production, just show me the errors or hey, something's going wrong.
Actually, show me all the warnings and the info.
And you can dial it up and down without changing the code.
So you can leave your effective print statements there and just turn them off with a configuration.
Maybe with Hydra, who knows?
Yeah.
Yeah, really nice.
And the color.
Yeah, the color is very nice as well.
It's very colorful.
Yeah.
And the color persists through files, by the way, right?
So if you have LogGuru logging to a file and then you tail the file in your terminal, you see the color still, which is awesome.
Oh, wow.
I didn't know that.
That's a new point.
Yeah, yeah.
Because some of my stuff is all logging with LogGuru and I tell it, the color comes through.
And it's so much easier.
Like, for example, on the website, one of the things that I'm logging to a separate file is what are the requests?
What is the response time?
What is the status code?
Is it a 500?
Is it 200?
Is it a 300?
You know, whatever, right?
All that.
And so I'll actually have it change the color based on what happens.
So if the message is a 500, it's a different color than if it's a 200.
Or if the response time is over 500 milliseconds, it changes color to like a warning sign versus if it's under.
And all that stuff comes through.
And it's like so nice with LogRoot.
So nice.
Yeah.
Especially when you have a lot of logs.
And that is very useful.
Yeah.
Absolutely.
Okay.
Git.
Let's talk about source control.
Yeah.
Version control, I think, is huge.
It's very useful.
And it's very important for data scientists, but I don't see it being used enough.
I was in, yeah, and the last thing I actually, I was a machine learning engineer in Accenture and working with clients.
So I was building kind of like a data science environment, data science tool that integrated with AWS SageMaker.
And it's funny how many data scientists are not using Git.
And they're multiple data science team.
And they want to communicate with each other.
They want to share their work.
But then every time they want to share their work, it's so hard for them because they don't have a source version control, which surprised me.
It's a big client.
I mean, it's a big question.
Why don't they use Git?
And if they do, it's not very good practices.
So that's why I want to educate data scientists more about Git.
And to me, Git is so important for several reasons.
First, let's say if you do something, right, you mess up some code.
Let me give an example of data scientists.
They produce, they write a model, they write code that produces a model that works great.
Then like later, they want to twist the parameters, maybe experiment with different type of processing, see if the model performance can increase.
And they mess it up.
The model decreases in performance and they have edited two or three files.
Now they need to, okay, what did I edit?
Now I need to revert it.
And if you don't already like save the last version that was working, you cannot just revert to it, right?
But with Git, you can, there's multiple things.
If you're just a solo data scientist, then you can revert it to the last working version.
But if you work with other data scientists, then you can share, you can also collaborate with them.
like different data scientists can work on different versions and then as they, all different features and when they ready for it to be published and they can merge it together, which is so much better when you do it with Git than manually going life to life.
I think, I agree with you.
I think data scientists don't use source control or version control enough.
And I think that even when people work alone on their own project, they should use, They should use Git or something else.
And honestly, they should just use Git these days because it's the lingua franca of everything that people are doing.
But it lets you do exactly what you're talking about.
And it's not just, oh no, I have to go back.
But I think a really important part of people,
speaking to the people who don't really use it that much,
or they only use it in their professional settings in the team maybe, I think it lets you be fearless in exploring new ideas, right?
Like, all right, I'm going to commit this version.
and then let me just terrorize my code and like try something crazy and oh my gosh it worked great we'll keep it if it doesn't work nothing lost you can 100% go back and if people don't if they're
not i mean that's a good reason even by yourself right yeah yeah exactly and it's i feel like it's so easy uh you can do git add commit that i mean um there's a lot of thing you can do with git but i think to just learn some basic git add git commit git push that's it yeah yeah there's not
you don't have to learn there's maybe five or six commands you got to learn mostly your tools that you're working with um you mentioned vs code it's got awesome get oh yeah integration and pycharm and others yeah yeah absolutely i think that's really really nice um let me give you two more ideas and see how these land with you okay or why i think git is now more important than ever yeah number one if you're doing any agentic coding here's another reason to use like a proper editor instead of a notebook as well, potentially. But you can go and say, hey, AI agent, I would like you to change this and add this feature and do this thing. And it'll just go and go for 10, 15 minutes.
What I find a lot of times with these agentic coding things is they make great progress. You're like, wow, this is amazing. It makes more great progress. Like, how is this even possible? I live in the future. And then the next step is, oh no, it broke it all. You know what I mean? And you're like yeah oh yeah you have the same experience yes and i love that you go into this topic because
that's kind of i think of the mathematics i have been mentioned it's more important than ever now that you have ai you're working with ai because um two different things right a lot of time you wanted to do something and then it broke so you want to go back to the previous version that's one thing another thing is if you commit very frequently then you can see what it changed and you can get before you commit it or you push.
Because so many, I think it's so frequently that I do something that is not optimal.
For example, multiple nested.
Like with AI, a lot of time, it overcomplicates the solution.
It makes it so many tries, except, except, and if else, or like it used, it's hard code.
It's just bad practices.
But if you control, you use version control, you can see like the difference, like the last call and the new call, and you can catch it before you commit.
And yeah, it's more important than ever.
Yeah, you're 100% right.
You're right on it.
I find that when I'm doing the agentic coding side of things, I actually have the source control tab open in my editor, not the files tab, but the source control.
And as it's going, I'll see what files are changed and I'll start like looking at the diffs.
Even while it's still working, I'm like, oh, it's on a good path.
oh no, it shouldn't be doing this.
And either you ask it to fix it or you just go, no, I'm reverting it.
Yeah, I added a feature to the website.
Not a super big one, but kind of touched a lot of files.
I think there was 15 commits to achieve that change because every time a major, I'm like, okay, the AI has gotten something right.
I'm like, save that to get.
Yes.
Because it's exactly like you described.
It's awesome.
Yeah, I experienced the same.
Like I would have so many commits for like one feature change Because also something that I tell to do is, you know, just let's say if I want to implement like something I really like to do is go very thoroughly with like planning very, very thoroughly in advance before even code to ensure that everything is what I expected.
And then I let it run.
Right.
And what I did depends on what I do.
but recently I tried to develop like a workflow to go from, you know, my code into newsletter.
So I wanted to implement something and I want to be, I want to be able to walk away and go back and be able to go back to each. So I break into phases, like let's say I break into five phases, right? The easiest phase and the more complicated phase, like the nicer hair feature.
Now I want to go back into each phase and see if it breaks.
I want to know when it breaks.
So for every phase, I ask it to commit so that if I want to, if it breaks somewhere, I can go back to the previous version, which also another thing that you can ask it to commit.
Yeah, yeah.
That's interesting.
I haven't thought about asking it to commit.
That's cool.
I'll give you one final reason to use Git in the agentic world.
And then I think we're out of time.
We're going to have to call it.
but this has been a great conversation.
One other thing you talked about, like, oh, it's made good progress and then something didn't work and you can actually tell it.
You gave your example.
Let me make this more concrete.
You gave your example of, oh, I made some changes as, forget the AI, right?
I made some changes.
It turns out that the performance fell apart.
I edited three files.
I couldn't quite remember what was wrong.
You could go to an agentic AI and say,
please look at my local Git history from this commit forward and try to understand why the performance fell apart.
And I bet you it will have some really good ideas, if not know exactly why.
And it can just, it will do what we described for us in reverse.
Like it'll just look at the Git history and go, this changed, this changed.
Oh, if this changed, I bet it had this effect.
And then, right.
So you can leverage it in reverse and feed it to the AI to get understanding too.
Yeah, yeah.
That's such a great use case that you just talked about a lot of time.
You're like, okay, use GitDip.
Look at the difference and tell me what's wrong.
That's another thing that I use very often.
Also, another thing on top of it is, let's say it doesn't code the way you, like everybody has the old preferred style to do things, right?
So sometimes you can edit it and you tell it, okay, look at your implementation and my implementation and just kind of taking notes of the difference so that the next time it will be able to create more similar to the style you're looking for.
Yeah. Yeah, that's a great idea. I feel like we honestly could talk about this for hours, but we're out of time. We're out of time, Khuyen. So thank you for being here. I think let's leave it with this. Let's leave it with two things. First of all, maybe final call to action. People are interested in CodeCut.ai, all of the stuff you've created. How do they get started with all of your resources?
Yes. So just go to my website, CodeCut, so C-O-D-E-C-U-T dot A-I.
And then you will see how to sign up for newsletter.
There's also a book tab that if you want to be interested in production, ready data science, you can buy it there.
It's currently on sales.
It's Labor Day week, so 20% off.
And yeah, that's it.
And if you want to read my blog, go to blog.
If you want to see a sample of my code snippet, go to short post.
Everything is very easy to navigate.
Just go to Word.ai.
Fantastic.
All right.
Well, thank you so much for being here and sharing all your experience and your work.
Really, congratulations on CodeCut.
It's a cool project.
Thank you so much.
You bet.
See you later.
We'll see you.
Bye.
This has been another episode of Talk Python To Me.
Thank you to our sponsors.
Be sure to check out what they're offering.
It really helps support the show.
Take some stress out of your life.
Get notified immediately about errors and performance issues in your web or mobile applications with Sentry.
Just visit talkpython.fm/sentry and get started for free.
And be sure to use the promo code talkpython, all one word.
Agency. Discover agentic AI with agency.
Their layer lets agents find, connect, and work together, any stack, anywhere.
Start building the internet of agents at talkpython.fm/agency, spelled A-G-N-T-C-Y.
If you or your team needs to learn Python, we have over 270 hours of beginner and advanced courses on topics ranging from complete beginners to async code, Flask, Django, HTML, and even LLMs.
Best of all, there's not a subscription in sight.
Browse the catalog at talkpython.fm.
Be sure to subscribe to the show.
Open your favorite podcast player app.
Search for Python.
We should be right at the top.
If you enjoy the Geeky Rap theme song, you can download the full track.
The link is your podcast player show notes.
This is your host, Michael Kennedy.
Thank you so much for listening.
I really appreciate it.
Now get out there and write some Python code.
We'll be right back.