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...
Master Domain-Driven Design concepts: bounded contexts, aggregate roots, ubiquitous language, and anti-corruption layers. Eric Evans' DDD explained with practical examples...
Create JUnit 5 parameterized tests with non-static @MethodSource in Spring Boot. Inject dependencies into test parameter provider methods...
Six strategies to break dependency cycles in Spring Modulith: dependency inversion, event-driven design, API modules, and more. Practical modular monolith patterns...
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...
Prevent system failures with the Swiss Cheese Model. Layer defensive measures so individual weaknesses don't cause complete system breakdown...
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...
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...
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...
Build modular monoliths with Maven modules instead of microservices. Structure business domains with clear dependencies and prepare for easy microservice extraction...
Control Spring AOP aspect execution order with @Order annotation. Solve transactional and caching aspect conflicts in your Spring application...
Implement audit trails in Java applications using Spring AOP. Track who changed what and when with minimal code using aspect-oriented programming...
Debug complex issues systematically by ruling out hypotheses, using binary search strategies, and isolating variables. Problem-solving techniques for developers...
Curated collection of useful programming resources, articles, and tools. A personal reference list of valuable software development links...
Package by feature, not by layer. Learn why grouping Java classes by business domain beats organizing by technical layers like Controller and Repository...
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...
Practical programming rules: avoid premature abstraction, favor composition, use interfaces wisely, and keep functions small. Actionable guidelines for better code...
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...
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...
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...
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...
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...
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...
A simple and free way to set up a blog is to use
GitHub pages. In fact, that
is how this web page is created...
Version REST APIs elegantly with jackson-versioning. Transform JSON fields automatically for backward compatibility without duplicating controllers or DTOs...
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...
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...
Monitor slow method calls in Spring using AOP aspects. Automatically log performance metrics and track duration thresholds across all services with minimal code...
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...
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...
Use JMX MBeans with JConsole to remotely manage Java applications. Expose operations and attributes in Spring with @ManagedResource and @ManagedOperation annotations...
Integrate Caffeine loading caches with Spring @Cacheable annotation using AOP. Enable background cache refresh without impacting caller performance...
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...
Avoid Java ForkJoinPool common pool pitfalls that cause performance issues with parallelStream and CompletableFuture. Learn when to use dedicated Executors instead...
Stop writing useless Javadoc that duplicates type signatures. Learn when code documentation actually adds value and when clean code is better than comments...
Enforce Java architecture rules with ArchUnit unit tests. Control dependencies, prevent package cycles, and validate naming conventions automatically in your build...
I watched a really good talk on Vim. It taught me a couple of
goodies that I didn’t know since before...
Boost developer productivity with faster iteration speed, minimal friction, optimal complexity management, and better tooling. Practical strategies for engineering leaders...
Learn how to create stateful Spring beans with business logic using prototype scope and @Lookup annotation. Includes working examples comparing traditional vs OOP approaches...
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...
Welcome to my blog! Here I will post notes and random ramblings about software development...