38 things Python developers should learn in 2025
Episode Deep Dive
Guests introduction and background
Peter Wang is the co-founder of Anaconda and currently serves as its Chief AI and Innovation Officer. He helped found the PyData community and has long focused on improving Python’s data and scientific tooling at scale. (Anaconda)
Calvin Hendryx-Parker is the co-founder and CTO of Six Feet Up, an AWS Hero and long-time leader in Python architecture and DevOps. He and his team maintain SCAF, a Kubernetes-ready blueprint for shipping Python apps. (All Things Open 2025)
What to Know If You’re New to Python
Here are a few episode-specific concepts that will help you get the most out of the breakdown below.
- Free-threaded CPython (PEP 703): A build mode that removes the GIL so CPU-bound threads can run in parallel. Expect ecosystem work to make C extensions safe here. (Python Enhancement Proposals (PEPs))
- uv and uvx: A faster, modern installer and environment manager that makes “clean, repeatable” installs feel instant. (Astral Docs)
- Docker + Compose: Containers capture your app and its services so dev and prod stay in sync. (Docker Documentation)
- Async vs threads: Async keeps the event loop free by awaiting I/O; use threads or processes for blocking or CPU-heavy work. (Python documentation)
The Topics
Python documentary as a mirror: reflecting on Python’s past helps set priorities for where the community should push next.
Free-threaded CPython (no GIL) arriving: what it is, why Meta’s work matters, and how it changes concurrency expectations in real apps.
Why the GIL existed and what it broke: a plain-English recap of the GIL’s purpose and why multithreaded speedups often fell flat.
C-extension audit season: the free-threaded future requires libraries to rethink locking, atomicity, and internal assumptions.
Async vs threads, new mental models: how free-threading and async coexist, where deadlocks lurk, and how to avoid blocking the event loop.
Packaging that feels fast (uv / uvx): modern installs and hermetic venvs that make reproducible environments a default rather than a dream.
Nix as a toolchain anchor: using Nix to pin compilers and CLIs so dev machines stop drifting.
Ship your own Python: vendor the interpreter to escape OS Python quirks and keep apps portable.
Lock it down with pins: pip-tools style workflows for deterministic requirements while still being friendly to plain pip users.
Containers as the baseline unit: Docker images capture app plus infra versions to eliminate “works on my machine.”
Compose for local stacks: Docker Compose describes services, versions, and networks so onboarding and parity are simple.
Kubernetes when orchestration pays off: a pragmatic “when is k8s worth it vs Compose” framing rather than a default religion.
Tilt makes k8s dev humane (tilt.dev): live code sync and tight inner loops against a real cluster instead of rebuild-and-pray.
Lightweight clusters (k3s/kind): run a legit control plane on one VM or EC2 box to test orchestration without heavyweight ops.
Talos for hardened k8s nodes (talos.dev): immutable, API-managed nodes with no SSH shell remove a whole class of security risk.
GitOps cadence (Argo CD): declarative deploys that continuously reconcile cluster state with what’s in git.
ASGI server choices (Granian vs Uvicorn): understand worker models and where blocking calls can freeze a “fast” async app.
No blocking in the event loop: replace sync HTTP/file/database calls with async equivalents or offload to executors.
DuckDB as the local analytics engine: full SQL on Parquet or S3 that feels instant on a laptop and scales your thinking.
Arrow and Parquet as lingua franca: columnar formats and zero-copy interchange so tools cooperate instead of serialize.
PyScript + WebAssembly (pyscript.net): run a real PyData stack in the browser or at the edge for private, portable analytics.
Edge compute patterns (Cloudflare Workers): push logic to the data for latency, privacy, and cost control.
Run LLMs locally when it fits: a 32-GB Mac mini can handle surprising models; pick local vs cloud on cost, privacy, and latency.
Tokens and context are budgets: structure prompts and retrieval so models spend tokens on signal, not fluff.
Model Context Protocol (MCP): use tool-calling servers to constrain context, wire local resources, and keep agents on task.
IDE copilots as tireless juniors (Cursor): let AI draft the 90–95 percent and plan to massage the last 5 percent yourself.
Agentic coding in VS Code (Cline): autonomous task runners that can reason over repos and execute multi-step plans.
Front-end refactors with LLMs: migrate a Bootstrap 2015 site to Bulma/Tailwind by letting AI do the grunt work while you review.
Rebuild velocity over ceremony: prefer stacks and CSS frameworks that minimize build steps for long-lived sites.
Sensible supply-chain hygiene: minimal base images, pinned versions, and repeatable builds to dodge transient breakage.
Compose-to-k8s migration path: start simple, adopt Tilt for the inner loop, then add GitOps when orchestration clearly pays.
SCAF blueprint as a head start (Six Feet Up): a minimal, readable template that shows how to scale the same patterns to prod.
Containers for dev parity: keep Postgres, Redis, Mongo, and friends version-matched so “minor” upgrades don’t wreck your day.
Kubernetes for data jobs: schedule batch/analytics workloads (Airflow-style) to use cluster power without special-case infra.
Bring compute to data as a habit: stop copying datasets around and query them where they live with the right engine.
Cloud plus edge plus local is normal now: mix and match deployments instead of forcing a one-size-fits-all architecture.
Community stewardship matters: lowering friction (packaging, docs, defaults) keeps Python welcoming and moving forward.
Skills to bank for 2026: concurrency fundamentals, packaging literacy, containers, and modern data formats will keep compounding.
Key points and takeaways
- Free-threaded CPython is arriving, and it changes concurrency expectations
We discussed PEP 703’s free-threaded build that removes the GIL so CPU-bound threads can actually run in parallel. The big work now shifts to libraries: auditing C extensions for thread safety, adding internal locks where needed, and exposing clear guidance for users mixing threads and async. Teams should plan experiments in sandboxes, measure real-world speedups, and watch release notes as wheels go “FT-ready.” This isn’t a flip overnight, but it unlocks simpler parallelism for many workloads. (Python Enhancement Proposals (PEPs))
- Links and tools:
- peps.python.org/pep-0703: PEP 703 spec. (Python Enhancement Proposals (PEPs))
- Links and tools:
- Packaging that feels fast with uv and uvx
The show called out how much nicer workflows get when installs are fast and environments are hermetic by default.
uv
provides a modern resolver and cache behavior;uvx
spins up ephemeral envs to run tools without polluting your system. Teams adopting uv reduce “works on my machine” drift and speed up CI. It’s a small change with a daily pay-off. (Astral Docs)- Links and tools:
- docs.astral.sh/uv: uv docs. (Astral Docs)
- Links and tools:
- Containers as the default unit, Compose for local stacks
We framed containers as the baseline for dev parity: pin your Python, Postgres, and friends so onboarding is trivial and “minor upgrades” stop breaking prod. Docker Compose then declares your local services, networks, and volumes, making the inner loop reliable. Keep Compose simple; resist adding orchestration until you truly need it. (Docker Documentation)
- Links and tools:
- docker.com: Docker home. (Docker Documentation)
- docs.docker.com/compose: Compose docs. (Docker Documentation)
- Links and tools:
- Kubernetes when it clearly pays off, and how to make it humane
We compared Compose vs k8s with a pragmatic lens: orchestration is worth it when you need scheduling, tenancy, or cluster-wide ops. For development, Tilt watches your code and syncs to a real cluster so you stop rebuild-and-pray cycles. Lightweight k3s makes running a legit control plane feasible on a single VM or edge box. Talos hardens nodes by removing SSH and managing the OS via an API, which cuts a whole class of security issues. For rollout discipline, Argo CD brings GitOps reconciliation so “what’s in git” is what’s running. (Tilt)
- Links and tools:
- tilt.dev/docs: Tilt guides. (Tilt)
- docs.k3s.io: k3s docs. (K3s)
- talos.dev: Talos Linux. (TALOS LINUX)
- argoproj.github.io/cd: Argo CD. (Argo Project)
- Links and tools:
- Async, threads, and the “don’t block the event loop” rule
Even as free-threading lands, async remains essential for network concurrency and low-latency APIs. The maxim stays the same: never run blocking I/O in the event loop; use
asyncio.to_thread
, executors, or async clients. For serving, know your ASGI server tradeoffs: Uvicorn is the battle-tested baseline; Granian is a Rust-backed option that emphasizes performance and also speaks ASGI. Choose based on your workload profile and operational needs. (Python documentation)- Links and tools:
- docs.python.org/3/library/asyncio-task.html:
asyncio.to_thread
. (Python documentation) - uvicorn.dev: Uvicorn docs. (Uvicorn)
- github.com/emmett-framework/granian: Granian repo. (GitHub)
- docs.python.org/3/library/asyncio-task.html:
- Links and tools:
- DuckDB as your local analytics engine, Arrow/Parquet as the common language
We highlighted how DuckDB lets you run serious SQL on Parquet files or local data lakes, all in-process and absurdly fast for exploratory work. Arrow’s columnar memory format and Parquet on disk make tools interoperate without endless serialize/deserialize traps. This “bring compute to data” habit keeps data in place and boosts iteration speed. It’s a powerful upgrade for analysts and developers alike. (DuckDB)
- Links and tools:
- duckdb.org: DuckDB home. (DuckDB)
- arrow.apache.org: Arrow project. (Apache Arrow)
- parquet.apache.org/docs/overview: Parquet overview. (Apache Parquet)
- Links and tools:
- PyScript + WebAssembly make Python at the edge feel real
Running a real PyData slice in the browser or at the edge is no longer fanciful. PyScript sits on Pyodide/MicroPython stacks and WASM to provide a private, portable execution path. Pair that with Cloudflare Workers for low-latency compute near users or data. This opens new UX patterns where lightweight analytics and visualizations execute client-side or at POPs without shipping sensitive data to big servers. (PyScript)
- Links and tools:
- pyscript.net: PyScript home. (PyScript)
- webassembly.org: WASM overview. (WebAssembly)
- developers.cloudflare.com/workers: Workers docs. (Cloudflare Docs)
- Links and tools:
- MCP: sane AI workflows via tool-calling servers
The Model Context Protocol gives you a standard way to expose tools, data, and resources to AI apps, keeping context grounded and secure. Instead of bespoke adapters per model, you run MCP servers and let compatible clients connect. Adoption is expanding across vendors and platforms, which means you can design once and reuse broadly. For Python teams, this is the missing “USB-C port” for reliable agent workflows. (Model Context Protocol)
- Links and tools:
- modelcontextprotocol.io: MCP site. (Model Context Protocol)
- anthropic.com/news/model-context-protocol: Intro post. (Anthropic)
- Links and tools:
- IDE copilots and agentic coding: treat them like tireless juniors
The conversation positioned tools like Cursor as accelerators for scaffolding, refactors, and tests. The mindset shift is to let the tool do the first 90–95 percent, then review and polish the last mile. This keeps humans in charge of design and nuance while offloading the grind. Keep security and review practices in place, especially when agents can read and edit your repo. (Cursor)
- Links and tools:
- cursor.com: Cursor editor. (Cursor)
- Links and tools:
- GitOps cadence for confidence
We emphasized reconciling declared state in git with what actually runs in the cluster. Argo CD continuously compares and syncs, giving rollback safety and auditability. The practice pairs well with SRE habits like minimal images and pinned versions to cut supply-chain noise. It’s not hype; it’s boring, reliable automation. (Argo Project)
- Links and tools:
- argoproj.github.io/cd: Argo CD. (Argo Project)
- Links and tools:
- SCAF blueprint as a head start
Calvin pointed to SCAF as a readable template that scales from sandbox to production with containers, CI, and Terraform to spin up Talos-backed clusters on AWS. It’s opinionated without being opaque, and it demonstrates a Compose-to-k8s journey in code. For teams who want to see “the whole thing” working end-to-end, a maintained blueprint saves weeks. (Six Feet Up)
- Links and tools:
- sixfeetup.com/company/scaf-a-blueprint-for-developers: SCAF overview. (Six Feet Up)
- github.com/sixfeetup/scaf: SCAF repo. (GitHub)
- Links and tools:
- Nix as a toolchain anchor
We talked about using Nix to pin compilers and CLIs so laptops stop “drifting.” With Nix flakes and shells, your dev env becomes declarative and reproducible, which dovetails with containers and CI. It’s a solid answer for polyglot teams where Python is only part of the stack. (Nix)
- Links and tools:
- nix.dev/tutorials/first-steps: Nix first steps. (Nix)
- Links and tools:
- Documentary as mirror, community stewardship as momentum Reflecting on where Python came from helps choose what to fix next: defaults, docs, packaging friction, and developer experience. The thread throughout the episode is stewardship over hype. We invest where the day-to-day gets tangibly better for newcomers and seniors alike, which is how Python stays welcoming and productive.
Interesting quotes and stories
"Free-threaded Python changes the social contract around threads. Now the hard work is making the extension ecosystem safe." -- Peter Wang
"Treat AI like a junior developer who can grind through the first draft. Your job is to direct, review, and improve." -- Peter Wang
"Tilt made Kubernetes development feel humane. You edit, it syncs, and you test against a real cluster without losing your flow." -- Calvin Hendrix-Parker
Key definitions and terms
- GIL (Global Interpreter Lock): A CPython mechanism that historically allowed only one thread to execute Python bytecode at a time.
- Free-threaded CPython: A build mode from PEP 703 that removes the GIL so CPU-bound threads can run in parallel; requires thread-safe libraries. (Python Enhancement Proposals (PEPs))
- ASGI: A standard interface for async Python web apps and servers. Uvicorn and Granian are ASGI servers. (Uvicorn)
- Docker Compose: A YAML format and CLI to define and run multi-container apps locally. (Docker Documentation)
- K3s: A lightweight, CNCF-certified Kubernetes distribution suited for edge and dev clusters. (K3s)
- Talos Linux: An immutable, API-managed OS for Kubernetes nodes with no SSH shell. (TALOS LINUX)
- GitOps / Argo CD: Managing deployments by declaring state in git and continuously reconciling cluster state to match. (Argo Project)
- DuckDB: An in-process analytical SQL engine ideal for local Parquet/CSV exploration. (DuckDB)
- Apache Arrow / Parquet: Columnar formats for in-memory (Arrow) and on-disk (Parquet) data that enable fast, interoperable analytics. (Apache Arrow)
- MCP (Model Context Protocol): An open standard that lets AI apps connect to tools and data through MCP servers. (Model Context Protocol)
Learning resources
Here are curated resources to dig deeper. Course links include a small parameter so you can find them later.
- training.talkpython.fm/courses/python-for-absolute-beginners -- Start here if you’re new to Python and want a solid, modern foundation.
- training.talkpython.fm/courses/llm-building-blocks-for-python -- Build practical intuition for retrieval, tokens, and tool use that we referenced in the episode.
- training.talkpython.fm/courses/modern-fastapi-apis -- Apply the async and ASGI ideas to real API design and deployment.
- training.talkpython.fm/courses/python-concurrency-deep-dive -- Ground yourself in threads vs async so the free-threaded future clicks.
Overall takeaway
Python in 2025 is about pragmatic upgrades that compound: faster installs, reproducible environments, containers as the norm, and a realistic path from Compose to Kubernetes. The concurrency story gets simpler with free-threaded CPython while async continues to shine for I/O and APIs. On the data side, DuckDB plus Arrow/Parquet let you bring compute to the data with almost silly speed, and at the edge PyScript and WASM widen where Python can run. Layer in MCP-style tooling and responsible use of IDE copilots, and you get a stack that is faster, safer, and more fun to ship. Pick two or three of these to adopt this quarter, measure the wins, and keep rolling.
Links from the show
Peter on BSky: @wang.social
Free-Threaded Wheels: hugovk.github.io
Tilt: tilt.dev
The Five Demons of Python Packaging That Fuel Our ...: youtube.com
Talos Linux: talos.dev
Docker: Accelerated Container Application Development: docker.com
Scaf - Six Feet Up: sixfeetup.com
BeeWare: beeware.org
PyScript: pyscript.net
Cursor: The best way to code with AI: cursor.com
Cline - AI Coding, Open Source and Uncompromised: cline.bot
Watch this episode on YouTube: youtube.com
Episode #524 deep-dive: talkpython.fm/524
Episode transcripts: talkpython.fm
Theme Song: Developer Rap
🥁 Served in a Flask 🎸: talkpython.fm/flasksong
---== Don't be a stranger ==---
YouTube: youtube.com/@talkpython
Bluesky: @talkpython.fm
Mastodon: @talkpython@fosstodon.org
X.com: @talkpython
Michael on Bluesky: @mkennedy.codes
Michael on Mastodon: @mkennedy@fosstodon.org
Michael on X.com: @mkennedy
Episode Transcript
Collapse transcript
00:00
00:02
00:05
00:10
00:14
00:25
00:28
00:31
00:37
00:43 five. Welcome to Talk Python To Me, a weekly podcast on Python. This is your host, Michael
01:04
01:34
01:37
01:40
01:42
01:45
01:47
01:51
01:53
01:54
01:57
01:58
01:59
01:59
02:00
02:04
02:09
02:14
02:19
02:22
02:29
02:32
02:33
02:34
02:40
03:07
03:11
03:18
03:20
03:21
03:22
03:25
03:26
03:27
03:33
03:33
03:35
03:37
03:37
03:38
03:38
03:40
03:46
03:50
03:58
04:03
04:09
04:16
04:19
04:23
04:29
04:36
04:43
04:48
04:55
04:56
04:59
04:59
05:03
05:06
05:11
05:11
05:17
05:21
05:21
05:22
05:23
05:26
05:28
05:29
05:31
05:37
05:41
05:45
05:51
05:58
06:00
06:06
06:07
06:09
06:11
06:13
06:18
06:24
06:24
06:26
06:31
06:31
06:32
06:33
06:34
06:37
06:38
06:40
06:42
06:45
06:45
06:48
06:50
06:51
06:51
06:51
06:51
06:58
06:58
06:59
07:00
07:03
07:04
07:06
07:09
07:11
07:12
07:13
07:15
07:16
07:16
07:17
07:18
07:21
07:21
07:22
07:24
07:24
07:24
07:24
07:25
07:28
07:35
07:35
07:37
07:38
07:43
07:45
07:59
08:06
08:08
08:09
08:10
08:15
08:17
08:19
08:20
08:26
08:29
08:34
08:44
08:46
08:47
08:50
08:59
09:04
09:16
09:20
09:26
09:33
09:36
09:38
09:41
11:18
11:24
11:42
11:46
11:49
11:54
11:56
11:58
12:02
12:05
12:13
12:14
12:17
12:23
12:24
12:28
12:36
12:43
12:49
12:52
12:56
12:58
13:01
13:02
13:05
13:09
13:14
13:18
13:20
13:20
13:22
13:25
13:27
13:28
13:33
13:33
13:40
13:57
14:06
14:08
14:13
14:19
14:26
14:32
14:37
14:41
14:44
14:45
14:48
14:51
14:52
14:53
14:54
14:55
15:01
15:07
15:13
15:18
15:29
15:35
15:40
15:44
15:49
15:52
15:57
15:59
16:02
16:05
16:05
16:06
16:07
16:08
16:10
16:31
17:12
17:17
17:21
17:34
17:54
18:07
18:08
18:15
18:19
18:21
18:23
18:30
18:32
18:36
18:40
18:48
18:52
18:57
19:01
19:05
19:10
19:15
19:21
19:26
19:30
19:36
19:41
19:49
19:56
20:06
20:11
20:13
20:16
20:17
20:20
20:22
20:27
20:28
20:29
20:35
20:37
20:41
20:51
20:53
20:59
21:01
21:03
21:05
21:09
21:10
21:12
21:21
21:25
21:39
22:13
22:18
22:31
22:38
22:42
22:43
22:44
22:44
22:54
22:56
22:58
22:59
23:00
23:01
23:04
23:07
23:08
23:15
23:20
23:20
23:21
23:21
23:25
23:26
23:29
23:33
23:40
23:44
23:47
24:03
24:07
24:11
24:14
24:17
24:18
24:21
24:30
24:32
24:39
24:46
24:58
25:01
25:02
25:07
25:13
25:14
25:20
25:28
25:32
25:35
25:45
25:54
26:01
26:29
26:33
26:37
26:48
26:56
27:12
27:26
27:33
27:36
27:38
27:48
27:54
27:56
28:02
28:06
28:11
28:21
28:23
28:27
28:30
28:35
28:40
28:42
28:45
28:46
29:09
29:16
29:25
29:38
29:40
29:55
30:07
30:15
30:22
30:34
30:43
30:46
30:56
31:03
31:04
31:09
31:18
31:20
31:28
31:31
31:45
31:54
32:00
32:07
32:14
32:14
32:19
32:26
32:28
32:32
32:38
32:49
32:57
33:00
33:12
33:14
33:17
33:18
33:19
33:20
33:22
33:30
33:40
33:48
33:55
34:03
34:04
34:10
34:16
34:17
34:20
34:25
34:30
34:31
34:33
34:34
34:38
34:43
34:52
34:54
34:59
35:01
35:12
35:20
35:24
35:26
35:29
35:30
35:33
35:37
35:39
35:40
35:42
35:48
36:11
36:16
36:24
36:31
36:33
36:35
36:43
36:45
36:48
36:49
36:50
36:53
36:57
36:58
37:00
37:02
37:03
37:04
37:14
37:23
37:31
37:36
37:42
37:47
37:50
37:55
38:08
38:13
38:20
38:34
38:53
39:12
39:18
39:24
39:31
39:34
39:40
39:45
39:52
39:54
40:00
40:06
40:19
40:21
40:30
40:32
40:39
40:44
40:45
40:49
41:44
41:44
41:46
41:46
41:49
41:51
41:52
41:53
41:54
41:56
42:42
42:46
42:50
42:51
42:54
42:59
43:01
43:19
43:27
43:32
43:42
43:44
43:47
43:51
43:53
43:56
44:14
44:34
44:39
45:09
45:55
46:13
46:41
46:54
47:05
47:05
47:16
47:21
47:23
47:24
47:31
47:33
47:38
47:46
47:49
47:51
47:56
48:02
48:11
48:17
48:21
48:23
48:24
48:29
48:31
48:36
48:52
48:59
49:03
49:08
49:15
49:21
49:24
49:26
49:31
49:34
49:35
49:36
49:38
49:40
49:41
49:42
49:45
49:49
49:51
49:51
50:01
50:01
50:07
50:21
50:26
50:30
50:34
50:41
50:51
50:57
51:01
51:05
51:11
51:14
51:18
51:25
51:31
51:32
51:33
51:39
51:41
51:43
51:44
51:48
51:53
51:56
51:58
52:07
52:17
52:29
52:34
52:37
52:38
52:41
52:42
52:54
52:56
52:57
53:01
53:04
53:08
53:11
53:11
53:14
53:18
53:22
53:24
53:27
53:32
53:32
53:39
53:42
53:44
53:45
53:46
53:47
53:54
54:19
54:33
54:46
54:50
54:53
54:53
54:59
55:00
55:00
55:02
55:04
55:04
55:05
55:05
55:12
55:14
55:15
55:15
55:16
55:20
55:35
55:44
56:05
56:19
56:23
56:27
56:33
56:37
56:39
56:46
56:48
56:53
56:55
56:56
56:58
57:00
57:02
57:04
57:07
57:11
57:19
57:20
58:08
58:10
58:11
58:13
58:14
58:16
58:17
58:18
58:18
58:20
58:21
58:24
58:28
58:29
58:34
58:36
58:45
58:48
58:55
58:59
59:04
59:13
59:54
01:00:04
01:00:07
01:00:13
01:00:53
01:01:07
01:01:16
01:01:59
01:02:01
01:02:04
01:02:06
01:02:15
01:02:20
01:02:20
01:02:23
01:02:27
01:02:30
01:02:32
01:02:47
01:02:48
01:02:49
01:02:49
01:02:50
01:02:51
01:02:53
01:02:57
01:02:58
01:03:00
01:03:02
01:03:06
01:03:14
01:03:18
01:03:22
01:03:24
01:03:26
01:03:28
01:03:31
01:03:34
01:03:36
01:03:37
01:03:51
01:03:56
01:04:01
01:04:05
01:04:08
01:04:19
01:04:25
01:04:33
01:04:44
01:04:50
01:04:57
01:05:04
01:05:07
01:06:15
01:06:17
01:06:19
01:06:22
01:06:22
01:06:25
01:06:27
01:06:28
01:06:32
01:06:35
01:06:46
01:06:48
01:06:49
01:06:51
01:06:57
01:07:01
01:07:08
01:07:09
01:07:10
01:07:11
01:07:12
01:07:13
01:07:15
01:07:15
01:07:17
01:07:20
01:07:21
01:07:23
01:07:25
01:07:26
01:07:32
01:07:37
01:07:41
01:08:09
01:08:12
01:08:16
01:08:18
01:08:27
01:08:30
01:08:38
01:08:40
01:08:41
01:08:42
01:09:06