Articles
My technical writing and blog posts - 73 articles
Filters
From Dual-Channel to AI Omnichannel Experiences
Explores how AI is expanding digital experiences beyond websites and APIs through AI answer engines, chatbots, AI commerce, and agentic interfaces. Examines the role of AEO/GEO, MCP, and A2A, and why businesses should extend their digital capabilities without neglecting their existing foundations in data, APIs, and web experiences.
Vector Search at Scale: Exact Search, HNSW, and IVFFlat
Explores how vector search works, how HNSW and IVFFlat differ in their search strategies, and how exact search compares with approximate nearest-neighbor indexing. Uses Python, PostgreSQL, and pgvector to benchmark latency and recall and understand the trade-offs between search speed and retrieval quality.
Why Comparing LLM Prices Per Token Is Misleading
Explores why different LLM tokenizers produce different token counts for the same text, how languages, emojis, code, and structured data affect token consumption, and why the cheapest model per million tokens is not necessarily the cheapest for an application. Covers tokenizer vocabulary, prompt caching, reasoning tokens, and multimodal usage to understand the factors that influence LLM costs.
What Does “Understand the System” Actually Mean?
Explores what it really means to understand a system, why understanding its parts is not enough, how different systems require different approaches, and how feedback, intervention, and system behavior shape the way we solve problems.
Understanding the Twelve-Factor App in Today’s World
Explains how the Twelve-Factor App principles fit into modern software development, with practical examples from containers, Kubernetes, CI/CD, observability, and production applications.
Repetition, Busyness, and the Blur of Time
Explores why busy days often feel indistinguishable in hindsight, and how repetition compresses memory while meaningful transitions make time feel fuller and more memorable.
Optimizing the Wrong Signal
Explains how incomplete data leads to flawed decisions, using a WWII aircraft example to highlight why missing data matters more than visible patterns.
GSLB Is Actually Smart DNS Not a Load Balancer
Explains why Global Server Load Balancing (GSLB) is often misunderstood. Despite the name, most GSLB systems do not sit in the request path like traditional L4 or L7 load balancers. Instead, they operate at the DNS layer, influencing which regional endpoint a client connects to during name resolution. The article breaks down how GSLB steers traffic across regions using DNS responses, how this differs from regional load balancing, and why DNS caching introduces architectural constraints that engineers should understand when designing multi-region systems.
7 Mental Models to Effectively Utilize Claude Code as an Agentic System
Presents Claude Code as an execution loop rather than a chat interface and shows how productivity comes from deliberately controlling its context, memory, reasoning budget, workflows, quality gates, and external tool access. Breaks down how these seven mental models shift the developer's role from writing prompts to designing a compounding system, where each iteration starts from a stronger baseline and operates on real data instead of assumptions.
DNS as a Distributed System
Reframes DNS from a simple name-to-IP lookup into what it actually is: a globally distributed, hierarchical, cache-first system that makes explicit trade-offs between consistency, availability, and performance. Explains why these design choices lead to real-world outages, security incidents, and surprising failure modes, and why DNS must be reasoned about like any other large-scale distributed system.
Writing as Infrastructure
Argues that writing is a scaling primitive for engineering teams: while code scales systems, writing scales intent, decisions, and long-term clarity. Explains why writing is often deprioritised and how the real cost shows up later in misalignment, rework, and slow execution.
Latency and Response Time Are Not the Same
Clarifies the critical distinction between latency and response time in distributed systems. Shows how conflating the two leads to optimising the wrong layer, and explains where infrastructure choices end and application-level performance begins.
Learning How to Unlearn
Explains why unlearning outdated assumptions and mental models is becoming more important than continuously acquiring new skills.
Run Transformer Models in Your Browser using Transformer.js
Shows how to run transformer models entirely in the browser using transformers.js, enabling client-side and privacy-friendly inference.
Random Is Not Same as Unpredictable in Python
Clarifies the difference between randomness and unpredictability in Python and why misunderstanding it can cause security issues.
12 Qualities That Take a Software Engineer to Staff Engineer
Identifies twelve practical qualities that make software engineers effective beyond just writing code.
You Should Switch to gRPC if You're Still Using REST for Microservices
Explains when gRPC is a better alternative to REST for microservices and the trade-offs involved.
Andrej Karpathy Grounds AI Hype in Reality in His New Podcast: Key Takeaways
Summarizes key insights from Andrej Karpathy's podcast, focusing on realistic expectations from modern AI systems.
Andrej Karpathy Says Expert Programmers Shouldn't Reject LLMs
Discusses why experienced programmers should adapt to LLMs instead of avoiding them completely.
LLM? Agent? RAG? MCP? If You're Confused Too, This GuideWill Help
Provides a high-level explanation of common AI terms like LLMs, agents, RAG, and MCP in simple language.