Loading...
Practical notes from projects I've built, decisions I've had to make, and lessons learned along the way. I write about engineering fundamentals, modern front-end work, and new tools I'm exploring with a hands-on mindset.
June 6, 2026
Sliding window is not just two pointers moving together. It's a window that holds an invariant, and understanding that invariant is what makes the O(n) bound make sense.
May 29, 2026
AI can read a diff all day. It still can't talk to your team. Code review is where engineers actually learn from each other, and that part doesn't survive full automation.
May 23, 2026
Memory layout and cache locality explain why two O(n) algorithms can perform completely differently. Here's what's actually happening and how it shows up in everyday engineering work.
May 18, 2026
Big O describes how an algorithm's cost grows relative to input size. It says nothing about raw speed. Understanding that gap is what separates useful intuition from flawed optimization decisions.
May 14, 2026
Why manually reviewing pull requests keeps engineering fundamentals sharp, even when AI can generate code and summarize diffs quickly.
May 2, 2026
TypeScript 7 matters because the compiler is moving to a native Go foundation, making type checking faster while keeping the migration path practical.
April 24, 2026
Bun is gaining traction because it reduces JavaScript tooling friction: faster installs, built-in TypeScript support, a test runner, audits, and fewer moving parts.
April 17, 2026
Formatters and linters reduce code review noise, catch real mistakes, and make teams faster. Oxfmt and Oxlint push that workflow toward simpler, faster defaults.
March 28, 2026
Indexes speed up data access. Proxies shape how requests reach services. Together they show a common system design tradeoff: add a layer, reduce a more expensive cost.
March 20, 2026
How caching improves resource utilization and how data partitioning enables horizontal scaling, plus the tradeoffs and constraints that come with each approach.
March 18, 2026
How load balancers work, where they sit in a distributed system, and the nine algorithms that determine how traffic gets distributed.
March 14, 2026
Breaking down the five core properties every distributed system is measured against: scalability, reliability, availability, efficiency, and manageability.
March 10, 2026
My first takeaway from Grokking the System Design Interview: this interview is less about a perfect answer and more about how clearly you reason through scale, tradeoffs, and communication.
March 6, 2026
Why strong engineers think beyond tickets and pixel-perfect output to focus on business value, collaboration, and solving the right problem.
March 4, 2026
Part 4 of a SOLID series: why Interface Segregation and Dependency Inversion work together to reduce coupling, improve testability, and keep systems easy to evolve.
March 3, 2026
Part 3 of a SOLID series: how to apply Liskov Substitution Principle with behavioral contracts, safe polymorphism, and composition over inheritance.
March 2, 2026
Part 2 of a SOLID series: how to apply Open/Closed Principle pragmatically, extend behavior safely, and avoid unnecessary abstraction.
February 27, 2026
Part 1 of a SOLID series: why Single Responsibility Principle is still foundational for scalable, maintainable, reliable software, especially in AI-assisted development.
February 25, 2026
Why communication, collaboration, and strong engineering fundamentals now matter more than raw coding speed in an AI-assisted world.
February 22, 2026
A production SSR bug caused by random list keys in React, and how deterministic ID generation resolved hydration mismatches with predictable behavior.
February 19, 2026
Why writing specs before code creates better software, eliminates ambiguity, and is the natural companion to AI-assisted development.
February 18, 2026
How I designed a clean blog architecture with Markdown-first content, premium syntax highlighting, and room to scale.