<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: shaman-apprentice</title>
    <description>The latest articles on Forem by shaman-apprentice (@shaman-apprentice).</description>
    <link>https://forem.com/shaman-apprentice</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F65145%2F44c05b1f-677b-4226-aaef-a669e969ab52.jpg</url>
      <title>Forem: shaman-apprentice</title>
      <link>https://forem.com/shaman-apprentice</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/shaman-apprentice"/>
    <language>en</language>
    <item>
      <title>The Component Library is dead, long live the Component Library</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:05:02 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/the-component-library-is-dead-long-live-the-component-library-1fj8</link>
      <guid>https://forem.com/shaman-apprentice/the-component-library-is-dead-long-live-the-component-library-1fj8</guid>
      <description>&lt;p&gt;AI is changing a lot in our industry - but there's no rose without a thorn. For example, open source is having a tough time, as discussed in &lt;a href="https://youtu.be/l8pQeVVaqpY?t=193" rel="noopener noreferrer"&gt;Open source is dying&lt;/a&gt; due to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;pr spam/slop&lt;br&gt;
dumber/angrier users&lt;br&gt;
install vs prompt&lt;br&gt;
funding problems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another thorn is discussed in &lt;a href="https://arxiv.org/abs/2603.22106" rel="noopener noreferrer"&gt;From Technical Debt to Cognitive and Intent Debt&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With generative AI automating more development work, knowing how much debt is acceptable in a particular organization or project remains uncertain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In contrast to the shadows of those thorns, I want to shine on one of the rose's beauties: &lt;strong&gt;The Component Library is dead, long live the Component Library&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I think this is a perfectly fitting snowclone. Component libraries have been reinvented (&lt;em&gt;died and crowned again&lt;/em&gt;) many times and AI is changing the cost-benefit trade-off. Follow my train of thoughts and I'd really appreciate your perspective!&lt;/p&gt;

&lt;h2&gt;
  
  
  The starting situation
&lt;/h2&gt;

