<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Fabian Letsch</title>
    <description>The latest articles on Forem by Fabian Letsch (@anoian).</description>
    <link>https://forem.com/anoian</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3812208%2F5516eeac-0377-4d21-993f-780932acc27b.png</url>
      <title>Forem: Fabian Letsch</title>
      <link>https://forem.com/anoian</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/anoian"/>
    <language>en</language>
    <item>
      <title>Clean Code Is a Lie</title>
      <dc:creator>Fabian Letsch</dc:creator>
      <pubDate>Wed, 01 Apr 2026 22:26:59 +0000</pubDate>
      <link>https://forem.com/anoian/clean-code-is-a-lie-1f3j</link>
      <guid>https://forem.com/anoian/clean-code-is-a-lie-1f3j</guid>
      <description>&lt;p&gt;Few books have influenced everyday software development as much as &lt;em&gt;Clean Code&lt;/em&gt;. It taught a generation of engineers to value readability, naming, small functions, and clarity. I learned from it too, and, like many others, I tried to apply its principles wherever I could.&lt;/p&gt;

&lt;p&gt;But the broader message behind it is often taken too far. Readability is not the main goal of software engineering. It is a tradeoff. And once a tradeoff is turned into a rule, like the book does many times, the outcomes start to suffer. Code is not automatically better because it reads nicely. Sometimes the more complex, repetitive, or unabstracted solution is the better one. Not because readability does not matter, but because it is only one constraint among many.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything Is a Tradeoff
&lt;/h2&gt;

&lt;p&gt;If readability were the highest goal in software engineering, TypeScript would beat C++ in many cases. But nobody seriously argues that game engines, databases, rendering pipelines, or embedded systems should be written in TypeScript just because it reads more nicely. Why? Because engineering is not about maximizing readability. It is about balancing constraints.&lt;/p&gt;

&lt;p&gt;The same is true of almost any coding principle. Avoiding duplication (DRY) within immature code can lead to wrong abstractions. Immutable data can use more memory. Reusable code can be harder to change. No coding principle is universal. Whether it helps or hurts depends on the situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read It Anyway
&lt;/h2&gt;

&lt;p&gt;So why is &lt;em&gt;Clean Code&lt;/em&gt; a lie? Because clean code does not exist, only code that makes good tradeoffs, and readability might be one of them. To make things clear, I still think &lt;em&gt;Clean Code&lt;/em&gt; is worth reading, just as many other books and paradigms are worth learning. But don't treat what the book says as laws that always apply, because they don't.&lt;/p&gt;

&lt;p&gt;What makes someone a good engineer is not how strictly they follow one philosophy, but how well they understand the tradeoffs they are making.&lt;/p&gt;




&lt;p&gt;Don't forget to follow me if you found this take interesting and want to see my next one!&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Delivering Quality Software at Breakneck Speed</title>
      <dc:creator>Fabian Letsch</dc:creator>
      <pubDate>Sat, 21 Mar 2026 23:46:25 +0000</pubDate>
      <link>https://forem.com/anoian/delivering-quality-software-at-breakneck-speed-4464</link>
      <guid>https://forem.com/anoian/delivering-quality-software-at-breakneck-speed-4464</guid>
      <description>&lt;p&gt;After working at three startups, I’ve learned that the real challenge is not moving fast. It is moving fast without creating chaos. When quality drops too far, speed stops being an advantage and starts turning into tech debt, bugs, frustrated customers, and lost revenue.&lt;/p&gt;

&lt;p&gt;Startups usually accept this trade-off. They “move fast and break things” and ship “80/20 solutions.” That is often the right business decision, especially in highly competitive markets, where you need the advantage of innovating first. But I believe teams can &lt;strong&gt;“move fast and break less”&lt;/strong&gt; if they are intentional about how they work.&lt;/p&gt;

&lt;p&gt;The problem is that many practices that improve quality also add friction. TDD, broad test coverage, and having multiple PR reviewers can all be valuable and can even save time in the long run. But in fast-moving environments, some of these investments do not pay off quickly enough. And if a team is already struggling to keep up with one reviewer, requiring two is not realistic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So the question becomes: how do you deliver quality software at breakneck speed?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Short Feedback Loops
&lt;/h2&gt;

&lt;p&gt;The earlier a problem is detected, the cheaper it is to fix.&lt;/p&gt;

