Engineering
The technical ledger. War stories from the JVM and infrastructure frontlines: architectural decisions, migration patterns, things that broke in production, and the occasional "here's how not to do it" cautionary tale.
- Virtual Threads Changed How I Think About Concurrency
- Optional: Design, Usage, and My Very Strong Opinions
- Strangler Fig in Practice: Wrapping Legacy Services
- JUnit 5 - Everything You Actually Need
- Java Migration Survival Guide: 8 to 21
- Distributed Tracing Without Losing Your Mind
- Stream API Traps and How to Not Shoot Yourself in the Foot
- Pattern Matching and Sealed Classes: The Visitor Pattern Is Dead
- Java Records and the Data-Oriented Programming Shift
- The Java Module System - JAR Hell, Meet Module Hell
- Thread Pools and Executor Internals - The Devil's in the Queue
- CI/CD Doesn't Stand for Continuous Chaos
- CRaC - Checkpoint/Restore and the JVM Startup Problem
- GraalVM Native Images - Worth the Trade-Off?
- Thread Dumps and Heap Dumps: Reading the Wreckage
- JDK Flight Recorder - Your JVM's Black Box
- ZGC and the War on Tail Latency
- R2DBC: Reactive Database Access and Its Discontents
- Connection Pooling: The Silent Killer
- CompletableFuture and the Art of Async Java
- Project Reactor for Mortals
- Spring Modulith: The Modular Monolith Done Right
- Eventual Consistency: Learning to Live with 'Good Enough'
- Spring Cloud Gateway: Beyond the Getting Started Guide
- DDD and Event Storming: From Sticky Notes to Bounded Contexts
- Bicep Curls: Azure IaC That Doesn't Suck
- CQRS: Separating Reads from Writes Without Losing Your Mind
- Event Sourcing Fundamentals: Storing What Happened, Not Where You Are
- Docker Images for Java: Stop Shipping 800MB of Nothing
- Spring @Transactional: Mistakes Everyone Makes
- Choosing a Message Broker: A Field Guide for the Indecisive
- Spring Data JPA Anti-Patterns I Keep Finding in Code Reviews
- RabbitMQ with Spring Boot: The Practical Guide
- Spring Security and OAuth2 in Microservices: The Full Picture
- JMS in 2026: Still Relevant, Still Misunderstood
- ActiveMQ Broker Networks: Legacy Messaging That Refuses to Die
- The Outbox Pattern, or How I Stopped Worrying About Dual Writes
- Feature Flags in Spring Boot: Beyond @Profile
- Kafka Producer Tuning: The Settings That Actually Matter
- Spring Boot Startup Optimization: From 30 Seconds to Sub-Second
- Apache Flink: When Kafka Streams Isn't Enough
- Killing WebLogic, One Service at a Time
- Spring Boot Profiles and Externalized Configuration Done Right
- Spring Boot Auto-Configuration: How the Magic Works
- Testing Kafka-Based Systems: It's Harder Than You Think
- Running Kafka on Kubernetes: Because Apparently We Enjoy Complexity
- Caching in Microservices: When It Helps and When It Hurts
- Avro vs Protobuf: Picking Your Serialization Battle
- Kafka Consumer Offsets: What Nobody Tells You
- Spring Cloud Stream with Kafka: Abstraction at What Cost?
- Idempotency in Distributed Systems, or Why Your Payment Charged Twice
- Kafka Streams: The Stream Processing Library That Lives in Your Application
- Kafka Connect and SMTs: The Swiss Army Knife You're Probably Underusing
- API Gateways and Spring Cloud Gateway in Practice
- Kafka Disaster Recovery: The Plans Nobody Tests Until It's Too Late
- Kafka Lag Monitoring: The Metric That Lies to You
- Service Discovery: From Eureka to Just Using Kubernetes DNS
- KRaft: Kafka Finally Broke Up with ZooKeeper
- Kafka as a Message Queue: When It Works and When It Really Doesn't
- ELK vs Loki, or How Much Do You Want to Spend on Logs?
- Kafka Partitioning: Where Your Scaling Strategy Lives or Dies
- Structured Logging, or How to Make Logs Actually Searchable
- Kafka Transactions and the Myth of Exactly-Once
- Resilience Patterns That Actually Work in Spring Boot
- Prometheus and Grafana for Java Services, or Metrics That Actually Help
- When NOT to Do Microservices
- mTLS Between Microservices, or Why the Network Is Not Your Security Boundary
- Secrets Management with Vault, or Stop Putting Passwords in Git
- JWT - How It Works and How It Breaks
- OAuth2 and OIDC, or Why Your Auth Is Probably Wrong
- ArchUnit, or How to Stop Architectural Rules from Being Suggestions
- Load Testing with Gatling, or Breaking Things on Purpose
- Testcontainers, or How I Learned to Love Integration Tests
- Contract Testing with Pact, or How to Stop Breaking Each Other's Services
- PostgreSQL Internals Every Java Developer Should Know
- Database Multitenancy: Three Strategies and Their Real Trade-offs
- Jakarta EE in 2026: Still Relevant or Just Nostalgic?
- Flyway vs Liquibase - A Pragmatist's Comparison
- Micronaut: Compile-Time DI and the Case for Doing Less at Runtime
- CDC with Debezium - Because Your Database Is Already an Event Stream
- Quarkus: The Kubernetes-Native Java Framework That Earned My Respect
- gRPC and Binary Protocols: When JSON Just Isn't Fast Enough
- Database Deadlocks - Causes, Prevention, and That One Time at 2 AM
- GraphQL: When REST Isn't Enough (And When It Is)
- Optimistic vs Pessimistic Locking: When to Use Each
- REST API Design: Pragmatism Over Purism
- Data-Oriented Programming in Java: Records, Sealed Types, and Letting Go of OOP
- Transaction Isolation Levels - The Practical Guide Nobody Gives You
- Hexagonal Architecture: Ports, Adapters, and Actual Code
- The Hibernate Performance Tuning Checklist I Actually Use
- Terraform with Kubernetes: Managing Infrastructure That Manages Infrastructure
- Helm Charts: Packaging Kubernetes Apps Without Losing Your Mind
- EAGER vs LAZY Fetching: A Story of Regret
- Serverless Java: The Cold Start Problem and What to Do About It
- Keyset Pagination vs OFFSET, or Why Your Page 500 Takes 10 Seconds
- Blue-Green and Canary Deployments: How to Ship Without Sweating
- The N+1 Query Problem, or How Your ORM Is Lying to You
- Istio Service Mesh: When You Need It and When You Really Don't
- Kubernetes Secrets Management: base64 Is Not Encryption
- GitOps with ArgoCD: Declarative Deployments That Actually Work
- Kubernetes for Java Developers: The Stuff Nobody Warns You About