Software Architect & Developer with 23+ years of experience

I specialize in building scalable web applications, designing robust software architectures, and sharing knowledge about modern development practices. Passionate about clean code, system design, domain driven design and helping teams deliver better software.

Florian Krämer - Articles


  • 18 min read

    AI in the Software Development Life Cycle: Promise, Pitfalls, and Practical Shifts

    My first article about AI, even though I’ve worked full-time with AI on a project for more than 8 months. I don’t like to write about things I haven’t properly experienced in real scenarios, and I’m not a fan of hyping trends or jumping on the latest bandwagon too early. So here are my thoughts on AI in the Software...

  • 3 min read

    Identify Risky Files in Your Git Repositories

    Software teams often wrestle with the question: Where should we focus our refactoring, testing, or documentation efforts? I’ve released my Git Churn Calculator, a lightweight, practical, cross-platform (Linux, Windows, macOS) tool that answers this by calculating a Churn Risk Score for every file in a Git repository.

  • 29 min read

    The Value of Value Objects

    I’m still surprised to see that so many people still do not use value objects. I’m not sure about the reasons for that, but I’ll give it a try at explaining why they’re beneficial. Some people also seem to think that value objects are only useful if you have a combination of two or more values, which is wrong. Others...

  • 2 min read

    DDD Context Mapper: A single-page Tool for Context Maps

    I built a single-page context mapper diagram tool because I was not happy with any tool I am aware of for this purpose. I also wanted the format to be JSON, easily machine readable, so I can export data from other systems and use this tool to visualize it without a proprietary file format or a heavy toolchain in between....

  • 3 min read

    Legacy Code Refactoring: Feathers, Beck, and Bache Compared

    Michael Feathers: His 24+ techniques are primarily Dependency Breaking Patterns. The goal isn’t just “clean code”—it is to break the bonds that prevent you from putting a class into a test harness. Many of his moves (like Introduce Static Setter) are considered “temporary hacks” to enable testing.

  • 12 min read

    Pull Requests Are Not the Best Thing You Can Do

    I like to say that software engineering is about being able to reason about the design of the code. Therefore, a code review is a discussion about the design of the program between two developers or software engineers.

  • 20 min read

    Persisting Aggregates with the Memento Pattern and Embracing Simplicity

    This article will show how to use the Memento Pattern to persist aggregates just using plain old PDO.

  • 10 min read

    When to build Microservices or a Modular Monolith?

    Why would you build a (modular) monolith instead of a microservice? Often people jump on a hype train or go for “resume-driven development” — because everyone needs microservices on their CV, right?

  • 23 min read

    The Lack of Tech Excellence in Agile Development

    There is a lot of talk about agile but unfortunately, most of the time organizations are not really agile, despite the fact they do for example Scrum and claim to be agile. This article will go over the issues I think we, as an industry, have with agile, what agile probably was meant to be and how to get to...

  • 1 min read

    iSAQB CPSA-F Certification Achieved

    I’m happy to share that I’ve achieved the Certified Professional for Software Architecture – Foundation Level (CPSA-F) from the iSAQB. The iSAQB (International Software Architecture Qualification Board) is an independent organization that defines and maintains certification programs for software architects.

  • 16 min read

    Most RESTful APIs aren't really RESTful

    When talking about REST, it is worth reading the dissertation of Roy Thomas Fielding. The original paper that describes RESTful web, “Architectural Styles and the Design of Network-based Software Architectures” Roy T. Fielding (2000), introduces the Representational State Transfer (REST) architectural style as a framework for designing scalable, performant, and maintainable networked systems, particularly web services.

  • 1 min read

    Cognitive Code Analysis: Now with a Churn Analysis

    I’m happy to announce that I’ve added churn analysis to my Cognitive Code Analysis tool for PHP!

  • 10 min read

    Designing Effective Error Messages

    Error Messages are simple, right? It’s just a message, isn’t it? Yes, but even an error message can and really should provide value for the person reading it in one way or another and then it suddenly isn’t that simple anymore. Good error messages are in fact a more or less complex topic and we should treat them as 1st...

  • 14 min read

    Frameworks, Architecture & Screaming Architecture

    This article explores how applications are often structured around frameworks rather than business needs and why this may not always be the best choice.

  • 14 min read

    Are the SOLID Principles problematic?

    The article attempts to define what a software principle is, how they should be used, if the SOLID principles are unambiguous and useful and if they are hard to understand and learn.

  • 8 min read

    Developers, Behavioral Changes and Decisions

    We’ve had an internal training with Emily Bache that I organized, and one of the refactoring exercises sparked a very interesting discussion from a behavioral change in the code.

  • 5 min read

    Approval Testing - An Approach for (not only) Legacy Systems

    I’m once again in a situation where I need to work with a ~14-year-old, organically grown system consisting of three larger applications and numerous smaller services (primarily AWS Lambda functions). The entire project began with just two people.

  • 6 min read

    Naming Matters: An Example

    Developers spend a lot of time reading and understanding code, actually much more than writing code. Readability and understandability of code are very valuable quality attributes, because it impacts development speed and therefore development cost. Understandability can be improved a lot by just naming things properly.

  • 5 min read

    The Optional Object (borrowed From Java): A Guide to Handling Null Values Gracefully

    In software development, dealing with null values is a common source of bugs and errors. The Optional object, popularized by Java 8, offers a way to handle null values gracefully, reducing the risk of NullPointerException. While we do not have the risk of a NullPointerException in PHP, the optional still provides benefits. This guide adapts the concept for PHP, demonstrating...

  • 7 min read

    Working Remote for 20 Years

    This is my experience after working 20 years remotely and the need to find a new remote job.

  • 12 min read

    The Limits of Human Cognitive Capacities in Programming and Their Impact on Code Readability

    Programming is both a technical and cognitive task. While technical skills and knowledge are essential, cognitive abilities play a critical role in how effectively a developer can write, read, and understand code. Understanding the limits of human cognitive capacities can help software architects and developers design code that is more readable, maintainable, and less error-prone.

  • 4 min read

    Event Sourcing Library Release

    I’ve been working on an event sourcing library for some time now and I think it is time to release it.

  • 3 min read

    Problem Details for HTTP APIs: RFC 9457

    If you designed APIs before, you probably have had the problem as well, to define how an error response should look like. Usually some HTTP Status codes are defined for certain outcomes and when it comes to the response body you have to get creative.

  • 8 min read

    Write high-quality tests with Mutation Testing

    At its core, mutation testing endeavors to assess the efficacy of a test suite by simulating alterations in the codebase. These alterations, termed mutations, typically involve small, deliberate modifications to the source code, such as changing operators, swapping variable assignments, or altering conditional statements. The overarching goal is to evaluate whether the existing tests possess the acumen to detect and...

  • 6 min read

    The DDD Trap

    This article tries to address an observation I’ve made, that there are many articles, at least in the PHP world, that claim to be DDD, but that most of those articles actually miss 85% or more of what DDD really is: the modeling process. The code part that most articles talk about is the implementation of a long process that...

  • 8 min read

    Simple but useful: Use Case Tables

    During my work I faced the problem, that in communication with product managers, there was often no unified format in which information was communicated.

  • 8 min read

    About Validation and Anti Corruption Layers

    There is a surprisingly large number of people, at least in the PHP world, who haven’t seemingly heard of or thought about when and where to put constraints on their program. Often there are DB entities that are sharing the validation with the input validation and have no clear boundary.

  • 4 min read

    Why is Open Source more agile in fixing bugs?

    When Oracle, Microsoft or Apple needs weeks to fix things or has a fixed schedule for patch releases, a lot people like to make fun about those companies. Some are even going that far to call those companies incompetent. I do not think that this is reasonable and justified.

  • 5 min read

    Why don't you just replace that old thing?

    Sometimes people are very eager and quick to say “Just replace X!” but don’t consider the deeper implications of changing an integral part of a companies system. This article was inspired by a statement mate recently by someone stating this:

  • 5 min read

    Result Objects vs simple Return Types

    Result objects and simple return types serve different purposes, and their advantages depend on the specific use case and design goals. As usual in software architecture there will be trade offs.

  • 16 min read

    AI Guided Code Refactoring

    With the rise of AI tools, especially ChatGTP it has become an interesting topic how and if AI can be used to write or refactor code. Here is a little experiment on how well ChatGPT can refactor code to make it easier to understand and therefore to maintain and reduce the cost.

  • 3 min read

    ChatGPT Initialization Prompt for Developers

    ChatGPT has some annoying habits like telling you that it is an AI and sometimes uses fancy expressions. This can be funny sometimes but for getting technical tasks, it is not desired. You can control ChatGPTs behavior a little by properly initializing it with some rules of what it should do and what not.

  • 7 min read

    Exceptions - good or bad?

    Exception-driven development, also known as “throw first, ask questions later”, is considered a bad practice. This article will provide a list of reasons when exceptions are bad and why you should not use them without a good reason.

  • 4 min read

    CakePHP3: A new PSR7 Middleware Authentication

    Let’s start with some background story on this topic. One of the parts of the CakePHP framework I like the less is the authentication and authorization. There are a few reasons why. For example, the authentication and authorization. Firstly, both authentication and authorization have been married through the AuthComponent, secondly, the component is an ugly monolith that is coupled to...

  • 4 min read

    Complex Rules in CakePHP3

    I had a pretty interesting task recently. We have profiles that must implement certain constraints depending on what kind of profile / product the client purchased. So a profile can have a specific number of languages depending on the constraints. This means we need to validate the number of languages an user has picked by a value from another database...

  • 3 min read

    CakePHP and Angular Pagination

    It is actually pretty easy to make your RESTful calls in CakePHP paginateable by using what the Paginator Component already offers us and using Angular UI Bootstrap Paginator on the client-side code. On our server side, we just use the built-in serialization of CakePHP to generate the response. This is an example of a CakePHP controller index() method that is...

  • 3 min read

    CakePHP3 i18n Language inside the URL

    In CakePHP 2.x it was pretty cumbersome to get the language across all pages into the URL. With CakePHP 3 it is just awesome and easy. You can now create persistent URL parameters.

  • 6 min read

    Social graph connections

    On Stackoverflow the user Marin was asking this question, which sparked my interest as well.

  • 4 min read

    Callbacks In Cakephp Forms Using Events

    If you ever have the need to inject fields or other things into a form, for example when building a blog or CMS system, you can use the event system that comes with CakePHP. The basic concept can be used everywhere within the views and is not limited to forms only, but a form is a good example.