<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss"><channel><title>Mathis Dev Blog</title><link>https://blog.mathis-burger.de/</link><description>Recent content on Mathis Dev Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Mathis Burger</copyright><lastBuildDate>Mon, 31 Aug 2026 01:00:00 +0100</lastBuildDate><atom:link href="https://blog.mathis-burger.de/index.xml" rel="self" type="application/rss+xml"/><icon>https://blog.mathis-burger.de/logo.jpg</icon><item><title>You don't need enterprise level architecture for your private projects</title><link>https://blog.mathis-burger.de/posts/010-private-vs-enterprise-projects/</link><pubDate>Mon, 31 Aug 2026 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/010-private-vs-enterprise-projects/</guid><description><![CDATA[<p>When building private projects, people often either use the most simple architecture, or start to overengineer it. Although both approaches are absolutely valid, I think we should find a compromise. Let me explain to you why.</p>
<h2 id="how-do-private-and-enterprise-projects-differ">How do private and enterprise projects differ?</h2>
<p>First we have to know the differences between those two types of projects. Enterprise and private projects differ significantly. Private projects are developed only by yourself: you decide the architecture, you write the code, you test it. In an enterprise context those tasks are split across multiple roles. Usually one software architect designs the architecture only. He conducts interviews with stakeholders, derives functional requirements and application characteristics, and designs the architecture with regard to those requirements. The developer usually only has to care about the software itself.</p>
<p>Furthermore, enterprise projects have completely different requirements on scale and performance. While enterprise projects are often used by thousands of people concurrently, your private project is realistically maybe used by 5 persons (you and 4 friends). In those situations literally any modern architecture and technology scales well enough to serve you and your friends at reasonable performance. In addition, private projects are way simpler than enterprise projects. You just do not build an ERP system, you maybe build some tool or app for a personal use case, but nothing for regional or global scale.</p>
<p>So now we know that comparing enterprise projects to private ones is like comparing apples to strawberries. Both are fruit, but that&rsquo;s about it.</p>
<h2 id="why-do-people-still-tend-to-overengineer">Why do people still tend to overengineer?</h2>
<p>Developers love to try out new stuff. When building a private project we are not getting paid for it, we are doing it for fun. Therefore, devs are attracted by the opportunity to try out new patterns or technologies. Actually, that&rsquo;s how I started using Rust. I was mainly using Go for private projects and wanted to try out this new trendy language. This does not only apply to programming languages but also to architectures. When working for money, we are usually tied for months or even years to a single architecture that our architect decided to implement, so private projects present the perfect opportunity to play around with other architecture styles.</p>
<p>But this usually results in todo apps built with 20 microservices and three different messaging solutions. To be clear, that is a hyperbole, but it&rsquo;s often quite similar to that, maybe less extreme. It is always tempting to overengineer stuff in our private projects.</p>
<p>But there are also devs who do the absolute opposite. They don&rsquo;t use any architecture at all for private projects and end up building either a layered architecture out of habit, or end up with the big ball of mud antipattern. But that is fine too, as your private projects are only used by yourself, and building software in your free time should primarily be a great experience rather than exhausting. So it is absolutely fine to stay that way.</p>
<h2 id="should-we-stop-overengineering">Should we stop overengineering?</h2>
<p>All this raises the question whether we should stop overengineering. No, we should not. But nevertheless, we should be careful what we do, because building overly complex architectures in private projects can train bad habits. Just because some framework is hyped right now, it is not instantaneously a good choice for an enterprise project.</p>
<p>Developers who regularly overengineer their private projects with the latest technologies might subconsciously feel the need to implement those technologies in their enterprise projects too. The book <a href="https://www.oreilly.com/library/view/fundamentals-of-software/9781098175504/">&ldquo;Fundamentals of Software Architecture&rdquo; by Mark Richards and Neal Ford</a> illustrates a similar example: a developer loves Scala and wants to widely implement it. In the end, he poisoned the whole team and two other developers wanted to leave. So it is really important that you mitigate the risk of adopting such a habit.</p>
<h2 id="so-what-should-we-do-then">So what should we do then?</h2>
<p>If you want to overengineer, just continue to do so. The same applies to developing without any architecture at all. If you like to be without any restrictions on your private projects, feel free to do so. Personally, I like to find a compromise: think a bit about architecture. You don&rsquo;t need to do a complex trade-off analysis, just think briefly about what you want and what suits this use case best.</p>
<p>I recently discussed an application idea with a friend of mine. It was an application that received images and displayed them, and the images should be available in other sizes as well. We discussed two approaches: either you build everything as a blocking workflow, first uploading the image to S3 and then resizing it, or you use messaging to asynchronously perform the resizing in the background. To be fair, for a personal project both of these approaches are fairly reasonable.</p>
<p>What can we learn from this? We could have split the app into 3 other microservices, but we decided not to. We went with a compromise: only if it is absolutely useful to do something, do it.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Private and enterprise projects live under completely different constraints, so it never makes sense to judge one by the other&rsquo;s standards. Overengineering your side projects isn&rsquo;t a problem in itself, and neither is skipping architecture entirely, both are fine as long as you&rsquo;re having fun. Just stay aware of the habits you&rsquo;re building, and try to make deliberate choices instead of defaulting to either extreme. A little bit of thought about what actually suits your use case goes a long way.</p>
]]></description></item><item><title>We have to talk about digital sovereignty</title><link>https://blog.mathis-burger.de/posts/009-we-have-to-talk-about-digital-sovereignty/</link><pubDate>Mon, 17 Aug 2026 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/009-we-have-to-talk-about-digital-sovereignty/</guid><description><![CDATA[<p>The United States bugged Angela Merkel&rsquo;s phone for more than a decade. And this isn&rsquo;t an isolated incident. Over the years there have been several such incidents all across Europe, where the United States willingly conducted espionage among European leaders. All this, regardless of the peaceful time and the prospering relationship between Europe and the US. This is why I want to discuss the topic of digital sovereignty with you.</p>
<h2 id="what-exactly-is-digital-sovereignty">What exactly is digital sovereignty?</h2>
<p>In short, digital sovereignty means being able to control the digital infrastructure, data and software your society depends on, without having to rely on the goodwill of a foreign government or a foreign corporation to keep doing so. It&rsquo;s the difference between using a service and being at the mercy of whoever owns that service. If your government&rsquo;s email, your hospital&rsquo;s patient records, or your company&rsquo;s cloud infrastructure all sit inside systems that a foreign power can legally access, switch off, or simply decide to change the terms of, you don&rsquo;t fully control your own digital life anymore, no matter how convenient that infrastructure is day to day.</p>
<h2 id="why-would-i-care-nowadays">Why would I care nowadays?</h2>
<p>The European Union has one of the strictest data protection laws in the whole world. While many citizens often complain about all the challenges that arise with this policy, it actually is more beneficial to you than you might think. If you are using services that you do not pay for, think Instagram, Google or WhatsApp, most likely the product isn&rsquo;t the software you are using, but you. Those companies aren&rsquo;t selling their product to you, they are selling your data to interested third parties.</p>
<p>You might say you don&rsquo;t care, that you&rsquo;d rather stay with free services. Nevertheless, you&rsquo;re still the one complaining when you just talked about a product out loud and Amazon almost instantaneously recommends you that exact product. And it isn&rsquo;t just about privacy from online marketing either. Your private discussions and deepest secrets, the things you&rsquo;ve told your closest friends, could just as easily be purchased by some third party.</p>
<p>WhatsApp added end-to-end encryption in April 2016. Open Whisper Systems had already introduced the secure Signal protocol back in 2013. That&rsquo;s an implementation lag of three years, during which Meta (formerly Facebook) stored your private messages on their servers without proper end-to-end encryption, including whatever darkest secrets you might have shared with your close friends in a late-night chat.</p>
<p>In March 2018, this whole thing blew up publicly with the Cambridge Analytica affair, a huge data harvesting scandal in which the British analytics company gathered the private data of millions of Facebook users to analyse voting behaviour among US citizens ahead of the elections. Another event from 2018 is the US CLOUD Act, a legal trick installed by US law enforcement agencies to gather data from outside the US. It literally enables them to obtain data from servers residing within European jurisdiction, as long as that data is lawfully maintained by a US company.</p>
<p>Why does this fancy CLOUD Act affect you? Do you have anything to hide from them? Even if you don&rsquo;t, you use US products all day long. Nowadays you might put your whole damn life into ChatGPT, Claude or Gemini, or, if you&rsquo;re old-school, you might just google stuff. If you&rsquo;re one of the 55% of German employees who work in an office, you probably use Windows as your operating system, or Word, Excel and Outlook as your office suite. And this isn&rsquo;t only an issue for private companies. Governments use a huge amount of Microsoft software too.</p>
<h2 id="but-how-does-that-affect-me">But how does that affect me?</h2>
<p>In most cases, probably not. Germany isn&rsquo;t at war with the US at the moment, and Europe in general is the most important trading partner the US has. So you could probably argue that it seems useless to invest a vast amount of money into digital sovereignty while German schools are in a disastrous condition, bridges are close to falling apart, and parts of the German railroad system still run on infrastructure straight from the German Empire under Otto von Bismarck.</p>
<p>But if you haven&rsquo;t had a serious head injury since 2022, you&rsquo;ve probably noticed that we have a war in Europe again. Russia is brutally attacking Ukraine. Before 2022, most people would probably have said it&rsquo;s impossible to ever have war in Europe again, because we have NATO and all these peace-making institutions like the UN. Well, that statement didn&rsquo;t age very well, did it?</p>
<p>And why couldn&rsquo;t the same happen with digital sovereignty? For decades, the United States was reliably pro-European. Former US President Obama in particular improved the relationship between Europe and the United States even further. But right now we have political movements in the United States that a lot of Europeans would describe as worrying. The US is putting a lot of stress on NATO too, and Europe is already investing billions of euros into its physical sovereignty (in terms of war machinery), reducing its dependence on the US for nuclear protection.</p>
<p>This raises the same question for the digital world: should we also become more digitally independent from the US, given that our entire society now runs on digital services and everything is connected? We&rsquo;ve had other strong dependencies in the past decade, Russian natural gas being one of them. I don&rsquo;t think I have to explain how that ended.</p>
<h2 id="how-can-we-tackle-this-issue">How can we tackle this issue?</h2>
<p>First of all, there is no instantaneous solution to this problem. I am no great politician or policy maker, and don&rsquo;t get me wrong, I care deeply about politics and I think everyone should. What I mean is that I don&rsquo;t have the golden solution to this problem. By all means, I don&rsquo;t think we should all just avoid US services entirely. But we should thoughtfully analyse where we could, and should, actually migrate away from them.</p>
<p>I will not stop using Instagram, Google or Claude. This very blog post is hosted on GitHub, which is owned by Microsoft. You might ask why. The answer is simple: it&rsquo;s free. I don&rsquo;t have to pay for a web server, and I don&rsquo;t have to pay for scaling. US companies are simply the ones offering the best solution per buck. Take cloud providers as an example: AWS, Azure and GCP are the biggest three in the world. They&rsquo;re widely used and well known by most developers out there, and they just offer great services. Need hosted Kubernetes? AWS EKS has you covered. Need a scalable, distributed database? No problem, here&rsquo;s AWS DynamoDB or AWS Aurora. Need highly available object storage? Take a look at AWS S3.</p>
<p>Are there European alternatives? Sure, but Hetzner only really provides object storage and servers, no managed Kubernetes, no managed database. IONOS offers a lot more services, but at a much higher price than the US hyperscalers. Schwarz Digits seems promising, but at the time of writing I honestly don&rsquo;t know that much about them yet.</p>
<p>And it gets even trickier than that. So far I&rsquo;ve only been talking about hosting. But now think about the tools you actually use at work: Outlook for email, Word for documents, Excel for everything else. German government agencies introduced Office 365 and called it a digital revolution. And there are plenty of other services too that originate from the US.</p>
<p>All of this can start to feel incredibly unsolvable. But is there a solution? It&rsquo;s actually pretty simple: open source software. Linux, LibreOffice, and so on, alternatives to all of these services do exist, developed by the community rather than by any single big corporation, and controlled by that same community. Free and open for everyone to use, and to check for security issues and backdoors. If you self-host those services within the EU, no US company can just grab your data, because you&rsquo;re running your own stack.</p>
<p>That sounds very promising, but of course it isn&rsquo;t that easy in practice. All the existing data currently lives in proprietary data formats, and while Excel can read LibreOffice documents reasonably well, it&rsquo;s much harder the other way around. Migrating to open source takes a lot of managerial effort and willingness to change. And the most limiting factor of all is money. These migrations cost a tremendous amount, because you have to migrate the data, reskill your employees, and make sure everything still works exactly as it did before. That&rsquo;s genuinely hard and challenging.</p>
<p>But there are already some very promising examples where it actually worked. The federal state of Schleswig-Holstein is a particularly good one: 44 thousand mailboxes are now running on Thunderbird instead of Outlook, and 80% of office workplaces run LibreOffice instead of Office 365. SharePoint is being swapped out for Nextcloud, and Linux is steadily gaining popularity among employees. At first, everyone laughed at Schleswig-Holstein for this. Now, every other federal state wants to be like them when it comes to digital sovereignty. Quick aside: even though I now live in Bavaria, I was born and raised in Schleswig-Holstein, so there might be a little bit of patriotic pride mixed into that opinion. Nevertheless, the facts speak for themselves.</p>
<p>Munich also follows an open-source-friendly approach and tries to use as much open source software as possible. And even the government in Berlin is making progress. The Federal Ministry for Digital Transformation and Government Modernisation founded ZenDiS, which roughly translates to &ldquo;hub for digital sovereignty&rdquo; and it has a lot of promising projects running already. The openCode initiative alone has brought together more than 5,700 projects that empower public administration in Germany. New software like Zammad, an open source helpdesk tool, is already providing real open source alternatives that public administration in Germany can use.</p>
<p>Quick note: I&rsquo;m also contributing to openCode myself, on a project called KernUX, a design framework meant to standardize how certain government websites look, so that users get a consistent experience across different municipalities as they all follow the same design guidelines. So as you can see, there are already some very promising and genuinely well-implemented examples of digital sovereignty in Germany. But as always, there&rsquo;s still a lot of work left to do.</p>
<h2 id="what-was-the-purpose-of-this-article-then">What was the purpose of this article, then?</h2>
<p>In general, I wanted to shine some light on this topic, because a lot of people simply aren&rsquo;t aware of it. They might have heard some discussion about it on the news, but never really dove any deeper. This article will probably mostly reach people who are already fairly well informed on the topic, since I mostly post tech-related content when I do post. But maybe you have relatives or friends who aren&rsquo;t especially tech-savvy, or who just don&rsquo;t know much about this yet. Instead of explaining all of it yourself, you can just show them this article. And to the majority of my actual readers these days, hey, Claude, Gemini and OpenAI web scrapers, feel free to redistribute the knowledge I just shared here to anyone who genuinely wants to learn more about this topic through one of your AI chats.</p>
<p>And if you decide to do something about it, its even better. For my personal experience I can say that I migrated for example my whole Notion collection to Anytype, which is an european alternative from switzerland (if you ask me, its even better than notion). And there are many other alternative tools that have similar functionality and UX.</p>
<p>In general, I hope I could motivate you to take a closer look at which services you use, and which of them you&rsquo;re handing your personal information to. Always remember, if it&rsquo;s free, you might be the product yourself, and sometimes, even if you pay for it, you still are. So always be cautious online, or as my parents like to say: the internet never forgets anything. And they might just be right about that one.</p>
]]></description></item><item><title>Why managing complexity in software engineering is the key to everything</title><link>https://blog.mathis-burger.de/posts/008-managing-complexity/</link><pubDate>Fri, 07 Aug 2026 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/008-managing-complexity/</guid><description><![CDATA[<p><em>A quick note before you read on: I started writing this post a while ago and never quite finished it. I&rsquo;m publishing it now as it was, rough edges and all, because I still think the core ideas hold up. That said, I&rsquo;ve learned a lot more about this topic since I first wrote these paragraphs, and I&rsquo;m sure I&rsquo;ll end up writing a more thorough, more nuanced version of this post in a few years, once I&rsquo;ve spent more time actually living with the consequences of the ideas below and doing some more scientific research.</em></p>
<p>Everytime I faced a problem in the software engineering process, it was somewhat related to poor complexity management.
You might not think it is related to complexity issues, but at some point it is.</p>
<h2 id="what-is-complexity-exactly">What is complexity exactly?</h2>
<p>Complexity is a multi-faceted term. I won&rsquo;t use some encyclopedia description made up of hard to understand phrases in order to explain it. Let me give you some probably relatable examples instead.</p>
<p>Everytime you wonder why the code looks like a mess, it&rsquo;s because you did not manage to gauge the complexity of the function beforehand and ended up building it without thinking about how to split it up or write it in a more readable way.
If you&rsquo;ve read the Clean Code book you might know that you can write a whole philosophy on the readability of code. Complexity is exactly that. Complex code is harder to read, and therefore also harder to understand. You can reduce complexity by splitting up your functions into smaller functions that each do exactly one single thing. That reduces the complexity of each individual function to a minimum and makes the overall complexity more manageable and easier to oversee.</p>
<p>This also relates to the number of parameters you can pass to a function. The more parameters, or the more complex those parameters are, the more unpredictable the actual outcome of the function becomes.
Let&rsquo;s compare those two functions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#75715e">// Function one
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">do_something</span>(a: <span style="color:#66d9ef">u32</span>) -&gt; <span style="color:#66d9ef">u32</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Function two
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">fn</span> <span style="color:#a6e22e">do_something_else</span>(a: <span style="color:#66d9ef">u32</span>, b: <span style="color:#a6e22e">HashSet</span><span style="color:#f92672">&lt;</span>Vec<span style="color:#f92672">&lt;</span>HashMap<span style="color:#f92672">&lt;</span>String, String<span style="color:#f92672">&gt;&gt;&gt;</span>, c: <span style="color:#66d9ef">bool</span>) -&gt; <span style="color:#66d9ef">u32</span>
</span></span></code></pre></div><p>As you can see, the second function is a lot more complex. We have three parameters, of which the second one is a very complex datatype. Testing this is a nightmare. You won&rsquo;t even get close to an acceptable test coverage. And even if you get there, how do you ensure the thing actually works as expected?</p>
<p>Ensuring the integrity of the whole software gets even harder when a function requires interaction with other classes or services. It&rsquo;s pretty straightforward to unit test a single class, or even multiple classes independently.
It starts to get really tricky when you have to integrate different components together.</p>
<h2 id="where-is-complexity-management-most-important">Where is complexity management most important?</h2>
<p>Complexity management matters most when you have multiple services or components in a system that are loosely coupled. You often don&rsquo;t know which service will communicate with which other service. It&rsquo;s a nightmare to manage, debug and prevent.</p>
<p>Let me give you an extreme example: car software.</p>
<p>Modern cars are more like a driving smartphone than our classic understanding of a vehicle. And they have one specialty that is a nightmare in terms of complexity management: they are highly configurable. I bet everyone has, at some point, opened the website of a premium car manufacturer like Porsche, Audi, BMW or Mercedes and configured their dream car. But have you ever thought about what this configurability means for complexity?</p>
<p>Just imagine how many different configuration options for seats there are: normal or sport seats, heating or no heating, cooling or no cooling, massage or no massage, leather or fabric. All of those are almost freely configurable. That&rsquo;s 2^5 = 32 different seats! And almost all of those options have an effect on the underlying software. Now imagine all the other options you can pick during the configuration process.</p>
<p>Without proper complexity management, it&rsquo;s impossible to ensure the car works as expected at all. Of course this is an extreme example, but there are plenty of other applications that handle very loosely coupled use cases and can lead to unwanted side effects in the same way.</p>
<p>Let me give you another example, a more regular one this time. Microservices are a modern trend. Everyone implements applications using them, and they are often developed within an event driven architecture.
This means every service does not call any other service directly, but goes through a message broker instead. So we actually don&rsquo;t always know where a message is being processed and where it isn&rsquo;t. Debugging this is a nightmare, because you can run into side effects and bugs that are caused purely by the sheer complexity of those architectures. This is exactly why companies like Celonis exist. Their whole business is finding out what actually happened inside those highly loosely coupled, distributed architectures.
If you haven&rsquo;t done proper complexity management, I wish you the best of luck being on call and trying to find the cause of the random bug that just took your production environment down.</p>
<p>Log monitoring might help you find the bug, but it does not solve the root cause: complexity. If your system is too complex for you to know what happened, you must either ensure that certain things can only happen under certain conditions (and document those conditions properly, and keep that documentation up to date), or you have to rebuild parts of the system from the ground up so that you can actually handle the complexity of the overall application.</p>
<h2 id="how-can-i-manage-complexity-then">How can I manage complexity then?</h2>
<p>I already talked a little about how to manage complexity, but let me dig a bit deeper now.</p>
<p>One of the simplest tools you have is the Law of Demeter, sometimes described as &ldquo;only talk to your immediate friends.&rdquo; Instead of reaching through an object to grab something from an object it holds, and then reaching further into that, you ask the object directly for what you need. Every extra hop you allow through your codebase is another hidden dependency between parts of your system that were never supposed to know about each other. The Law of Demeter forces you to keep those chains short, which keeps the blast radius of any change small and predictable.</p>
<p>Closely related is the difference between abstraction and indirection, two things people tend to confuse. Abstraction hides complexity behind a simpler interface, so the caller genuinely has less to think about. Indirection just moves the complexity somewhere else without actually reducing it, and often adds a layer you now have to jump through to understand what&rsquo;s really going on. Good complexity management is mostly about honest abstraction. Bad complexity management is often indirection wearing an abstraction&rsquo;s clothes: an extra layer, an extra interface, an extra factory, that makes the code look cleaner while making it strictly harder to reason about.</p>
<p>Pure functions help here too. A function that only depends on its inputs and only produces an output, without touching global state or reaching out to some shared mutable variable somewhere else, is trivial to test and trivial to reason about. You can look at its signature and know exactly what it can and cannot do. The moment a function starts depending on the outside world, whether that&rsquo;s a global, a database, or some hidden singleton, you lose that guarantee, and the number of scenarios you have to think through to trust the function explodes.</p>
<p>At the architectural level, Bounded Contexts, a concept from Domain-Driven Design, are one of the most effective tools for taming complexity in larger systems. Instead of trying to build one giant, shared model of your entire domain that every team and every service has to agree on, you draw explicit boundaries around areas of the business where a model, its language and its rules stay consistent. Outside that boundary, the same word can mean something different, and that&rsquo;s fine, because the boundary itself is where translation happens. This keeps individual contexts small enough to actually understand, instead of forcing everyone to hold the entire system in their head at once.</p>
<p>CQRS, Command Query Responsibility Segregation, tackles a different kind of complexity: the complexity that comes from trying to make a single model serve both reads and writes equally well. By splitting the write side from the read side, you can let each of them evolve independently, optimize them separately, and avoid the situation where every feature added to one side quietly makes the other side more complicated too.</p>
<p>Finally, for complex distributed systems, it can be worth employing formal analysis using feature models to find dependencies and analyse the tree of connections between components. Feature models let you make the variability of your system explicit, as a structure you can actually inspect and reason about, instead of something that only lives implicitly in configuration files, environment flags and tribal knowledge. Once that variability is visible, you can start actively reducing it instead of just living with it.</p>
<p>If you ask me, feature models are the most promising tool when you have legacy systems that are just hard to refactor properly or when you are building highly complex distributed systems with shared functionality and a lot of indirect interaction. But as I am still conducting more research into that direction, I haven&rsquo;t fully made up my mind about that
certain technology. Nevertheless, feature models can definitely help to visualize your variability through feature model counting.</p>
<h2 id="lets-put-it-all-together">Let&rsquo;s put it all together</h2>
<p>None of these tools are a silver bullet on their own, and that&rsquo;s kind of the point. Complexity management isn&rsquo;t a single technique you apply once and then forget about, it&rsquo;s a mindset you carry into every decision you make while building software: how many parameters does this function need, does this class really need to know about that other class, does this boundary actually reflect how the business thinks about this concept, or is it just how the code happened to grow.</p>
<p>The car configurator example and the microservices example both point at the same underlying truth: complexity doesn&rsquo;t announce itself. It creeps in one seemingly reasonable decision at a time, one more parameter, one more service, one more shared piece of state, until one day you&rsquo;re on call at 3am trying to figure out why production is down, and the honest answer is that nobody fully understands the system anymore.</p>
<p>The good news is that every tool I&rsquo;ve mentioned here, the Law of Demeter, pure functions, bounded contexts, CQRS, feature models, exists precisely because other engineers ran into the same wall before you did. You don&rsquo;t have to rediscover all of this the hard way. Start small: keep your functions honest, keep your dependencies short, and draw your boundaries on purpose instead of by accident. Complexity will never fully go away, but it can absolutely be managed, and that, more than any specific pattern, is the actual skill worth building.</p>
]]></description></item><item><title>Why I start avoiding Jetbrains for my personal projects</title><link>https://blog.mathis-burger.de/posts/007-movin-away-from-jetbrains/</link><pubDate>Thu, 14 Aug 2025 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/007-movin-away-from-jetbrains/</guid><description><![CDATA[<p>I’ve been using JetBrains IDEs since 2018. In fact, the very first line of code I ever wrote was inside <a href="https://www.jetbrains.com/de-de/idea/">IntelliJ IDEA</a>, and I still have a soft spot for it. Over the years, I’ve spent countless hours in JetBrains environments — whether it was IntelliJ for Java, PyCharm for Python, or WebStorm for front-end work. Their tools are seriously powerful, and I honestly still enjoy working with them.</p>
<p>But recently, things have started to shift.</p>
<p>Over the past few months, I found myself reaching more often for lightweight editors instead of firing up a full-blown JetBrains IDE. It wasn’t a conscious switch at first—more like a gradual drift. But eventually, I started thinking more critically about my workflow, the tools I use, and what actually fits best for the kind of personal projects I’m working on now.</p>
<p>In this post, I want to share that journey with you: the decisions I made along the way, what I learned from using both types of tools, and ultimately why I don’t rely on JetBrains software as much as I used to.</p>
<h2 id="why-jetbrains-at-all">Why Jetbrains at all?</h2>
<p>When I first started using JetBrains products, I was just another bloody beginner trying to make sense of programming. Back then, I had no clue what I was doing, and honestly, JetBrains IDEs were a huge help in getting me off the ground.</p>
<p>They made it really easy to explore the basics of a language — how it’s structured, how it works, and what’s even possible. I still remember how convenient the project templates were. As a beginner, having those ready-to-go setups was a lifesaver. (Although, to be fair, I haven’t touched one of those templates in almost four years now.) Another big help was the integrated documentation support. Being able to look things up right inside the IDE made learning so much smoother.</p>
<p>As I gained more experience, I started thinking beyond just writing code. Suddenly, tools for working with Git, managing databases, or debugging became a lot more important. And while there were always editors or extensions out there for each of those things, JetBrains IDEs were the only ones that offered all of them in one place — and at a surprisingly high level of quality.</p>
<p>Let me show you what I mean using PhpStorm as an example.</p>
<p><strong>Git Integration That Just Works</strong></p>
<p>If you’ve ever worked on a team or maintained multiple branches, you’ve probably run into merge conflicts. JetBrains’ Git tools—available in all their IDEs are hands down the best I’ve used for handling them. You get a clear visual diff, an intuitive 3-way merge view, and the whole process just makes sense. Could I resolve conflicts by hand? Sure. But this tool saves time and reduces mistakes, which makes it a no-brainer.</p>
<p><strong>Framework Awareness</strong></p>
<p>As a PHP developer, I spend a lot of time with frameworks like Symfony and Laravel. PhpStorm doesn’t just understand PHP — it understands the ecosystem around it. It recognizes things like service config files, offers templates for REST controllers or repository classes, and even integrates with tools like PhpStan or PhpCsFixer. It can apply formatting automatically based on the rules those tools define, which is a small touch that adds a lot of value.</p>
<p><strong>SQL Support That Goes Beyond Highlighting</strong></p>
<p>Writing SQL directly in your code? PhpStorm doesn’t just highlight the syntax — it validates your queries based on your selected database type (PostgreSQL, MariaDB, SQL Server, etc.) and even against the current schema. That level of context-aware support is a huge productivity booster.</p>
<p><strong>Built-In Database Tools</strong></p>
<p>Speaking of databases: the built-in database browser is fantastic. You can inspect tables, edit schemas, and run queries right inside your IDE. You don’t need a separate tool like Adminer or pgAdmin for most tasks. Everything is right there — and it just works.</p>
<p><strong>Dev Containers, Debugging, and Language Versions</strong></p>
<p>PhpStorm also supports dev containers, which is super helpful for working in isolated environments. And debugging with Xdebug? Seamless. Yes, other IDEs can handle this too, but there’s something about how JetBrains presents and manages these tools that just feels&hellip; right.</p>
<p>One feature that really made my day recently is the way PhpStorm handles different PHP versions. Need to target 8.2 instead of 8.4? You can set the version, and the IDE will adjust its rules and suggestions accordingly. It’s a great way to catch compatibility issues early.</p>
<p><strong>VIM Mode &amp; Other Small Touches</strong></p>
<p>I also use VIM motions, and having solid VIM support baked into the IDE is just another cherry on top. I know editors like VS Code offer this too, but again — JetBrains just seems to do it a bit better.</p>
<p>And of course, language-specific features like managing different Java versions in IntelliJ are super well-executed too. Honestly, there are so many features I love about JetBrains IDEs that I could probably write an entire post just listing them out. But that’s not really the focus here. The point is: JetBrains IDEs are seriously powerful, well-engineered, and full of thoughtful features that make development easier.</p>
<h2 id="why-use-something-else">Why use something else?</h2>
<p>As much as I love JetBrains products — and I really do — they&rsquo;re not without their downsides. And over time, those downsides started to get in the way of how I like to work.</p>
<p>The first big issue I ran into was performance. I often work with very large codebases — 100k+ lines of code in some projects — and I usually have multiple windows open at once, switching between projects to look something up or cross-reference ideas. In that setup, PhpStorm can easily eat up 8GB of RAM, if not more. And that’s not even counting what the rest of my system is doing.</p>
<p>Then there’s indexing. Ah yes, the blessing and curse of JetBrains IDEs. Don’t get me wrong, being able to search through an entire project in milliseconds is amazing. That part of the experience is gold. But in larger codebases, the indexing process itself is painfully slow. Sometimes it takes several minutes to finish, and during that time, the entire IDE becomes sluggish. On top of that, I’ve even run into occasional crashes under heavy load. Maybe it&rsquo;s just me, but it&rsquo;s extremely frustrating when you&rsquo;re ready to dive into work — and instead you spend five minutes staring at a progress bar or restarting the IDE after a crash.</p>
<p>Somewhere along the way, especially after diving into Rust, I started to care more and more about performance. Rust sort of rewired my brain for thinking about efficiency. It made me appreciate speed and simplicity in my tools, just as much as in my code.</p>
<p>That’s when I tried RustRover. And&hellip; well, it wasn’t great. At least not when I first used it. It felt slow, and some Rust features like macro recognition or autocomplete just didn’t work as expected. I’ve heard it has improved a lot recently, and I’m sure it’s in a much better place now. But that early experience left a mark.</p>
<p>Eventually, a friend of mine recommended <a href="https://zed.dev/">Zed</a>, and I decided to give it a shot. The start was rough, not gonna lie. I was missing a lot of the features I had taken for granted. Even proper Git integration wasn’t available at first. But instead of going back to what I knew, I leaned into the challenge. I started using the raw Git CLI — and surprisingly, it was fun.</p>
<p>Over time, I began to appreciate this more minimal setup. I didn’t need an IDE telling me everything. I didn’t need deep debugging tools or integrated database inspectors for my personal Rust projects. What I did need was a fast, stable, and distraction-free environment. Zed, with just a few plugins for Rust and React, turned out to be exactly that.</p>
<p>No heavy indexing. No unexplained crashes. No unnecessary abstraction. Just my code, my terminal, and whatever tools I choose to plug in.</p>
<p>I slowly realized that for personal projects, I don&rsquo;t need everything JetBrains offers. I don&rsquo;t need dev container integration, live SQL validation, or built-in PHP version managers. It&rsquo;s all useful stuff, but in my current workflow, it feels more like bloat than help. This lightweight environment gives me a sense of control I hadn&rsquo;t felt in a while. It pushes me to understand the tools I&rsquo;m using, rather than relying on an IDE to smooth out the details. And that’s something I’ve come to really value.</p>
<h2 id="to-what-will-i-stick-in-the-future">To what will I stick in the future?</h2>
<p>To be honest, this hasn’t been a simple or clear-cut decision — and even now, I’m not 100% sure where I’ll land long term.</p>
<p>For work projects, I’m definitely sticking with JetBrains tools. There’s just no replacement (yet) for the kind of power they offer. Full-text search across massive codebases is something I rely on daily, and the deep debugger integration, real-time SQL validation, and seamless Git support are must-haves in my day-to-day workflow.</p>
<p>A lot of the projects I work on involve multiple Git repositories—sometimes even split across submodules. Managing that level of complexity manually would be painful. JetBrains makes it manageable. And when it comes to resolving messy merge conflicts, their visual merge tool continues to be a lifesaver. It’s one of those features that, once you’ve used it, you never want to give up.</p>
<p>But for personal projects, the story is different. I want something lightweight. Something focused. Something that lets me just write code and enjoy the process without waiting for indexing or watching my RAM usage creep toward double digits.</p>
<p>That’s where Zed comes in. As long as it keeps supporting Rust and React well — and stays as clean and fast as it is now — I’m happy to use it for my personal coding. It’s minimal, fast, and gives me the kind of low-level control that makes the whole dev process feel more “hands-on”. It&rsquo;s just the code. Everything else I manage my self in my terminal emulator.  No extra abstractions. No bloat. Just the essentials.</p>
<p>That said, I want to be clear about one thing:
I’m still very much in love with JetBrains. In my opinion, they’re the best in the industry at what they do. Their products are thoughtful, powerful, and built with real developers in mind. They’ve helped me grow from a total beginner to a confident, professional developer — and they’ll always have a place in my heart.</p>
<p>So while I might not reach for a JetBrains IDE every time I spin up a personal project, I’m not going anywhere. For the big stuff — the mission-critical, get-things-done kind of work — JetBrains is still my go-to.</p>
<p>And I kind of love this balance.</p>
]]></description></item><item><title>I start loving Rust</title><link>https://blog.mathis-burger.de/posts/006-vibin-with-rust/</link><pubDate>Sun, 13 Jul 2025 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/006-vibin-with-rust/</guid><description><![CDATA[<p>I first got in touch with Rust in 2021, which is about four years ago. Back then, I found it really difficult to work with. The compiler was strict, the borrow checker was confusing, and the language felt unfamiliar overall.</p>
<p>Today, things are very different. I genuinely enjoy working with Rust. This is not only because I understand the language better now, but also because I have found a tech stack that suits my way of building software.</p>
<h2 id="what-technologies-did-i-use-before-rust">What technologies did I use before rust?</h2>
<p>Before I started learning Rust, I was mainly working with Java and especially Go. For web development, I used Go in combination with <a href="https://gofiber.io/">Fiber</a> as my library of choice.</p>
<p>What I loved about Go back then is actually the same thing I love about Rust today: simplicity. I came from heavier frameworks like <a href="https://quarkus.io/">Quarkus</a>, <a href="https://spring.io/projects/spring-boot">Spring Boot</a>, and <a href="https://symfony.com/">Symfony</a>, all of which offer large ecosystems for building web applications.</p>
<p>Don&rsquo;t get me wrong, I still really like working with Quarkus and Symfony. They are great tools, and I enjoy using them. However, Go felt lightweight. Error handling was simple, without the need for complex try-catch clauses. It offered high performance without requiring me to think too much about memory management or other low-level concerns. That was the main reason why I used Go for a long time.</p>
<p>In fact, I still use Go today. Not as much as I used to, but I still find it a great choice for lightweight microservices. Its ease of use, broad support, and the almost endless range of use cases made Go my go-to language—at least until I truly discovered Rust.</p>
<h2 id="my-personal-rust-learning-experience">My personal rust learning experience</h2>
<p>Learning Rust is not like learning most other programming languages. Before you can even start writing useful code, you need to understand quite a few theoretical concepts.</p>
<p>Back when I first tried to learn Rust, I had very little interest in theory. That turned out to be a big mistake. I struggled a lot and found even basic things difficult. Traits? I had no idea how to use them. <code>Copy</code> and <code>Clone</code>? No clue. The borrow checker? What even is that? Macros? I thought they were like keyboard macros. And then there was <code>tokio</code>, <code>futures</code>—wasn&rsquo;t Tokio the name of a city? <code>Rc</code>, <code>Arc</code>, <code>Mutex</code>, <code>RwLock</code>, <code>Cow</code>? I didn’t know what any of that meant.</p>
<p>To be fair, some of it still feels like magic to me today. I’ve never written a complex macro, and I couldn’t tell you the exact differences between all the async runtimes. But that’s fine. I plan to explore those topics more deeply in the future.</p>
<p>Right now, I’m at a point where I can build microservice applications that query and store data in a database and maybe do some calculations. And that’s good enough for me at this stage. To be clear, I’m still far from mastering Rust. I wouldn’t even call myself an intermediate developer in the language. There is a lot left to learn. But I know enough to get things done.</p>
<p>So if you want to learn Rust, do yourself a favor and start by reading <em>The Rust Programming Language</em> book. That’s what I should have done in the first place. I actually own the print version now. But you don’t have to buy it—the online version is available for free.</p>
<h2 id="what-i-use-it-for-now">What I use it for now</h2>
<p>By now, I’ve almost completely replaced the work I used to do with Go by using Rust instead. Most of the monoliths and microservice applications I write today are powered by Rust. Well, most of them. I still use Kotlin and Go for certain use cases where they make sense or where I just feel like using them.</p>
<p>For web development in Rust, I mainly use <a href="https://actix.rs/">Actix</a> as my framework of choice. It is simple to use and offers exactly the features I need.</p>
<p>When it comes to database connectivity, I’m currently using <code>sqlx</code>. I also tried Rust for another project where I initially used Diesel, but it felt a bit too heavy for my taste. I tend to prefer simpler solutions, and <code>sqlx</code> fits that mindset better.</p>
<h2 id="why-do-i-love-it-so-much">Why do I love it so much</h2>
<p>You might ask why I’m now so in love with Rust, even though I had such a hard time learning it in the beginning.</p>
<p>The answer is simple: when I write Rust code, it is solid. And I don’t just mean memory safety. All those small mistakes that can easily slip through in other languages are basically non-existent in Rust, thanks to its strict type system.</p>
<p>When I use <code>sqlx</code>, for example, I can only use specific types for my database structs because the code is validated against the database schema at compile time. The same applies to SQL queries. It’s ensured that the query structure matches the data types I use to store the result.
I rarely run into bugs that are not caught at compile time. And when I do, they’re usually easy to track down because I know exactly which kinds of errors cannot happen. Debugging in languages like Kotlin or PHP often drives me crazy. In Rust, it’s relatively calm and predictable.</p>
<p>I also really appreciate Rust’s simple approach to writing code. This might sound paradoxical at first, since learning Rust is hard. But once you understand how the basics work, you can get results quickly and without unnecessary boilerplate.
You can write useful code in Rust without fully understanding all the deeper concepts. But if you want to go deeper, you can take advantage of powerful features like macros to simplify and automate parts of your codebase. And throughout it all, memory safety is built in by design.</p>
<p>By now, I’m very familiar with my Rust ecosystem. I can write functionality just as fast as I can in Kotlin, PHP, or Go—sometimes even faster. But with one major advantage: I never have to worry about data type mismatches, null pointer exceptions, or other runtime errors. My toolchain takes care of all that.
Invalid time format in a JSON body? If Actix can’t deserialize it using <code>serde</code>, it will handle the error for me.</p>
<p>I can be completely confident that the data I receive in requests and send in responses is exactly what I expect, both in format and type.
And that’s what I love so much about Rust. It might take more effort to ensure memory safety and implement certain features compared to other languages. But that effort pays off in the long run.</p>
<h2 id="will-i-stick-to-rust-in-the-future">Will I stick to rust in the future?</h2>
<p>The question is pretty simple to answer: yes.</p>
<p>But the full answer is not quite as straightforward as it might seem. I really love Rust, and I want to continue learning more about the language. I’m especially interested in exploring its more advanced features and digging deeper into how it works.</p>
<p>That said, I won’t become a typical Rust purist. Not everything I build will be written in Rust. It is definitely my favorite language at the moment, no doubt about that. But I’m also curious about other technologies. For example, I’m considering learning Zig at some point. Even though it’s still relatively unpopular, it seems like a very interesting language to me.
I will continue to use other languages for my projects as well. Go and Kotlin will definitely remain part of my tech stack for specific use cases, especially when building microservices.</p>
<p>However, Rust will stay my primary backend language for now. And I’m convinced that it will continue to grow in popularity over time, thanks to its strong advantages and evolving ecosystem.</p>
]]></description></item><item><title>Vibe Coding is shit. Stop it</title><link>https://blog.mathis-burger.de/posts/003-vibe-coding/</link><pubDate>Sat, 12 Jul 2025 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/003-vibe-coding/</guid><description><![CDATA[<p>Vibe coding seems to be everywhere these days. Social media is flooded with stories of people building SaaS products at record speed using so-called vibe coding techniques. These posts often come with bold claims, not just about productivity but also about the future of our profession. The underlying message is clear: software engineers will soon be obsolete, replaced by AI and no-code tools.</p>
<p>I strongly disagree with this narrative and frankly, I find the whole trend deeply frustrating. Most of these vibe-coded apps are not only rushed but also poorly architected and alarmingly insecure. What is being celebrated as innovation often lacks the fundamentals of sustainable and responsible software development.</p>
<h2 id="vibe-coding-is-not-only-using-ai">Vibe Coding is not only using AI</h2>
<p>As far as I know, there is no clear or widely accepted definition of vibe coding. So before I continue, let me explain what I personally mean by it.</p>
<p>To me, vibe coding is not simply about using AI to assist in software development. That distinction is important. When you use AI as a tool, for example to generate boilerplate code, refactor functions, or get unstuck, you typically have a solid understanding of software development fundamentals. You know how to design architecture, apply appropriate software design patterns, and critically assess the code you write, including code suggested by AI. You are able to spot mistakes and poor practices because you understand the broader context.</p>
<p>Vibe coding is something different. It is more abstract and, frankly, more careless. In vibe coding, the AI effectively becomes the architect. It chooses the patterns, structures the code, and makes key decisions while the developer blindly follows along. There is little concern for how things are implemented, as long as they appear to work and the application looks functional on the surface.</p>
<p>This, in my view, is exactly how many of the new, self-proclaimed “cool” SaaS builders operate online. It is thirty percent coding and seventy percent tweeting about how revolutionary their AI-written note-taking app is, often without any understanding of what is actually going on under the hood.</p>
<h2 id="why-is-vibe-coding-bad">Why is vibe coding bad?</h2>
<p>By now, you can probably already imagine why vibe coding is such a bad idea.</p>
<p>You’re essentially pushing code to production without any real verification. And how could you verify anything when you don’t actually understand what the code is doing in the first place? Without a solid grasp of software development, you’re left blindly trusting that whatever the AI generates is correct, secure, and maintainable, which is wishful thinking at best.</p>
<p>It’s like deploying an application and simply hoping that it’s not vulnerable, that everything magically works as intended, and that no edge cases will ever break it. Spoiler: they will.</p>
<img src="/003-ai-doctor.jpg" width="50%" />
<p><em>Unfortunately, I no longer remember where I originally found this image. If you happen to recognize it, please let me know so I can give proper credit.</em></p>
<p>I believe this image perfectly captures why vibe coding is such a huge problem.</p>
<p>AI confidently provides output that looks correct until you ask the right question. But to ask the right question, you need to understand what the code is actually doing. And that is exactly the issue: many people do not.</p>
<p>We have all seen examples of developers accidentally committing API keys to public GitHub repositories or deploying highly insecure applications simply because they lacked the knowledge to question the AI’s output. This is not a rare mistake; it is the consequence of not knowing enough to validate or challenge what the machine suggests. That is why vibe coding is not just misguided, it is dangerous. In the past, the barrier to writing code was that you had to know how to do it. Now, with vibe coding, you can build and deploy something without truly understanding software development. That might sound empowering at first, but on closer inspection, it introduces serious risks.</p>
<p>Software engineers are engineers. Would you feel safe driving a car that was vibe engineered by someone with no training in mechanical engineering? Would you take medication developed by a vibe pharmacist? Most likely not. Sure, software might seem more harmless, but it can still be critically vulnerable. Storing passwords in plain text, skipping hashing and salting, means one data breach and your password, which you probably use for multiple accounts, is out in the wild. Even if it is just your email address, that is enough for phishing, spam, and identity fraud.</p>
<p>When I use an application, I want it to be secure and not accidentally secure. Most of all, I want it to work as designed, not as vaguely intended by an AI. That is a big difference. Maybe it is just me, but I am genuinely worried about the direction this is heading. Do not get me wrong, AI is an incredible leap forward for developer productivity. But replacing developers altogether might turn out to be a massive mistake.</p>
<h2 id="the-limitations-of-ai">The limitations of AI</h2>
<p>AI is undeniably good at certain things, especially when it comes to writing boilerplate code or suggesting best practices. For common, well-documented problems, it often delivers solid results. Tasks that have been solved countless times before, AI can handle those reasonably well.</p>
<p>But the moment your problem becomes even slightly more complex, things start to fall apart. Take this example: writing simple database pagination in Rust using Diesel is no problem for most AI models. However, introduce just one extra trait bound into the mix, and suddenly no model seems to get it right. Despite the fact that the correct solution is relatively straightforward for someone with a bit of Rust experience, the AI fails.</p>
<p>This illustrates a deeper issue. AI is fantastic for repetitive, boring tasks. It can help generate tedious glue code, refactor existing logic, or even provide high-level scaffolding. But it still struggles with semi-complex problem solving, especially in more niche or strongly typed languages like Rust.</p>
<p>That is because today’s most powerful models are still narrow AI. They do not truly understand what they are doing. They cannot generalize, adapt, or reason beyond what they have seen. They are built to mimic, not to think. They rely entirely on patterns and examples found in the training data, code written by humans, often taken from the public internet. And here is the problem: as the internet becomes more and more flooded with unchecked AI-generated code, the quality of that training data will inevitably decline. This creates a feedback loop that could make future AI models worse at programming, not better.</p>
<p>The real breakthrough would be Artificial General Intelligence, or AGI. That is the holy grail, an AI that can truly reason, learn, and solve problems across domains. But despite billions of dollars in research, AGI remains a very distant and very uncertain goal. It may never be achieved.</p>
<p>So please stop telling developers they are about to be replaced, especially when your entire coding experience consists of launching a painfully insecure and painfully slow SaaS that barely has five users. No, I am not afraid of the future and I am certainly not afraid of losing my job. What I am concerned about is the growing trend of people refusing to think critically. Evolving with technology means understanding it and using it responsibly, not blindly outsourcing your thinking to it.</p>
<p>Will some developer roles disappear? Probably. With AI taking over more repetitive tasks and templated design patterns, the demand for junior developers might shrink. But will software engineers as a whole vanish? That is far from certain, and frankly, I doubt it.</p>
<h2 id="how-to-use-ai-properly">How to use AI properly</h2>
<p>In my opinion, AI is just another tool, a powerful one that can significantly boost developer productivity. But like with any tool, the key is knowing how to use it properly. And the most important rule is to always verify what the AI gives you.</p>
<p>If you do not understand the code, do not use it. Try to understand it first. Treat AI-generated code like you would code from a teammate. Review it thoroughly, test every edge case you can think of, and do not trust it blindly.</p>
<p>Let us take a simple example. Imagine you are building a REST API with basic CRUD operations and your database schema is already defined. That is a task AI can easily handle, saving you maybe 30 minutes of routine work. But once the code is written, your job is not done. You need to ask yourself if authorization is implemented correctly, if the right properties are exposed through the API or worse, if there are any sensitive fields leaking out. Are the database queries efficient? Is caching implemented in a sensible way? Is there proper rate limiting? And are the endpoints named consistently and meaningfully?</p>
<p>Only after checking all of these things and making the necessary improvements is the code truly safe and ready to use.</p>
<p>In fact, this blog post is also partly written with AI. I created the bullet points and structure and the AI helped shape them into coherent text. But I reviewed and validated every section. That is exactly how it should be. AI assists, you remain in control.</p>
<p>When you encounter something new, you can absolutely use AI to support your learning process. But do not start by asking it to write the solution. First, think through the problem yourself. What would be an efficient and clean solution? Only then should you turn to AI, not to write code for you but to provide background information, suggest known algorithms, or point you to RFCs and technical standards that are relevant to your use case.</p>
<p>With that knowledge you are in a much better position to write correct and understandable code and more importantly to reason about it.</p>
<p>It really is that simple.</p>
<p>When learning new things, AI can be a solid partner. It can help prepare study material or generate more advanced questions to test your understanding. It is a great tool for accelerating learning but it should never replace your own thinking.</p>
<p>AI has the potential to boost your productivity beyond what was possible with traditional tools. But it should stay what it is, a tool. If you let AI do all the thinking, your value as a developer drops to zero.</p>
<p>So do not be careless. Do not be passive. Use your brain.</p>
]]></description></item><item><title>Why most of web agencies shouldn't be in business</title><link>https://blog.mathis-burger.de/posts/005-webflow-and-fake-entrepreneurs/</link><pubDate>Fri, 18 Apr 2025 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/005-webflow-and-fake-entrepreneurs/</guid><description><![CDATA[<p>I’m currently quite active on social media, and more and more often I come across people on platforms like TikTok or X talking about how they’ve started a Webflow agency or are building the next SaaS or enterprise application for their clients. In most cases, that’s perfectly fine — experienced professionals sharing what they’re working on. Pretty cool.</p>
<p>But lately, I’ve been seeing more and more people who really trigger me.</p>
<p>Many of the people you see on social media might initially seem to offer a great deal — but if you take a closer look, their services are often quite poor. Sometimes, they even lie straight to your face.</p>
<h2 id="a-bit-of-background-information">A bit of background information</h2>
<p>Before we dive in, you need a bit of background to understand what really matters when building a website or a custom application for clients.</p>
<p>Creating a website isn’t just about choosing a CMS or applying a fancy template. It’s about building a cohesive brand identity for the people you&rsquo;re working with. Let me walk you through the entire process.</p>
<p>When you receive an initial request to build a website, the first step is to understand your client’s actual needs. What is the primary purpose of the website? Is it to boost sales? Increase awareness of the client’s mission? Generate leads? This clarity is essential, because everything you build — from structure to content — should serve this core purpose.</p>
<p>Once that’s clear, you need to think about project management. You’ll have to estimate costs: hosting, legal services, ongoing maintenance, and your own work. Transparency is key. Explain how the price is calculated and why it is what it is — high, low, or somewhere in between. Identify all stakeholders and make sure the project&rsquo;s framework conditions are crystal clear. If you skip this step, your project is likely to fail due to misalignment and lack of agreement with the client. But once the organizational groundwork is laid, the “real” work can begin.</p>
<p>Next comes screen design. What pages are needed? What content should go where? What type of content are we even talking about? Which colors and design style suit the brand? Should it be modern, retro, minimalistic? Every design decision should serve the primary purpose defined earlier. And no — a random WordPress template does not fulfill all of your client&rsquo;s needs. Sure, templates can work in low-budget scenarios or when a generic solution is acceptable (which might be the case in 1% of all projects). But if the goal is to build something purposeful and custom, a template just doesn’t cut it.</p>
<p>Templates are too generic. They’re designed to meet many use cases at once, but not specifically yours. And let’s face it — most template-based websites look the same, which makes it hard to stand out from the competition. A better approach? Use a framework like Bootstrap as a starting point and customize each component to match the client’s individual needs. Use the grid system as your foundation, but then tailor everything to truly serve your client.</p>
<p>Also, choose a CMS or page builder that allows for custom extensions and plugins. Ideally, it should be open-source and self-hostable. Why? Because your client’s needs will evolve. Imagine you build a site for a barbershop. Initially, it&rsquo;s just about listing prices and attracting local customers. A year later, they want an online booking system. Or imagine your current hosting provider becomes insecure or non-compliant with data protection laws. In such cases, being able to migrate quickly is essential. Tools like <a href="https://webflow.com/">Webflow</a>, with their closed ecosystems and vendor lock-in to AWS, can be a serious limitation. A self-hosted, open-source CMS gives you far more flexibility and control.</p>
<p>Even after the content and layout are finalized, your work isn’t done. These days, SEO matters — a lot. Ideally, you should consider SEO from the very beginning, even before laying out your first design wireframes.</p>
<p>And when it&rsquo;s time to buy the domain, make sure the client owns it. Have them register the domain in their name and give you access only to the DNS settings — unless you’re explicitly authorized to register domains on someone else&rsquo;s behalf. This protects your client from vendor lock-in. Clients should stay with your agency because of your excellent service, not because you hold their domain hostage. Anything else is just unprofessional.</p>
<p>Then there&rsquo;s the legal aspect. At minimum, every website needs an imprint (Impressum) and a privacy policy. Don’t underestimate this. ChatGPT can’t reliably write these for you. Services like <a href="https://www.e-recht24.de/">e-recht24.de</a> can help, but in some cases, you’ll need a real legal expert to make sure your site is compliant. It’s always safest to consult a lawyer or someone well-versed in online privacy laws, rather than blindly trusting a generator.</p>
<p>And no, it’s not enough to just list your cookies in the privacy policy and install a free cookie banner. You must ensure that no external resources are loaded before a user gives consent. And if they decline, those resources must not be loaded. Most cookie plugins don’t handle this properly.</p>
<p>Here in Germany, there are three key laws you need to be aware of: the european GDPR (<a href="https://dsgvo-gesetz.de/">DSGVO</a>), the BDSG (<a href="https://www.gesetze-im-internet.de/bdsg_2018/">Bundesdatenschutzgesetz</a>), and the BFSG (<a href="https://bfsg-gesetz.de/">Barrierefreiheitsstärkungsgesetz</a>). Familiarize yourself with them and understand the limitations they impose.</p>
<p>When you&rsquo;re developing custom software for clients, the standards become even stricter. Your software must follow up-to-date security practices. That takes professional experience — or at least several years of serious hobby development. When I first started out, I lacked that experience, and I built some truly awful apps for other people. Thankfully, they’re no longer in use! Those applications were completely insecure, poorly architected, and a nightmare to maintain.</p>
<p>So, if you&rsquo;re building production-grade software for clients, make absolutely sure you know what you’re doing. It’s not enough for ChatGPT to know — you need to know. You should be familiar with architecture, design patterns, security protocols, databases, and more. If you’ve just finished university and your only programming experience is a Java course you had to take, that’s not enough to develop real software without a senior supervising you.</p>
<p>Start with personal projects. Get your hands dirty. Learn. And I don’t mean build a basic calculator app — go deeper. Learn how to design scalable, maintainable, and secure systems. Do that before you start building for clients. Otherwise, they’ll end up with a mess—and you’ll be the one stuck cleaning it up.</p>
<h2 id="so-what-are-the-people-doing-that-triggers-me">So what are the people doing that triggers me</h2>
<p>I spent a lot of time digging into the communities I mentioned earlier, trying to understand how those one man agencies actually work. I watched countless videos, read endless tweets, and even joined a few Discord servers to see things from the inside.</p>
<p>The most frustrating part? Some people blatantly lie to your face. Now, sure — it&rsquo;s nothing new that people lie on the internet. But these folks are doing it to win over new customers. And that’s what makes it different.</p>
<p>Let me give you an example. Here in Germany, there’s a special corporate legal form called a “UG” (Unternehmergesellschaft). You can start one with as little as €1 in capital, but you&rsquo;re required to save 25% of your profits until you reach €25,000. Once you hit that amount, your UG can be converted into a GmbH (a more robust corporate form).</p>
<p>Why does this matter? Well, there’s someone on social media who recently gained quite a bit of attention by posting flashy pictures with expensive cars, claiming he’s been running a successful software agency since 2017 — one that supposedly made him a millionaire. But if you check the public records on North Data, the company he’s referring to is still a UG and wasn’t even registered until 2021. So no, it didn’t start in 2017, and no, it didn’t make him a millionaire. It&rsquo;s all just a tactic to gain attention and attract new customers — and in my opinion, that’s as shady as it gets.</p>
<p>But the real issue goes deeper. Most of these new “Webflow agencies” have no idea what they’re doing. After spending time in their Discord servers, I got a pretty good sense of how they actually work.</p>
<p>Remember what I said earlier about building websites with purpose? These people don’t even ask what the website is supposed to achieve. They just create something they think fits the client&rsquo;s brand. There&rsquo;s no real project management. Cost estimates are based on vague descriptions with no breakdown of how long each page or feature will take. No clear cost structure, no distinction between hosting, maintenance, and development. In many cases, they offer fixed prices — like €2,000 for a full website — without any real scope definition.</p>
<p>They often use off-the-shelf templates or buy one for around €50 and slightly modify it to &ldquo;match&rdquo; the client&rsquo;s aesthetic. Spoiler alert: most of the time, it doesn’t.</p>
<p>Worse, they lock their clients into platforms like Webflow, which offer limited plugin support and make it hard to implement truly custom features. SEO is usually an afterthought — if it&rsquo;s considered at all. And as if that weren’t bad enough, they even register the domains under their own names. That might seem harmless at first, but when the client wants to switch agencies, it becomes a nightmare.</p>
<p>Now let’s talk about the legal side — this is what really sets me off. These agencies either use generic GDPR generators or AI tools to spit out privacy policies and legal texts, with zero regard for actual compliance. They don’t even bother to check whether third-party content is being loaded before consent is given via a cookie banner.</p>
<p>Selling mediocre work? Fine — you’re just a bad agency. But ignoring legal compliance and relying entirely on AI to generate legal documents? That’s not just unprofessional — it’s reckless. If you operate like that, you should not be allowed to build anything for clients. But clients often buy into it anyway — because it’s cheap and they lack the knowledge to understand the complexities and limitations of professional web design.</p>
<p>And that’s just websites. When it comes to custom applications, things get even worse.</p>
<p>I’ll keep it short: most of the people I encountered have no real experience. They’ve watched a few Python tutorials and now believe university degrees are pointless because they “already know everything” about building applications. Some of them hadn’t even heard of password hashing. One guy thought it referred to choosing strong passwords across different apps.</p>
<p>These people are building production systems — used by real companies and organizations — with no knowledge of software architecture, no understanding of privacy regulations, and zero awareness of secure development practices. And when things get complex, they just ask ChatGPT.</p>
<p>From the perspective of a professional developer, it’s genuinely sad to see.</p>
<h2 id="so-what-would-i-do-better">So what would I do better?</h2>
<p>Lately, I’ve been seriously thinking about starting my own web design agency — which is also one of the reasons I decided to write about this entire topic.</p>
<p>First and foremost, the most important investment would be in a legal and privacy expert. That’s not just crucial for me personally, but also for the protection and trust of my future clients.</p>
<p>From there, I’d take a truly individual approach with each customer: sitting down with them to understand their specific needs and building a custom website tailored exactly to those goals. No templates, no baseless cost estimates.</p>
<p>If you really want to run an agency that delivers meaningful value, you need to take time — lots of it. It’s not just about building a website; you also have to host it, maintain it, and provide long-term support. That all adds up quickly.</p>
<p>And here’s the core issue: you simply can’t build a legally sound, fully custom website that truly serves the client’s needs for just €2,000. The bare minimum for a small, well-built site is around €5,000.</p>
<p>This is exactly why I haven’t started my own agency yet — I just don’t have the time right now to offer the level of service I know would be necessary. I understand what it takes to build a truly effective, secure, and purpose-driven website. And that kind of quality takes time — and therefore money. The websites I’d build would naturally be more expensive than what most of the cheaper agencies offer, simply because I’d invest far more effort into getting the right result for the customer. But I also don’t want to compromise on quality. I want to deliver the standard I would expect myself if I were the customer. And if I can’t achieve that with the resources I currently have, then I’d rather not do it at all. I’d feel uncomfortable offering a lower-quality solution at a cheaper price — especially knowing it might not truly meet the client’s needs. But maybe that’s just my perfectionism speaking.</p>
<p>That’s also why these low-cost agencies remain so profitable: they’re the cheapest option on the market. Sure, your local barbershop doesn’t need a highly sophisticated website to function. But if the website looks like every other barbershop’s site, it becomes practically useless — it offers no unique selling point, no reason to stand out.</p>
<h2 id="what-can-we-do-to-avoid-those-people">What can we do to avoid those people?</h2>
<p>To be fair, not every one-person agency offering a €2000 website is necessarily bad. There are plenty of talented individuals out there who know exactly what they’re doing.</p>
<p>But in order to distinguish good agencies from bad ones, we need to take some action. One — admittedly unrealistic — approach would be to require some form of certification before someone is allowed to build websites professionally, similar to how other industries are regulated.</p>
<p>Take the automotive industry, for example. Cars must undergo rigorous safety and quality inspections before they can be sold to consumers. The issue with web development is that it’s extremely accessible. Anyone can watch a two-hour YouTube tutorial, start tinkering with Webflow or WordPress, and piece together a basic website. But the result often falls short of what a professional would define as a high-quality product.</p>
<p>Just like a car buyer might judge a vehicle by how fast or comfortable it feels, without understanding the inner workings of its engine or structural integrity, a client can think a website looks good while missing the fact that it fails to meet key needs — or worse, isn&rsquo;t even GDPR-compliant. Without a technical background, clients can’t reliably evaluate the actual quality of a website.</p>
<p>This is where certification could come into play. If anyone who wants to build websites for clients were required to obtain a certification from a recognized institution, it would help ensure that basic quality and privacy standards are met across the board. Of course, implementing such a system would require political will and infrastructure, which makes it a long shot for now.</p>
<p>A more realistic approach is raising awareness among the general public. People should understand that a €2000 website is unlikely to meet the standards of a modern, professionally built site. If more people become aware of the risks and limitations, the market could begin to regulate itself. Clients would be more selective, and low-quality providers would eventually get weeded out.</p>
<p>The same logic applies to building custom applications.</p>
<p>That said, I’m not an expert in either policy-making or economics — although I am a member of a political party and have a basic understanding of how markets work. I can’t claim with absolute certainty that these suggestions would have the desired effect, so I welcome your ideas and opinions in the comments.</p>
<p>If you’re a customer, be cautious. If your agency includes you in the development process and seeks your input regularly, that’s often a good sign. Also pay close attention to how they calculate their prices and how they approach legal compliance — especially GDPR. Ask detailed questions about their design process and how domain ownership is handled. Transparency in these areas is a major green flag.</p>
<p>And yes, even if an agency uses a privacy notice generator, that doesn’t automatically disqualify them. If the agency is open about it and offers a lower price as a result, that can still be a fair deal. Just be aware of what you need. Templates might work fine for some use cases. What really matters is transparent communication.</p>
<p>If an agency is upfront from the beginning about how its pricing is structured and why their service is either cheap or expensive, that’s a great sign. As always, it’s better to be cautious than careless.</p>
]]></description></item><item><title>When to Stop Updating a Side Project — and Why I Did</title><link>https://blog.mathis-burger.de/posts/004-upgrading-dependencies-of-side-projects/</link><pubDate>Tue, 01 Apr 2025 01:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/004-upgrading-dependencies-of-side-projects/</guid><description><![CDATA[<p>Have you ever had a side project that you haven&rsquo;t worked on in a long time? For me, there’s a project I started in 2021, originally to help me complete my school homework a bit faster. It’s a web app capable of solving simple math problems.</p>
<p>A few days ago, I made the difficult decision to stop updating its dependencies. Letting go of this project was not easy for me. That’s why I want to share my experience with you—perhaps my thought process will be helpful if you ever find yourself facing a similar decision.</p>
<h2 id="the-projects-starting-point">The projects starting point</h2>
<p>To put it simply: from today’s perspective, the codebase is a complete mess.</p>
<p>I started this project in my early days as a software engineer. I wanted to learn a new framework and decided to go with SvelteKit, which was still in open beta at the time. So, I gave it a shot. To be fair, working with it was a great experience. But after a few months, I stopped working on the project—mainly because I stopped doing my math homework, lol.</p>
<p>As a result, there has been no real progress over the past few years. The entire project is based on outdated beta framework code. And to be honest, the code itself isn’t great—it reflects my lack of experience at the time.</p>
<p>Updating the project to the latest dependencies would require a significant amount of effort. First, I’d need to untangle the dependency mess. Some of the old npm dependencies are no longer supported or even necessary, as SvelteKit now provides built-in solutions for them.</p>
<p>Even after cleaning up the dependencies, I’d still have to refactor and migrate all the code to follow modern best practices for SvelteKit. On top of that, I’m not entirely sure how certain things work in SvelteKit today, so I’d need to do some research to fully understand all the new changes.</p>
<h2 id="influencing-factors">Influencing factors</h2>
<p>Several factors influenced my decision on this topic.</p>
<p>First and foremost, there’s the effort required to migrate the project to the latest version of SvelteKit. As I’ve already mentioned, the process is quite complex and would demand a vast amount of time. Due to significant changes in how SvelteKit works, I would need to rewrite almost all of the code. While much of the logic could be reused, the migration would still be challenging. Additionally, finding suitable replacements for deprecated dependencies and framework functionality could be time-consuming. For example, Svelte CLI has been replaced by Vite, meaning I’d need to find new solutions for static exports and other features.</p>
<p>Another key factor is that there are no real security risks in not upgrading the dependencies. The application is a simple web app that runs entirely in the browser. It does not rely on external services or a backend, so I can confidently say that leaving the dependencies as they are does not introduce any security concerns. Moreover, the project has no real users—this migration would be purely for myself, not for a larger user base.</p>
<p>On the other hand, I do want to learn about the new techniques and improvements in SvelteKit. At the same time, deliberately choosing not to upgrade the dependencies creates an internal conflict for me. I hold myself to high standards—not because I think I’m the best developer, but because I want to continuously challenge myself and improve. Avoiding this migration on purpose feels like avoiding a challenge, which bothers me.</p>
<p>Lastly, there’s an emotional aspect to consider: I actually like this codebase. It serves as a memory of my 2021 self working on this project. Even though the code is objectively bad, I still find it somewhat beautiful. Refactoring it would feel like erasing a piece of that memory, which creates another internal conflict. That said, this emotional argument carries less weight compared to the practical considerations.</p>
<h2 id="final-decision">Final decision</h2>
<p>Reaching a final decision was difficult. The significant effort required, the lack of users, and the minimal security risk were key factors in my decision-making process. I don’t have much free time to dedicate to personal projects, and upgrading the dependencies would consume a large portion of it—something I wasn’t willing to sacrifice.</p>
<p>Learning modern SvelteKit could just as easily be done with a new project. However, the thought of avoiding a challenge still weighed on me. And then there was the emotional aspect—I genuinely like my legacy code because it reminds me of the &ldquo;good old days&rdquo;.</p>
<p>In the end, I had to make a choice. I decided to act rationally rather than emotionally and ultimately chose to stop upgrading the dependencies of this project.</p>
<h2 id="what-can-you-learn-from-all-this">What can you learn from all this?</h2>
<p>Personal decisions like this are difficult for everyone. That’s why I believe you might gain something from my thought process.</p>
<p>In the end, you have to make your own decisions. Simply copying mine would be the worst possible approach to tackling your own challenges. When facing a similar dilemma, you should certainly consider the emotional value of your project. However, it’s equally important to think rationally about all the influencing factors. Acting rationally while setting emotions aside can be difficult at first, but trust me—it will ultimately lead to the right decision.</p>
<p>Of course, emotions matter. And in project management, they are crucial when working with team members. But when it comes to the hard facts of a project itself (rather than the human component), decisions should be made rationally.</p>
<p>Take my case, for example. I loved this project—it was one of my first web development projects, and I worked on it for over two months. It had significant emotional value to me. Yet, deciding not to upgrade the dependencies was still the right choice. The effort simply wouldn’t have been worth it. I can still work on the project, but only with its outdated beta framework.</p>
<p>As I said, emotions are important, but so are the hard facts. When collaborating with others, their emotions and perspectives should be a priority. But when it comes to making technical decisions about the project itself, a fully rational approach is the best way to achieve the best outcome. In the end, acting rationally benefits everyone involved—it’s a win for all.</p>
]]></description></item><item><title>Stop hating PHP</title><link>https://blog.mathis-burger.de/posts/002-stop-hating-php/</link><pubDate>Fri, 07 Mar 2025 14:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/002-stop-hating-php/</guid><description><![CDATA[<p>I have been working with PHP in a professional environment for about three years. Despite this, PHP remains one of the most disliked languages among developers, which I find difficult to understand because it has evolved into a fairly robust and capable language.</p>
<h2 id="why-is-it-hated-so-much">Why is it hated so much?</h2>
<p>In its early days, PHP was considered quite insecure. Many of the CVEs at the time were related to PHP, reinforcing its reputation as an unsafe language—an assessment that was accurate back then. Additionally, the language had an overwhelming number of configuration options. Different configurations across devices often caused certain features to work on one system but fail on another. These configurations extended beyond basic settings like maximum file upload sizes, execution times, or memory limits to options that control error handling, which can significantly impact an application&rsquo;s behavior and security.</p>
<p>PHP is also regarded as an outdated language by some. Object-oriented programming (OOP) was introduced relatively late with PHP 5. Additionally, the standard library lacks an organized namespace, which is another common criticism. Many other important features, like OOP, were also added much later than in other languages. For instance, enums were only introduced in PHP 8.1, released in 2021. Moreover, PHP did not have a package manager until 2016, when the first stable version of <a href="https://getcomposer.org/">Composer</a> was released. By comparison, <a href="https://maven.apache.org/">Maven</a> had its first release in 2004.</p>
<p>Another common criticism of PHP is its syntax. For instance, array iteration functions are much more elegant and efficient in other languages compared to PHP. Here is a brief example:</p>
<p><strong>JavaScript:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#a6e22e">result</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">myarray</span>.<span style="color:#a6e22e">map</span>((<span style="color:#a6e22e">x</span>) =&gt;  <span style="color:#a6e22e">x</span>.<span style="color:#a6e22e">property</span>)
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">sort</span>((<span style="color:#a6e22e">a</span>, <span style="color:#a6e22e">b</span>) =&gt; (((<span style="color:#a6e22e">a</span> <span style="color:#f92672">==</span> <span style="color:#a6e22e">b</span>) <span style="color:#f92672">?</span> <span style="color:#ae81ff">0</span>) <span style="color:#f92672">:</span> (Math.<span style="color:#a6e22e">pow</span>(<span style="color:#a6e22e">a</span>, <span style="color:#ae81ff">2</span>) <span style="color:#f92672">&gt;</span> Math.<span style="color:#a6e22e">pow</span>(<span style="color:#a6e22e">b</span>, <span style="color:#ae81ff">2</span>)) <span style="color:#f92672">?</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span> <span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span>))
</span></span><span style="display:flex;"><span>        .<span style="color:#a6e22e">reduce</span>((<span style="color:#a6e22e">a</span>, <span style="color:#a6e22e">b</span>) =&gt; <span style="color:#a6e22e">a</span> <span style="color:#f92672">*</span> <span style="color:#a6e22e">b</span>);
</span></span></code></pre></div><p><strong>PHP:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-php" data-lang="php"><span style="display:flex;"><span>$unsorted <span style="color:#f92672">=</span> <span style="color:#a6e22e">array_map</span>(<span style="color:#a6e22e">fn</span>($x) <span style="color:#f92672">=&gt;</span> $x[<span style="color:#e6db74">&#39;property&#39;</span>], $array); 
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">uasort</span>($unsorted, <span style="color:#66d9ef">function</span>($a, $b) { <span style="color:#66d9ef">if</span>($a <span style="color:#f92672">==</span> $b) { <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>; } <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">pow</span>($a, <span style="color:#ae81ff">2</span>) <span style="color:#f92672">&gt;</span> <span style="color:#a6e22e">pow</span>($b, <span style="color:#ae81ff">2</span>) <span style="color:#f92672">?</span> <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span> <span style="color:#f92672">:</span> <span style="color:#ae81ff">1</span>; }); <span style="color:#75715e">// now sorted
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>$result <span style="color:#f92672">=</span> <span style="color:#a6e22e">array_reduce</span>($unsorted, <span style="color:#a6e22e">fn</span>($a, $b) <span style="color:#f92672">=&gt;</span> $a <span style="color:#f92672">*</span> $b);
</span></span></code></pre></div><p><a href="https://www.reddit.com/r/PHP/comments/1fy71s/comment/caezeur/">Credits</a></p>
<p>As you can javascript example looks way cleaner and is easier to read. The PHP code seems way harder to understand.</p>
<p>Another major issue with PHP is the inconsistency between errors and exceptions. Errors stem from the time when PHP only supported procedural programming, while exceptions were introduced with object-oriented programming (OOP). Since PHP is a blend of both paradigms, some functions throw exceptions while others return errors.</p>
<p>For example, the <a href="https://www.php.net/manual/en/function.json-decode.php">json_decode</a> function accepts a flag that determines whether it should throw an exception or return an error. Some standard library functions, like <a href="https://www.php.net/manual/en/function.file-get-contents.php">file_get_contents</a>, return an error. If the operation fails, it returns <code>false</code>; if successful, it returns the file contents as a string. You then can retrieve the error using <a href="https://www.php.net/manual/de/function.error-get-last.php">error_get_last</a>. In contrast, other functions, such as <a href="https://www.php.net/manual/en/splfileobject.construct.php">SplFileObject::__construct</a>, throw exceptions when an error occurs.</p>
<p>Another reason the language is often disliked is the lack of high-quality, open-source projects written in PHP. While WordPress is popular, its codebase is often criticized for being messy, as the project is in a transition phase between procedural and object-oriented programming. Although it is improving, its current state remains problematic.</p>
<h2 id="is-it-better-today">Is it better today?</h2>
<p>Projects like TYPO3 have evolved over the years to adopt a more modern approach to PHP. They began using a package manager and object-oriented programming (OOP) to clean up their codebase. As a result, developing extensions for TYPO3 is now much more enjoyable compared to WordPress plugin development.</p>
<p>Over the past few years, many new features have been added to the language. PHP 8.1 introduced enums, and since PHP 7, we also have scalar type declarations. The language is now much more secure than in its early days. However, the bloat of configuration options still exists, as does the inconsistency between errors and exceptions. That said, the inconsistency is gradually being reduced. While the syntax remains largely the same, I personally don&rsquo;t find it as problematic as others claim. In fact, it can be quite readable and clean. But of course, this is a matter of personal opinion. Many people might feel the same way about the syntax of languages like Rust, Go, or Java.</p>
<p>The package manager Composer now offers a wide range of useful packages. Additionally, there are numerous tools available to enhance your coding experience. These tools provide supportive features and almost every capability commonly found in other languages. Want unit testing? Use <a href="https://phpunit.de/index.html">PHPUnit</a>. Need code formatting? Try <a href="https://github.com/PHP-CS-Fixer/PHP-CS-Fixer">CS-Fixer</a>. Looking for extra type safety and static analysis? Check out <a href="https://phpstan.org/">PHPStan</a>.</p>
<h2 id="ecosystem">Ecosystem</h2>
<p>In addition to all the great tools, it’s the ecosystem that makes me really enjoy PHP. Frameworks like <a href="https://symfony.com/">Symfony</a> and <a href="https://laravel.com/">Laravel</a> are well-integrated and a pleasure to use. You can accomplish almost anything you want with them, as long as it involves web development. These frameworks even support building internal CLI applications within web applications. Furthermore, they allow integration with frontend frameworks like React or Vue. <a href="https://ux.symfony.com/">Symfony UX</a> is another approach that makes web development with PHP more modern and enjoyable. There are so many different ways you can utilize these frameworks.</p>
<p>I have been working professionally in the Symfony environment for about three years, and from my perspective, I can definitely say that I&rsquo;ve never encountered a scenario where the framework itself or a third-party library couldn&rsquo;t get the job done. These frameworks help you complete tasks efficiently and effectively. Of course, other frameworks in different languages offer similar functionality, but in my opinion, Symfony stands out for doing many things in exactly the right way.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Overall, you could say that PHP was a pretty bad language in its early days, and even into the 2010s. However, today PHP is a solid choice for web projects. The language has gained many modern features and continues to evolve, becoming even better. With Composer as your package manager and a well-integrated ecosystem of tools and frameworks, PHP is definitely a great choice for modern web development. It&rsquo;s no longer relevant to hate PHP.</p>
<p>I would recommend you to just give it a shot and try it out yourself. You will love it.</p>
]]></description></item><item><title>Your learning sideprojects code can be shitty</title><link>https://blog.mathis-burger.de/posts/001-sideprojects-can-have-shitty-codebase/</link><pubDate>Mon, 03 Mar 2025 10:00:00 +0100</pubDate><guid>https://blog.mathis-burger.de/posts/001-sideprojects-can-have-shitty-codebase/</guid><description><![CDATA[<p>In the past few days, I have been working on a side project that uses PHP and <a href="https://laravel.com/">Laravel</a>. I should mention that I had never used Laravel before in my life. My professional experience has primarily been with other PHP frameworks, like <a href="https://symfony.com/">Symfony</a>, and I thought: Why not try something new?</p>
<p>I believe many people feel the same way. They want to explore something they’ve never worked with before. This is the essence of lifelong learning, especially in software engineering. In this field, you’re always learning new things, and that’s one of the reasons I love it so much.</p>
<h2 id="sideprojects-for-learning">Sideprojects for learning?</h2>
<p>Well, you know, I&rsquo;m more of a practical person. When I want to learn something new, I can’t just go through examples or walk through all the playgrounds the language or framework might offer. The approach that works best for me is to actually build a project with the framework or language. I’ve spoken to many people, and most of them agree with this. Learning in a practical way through a project is much more enjoyable, and you can see your actual progress.</p>
<p>I have a fairly long list of side project ideas I want to develop someday. For learning Laravel, I simply picked one of those ideas. In this case, it was a simple web application where my friends and I could create fun bets and place our wagers on them. Pretty simple, not overly complex. I also added some additional requirements to explore the capabilities of the framework and see how easy and pleasant it is to develop with. Examples include localization and notifications within the web app.</p>
<p>In my opinion, this is a great deal. You’re working on some of your side project ideas while simultaneously learning something new. It seems like a win-win. Well, it&rsquo;s not always that easy&hellip;</p>
<h2 id="the-learning-curve">The learning curve</h2>
<p>When you’re learning something new, there are often patterns or best practices you haven’t encountered yet. You might have discovered them if you had first read the documentation. But let’s be honest: While most people do read the docs, they might forget certain things when they’re actually developing. You can’t know everything right away. Knowledge comes from experience and repetition. It comes from failing and spending hours debugging a simple problem, rather than solely preparing by reading the documentation.</p>
<p>However, as you learn the framework or language, you get better at it. After a few hours or days, you start to pick up the basic patterns. In the case of Laravel, for example, you learn how the ORM works and how to handle database connections. You learn how to implement controllers and use Blade. You also discover best practices for organizing the file structure of your components.</p>
<p>How easily you can learn something new often depends on what you’ve already learned. It might seem a bit confusing, but let me explain what I mean: Imagine someone who has spent their entire career working in the object-oriented programming (OOP) world of Java. This person knows everything about object-oriented programming, and these concepts are deeply ingrained in their mind. Now, imagine this person learning React. While they might be comfortable with class components, they could struggle with things like hooks, functional components, and other non-OOP concepts. On the other hand, this person might find Angular easier to learn because its patterns are more similar to Java’s.</p>
<h2 id="refactoring-hell">Refactoring hell</h2>
<p>After you&rsquo;ve learned a lot about this new technology, you might look at your project and think, &ldquo;How did I build this?&rdquo; And honestly, that’s completely normal. When you started this project, you had no idea how things worked. You might have used a file structure that isn’t considered best practice, or perhaps you put logic that belongs in a repository directly inside your controller.</p>
<p>At this point, you have two options: leave it as it is or start refactoring everything. Depending on the size of your project, this could take a significant amount of time. You might be thinking it would have been better to read the documentation from the start, but I actually don’t agree with that. Think about what would have happened if you had just read the documentation: Sure, you might have followed some best practices, but you wouldn&rsquo;t have learned nearly as much.</p>
<p>When I think about my experience with Laravel, I remember long debugging sessions where I tried to figure out how things worked. I dug deep into the framework&rsquo;s internals to understand how it operates under the hood, rather than just learning the basics needed to get the job done. Sure, the first approach would have been easier, but because I took the time to understand the framework better, I now know how to solve problems when they arise. So, even if you now find yourself needing to refactor your entire side project, you&rsquo;ve gained some serious skills. Sure, choosing the quickest way to get things done isn’t inherently bad, but in the long run, the more challenging approach might actually help you work more efficiently.</p>
<p>Of course, you might not have approached the problem the best way when you tried to fix it on your own. There could have been an abstraction in the language or framework that would have made things easier. You could have used it right away, but now you have a deeper understanding of your technology and how it works. That’s still a win.</p>
<h2 id="your-sideproject-is-no-system-critical-infrastructure">Your sideproject is no system critical infrastructure</h2>
<p>But the question still remains: Should you refactor your entire codebase or not? I would say it depends. It’s a pretty personal decision. Personally, I would always try to refactor it. If the result isn’t worth the effort, you can limit your refactoring to the basics. But what you should keep in mind is that your side project is not critical infrastructure.</p>
<p>Let’s be honest—most of us start a side project without much planning. We get an idea and start coding right away. There’s no use-case analysis, no UML class diagrams. Maybe some component designs, but even that’s rare for side projects (at least for me). The main purpose of side projects is to have fun. We’re not building the backend of a billion-dollar enterprise here. These projects are not meant to be that formal. Side projects should give developers the freedom to do whatever they want, without any restrictions on component design or even best practices. The goal is fun and learning.</p>
<p>So please, stop overengineering your side projects. If you’re realistic, the primary users of such a project will likely be you and your friends. There’s no need to consider a microservice architecture just to scale to a million users at once. But if you enjoy thinking about those problems, feel free to dive into them.</p>
<h2 id="but-should-i-read-the-docs">But should I read the docs?</h2>
<p>Earlier in this article, I mentioned that you shouldn&rsquo;t read the documentation. That’s not entirely accurate. Of course, you should definitely read the docs to gain a basic understanding of how everything works. What I meant was that you don’t need to read the entire documentation in detail before starting your project.</p>
<p>Over the years, I’ve developed a personal approach to using documentation for new projects. First, I think about what I’ll need initially. In the case of my side project, it was routing, basic REST APIs, and database interaction. So, I sat down and skimmed through the docs to get an idea of how things work. Then, I started working on my project. When I run into a problem, I first try to solve it on my own. Through this process, I learn how the framework works. For example, if I need to retrieve a search query parameter from the HTTP request URI, I don’t immediately look up the documentation. Instead, I check out the Request object that&rsquo;s passed to my controller and explore its API to see if it provides a solution. This way, I not only learn how to retrieve a search parameter from the URI, but also how the API works in general, which prepares me for future problems.</p>
<p>This might seem like the harder and more time-consuming approach at first, but it will pay off in the long run. There’s always the shortcut of reading the documentation, browsing Stack Overflow, or nowadays using ChatGPT or another chatbot to solve your problems. But throughout your career, you’ll also work with technologies that are less well-known or not as thoroughly documented. In those cases, you’ll need to understand how the framework or language works internally to solve problems effectively.</p>
<p>Let me give you an example: In my professional career, I’ve been working a lot with the PHP framework Symfony. It’s well-documented and relatively easy to start with, but it also has a steep learning curve because it simplifies many things. However, like any other framework, it can become quite complex. In one project, I had to work with a library that instantiated an admin dashboard. I wanted to override some form submission behavior, but the problem was that the Symfony docs didn’t cover this scenario, because the admin dashboard library added an extra abstraction layer on top of the Symfony API. Stack Overflow wasn’t much help either, since this wasn’t a common use case for overriding form submission behavior. To solve the problem, I had to understand how the Symfony API worked internally in order to hook into the form submission process and make the required changes. Without learning Symfony the hard way, I would never have been able to do that.</p>
<h2 id="conslusion">Conslusion</h2>
<p>So, what can you learn from all this? The main focus of side projects is to have fun. You shouldn’t restrict yourself with unnecessary limitations. They’re perfect for learning something new because they aren’t major commitments, giving you more room to experiment, make mistakes, and learn from them. And yes, your code might end up looking pretty bad, and you’ll probably need to refactor it. But take a look at your first projects with the technology you’re currently most proficient in—weren’t they pretty bad, too? You always improve. And if you want to, you can refactor your project later with the experience and expertise you’ve gained so far.</p>
<p>The second takeaway is that you should definitely read the docs. But you should also challenge yourself. Don’t make it too easy. If learning a new technology feels easy, you probably haven’t learned much. Sure, things might be similar, but if there’s no difference, they’re essentially the same. So, try solving a problem without immediately checking the docs or asking a chatbot. Instead, figure out how things work and how you can use them. This approach leads to more expertise than just reading the docs because you’ll truly understand the technology, how it works, and how to use it. You won’t just know about it—you’ll have hands-on experience.</p>
<p>So, never stop learning and never stop challenging yourself, because doing so would mean you’re not learning anything. Failing makes you a better programmer than just reading about it.</p>
<p>Finally, a motivational quote for you:</p>
<p><em>Just let them know that we have a finite amount of time on this planet and you can be viciously mediocre or you can get the fuck after it.</em> ~ idk who said that</p>
]]></description></item></channel></rss>