&lt;p&gt;A bug caught while a developer is still typing is almost free. In code review, the cost is higher. In QA, higher again. And if a customer is the one who finds it, the cost is at its peak: more process kicks in, unnecessary communication follows, the developer has to rebuild their mental model of the code, and the customer loses trust.&lt;/p&gt;

&lt;p&gt;Thats why short feedback loops matter so much. They improve quality while actively removing overhead.&lt;/p&gt;

&lt;p&gt;For this reason I invest heavily in tooling like strong typing, linting, and static analysis. If a problem can be detected directly in the editor, it should be.&lt;/p&gt;

&lt;p&gt;For example, I once added a lint rule that detects when an icon is used as the only child of a button and suggests using the &lt;code&gt;IconButton&lt;/code&gt; component instead. That moves feedback from code review or design QA directly into the editor and prevents accessibility and design issues before they ship.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Pragmatism
&lt;/h2&gt;

&lt;p&gt;To me, being pragmatic means solving the problem in the clearest and simplest way possible.&lt;/p&gt;

&lt;p&gt;Complexity kills both speed and quality. &lt;a href="https://fabianletsch.de/blog/being-smart-is-painful/" rel="noopener noreferrer"&gt;If code is unnecessarily hard to understand&lt;/a&gt;, changing it takes longer, and mistakes become more likely.&lt;/p&gt;

&lt;p&gt;A seasoned developer has many tools in their toolbox: complex type systems, microservices, abstractions, SOLID principles, design patterns, and more. These tools are not bad, but using them is expensive. They only pay off when they actually fit the problem and when the problem is stable enough. In a greenfield project, that often is not the case. Requirements may change again next week.&lt;/p&gt;

&lt;p&gt;The question you should always ask yourself is: &lt;em&gt;“What is the simplest solution that is good enough?”&lt;/em&gt; not &lt;em&gt;“What is the most elegant way to solve this?”&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Clear ownership
&lt;/h2&gt;

&lt;p&gt;Many quality problems are caused by ambiguity.&lt;/p&gt;

&lt;p&gt;A typical example: someone posts in the group chat, “I found bug X.” Then what happens? Sometimes two people start looking into it. Sometimes nobody does. Sometimes everyone assumes someone else will handle it, and in the end it lands in production, moving the feedback loop even further to the right. That is wasted time, avoidable confusion, and lower product quality.&lt;/p&gt;

&lt;p&gt;Whether it is a bug, a feature, or just something somebody noticed, if it is worth mentioning, then somebody should be responsible for driving it to the next reliable state: building it, fixing it, assigning it, prioritizing it, or explicitly deciding not to act on it yet.&lt;/p&gt;

&lt;p&gt;This does not mean that whoever notices a problem must always solve it personally. It means they should not let it remain unowned. If ownership is handed over, that handoff should be explicit. If you cannot name the person you handed ownership to, then you did not do it properly.&lt;/p&gt;

&lt;p&gt;Clear ownership improves quality because issues are less likely to be forgotten, and it improves speed because it prevents duplicate work.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Automation
&lt;/h2&gt;

&lt;p&gt;Software drifts unless something pushes back. Standards fade, steps get skipped, and “we usually do it this way” slowly turns into inconsistency.&lt;/p&gt;

&lt;p&gt;That is why I do not put too much trust anymore in rules that live only in documentation, PR review reminders, or team habits. If a rule is not enforced, it is only a suggestion. And suggestions do not survive pressure.&lt;/p&gt;

&lt;p&gt;Automation is powerful because it does more than save time. It fights entropy. It turns standards from something people should remember into something the system consistently enforces.&lt;/p&gt;

&lt;p&gt;This is why I like linters, CI checks, and static analysis tools. They enforce standards reliably: dead code gets removed, &lt;code&gt;IconButton&lt;/code&gt; gets used for icon-only buttons, and referenced translation keys must exist.&lt;/p&gt;

&lt;p&gt;I also like AI code reviews as an additional layer in pull requests. They are less deterministic than lint rules or CI checks, but they can still catch suspicious patterns, missing context, and edge cases that humans might miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Quality and speed are not enemies, but they do require trade-offs. In fast-moving environments, you rarely get quality and speed from heavy engineering processes. &lt;strong&gt;You get them by making quality cheap to enforce.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For me, that comes down to four things: shortening feedback loops, being pragmatic, creating clear ownership, and automating what should not depend on memory or discipline.&lt;/p&gt;




