Swiss Cheese model

The Swiss Cheese model metaphorizes the defense against some risk with layers of cheese. Each layer of cheese has holes in it. The more layers you stack on top of each other the less likely it is that the holes will align...

Heilmeier's Catechism

It is important to remember why a task is performed. I’ve seen a lot of programmers that focus too much on the what and the how. It doesn’t matter what technology is used or how efficient the solution is if it doesn’t solve any problem...

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

Microservice architectures have been in fashion for several years now in the Java community. There are a few ways to achieve modularization without incurring the full cost of a microservice architecture...

Spring Aspects Ordering

A lot of features of Spring framework rely on aspects to add solutions to cross-cutting concerns. These aspects are usually enabled through annotations. This gives a nice declarative way of handling cross-cutting concerns without impacting your actual code...

Audit Trail

Depending on what type of system you are working on, being able to trace back the history of changes might be necessary. In a financial system, it might not only be helpful, but also a requirement to be compliant...

Finding the Root Cause of a Problem

Finding the root cause of a problem is a valuable skill. If you continuously hunt down the root cause of your production issues and address them. Then gradually, your system will become more stable as time passes...

Links

Random links to articles and videos that I’ve found useful. This list is perhaps mainly for my own memory...

Package Structure

I think that many Java programmers don’t spend enough time thinking about their package structure. I also think that most Java programmers get their package structure wrong by instinct. They tend the follow a “package by layer” principle, I.e they bundle classes together based on some common technical principle. Maybe all the Repository classes go in one package and all the Controller classes go in another package...

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

The idea of having a set of rules one can follow to write good code is appealing. I don’t think one can follow such rules strictly, you will be forced to violate them quite often. I have already touched upon this on this site. In this post, I will list some rules that I have found in my career...

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

One big disadvantage of exposing anything as an API is that it tends to be difficult to change once others have started using it. Generally, anything related to programming that is hard to change is going to become a problem...

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

Making decisions can be hard. Especially making hard decisions with large consequences. That’s the reason why company leaders have such high salaries...

Monitoring Slow Calls

It’s not uncommon for problems to only happen in production. Being able to introspect your application can be a key factor in determining what caused an issue...

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

As most of the stuff in the enterprise Java world, MBeans has a cryptic name. What it does is provides a backdoor into your application...

Loading Caches in Spring

Loading caches was coined by Guava. They are also implemented in the popular caching library, Caffeine...

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...

Documenting Code

It amazes me how often you see useless code documentation. By “useless”, I mean documentation that doesn’t add any information that isn’t already present in the type signatures...

Enforcing an Architecture

One problem with architectures and code styles is that they don’t have a strict definition. Instead, they typically exist as a drawing or on a company wiki. Or even worse, in the collective mind of the company’s senior employees...

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?

My interests primarily lie in the technical side of software development. But through experience, I have learned that the softer values matter. In this post, I’m going to try and summarize some thoughts on how to keep your developers productive...

Stateful Classes in Spring

I have been working with Spring at work for a couple of years now. One thing that has struck me regarding Spring is that it discourages from having business logic on stateful classes...

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...