<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: cartmann68</title>
    <description>The latest articles on DEV Community by cartmann68 (@cartmann68).</description>
    <link>https://dev.to/cartmann68</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3643040%2F09df1c9c-884e-40fd-b13e-b5c1eef12716.png</url>
      <title>DEV Community: cartmann68</title>
      <link>https://dev.to/cartmann68</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cartmann68"/>
    <language>en</language>
    <item>
      <title>The cost of simplicity</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 02 Sep 2026 06:29:28 +0000</pubDate>
      <link>https://dev.to/cartmann68/the-cost-of-simplicity-1o42</link>
      <guid>https://dev.to/cartmann68/the-cost-of-simplicity-1o42</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;The simplest solution is usually best only while the problem itself is simple.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This simple statement is often overlooked in software engineering. Many developers are drawn to the idea of simplicity, but they fail to recognize that simplicity is not an absolute quality. It is relative to the complexity of the problem being solved.The recurring argument that sounds sensible at first is — why complicate things, is only valid when the problem itself is genuinely simple. When the problem is complex, refusing to acknowledge that complexity does not make it disappear. It merely forces that complexity to reappear somewhere else, often in a much uglier form.&lt;/p&gt;

&lt;p&gt;Why use TypeScript and React when simple HTML and JavaScript already works? Why use Next.js when plain direct DOM APIs are enough? In operating system design, the same question could be asked about virtual memory and page tables. Why introduce all the machinery of address translation, TLBs, and page faults when the CPU could simply access physical RAM directly?&lt;/p&gt;

&lt;p&gt;That instinct is not foolish in and of itself. In fact, it is often correct. If the problem is genuinely small, the simplest solution is usually the best one. A tiny static website does not need a large application framework. A small embedded system running one fixed program may not need virtual memory. A shed does not need the structural systems of a skyscraper. The mistake begins when we take something that works beautifully at small scale and assume that it must therefore remain the best solution at large scale.&lt;/p&gt;

&lt;p&gt;Imagine a man who has built a wooden shed in his backyard. He needed some lumber, nails, a roof, a door, and perhaps a window. The whole thing could fit on a simple sketch. There are no elevators, no fire-suppression systems, no reinforced concrete core, no emergency stairwells, no backup generators, no ventilation shafts, no structural calculations for wind loads hundreds of feet above the ground. Now imagine that same man standing beside his shed and pointing toward a skyscraper in the distance. He shakes his head and says, “Look at all that unnecessary complexity. Pumps, elevators, steel reinforcement, control systems, fire doors, electrical rooms, emergency exits, drainage, backup power. I built my shed without any of that.” Everything he says about his shed is true. His conclusion is still absurd.&lt;/p&gt;

&lt;p&gt;The skyscraper is not complicated because its engineers enjoy complication. It is complicated because eighty floors of people create problems that a shed never has to solve. The requirements themselves have changed. Once hundreds or thousands of people must safely live or work inside the same structure, entirely new problems appear: vertical transportation, fire evacuation, water pressure, structural movement, power distribution, ventilation, sewage, communication, and redundancy. The complexity did not originate in the architect's imagination — it came from reality.&lt;/p&gt;

&lt;p&gt;Software works the same way. A simple website may be created with little abstraction and very few dependencies. But a serious, large-scale enterprise web application requires much more. It has to handle authentication, responsive data loading, caching, error handling, client-side routing, internationalization, smooth transitions and animations, modern UI/UX practices, loading and error states without a full page refresh, route middleware, granular access controls, complex business logic and a host of other concerns. The requirements themselves have changed. The complexity came from the client's requirements.&lt;/p&gt;

&lt;p&gt;While a simple embedded system might be fine with direct memory access and a flat RAM structure. The simplest possible memory model is wonderfully direct. The CPU has an address, and that address refers to a physical location in RAM. If the processor requests address 42,000, the machine reads the byte stored at physical address 42,000. For a tiny computer running one fixed program, this is elegant. There is almost nothing between the program and the hardware. However, a serious operating system has to manage hundreds of processes running at the same time, protect their memory from each other, allow programs to grow in memory dynamically, two programs may want to share the same library, files should be mapped directly into memory, you want to give programs contiguous memory, manage memory fragmentation, consider performance, security and deal with hardware quirks all at the same time. At this scale a direct memory model is no longer optima and would introduce more complexity than using a virtual memory model with page tables, TLBs and address translation. Again, the complexity has come from the requirements of the system. Paging did not invent the need for isolation, sharing, dynamic growth, fragmented physical memory, or memory-mapped files. Those problems existed because modern computers were expected to do more. Paging gathered many of those problems into one coherent abstraction.&lt;/p&gt;

