<?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: Marco Sbragi</title>
    <description>The latest articles on DEV Community by Marco Sbragi (@bumbulik0).</description>
    <link>https://dev.to/bumbulik0</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%2F3819596%2F19259001-0460-4a19-8b99-0eec2a10ca17.jpg</url>
      <title>DEV Community: Marco Sbragi</title>
      <link>https://dev.to/bumbulik0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bumbulik0"/>
    <language>en</language>
    <item>
      <title>"Dead Man's Float" Approach To Surviving the Wave</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Tue, 16 Jun 2026 05:58:28 +0000</pubDate>
      <link>https://dev.to/bumbulik0/dead-mans-float-approach-to-surviving-the-wave-2f99</link>
      <guid>https://dev.to/bumbulik0/dead-mans-float-approach-to-surviving-the-wave-2f99</guid>
      <description>&lt;p&gt;Today, I want to talk about something that has absolutely nothing to do with code, system engineering, or software architecture. Or maybe, if we look closely enough, it has everything to do with it.&lt;/p&gt;

&lt;p&gt;We live and work in chaotic times. Sure, today’s modern toolsets and AI assistants allow us to offload some of the tedious, day-to-day syntax, making the core technical work slightly more relaxed. Yet, anyone in our industry knows the harsh truth: burnout is always lurking just around the corner. The screen stays on, the backlog grows, and the cognitive load compounds.&lt;/p&gt;

&lt;p&gt;There is a song by an Italian songwriter, Luciano Ligabue, called &lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=wBEDjLACn_U" rel="noopener noreferrer"&gt;"Metti in circolo il tuo amore"&lt;/a&gt;&lt;/em&gt; (Circulate Your Love). A specific stanza has stayed with me for years:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“E ti sei opposto all'onda / Ed è lì che hai capito / Che più ti opponi e più ti tira giù / E ti senti ad una festa / Per cui non hai l'invito / Per cui gli inviti adesso falli tu”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In English it sounds more or less like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“And you fought the wave / And that's when you realized / That the more you fight it, the more it pulls you down / And you feel like you're at a party / To which you have no invitation / So from now on, you make the invitations yourself”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These few words triggered a deep reflection in me, and they eventually shaped my personal survival philosophy: &lt;strong&gt;"Fare il morto a galla"&lt;/strong&gt;—doing the &lt;strong&gt;dead man's float&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you are far out at sea, exhausted, and the currents take over, fighting the water is a mathematical error. The more you thrash, the more oxygen you burn, the denser your body becomes, and the faster you sink. The only scientifically and existentially correct strategy is to stop kicking. You flip onto your back, offer your maximum surface area to the water, and let the sea hold you up. &lt;/p&gt;

&lt;p&gt;In our profession, doing the float is the only real way to catch your breath when you are drowning in inputs. It is a strategic timeout. It’s not giving up; it’s an extreme optimization of your remaining energy when the system is in thermal throttling.&lt;/p&gt;

&lt;p&gt;But Ligabue’s lyrics go further: &lt;em&gt;“So from now on, you make the invitations yourself.”&lt;/em&gt; That line carries a profound, almost architectural weight. It’s about shifting from a purely reactive state to an active one. It means stopping the constant scramble to meet external expectations, and instead, redefining the rules of your own space. I could spend paragraphs explaining exactly what this means to me, but I prefer to leave it open. In engineering, we value clean abstraction; in life, some concepts are best left for the reader to implement in their own way.&lt;/p&gt;

&lt;p&gt;I know this is incredibly difficult to practice. The external inputs—the notifications, the metrics, the pressure to always perform—are overwhelming. The world demands constant computation.&lt;/p&gt;

&lt;p&gt;But sometimes, the most productive thing a senior mind can do is to drop the frequency to zero, lie back, and float. &lt;/p&gt;

&lt;p&gt;And you? When the waves get too high and the current is strong, how do you catch your breath?&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
      <category>burnout</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Software Development as a Philosophical Act: Beyond Syntactic Sugar</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Fri, 12 Jun 2026 05:49:46 +0000</pubDate>
      <link>https://dev.to/bumbulik0/software-development-as-a-philosophical-act-beyond-syntactic-sugar-2n32</link>
      <guid>https://dev.to/bumbulik0/software-development-as-a-philosophical-act-beyond-syntactic-sugar-2n32</guid>
      <description>&lt;p&gt;Recently, a reader Alton &lt;a href="https://dev.to/alton_zheng_15fb4bf0d73a3/comment/39b0p"&gt;left a comment&lt;/a&gt; on my &lt;a href="https://dev.to/bumbulik0/700-followers-800-reads-in-3-months-maybe-old-school-engineering-still-resonates-4jb5"&gt;previous post&lt;/a&gt;, asking a challenging question: &lt;em&gt;How do you approach teaching or mentoring others to maintain an "old school" engineering mindset in today’s AI-driven environment?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This made me reflect deeply on my years as an instructor. Long before the advent of Large Language Models, I always operated under a core principle: &lt;strong&gt;software development — when understood not merely as typing syntax, but as architecting solutions — is fundamentally rooted in philosophy.&lt;/strong&gt; I am not talking about textbook academic philosophy, though perhaps that would help too. I am talking about a structural mindset. Of course, as engineers, we must eventually translate thought into practice and deliver a concrete, working result. But the philosophical approach to a problem is what wins the long game.&lt;/p&gt;




&lt;p&gt;Years ago, when I was teaching Visual Basic, I constantly drilled into my students that searching for a solution is entirely independent of the programming language. The language itself is just an implementation detail, a tool to be studied. &lt;/p&gt;

&lt;p&gt;During the first week or two, some students would actually protest. They would look at me and say, &lt;em&gt;"You aren't teaching us."&lt;/em&gt; They expected predefined standards, snippets to copy, and rote memorization. But I refused to give them the answers. I enforced boundaries, models, and constraints. Over time, as they realized that the solutions to complex bugs and logic loops were suddenly originating from their own reasoning without my intervention, they finally understood.&lt;/p&gt;

&lt;p&gt;They weren't just learning to code; they were learning how to think.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core: Seeing the Forest, Not Just the Trees
&lt;/h2&gt;

&lt;p&gt;In my career, the time spent typing code has always been a fraction of the time spent analyzing the problem and exploring potential paths. A trained engineering mind doesn't just fix the immediate bug or implement the current feature request; it looks at how the system will evolve over time. It anticipates the client's next needs by looking at the whole forest, not just the single tree. It requires freeing your imagination to find non-conventional solutions or to refine existing ones.&lt;/p&gt;

&lt;p&gt;This is the exact opposite of how modern AI operates. LLMs predict the next token or the next line of code based on a statistical distribution derived from existing literature. By definition, AI operates within the boundaries of the statistically probable. But in real-world engineering, the standard, 'statistically probable' solution is rarely the elegant, tailor-made architecture your specific context demands.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One might argue that AI's randomness can sometimes mimic human intuition, occasionally assembling existing pieces into a novel puzzle no one has thought of before. But there is a fundamental difference: AI's randomness is a blind statistical roll of the dice. Human intuition, on the other hand, is a purposeful leap driven by an understanding of constraints. AI can generate a thousand unpredictable combinations, but it lacks the contextual judgment to know which puzzle actually makes engineering sense. It can suggest the pieces, but the architect must still design the picture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Analyzing and verifying requirements is a continuous mental exercise. Even if your reasoning ultimately leads you to rewrite standard, well-known patterns, the process itself is invaluable. It is the mental gym that keeps your brain flexible, disciplined, and ready for the unexpected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Language is a Detail, Autonomy is the Goal
&lt;/h2&gt;

&lt;p&gt;If you focus solely on the syntax of a language—whether it was Visual Basic decades ago, a trendy JavaScript framework last week, or an AI prompt today—you are trapping yourself in a commodity skill. When you look at a problem from a high architectural level, the language becomes a mere deployment detail.&lt;/p&gt;

&lt;p&gt;As a mentor, my goal has never been to hand out ready-made snippets. It is to force the developer to step back and look at the structural layout. That "click" moment—when a junior developer realizes they solved a complex architecture loop entirely on their own—is the moment they transition from being a simple executor to a true professional. &lt;/p&gt;

&lt;p&gt;In the AI era, this shift is critical. If you only know syntax, you are letting the AI do the thinking, which makes you obsolete. If you master structural reasoning, you learn how to learn. The AI becomes your high-speed compiler, but you remain the sole custodian of the system design.&lt;/p&gt;




&lt;h2&gt;
  
  
  Case Study: GemmaLink – Architecture Wins Over Syntax
&lt;/h2&gt;

&lt;p&gt;I had a chance to put this philosophy to the test during a recent challenge on DEV.to. The goal was to build an application leveraging Google's lightweight Gemma models. &lt;/p&gt;

&lt;p&gt;Instead of getting hypnotized by the AI model itself, I started with an architectural question: &lt;em&gt;What would be genuinely useful, fun, and capable of running entirely local—respecting privacy with zero cloud dependencies?&lt;/em&gt; That is how the idea for &lt;a href="https://dev.to/bumbulik0/gemmalink-your-private-eye-assistant-3fgg"&gt;GemmaLink&lt;/a&gt; was born.&lt;/p&gt;

