Principal Engineer · 16+ years
Helping engineers take LLM and agent systems from demo to production.
Architecture, evaluations, observability, failure handling, cost and latency: the parts a demo never has to answer for.
Or go deeper: the live cohort ↗AI Workflows: Chaining, Routing, and Orchestration
Five patterns worth knowing by name, and why most systems sold as agents should be one of them.
Tue, 25 Aug · 6:30pm London · 30 minutes · Zoom
What engineers say
29+ engineers and colleagues, sharing what changed after we worked together.
“It has been a pleasure working with Ehsan. He is a dedicated, self-motivated and knowledgeable software engineer. He always embraces new challenges at work. He has a positive attitude and desire to produce quality work that serves him well. He would be a valuable team member of any software team.”
“Working with Ehsan has been a blast! Ehsan has done an excellent job as the JavaScript Developer at Round Table Apps. He is also very attentive to details and creative in creating an engaging experience. I would highly recommend Ehsan as an invaluable asset to any organisation or team.”
“It was a great session with Ehsan. I really admired the way he made me understand about so many things. I got to learn a lot from him”
More ways to learn
- Self-paced coursesFive self-paced courses, $99 to $299, from clean code and system design to LLM and agent systems.Browse courses →
- 1:1 mentorshipCareer, system-design judgment, and the path from senior to staff and principal.See programs →
- Writing & podcastHundreds of deep-dives on architecture, plus the Breakpoint podcast.Read the latest →
- Persian coursesThe Farsi side of the site: eight video courses on JavaScript, React, Node and code quality, plus writing in Persian.Open the Persian site →
AI writes it now. Keep your hands in the code.
Ten minutes and one TypeScript problem, written from memory against hidden tests, on a schedule that brings each one back just before you would have forgotten it. Free, and no account needed to try one.
Latest writing

I Use AI Every Day: Why I Built a Place to Practise the Old Problems
I use AI every day, I enjoy it, and I am not going back. What it quietly took is the part of me that produces code from an empty file: the best practices I used to apply without thinking, and the problem solving underneath them. Why the existing practice sites did not fit, and what I built instead.

LLM Tracing vs Evals: Which One Tells You Why Your Agent Broke
Your agent gave a bad answer and you cannot say why. Tracing tells you what happened on one request. Evals tell you whether quality moved across many. They answer different questions, and if you only build one this quarter, build the one that makes the other actionable.

The Innovator's Dilemma: Why Doing Everything Right Gets You Killed
Clayton Christensen showed why good engineering teams build irrelevant products. The paradox of listening to your best customers, and how to stop ignoring the toy technologies that will eventually replace you.

Containers vs Cloudflare Computer: There Is Not Enough Compute for One Box Per Agent
Nearly every agent framework decided that one agent means one container. Cloudflare says there are not enough computers on earth for that to work, and has flipped it around: the agent lives in a tiny sandbox with a filesystem that stays behind, and a container is only borrowed when Linux is truly needed. Here is the argument in plain words, why Cloudflare made it, and where I would use it.

Graph Engineering: Every Edge You Draw Takes a Decision Away From the Model
Agent graphs are state machines with a new name on them. The engineering question is not what a node is, it is which routing decisions you take away from the model and which you leave to it. The rule I apply: only draw edges for decisions you can make better in advance than the model can at runtime.

When Your Data Is Really a Graph: Write the Recursive Query First
Some questions cannot be answered by adding one more join, because the number of joins depends on the data rather than on the query. That is the moment your data has become a graph. Here is how to tell, what a graph actually buys you, and the two costs nobody mentions until you are already paying them.
Popular this week
What other engineers have been reading in the last seven days.

Lefthook vs Husky: Why I Switched and Never Looked Back
Lefthook replaces Husky and lint-staged with a single Go binary, parallel hook execution, and built-in file filtering. Here is why I switched and kept going.

oxlint vs ESLint: Why I Replaced ESLint with oxlint
Replaced ESLint with oxlint in a React TypeScript project and cut lint time from 12 seconds to under one. What I traded away and whether it was worth it.

SQLZoo SELECT from WORLD: Solutions and Explanations
Worked solutions to every SQLZoo SELECT from WORLD exercise, from basic filtering to population and GDP-per-capita queries, each explained step by step.

TypeScript Anti-Patterns That Cost You Twice: Build Time, Runtime, and the Interview
The TypeScript patterns I keep deleting in code review, what to write instead, where the cost lands, and the interview question each one turns into.

Hash Tables Data Structure in TypeScript: A Comprehensive Guide
A hash table maps keys to values with O(1) average-case lookups. That's the pitch. Here's how it actually works.

Monorepo Tools Compared: NX, Turborepo, Bazel, and Rush
Compare the leading monorepo tools: NX, Turborepo, Bazel, Rush, and PNPM workspaces. Choose the right fit for your team size, stack, and build needs.
Where to start
The deep dives I'd point a senior engineer at first, grouped by topic.

SQL, from SELECT to subqueries
Worked SQLZoo solutions, joins, aggregates, GROUP BY vs HAVING, and subqueries — the queries interviewers actually ask.
9 deep dives · Start reading →
Database performance & scaling
Indexes, query optimisation, sharding, replication and normalization — how to make a database fast and keep it fast.
8 deep dives · Start reading →
Modern TypeScript tooling
Why oxlint replaced ESLint, pnpm vs npm, Lefthook vs Husky, and the Rust/Go shift in the frontend toolchain.
6 deep dives · Start reading →
Data structures in TypeScript
Arrays, linked lists, stacks, queues, trees, tries, graphs, heaps and hash tables — implemented and explained in TypeScript.
12 deep dives · Start reading →
Sorting & searching algorithms
Insertion, selection, merge and quick sort, plus binary and substring search — the classic algorithms, step by step.
6 deep dives · Start reading →
Design systems in practice
What a design system really is (per Atlassian), how Dropbox and Netflix build theirs, and how to roll out an internal UI component library.
6 deep dives · Start reading →
Scaling & system architecture
Horizontal vs vertical scaling, capacity estimation, resilience patterns and the architecture principles behind systems that grow.
6 deep dives · Start reading →
X vs Y: engineering trade-offs
Head-to-head breakdowns — oxlint vs ESLint, REST vs GraphQL, SQL vs NoSQL, Svelte/Preact vs React — with the trade-offs that decide it.
12 deep dives · Start reading →