&lt;p&gt;Imagine you are working at a small company in 2024 that offers a collection of excellent niche products for a specialized market. The company wants to migrate large parts of its digital solutions to the web and you get hired to get the job done. You are not building a single static web product, but migrating a collection of solutions. Naturally, you will need a component library and more (&lt;a href="https://medium.com/@vishal.p_95435/why-ui-component-libraries-are-no-longer-optional-in-modern-web-development-ee7eef16eaae" rel="noopener noreferrer"&gt;1&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Building your own component library from scratch is out of scope. Existing code uses different Angular versions, so you decide to stick with Angular. There are strong requirements for heavy table usage. This essentially narrows your choice down to &lt;a href="https://primeng.org/" rel="noopener noreferrer"&gt;PrimeNG&lt;/a&gt;. So, you build upon it.&lt;/p&gt;

&lt;p&gt;Two years later, you are somewhat disappointed with PrimeNG:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrations from v17 -&amp;gt; v18 -&amp;gt; v19 -&amp;gt; v20 -&amp;gt; v21 were painful and always including undocumented breaking changes (&lt;a href="https://www.reddit.com/r/Angular2/comments/1ixwz46/primeng_sucks" rel="noopener noreferrer"&gt;2&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;The PrimeNG Team announces to shift away from PrimeNG in favour of a new library PrimeNGX (&lt;a href="https://www.reddit.com/r/angular/comments/1ly0wsr/primeng_will_split_to_primeng_soon/" rel="noopener noreferrer"&gt;3&lt;/a&gt;) - yay, more migration work to do - and revised the announcement later (&lt;a href="https://www.linkedin.com/posts/%C3%A7a%C4%9Fatay-%C3%A7ivici-1579b0129_angular-activity-7384233462016233472-ZH0T" rel="noopener noreferrer"&gt;4&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;In 2024 and 2025, you were able to contribute a bug fix and some docu improvements (&lt;a href="https://github.com/primefaces/primeng/pulls?q=author:shaman-apprentice" rel="noopener noreferrer"&gt;5&lt;/a&gt;); however in 2026 there are over 200 open pull requests. Will even your latest &lt;a href="https://github.com/primefaces/primeng/pull/19508" rel="noopener noreferrer"&gt;simple docu typo fix&lt;/a&gt; get merged soon?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For your next feature, you need to select data in a nested select box and re-use that data for a nested table. PrimeNG's &lt;a href="https://primeng.org/treeselect" rel="noopener noreferrer"&gt;tree select&lt;/a&gt; and &lt;a href="https://primeng.org/treetable" rel="noopener noreferrer"&gt;tree table&lt;/a&gt; seem to be a perfect match, at first glance. But you soon realise, that the data models between tree select and tree table require a bridge layer and you run into multiple bugs like &lt;a href="https://github.com/primefaces/primeng/issues/18194" rel="noopener noreferrer"&gt;6&lt;/a&gt;, &lt;a href="https://github.com/primefaces/primeng/issues/14499" rel="noopener noreferrer"&gt;7&lt;/a&gt; or &lt;a href="https://github.com/primefaces/primeng/issues/18485" rel="noopener noreferrer"&gt;8&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Offering to fix those bugs does not promise quick results, especially since your &lt;a href="https://github.com/primefaces/primeng/issues/18704" rel="noopener noreferrer"&gt;last offering&lt;/a&gt; was ignored. Time is a precious resource. You have already  spent some time in upgrading legacy code from Angular 13 to latest Angular, removing old Angular Material usages, introducing PrimeNG next to Bootstrap... You don't want to ask for additional time to work on a custom component library, or integrate yet another external library.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI tools for the rescue?
&lt;/h2&gt;

&lt;p&gt;Trying out the new magic AI toolbox is cheap. Others have also already come up with the basis idea (&lt;a href="https://www.linkedin.com/pulse/libraries-dead-long-live-sanjoy-das-5ruxc" rel="noopener noreferrer"&gt;9&lt;/a&gt;, &lt;a href="https://honcho.agency/design-systems/the-future-of-design-systems-the-death-of-the-static-library-and-how-ai-is-rewriting-it" rel="noopener noreferrer"&gt;10&lt;/a&gt;), which is encouraging. What we basically can do is prompt a coding agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need to select data of the format &lt;em&gt;X&lt;/em&gt; in a nested select box. In another place we want to display the selected data in a nested table. PrimeNG's &lt;a href="https://primeng.org/treetable" rel="noopener noreferrer"&gt;tree table&lt;/a&gt; and &lt;a href="https://primeng.org/treeselect" rel="noopener noreferrer"&gt;tree select&lt;/a&gt; seem like a good fit. However, the current implementation &lt;strong&gt;here&lt;/strong&gt; has run in bugs within PrimeNG like &lt;a href="https://github.com/primefaces/primeng/issues/18194" rel="noopener noreferrer"&gt;bug 1&lt;/a&gt;, &lt;a href="https://github.com/primefaces/primeng/issues/14499" rel="noopener noreferrer"&gt;bug 2&lt;/a&gt; or &lt;a href="https://github.com/primefaces/primeng/issues/18485" rel="noopener noreferrer"&gt;bug 3&lt;/a&gt;. The required data bridge in &lt;strong&gt;ref:myCode&lt;/strong&gt; adds maintenance overhead and is a source for bugs.&lt;/p&gt;

&lt;p&gt;Therefore, write a reusable tree-table and tree-select component in my &lt;em&gt;components&lt;/em&gt; folder. The interface should look like &lt;em&gt;Y&lt;/em&gt;. The look and feel should integrate smoothly with PrimeNG's components. Feel free to ask PrimeNG's MCP server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;... and after some iterations ...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now migrate my feature &lt;em&gt;F&lt;/em&gt; to use the newly created tree-table and tree-select components.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Within two working days, there was a customized tree-table and tree-select and the feature was migrated to use them. It now works as expected - without having had to ask for extra time.&lt;/p&gt;

&lt;h2&gt;
  
  
  How will the future evolve?
&lt;/h2&gt;

&lt;p&gt;Creating the skeleton took about two hours. Most of the time was spent understanding the generated code, fixing hidden bugs, and refining the UI/UX.&lt;/p&gt;

&lt;p&gt;Of course, it would be ideal if open source component libraries made this kind of effort not needed at all in the future - maybe they will improve and we should wait it out?&lt;/p&gt;

&lt;p&gt;How much time will be consumed by those custom components for future upgrades of Angular and PrimeNG? Will it become more cost-effective in the future to go with a coding agent as "component library team" gradually replacing PrimeNG until we completely eject PrimeNG and maintain everything ourselves?&lt;/p&gt;

&lt;p&gt;How will our own component age? Will it look vintage in five years’ time, while PrimeNG components will have latest best practices? Or will it basically be the same, but PrimeNG changes forcing some look and feel changes on our users, being annoying without real improvements?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How will the next crowned component library look like and how long will it reign? I am looking forward to your thoughts in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Software engineering is an interwoven part of the loop</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Thu, 22 Jan 2026 14:58:10 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/software-engineering-is-an-interwoven-part-of-the-loop-2hge</link>
      <guid>https://forem.com/shaman-apprentice/software-engineering-is-an-interwoven-part-of-the-loop-2hge</guid>
      <description>&lt;p&gt;In my computer science studies at university, I learned that about two thirds of all software projects are neither delivered on time nor within budget. At the time, this seemed ridiculous to me. It doesn't anymore, despite having worked with many smart people for ten years since.&lt;/p&gt;

&lt;p&gt;How can this be? Poor handovers? Weak business ideas? Broken feedback loops? My overall guess is that we excel within our own specialties but lack interest and insights into the full value chain needed for a successful digital product. Engineering excellence alone is rarely enough.&lt;/p&gt;

&lt;p&gt;In this article, I invite you to follow my thoughts and share a set of recommendations for leveling up.&lt;/p&gt;

&lt;h1&gt;
  
  
  TLDR - My key takeaways
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;User-centered design&lt;/strong&gt; is important. The famous &lt;a href="https://dora.dev/research/2024/dora-report" rel="noopener noreferrer"&gt;DORA 2024 Accelerate State of DevOps report&lt;/a&gt; even highlights this as the most important skill.&lt;/li&gt;
&lt;li&gt;Socio-technical skills are important.&lt;/li&gt;
&lt;li&gt;AI is a rapidly evolving, exciting technology that can help us to get out ideas faster.&lt;/li&gt;
&lt;li&gt;I recommend to explore different disciplines along the complete value chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  1. What are we building?
&lt;/h1&gt;

&lt;p&gt;The obvious goal is to develop a product for customers. In most cases we also want revenue to exceed costs. So, we need to find a problem people are both eager to solve and willing to pay for.&lt;/p&gt;

&lt;p&gt;This sounds easy, yet is probably the hardest part. Consider two examples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I had asked people what they wanted, they would have said faster horses (Henry Ford)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In retrospect, investing into automobile development, like Ford did, was an obvious call. As contrasting example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I think there is a world market for maybe five computers (Thomas Watson, chairman of IBM)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In retrospect, this is an obviously ridiculous bad call.&lt;/p&gt;

&lt;p&gt;However, at the time these decisions were made, uncertainty was high, information was incomplete, and outcomes were far from obvious. Product development lives in the uncomfortable space between insight, intuition and incomplete data.&lt;/p&gt;

&lt;p&gt;How can we improve our chances for those calls upfront? This is a science on its own and one which is still evolving. Three personal recommendations for leveling up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1053496967" rel="noopener noreferrer"&gt;The Mom Test: How to Talk to Customers &amp;amp; Learn if Your Business is a Good Idea When Everyone is Lying to You&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1039024781" rel="noopener noreferrer"&gt;Competing Against Luck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://community.designerup.co/c/product-design-ux-ui-course" rel="noopener noreferrer"&gt;Product Design (UX/UI) Course&lt;/a&gt; - my learning journey was really great and all my exercises finally came together into &lt;a href="//together-we-choose.de/en"&gt;Together, We Choose&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  2. Exploration and feedback loops
&lt;/h1&gt;

&lt;p&gt;If we do not excel in the previous part - understanding what we are building - software development will suffer. Requirements will change frequently, chosen architecture trade-offs will be based on false assumptions and become anti-trades. Preventing this early drift is paramount!&lt;/p&gt;

&lt;p&gt;Therefore, we need to explore and gather feedback as quickly as possible. This can be some user interviews, paper prototypes, digital prototypes, whatever works to evaluate your idea and reduce uncertainty.&lt;/p&gt;

&lt;p&gt;At the latest when you are ready to invest in digital prototypes or early versions, software developers usually enter the picture. The goal is not to build the full product with a perfect architecture. Instead, the architecture must support ongoing exploration.&lt;/p&gt;

&lt;p&gt;Exploration likely requires collaboration across roles. Business analysts, customers, designers, developers, investors, managers, etc. need to work together: Come up with ideas, hand them over, build experiments, evaluate outcomes and exchange knowledge again and again. For that, engineering excellence alone is obviously not enough. We need short, effective feedback loops and people skills to profit from everyone's expertise. In the bigger picture, it is often beneficial to deliberately accept technical debts as trade-off for faster exploration.&lt;/p&gt;

&lt;p&gt;As a side note: AI can help you to generate ideas and lately even generate full prototypes for exploration. However, don't mistake those little generated apps as production ready, secure, bug free, cash-cow apps - if it were that simple, users could prompt the AI themselves instead of giving you their money. And AI-slop, bugs, security incidents, etc. can irreparably damage user confidence in you and your product, like &lt;a href="https://nx.dev/blog/s1ngularity-postmortem" rel="noopener noreferrer"&gt;the gigantic nx s1ngularity incident&lt;/a&gt; caused by an AI implemented mini feature.&lt;/p&gt;

&lt;p&gt;One of the core ideas of the Agile movement is to encourage feedback loops and maximize the amount of work not done aka waste. I strongly agree with these principles. However, in my humble opinion, parts of the surrounding consulting industry have diluted the message over time. I recommend to level up in the terms &lt;strong&gt;user-centered design&lt;/strong&gt; and &lt;strong&gt;socio-technical skills&lt;/strong&gt;, e.g. with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1001337585" rel="noopener noreferrer"&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.robbowley.net/2025/09/04/maybe-it-wasnt-the-tech-after-all/" rel="noopener noreferrer"&gt;Maybe it wasn’t the tech after all&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1048523700" rel="noopener noreferrer"&gt;The Phoenix Project A Novel about IT, DevOps, and Helping Your Business Win&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  3. Engineering excellence
&lt;/h1&gt;

&lt;p&gt;Once, we have managed to create a valuable product, we need to maintain and evolve it. In reality, we have likely already sacrificed the cleanliness of a greenfield project in favor of  exploration and evaluation. Therefore, we need engineering skills to navigate and improve.&lt;/p&gt;

&lt;p&gt;Technical perfection in software development does not exist, and even if it did, it would probably be a waste of money. The goal is to improve structure, reduce risk, and increase the system’s ability to change, so we can continuously support the ongoing product exploration and development.&lt;/p&gt;

&lt;p&gt;This also has a socio-technical component: If you change something, you may overlook some previous trade-offs which still hold value. Teams can get tired of yet another change. Or you may unintentionally hurt someone’s feelings by questioning decisions they once made under very different constraints.&lt;/p&gt;

&lt;p&gt;Resources I recommend for leveling up technical expertise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1045516967" rel="noopener noreferrer"&gt;Refactoring: Improving the Design of Existing Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1033342625" rel="noopener noreferrer"&gt;Working Effectively with Legacy Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thalia.de/shop/home/artikeldetails/A1003067068" rel="noopener noreferrer"&gt;Clean Code: A Handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;And most importantly: Code your own work, accumulate your own experience and apply your common sense - if you don't see value in the next hype just save your time and energy and don't fall into the fear of missing out trap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Final call-out
&lt;/h1&gt;

&lt;p&gt;I'm curious about your thoughts. Your feedback is very welcome. Feel free to comment here and connect with &lt;a href="https://bsky.app/profile/torstensevering.bsky.social" rel="noopener noreferrer"&gt;me on bsky&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>design</category>
      <category>learning</category>
      <category>ai</category>
    </item>
    <item>
      <title>AI-assisted Test Driven Development Experiment Quick Takes</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Sun, 26 Oct 2025 21:10:29 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/ai-assisted-test-driven-development-experiment-quick-takes-17fe</link>
      <guid>https://forem.com/shaman-apprentice/ai-assisted-test-driven-development-experiment-quick-takes-17fe</guid>
      <description>&lt;p&gt;Intrigued by Kent Beck's blog &lt;a href="https://tidyfirst.substack.com/p/augmented-coding-beyond-the-vibes" rel="noopener noreferrer"&gt;Augmented Coding: Beyond the Vibes&lt;/a&gt;, I wanted to experiment with AI-assisted Test Driven Development capabilities. For that, I coded the small library &lt;a href="https://github.com/shaman-apprentice/release-parrot" rel="noopener noreferrer"&gt;release-parrot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This blog is a quick personal review - any feedback is very welcome 🤗&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick takes
&lt;/h2&gt;

&lt;p&gt;Did AI&lt;sup id="fnref1"&gt;1&lt;/sup&gt; help me to&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;finish the project quicker? I assume &lt;strong&gt;no&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;write a better test suite?&lt;sup id="fnref2"&gt;2&lt;/sup&gt; I assume &lt;strong&gt;no&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;improve the code quality? I assume &lt;strong&gt;no&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;improve the documentation? &lt;strong&gt;Yes!&lt;/strong&gt; It relieved me of the (for me) tedious task of documentation and did it well. For example, before publishing I reviewed everything myself. Afterwards, I simply asked AI 'Is the project ready for its first release?' And AI found two errors in the documentation, that I had overlooked (it had forgotten to update a section when it had made some changes. But I hadn't caught them either at the time). In the final review, AI did a better job than me - nice! &lt;/li&gt;
&lt;li&gt;level up? I assume &lt;strong&gt;yes&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;I used Node.js' native test runner for the first time and tried out JSDoc instead of TS for strong typing. At the beginning, it was nice to have AI write the code, so that I didn't have to look up everything first. However, I read some docs anyway. I honestly don't know, if I would have been equally fast and had gained a deeper and more lasting understanding, if I had read the related documentation first.&lt;/li&gt;
&lt;li&gt;The opportunity to ask questions and get detailed answers (which should be critically examined), to ask differently or more in-depth again and get further detailed answers, was nice brain-food for me, which I used for further information retrieval.&lt;/li&gt;
&lt;li&gt;The AI-generated code tended to differ from my code-style and it was educational to think about the pros and cons in comparison.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Why do I sometimes only assume a yes/no answer? I love coding myself. Waiting for AI and reading all its stuff was exhausting for me. I think, I know, how I would have done it without AI. But I didn't actually do it. So I feel, that an honest, objective comparison is not possible by me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did the project create real value?
&lt;/h3&gt;

&lt;p&gt;I don't think so. Probably, I could utilize something already battle-tested like &lt;a href="https://github.com/semantic-release/semantic-release" rel="noopener noreferrer"&gt;semantic-release&lt;/a&gt; instead of writing my own library.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can AI produce production code from start to finish without senior supervision?
&lt;/h3&gt;

&lt;p&gt;For now, I have strong doubts. Even in this small project, AI sometimes got stuck in its loop and produced hundreds of lines of not working as intended code for a simple 3-lines-like change I wanted to do. Bad prompting? Bad luck? How much would that worsen in a bigger code base - amplified by accumulated amounts of AI-code which got not crushed down by senior supervision? &lt;/p&gt;

&lt;p&gt;For the time being, I think AI is a great tool! But it is not (yet?) ready to be a senior developer by itself.&lt;/p&gt;

&lt;h4&gt;
  
  
  Footnotes
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;small id="fn1"&gt;
[1] I used GPT-5-Codex (Preview), Claude Sonnet 3.5 and 4. You can find my basic &lt;a href="https://github.com/shaman-apprentice/release-parrot/blob/trunk/.github/prompts/000_tdd.prompt.md" rel="noopener noreferrer"&gt;TDD prompt here&lt;/a&gt;.
&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small id="fn2"&gt;
[2] I strongly believe more tests or higher test coverage have &lt;strong&gt;nothing&lt;/strong&gt; to do with test quality. Tests which give me confidence for refactoring, or serve as documentation are good tests. Tests which help me to define an interface or to verify that my logic works as expected are good tests. However, tests have to be maintained and IMHO can even have a negative total effect on the maintainability of a code base.
&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>tdd</category>
    </item>
    <item>
      <title>AI is amazing — but let's keep our critical thinking on</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Wed, 10 Sep 2025 13:09:40 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/ai-is-amazing-but-lets-keep-our-critical-thinking-on-10b1</link>
      <guid>https://forem.com/shaman-apprentice/ai-is-amazing-but-lets-keep-our-critical-thinking-on-10b1</guid>
      <description>&lt;p&gt;There is a lot of financial investment and hype about AI. I have heard many different assessments of the impact of AI, especially regarding the value of AI for the software development industry. Here are two examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
    &lt;td&gt;
      &lt;blockquote&gt;
        &lt;p&gt;"my basic assumption is that each software engineer will just do much, much more for a while. And then at some point, yeah, maybe we do need less software engineers."&lt;/p&gt;
        (&lt;a href="https://stratechery.com/2025/an-interview-with-openai-ceo-sam-altman-about-building-a-consumer-tech-company" rel="noopener noreferrer"&gt;Sam Altman&lt;/a&gt;)
      &lt;/blockquote&gt;
    &lt;/td&gt;
    &lt;td&gt;
      &lt;blockquote&gt;
        &lt;p&gt;"We know with near 100% certainty that this bubble will pop, causing lots of investments to fizzle to nothing. However what we don’t know is when it will pop, and thus how big the bubble will have grown, generating some real value in the process, before that happens. [...] We also know that when the bubble pops, many firms will go bust, but not all. When the dot-com bubble burst, it killed pets.com, it killed Webvan… but it did not kill Amazon"&lt;/p&gt;
        (&lt;a href="https://martinfowler.com/articles/202508-ai-thoughts.html" rel="noopener noreferrer"&gt;Martin Fowler&lt;/a&gt;)
      &lt;/blockquote&gt;
    &lt;/td&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even if you, as a developer, don’t believe in the long-term quality of AI-generated code - and even if you’re right - it will still affect you. Why? Because most decision-makers, up to the C-level, think otherwise.&lt;/p&gt;

&lt;p&gt;So, I think every developer should look into the AI hype. In this blog post, I will first share my thoughts on productivity gains through AI. In addition, I want to point to some aspects of AI, I believe we should talk more about.&lt;/p&gt;

&lt;h1&gt;
  
  
  My thesis about productivity gains by AI
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;I believe, AI has the capability to make us more productive.&lt;/strong&gt; It can support brainstorming, offer implementations and architecture ideas, or give hints for issues in code. It can speed up the actual coding with auto-completions and do stuff in agent mode.&lt;/p&gt;

&lt;p&gt;However, the initial coding is only a small part of software development. I am curious to see how the maintenance and further development of AI-assisted code will turn out. Will technical debts become a huge burden, requiring time-consuming and expensive software modernization projects? Or will AI become so good that it can still implement new features in its own mess? I suspect the former.&lt;/p&gt;

&lt;p&gt;From my point of view, it is still a good trade-off. I believe, the biggest hurdle for software development is to create useful, impactful software and evaluate it as early as possible in the market. Once, the market is better understood and software is adopted by customers, software modernization projects are doable and economical viable. AI helps us, to do the first part faster, which is very valuable. For the second part, it probably is also a helpful tool. &lt;/p&gt;

&lt;p&gt;Further resources I recommend reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;a href="https://economics.mit.edu/news/daron-acemoglu-what-do-we-know-about-economics-ai" rel="noopener noreferrer"&gt;MIT Economics&lt;/a&gt;, Nobel-winning economist Acemoglu "estimates that over the next decade, AI will produce a “modest increase” in GDP between 1.1 to 1.6 percent over the next 10 years, with a roughly 0.05 percent annual gain in productivity."&lt;/li&gt;
&lt;li&gt;According to &lt;a href="https://dora.dev/research/2024/dora-report" rel="noopener noreferrer"&gt;DORA 2024 Accelerate State of DevOps&lt;/a&gt; "Early adoption is showing some promising results, tempered by caution." Organization-level performance is estimated to increase 2.3% per 25% increased AI adaption and team-level performance to increase 1.4% per 25% increase in AI adoption. However, software delivery performance seems to be negatively impacted by AI adoption. Effect on product performance seems to be unclear.&lt;/li&gt;
&lt;li&gt;Based on &lt;a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/" rel="noopener noreferrer"&gt;a randomized controlled trial study&lt;/a&gt; AI might not increase performance at all for complex systems with experienced developers who are already familiar with the code.&lt;/li&gt;
&lt;li&gt;Results of latest &lt;a href="https://venturebeat.com/ai/stack-overflow-data-reveals-the-hidden-productivity-tax-of-almost-right-ai-code" rel="noopener noreferrer"&gt;Stack Overflow's 2025 Developer Survey&lt;/a&gt; show increase in technical debts due to AI usage.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://colton.dev/blog/curing-your-ai-10x-engineer-imposter-syndrome" rel="noopener noreferrer"&gt;No, AI is not Making Engineers 10x as Productive&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Points I think we should talk more about
&lt;/h1&gt;

&lt;p&gt;Let's dive into points, I think we should watch critically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Availability and purchase price?
&lt;/h2&gt;

&lt;p&gt;AI usage for consumers is currently unbelievable cheap, as multiple companies are competing for market share. I assume that this is only a brief, temporary situation. Based on an estimation in &lt;a href="https://www.cnbc.com/2025/08/08/chatgpt-gpt-5-openai-altman-loss.html" rel="noopener noreferrer"&gt;cnbc&lt;/a&gt; Microsoft has lost $5 billion in 2024 with OpenAI. At some point, they will monetize their investment or stop offering it. &lt;a href="https://www.wheresyoured.at/wheres-the-money/" rel="noopener noreferrer"&gt;There Is No AI Revolution&lt;/a&gt; is the most negative article I found, as a contrast to all the positive hype, expecting the latter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indirect costs of AI investments?
&lt;/h2&gt;

&lt;p&gt;In addition to the direct costs, I also see indirect costs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources could have been spent elsewhere
&lt;/h3&gt;

&lt;p&gt;Research time and funding are limiting factors in the software industry. Putting a lot of time and money into AI tooling and adaption takes away resources from other projects. Are those AI initiatives really the best investment of time and budget? Or are we neglecting more impactful alternatives out of fear to miss the AI train and be left behind?&lt;/p&gt;

&lt;p&gt;As a side note: Personally, the fear of being left behind, if we don't adopt AI right now, is fascinating to me. The barrier to entry for AI tools is amazingly low. Just write what you want to your AI chat. Read one or two blogs about best prompting practices, maybe watch a few videos and &lt;strong&gt;experiment&lt;/strong&gt; what gives you the best results - that's it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not all (AI) features are good features
&lt;/h3&gt;

&lt;p&gt;Some features just clutter up the user experience and negatively impact product value. For example, when I am looking for a new microwave, I immediately rule out those with more than 2 buttons; I just want to heat up my stuff and having to go through multiple button combinations is annoying.&lt;/p&gt;

&lt;p&gt;AI opens the door to a lot of possible features. But just because you can integrate AI, doesn't mean you should. Let me point to &lt;a href="https://support.mozilla.org/de/kb/how-use-ai-enhanced-tab-groups" rel="noopener noreferrer"&gt;Firefox's AI-enhanced tab groups&lt;/a&gt;. For me, it adds exactly zero value. On some computers, &lt;a href="https://www.theregister.com/2025/08/13/firefox_ai_scoffing_power" rel="noopener noreferrer"&gt;it led to massive CPU usage and energy drain&lt;/a&gt;. That does not only clutter up the user experience but actively hurts the usability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duolingo's AI-first bet
&lt;/h3&gt;

&lt;p&gt;In April 2025, Duolingo announced plans to become an AI-first company. The immediate impact was a big increase in share value and a media shitstorm (&lt;a href="https://designerly.com/duolingo-ai-first/" rel="noopener noreferrer"&gt;designerly.com&lt;/a&gt;). Since then, the increase in share value has reverted, but the real revenue and user count seem to be stable, for now. How much of future change in revenue, user count, share value etc, can be tracked back to this decision is hard to tell. Certainly, the product decision is a fundamental change and it is unclear whether it will increase profitability, or cause users to leave the platform in the long-term. I prefer a more risk-less product development, when you already have a very successful product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;AI agents enable a complete new spectrum of security attack vectors. For example as reported by &lt;a href="https://www.msn.com/en-nz/news/other/urgent-warning-to-all-1-8b-gmail-users-over-new-wave-of-threats-stealing-accounts/ar-AA1IJsiF" rel="noopener noreferrer"&gt;msn.com&lt;/a&gt;, emails can contain invisible font instructions to tell the user, that his password was leaked and he should go to a malicious site and reset his password there. The user won't see nor read it. But an AI summarizing this email might alert the user to do as instructed. Even worse, if the AI can act on its own, it might directly leak your password as instructed. The underlying core problem is also called the &lt;a href="https://simonwillison.net/2025/Jun/16/the-lethal-trifecta" rel="noopener noreferrer"&gt;the lethal trifecta for AI agents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Besides some beliefs, AI-generated code is not free of security issues - quite the contrary: As summarized &lt;a href="https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c" rel="noopener noreferrer"&gt;in this security incident&lt;/a&gt; a vibe coded feature led to a malicious release of well-established Nx build tool, leading to at least hundreds of infested computers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environmental and societal costs?
&lt;/h2&gt;

&lt;p&gt;Research on the environmental impact of AI is in its early stage. But it is undeniable, that AI training and usage consume a lot of energy, critical raw materials and water, as for example reported in &lt;a href="https://news.mit.edu/2025/explained-generative-ai-environmental-impact-0117" rel="noopener noreferrer"&gt;MIT News&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Research on the societal impact of AI is also in its early stage. But you don't need much imagination to see that misinformation strengthened by AI can disrupt democratic processes or that the accumulation of capital and power in the hands of a few AI companies can worsen global inequality. See for example &lt;a href="https://originality.ai/blog/the-13-societal-costs-of-undetectable-ai-content" rel="noopener noreferrer"&gt;originality.ai/blog&lt;/a&gt; for more on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal risks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fortune.com/2025/09/05/anthropic-reaches-1-5-billion-settlement-with-authors-in-landmark-copyright-case" rel="noopener noreferrer"&gt;In a landmark copyright case&lt;/a&gt;, Anthropic has agreed to pay $1.5 billion to authors as compensations for using pirated content as training data. This settlement is focused on the pirating part and does not resolve the general copyright issue around generative AI. But it does point toward a direction, that compensation for copyright is needed and that it will costs billions of dollars. &lt;/p&gt;

&lt;p&gt;Another open question is whether the creator of an AI can be held legally accountable for the output of the AI. A Professor from Aarhus University shares in &lt;a href="https://onlinelibrary.wiley.com/doi/10.1111/acps.70022" rel="noopener noreferrer"&gt;this article&lt;/a&gt; his concern "that probability of the hypothesis of generative artificial intelligence chatbots fueling delusions in individuals prone to psychosis being true is quite high. If it is indeed true, we may be faced with a substantial public (mental) health problem". &lt;a href="https://www.nbcnews.com/tech/tech-news/family-teenager-died-suicide-alleges-openais-chatgpt-blame-rcna226147" rel="noopener noreferrer"&gt;A recent, most tragic case&lt;/a&gt; is a lawsuit filed by the parents of a 16-year-old against OpenAI's ChatGPT. Their son chatted about his suicidal condition for two weeks. He got reinforced by the chat and ChatGPT even gave further tips how to take his life. The boy sadly, finally took his own life.&lt;/p&gt;

&lt;h2&gt;
  
  
  With all those challenges and uncertainties, why the mega hype?
&lt;/h2&gt;

&lt;p&gt;I value AI as another tool and look forward to working with it more in the future. Am I afraid of missing out on something important, or am I afraid of being overtaken by AI technologies? No, I view the hype with great confidence and distinguish between a "good" and a "bad" hype.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "good" hype
&lt;/h3&gt;

&lt;p&gt;Products with AI's current capabilities already have the ability to earn a lot of money:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I use AI almost daily at work and have experimented with agent coding. It already makes me more productive and I am curious about future improvements. So, I happily pay for the services. Right now, I am paying a small amount of money for it. Imagine at what price I, you or your company would stop paying for the services and hire expensive employees instead?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.semrush.com/blog/ai-search-seo-traffic-study" rel="noopener noreferrer"&gt;semruch.com&lt;/a&gt; predicts AI search visitors to surpass traditional search visitors in 2028 and the average AI visitor is worth more than 4x the traditional organics search visitor. To make these figures more tangible: Google ad revenues from search alone in 2023 is reported by &lt;a href="https://www.oberlo.com/statistics/google-ad-revenue" rel="noopener noreferrer"&gt;oberlo.com&lt;/a&gt; to be over $175 billion.&lt;/li&gt;
&lt;li&gt;Imagine, AI can analyse biological patterns better than humans and help with research for new medicine. Maybe even cure more types of cancer. As summarized in &lt;a href="https://en.wikipedia.org/wiki/Healthcare_industry" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt; the healthcare industry is one of the world's largest industries consuming over 10 percent of GDP of most developed nations - a huge financial potential.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "bad" hype
&lt;/h3&gt;

&lt;p&gt;My thesis is, that the great progress of LLMs arrives at a time, when many managers are frustrated that their software projects are neither on schedule nor within the budget, while developers are a major cost driver. That is why there is a great desire for LLMs to actually get the job done much cheaper and better than the current status quo.&lt;/p&gt;

&lt;p&gt;In addition, our free market demands growth. AI promises exactly that, making it very attractive to investors.&lt;/p&gt;

&lt;p&gt;As a further booster, content creators on social media earn money by content views. Click-baits like "This new model is so unbelievable, all developers will be unemployed soon" seem to generate a lot of clicks and can be done again almost every week with the next unbelievable model.&lt;/p&gt;

&lt;p&gt;All this over-fuels the hype surrounding the promises of AI.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final words
&lt;/h1&gt;

&lt;p&gt;In my opinion, AI offers amazing new capabilities and we would be fools to not embrace them and experiment with them. However, AI is not a free, magic tool, which will make all our expertise worthless.&lt;/p&gt;

&lt;p&gt;What are your thoughts? I am looking forward to your comments!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>learning</category>
    </item>
    <item>
      <title>My opinion about opinionated Prettier: 👎</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Thu, 02 May 2024 21:12:39 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/my-opinion-about-opinionated-prettier-4hn9</link>
      <guid>https://forem.com/shaman-apprentice/my-opinion-about-opinionated-prettier-4hn9</guid>
      <description>&lt;p&gt;Let's first remember, that there is not only black and white. Like almost everything, &lt;a href="https://prettier.io/docs/en/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; comes with pros and cons. If it's a good or bad trade-off depends on you and your environment. &lt;/p&gt;

&lt;p&gt;This blog post has the following structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gains I see&lt;/li&gt;
&lt;li&gt;Costs I see&lt;/li&gt;
&lt;li&gt;Return on investment I see (only blurry)&lt;/li&gt;
&lt;li&gt;My conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gains I see
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Consistent, well formatted code is easier to read. &lt;/li&gt;
&lt;li&gt;Consistent formatting reduces diffs in pull requests, speeding them up.&lt;/li&gt;
&lt;li&gt;Creating a custom formatting style guide in your team is an investment of time. Even worse, it can lead to personal frustration when your preferred style gets rejected. Different custom style guides in different teams are annoying.
When you use Prettier, you don't have to invest any time, as Prettier enforces its style. Formatting will be the same for every team. Furthermore, personal frustration should be reduced, as you get overruled by a library with a huge community.
&lt;/li&gt;
&lt;li&gt;Prettier can be your one solution for formatting all your web stack (.ts, .html, .css, .json, ...).&lt;/li&gt;
&lt;li&gt;Every formatting violation can be automatically fixed by Prettier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Costs I see
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Prettier enforces rules without mercy and common sense. Sometimes, it makes formatting worse for me. For example, the following snippet is kept by Prettier:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;magicDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isMagicNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="nf"&gt;tap&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;magicDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pullBlueMagicRabbitOutOfTheHat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;But when I subscribe, it gets formatted to:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;magicDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isMagicNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="nf"&gt;tap&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;magicDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pullBlueMagicRabbitOutOfTheHat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Why is the &lt;code&gt;pipe&lt;/code&gt; now on its own line, giving every operator within an extra level of indentation? Is it really an improvement, that the max line length is honored, but now, the &lt;code&gt;tap&lt;/code&gt; has a different horizontal and vertical alignment than the other operators? No matter what the answers to those questions are, it's not helpful, that Prettier forces me to switch the formatting depending on the existence of the subscription in the last line.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Or let's look at the following two snippets formatted with Prettier:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-privacy-settings"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    @for (privacySetting of privacySettings; track privacySetting.identifier) {
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    }
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;and&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;

  @if (user.isAuthenticated) {
    &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"user-privacy-settings"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      @for (
        privacySetting of privacySettings;
        track privacySetting.identifier
      ) {
        &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      }
    &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  }
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Because I decided to only show the privacy settings, when the user is authenticated, the for loop now spans 4 lines. I find the one-liner easier to read, although it is one character over the max line length.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;Of course, you might argue, that I should refactor the code anyway. So, Prettier puts pressure on me when to refactor and when to go quick and dirty. Which might be a good or a bad thing depending on context, &lt;strong&gt;in my opinion&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prettier is a further tool in your toolchain. Every used tool has a risk of impacting your development. For example,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when I wanted to use Angular's new template syntax, I was initially blocked by Prettier, as it formatted the new syntax horribly.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;the technical decision &lt;a href="https://github.com/sveltejs/svelte/issues/11052" rel="noopener noreferrer"&gt;how Svelte should treat self-closing html elements was hindered by Prettier&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ideally we would also disallow self-closing void elements (i.e.  rather than ), but whether or not this is realistic depends on whether Prettier's current habit of adding an unnecessary /&amp;gt; to void elements prevents us from doing that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From my point of view, Prettier doesn't work well for styling with utility classes. For a discussion see &lt;a href="https://github.com/prettier/prettier/issues/7863" rel="noopener noreferrer"&gt;Prettier#7863&lt;/a&gt; or &lt;a href="https://github.com/prettier/prettier/issues/5948" rel="noopener noreferrer"&gt;Prettier#5948&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Return on investment I see (only blurry)
&lt;/h2&gt;

&lt;p&gt;How much time and energy can be saved by good formatting? How much time and energy do you have to invest for the savings?&lt;/p&gt;

&lt;p&gt;I think the gains are pretty low. That spacing, quotes, etc. are formatted uniformly is nice. But the extra complexity added by non-uniform formatting for reading code or pull requests is marginal. &lt;/p&gt;

&lt;p&gt;The costs are also pretty low. A tool like Prettier is performant enough to run every time you save a file. When you manually honor the formatting, the time is negligible compared to your overall working time. The only risk I see is, that you might burn emotional energy for potential marginal savings with discussions about something like single or doubled quotes.&lt;/p&gt;

&lt;h2&gt;
  
  
  My conclusion
&lt;/h2&gt;

&lt;p&gt;When a project has already decided to use Prettier, I wouldn't rebel against it. I think the potential gain from reopening the topic isn't worth the energy used for the discussion.&lt;/p&gt;

&lt;p&gt;But when I have free choice, I will not use Prettier. I claim, that I can do a better job with formatting code to be well readable than Prettier. At the latest when a technical decision is influenced by Prettier, I am convinced that freedom in any technical choice is more valuable than the advantages of Prettier.&lt;/p&gt;

&lt;p&gt;Currently, I am using ESLint for formatting of basic things like spacing and quotes. However, &lt;a href="https://eslint.org/blog/2023/10/deprecating-formatting-rules/#main" rel="noopener noreferrer"&gt;those rules were deprecated with v8.53.0&lt;/a&gt; and moved to &lt;a href="https://eslint.style/packages/default" rel="noopener noreferrer"&gt;@stylistic/eslint-plugin&lt;/a&gt;. But they recommend &lt;a href="https://prettier.io/docs/en/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt; or &lt;a href="https://dprint.dev/" rel="noopener noreferrer"&gt;dprint&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I am curious for new best practices. All trade-offs might change over time with new tools, new experiences and inputs from following developers. So please share your thoughts in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>formatting</category>
      <category>prettier</category>
      <category>development</category>
    </item>
    <item>
      <title>My journey and experienced trade-off with Tailwind CSS</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Thu, 21 Mar 2024 19:02:29 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/my-journey-and-experienced-trade-off-with-tailwind-css-fdd</link>
      <guid>https://forem.com/shaman-apprentice/my-journey-and-experienced-trade-off-with-tailwind-css-fdd</guid>
      <description>&lt;p&gt;In this article I will summarize my experience with Tailwind CSS. Why I have chosen it and why I have ejected it again after a while.&lt;/p&gt;

&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;I was in the lucky position to start a new web project. For styling I want to utilize utility classes. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My expectations for utility classes were:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Naming things is hard. It takes time and effort. Bad chosen names make maintenance harder. Don't have to think about names like &lt;code&gt;some-wrapper-for-whatever-reason&lt;/code&gt; and have to maintain them, should save time and energy to be more productive. &lt;/li&gt;
&lt;li&gt;Switching contexts and mapping between them is exhausting. Switching from and mapping between an HTML and a CSS file seems like a small thing. But I believe that the amount of contexts a programmer has to manage in his head is a bottleneck for good coding. Every little bit helps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My expectations for Tailwind CSS were:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It should help to get started quickly, as I don't have to create all utility classes by myself.&lt;/li&gt;
&lt;li&gt;It should ensure a standardized naming scheme for utility classes, as it is a well battle-tested library.&lt;/li&gt;
&lt;li&gt;It should protect me against zombies of once created but after a while unused utility classes, littering my CSS. &lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Experienced pros
&lt;/h1&gt;

&lt;p&gt;So let me wrap up my experienced pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utility classes let me code quickly new components and glue them together.&lt;/li&gt;
&lt;li&gt;IDE support in VS Code is great. Tailwind CSS IntelliSense supports autocomplete, linting and inline translation of applied CSS rule.&lt;/li&gt;
&lt;li&gt;It offers more than plain utility classes. For example, instead of &lt;code&gt;box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)&lt;/code&gt; you can apply class name &lt;code&gt;shadow&lt;/code&gt; or for &lt;code&gt;box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);&lt;/code&gt; you can apply class name &lt;code&gt;shadow-md&lt;/code&gt;. This is nice for two reasons. First, &lt;code&gt;shadow&lt;/code&gt; and &lt;code&gt;shadow-md&lt;/code&gt; are good short names. Second, the resulting shadow looks nice and saved me a few minutes of experimenting for myself with shadow values.&lt;/li&gt;
&lt;li&gt;The integration of Tailwind CSS into the build system ensures, that only class names, that are actual used, are included in the production build. A view observed falsely integrated class names are negligible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Experienced contras
&lt;/h1&gt;

&lt;p&gt;Unfortunately, as far as I know, there is no golden bullet to catch them all in Software Architecture no matter the topic, but everything is a trade-off. Here are the contras I experienced with Tailwind CSS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let me start with an example: &lt;code&gt;&amp;lt;section class="grid w-full grid-cols-[1fr,min(var(--width),100%),1fr] place-items-center gap-y-4 [&amp;amp;&amp;gt;*]:col-start-2"&amp;gt;...&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;This is quite long. I have to read my code many times (and yes, HTML is code as your JavaScript is or as your CSS is). Every time I am looking for something in my HTML, I get distracted a little by this amount of code.&lt;/li&gt;
&lt;li&gt;How should I format this code? In general I think a line length of 80 character is good for readability. We have already crossed that limit without even adding colors, colors for dark mode, ... So how do we split it up? How is it compatible with my existing formatting tooling like Prettier? So formatting is something I have to spent more time and energy on.&lt;/li&gt;
&lt;li&gt;One alternative for too many utility classes is to use them only, when you need a few. Use traditional classes otherwise or even combine them. For now, I think this is a good idea. But to be honest, it's a trade-off. You have to wonder how many are too much and you have to search for styles in two places.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grid-cols-[1fr...&lt;/code&gt; or &lt;code&gt;[&amp;amp;&amp;gt;*]&lt;/code&gt; are extra syntax I have to learn and remember, when writing and later reading this code.&lt;/li&gt;
&lt;li&gt;When some styles don't work as expected, the output in the DevTools is bloated. The rule &lt;code&gt;[&amp;amp;&amp;gt;*]:col-start-2"&lt;/code&gt; gets compiled to &lt;code&gt;.\[\&amp;amp;\&amp;gt;\*\]\:col-start-2&amp;gt;* { grid-column-start: 2; }&lt;/code&gt;. In addition, there are a lot of small rules in the styles section and a ton of never used CSS variables.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tailwind CSS adds build complexity (as a side note, I now think Tailwind CSS is a framework and not a library, as it forces you to integrate a specific build configuration):

&lt;ul&gt;
&lt;li&gt;It needs a configuration file, which feeds a PostCSS plugin under the hood.&lt;/li&gt;
&lt;li&gt;It increased my build time by almost 10 seconds.&lt;/li&gt;
&lt;li&gt;I have a shared Angular component library and a consuming app. Enabling sharing of generated class names needed extra thought. Hot reload of Tailwind CSS class names doesn't always work, decreasing my development feedback cycle. I am not sure, if this is a misconfiguration on my side, or a problem with Angular's and Tailwind CSS's compatibility. No matter what, debugging a "it works sometimes" problem always sucks and I haven't figured out that one so far. &lt;/li&gt;
&lt;li&gt;Native CSS Nesting requires an extra Tailwind plugin - what makes it not very native to me.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;I am not perfectly happy with all Tailwind CSS naming schemes. For example, I think &lt;code&gt;content-center&lt;/code&gt; should be named &lt;code&gt;align-center&lt;/code&gt; to align with the other flex direction, which is named &lt;code&gt;justify-center&lt;/code&gt; in Tailwind CSS. Or I think &lt;code&gt;text-base&lt;/code&gt; should be named &lt;code&gt;text-4&lt;/code&gt; to align with &lt;code&gt;p-4&lt;/code&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Sum up
&lt;/h1&gt;

&lt;p&gt;I think utility classes speed up your development and can help you with maintenance, if you don't overuse them. My opinion to Tailwind CSS is, that it adds more contras than pros and therefore, I am going to eject it from my project. &lt;/p&gt;

&lt;h1&gt;
  
  
  Final kudos to Tailwind CSS
&lt;/h1&gt;

&lt;p&gt;I am grateful for Tailwind CSS. It helped me to get quickly started with utility classes. There is a lot of good documentation and reasoning about utility classes in Tailwind CSS's documentation and related resources. &lt;/p&gt;

&lt;p&gt;And the best part is, I always knew that I can eject it easily. I can just generate all current class names via &lt;code&gt;npx tailwindcss -o utility.classes.css&lt;/code&gt;, include the plain CSS file in my project and refactor class names however I want later.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>architecture</category>
      <category>webdev</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>ADR applied exemplarily to the choice of frontend framework</title>
      <dc:creator>shaman-apprentice</dc:creator>
      <pubDate>Sun, 03 Mar 2024 19:00:53 +0000</pubDate>
      <link>https://forem.com/shaman-apprentice/adr-applied-exemplary-to-the-choice-of-frontend-framework-2kfl</link>
      <guid>https://forem.com/shaman-apprentice/adr-applied-exemplary-to-the-choice-of-frontend-framework-2kfl</guid>
      <description>&lt;p&gt;What the heck is an ADR? Do we really need to deal with another buzzword? Why should we create yet a further document?&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;Let's consider the following fictitious and simplified scenario as motivation: After 15 years, a customer wants to have his desktop application available as web page. This is a huge project. A new dev is hired for this and future projects. There is a kickoff with the customer's dev and PO, as well as sales and the new dev from your company. Among others, there is this little dialogue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Customer PO: In which framework will you implement the web page?&lt;br&gt;
Sales: Angular, right?&lt;br&gt;
New dev: Yes.&lt;br&gt;
Customer's dev: Really? But Angular is old and &lt;code&gt;insert your favorite framework&lt;/code&gt; is much better nowadays!&lt;br&gt;
Sales: Yeah, but Angular is a great fit for our needs, because *he looks intensively at the new dev&lt;br&gt;
New dev: Uhm, we already have two internal applications written in Angular, right? So we will use Angular for this project as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Probably no one is really satisfied with this answer. The new dev asks his colleagues afterwards about the choice of Angular:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Colleague 1: I don't care about the framework, as long as you get the job done. Using another framework than the one we already use needs probably time. So, I don't think it's feasible to use another.&lt;br&gt;
Colleague 2: We have always used Angular. But I am not too happy with it and I would love to try out another, newer framework.&lt;br&gt;
Colleague 3: I don't like frontend development in general. I don't want to work with Angular and I don't know why we have chosen it. The guy who picked it, has already left the company.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All this &lt;strong&gt;feels&lt;/strong&gt; frustrating. Although there weren't any real arguments against Angular so far. Let's make an ADR (Architectural Decision Record) and see how it helps us.&lt;/p&gt;

&lt;h2&gt;
  
  
  ADR 2023-12-30: Choice of frontend framework
&lt;/h2&gt;

&lt;p&gt;Status: Accepted&lt;br&gt;
Decision: We will use Angular&lt;br&gt;
Contributors: Dev 1, dev 2, dev 3, sales colleague 1&lt;/p&gt;

&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;

&lt;p&gt;We need to choose a frontend framework for the new project. Further web projects are expected in the near future. All those web projects will be long-lived products, meaning we expect to add features and maintain them for the next 10 years at least.&lt;/p&gt;

&lt;p&gt;Our team has already developed two small to medium sized Angular applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Decision's reasoning and consequences
&lt;/h3&gt;

&lt;p&gt;Angular is a modern frontend framework with stability and long-time support at its core. We already have Angular expertise in our team. It is easy to extract code from our existing Angular applications into a shared library for code reuse in new projects. The existing applications will likely also benefit from the development of new code for the new project, which can be done in a shared library as well.&lt;/p&gt;

&lt;p&gt;The fact that React has more third-party libraries available is not a problem for us. Our customers have very specific requirements and we expect that we have to develop most components by ourselves for maximal customization.&lt;/p&gt;

&lt;p&gt;We are excited about Angular’s upcoming renaissance. Whether the renaissance will defend Angular's current second place as most used frontend framework is too early to tell. However, based on Angular's long road so far, we assume that Angular will continue to release new features, which will be easy to integrate in our code and keep our web development competitive for a long time.&lt;/p&gt;

&lt;p&gt;We accept a high learning curve for new colleagues, which can be neglected compared to overall project time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Options
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Angular
&lt;/h4&gt;

&lt;p&gt;Angular has been around since 2010 and new versions are regularly released. It is Open Source although it is developed by Google. Backwards compatibility and upgradeability have always been an important goal of Angular. It has a big community and is adopted by many big companies. Its two-way data binding and dependency injection model provide good modularity and testability.&lt;/p&gt;

&lt;p&gt;In terms of developer interest, Angular wasn't the most famous in 2022. It has a high learning curve for beginners. Angular's default testing framework Karma was deprecated and there is no stable official replacement yet. Angular 17 addresses many of recent critics and describes itself as a renaissance.&lt;/p&gt;

&lt;h4&gt;
  
  
  React
&lt;/h4&gt;

&lt;p&gt;React has been around since 2013 and new versions are regularly released. It is Open Source although it is developed by Meta. It has a huge community and probably the most third party libraries of all frontend frameworks. Its JSX based syntax is easy to learn. As Facebook is build upon React, it is obviously possible to build a large long-lived application with it.&lt;/p&gt;

&lt;p&gt;Apart from a component-based approach, architectural decisions are left to developers. The state has to live within the React lifecycle, which can make separation of concerns harder. The hook based API is elegant to write but can become challenging to debug and maintain. Backwards compatibility between versions is not a major concern.&lt;/p&gt;

&lt;h4&gt;
  
  
  Other frameworks
&lt;/h4&gt;

&lt;p&gt;We are aware that there are many other frameworks such as Vue, Svelte, Qwik, Preact, LitElement, ... Each has its own advantages and disadvantages. We don't want to invest much time in them for now, because: First, we believe that every modern frontend framework has the features we need for our projects. And second, long-term support is very important to us. Regarding the second, React and Angular are the longest available modern frontend frameworks and therefore the most interesting fits on first sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What have we gained through above ADR?
&lt;/h2&gt;

&lt;p&gt;So we invested time in creating the ADR and added another document to our pile of documents somewhere. Let's evaluate the return to make sure this was a good investment.&lt;/p&gt;

&lt;p&gt;An ADR makes a decision explicit. Furthermore, it gives everyone the opportunity to contribute, as it is a public document forged by or at least accepted by the full team. The dialog from the motivation section will not bother much. The feeling that maybe it wasn't a good choice, becomes an informed decision, that everyone can look up.&lt;/p&gt;

&lt;p&gt;It also helps with future evaluation. When the expected advantages don't materialize, or the context changes, you can do a new ADR superseding the previous one, based on your learnings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two final things to note
&lt;/h2&gt;

&lt;p&gt;First, the options were obviously not complete nor an in-depth analysis. The question of how much time you should invest is difficult to answer and depends on the context. E.g. frontend technologies are rapidly developing. New hyped frameworks frequently occur. If you spent too much time in your research, chances are high that a new framework was published in the meantime. Jokes aside, depending on the context, expected gain and your resources, I think it is OK to spend a few hours for an ADR or even a full sprint.&lt;/p&gt;

&lt;p&gt;Second, when searching the internet, there are tons of different templates for ADRs. Some claim ADRs should be in plain texts. Others prefer tables and yet others bullet points. I think it is nice to have a common template, as it will help you to read them faster - just stick with a format that suits you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interesting Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions" rel="noopener noreferrer"&gt;https://www.cognitect.com/blog/2011/11/15/documenting-architecture-decisions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ozimmer.ch/practices/2020/04/27/ArchitectureDecisionMaking.html" rel="noopener noreferrer"&gt;https://www.ozimmer.ch/practices/2020/04/27/ArchitectureDecisionMaking.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/joelparkerhenderson/architecture-decision-record" rel="noopener noreferrer"&gt;https://github.com/joelparkerhenderson/architecture-decision-record&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://2022.stateofjs.com/en-US/libraries/front-end-frameworks/" rel="noopener noreferrer"&gt;https://2022.stateofjs.com/en-US/libraries/front-end-frameworks/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://survey.stackoverflow.co/2023/#overview" rel="noopener noreferrer"&gt;https://survey.stackoverflow.co/2023/#overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.imaginarycloud.com/blog/best-frontend-frameworks/" rel="noopener noreferrer"&gt;https://www.imaginarycloud.com/blog/best-frontend-frameworks/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>adr</category>
      <category>frontend</category>
      <category>framework</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