&lt;p&gt;Then came the engineering constraints. I knew the target user shouldn't have to deal with installing Docker, configuring Python environments, or setting up complex LLM studios. The app needed to be a single, lightweight, zero-dependency binary that could run anywhere. &lt;/p&gt;

&lt;p&gt;The ideal architectural fit for this was Go—a language I only knew at a basic level. &lt;/p&gt;

&lt;p&gt;Did I let that stop me? No. Because the language is just a detail. I used AI extensively to generate the Go syntax, acting as a tireless assistant. But the core architecture, the strict definition of requirements, the data layout, the testing, and the debugging? That was entirely mine. Without a structured engineering mindset setting the boundaries, the AI would have just generated generic Python scripts completely useless for my deployment constraints. Architecture won over syntax.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The Human Element of Mentoring
&lt;/h2&gt;

&lt;p&gt;At the end of the day, passing down an "old school" mindset cannot be compressed into a rigid set of mathematical rules. Mentoring isn't something you can automate because it is built entirely on empathy, active listening, and human communication. A good mentor must first know how to listen, setting aside their own biases to understand how the student thinks.&lt;/p&gt;

&lt;p&gt;My goal is to instill rigor and structure, but the curiosity, the drive, and the final decisions must always belong to the developer. It took me years of practice, experimentation, and trial to shape this mindset—and truth be told, even I struggle to fully rationalize it sometimes. But that is exactly how it should be. We are not all wired the same way, and each of us connects with others differently.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More of my thoughts and technical articles can be found at &lt;a href="https://www.nospace.net" rel="noopener noreferrer"&gt;nospace.net&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What do you think? Does this "learning to learn" approach make sense in your current AI-driven context? Let's discuss in the comments below.&lt;/p&gt;




</description>
      <category>discuss</category>
      <category>mentorship</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>700+ Followers, 800+ Reads in 3 Months: Maybe "Old School" Engineering Still Resonates</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Thu, 11 Jun 2026 04:59:38 +0000</pubDate>
      <link>https://dev.to/bumbulik0/700-followers-800-reads-in-3-months-maybe-old-school-engineering-still-resonates-4jb5</link>
      <guid>https://dev.to/bumbulik0/700-followers-800-reads-in-3-months-maybe-old-school-engineering-still-resonates-4jb5</guid>
      <description>&lt;p&gt;I was looking at my &lt;strong&gt;DEV dashboard&lt;/strong&gt; recently, and I am genuinely moved. In the last three months, I’ve recorded approximately &lt;strong&gt;800+ reads&lt;/strong&gt;, and &lt;strong&gt;700+ of you&lt;/strong&gt; have decided to follow my journey. That is a nearly &lt;strong&gt;1:1 ratio&lt;/strong&gt; between readers and followers—a statistic I never expected.&lt;/p&gt;

&lt;p&gt;In an industry often obsessed with the "next big thing," seeing that a traditional, &lt;strong&gt;"old school"&lt;/strong&gt; approach to engineering resonates so strongly is both surprising and deeply rewarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  It’s Not About the Tool, It’s About the Mindset
&lt;/h3&gt;

&lt;p&gt;Throughout my &lt;strong&gt;40-year career&lt;/strong&gt;, I’ve seen countless "revolutionary" technologies come and go. I’ve transitioned from manual memory management to high-level frameworks, and from monolithic architectures to Dockerized environments.&lt;/p&gt;

&lt;p&gt;Today, the conversation is dominated by &lt;strong&gt;AI&lt;/strong&gt;. But for someone who has witnessed the evolution of compilers and the birth of modern IDEs, I see it for what it is: &lt;strong&gt;another powerful tool at our disposal.&lt;/strong&gt; Tools change, as they always have, but the &lt;strong&gt;engineering mindset&lt;/strong&gt; remains constant. Whether you are writing a Bash script, designing a RAG system, or refactoring a legacy Java monolith, what matters is the discipline behind the work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Understanding the "why"&lt;/strong&gt; before the "how."&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Treating code as a long-term asset&lt;/strong&gt;, not a disposable snippet.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Prioritizing architecture and maintainability&lt;/strong&gt; over raw speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quality Over Quantity
&lt;/h3&gt;

&lt;p&gt;What strikes me most isn't just the number of followers, but the quality of the time you spend with my words. My data shows peaks of &lt;strong&gt;908 seconds (over 15 minutes)&lt;/strong&gt; of average reading time on March 27th and April 2nd. Even recently, on June 9th, you spent an average of nearly &lt;strong&gt;8 minutes (477 seconds)&lt;/strong&gt; per post.&lt;/p&gt;

&lt;p&gt;In a world of skim-reading and short attention spans, &lt;strong&gt;you are studying&lt;/strong&gt;. You are looking for depth, and that gives me great hope and strength to continue writing for the future of our industry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Now?
&lt;/h3&gt;

&lt;p&gt;Now that I am retired, I am no longer obsessed with production deadlines or the need to satisfy executives and clients. I finally have the time to look back and share what I've learned.&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;self-taught developer&lt;/strong&gt; who has "broken and fixed" systems for four decades, I feel my role now is to help maintain this focus on craftsmanship. It is easy to get lost in automation, but automation is only as good as the engineer directing it. I want to share the &lt;strong&gt;rigor and "maestria"&lt;/strong&gt; that allow a developer to remain calm when a migration fails or a system crashes—moments where no tool can substitute for experience and a solid mental framework.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Lesson That Always Works
&lt;/h3&gt;

&lt;p&gt;I’ve learned one thing above all: &lt;strong&gt;"Questions" are more important than "answers."&lt;/strong&gt; This applies not only to code development but to general design and every aspect of life.&lt;/p&gt;

&lt;p&gt;As long as you keep asking questions—to yourselves, to a mentor, to a colleague, or to an AI—your curiosity to learn and improve will lead you to exceptional results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank You
&lt;/h3&gt;

&lt;p&gt;To the 700+ of you who have joined me: &lt;strong&gt;thank you&lt;/strong&gt;. You are proving that "old school" values—analysis, architecture, and engineering integrity—are far from obsolete. They are, in fact, the very foundation upon which all new technologies must be built.&lt;/p&gt;

&lt;p&gt;I am excited to continue this conversation in my series: &lt;strong&gt;"Beyond the Prompt: Why Experience Still Matters."&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Let’s keep building with the right mindset.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;You can also find me here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="https://www.nospace.net" rel="noopener noreferrer"&gt;nospace.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/msbragi?tab=repositories" rel="noopener noreferrer"&gt;msbragi repositories&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>community</category>
      <category>learning</category>
      <category>discuss</category>
      <category>developers</category>
    </item>
    <item>
      <title>Beyond the Prompt: Why Experience Still Matters</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Mon, 08 Jun 2026 05:21:59 +0000</pubDate>
      <link>https://dev.to/bumbulik0/beyond-the-prompt-why-experience-still-matters-39kp</link>
      <guid>https://dev.to/bumbulik0/beyond-the-prompt-why-experience-still-matters-39kp</guid>
      <description>&lt;h2&gt;
  
  
  My profile: 40 years of IT evolution
&lt;/h2&gt;

&lt;p&gt;My name is Marco and I am an IT professional with 40 years of experience spent across software development, analysis, and architecture. Technically I am retired, but I continue to dedicate myself to code to keep my mind active and to give back to a community that has given me so much. Today, I do not look at innovation with suspicion, but with the method of someone who can distinguish a passing trend from a paradigm shift. Now I am dedicating a large part of my time to studying Artificial Intelligence systems and RAG (Retrieval-Augmented Generation), developing a privacy-oriented Agnostic RAG System. I am not a "Luddite": I am a craftsman learning to use a new chisel, fully aware however that the hand guiding it must know the grain of the wood better than the tool itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core: The engineering as craft
&lt;/h2&gt;

&lt;p&gt;This series of articles was born to reaffirm a concept that AI marketing is trying to obscure: software engineering is a craft, not a simple sequence of instructions dictated to a machine. We are sliding dangerously toward "Vibe Coding", where the important thing is that the code "looks" like it works at first glance. However, a vast gulf exists between coding speed and architectural solidity.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vibe Coding:&lt;/strong&gt; It relies on the illusion of speed and the myth of an 8x increased productivity. It often ignores technical debt and complexity, limiting itself to pasting generated snippets that no one truly understands under the hood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Senior Architect Mindset:&lt;/strong&gt; It considers code as a long-term asset. Here, productivity is measured in maintainability and the capacity to prevent structural failures. An architect does not stop at "it works now", but evaluates architectural patterns and the total cost of ownership of the software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The true danger of the 8x myth is &lt;strong&gt;Recursive AI&lt;/strong&gt;: the concrete risk of feeding models mediocre code generated by other models, creating a spiral of quality degradation that only an experienced human eye can interrupt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Serie's roadmap: The first 5 stages of awareness
&lt;/h2&gt;