&lt;p&gt;Rocket science is not complicated because rocket scientists want to be clever. It is complicated because the requirements of spaceflight are complicated. A rocket must survive extreme acceleration, vibration, and temperature changes. It must carry enough fuel to reach orbit while being light enough to lift off the ground. It must be aerodynamically stable while being structurally sound. It must be able to communicate with ground control while protecting its electronics from radiation. The complexity has come from the physics itself.&lt;/p&gt;

&lt;p&gt;This is a recurring pattern in engineering: a mechanism may become more complicated locally in order to make the entire system simpler globally. The important question is whether the primitive tool still produces the simplest overall system once the problem is no longer primitive. If the requirements themselves are complicated, refusing architecture does not make the complexity disappear. It merely forces that complexity to reappear somewhere else, usually in a much uglier form: duplicated code, global state, special cases, scattered event handlers, undocumented conventions, fragile assumptions, and enormous chains of conditionals.&lt;/p&gt;

&lt;p&gt;Much of civilization itself is built this way. We live on top of layers of systems that allow us to interact with enormous complexity through simple interfaces. At small scale, informal systems are often superior because formal structure would cost more than it provides. At large scale, the absence of structure becomes dangerous. Genuine complexity has to live somewhere. If the requirements are complicated, we cannot remove that complexity simply by refusing to acknowledge it. We can place it in abstractions, frameworks, type systems, schemas, hardware, documentation, institutions, conventions, or procedures. Or we can leave it scattered across people's memories, hidden assumptions, duplicated logic, manual work, and special cases. But it will live somewhere. Rejecting visible complexity often creates invisible complexity, and invisible complexity is usually more dangerous because nobody can clearly see where the rules are. The goal of engineering, then, is not simply to “make everything simple.” That advice is too shallow. Nor is the goal to use the most sophisticated tools available. The goal is to build the least complicated system that can reliably contain the actual complexity of the problem.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>Who should decide UI?</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:43:35 +0000</pubDate>
      <link>https://dev.to/cartmann68/who-should-decide-ui-162j</link>
      <guid>https://dev.to/cartmann68/who-should-decide-ui-162j</guid>
      <description>&lt;p&gt;What do you do as a product manager when your design team push for a clean, modern interface, while developers argue for the old, familiar UI?&lt;/p&gt;

&lt;p&gt;tldr;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You should always go with the solution of the designers because they are designing for users not programmers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Programmers are not the audience.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developers spend their life inside complex tools, terminals, logs, IDEs — clutter doesn’t bother them because they’re trained to survive it. But &lt;strong&gt;users are not developers&lt;/strong&gt;. Normal people don’t want interfaces that look like a cockpit from the 1990s.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Designers are literally trained to solve this problem.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A designer’s whole job is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visual hierarchy&lt;/li&gt;
&lt;li&gt;readability&lt;/li&gt;
&lt;li&gt;spacing&lt;/li&gt;
&lt;li&gt;usability&lt;/li&gt;
&lt;li&gt;clarity&lt;/li&gt;
&lt;li&gt;human factors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A programmer’s job is not design. Their taste is shaped by tools built for power-users.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Old, cluttered interfaces only feel “better” to developers because they expose internal structure.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Developers like seeing everything at once because it mirrors how &lt;em&gt;they&lt;/em&gt; think: data → structure → options → panels → nested menus. Users, on the other hand, get overwhelmed and leave.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Modern UI isn’t “minimalism for the sake of minimalism.”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Good modern design reduces friction. Not fewer features — fewer &lt;em&gt;obstacles.&lt;/em&gt; Clearer choices. Better flow. Safer defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Every successful product on earth follows the designer, not the engineer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Apple, Google, Stripe, Figma etc. all prefer a clean and modern UI. If “cluttered 1990s UI” were better for users, the entire industry wouldn’t have abandoned it.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Engineers usually change their mind once they &lt;em&gt;use&lt;/em&gt; the cleaner version&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At first they complain because everything moved. A week later they admit the new design feels calmer, faster, easier to navigate.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. &lt;strong&gt;The business side also points in one direction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Clean modern UI =&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lower support tickets&lt;/li&gt;
&lt;li&gt;higher conversion&lt;/li&gt;
&lt;li&gt;higher user trust&lt;/li&gt;
&lt;li&gt;easier onboarding&lt;/li&gt;
&lt;li&gt;better perceived quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clunky UI = “This looks old, I don’t trust it.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Design for users, not for developers.&lt;/strong&gt;&lt;br&gt;
Follow the clean, modern design.&lt;br&gt;
Developers can adapt — users won’t.&lt;/p&gt;

&lt;p&gt;If you want harmony between teams, the compromise is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;UI = clean, modern&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced settings = tucked away&lt;/strong&gt; so power-users can still access them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal developer tools&lt;/strong&gt; can be as ugly and cramped as programmers enjoy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Customer-facing products should be modern and clean.&lt;/p&gt;

