JSONPlaceholder API, Fake REST APIs

JSONPlaceholder API, also known as JSON Placeholder, is a tool for rapidly creating fake REST APIs. Perfect for frontend testing and prototyping without a backend...

Domain-Driven Design

Master Domain-Driven Design concepts: bounded contexts, aggregate roots, ubiquitous language, and anti-corruption layers. Eric Evans' DDD explained with practical examples...

Estimates

Why software estimates are hard and how to improve them. Understand the cone of uncertainty and use techniques like story points and buffer time effectively...

Swiss Cheese model

Prevent system failures with the Swiss Cheese Model. Layer defensive measures so individual weaknesses don't cause complete system breakdown...

Heilmeier's Catechism

Evaluate technical projects with Heilmeier's Catechism: What are you trying to do? How is it done today? What's new? Who cares? Essential questions for project planning...

Soft Skills in Software Development

When interviewing for an open position as a software developer, a lot of focus is spent on technical knowledge and not so much is spent on soft skills. I suppose this is because technical skills can actually be measured. At least to some degree. Soft skills on the other hand is very subjective and also depends on the context and culture you are working in...

Programming puzzles

I have been doing a fair amount of programming puzzles recently as I’m switching jobs. Mainly, I have been doing puzzles from leetcode.com...

Modularizing a Java Application

Build modular monoliths with Maven modules instead of microservices. Structure business domains with clear dependencies and prepare for easy microservice extraction...

Spring Aspects Ordering

Control Spring AOP aspect execution order with @Order annotation. Solve transactional and caching aspect conflicts in your Spring application...

Audit Trail

Implement audit trails in Java applications using Spring AOP. Track who changed what and when with minimal code using aspect-oriented programming...

Finding the Root Cause of a Problem

Debug complex issues systematically by ruling out hypotheses, using binary search strategies, and isolating variables. Problem-solving techniques for developers...

Links

Curated collection of useful programming resources, articles, and tools. A personal reference list of valuable software development links...

Package Structure

Package by feature, not by layer. Learn why grouping Java classes by business domain beats organizing by technical layers like Controller and Repository...

Decomposition

Decomposition is the process of breaking down a problem into smaller sub-problems that are easier to reason about. When composing the solutions to the sub-problems together the bigger problem is solved...

Rules of Thumb for Programming

Practical programming rules: avoid premature abstraction, favor composition, use interfaces wisely, and keep functions small. Actionable guidelines for better code...

Reactive Programming and Project Loom

Reactive Programming has been a trend in the Java space in the last few years. It promises more efficient utilization of the CPU. It does this by not running blocking (typically slow) operations in a CPU thread. To do this, you have to write your code in a certain way, typically with continuations instead of a classic imperative style. See for example Spring Reactive...

Why Most Processes are Annoying

Processes are a “recipe” we follow to ensure that something is performed. Usually, this is either supposed to fix something we are bad at. Or it is supposed to guarantee that something really bad doesn’t happen...

Never Compromise on Quality

I’m currently reading the classic book “Peopleware”. I’ve never really read books on management before, so it’s interesting to read about stuff that I’ve previously only noticed by doing on the job...

Importance of a Good Test Environment

The importance of having a good test environment is something that I believe a lot of companies get wrong. And it’s quite easy to understand why. During the startup phase of a company, this will not be a top priority. For a startup it might even be fine to test code in prod...

Distributed System Stability

One of the selling points of a microservice architecture is often that it will be more stable. If one microservice encounters a failure it does not bring down your entire system. At least that is what advocates say...

System Quality Attributes

I’m reading the book “Designing Data-Intensive Applications” by Martin Kleppmann. I found the list of attributes that describes the quality of a system quite good. So I thought I would replicate it here...

API Versioning

Version REST APIs elegantly with jackson-versioning. Transform JSON fields automatically for backward compatibility without duplicating controllers or DTOs...

Remote Debugging

Remote debugging is one feature I didn’t realize I needed until I worked in a team where I was integrating towards a third party that was calling my code...

Decision Making

Stop wasting time on trivial decisions in code reviews. Learn Parkinson's Law of Triviality and focus your effort on architecture decisions that actually matter...

Monitoring Slow Calls

Monitor slow method calls in Spring using AOP aspects. Automatically log performance metrics and track duration thresholds across all services with minimal code...

Command Query Separation

The command-query separation (CQS) principle states that every function should either be a command that performs an action or a query that returns a value. But never both at the same time...

Breaking Principles

Whether it comes to low-level design or high-level design, I find it useful to think about abstractions that make sense. While this might sound like an obvious statement, there are a couple of principles that might lead you to create abstractions that don’t make sense...

MBeans

Use JMX MBeans with JConsole to remotely manage Java applications. Expose operations and attributes in Spring with @ManagedResource and @ManagedOperation annotations...

Loading Caches in Spring

Integrate Caffeine loading caches with Spring @Cacheable annotation using AOP. Enable background cache refresh without impacting caller performance...

Tags on GitHub Pages

I recently added tags to my GitHub pages (i.e. the page you’re currently viewing). I mostly copied it from mindust.com so I figured I should give that page a shoutout...

Pitfalls of the Common Pool

Avoid Java ForkJoinPool common pool pitfalls that cause performance issues with parallelStream and CompletableFuture. Learn when to use dedicated Executors instead...

Documenting Code

Stop writing useless Javadoc that duplicates type signatures. Learn when code documentation actually adds value and when clean code is better than comments...

Enforcing an Architecture

Enforce Java architecture rules with ArchUnit unit tests. Control dependencies, prevent package cycles, and validate naming conventions automatically in your build...

Vim Talk

I watched a really good talk on Vim. It taught me a couple of goodies that I didn’t know since before...

What Makes a Team Productive?

Boost developer productivity with faster iteration speed, minimal friction, optimal complexity management, and better tooling. Practical strategies for engineering leaders...

Stateful Classes in Spring

Learn how to create stateful Spring beans with business logic using prototype scope and @Lookup annotation. Includes working examples comparing traditional vs OOP approaches...

Persistent Vim Sessions

I just learned that you can persist the history between Vim sessions. This is hugely useful in my view, and it just takes two lines in your vimrc to set it up...

Hello World!

Welcome to my blog! Here I will post notes and random ramblings about software development...