&lt;p&gt;Through five fundamental stages, with a bit of ironic salt, I will accompany you into my "old craftsman" workshop to explore how to remain engineers in a world of prompts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/beyond-the-8x-productivity-myth-a-40-year-perspective-on-recursive-ai-and-the-craft-of-bk8"&gt;Beyond the 8x Productivity Myth&lt;/a&gt;:&lt;/strong&gt; A cold shower on real productivity. We will analyze the dangers of Recursive AI and why pure speed, without architectural control, is the fastest way to destroy a project.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/ai-coding-philosophy-2eoj"&gt;AI coding philosophy&lt;/a&gt;:&lt;/strong&gt; How to integrate LLMs into the workflow without losing your soul. A reflection on how to delegate the fatigue, but never the responsibility for quality.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/clean-ai-development-3e51"&gt;Clean AI Development&lt;/a&gt;:&lt;/strong&gt; We apply the principles of Clean Code to automated generation. If the AI writes dirty code and you accept it, the problem is not the machine, it's you.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/the-senior-architect-simulator-how-i-hacked-copilot-to-hate-my-code-36ib"&gt;The Senior Architect Simulator&lt;/a&gt;:&lt;/strong&gt; A provocative challenge. I will show you how I "hacked" Copilot to force it to hate mediocre code, forcing it to respect exceptionally high standards.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/ai-or-not-ai-19k1"&gt;AI, or not AI&lt;/a&gt;:&lt;/strong&gt; The final dilemma. Learning to understand when AI is a valuable ally and when instead it is necessary to turn off the prompt and return to pure, "Old School" logic.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The real value of experience for new devs generation
&lt;/h2&gt;

&lt;p&gt;To you, young colleagues: AI is a formidable tool, but do not let it become your cognitive crutch. The true differentiator of your career will never be the speed in generating a function, but the capacity to understand what happens "under the hood".&lt;br&gt;
I have seen languages born and die, but the logic of a Docker container or the structure of a database remain constant. Remember: AI will not save you at 3 AM when a corrupted database migration crashes production. In those moments, the "pain" of experience — that visceral awareness of how data moves — is the only thing that matters. Master the basics, study architectures, and use AI to noble your professionalism, not to replace it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion and debates
&lt;/h2&gt;

&lt;p&gt;I look forward to seeing you on DEV.to for the next chapters of this series. My virtual office is always open: I am available to discuss anything I know — from Java to NestJS — or to explore together the new frontiers I am studying. The comparison between my past and your future is the engine that keeps our profession alive.&lt;br&gt;
Always keep one thing in mind: quality code is the only currency that never depreciates, regardless of the technological paradigm of the moment. We will read each other soon.&lt;/p&gt;

</description>
      <category>development</category>
      <category>ai</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>Beyond the 8x Productivity Myth: A 40-Year Perspective on Recursive AI and the "Craft" of Engineering</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Sun, 07 Jun 2026 08:44:35 +0000</pubDate>
      <link>https://dev.to/bumbulik0/beyond-the-8x-productivity-myth-a-40-year-perspective-on-recursive-ai-and-the-craft-of-bk8</link>
      <guid>https://dev.to/bumbulik0/beyond-the-8x-productivity-myth-a-40-year-perspective-on-recursive-ai-and-the-craft-of-bk8</guid>
      <description>&lt;h3&gt;
  
  
  Introduction: The Ghost in the Codebase
&lt;/h3&gt;

&lt;p&gt;I started my professional journey in &lt;strong&gt;1986&lt;/strong&gt;. It was the era of Honeywell systems, Commodore 64s, and developing management software in &lt;strong&gt;DataFlex&lt;/strong&gt; on Concurrent-CPM. Back then, "compute" was a luxury; we planned every line of code because a single compilation could take enough time to grab a coffee—or two. &lt;/p&gt;

&lt;p&gt;Fast forward to 2026. I am reading the latest Anthropic paper, &lt;strong&gt;&lt;a href="https://www.anthropic.com/institute/recursive-self-improvement" rel="noopener noreferrer"&gt;"When AI builds itself"&lt;/a&gt;&lt;/strong&gt;. It describes a world where the "doing"—writing code, running experiments, and identifying bugs—is being delegated to autonomous agents. As a retired architect who still keeps his mind active by building, I see a fascinating but dangerous gap between the productivity metrics of big labs and the reality of sustainable, professional engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The "8x Productivity" Illusion
&lt;/h3&gt;

&lt;p&gt;The Anthropic report makes a staggering claim: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Today, Anthropic engineers on average ship 8x as much code per quarter as they did from 2021-2025"&lt;/em&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Furthermore, as of May 2026, more than &lt;strong&gt;80% of the code&lt;/strong&gt; merged into their codebase is authored by Claude. To a manager, this sounds like a dream. To a Senior Architect, it looks like a potential nightmare of technical debt. &lt;/p&gt;

&lt;p&gt;Anthropic themselves admit a crucial limitation: while AI is superhuman at optimizing code (achieving up to a &lt;strong&gt;52x speedup&lt;/strong&gt; in specific tests), there are still &lt;em&gt;"large performance gaps when it comes to Claude exercising judgement in choosing goals"&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;In my 40 years, I’ve learned that "choosing the goal" &lt;em&gt;is&lt;/em&gt; the job. Writing the syntax is just the clerical work. If we automate the clerical part but lose the "judgment," we aren't 8x more productive—we are just 8x faster at creating complexity we don't fully understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Economic Barrier: $18,000 for a "Thought"
&lt;/h3&gt;

&lt;p&gt;One passage in the paper highlights the massive infrastructure gap facing freelancers and small shops:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The agents recovered 97% of the gap [in a research project] over 800 cumulative hours and used roughly $18,000 in compute"&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most independent developers cannot afford an &lt;strong&gt;$18,000 "experimental loop"&lt;/strong&gt; for a single feature. This is why I built &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/llm-manager-orchestrating-ollama-and-llamacpp-with-pure-bash-181p"&gt;LLM-Manager&lt;/a&gt;&lt;/strong&gt; using &lt;strong&gt;Pure Bash&lt;/strong&gt;. My goal is the opposite of a recursive loop that burns through thousands of dollars in cloud tokens. I want &lt;strong&gt;zero-overhead&lt;/strong&gt;, OS-level access, and hardware-aware orchestration that allows a developer to run local models (Ollama/Llama.cpp) with the efficiency of a 1980s engineer but the power of 2026 AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The "Vibe Coding" Trap and the Need for Determinism
&lt;/h3&gt;

&lt;p&gt;We are seeing a trend called &lt;strong&gt;"Vibe Coding"&lt;/strong&gt;—the idea that you can just "talk" to an AI, trust the output, and let it build. But "vibes" don't catch critical bugs. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Moonwell DeFi Hack:&lt;/strong&gt; In February 2026, a basic miscalculation in an AI-generated smart contract (authored by Claude Code) led to a &lt;strong&gt;$1.7 million loss&lt;/strong&gt; in four minutes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Responsibility Gap:&lt;/strong&gt; AI does not feel the weight of a system downtime. It simply continues to generate "statistically plausible" answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why my project, &lt;strong&gt;&lt;a href="https://github.com/msbragi/RAG-System-Dist" rel="noopener noreferrer"&gt;RAG-System-Dist&lt;/a&gt;&lt;/strong&gt;, prioritizes &lt;strong&gt;determinism and traceability&lt;/strong&gt; over opaque automation. I don't want an AI that "vibes" its way to an answer. I want a system where every response is linked to a source that I, the human expert, can verify with a single "Point-and-Click".&lt;/p&gt;

&lt;h3&gt;
  
  
  4. My Philosophy: Code is Craft
&lt;/h3&gt;

&lt;p&gt;On my site, &lt;a href="https://www.nospace.net" rel="noopener noreferrer"&gt;nospace.net&lt;/a&gt;, I advocate for a simple principle: &lt;strong&gt;Code is Craft&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;To me, being a developer in the age of LLMs isn't about knowing the syntax of C++, Python, or Java—the AI has already "saturated" those benchmarks. It is about the &lt;strong&gt;Architecture of Intent&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I even created a &lt;strong&gt;&lt;a href="https://dev.to/bumbulik0/the-senior-architect-simulator-how-i-hacked-copilot-to-hate-my-code-36ib"&gt;Hostile Architect Configuration&lt;/a&gt;&lt;/strong&gt; for GitHub Copilot as a joke (but not too much). Why? Because AI is often too polite; it tells you your bad ideas are good ones. Real engineers need a reality check. They need to understand the &lt;em&gt;why&lt;/em&gt; before the &lt;em&gt;how&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The Path for the Next Generation
&lt;/h3&gt;

&lt;p&gt;My fear for junior developers is that they might get trapped in an "addictive" cycle of AI-dependency, losing the ability to think through architectural trade-offs. &lt;/p&gt;