</description>
      <category>management</category>
      <category>ui</category>
      <category>discuss</category>
      <category>design</category>
    </item>
    <item>
      <title>🔥</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:30:46 +0000</pubDate>
      <link>https://dev.to/cartmann68/-4n7o</link>
      <guid>https://dev.to/cartmann68/-4n7o</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/martinszeltins" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F189989%2Ff7e5f04d-bb5b-4f24-9980-d5ea7e7d139b.png" alt="martinszeltins"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/martinszeltins/why-javascript-is-the-best-programming-language-in-the-world-4062" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Why JavaScript Is the Best Programming Language in the World&lt;/h2&gt;
      &lt;h3&gt;Neo Hacker ・ Aug 29&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why you need event-driven architecture</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:25:49 +0000</pubDate>
      <link>https://dev.to/cartmann68/why-you-need-event-driven-architecture-5dk5</link>
      <guid>https://dev.to/cartmann68/why-you-need-event-driven-architecture-5dk5</guid>
      <description>&lt;h3&gt;
  
  
  Events are often used to decouple logic and keep a system modular.
&lt;/h3&gt;

&lt;p&gt;Events allow for a very modular architecture. Your system emits events at different points in time and this allows you to create a completely independent and pluggable module which hooks into these events without needing to make any changes to the core part of your system. For example, you might create a Notification module which listens to various events in your system and sends e-mail, text messages, push notifications and performs other actions related to notifying your users. All of this without ever needing to change any part of your existing codebase. Your module can have a single responsibility, be completely self-contained and independent.&lt;/p&gt;

&lt;p&gt;For example, POS systems often have a local law requiring them to implement the payment system as a completely separate module. Without events and hooks this becomes impossible. You look at the code and see that everything depends on everything, the payment system is intermingled with every other part of the system. You throw your arms up in the air and say, no way, this can't be done. Payments are the very core of a POS system. It runs through everything. But that is just a sign of a badly architected system. It doesn't need to be this way. Everything should not depend on everything. That's a brittle system. With an event-driven, modular architecture you simply emit events and let the payment module hook into these events and handle the logic.&lt;/p&gt;

&lt;p&gt;Think of a radio broadcast (emitting events). The broadcaster simply broadcasts into the air. Anyone who wants to and has a radio (listener) tuned to the frequency hears the message. The broadcaster doesn’t know or care who’s listening.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>distributedsystems</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Why abstractions are good</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:18:50 +0000</pubDate>
      <link>https://dev.to/cartmann68/why-abstractions-are-good-jim</link>
      <guid>https://dev.to/cartmann68/why-abstractions-are-good-jim</guid>
      <description>&lt;p&gt;Have you noticed how our world is built on abstractions? Abstractions are everywhere. We have abstractions in code - one library depends on another library which depends on another and so on. But it's not just code. We use abstractions every day. Every time you plug something into a wall outlet - you are using an abstraction, a huge electrical infrastructure with its own abstractions, completely invisible and hidden from you. When you drive your car, you don't operate with gears and wires, instead you turn a key, push a button, turn the steering wheel. You don't care how it works - you don't even &lt;em&gt;want&lt;/em&gt; to know how it works. You're using abstractions to get where you need to go.&lt;/p&gt;

&lt;h3&gt;
  
  
  A World without abstractions and dependencies
&lt;/h3&gt;

&lt;p&gt;Imagine a world without abstractions. Let's say you wanted to build a house. You'd need tools and materials but if you couldn't rely on abstractions and depend on the work of others, you would need to create all the tools and materials yourself. Just think of how much work goes into making something as simple as cement. You need limestone, clay, sand, and gypsum. But in order to get those things you need quarries, explosives, heavy machinery, fuel, trained operators, safety systems, transportation. And each of those depends on even more things. It's almost an infinite chain of dependencies.&lt;/p&gt;

&lt;p&gt;If you were building a house without using any dependencies, you'd need to create your own tools. Think of how many things are involved in making a power drill - motor, a chuck, a trigger, a shell. A motor needs magnets. Those magnets alone require an entire industry: mining rare earth metals, crushing ore, separating the elements through complex chemical processes, sintering them at high temperatures, machining them, coating them so they don’t corrode.&lt;/p&gt;

&lt;p&gt;In software development, a function relies on a library, that library relies on other libraries, all of it runs inside an environment, which depends on system libraries, which itself sits on top of an operating system, which depends on hardware, which ultimately depends on silicon and the physical world underneath it.&lt;/p&gt;

&lt;p&gt;The real world depends on abstractions, an almost infinite supply chain of dependencies. And that’s the whole point: none of us could ever build anything meaningful alone. We stand on top of the work of millions of people we’ll never meet, quietly building layer after layer so the world feels simple on the surface. Abstractions are what let us make progress. They let us create without having to reinvent the entire universe first.&lt;/p&gt;