&lt;p&gt;Don't forget to follow me if you want to receive my next post :)&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>automation</category>
      <category>startup</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>AI Made Me Hate My Job… Then I Found New Joy</title>
      <dc:creator>Fabian Letsch</dc:creator>
      <pubDate>Sat, 07 Mar 2026 23:02:21 +0000</pubDate>
      <link>https://forem.com/anoian/ai-made-me-hate-my-job-then-i-found-new-joy-5gon</link>
      <guid>https://forem.com/anoian/ai-made-me-hate-my-job-then-i-found-new-joy-5gon</guid>
      <description>&lt;p&gt;A few weeks ago, we had a regular company meeting. Nothing dramatic, until my boss said: “We should use way more AI for software development. We need to speed up.”&lt;/p&gt;

&lt;p&gt;It makes sense. I get it.&lt;/p&gt;

&lt;p&gt;Still, I felt this heavy drop in my stomach. I was afraid that AI would replace the part of me that loved this job.&lt;/p&gt;

&lt;p&gt;Because I absolutely love to write the code myself! I love the struggles, thinking the solution through, finding all the places I have to consider, and then, at the end, feeling like Einstein himself when it’s finally working.&lt;/p&gt;

&lt;p&gt;Also, AI does so many stupid things: It forgets to update related files. It “helpfully” invents patterns inconsistent with the codebase. It tries to complete the task, but it doesn’t realize when the task itself doesn’t make sense. It writes plausible tests that assert the wrong behavior. The ways AI can mess up are infinite!&lt;/p&gt;

&lt;h2&gt;
  
  
  People Don’t Pay for Code. They Pay for Outcomes.
&lt;/h2&gt;

&lt;p&gt;And yet… on a good day, it saves me hours, and honestly, people do not pay me for being someone who codes or for having fun at work. The customer pays me for solving their needs. Management pays me for building a product that sells.&lt;/p&gt;

&lt;p&gt;I started to notice a subtle resentment building up. I could see the direction clearly: less time for careful thinking, less pride in the craft, more pressure to “just ship,” and my role drifting from builder to operator.&lt;/p&gt;

&lt;p&gt;For the first time in years, I caught myself thinking: If this is the future of my work, will I still want to do it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Onto a journey to find Joy
&lt;/h2&gt;

&lt;p&gt;I was recently on vacation and had time to step back and think. I realized that if AI is going to handle most of the actual coding, then there must be other things that can be fun, I mean my colleagues who do not code at all seem to enjoy their work. So I decided to look for the things that make me enjoy my work besides coding, and I found plenty!&lt;/p&gt;

&lt;h3&gt;
  
  
  Joy #1: Solving Real Problems for Real People
&lt;/h3&gt;

&lt;p&gt;Taking ownership in not just the code, but the product you are building puts you right back at the driver’s seat. Helping someone, clarifying what they truly need, and shipping something that makes their day easier still feels deeply satisfying. And it’s meaningful to challenge assumptions, because it actually makes a difference to build the right thing, even if you are not building it by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Joy #2: AI Craftsmanship
&lt;/h3&gt;

&lt;p&gt;I always thought that using AI means my own acquired knowledge and craftsmanship just was replaced, but in actuality it also is real craftsmanship to use AI well. Instead of trying to be better at my original craft, I can instead try to become better at producing with AI. I can gain knowledge and experience in setting constraints, feeding it the right context and giving it the right tools. If AI is going to stay, then I better become one of the best at using it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Joy #3: Ensuring Quality
&lt;/h3&gt;

&lt;p&gt;AI can write a lot of wrong code really fast. It can make wrong architecture decisions or write something in a thousand lines when it shouldn’t be more than a hundred. That’s why I’ve started finding joy in quality ownership. One way to do that is going through a proper research and planning phase with the AI, asking it for solution proposals and then making an implementation plan together. Another is to do proper code reviews, catching issues early before the customer has to. As a German, I’ve always resonated with the craftsmanship mindset: precision, reliability, and doing things right even when nobody is watching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;AI increased my throughput, but it also changed what feels meaningful and enjoyable about my work. I’m learning to shift my identity from “writer of code” to “builder of product outcomes” and this can also be a lot of fun.&lt;/p&gt;

&lt;p&gt;The joy didn’t disappear. It changed its location.&lt;/p&gt;




&lt;p&gt;If you enjoyed this post, don't forget to follow me. Thank you for reading :)&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
