The Software Development Monthly is a monthly blog post that shares interesting or useful content which I consumed during the previous month. This blog post is always published on the seventh day of the month.
Let's begin!
AI
I'm in Vibe Coding Hell defines the term vibe coding hell, identifies the downsides of using AI for learning, and describes how we can escape from vibe coding hell.
The Programmer Identity Crisis describes why the author is offended by AI tools.
Solving the wrong problem argues that AI tools are somewhat impressive, but their only benefit seem to be that they can generate crappy code faster than an average developer.
It's insulting to read your AI-generated blog post explains why the author doesn't like reading blog posts which were written by AI.
AI can code, but it can't build software argues that even though AI is good at writing code, it cannot build software that's ready for production.
Cloud
Migrating to Hetzner explains why DigitalSociety decided to migrate from AWS and DigitalOcean to Hetzner, reveals their new stack, and identifies two challenges which they faced during the migration.
Your data, their rules explains why using US cloud isn't a good idea, highlights a few European alternatives, and identifies seven things we should take into account when we are selecting a cloud provider.
Software Development
The state of HTTP clients in Spring explains why Spring is deprecating RestTemplate and provides a quick introduction to the new HTTP clients.
Software Architecture Horror Story identifies one reason why people make bad technical decisions.
Rating 26 years of Java changes highlights the most significant changes which have been released during 26 years and gives a grade (0-10) to each change.
My Approach to Building Large Technical Projects describes how the author ensures that he will finish his school, personal, and work projects.
Proof-Driven Development (or — the business value of Clean Code) describes what's the "best" way to write code that has less bugs.
Development gets better with age explains why an "old developer" shouldn't be scared of new technologies such as generative AI.
On dependencies in objects identifies four ways to pass dependencies to an object, and analyzes the pros and cons of each approach.
Exploring PostgreSQL 18's new UUIDv7 support provides a quick introduction to UUIDv7, identifies its benefits, describes when we shouldn't use UUIDv7, and explains what we should do if we want to migrate from UUIDv4 to UUIDv7.
SQL Anti-Patterns You Should Avoid identifies six common anti-patterns the author has seen in the wild.
Transactions and ThreadLocal in Spring explains what the author found out when he decided to investigate how Spring transactions use ThreadLocal.
Modularizing Spring Boot describes how auto-configurations are packaged and consumed in Spring Boot 4, explains why this change was made, and describes how we can migrate from Spring Boot 3 to Spring Boot 4.
Why we tend to avoid public conversations identifies four reasons why people tend to avoid public conversations, highlights four "rules" which help us to mitigate the situation, and explains how we can track if we are actually making any progress.