↓ Skip to main content
Oral Ersoy Dokumaci

Oral Ersoy Dokumaci

Senior Machine Learning Engineer

Senior Machine Learning Engineer at The Burning Glass Institute, building ML and NLP systems for labor market analytics.

I run a YouTube channel, Python In Production, bridging the gap between writing Python and shipping production systems. All videos also live here as blog chapters.

I have comb-shaped skills: deeper experience in Python, Software Engineering, ML/NLP, and Game Theory, with exposure to Cloud Architecture and Engineering, AI Systems Design, Data Engineering, and MLOps.

In a previous life, I was a quant in finance. I went into the tech side of quantitative finance with a goal of picking up transferable engineering and machine learning skills. I worked on high-frequency trading and market-neutral hedge fund strategies, where I was lucky enough to be surrounded by great engineers and learned the trade (pun intended) by doing. Once I’d done that, I went back to being surrounded by great economists at The Burning Glass Institute. I find it refreshing now to be working at a nonprofit after years where profit was the only objective.

I’ve also been doing my PhD on the side in Economics. My research includes game theory, matching theory, and decision theory.

Recent

Kafka vs RabbitMQ vs SQS vs PostgreSQL vs Redis

Kafka vs RabbitMQ vs SQS vs PostgreSQL vs Redis

One PostgreSQL database on a laptop takes about 23,000 New York taxi trips a second, sent one at a time, while the city’s yellow taxis averaged about 1.3 trips a second in 2024. In this chapter, we compare Kafka with RabbitMQ, Amazon SQS, Redis, and PostgreSQL, and see how Kafka works: its topics, partitions, offsets, consumer groups, batches, and segments. We also see how a crash can lose or repeat events, and how a team chooses between the five.
Spark vs Hadoop vs DuckDB vs Polars

Spark vs Hadoop vs DuckDB vs Polars

One SQL query on 41 million New York taxi trips in an Iceberg table takes 0.29 s with DuckDB, 0.51 s with Polars, and 5.66 s with Spark, all on one laptop. In this chapter, we see how DuckDB and Polars use every core of one machine, how the Google File System, MapReduce, and Hadoop store and process data on many machines, and how Spark works: its cache and lineage, the driver and executors, the query plan, tasks, stages, and shuffles. We also see when one machine is enough and when Spark is worth its costs.
How WoW Forever and MMORPGs Work: System Design

How WoW Forever and MMORPGs Work: System Design

After more than 20 years, World of Warcraft’s servers still struggle, and adding more servers can’t fix it. Through one PvP fight from 2006, we see what the game’s client and server each do, then why the work of a packed crowd grows at least with the square of its size, how realms, instances, shards, layers, and batching spread the load, and why the server’s processor is still the limit.
Apache Iceberg Beneath the Surface

Apache Iceberg Beneath the Surface

A folder of Parquet files is not a table. An interrupted write leaves a third of a month behind, two files with a different timestamp unit break the read, and a count that runs during a rewrite returns 82 million taxi trips instead of 41. In this chapter, we see how Apache Iceberg turns the same files into a table with ACID guarantees: manifests, manifest lists, metadata files, and a catalog, then hidden partitioning, atomic commits, time travel, schema evolution, and compaction, measured on New York’s taxi trips with PyIceberg, Polars, and DuckDB. We also compare Iceberg with Hive tables and Delta Lake.
Why Parquet Dominates Modern Data Engineering

Why Parquet Dominates Modern Data Engineering

Changing one line from CSV to Parquet makes reading the fares of ten million New York taxi trips 27 times faster, and the file is a sixth of the size. In this chapter, we measure why with Polars, DuckDB, PyArrow, and pandas: columnar storage, types in the file, the footer, encodings, pages, compression, predicate pushdown, and row group size. We also see where row storage still wins.
Arrays vs ArrayLists vs Linked Lists (Does Python Even Have Arrays?)

Arrays vs ArrayLists vs Linked Lists (Does Python Even Have Arrays?)

·9 mins
An array stores items of one type in equal slots next to each other in memory, but a Python list can grow and hold items of any type. In this chapter, we start from memory as one long row of bytes and build up arrays, the stack and the heap, pointers, dynamic arrays like Java’s ArrayList, CPython’s list, and linked lists. Then we reason through what each operation costs in an array, a list, and a linked list, and how those costs add up in a coding interview.