Versioning REST APIs in Spring Boot
APIs evolve, but clients don't upgrade in lockstep. A clear versioning strategy lets you change contracts without breaking existing consumers.
Read article$ cat ./about.md
Deep dives on frontend architecture, backend systems, databases, and the day-to-day craft of building software — with real code you can copy.
APIs evolve, but clients don't upgrade in lockstep. A clear versioning strategy lets you change contracts without breaking existing consumers.
Read articleSchema changes need to be versioned, repeatable, and applied in order. Flyway makes your database schema part of your codebase.
Read articleDownstream services fail. Circuit breakers, retries, and timeouts keep those failures from cascading through your system.
Read articleCaching is easy to add and easy to get wrong. Understanding the three core patterns helps you pick the right consistency trade-off.
Read articleClients retry. Networks drop responses. An idempotency key lets a repeated request produce the same result exactly once.
Read articleSet up the OpenAI command-line tools, authenticate securely, and confirm everything works before you write a single line of application code.
Read articleThe connection pool is often the real bottleneck under load. Here's how HikariCP works and how to size it sensibly.
Read articleWith the CLI set up, let's make real calls — a chat completion, a streamed response, and a scripted prompt you can pipe into other tools.
Read articleWhen you need routing, work queues, and acknowledgements more than a replayable log, RabbitMQ fits. Here's the Spring AMQP essentials.
Read articleClaude Code brings Anthropic's models into your terminal as an agentic coding assistant. Here's how to install, authenticate, and configure it.
Read articleKafka Streams turns topics into continuously updating computations. Here's how to aggregate and transform events without a separate cluster.
Read articleSetup done, let's use Claude Code for real — asking questions about a codebase, making a scoped change, and running it non-interactively in a script.
Read articleBefore reaching for Kafka, Spring's in-process application events can decouple your components cleanly. Here's when and how to use them.
Read articleGoogle's Gemini CLI is an open-source terminal agent with a generous free tier. Here's how to install it, sign in, and pick a model.
Read articleWith the Gemini CLI set up, here are three real workflows — exploring a repo, generating code with a scoped prompt, and piping it into scripts.
Read articleA shared counter in Redis lets every instance enforce the same request budget. Here's a fixed-window limiter you can drop into a filter.
Read articleWhen multiple instances race for the same resource, you need a lock they all respect. Redis provides a simple, fast distributed lock primitive.
Read articleSpring's RestClient offers a modern, fluent, synchronous HTTP client to replace RestTemplate. Here's how to call external services cleanly.
Read articleValidation belongs at the edge of your system. Jakarta Bean Validation lets you declare rules on your DTOs and enforce them automatically.
Read articleReturning entire tables over HTTP is a scaling trap. Spring Data's Pageable makes paging and sorting a one-parameter change.
Read articleDeclarative transactions are convenient until they surprise you. Here's how propagation, rollback rules, and proxying actually work.
Read articleYou can't operate what you can't see. Actuator exposes health, metrics, and runtime internals through production-ready endpoints with minimal setup.
Read articleKafka decouples services through durable, replayable event logs. Spring for Apache Kafka makes producing and consuming records almost trivial.
Read articleOnce you run more than one instance, an in-memory cache stops being enough. Redis gives you a shared, distributed cache that every node can read and write.
Read articleA practical mental model for React Server Components — what runs where, why it matters, and how to avoid the most common pitfalls.
Read articleRepeated database reads are the easiest performance win to claw back. Spring's cache abstraction lets you add caching declaratively without touching query code.
Read articleOffload slow work and run recurring jobs without blocking request threads. Here's how to use Spring's async and scheduling support correctly.
Read articleSpring Boot removes most of the ceremony from building REST services. Here's how to structure controllers, DTOs, and error handling cleanly.
Read articleThe extension marketplace is enormous and mostly noise. Here's a focused set that earns its place, plus how to share them with your team.
Read articleStop retyping the same build and test commands. VS Code tasks let you define, chain, and bind them to keystrokes.
Read articleconsole.log gets you far, but a real debugger gets you further. Here's how to set up breakpoints, watches, and launch configs in VS Code.
Read articleConstructor injection, beans, and scopes — a practical tour of how Spring's IoC container wires your application together.
Read articleThe difference between a slow and a fast editor session is rarely typing speed — it's navigation. Here are the keybindings worth committing to muscle memory.
Read articleEdit code that lives on a server, in a container, or in WSL as if it were local. VS Code's remote extensions make the environment gap disappear.
Read articleType a short abbreviation, hit Tab, and expand it into a full code snippet. Live templates eliminate the boilerplate you write over and over.
Read articleRepositories, derived queries, and the N+1 problem. How to use Spring Data JPA productively without hidden performance traps.
Read articleIntelliJ's refactorings are safe, scope-aware, and reversible. Leaning on them instead of manual edits prevents a whole class of mistakes.
Read articleIntelliJ's debugger goes far beyond breakpoints — evaluate expressions, drop frames, and change values live. Here's how to use it well.
Read articleIntelliJ rewards keyboard fluency more than almost any other IDE. These shortcuts turn navigation and refactoring into reflexes.
Read articleA practical walkthrough of stateless authentication in Spring Security using JSON Web Tokens and a custom filter.
Read articleIntelliJ Ultimate understands Spring deeply — bean graphs, endpoint mapping, and configuration hints included. Here's how to lean on it.
Read articleMap, filter, reduce, and collect — how to write expressive, readable data pipelines with Java Streams and avoid common pitfalls.
Read articleThe token bucket algorithm is the workhorse of API rate limiting. Here's how it works and how to implement one in Go and TypeScript.
Read articleA default producer sends one record at a time and leaves throughput on the table. Batching, compression, and acks tuning can multiply your write rate.
Read articleExternalized config, type-safe properties, and environment profiles — how to manage settings across dev, staging, and production.
Read articleUnit tests, slice tests, and full integration tests with Testcontainers. Build a testing pyramid that stays fast and reliable.
Read articleWriting bespoke producers to sync a database into Kafka is wasted effort. Kafka Connect gives you declarative, fault-tolerant source and sink connectors.
Read articleWhen to reach for WebFlux, how Mono and Flux work, and the rules you must follow to keep a reactive pipeline non-blocking.
Read articleRecords, sealed types, and pattern matching for switch turn verbose Java into concise, expressive code. Here's how they fit together.
Read articleLayered images, multi-stage builds, and JVM tuning for containers. Ship small, fast-starting Spring Boot images to production.
Read articleUnstructured JSON on a topic becomes a liability as producers and consumers evolve. A schema registry enforces compatibility so upgrades never break.
Read articleIndexes can turn a 3-second query into a 3-millisecond one — or do nothing at all. A field guide to picking the right index in Postgres.
Read articleAt-least-once delivery means duplicates. Kafka's idempotent producer and transactions let you achieve exactly-once processing when you truly need it.
Read articleConsumer groups are how Kafka scales reads. Partitions are divided among group members, and rebalancing keeps the work balanced as members come and go.
Read articleTwo techniques that look similar but solve different problems. When to reach for each, with copy-paste TypeScript implementations.
Read articleEverything in Kafka builds on three ideas. Understand topics, partitions, and offsets and the rest of the system suddenly makes sense.
Read articleThe old Date and Calendar classes were mutable and error-prone. The java.time API models instants, dates, and zones cleanly and immutably.
Read articleJava's built-in serialization is a security and compatibility minefield. Prefer explicit formats like JSON and treat native serialization with caution.
Read articleMost apps never need GC tuning, but when latency spikes appear, knowing which collector you run and how to read its logs is essential.
Read articleClassic streams are simple and blocking; NIO adds channels, buffers, and non-blocking I/O. Knowing when to use each keeps your file and network code efficient.
Read articleEscaping quotes and concatenating multi-line strings is a thing of the past. Text blocks and new String methods make Java text handling pleasant.
Read articleSealed types let you close a hierarchy to a known set of subclasses, giving the compiler enough information to check your switch statements exhaustively.
Read articleArrayList or LinkedList? HashMap or TreeMap? The right choice depends on your access pattern, and the wrong one shows up as latency.
Read articleLambdas are more than syntax sugar. Knowing the core functional interfaces lets you design clean, composable APIs.
Read articleWhy does a value written by one thread sometimes stay invisible to another? The memory model defines the rules, and volatile is often the fix.
Read articleMutable shared state is the root of most concurrency bugs. Immutable objects are automatically thread-safe and far easier to reason about.
Read articleWildcards, bounds, and type erasure trip up even experienced developers. Understanding the rules makes your APIs both safe and flexible.
Read articleOptional was meant to end the null-check ritual, but misused it just moves the problem. Here is how to use it the way it was designed.
Read articleSwallowed exceptions and generic catch blocks hide the bugs that matter. A few disciplines keep failures visible and actionable.
Read articlePlatform threads are expensive, so we pool them. Virtual threads are cheap enough that you can spawn millions and write plain blocking code again.
Read articleCallbacks nest, threads block, and orchestration gets messy fast. CompletableFuture lets you compose async work into readable pipelines.
Read article