&lt;p&gt;Once you see that, you start appreciating the hidden scaffolding underneath everything — and you realize how impossible life would be without it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What DRY actually means</title>
      <dc:creator>cartmann68</dc:creator>
      <pubDate>Wed, 03 Dec 2025 09:16:26 +0000</pubDate>
      <link>https://dev.to/cartmann68/what-dry-actually-means-3ngj</link>
      <guid>https://dev.to/cartmann68/what-dry-actually-means-3ngj</guid>
      <description>&lt;p&gt;A lot of junior developers misunderstand DRY (Don't Repeat Yourself) as a strict rule against any code duplication. To them DRY means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;never repeat a line of code&lt;/li&gt;
&lt;li&gt;never have two components share similar structure&lt;/li&gt;
&lt;li&gt;never write anything twice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something &lt;em&gt;looks&lt;/em&gt; similar, they feel obligated to merge it, abstract it, or build a “super component” with flags and conditions. Of course, the result is always the same: &lt;strong&gt;Overcomplicated, brittle, unreadable code that was technically DRY — and practically unusable.&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pizza Recipes
&lt;/h2&gt;

&lt;p&gt;Imagine if a cookbook tried to follow the the DRY principle to the extreme. Instead of having separate recipes for different types of pizza, it would try to create one giant single pizza recipe that covers every possible variation - one "single universal pizza recipe".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Use tomato sauce unless you’re making quattro formaggi — in that case, ignore this and jump to the cheese section.&lt;br&gt;
Add pineapple only if not using anchovies or mushrooms. If using both, skip pineapple and go to page 245, see section b.&lt;br&gt;
If using olives, skip basil unless also adding mushrooms…, in that case turn to page 658”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Technically DRY — only one pizza recipe. But completely unusable. In real life, we keep &lt;strong&gt;multiple recipes&lt;/strong&gt;, even if some steps repeat. And that’s &lt;em&gt;correct&lt;/em&gt;. Repetition of harmless steps is not a problem. Confusing everything into one monstrosity &lt;em&gt;is&lt;/em&gt; a problem. It's perfectly fine to have every pizza recipe start with "Take the dough and roll it out." because clarity is more important than eliminating every repeated line.&lt;/p&gt;

&lt;h2&gt;
  
  
  IKEA Furniture Manuals
&lt;/h2&gt;

&lt;p&gt;Imagine if IKEA tried to be DRY by shipping one giant instruction manual for all their furniture instead of separate manuals for each product.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If assembling a chair, skip to page 573.&lt;br&gt;
If your item uses bolt type B2, follow section 19.&lt;br&gt;
If you’re building something with drawers, go to section 1447 unless it’s the office series…”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That would be completely insane and unusable. Instead, IKEA provides &lt;strong&gt;individual manuals&lt;/strong&gt; for each product, even if many steps repeat across manuals. Because clarity is more important than eliminating every repeated step.&lt;/p&gt;

&lt;p&gt;The same principle applies to code. You don't search the codebase for every instance of "class extends Model" to merge them into one mega-class. You create &lt;strong&gt;many small, focused classes&lt;/strong&gt; that are easy to understand and maintain.&lt;/p&gt;

&lt;p&gt;The DRY principle is about avoiding duplication of &lt;em&gt;knowledge&lt;/em&gt;, not avoiding duplication of &lt;em&gt;keystrokes&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicating &lt;em&gt;logic&lt;/em&gt; is bad.&lt;/li&gt;
&lt;li&gt;Duplicating &lt;em&gt;meaning&lt;/em&gt; is bad.&lt;/li&gt;
&lt;li&gt;Duplicating &lt;em&gt;rules&lt;/em&gt; is bad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not about trying to avoid duplicating &lt;em&gt;structure&lt;/em&gt;. It is often the &lt;strong&gt;healthy, maintainable&lt;/strong&gt; thing to do. Don't try to eliminate every repeated line of code by merging unrelated logic, stuffing everything into one mega-component, making endless if-statements, adding flags or creating abstractions nobody understands. That only produces coupled, brittle, unreadable code that is dangerous to change. This is &lt;strong&gt;not&lt;/strong&gt; what DRY means.&lt;/p&gt;

&lt;p&gt;True DRY is about removing duplication of concepts and rules, like centralizing email validation, having one shared price-calculation function, using a composable that handles quantity logic, or extracting truly shared behavior. This produces code that is clear, testable, easy to maintain, and respects boundaries.&lt;/p&gt;

&lt;p&gt;Remember, we don't have one huge pizza recipe or one giant IKEA manual. Nobody wants that.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
