Technical Blog
Original, in-depth articles from production trenches: Java, Spring Boot, Microservices, Apache Kafka, AWS, system design, and pragmatic AI integration in backend services. 363 articles published.
August 18, 2026
Requesting a permission the instant your app opens is the fastest way to get it denied – and on mobile, a denial is often permanent. How to ask for runtime permissions with context and good timing, and how to handle a no… Read more
August 18, 2026
Auto-increment integer or UUID for your primary key? It looks like a trivial choice made once and forgotten, but it quietly affects index performance, whether you leak your row counts, and how easily you can merge data a… Read more
August 18, 2026
No error confuses developers more than a CORS error, mostly because almost everything about it is counterintuitive: it is enforced by the browser not the server, it protects the user not your API, and disabling it is usu… Read more
August 18, 2026
Debounce and throttle are the two tools for taming events that fire too often – a search box firing on every keystroke, a scroll handler running hundreds of times a second. They sound similar and behave differently, and … Read more
August 18, 2026
A recommendation service goes down and takes the whole product page with it. That is not a recommendation outage – it is a design failure. Graceful degradation is building so that a dead dependency costs you a feature, n… Read more
August 18, 2026
The moment you want to use an LLM inside a program rather than a chat window, you need its output as structured data – and “please respond in JSON” plus hope is how you get 3am parse errors. The reliable ways… Read more
August 18, 2026
Most health check endpoints are one of two broken kinds: the one that returns 200 no matter what, and the one that checks so much a single slow dependency takes down every replica at once. The middle path is narrower tha… Read more
August 18, 2026
You put an object into a HashSet, then ask if the set contains an equal object, and it says no. The culprit is almost always a broken equals and hashCode contract – the most common quiet bug in everyday Java.… Read more
August 18, 2026
Most apps are built as if the network always works, then break the moment a user walks into a tunnel. Offline-first flips the assumption: the network is unreliable by default. Local-first data, queued writes, and the con… Read more
August 18, 2026
The launch is the first thing a user experiences and the first thing they judge. What actually happens in the seconds between a tap and a usable screen, why almost all of it runs on one thread, and how to find the work t… Read more
August 18, 2026
Isolation levels are usually taught as an abstract table of names and guarantees nobody remembers. They are far clearer explained backwards — through the concrete bug each level allows, from dirty reads to the lost updat… Read more
August 18, 2026
Indexes are the first thing people add for performance and the last thing they audit. Which index types actually earn their place, why the column order in a composite index decides everything, and how to find the indexes… Read more
August 18, 2026
A naive request counter is easy to build and easy to bypass. The rate-limiting algorithms that actually work, why limiting by IP address quietly fails, and how to layer defenses so an attacker cannot simply route around … Read more
August 18, 2026
JSON Web Tokens are everywhere and misused almost everywhere. The predictable mistakes: storing them where XSS can steal them, assuming you can log someone out, algorithm confusion, and reaching for JWT when a session wo… Read more
August 18, 2026
Every React project reaches for a state library early, often before it needs one. The distinction that dissolves most of the problem: server state is not UI state, and most of what teams put in a global store is really a… Read more
August 18, 2026
Forms are the most common interactive element on the web and the most consistently broken. Validation that fires at the wrong moment, errors a screen reader never announces, autofill sabotaged by clever markup. How to bu… Read more
August 18, 2026
API versioning sounds like a URL-format debate, but the real problem is changing an API without breaking clients you do not control and cannot redeploy. What actually counts as a breaking change, and how to evolve an API… Read more
August 18, 2026
There are only two hard things in computer science, the joke goes, and cache invalidation is one of them. The caching patterns worth knowing, the staleness each one accepts, and the stampede that takes down services when… Read more
August 18, 2026
The first LLM bill is a shock, and the instinct — switch to a cheaper model — is usually the wrong lever. Where the money actually goes: the asymmetry between input and output pricing, the context you resend every single… Read more
August 18, 2026
You cannot ship an LLM feature without measuring output quality, and hand-grading does not scale. Using an LLM as a judge works — if you know about position bias, self-preference, and the scores that quietly drift. A pra… Read more
August 18, 2026
Rolling, blue-green, and canary are not a maturity ladder where canary is the grown-up answer. Each trades infrastructure cost, blast radius, and rollback speed differently. How they actually work and which fits your con… Read more
August 18, 2026
Requests and limits are the two numbers on every Kubernetes container, and most teams set them by copying whatever the last service used. Why CPU limits often make latency worse, why memory limits are non-negotiable, and… Read more
August 18, 2026
A process dies with OutOfMemoryError and restarts, and it will happen again. Heap dump analysis tells you what filled the heap: how to capture the dump automatically at the moment of death, and how to read the dominator … Read more
August 18, 2026
One page load fires 200 queries and nobody notices until production. The N+1 query problem hides behind clean-looking code. Here is how it happens, how to catch it, and the four fixes with their honest trade-offs.… Read more
July 23, 2026
Battery complaints arrive as one-star reviews saying “drains my battery” with nothing reproducible. How to measure actual drain with Battery Historian and Instruments, and the four causes that account for mos… Read more
July 23, 2026
A teardown of every stage between a click and the first pixel: DNS, TCP, TLS, the HTML preload scanner, render-blocking CSS, parser-blocking scripts, layout, paint, compositing — and which stage your slow page is actuall… Read more
July 23, 2026
EXPLAIN ANALYZE output looks like a wall of numbers. Only four of them matter, it reads inside out, and the gap between estimated and actual rows finds most bad plans on its own.… Read more
July 23, 2026
Security header guides list a dozen headers as equally important. They are not. Nine ranked by the attacks they actually prevent, including three that are obsolete and safe to delete.… Read more
July 23, 2026
A service slows down, every client retries, and the retries become the load that finishes it off. How retry storms form, why jitter matters more than backoff, and why retry budgets beat per-request limits.… Read more
July 23, 2026
The model is not hallucinating — it is answering faithfully from bad context. Diagnose retrieval failures in order: is the passage in the index at all, does it rank, and is the embedding model actually the problem?… Read more
July 23, 2026
Pending, ImagePullBackOff, CrashLoopBackOff, CreateContainerConfigError, OOMKilled. Each status points at a different subsystem. A systematic walk through the ones you will actually hit, and the command that resolves eac… Read more
July 23, 2026
Annotating every service method with @Transactional is cargo cult. It holds database connections longer than needed, hides the boundary that actually matters, and silently does nothing when called from inside the same cl… Read more
July 17, 2026
Android WorkManager guarantees deferred work will eventually run; iOS BGTaskScheduler only says it might. Learn constraints, exponential backoff, idempotent workers, the iOS budget model, and how to design sync that surv… Read more
July 17, 2026
One ALTER TABLE can take an ACCESS EXCLUSIVE lock and stall every query behind it. Learn the expand-contract migration pattern, lock_timeout guards, chunked backfills, CONCURRENTLY index builds, and which Postgres DDL is… Read more
July 17, 2026
CVSS severity says nothing about whether a CVE is being exploited. Learn to combine EPSS exploit probability, the CISA KEV catalog, and reachability analysis into vulnerability prioritization that cuts the queue without … Read more
July 17, 2026
INP replaced FID as a Core Web Vital and it is much harder to pass. Learn its three phases, why long tasks and hydration hurt, how to yield with scheduler.yield(), and how to debug real interactions using field data rath… Read more
July 17, 2026
Silo, bridge, or pool? Compare multi-tenant data isolation models on blast radius, cost, and operational load. Learn PostgreSQL row-level security, safe tenant context propagation, noisy-neighbour control, and how to mig… Read more
July 17, 2026
vLLM serves open-weight LLMs at high throughput using PagedAttention and continuous batching. Learn GPU memory tuning, tensor parallelism, prefix caching, the latency-throughput trade-off, and when self-hosting actually … Read more
July 17, 2026
The Kubernetes Gateway API replaces Ingress with role-oriented resources: GatewayClass, Gateway, and HTTPRoute. Learn header matching, weighted traffic splitting, cross-namespace ReferenceGrant, and a staged zero-downtim… Read more
July 17, 2026
Java Flight Recorder ships in the JDK and profiles production JVMs at roughly 1% overhead. Learn custom event settings, JFR event streaming, jfr CLI triage, JDK Mission Control analysis, and how to gate performance regre… Read more
June 12, 2026
A production guide to Android 16 predictive back: enabling the callback API, PredictiveBackHandler in Compose, cross-activity animations, Material 3 Expressive, and migrating legacy back stacks.… Read more
June 12, 2026
A practical comparison of PgBouncer, PgCat, and Supavisor: pooling modes, prepared-statement support, load balancing, sizing math, and the pitfalls that bite teams in production.… Read more
June 12, 2026
Allowlist CSP has failed in practice. Strict-dynamic nonces plus Trusted Types close the DOM XSS gap by locking down dangerous sinks at the platform level.… Read more
June 12, 2026
Cross-document transitions let traditional multi-page sites animate navigations like a single-page app, with no framework and almost no JavaScript. Here is how to ship them safely.… Read more
June 12, 2026
How idempotency keys turn at-least-once delivery into safe, exactly-once API behavior, with request fingerprinting, response replay, and concurrency handling in Java and SQL.… Read more
June 12, 2026
A technical guide to building, securing, and deploying Model Context Protocol servers that connect large language models to your enterprise tools and data.… Read more
June 12, 2026
Cilium and Hubble use eBPF to deliver L3-L7 network observability in Kubernetes without sidecars. Learn flow visibility, service maps, NetworkPolicy verification, the hubble observe CLI, and Prometheus metrics export.… Read more
June 12, 2026
Spring Data JDBC maps domain-driven aggregates to relational tables without lazy loading or dirty tracking. Learn aggregate roots, value objects, @MappedCollection, optimistic locking, and when JDBC beats JPA for clean b… Read more
May 9, 2026
A practitioner deep-dive into PostgreSQL 18 asynchronous I/O: io_method tuning, io_uring requirements, sequential scan throughput gains, and real pgbench numbers compared to PG17.… Read more
May 8, 2026
Practical ZTNA implementation guide covering identity-aware proxy, device posture, micro-segmentation, and migration from legacy VPN.… Read more
May 8, 2026
Enterprise migration to post-quantum cryptography covering NIST PQC algorithms, TLS hybrid mode, certificate transition, and crypto inventory.… Read more
May 8, 2026
A migration playbook for Android 15 foreground service restrictions: required service types, the new userInitiated requirement, WorkManager alternatives for periodic sync, and crash mitigation strategies.… Read more
May 8, 2026
A practitioner guide to wiring SwiftData with CloudKit on iOS 19: ModelConfiguration setup, VersionedSchema migrations, conflict resolution, CKShare collaboration, and offline-first UI patterns.… Read more
May 8, 2026
A field-tested guide to running Qdrant at scale: distributed mode with raft, scalar and binary quantization, payload indexing, hybrid search with sparse vectors, and the Kubernetes operator setup we shipped to production… Read more
May 8, 2026
A practitioner guide to TanStack Router with file-based routes, validated search params, loaders, and migration from React Router.… Read more
May 8, 2026
Production patterns for Next.js 15 Server Actions covering validation, optimistic UI, security boundaries, caching, and testing.… Read more
May 8, 2026
Production patterns for eventual consistency in event-driven microservices: outbox, idempotency, sagas, schema evolution, and staleness UX.… Read more
May 8, 2026
A pragmatic Spring Boot implementation of hexagonal architecture with primary and secondary ports, module layout, and testing strategies that scale.… Read more
May 8, 2026
A production setup guide for LLM observability covering tracing, evaluations, cost attribution, and the trade-offs between Langfuse and Helicone.… Read more
May 8, 2026
Production patterns for Claude 4.7 with 1M token context: prompt caching, cost math, document analysis pipelines, and when to choose long context over RAG.… Read more