About
A pragmatic programmer with a passion for solving problems using technology. I am an accomplished software and data engineer with over a decade of experience architecting and building robust, large-scale distributed systems, data pipelines, and web applications using technologies including Airflow, Spark, Kafka, AWS, Flask, Go, Node.js, and React. My solutions have powered products and platforms handling massive traffic and data volumes.
Work Experience
Skills
Certifications
Check out my latest work
I've worked on a variety of projects, from simple websites to complex web applications. Here are a few of my favorites.
Latest Articles
I write about software engineering, databases, distributed systems, and other technical topics. Here are my latest articles.
- 📝
Profiling That Matters: py-spy, eBPF, perf, and Interpreter-level Counters
14 min readA practical, low-overhead toolbox for Python performance: what to use (and when), how to keep overhead in single digits, and how to read profiles you can trust.
- 📝
Building Fast Native Extensions: Cython, cffi, HPy, and a Tiny C-extension by Hand
17 min readThe shortest safe path from Python to C-speed: a practical roadmap for choosing Cython, cffi, HPy, or the raw C API, with a minimal wheelable extension, packaging/ABI mental models, and performance guardrails you can apply today.
- 📝
GIL Realities and the Path Toward No-GIL (PEP 703): What Changes for You
12 min readA practical guide to Python’s GIL today—where threads help, where they don’t—and what the emerging no-GIL path means for the way you write concurrency, performance, and extension code.
- 📝
The Specializing Interpreter in CPython 3.11+: Why Your Code Got Faster
11 min readDemystify CPython 3.11's specializing/adaptive bytecode interpreter—quickening, inline caches, and the patterns that help your code hit the fast path without changing a line.
- 📝
Memory: Refcounting, Generational GC, and Finding Leaks Without Guessing
17 min readA production-first tour of CPython’s memory model: what refcounts really guarantee, how the cyclic GC works, why RSS doesn’t always go down, and how to reason about growth without guesswork. Part 1 lays the mental model and refcounting truths.
- 📝
Types that Pay for Themselves: Pydantic v2, mypy/pyright, and Runtime Contracts
14 min readMake Python types carry their weight: combine static checking (mypy/pyright) with fast runtime validation (Pydantic v2) to turn annotations into contracts that prevent bugs, speed up onboarding, and keep hot paths fast.
- 📝
AsyncIO at Scale: Backpressure, Structured Concurrency, and Cancellation Semantics
14 min readBuild async services that stay responsive under load: apply backpressure with bounded queues, adopt structured concurrency, and make cancellation a contract with deadlines.
- 📝
High-performance DataFrames: Polars, pandas 2, and Arrow Interop
13 min readPick the right engine; exploit Apache Arrow and expression pipelines to get faster, more memory‑efficient DataFrames in Python—without painting yourself into a corner.
- 📝
Async I/O in C: POSIX AIO vs io_uring vs Threads
22 min readAsync in C without 3 a.m. incidents: understand POSIX AIO, io_uring, and thread-pool strategies; compare latency/throughput/complexity; and build a thin, testable abstraction with real cancellation.
- 📝
Designing a WAL in C: Append-Only, fsync, and Crash Consistency
20 min readA minimal, production-minded Write-Ahead Log (WAL) in C: append-only records, checksums, segment management, fsync discipline, and recovery guarantees.
Get in Touch
Want to chat? Just shoot me a dm with a direct question on twitter and I'll respond whenever I can. I will ignore all soliciting.