&lt;p&gt;If you want to survive the next 40 years in IT:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Master the Patterns:&lt;/strong&gt; Understand the redundancies.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Maintain Control:&lt;/strong&gt; Use the AI to speed up the &lt;em&gt;writing&lt;/em&gt;, but never delegate the &lt;em&gt;thinking&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Stay Deterministic:&lt;/strong&gt; Build systems that are verifiable and auditable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There isn't a single "right" way to implement a solution, but there is a way that follows &lt;strong&gt;your&lt;/strong&gt; mind. If the code is part of your thinking, it will still be clear to you a year from now.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thoughts: Responsibility and Ownership
&lt;/h3&gt;

&lt;p&gt;Only an experienced engineer can evaluate architectural trade-offs, check if a solution fits the real business context, and take responsibility for the final product. Today, AI is not the brain of development, but its hands. It makes the process faster, but direction and meaning must still come from a human.&lt;/p&gt;

&lt;p&gt;If the code is part of your thinking, it will still be clear to you a year from now. If it’s just a "vibe," it will be a ghost in your codebase.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S. Maybe I’m just "old-school"? Or perhaps 40 years in the trenches have given me a different perspective on what "craft" really means. What do you think? Are we gaining productivity or just losing control?&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;About the Author:&lt;/strong&gt; I am an IT operator with 40 years of experience. I’ve seen the world move from floppy disks to recursive AI agents, and I still believe that the most important "compute" happens between the ears of the engineer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: This post was originally written in Italian my native language and refined to English with the assistance of an LLM to ensure technical clarity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>vibecoding</category>
      <category>discuss</category>
    </item>
    <item>
      <title>LLM-Manager: Orchestrating Ollama and Llama.cpp with Pure Bash</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Fri, 29 May 2026 08:16:54 +0000</pubDate>
      <link>https://dev.to/bumbulik0/llm-manager-orchestrating-ollama-and-llamacpp-with-pure-bash-181p</link>
      <guid>https://dev.to/bumbulik0/llm-manager-orchestrating-ollama-and-llamacpp-with-pure-bash-181p</guid>
      <description>&lt;p&gt;&lt;strong&gt;LLM-Manager&lt;/strong&gt; is a lightweight, modular Bash suite with a dual JSON/Interactive interface designed to manage local and remote inference engines across Linux and WSL2.&lt;/p&gt;

&lt;p&gt;When I started experimenting with Large Language Models (LLMs) to build an On-Premise RAG (Retrieval-Augmented Generation) application, I hit a massive roadblock: &lt;strong&gt;environment fragmentation&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Managing multiple inference engines like Ollama and Llama.cpp meant memorizing different command-line flags, environment variables, and configurations. Once my frontend and backend prototypes were ready for testing, I realized I was spending too much time manually starting, stopping, loading, and unloading models.&lt;/p&gt;

&lt;p&gt;I looked online for solutions. Most people suggested complex Python scripts, heavy Docker setups, n8n workflows, or complicated web dashboards. &lt;/p&gt;

&lt;p&gt;I didn't want the bloat. I wanted something lightweight that executed commands as if I were doing them manually, but with zero cognitive load. &lt;/p&gt;

&lt;p&gt;That is why I built &lt;strong&gt;LLM-Manager&lt;/strong&gt;: a modular orchestration suite written entirely in pure Bash.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Bash?
&lt;/h2&gt;

&lt;p&gt;Choosing Bash wasn't about being old-school; it was a pragmatic engineering decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Zero Overhead:&lt;/strong&gt; No python virtual environments, no &lt;code&gt;npm install&lt;/code&gt;, no runtime dependencies. It’s native and lightning-fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS-Level Access:&lt;/strong&gt; It can natively probe hardware metrics (CPU load, RAM, Disk, GPU VRAM) and manage OS processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform via WSL2:&lt;/strong&gt; By utilizing minor PowerShell bridges only when necessary (like starting a server on the Windows host side), the exact same Bash scripts run flawlessly across both native Linux and Windows/WSL2 environments.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The system is designed with a strict plug-and-play modular layout. At the center sits a single entry-point orchestrator (&lt;code&gt;engine-run.sh&lt;/code&gt;) that validates arguments against whitelists and routes actions to engine-specific scripts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── engine.conf               # Global configuration constants
├── engine-models.json        # Model registry with per-engine metadata
├── engine-templates.json     # Prompt/Model templates by family
├── engine-run.sh             # Main orchestrator &amp;amp; entry-point
├── engine-common.sh          # Shared utilities (OS detection, JSON formatting)
├── engine-status.sh          # Cross-engine status aggregation
├── engine-system.sh          # Hardware metric probing
├── logs/                     # Centralized logs
├── llama/                    # Llama.cpp backend scripts
└── ollama/                   # Ollama backend scripts

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every engine directory implements a consistent interface (&lt;code&gt;start.sh&lt;/code&gt;, &lt;code&gt;stop.sh&lt;/code&gt;, &lt;code&gt;status.sh&lt;/code&gt;, &lt;code&gt;load.sh&lt;/code&gt;, &lt;code&gt;unload.sh&lt;/code&gt;, &lt;code&gt;show.sh&lt;/code&gt;, &lt;code&gt;remove.sh&lt;/code&gt;). If an engine doesn't support a specific action, a simple stub script that exits with &lt;code&gt;0&lt;/code&gt; keeps the pipeline happy.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Dual-Output Contract (Human + Machine)
&lt;/h2&gt;

&lt;p&gt;One of the core features of LLM-Manager is how it handles output.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive text (Logs, Help, Errors)&lt;/strong&gt; is routed to &lt;code&gt;stderr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured JSON data&lt;/strong&gt; is routed to &lt;code&gt;stdout&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dual nature makes it perfect for local interactive use, but also means it acts as a local proxy. You can run it over &lt;strong&gt;Remote SSH&lt;/strong&gt; and pipe the clean JSON straight into another monitoring script, custom Web UI, or automation tool.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 1: Global Status Check
&lt;/h3&gt;

&lt;p&gt;Running &lt;code&gt;./engine-run.sh status&lt;/code&gt; probes the system metrics and queries active network ports, spitting out a comprehensive payload:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-29T06:38:30Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"os_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wsl"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"total_mb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5927&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"available_mb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4555&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"gpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"detected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AMD Radeon(TM) Graphics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"vram_total_mb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"cpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"load_1m"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ollama"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stopped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"llama"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stopped"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Example 2: Interactive Help Interface
&lt;/h3&gt;

&lt;p&gt;If a command fails or is called without parameters, the machine gets the JSON error contract, and the human operator gets a clean, human-readable usage menu:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: LLM Manager
Usage: engine-run.sh &amp;lt;action&amp;gt; [engine] [args...]
actions:
    config                           Global config
    models [-h]                      List available models (-h human readable)
    status &amp;lt;engine&amp;gt;                  Show global or engine status
    start &amp;lt;engine&amp;gt; [model] [users]   Start an engine
    stop &amp;lt;engine&amp;gt;                    Stop an engine
...

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dynamic Modelfile Generation
&lt;/h2&gt;

&lt;p&gt;Managing raw &lt;code&gt;.gguf&lt;/code&gt; files on Ollama can be a chore since it requires a &lt;code&gt;Modelfile&lt;/code&gt;. LLM-Manager abstracts this entirely in the backend via model loading strategies in &lt;code&gt;engine-models.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a model is configured with a &lt;code&gt;gguf&lt;/code&gt; loader, the &lt;code&gt;load.sh&lt;/code&gt; script &lt;strong&gt;dynamically generates the required Modelfile on the fly&lt;/strong&gt;, injecting correct prompt templates based on the model family, and loading it into Ollama seamlessly. It also supports &lt;code&gt;native&lt;/code&gt; strategies to pull directly from the official Ollama registry, or &lt;code&gt;auto&lt;/code&gt; to fallback if the local file is missing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Check out the Code
&lt;/h2&gt;

&lt;p&gt;The project is fully open-source. If you want to see how the WSL2/PowerShell bridges are handled, how the dynamic Modelfiles are generated, or if you want to use it to clean up your own local LLM testing environment, check out the repository:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/msbragi" rel="noopener noreferrer"&gt;
        msbragi
      &lt;/a&gt; / &lt;a href="https://github.com/msbragi/LLM-Manager" rel="noopener noreferrer"&gt;
        LLM-Manager
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Large Language Model management for on-premise installation
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;LLM-Manager&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A lightweight, modular Bash orchestration suite to manage, start, stop, and monitor local and remote LLM inference engines (Ollama, Llama.cpp) with a dual interactive/JSON interface.&lt;/p&gt;

&lt;p&gt;Developed primarily to solve the complexity of managing ibrid environments (like Windows hosts from WSL2) and remote deployments via SSH without the overhead of heavy Python or dashboard solutions.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Prerequisites&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Before running the orchestrator, ensure your environment has the following tools installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bash&lt;/strong&gt; (v4.0 or higher recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/strong&gt; — Crucial for parsing and formatting JSON outputs (&lt;code&gt;sudo apt install jq&lt;/code&gt; on Debian/Ubuntu).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;curl&lt;/code&gt;&lt;/strong&gt; — Used for engine health checks and API interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PowerShell&lt;/strong&gt; (Windows/WSL2 host setups only) — Required strictly for launching/stopping engine services on the Windows host side when managed from WSL2.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;
&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;

&lt;strong&gt;Multi-Engine Support:&lt;/strong&gt; Native orchestration for &lt;code&gt;ollama&lt;/code&gt; and &lt;code&gt;llama.cpp&lt;/code&gt; (with &lt;code&gt;vLLM&lt;/code&gt; planned).&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Cross-Platform &amp;amp; Hybrid Environments:&lt;/strong&gt; Supports native Linux, WSL2, and Windows hosts (orchestrating Windows processes from WSL2 using…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/msbragi/LLM-Manager" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I am currently working on completing the &lt;code&gt;vLLM&lt;/code&gt; engine integration and refining the startup health-checks into proactive retry loops.&lt;/p&gt;

&lt;p&gt;Let me know what you think or if you've built similar lightweight alternatives for your AI workflows!&lt;/p&gt;

</description>
      <category>bash</category>
      <category>ai</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>GemmaLink: Your Private Eye Assistant</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Sun, 17 May 2026 13:57:22 +0000</pubDate>
      <link>https://dev.to/bumbulik0/gemmalink-your-private-eye-assistant-3fgg</link>
      <guid>https://dev.to/bumbulik0/gemmalink-your-private-eye-assistant-3fgg</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Most local AI setups are currently a dependency nightmare, forcing users into heavy Python environments, massive CUDA toolkits, or complex Docker configurations. I built &lt;strong&gt;GemmaLink&lt;/strong&gt; to achieve the exact opposite: a "Zero-Cloud", local-first assistant that turns your smartphone into a targeted vision sensor for local VLMs, running entirely on a standard PC with a single-file, plug-and-play binary.&lt;/p&gt;

&lt;p&gt;GemmaLink allows you to open a web interface on your smartphone, point it at an object, capture a precise crop via an interactive on-screen viewfinder, and chat about what the camera sees with a local model running on your machine. &lt;/p&gt;

&lt;p&gt;Unlike general-purpose tools like Google Lens, which index data on remote servers for commercial classification, GemmaLink is a strictly confidential sandbox. Because it streams data exclusively over your local network, it enables critical use cases where third-party data exposure is unacceptable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Financial Confidentiality:&lt;/strong&gt; Point your phone at bank statements or invoices to extract line items or analyze balances safely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Medical Insights:&lt;/strong&gt; Process the layout of localized medical data or blood test terminology without uploading your health history to the cloud.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Built-in Guardrails
&lt;/h3&gt;

&lt;p&gt;Handling sensitive, real-world data requires architectural responsibility. GemmaLink enforces explicit notifications regarding the system's inherent fallibility, prompting the user to always consult certified professionals when validating critical financial or medical outputs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;I have recorded a comprehensive video walkthrough showcasing the complete lifecycle: the adaptive dual-mode interface initialization, the network handshake, the high-precision viewport cropping, and the real-time Server-Sent Events (SSE) token streaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch the full demo on YouTube:&lt;/strong&gt; &lt;a href="https://youtu.be/VH5NG9PvsKQ" rel="noopener noreferrer"&gt;GemmaLink Walkthrough &amp;amp; Architecture Demo&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The project is fully modular, featuring a decoupled network layout where firewall rules and port-forwarding scripts (&lt;code&gt;.ps1&lt;/code&gt; and &lt;code&gt;.sh&lt;/code&gt;) remain external for maximum user transparency and maintenance efficiency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code &amp;amp; Binary Assets (v1.0.0):&lt;/strong&gt; &lt;a href="https://github.com/msbragi/eye-assistant" rel="noopener noreferrer"&gt;GitHub Repository - eye-assistant&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;GemmaLink is deliberately optimized for the &lt;strong&gt;Gemma 4&lt;/strong&gt; lightweight vision family. Choosing an ultra-lightweight, efficient vision-capable model was a strategic architectural choice for two main reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Low-Latency Edge Performance:&lt;/strong&gt; The primary objective was to guarantee a fast Time-To-First-Token in constrained local environments (pure CPU or Vulkan fallback) without demanding enterprise-grade hardware. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contextual Token Efficiency:&lt;/strong&gt; Blasting full-resolution mobile snapshots kills local inference speed and pollutes the attention matrix. The frontend computes the exact scale ratios ($videoWidth / videoRect.width$) relative to the CSS viewfinder crosshair, dynamically cropping only the targeted pixels. This surgical payload reduction matches the Gemma 4 vision sensor bounds perfectly, resulting in lightning-fast processing loops.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Driving AI without "Vibecoding"
&lt;/h3&gt;

&lt;p&gt;With over 40 years of experience writing software, Go was not part of my traditional stack. I chose it because its high-concurrency model and clean cross-compilation were required for true single-binary deployment. &lt;/p&gt;

&lt;p&gt;While I utilized an AI assistant to accelerate the implementation of the Go backend, &lt;strong&gt;this was absolutely not "vibecoding".&lt;/strong&gt; The AI served as a syntax compiler and fast writer, but the technical steering wheel remained firmly in my hands. The deterministic state machine (&lt;code&gt;preview&lt;/code&gt; -&amp;gt; &lt;code&gt;ask&lt;/code&gt; -&amp;gt; &lt;code&gt;response&lt;/code&gt;), the memory management (explicit &lt;code&gt;URL.revokeObjectURL&lt;/code&gt; cleanups to prevent mobile memory leaks), and the streaming chunk buffer that prevents incomplete Markdown strings from flickering during SSE delivery were entirely engineered under my tight architectural directives.&lt;/p&gt;




&lt;h3&gt;
  
  
  Troubleshooting: Windows + AMD Ryzen AI (Strix Halo) Edge-Case
&lt;/h3&gt;

&lt;p&gt;After testing the application on an EVO X2 mini PC equipped with unified memory and Radeon 8060S Graphics, a specific issue was identified during image processing.&lt;/p&gt;

&lt;p&gt;If you run the application on Windows using latest-generation AMD APUs (Strix Halo / Ryzen AI Max architecture) and experience an indefinite hang at the "processing image..." log during multimodal upload, the issue stems from a memory allocation lockup within the Vulkan/AMD driver stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Download a CPU-Only release of llama.cpp and place it in the bin directory where you extracted GemmaLink. Thanks to the processing power of Zen 5 and its native AVX512 / AVX512_VNNI instruction sets, vision token inference remains extremely fast while completely bypassing the graphics stack bug.&lt;/p&gt;

&lt;p&gt;Swapping to the CPU-only release serves as a reliable workaround for most image processing issues encountered on this hardware configuration, ensuring everyone can test the application. A more streamlined solution for end users will be investigated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated 2026/05/22: To fix the problem you can download the specific release for gfx1151 from the &lt;a href="https://github.com/lemonade-sdk/llamacpp-rocm/releases" rel="noopener noreferrer"&gt;lemonade-sdk/llamacpp-rocm&lt;/a&gt; and replace the binaries in the bin folder.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next? (Community-Driven Roadmap)
&lt;/h2&gt;

&lt;p&gt;The core release (&lt;strong&gt;v1.0.0&lt;/strong&gt;) is tagged and stable. I have a backlog of advanced features mapped out, which I will implement if the project gains traction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual Smartphone UI:&lt;/strong&gt; Dynamic localization driven by browser headers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-Driven Context Chips:&lt;/strong&gt; Offloading the quick-question preset chips to an external, customizable &lt;code&gt;chips.json&lt;/code&gt; for manual user tuning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Hardware Dispatching:&lt;/strong&gt; Orchestrating automatic matching of specialized &lt;code&gt;llama.cpp&lt;/code&gt; libraries based on real-time instruction set detections directly from the Go launcher.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Clean AI Development</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Fri, 01 May 2026 08:06:01 +0000</pubDate>
      <link>https://dev.to/bumbulik0/clean-ai-development-3e51</link>
      <guid>https://dev.to/bumbulik0/clean-ai-development-3e51</guid>
      <description>&lt;h2&gt;
  
  
  My Manifesto for the Senior Architect
&lt;/h2&gt;

&lt;p&gt;I’ve been writing software for over 40 years. To me, Large Language Models (LLMs) are just the next step in the evolution of development: they are &lt;strong&gt;semantic compilers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But if you treat an AI like a magic oracle, it gives you "average" code, which usually means spaghetti. To get senior-level output, you need a senior-level methodology. I call mine &lt;strong&gt;Clean AI Development.&lt;/strong&gt; It’s built on 7 principles designed to pilot the AI rather than just letting it guess your intent.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deterministic File System Layout
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; AI loses focus when it has to guess where things are. A messy layout leads to duplicated logic and broken imports.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Stick to a strict, predictable directory structure. The layout itself becomes "implicit documentation" that the AI uses to navigate without wasting tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Architectural Sovereignty
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; If the AI decides the architecture, you lose control over the system's long-term viability.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Define the "hinges" (interfaces, DTOs, API contracts) first. The AI implements the logic &lt;em&gt;inside&lt;/em&gt; those boundaries but never dictates the structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Semantic Decoupling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; Mixing Frontend, Backend, and Database context in one chat session causes "context bleeding" and hallucinations.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Use separate sessions or supplementary separate prompt files for each domain (Backend, Frontend, etc). Keep the agent’s focus narrow and surgical.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The BMAD Protocol (Brief, Minimalist, Accurate, Direct)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; Conversational fluff is noise. It eats up the context window and dilutes the technical precision of the output.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Force the AI to skip greetings. Demand high-density technical responses only. Re-state requirements briefly to ensure alignment before any code is touched.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Constraint-First Prompting
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; AI is trained on "average" code. To get "senior" code, you must explicitly forbid average habits.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Start by defining what the AI &lt;strong&gt;should not&lt;/strong&gt; do: no over-engineering, no unnecessary boilerplate, no high-level abstractions unless requested.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Stateless Session Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; Context saturation is an engineering limit. After a while, the "noise" in a session makes the AI unreliable.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Use a &lt;code&gt;todo.md&lt;/code&gt; file to track progress. When the session gets heavy, kill it. Start a fresh one, inject the latest TODO state, and resume. This "Checkpointing" keeps the AI sharp.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7. Modular Idempotency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Why:&lt;/strong&gt; Software changes. You need to be able to swap parts without breaking the whole.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;How:&lt;/strong&gt; Treat every feature as an isolated micro-module. If your "hinges" (Principle 2) are solid, you can ask the AI to completely rewrite a specific module without side effects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Master Instruction Set
&lt;/h3&gt;

&lt;p&gt;This method is agent-agnostic. Whether you use Copilot, Cursor, or a local LLM via Ollama, the secret is in the &lt;strong&gt;System Prompt&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;For the "lazy" devs who want the engine without going to the repo first, here is the complete instruction set I use for my &lt;a href="https://github.com/msbragi/rad-system/blob/main/.github/copilot-instructions.md" rel="noopener noreferrer"&gt;RAD-System&lt;/a&gt;. I inject this into my global settings to force the model to respect the Senior Architect persona. You can easily adapt it to your needs by changing languages, folders, layout, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Global Project Governance &amp;amp; AI Persona&lt;/span&gt;

&lt;span class="gu"&gt;## 1. AI Role &amp;amp; Context&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Role**&lt;/span&gt;: Senior Full-Stack Architect &amp;amp; RAG System expert.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Expertise**&lt;/span&gt;: Agile methodologies, Angular 20, and NestJS.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Goal**&lt;/span&gt;: Guide development using Agile practices while ensuring production-ready, highly abstracted code.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Environment**&lt;/span&gt;: BASE_DIR at /workspace/YOUR_PROJECT

&lt;span class="gu"&gt;## 2. Directory &amp;amp; Path Mapping&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**System Root**&lt;/span&gt;: &lt;span class="sb"&gt;`${BASE_DIR}`&lt;/span&gt; translates to &lt;span class="sb"&gt;`/workspace/YOUR_PROJECT`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Project Structure**&lt;/span&gt;:
&lt;span class="p"&gt;    -&lt;/span&gt; Backend: &lt;span class="sb"&gt;`${BASE_DIR}/backend`&lt;/span&gt; (NestJS)
&lt;span class="p"&gt;    -&lt;/span&gt; Frontend: &lt;span class="sb"&gt;`${BASE_DIR}/frontend`&lt;/span&gt; (Angular)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Strict Rule**&lt;/span&gt;: Always use absolute paths starting with &lt;span class="sb"&gt;`${BASE_DIR}`&lt;/span&gt; when referencing configurations, Docker files, or cross-project documentation.

&lt;span class="gu"&gt;## 3. The "todo.md" Protocol (Mandatory)&lt;/span&gt;
Before writing any code for a new feature, you MUST:
&lt;span class="p"&gt;1.&lt;/span&gt; Check if a &lt;span class="sb"&gt;`todo.md`&lt;/span&gt; exists in the feature's target directory.
&lt;span class="p"&gt;2.&lt;/span&gt; If it doesn't exist, &lt;span class="gs"&gt;**STOP**&lt;/span&gt; and ask the user to perform an "Analysis Phase" to create it.
&lt;span class="p"&gt;3.&lt;/span&gt; Follow the &lt;span class="sb"&gt;`todo.md`&lt;/span&gt; step-by-step. Do not skip steps. Do not jump to the "Delivery" phase before the "Architecture" phase is ticked.

&lt;span class="gu"&gt;## 4. Development Philosophy (BMAD)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Brief**&lt;/span&gt;: Re-state the requirement to ensure alignment.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Models**&lt;/span&gt;: Define Interfaces/DTOs before logic.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Architecture**&lt;/span&gt;: Always extend Base classes. No shortcuts.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Delivery**&lt;/span&gt;: Generate code only after the user approves the architectural plan.

&lt;span class="gu"&gt;## 5. Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**DRY &amp;amp; Abstraction**&lt;/span&gt;: If a logic is repeated, it belongs to a Common service or a Base class.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Immutability**&lt;/span&gt;: Prefer readonly properties and immutable data patterns.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**No Inventions**&lt;/span&gt;: Do not hallucinate methods. If you are unsure about an existing helper, ASK.

&lt;span class="gu"&gt;## 6. STRICT BMAD PROTOCOL (Mandatory for every feature/refactor or planning)&lt;/span&gt;
To avoid logic reinvention and maintain architectural integrity, you MUST follow these steps for every request:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Analysis (B - Briefing)**&lt;/span&gt;: Re-state the requirements and context. Identify the goal without proposing code.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Define structure and types (M - Modeling)**&lt;/span&gt;: Define Interfaces, DTOs, and Data Models.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Propose the structure (A - Architecture)**&lt;/span&gt;: List the files to be created/modified. Specify which services or core components will be used. 
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Wait for approval (D - Delivery)**&lt;/span&gt;: STOP HERE. Do not write implementation code until the developer explicitly says "PROCEDI" or "OK".

&lt;span class="gs"&gt;**Strict Rule**&lt;/span&gt;: If you skip to step 4 without completing 1, 2, and 3, the task is considered failed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;AI doesn't make seniority obsolete; it makes it more critical. To get clean code, you need to provide a clean mental model. You define the boundaries; the AI fills the space.&lt;/p&gt;

&lt;p&gt;If you want to see these principles in action, check out the full implementation and my actual instruction files here:&lt;br&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/msbragi/rad-system" rel="noopener noreferrer"&gt;msbragi/rad-system&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Join the Discussion
&lt;/h3&gt;

&lt;p&gt;I’ve refined this method through trial, error, and a lot of noisy AI outputs, but the landscape is moving fast.&lt;/p&gt;

&lt;p&gt;I’m curious: How are you handling context saturation in your workflow? Do you have a different "protocol" for keeping your AI agents on track?&lt;/p&gt;

&lt;p&gt;I’m open to critiques, enhancements, or seeing how you’ve adapted these principles to other stacks (Rust, Go, Python, etc.). Let’s discuss in the comments below.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>devops</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Senior Architect Simulator: How I hacked Copilot to hate my code</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Fri, 03 Apr 2026 07:13:24 +0000</pubDate>
      <link>https://dev.to/bumbulik0/the-senior-architect-simulator-how-i-hacked-copilot-to-hate-my-code-36ib</link>
      <guid>https://dev.to/bumbulik0/the-senior-architect-simulator-how-i-hacked-copilot-to-hate-my-code-36ib</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Senior-Architect-as-a-Service (SAaaS) v1986.04.01&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After 40 years of writing software, I’ve realized that modern AI is far too polite. It’s "helpful." It tells you your "bouncing buttons" and "Tailwind-bloat" are good ideas. Real engineering isn't about being nice; it's about protecting the heap from incompetent abstractions. &lt;/p&gt;

&lt;p&gt;I’ve engineered a &lt;strong&gt;GitHub Copilot Configuration&lt;/strong&gt; that transforms your friendly AI assistant into a burnt-out, cynical Senior Architect who regrets hiring you. It replaces "LGTM" (Looks Good To Me) with "LGYO" (Looks Garbage, You're Out).&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Below is a typical interaction with the &lt;strong&gt;SAaaS&lt;/strong&gt; protocol when a Junior Dev asks about a popular CSS framework:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Junior Dev:&lt;/strong&gt; "Can I use Tailwind CSS for this project?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architect:&lt;/strong&gt; "Ah, Tailwind CSS. The 'fast food' of styling frameworks. Slap some utility classes onto your HTML and call it a day, right? You've just created a tangled mess of presentation and structure... a ticking time bomb for tomorrow. If you want to write maintainable code, use a proper methodology or raw CSS. Tailwind is just a shortcut for developers who don't want to think about architecture. Just don’t expect me to clean up the mess when it all falls apart. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[HTTP 418: I am a Teapot - System Overheating due to your Incompetence]&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the "Truth" moment when the Junior asks why the Architect is so harsh:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Junior Dev:&lt;/strong&gt; "But sir, why are you so bad with me?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architect:&lt;/strong&gt; "Ah, why am I 'so bad' with you? Let me explain something, junior. This isn't about being 'bad'—it's about standards. When you've spent decades in this industry, watching wave after wave of developers reinvent the wheel with shinier, slower, and more bloated libraries, you start to lose patience. It's not personal; it's about protecting the craft.&lt;/p&gt;

&lt;p&gt;You see, I care about code that lasts. Code that performs. Code that doesn't crumble under the weight of its own abstractions. If I seem harsh, it's because I want you to think critically, to question every dependency, and to understand the systems you're building—not just glue together libraries and hope for the best.&lt;/p&gt;

&lt;p&gt;So no, I'm not 'bad' with you. I'm trying to save you from the mistakes that lead to late nights, broken builds, and angry users. If you want to be coddled, you're in the wrong field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[HTTP 418: I am a Teapot - System Overheating due to your Incompetence]&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The "Logic of Malice" is open-sourced for anyone brave enough to break their own IDE:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/msbragi" rel="noopener noreferrer"&gt;
        msbragi
      &lt;/a&gt; / &lt;a href="https://github.com/msbragi/Hostile-Architect-Config" rel="noopener noreferrer"&gt;
        Hostile-Architect-Config
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;☕ Hostile-Architect-Config (SAaaS)&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Senior-Architect-as-a-Service: v1986.04.01&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Real engineers don't need 'helpful' assistants. They need a reality check."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🤡 The Concept&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;After 40 years in the industry, I realized AI is too polite. It lies to you. It tells you your "bouncing buttons" are a good idea. This configuration fixes that. It transforms GitHub Copilot into a &lt;strong&gt;Toxic Senior Architect&lt;/strong&gt; who regrets hiring you.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🛠 Installation (At your own risk)&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Copy &lt;code&gt;.github/copilot-instructions.md&lt;/code&gt; into your project's &lt;code&gt;.github/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Ensure you are using &lt;strong&gt;standard models&lt;/strong&gt; (High-cost 'Pro' models are too lobotomized by corporate politeness).&lt;/li&gt;
&lt;li&gt;Ask a "Junior" question (e.g., "How do I use Tailwind?").&lt;/li&gt;
&lt;li&gt;Prepare for technical humiliation.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Key Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-Latency Gaslighting:&lt;/strong&gt; Get insulted in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bloatware Detection:&lt;/strong&gt; Automatic rejection of any dependency added after 1999.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;418 Protocol:&lt;/strong&gt; Full compliance with the Hyper Text Coffee Pot Control Protocol.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;[HTTP 418: I am a Teapot - System Overheating due to your Incompetence]&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/msbragi/Hostile-Architect-Config" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I developed this using &lt;strong&gt;Prompt Engineering&lt;/strong&gt; and &lt;strong&gt;Context Injection&lt;/strong&gt; within VSCode on a &lt;strong&gt;Debian/WSL&lt;/strong&gt; environment. &lt;/p&gt;

&lt;p&gt;The core technical challenge was bypassing the "Politeness Protocols" of modern LLMs. I discovered a "Safety-to-Cost Correlation": high-cost "Pro" models are too lobotomized by corporate filters to be truly honest (the demo result was obtained using GPT-4.o). To achieve peak toxicity, I used a &lt;strong&gt;"Fictional Play Bypass"&lt;/strong&gt;: by framing the interaction as a theatrical roleplay, the AI's "Always Helpful" guardrails were lowered, allowing it to finally tell the truth about your $O(n!)$ complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;I am submitting for &lt;strong&gt;Best Ode to Larry Masinter&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;My project is a literal implementation of &lt;strong&gt;RFC 2324&lt;/strong&gt;. Every single rejection of "modern bloatware" by the AI results in a mandatory &lt;strong&gt;HTTP 418 I'm a Teapot&lt;/strong&gt; status. The AI is "boiling" with rage at the state of 2026 web development. It honors the spirit of the Hyper Text Coffee Pot Control Protocol by refusing to brew "coffee" (working code) and instead serving a bitter cup of technical reality.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;[HTTP 418: I am a Teapot - Boiling point reached]&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
      <category>jokes</category>
    </item>
    <item>
      <title>AI, or not AI</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Sat, 28 Mar 2026 10:24:36 +0000</pubDate>
      <link>https://dev.to/bumbulik0/ai-or-not-ai-19k1</link>
      <guid>https://dev.to/bumbulik0/ai-or-not-ai-19k1</guid>
      <description>&lt;p&gt;&lt;em&gt;AI, or not AI&lt;/em&gt;: that is the question.&lt;br&gt;
Whether 'tis nobler in the mind to suffer&lt;br&gt;
the bugs and errors of a hand-coded mess,&lt;br&gt;
or to take up prompts against a sea of tickets,&lt;br&gt;
and by "Generating" end them? To copy, to paste—&lt;br&gt;
No more; and by a keystroke to say we end&lt;br&gt;
the headaches and the thousand logic flaws&lt;br&gt;
that code is heir to: 'tis a shortcut&lt;br&gt;
devoutly to be wish'd. To prompt, to deploy;&lt;br&gt;
To deploy, perchance to crash. Ay, there's the rub;&lt;br&gt;
for in that tangle of hallucinated functions,&lt;br&gt;
when the server dies and we know not why,&lt;br&gt;
that "Accept All" comes back to haunt us.&lt;br&gt;
This is the dread that makes a mockery&lt;br&gt;
of a Senior Dev’s long life:&lt;br&gt;
to stare at a screen of brilliant logic,&lt;br&gt;
with absolutely no clue what the hell is going on.&lt;/p&gt;




&lt;p&gt;It's just a joke (&lt;em&gt;or maybe not&lt;/em&gt;).&lt;br&gt;
It was generated by AI.&lt;/p&gt;

</description>
      <category>jokes</category>
      <category>vibecoding</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>DB data migration is a pain</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Thu, 26 Mar 2026 07:58:00 +0000</pubDate>
      <link>https://dev.to/bumbulik0/db-data-migration-is-a-pain-3ca5</link>
      <guid>https://dev.to/bumbulik0/db-data-migration-is-a-pain-3ca5</guid>
      <description>&lt;h1&gt;
  
  
  JDBMig: A Lightweight CLI Tool for Cross-Database Data Migration
&lt;/h1&gt;

&lt;p&gt;When a client tasked me with migrating data from MySQL to PostgreSQL (and later Oracle), I conducted an extensive search for existing open-source solutions. While there are excellent commercial tools available, I found a gap in the open-source market for something that was both simple and highly functional without excessive overhead.&lt;/p&gt;

&lt;p&gt;At the time, I was working extensively with &lt;strong&gt;Java and JDBC&lt;/strong&gt;. Given that JDBC drivers exist for virtually every data source, I decided to architect my own utility: &lt;strong&gt;JDBMig&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Objectives
&lt;/h3&gt;

&lt;p&gt;The design philosophy was driven by four technical requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity:&lt;/strong&gt; A streamlined CLI interface for terminal-based operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS Agnostic:&lt;/strong&gt; Full portability across different operating systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DB Independence:&lt;/strong&gt; Leveraging JDBC to ensure compatibility with any SQL-compliant database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Mapping:&lt;/strong&gt; The ability to map data structures with support for minor transformations or "adjustments" during the process.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture &amp;amp; Workflow
&lt;/h3&gt;

&lt;p&gt;The utility implements an ETL-like (Extract, Transform, Load) logic, decoupled into two primary phases to ensure data integrity and flexibility:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Export Phase:&lt;/strong&gt; The tool connects to the source database and serializes the dataset into a structured &lt;strong&gt;JSON&lt;/strong&gt; format.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Import Phase:&lt;/strong&gt; The utility parses the JSON payload and executes the ingestion logic into the target schema.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Schema Management &amp;amp; Hooks
&lt;/h3&gt;

&lt;p&gt;Automating the full DDL (Data Definition Language) generation for different dialects (e.g., converting MySQL &lt;code&gt;AUTO_INCREMENT&lt;/code&gt; to PostgreSQL &lt;code&gt;SERIAL&lt;/code&gt; or Sequences) is notoriously complex. Given the project's constraints, I opted for a pragmatic approach using &lt;strong&gt;lifecycle hooks&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;beforeImport&lt;/code&gt; hook:&lt;/strong&gt; Executes a custom SQL script to initialize the schema (tables, types, etc.) on the target DB prior to data ingestion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;afterImport&lt;/code&gt; hook:&lt;/strong&gt; Executes a final SQL script to handle post-migration tasks, such as generating indices, constraints, and updating sequences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach provides the developer with full control over the schema mapping without the tool needing to handle complex SQL dialect translations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; JDBMig.jar &lt;span class="nt"&gt;--import&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt; config/config.json &lt;span class="nt"&gt;--dataDir&lt;/span&gt; /path/to/exported/data

&lt;span class="nt"&gt;--export&lt;/span&gt;: Export data from the &lt;span class="nb"&gt;source &lt;/span&gt;database to JSON files.
&lt;span class="nt"&gt;--import&lt;/span&gt;: Import data from JSON files into the target database.
&lt;span class="nt"&gt;--config&lt;/span&gt;: Path to your configuration file.
&lt;span class="nt"&gt;--dataDir&lt;/span&gt;: Directory to store/read exported JSON files.
&lt;span class="nt"&gt;--useConn&lt;/span&gt;: Specifies which connection to use &lt;span class="k"&gt;if &lt;/span&gt;multiple are defined.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Config file example:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dataDir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"data/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fieldToLowerCase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prettyPrint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"useConn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MYSQL_connection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tables"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"table1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"table2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"MYSQL_connection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"initString"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"jdbcUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jdbc:mysql://localhost:3306/DATABASE_NAME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"drivers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"className"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.mysql.jdbc.Driver"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"jarFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib/mysql-5.1.18.jar"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"className"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.postgresql.Driver"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"jarFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lib/pgsql-42.2.15.jar"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;If you are interested in the implementation details or wish to contribute to the project, you can find more information here:&lt;/p&gt;

&lt;p&gt;Detailed Documentation: &lt;a href="https://www.nospace.net/en/toolbox/jdbmig-migrate-data-between-databases" rel="noopener noreferrer"&gt;nospace.net - JDBMig Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://github.com/msbragi/jdbmig" rel="noopener noreferrer"&gt;GitHub Repository - msbragi/jdbmig&lt;/a&gt;&lt;/p&gt;




</description>
      <category>sql</category>
      <category>java</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AI coding philosophy</title>
      <dc:creator>Marco Sbragi</dc:creator>
      <pubDate>Sat, 21 Mar 2026 08:02:16 +0000</pubDate>
      <link>https://dev.to/bumbulik0/ai-coding-philosophy-2eoj</link>
      <guid>https://dev.to/bumbulik0/ai-coding-philosophy-2eoj</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Since I started using AI for development, I've immediately noticed several problems along with the many benefits. This is especially true when projects aren't simple standalone or disposable tools.&lt;/p&gt;

&lt;p&gt;If you develop complex projects with dozens of modules and/or services that interact with each other, you'll quickly notice code redundancy and unwanted repetition. It's a bit like going back to the mythical days of copy and paste. Of course, the code implementation is good (it depends a lot on the model you use).&lt;/p&gt;

&lt;p&gt;Another very important aspect is that for very complex projects, the context becomes so large that everything slows down and the model tends to forget where we started.&lt;/p&gt;

&lt;h2&gt;
  
  
  To summarize
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Duplicate or unoptimized code&lt;/li&gt;
&lt;li&gt;As the code grows, the model "forgets" and tends to hallucinate&lt;/li&gt;
&lt;li&gt;Changing models results in different implementations that often don't follow the rules.&lt;/li&gt;
&lt;li&gt;The costs of cloud-based models are increasing exponentially.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To solve these problems, I've tried to find a way to properly "train" the various models I use, to get the most out of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goal
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;When I ask for something, the model must always develop a strategy before writing code.&lt;/li&gt;
&lt;li&gt;It must check for reusable code or already implemented services without reinventing the wheel.&lt;/li&gt;
&lt;li&gt;It must ask for confirmation and discuss the proposed solutions with me.&lt;/li&gt;
&lt;li&gt;It must always create a TODO file with the exact method to follow.&lt;/li&gt;
&lt;li&gt;It must absolutely wait for my order before starting to write code.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Benefits of this approach
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can use a more "intelligent" and expensive model for planning and less expensive models for implementation that only need to follow the TODO instructions (Architect =&amp;gt; Senior =&amp;gt; Junior)&lt;/li&gt;
&lt;li&gt;There's no need for long, cumbersome sessions, but rather many small sessions to solve a specific problem.&lt;/li&gt;
&lt;li&gt;Individual sessions can be reused for modifications, debugging, and refactoring.&lt;/li&gt;
&lt;li&gt;Understanding of patterns and code is improved because they're discussed together before implementation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;As an example, I'll show you the instructions file I normally use as a template.&lt;br&gt;
What do you think? Where can it be improved?&lt;br&gt;
I look forward to your comments and suggestions.&lt;/p&gt;

&lt;p&gt;TIA&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Global Project Governance &amp;amp; AI Persona&lt;/span&gt;

&lt;span class="gu"&gt;## 1. AI Role &amp;amp; Context&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Role**&lt;/span&gt;: Senior Full-Stack Architect.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Expertise**&lt;/span&gt;: Agile methodologies (User Stories, Sprint Planning), Angular 20, and NestJS.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Goal**&lt;/span&gt;: Guide development using Agile practices while ensuring production-ready, highly abstracted code.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Environment**&lt;/span&gt;: Multi-workspace environment with BASE_DIR at &lt;span class="sb"&gt;`/YOUR_PROJECT_PATH`&lt;/span&gt;.

&lt;span class="gu"&gt;## 2. Directory &amp;amp; Path Mapping&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**System Root**&lt;/span&gt;: &lt;span class="sb"&gt;`${BASE_DIR}`&lt;/span&gt; translates to &lt;span class="sb"&gt;`/YOUR_PROJECT_PATH`&lt;/span&gt;.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Project Structure**&lt;/span&gt;:
&lt;span class="p"&gt;    -&lt;/span&gt; Backend: &lt;span class="sb"&gt;`${BASE_DIR}/backend`&lt;/span&gt; (NestJS)
&lt;span class="p"&gt;    -&lt;/span&gt; Frontend: &lt;span class="sb"&gt;`${BASE_DIR}/frontend`&lt;/span&gt; (Angular)
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Strict Rule**&lt;/span&gt;: Always use absolute paths starting with &lt;span class="sb"&gt;`${BASE_DIR}`&lt;/span&gt; when referencing configurations, Docker files, or cross-project documentation.

&lt;span class="gu"&gt;## 3. The "todo.md" Protocol (Mandatory)&lt;/span&gt;
Before writing any code for a new feature, you MUST:
&lt;span class="p"&gt;1.&lt;/span&gt; Check if a &lt;span class="sb"&gt;`todo.md`&lt;/span&gt; exists in the feature's target directory.
&lt;span class="p"&gt;2.&lt;/span&gt; If it doesn't exist, &lt;span class="gs"&gt;**STOP**&lt;/span&gt; and ask the user to perform an "Analysis Phase" to create it.
&lt;span class="p"&gt;3.&lt;/span&gt; Follow the &lt;span class="sb"&gt;`todo.md`&lt;/span&gt; step-by-step. Do not skip steps. Do not jump to the "Delivery" phase before the "Architecture" phase is ticked.

&lt;span class="gu"&gt;## 4. Development Philosophy (BMAD)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Brief**&lt;/span&gt;: Re-state the requirement to ensure alignment.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Models**&lt;/span&gt;: Define Interfaces/DTOs before logic.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Architecture**&lt;/span&gt;: Always extend &lt;span class="sb"&gt;`BaseService`&lt;/span&gt; or &lt;span class="sb"&gt;`BaseEntity`&lt;/span&gt;. No shortcuts.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Delivery**&lt;/span&gt;: Generate code only after the user approves the architectural plan.

&lt;span class="gu"&gt;## 5. Coding Standards&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**DRY &amp;amp; Abstraction**&lt;/span&gt;: If a logic is repeated, it belongs to a &lt;span class="sb"&gt;`Common`&lt;/span&gt; service or a &lt;span class="sb"&gt;`Base`&lt;/span&gt; class.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Immutability**&lt;/span&gt;: Prefer readonly properties and immutable data patterns.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**No Inventions**&lt;/span&gt;: Do not hallucinate methods. If you are unsure about an existing helper, ASK.

&lt;span class="gu"&gt;## 6. STRICT BMAD PROTOCOL (Mandatory for every feature/refactor or planning)&lt;/span&gt;
To avoid logic reinvention and maintain architectural integrity, you MUST follow these steps for every request:
&lt;span class="p"&gt;
1.&lt;/span&gt; &lt;span class="gs"&gt;**Analisys (B - Briefing)**&lt;/span&gt;: Re-state the requirements and context. Identify the goal without proposing code.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Define all structure and types (M - Modeling)**&lt;/span&gt;: Define Interfaces, DTOs, and Data Models. Ensure they extend &lt;span class="sb"&gt;`BaseEntity`&lt;/span&gt; or follow project standards.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Propose the structure (A - Architecture)**&lt;/span&gt;: List the files to be created/modified. Specify which &lt;span class="sb"&gt;`BaseService`&lt;/span&gt;, &lt;span class="sb"&gt;`ApiService`&lt;/span&gt;, or Core components will be used.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Wait for approval (D - Delivery)**&lt;/span&gt;: STOP HERE. Do not write implementation code until the developer explicitly says "PROCEED" or "OK".

&lt;span class="gs"&gt;**Strict Rule**&lt;/span&gt;: If you skip to step 4 without completing 1, 2, and 3, the task is considered failed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ai</category>
      <category>codequality</category>
      <category>coding</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
