<?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: André N. Darcie</title>
    <description>The latest articles on DEV Community by André N. Darcie (@andredarcie).</description>
    <link>https://dev.to/andredarcie</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%2F386955%2Fe908afc9-e12e-40ec-92ef-cd158638af28.png</url>
      <title>DEV Community: André N. Darcie</title>
      <link>https://dev.to/andredarcie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/andredarcie"/>
    <language>en</language>
    <item>
      <title>Making of Tiny RPG Studio</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Sun, 28 Jun 2026 17:42:59 +0000</pubDate>
      <link>https://dev.to/andredarcie/making-of-tiny-rpg-studio-45oh</link>
      <guid>https://dev.to/andredarcie/making-of-tiny-rpg-studio-45oh</guid>
      <description>&lt;p&gt;This is the story of how I created Tiny RPG Studio: a small engine for simple RPGs, built to help people make their first games without needing to program.&lt;/p&gt;

&lt;p&gt;At its core, it came from an idea that took me years to understand clearly: sometimes the best tool is not the one that lets you do everything, but the one that gives you just enough limits to finally finish something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Childhood, RPG Maker, and the Static World
&lt;/h2&gt;

&lt;p&gt;When I was a child, my aunt gave me a PC with Windows XP. I still did not have internet access, but I explored that computer as if it were the most interesting and exciting thing I could possibly have.&lt;/p&gt;

&lt;p&gt;I used to ask people to download games for me. Once, I bought a rewritable CD and went to a friend's house because he had internet. He opened Baixaki, and we started looking for programs he could download so I could burn them to the CD and install them on my computer later.&lt;/p&gt;

&lt;p&gt;I remember once telling my cousin: "the internet is magic, I can download anything, learn about anything, and one day, when I have it, no one will stop me."&lt;/p&gt;

&lt;p&gt;While browsing Baixaki, a Brazilian download site, I saw a category that caught my attention: "game creators." At the time, I was already addicted to PlayStation 1, playing Resident Evil and Silent Hill, so the idea that I could create my own games felt insane.&lt;/p&gt;

&lt;p&gt;I downloaded things like Engine 001 and RPG Maker.&lt;/p&gt;

&lt;p&gt;RPG Maker was incredible because it already came with ready-made sprites, an RTP package with characters, maps, objects, and amazing pixel art. I did not know pixel art, so that whole visual side was already partly solved for me.&lt;/p&gt;

&lt;p&gt;I quickly learned how to build visually interesting maps with sprites, place NPCs in the world, and write dialogue for them. At that point, I really had my first game, and that felt like an unprecedented idea.&lt;/p&gt;

&lt;p&gt;I remember telling a cousin: "I found a different kind of game, where you create games inside it." In other words, I did not really understand the concept of a game engine yet.&lt;/p&gt;

&lt;p&gt;Eventually, I reached a point where I had created that world, but everything was static: the scenery, the NPCs, the monsters, even the story. Everything existed, but nothing could change.&lt;/p&gt;

&lt;p&gt;I wanted to do something simple and even a bit cliche: a king in his castle would ask me to kill a dragon that was terrorizing the village. So I would go there, defeat the dragon, and come back to talk to the king.&lt;/p&gt;

&lt;p&gt;But the king did not know I had done it.&lt;/p&gt;

&lt;p&gt;And I asked myself: how could I solve this?&lt;/p&gt;

&lt;p&gt;Searching through forums and tutorials on Google, I found something called "Switches." They could have two states: ON and OFF.&lt;/p&gt;

&lt;p&gt;So when I defeated the dragon, I would turn the Switch ON. When I returned to the king, he had his default dialogue, but he also had an alternate dialogue if the Switch was ON. Something like: "You killed the dragon and saved the village."&lt;/p&gt;

&lt;p&gt;I did not know exactly what I was doing, but it worked. So I started creating switches for all kinds of things, even to check whether it was day or night in the game world.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering Programming
&lt;/h2&gt;

&lt;p&gt;Much later, I started a technical IT program, a two-year course I took alongside high school. I wanted to learn programming.&lt;/p&gt;

&lt;p&gt;That had a big impact on me because, at that point, the computer meant everything to me, but I was still just a passive user, using things created by other people. The idea that I could become a programmer and create things from my own ideas, for other people to use, felt surreal.&lt;/p&gt;

&lt;p&gt;In the first programming logic classes, the teacher explained what a conditional is, what an IF is: if yes, do this; otherwise, do that.&lt;/p&gt;

&lt;p&gt;Before that, instructions felt like a fixed sequence, like a recipe. But then something new appeared: a branch in the flow. A condition.&lt;/p&gt;

&lt;p&gt;And I had a huge epiphany.&lt;/p&gt;

&lt;p&gt;That Switch from RPG Maker was exactly the conditional I had been using to change the king's dialogue. So, in a weird way, I already knew programming long before I knew that I knew programming.&lt;/p&gt;

&lt;p&gt;I even remember writing some code and asking the teacher what he thought. He said: "Everyone, this is interesting. He did it differently from how I taught it, but it will also work. This shows that there are many ways to write code."&lt;/p&gt;

&lt;p&gt;Aside from art class in elementary school, that was the second time in my life I started getting praised in class. It happened in programming class, not because I was great at math or logic, but because I had already learned all of that from RPG Maker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bitsy and the Value of Limitations
&lt;/h2&gt;

&lt;p&gt;Then came a big time jump. I had already graduated in computer science, was working my first job as a programmer, and was creating small game projects with plain code, now in JavaScript. I also knew how to make games in Unity with C#.&lt;/p&gt;

&lt;p&gt;Through those projects, I discovered itch.io, which is huge, and found tools like Twine, for creating text games with choices; PICO-8, a fantasy console for making retro minigames; and Bitsy, a tiny engine for creating narrative games with three colors and simple pixel art.&lt;/p&gt;

&lt;p&gt;Bitsy gave me another epiphany.&lt;/p&gt;

&lt;p&gt;I used to think that creating a game engine like Unity or Unreal was an absurd idea. My role was to be a high-level application developer. I do not consider myself a programming genius like Linus Torvalds with the Linux kernel, so learning low-level GPU programming just to consider creating an engine felt way too distant.&lt;/p&gt;

&lt;p&gt;But I had never stopped to think about creating a high-level engine in JavaScript, using Canvas, where all the low-level details could be ignored. The focus could be something else: creating an accessible tool, easy to use, and capable of running even on a phone.&lt;/p&gt;

&lt;p&gt;An engine that is simpler to build and also simpler for people to make games with. No need to know programming. No need to take courses or watch tutorials just to build something basic.&lt;/p&gt;

&lt;p&gt;I immediately thought: "I wish I were the person who created Bitsy, because that idea is absurdly brilliant."&lt;/p&gt;

&lt;p&gt;Instead of competing with RPG Maker, Godot, or Unity by trying to offer more features, more performance, and more tutorials, Bitsy goes in the opposite direction. It serves the needs those tools do not serve as well: accessibility, simplicity, and a very low barrier to entry.&lt;/p&gt;

&lt;p&gt;One of the best games I ever created was Zero to One, made in Bitsy for a game jam called One Room.&lt;/p&gt;

&lt;p&gt;It was the best game I had created precisely because I never managed to finish my more ambitious games, the ones with long scripts, lore, worlds, systems, and brilliant ideas.&lt;/p&gt;

&lt;p&gt;I am very bad at creating something with a limited scope. I define a scope and immediately want to expand it with incredible ideas that appear all the time. I take a shower and come back with five more ideas for the game. That makes the game impossible to finish. After a few months, I give up and already want to make another game that feels even more brilliant.&lt;/p&gt;

&lt;p&gt;But Bitsy does not let that happen so easily. It is limited by default. You are forced to reduce the scope and tell a direct story there.&lt;/p&gt;

&lt;p&gt;So I wrote a simple script, created three scenes, finished the game, and released it within the limited time of the game jam.&lt;/p&gt;

&lt;p&gt;In other words, all my problems were solved there: I finally had a solid little game released online.&lt;/p&gt;

&lt;p&gt;Bitsy stands alongside major engines in terms of the number of games created precisely because it is easy and fast to make something and release it. Without a doubt, it helped people who had never thought about creating games actually create games.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking a Break from Game Dev
&lt;/h2&gt;

&lt;p&gt;After years of making games, after creating paid games and taking Godot courses, after deciding that my biggest life goal was to release a game on Steam, I gave up on game dev.&lt;/p&gt;

&lt;p&gt;Imagine spending every night for a year creating a game, putting effort and work into it, and in the end, after a year and a half, having only the beginning of a game. The art was not ready, the gameplay was not smooth enough, and the puzzles were not good.&lt;/p&gt;

&lt;p&gt;Once again, I had been too ambitious and could not finish my game.&lt;/p&gt;

&lt;p&gt;After that, I thought: how many games are released on Steam? On itch.io, how many brilliant games appear every day? Does the world need more games? Or does it specifically need my games?&lt;/p&gt;

&lt;p&gt;The work, bureaucracy, and frustration you need to go through just to make a simple game are heavy. That is why I completely gave up on it for a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  Returning with AI
&lt;/h2&gt;

&lt;p&gt;The arrival of AI had a major impact on programming. I started using ChatGPT to help me create C# classes, write SQL queries for work, and solve project errors.&lt;/p&gt;

&lt;p&gt;You know that annoying error you have no idea how to solve? Before, I would go to Google, read several forums and posts, then go to Stack Overflow, find nothing, think about asking a question, and already imagine getting torn apart in the replies.&lt;/p&gt;

&lt;p&gt;That summed up my experience as a programmer pretty well: moments of joy and moments of frustration.&lt;/p&gt;

&lt;p&gt;Then I started copying the entire error message and sending it to ChatGPT. It gave specific and useful solutions. I would go back, apply them, and solve the issue. It was rudimentary, but it worked.&lt;/p&gt;

&lt;p&gt;Over time, I began to realize that many errors could be solved in record time. When a coworker asked me for help, I would send their error to ChatGPT and solve it in minutes. Sometimes they had spent the entire day stuck on it.&lt;/p&gt;

&lt;p&gt;They would say: "wow, you solved my error that fast? I lost the whole day on this, you really are a programming genius." I would laugh and say: "I sent it to the chat."&lt;/p&gt;

&lt;p&gt;After a while, everyone started doing the same thing and no one asked me for help anymore.&lt;/p&gt;

&lt;p&gt;I became excited about the potential of AI to remove the frustrating part I never liked and let me focus on the part where I could be better: being creative, having ideas, and giving direction.&lt;/p&gt;

&lt;p&gt;When GPT-5 came out, I started creating small web games with HTML, JS, and CSS directly through chat. This was in 2025. I found it fascinating and applied the same philosophy of small projects: creating minigames and short stories.&lt;/p&gt;

&lt;p&gt;I had the idea of creating a mini-RPG using Canvas, based on my previous projects. It quickly created something playable, and then I thought: now we need a small editor for this, so I can actually create this game properly.&lt;/p&gt;

&lt;p&gt;And it did.&lt;/p&gt;

&lt;p&gt;It was a small MVP, made with a one-shot prompt, but it turned out well and, surprisingly, it worked.&lt;/p&gt;

&lt;p&gt;I left the project aside for a while, until I realized that, for it to become something real, I needed to take it out of the chat, put it in an editor like VS Code, and start working on it properly.&lt;/p&gt;

&lt;p&gt;At the time, everyone was talking about Cursor, a fork of VS Code focused on working with AI. I downloaded it, got the free version with some credits, and put the project there. It started evolving brutally fast.&lt;/p&gt;

&lt;p&gt;I showed the project to Diego and he doubted it: "I want to see if this is really working." It looked magical and had been made too quickly.&lt;/p&gt;

&lt;p&gt;But when I tried to add something new, the project broke badly. I kept asking the AI to fix it, tried several prompts, and nothing worked. Since the code had been generated by AI, I also did not understand everything, and fixing it alone would take a lot of time.&lt;/p&gt;

&lt;p&gt;At the time, I thought: "I hit the limit of AI here."&lt;/p&gt;

&lt;p&gt;Then tools like Claude Code and Codex arrived, with agents better prepared to work on code projects. When I saw that Codex was available for ChatGPT subscribers, I came back to the project.&lt;/p&gt;

&lt;p&gt;Codex solved the fatal bug, improved a few things, and got the tool ready to launch in just a few days.&lt;/p&gt;

&lt;p&gt;We have to consider that I had already given up on game dev. My routine had become that of an adult with no time for unpaid personal projects. Spending nights fixing bugs and debugging was no longer realistic.&lt;/p&gt;

&lt;p&gt;So I saw that the most tedious manual work could be handled by AI, while I focused on being creative, having good ideas, expressing myself as an artist, and applying software engineering. That is the reason I came back to game dev and to the community, and why I felt it was worth creating a small game engine.&lt;/p&gt;

&lt;p&gt;This project would not exist without the beginning with GPT-5 and the maintenance with Codex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch, Community, and Engineering
&lt;/h2&gt;

&lt;p&gt;Since the engine was an MVP, a prototype, there was still a lot to polish, improve, and fix.&lt;/p&gt;

&lt;p&gt;Diego, who has always played my games and projects, started collaborating a lot. He helped the tool become good enough to launch, not only by testing and finding bugs, but also by helping solve code problems, giving constant feedback, and promoting it through game jams.&lt;/p&gt;

&lt;p&gt;I think that made the difference between the engine being seen by someone and being completely forgotten among millions of projects out there.&lt;/p&gt;

&lt;p&gt;In the end, promotion is one of the most important parts of a project. As the saying goes, "marketing is the soul of the business." If you create an incredible tool and no one knows it exists, what is the point?&lt;/p&gt;

&lt;p&gt;By the end of 2025, the engine had already launched. People were creating games with it, game jams were happening, the community was growing, and I even posted about it on LinkedIn.&lt;/p&gt;

&lt;p&gt;Then came the part I value most in the project: applying my knowledge of programming, software engineering, and best practices to turn it into something beyond a prototype.&lt;/p&gt;

&lt;p&gt;Until that point, I had mostly been deciding the creative direction and how the features would work. I had not yet thought that much about code and architecture, because it was a simple project made for people who do not have much time.&lt;/p&gt;

&lt;p&gt;But with the success of the tool, I decided to apply everything I knew about code. It was fascinating, because I learned things that I took to work, presented in a talk, and used to help other developers: how to build something high-quality with the help of AI agents.&lt;/p&gt;

&lt;p&gt;I decided to try Claude Code, paying for it instead of using a free version, because there is no such thing as a free lunch. I made the biggest migration in the history of the project, moving the entire codebase to TypeScript, with aggressive linting, unit tests, functional tests, and a code quality pipeline.&lt;/p&gt;

&lt;p&gt;I created an architecture, organized folders and structure, applied SOLID, and started using best practices I had learned from college and from every company I had worked at.&lt;/p&gt;

&lt;p&gt;That was when the project became much more robust. If I change something that breaks something else and creates a bug, I find out immediately, because there are tests covering many scenarios.&lt;/p&gt;

&lt;p&gt;In that second phase, the engine became a serious project, something people could use and trust. With the game jams hosted by Diego, promotion gained strength, and today we have a very active community using the engine every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Philosophy of Tiny RPG Studio
&lt;/h2&gt;

&lt;p&gt;The philosophy of Tiny RPG Studio is the same one from the beginning of this post: creating an accessible tool for people who are just starting out.&lt;/p&gt;

&lt;p&gt;I created a game in RPG Maker, used boolean variables, used Switches, and it was so easy that I did not even know it could already be considered programming.&lt;/p&gt;

&lt;p&gt;The sprites already existed. I did not need to know pixel art or programming. Even so, I was able to create stories and adventures.&lt;/p&gt;

&lt;p&gt;Now I have reached a point in life where I can create my own engine for other people to use. Maybe it will be their RPG Maker. Maybe it will be the first engine of their lives. Maybe it will be where they create the first game they actually finish.&lt;/p&gt;

&lt;p&gt;I would never try to create an RPG Maker competitor, the same thing but better. That would be impossible. But I could take the minimalist philosophy of Bitsy and create something in that direction.&lt;/p&gt;

&lt;p&gt;In the end, creativity is also about building on solid and brilliant things other people made before you, standing on the shoulders of giants, and then adding your own special touch.&lt;/p&gt;

&lt;p&gt;I feel that Tiny RPG Studio is something new because it is absurdly simple to use.&lt;/p&gt;

&lt;p&gt;You do not need even the bare minimum of pixel art, programming, or knowledge of how to create a scene with a teleport event from one place to another.&lt;/p&gt;

&lt;p&gt;The game world is fixed, limited, and already interconnected, like a tiny open world. Even that comes built in.&lt;/p&gt;

&lt;p&gt;The interface is simple and intuitive even on a phone, because the project was born mobile-first. And because I still think generating an HTML build, downloading it, and hosting it is too much work, the engine focuses more on generating a URL.&lt;/p&gt;

&lt;p&gt;You create your game, generate a URL, and send it to your friends. The URL already contains the entire game. There is nothing else to download.&lt;/p&gt;

&lt;p&gt;I cannot imagine a simpler way to create a mini-RPG, and I feel very proud of this project.&lt;/p&gt;

&lt;p&gt;In the end, Tiny RPG Studio was born from this cycle: discovering games, discovering programming, giving up on projects that were too big, and coming back with a tool small enough to actually exist.&lt;/p&gt;

&lt;p&gt;If it helps someone create the first game of their life, then it was already worth it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>gamedev</category>
      <category>rpg</category>
      <category>programming</category>
    </item>
    <item>
      <title>O mínimo que você precisa saber para desenvolver software com IA</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Sat, 27 Jun 2026 12:18:58 +0000</pubDate>
      <link>https://dev.to/andredarcie/o-minimo-que-voce-precisa-saber-para-desenvolver-software-com-ia-1dc9</link>
      <guid>https://dev.to/andredarcie/o-minimo-que-voce-precisa-saber-para-desenvolver-software-com-ia-1dc9</guid>
      <description>&lt;p&gt;⏱️ Tempo de leitura: aproximadamente 3 minutos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seja um engenheiro de software.&lt;/strong&gt; A IA é uma ferramenta, não substitui conhecimento de arquitetura, engenharia e boas práticas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Não terceirize decisões para a IA.&lt;/strong&gt; Requisitos funcionais e não funcionais devem ser definidos por você. Seja específico e pense até nos menores detalhes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Não existe almoço grátis.&lt;/strong&gt; Modelos gratuitos, versões mais baratas ou rodar modelos locais ainda ficam atrás dos melhores modelos para desenvolvimento profissional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hoje, os modelos mais viáveis para engenharia de software são o Opus e o GPT usando o maior nível de raciocínio ("high effort").&lt;/strong&gt; Utilizar modelos inferiores geralmente aumenta o retrabalho, fazendo você gastar mais tempo e consumindo o tempo de outras pessoas revisando e corrigindo erros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use agentes de IA rodando no seu computador.&lt;/strong&gt; O harness faz uma diferença enorme na qualidade. Para GPT, use o Codex. Para Opus, use o Claude Code. Ferramentas com harness inferior normalmente entregam resultados inferiores, mesmo usando o mesmo modelo. Afinal, por que uma empresa terceirizada conseguiria criar uma ferramenta que extrai mais de um modelo do que a própria empresa que o desenvolveu?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Planos mais baratos de IA servem para projetos simples ou amadores.&lt;/strong&gt; Em projetos profissionais, considere investir em planos que ofereçam acesso aos melhores modelos e maior capacidade de uso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Todo projeto deve possuir um &lt;code&gt;CLAUDE.md&lt;/code&gt; ou &lt;code&gt;AGENTS.md&lt;/code&gt;.&lt;/strong&gt; Mantenha esse arquivo curto, objetivo, em inglês e contendo apenas as informações realmente importantes do projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nunca implemente diretamente.&lt;/strong&gt; Analise o problema, crie um plano, revise esse plano e só então implemente. O plano deve conter arquitetura, critérios de aceitação, testes, validações e feedback loops.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Seja cético com o plano.&lt;/strong&gt; Revise tudo antes de implementar. Peça para a IA identificar lacunas, fazer perguntas e desafiar suas decisões. A IA só deveria errar por não seguir um plano bem definido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desenvolva senso crítico.&lt;/strong&gt; A IA acelera a execução, mas não substitui julgamento, criatividade e decisões de engenharia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mude seu papel.&lt;/strong&gt; Deixe de ser apenas quem implementa tarefas. Passe a atuar como arquiteto, tech lead e product owner, pensando no sistema como um todo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Contexto é tudo.&lt;/strong&gt; Um único prompt não basta. Forneça regras de negócio, arquitetura, convenções, exemplos e restrições, mas apenas o que for realmente relevante para a tarefa. Contexto insuficiente reduz a qualidade das respostas, enquanto contexto desnecessário aumenta custo, dificulta o foco do modelo e pode piorar os resultados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prefira evoluir em pequenas etapas.&lt;/strong&gt; Em vez de pedir uma funcionalidade inteira de uma vez, divida o trabalho em incrementos pequenos, valide cada etapa e só então avance para a próxima. Isso reduz retrabalho, facilita revisões e aumenta a qualidade do resultado final.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sempre valide automaticamente.&lt;/strong&gt; Todo ciclo deve terminar executando build, testes, linters, formatadores e análise estática.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Não aceite código apenas porque funciona.&lt;/strong&gt; Exija legibilidade, simplicidade, segurança, observabilidade, testes e manutenibilidade.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use skills para padronizar prompts.&lt;/strong&gt; Elas evitam que você precise reescrever instruções repetitivas para tarefas feitas constantemente, mantendo o mesmo padrão de qualidade, arquitetura e validação em todos os projetos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Se analisar, planejar, revisar e testar parece trabalho demais para você, talvez não valha a pena usar IA para desenvolver software.&lt;/strong&gt; Sem esse processo, a tendência é gerar código de baixa qualidade, aumentar o retrabalho e criar problemas que custarão muito mais tempo para corrigir depois.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A responsabilidade é sempre sua.&lt;/strong&gt; No final, você é responsável por cada linha de código que chega à produção. Não culpe a IA, as ferramentas ou terceiros. No fim, quem a empresa vai cobrar é você.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A IA não vai pensar por você. E isso é uma coisa boa.</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Fri, 26 Jun 2026 16:21:58 +0000</pubDate>
      <link>https://dev.to/andredarcie/a-ia-nao-vai-pensar-por-voce-e-isso-e-uma-coisa-boa-5jj</link>
      <guid>https://dev.to/andredarcie/a-ia-nao-vai-pensar-por-voce-e-isso-e-uma-coisa-boa-5jj</guid>
      <description>&lt;p&gt;Eu vejo muita gente esperando que a IA aja como um engenheiro de software sênior. Que ela tome decisões de arquitetura, escolha as melhores práticas, pense em escalabilidade, segurança, performance... tudo sozinha.&lt;/p&gt;

&lt;p&gt;Sinceramente, eu acho que essa expectativa está errada.&lt;/p&gt;

&lt;p&gt;No funcionamento mais básico, um LLM pega o seu prompt e prevê os próximos tokens mais prováveis. Depois existe o pós-treinamento, com validação humana, mas no fim ela continua sendo guiada pelo que você escreveu. &lt;/p&gt;

&lt;p&gt;E aí vem o ponto.&lt;/p&gt;

&lt;p&gt;Se você não disse que queria SOLID, por que ela deveria aplicar SOLID?&lt;/p&gt;

&lt;p&gt;Se você não pediu Repository Pattern, por que ela deveria criar um?&lt;/p&gt;

&lt;p&gt;Se você pediu uma API simples, por que ela deveria gastar mais tokens criando uma arquitetura cheia de camadas?&lt;/p&gt;

&lt;p&gt;Ela estaria assumindo coisas que você nunca pediu.&lt;/p&gt;

&lt;p&gt;E assumir coisas nem sempre é bom.&lt;/p&gt;

&lt;p&gt;Todo mundo pensa apenas no lado positivo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Seria legal se a IA tomasse boas decisões sozinha."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mas existe o outro lado.&lt;/p&gt;

&lt;p&gt;Ela pode decidir usar uma biblioteca que você não queria, criar dependências desnecessárias, aumentar a complexidade do projeto ou até gerar um vendor lock-in que você nunca escolheu. &lt;/p&gt;

&lt;p&gt;É por isso que eu acho que a IA não deveria decidir essas coisas por conta própria.&lt;/p&gt;

&lt;p&gt;Ela deveria executar exatamente o que você pediu.&lt;/p&gt;

&lt;p&gt;Por exemplo, quando eu quero adicionar logs em um projeto, eu não escrevo simplesmente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Adicione logs."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eu escrevo algo mais próximo de:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Utilize Serilog, siga a documentação oficial, implemente seguindo as boas práticas da biblioteca e mantenha o padrão do projeto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora sim ela tem contexto.&lt;/p&gt;

&lt;p&gt;Ela sabe qual biblioteca usar, qual documentação seguir e qual padrão eu espero.&lt;/p&gt;

&lt;p&gt;O mesmo acontece com qualidade de código.&lt;/p&gt;

&lt;p&gt;Se eu fico uma semana inteira pedindo só feature, feature, feature, feature... o débito técnico vai aparecer.&lt;/p&gt;

&lt;p&gt;Mas a culpa não é da IA.&lt;/p&gt;

&lt;p&gt;Eu nunca pedi para ela reorganizar o projeto.&lt;/p&gt;

&lt;p&gt;Eu nunca pedi um code review.&lt;/p&gt;

&lt;p&gt;Eu nunca pedi para separar responsabilidades.&lt;/p&gt;

&lt;p&gt;Então, de tempos em tempos, eu paro e faço prompts específicos para qualidade.&lt;/p&gt;

&lt;p&gt;No Tiny Theft Auto (meu pequeno projeto inspirado em GTA) foi exatamente assim.&lt;/p&gt;

&lt;p&gt;O projeto começou como um único &lt;code&gt;index.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando eu decidi que ele iria crescer, fui eu quem falou:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aplique o SRP;&lt;/li&gt;
&lt;li&gt;separe uma classe por arquivo;&lt;/li&gt;
&lt;li&gt;reorganize toda a estrutura;&lt;/li&gt;
&lt;li&gt;faça um code review;&lt;/li&gt;
&lt;li&gt;levante pontos de melhoria para eu decidir se vale a pena corrigir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas decisões foram minhas.&lt;/p&gt;

&lt;p&gt;A IA só executou. &lt;/p&gt;

&lt;p&gt;Isso acontece também em empresas.&lt;/p&gt;

&lt;p&gt;No meu trabalho, por exemplo, existem padrões internos para logs, observabilidade, testes e várias outras coisas.&lt;/p&gt;

&lt;p&gt;Eu não espero que a IA adivinhe qual padrão usar.&lt;/p&gt;

&lt;p&gt;Eu passo a documentação, a skill ou o template da empresa e peço para ela seguir aquilo.&lt;/p&gt;

&lt;p&gt;Ela deixa de "inventar" arquitetura e passa a implementar o padrão que já existe. &lt;/p&gt;

&lt;p&gt;No fim, eu acho que a maior mudança de mentalidade é essa:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nunca terceirize pensamento. Terceirize o braço.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quem decide arquitetura é você.&lt;/p&gt;

&lt;p&gt;Quem decide escalabilidade é você.&lt;/p&gt;

&lt;p&gt;Quem decide boas práticas é você.&lt;/p&gt;

&lt;p&gt;Quem decide qual biblioteca usar é você.&lt;/p&gt;

&lt;p&gt;A IA serve para executar essas decisões com muito mais velocidade.&lt;/p&gt;

&lt;p&gt;Porque, no fim das contas, ela não é um engenheiro de software tomando decisões por você.&lt;/p&gt;

&lt;p&gt;Ela é um multiplicador da produtividade de quem sabe exatamente o que quer construir. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Claude Fable 5 me permitiu criar GTA em apenas um prompt.</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Tue, 09 Jun 2026 21:02:35 +0000</pubDate>
      <link>https://dev.to/andredarcie/claude-fable-5-me-permitiu-criar-gta-em-apenas-um-prompt-j2o</link>
      <guid>https://dev.to/andredarcie/claude-fable-5-me-permitiu-criar-gta-em-apenas-um-prompt-j2o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfdeuz3wibohflher2cc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfdeuz3wibohflher2cc.png" alt=" " width="800" height="763"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude Fable 5 me permitiu criar um "GTA" em apenas um prompt.&lt;/p&gt;

&lt;p&gt;Prompt:&lt;br&gt;
&lt;code&gt;"Crie um jogo, Tiny GTA 3D."&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
A própria Anthropic afirma que o Fable 5 é seu modelo mais poderoso já lançado ao público, com avanços significativos em engenharia de software, pesquisa científica, visão computacional e execução autônoma de tarefas complexas. Em testes iniciais, empresas relataram que o modelo foi capaz de comprimir meses de trabalho de engenharia em poucos dias.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9x8ug222envtp492sfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9x8ug222envtp492sfa.png" alt=" " width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cidade 3D aberta com 64 quarteirões, prédios, parques e oceano&lt;/li&gt;
&lt;li&gt;Dirija, roube carros e fuja da polícia&lt;/li&gt;
&lt;li&gt;Sistema de procurado com 5 estrelas, viaturas e helicóptero te perseguem&lt;/li&gt;
&lt;li&gt;42 pedestres vivos que fogem, voam e morrem&lt;/li&gt;
&lt;li&gt;16 missões de entrega com histórias de corrupção brasileira&lt;/li&gt;
&lt;li&gt;Áudio sintetizado: motor, sirene, buzina e cantada de pneu&lt;/li&gt;
&lt;li&gt;Recorde salvo no navegador&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jogue aqui: &lt;a href="https://andredarcie.github.io/tiny-gta/" rel="noopener noreferrer"&gt;https://andredarcie.github.io/tiny-gta/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>Ideias Valem Muito Menos do Que Você Imagina [PT-BR]</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Sat, 30 May 2026 21:19:18 +0000</pubDate>
      <link>https://dev.to/andredarcie/ideias-valem-muito-menos-do-que-voce-imagina-pt-br-38c9</link>
      <guid>https://dev.to/andredarcie/ideias-valem-muito-menos-do-que-voce-imagina-pt-br-38c9</guid>
      <description>&lt;p&gt;A notícia da venda do Downdetector e do Speedtest para a Accenture por US$ 1,2 bilhão trouxe um comentário que aparece sempre que uma empresa de software faz sucesso:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Mas eu consigo programar isso em um fim de semana."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Talvez consiga mesmo.&lt;/p&gt;

&lt;p&gt;Mas isso não significa que você conseguiria construir o negócio.&lt;/p&gt;

&lt;h1&gt;
  
  
  O software é apenas uma pequena parte.
&lt;/h1&gt;

&lt;p&gt;Criar um site que mede velocidade de internet não é particularmente difícil para um desenvolvedor experiente.&lt;/p&gt;

&lt;p&gt;Existem diversos clones e projetos open source que fazem algo parecido.&lt;/p&gt;

&lt;p&gt;O próprio fundador de um concorrente da Ookla comentou que criou sua primeira versão &lt;strong&gt;durante um fim de semana&lt;/strong&gt; em 2008.&lt;/p&gt;

&lt;p&gt;O detalhe importante é que ele levou &lt;strong&gt;18 anos&lt;/strong&gt; para transformar aquilo em um negócio relevante.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que realmente tem valor?
&lt;/h1&gt;

&lt;p&gt;Mas o valor normalmente está em outros lugares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribuição&lt;/li&gt;
&lt;li&gt;Marca&lt;/li&gt;
&lt;li&gt;Confiança dos usuários&lt;/li&gt;
&lt;li&gt;Relacionamento com empresas&lt;/li&gt;
&lt;li&gt;Estratégia comercial&lt;/li&gt;
&lt;li&gt;Dados acumulados ao longo dos anos&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  O verdadeiro produto eram os dados
&lt;/h1&gt;

&lt;p&gt;Segundo pessoas do setor, o principal negócio não era o teste de velocidade em si.&lt;/p&gt;

&lt;p&gt;Milhões de usuários realizam testes diariamente e geram informações valiosas sobre redes de internet ao redor do mundo.&lt;/p&gt;

&lt;p&gt;Esses dados ajudam operadoras a identificar gargalos, comparar desempenho e planejar investimentos.&lt;/p&gt;

&lt;p&gt;É por isso que empresas pagam valores altos para ter acesso a essas informações.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;A ideia do Speedtest cabe em uma frase.&lt;/p&gt;

&lt;p&gt;Se um desenvolvedor construiu um concorrente em um fim de semana em 2008, imagine agora com agentes de IA. Ainda assim, continuarão faltando os 18 anos necessários para transformar aquilo em um negócio vendável.&lt;/p&gt;

&lt;p&gt;Afinal, transformar isso em uma empresa bilionária exigiu décadas de execução, operação, marketing, vendas, infraestrutura e construção de confiança.&lt;/p&gt;

&lt;p&gt;Ideias são abundantes, podem ser criadas e roubadas o tempo todo.&lt;/p&gt;

&lt;p&gt;Execução é rara.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>product</category>
      <category>marketing</category>
      <category>startup</category>
    </item>
    <item>
      <title>Agentes de IA exigem TDD: o passo a passo necessário para aplicar na prática [PT-BR]</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Tue, 17 Mar 2026 20:59:35 +0000</pubDate>
      <link>https://dev.to/andredarcie/agentes-de-ia-exigem-tdd-o-passo-a-passo-necessario-para-aplicar-na-pratica-pt-br-p21</link>
      <guid>https://dev.to/andredarcie/agentes-de-ia-exigem-tdd-o-passo-a-passo-necessario-para-aplicar-na-pratica-pt-br-p21</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bfrcj35rjsuraxe28d6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0bfrcj35rjsuraxe28d6.png" alt=" " width="375" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este tutorial mostra como usar um agente de IA para praticar TDD do zero, partindo de um requisito escrito em linguagem simples até uma implementação refatorada e com testes passando.&lt;/p&gt;

&lt;p&gt;O exemplo é um caso de uso simples/abstraido: &lt;strong&gt;criar conta de usuário&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é TDD?
&lt;/h2&gt;

&lt;p&gt;TDD (Test-Driven Development) é uma técnica de desenvolvimento em três fases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fase&lt;/th&gt;
&lt;th&gt;O que fazer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RED&lt;/td&gt;
&lt;td&gt;Escrever os testes antes do código. Eles devem falhar.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GREEN&lt;/td&gt;
&lt;td&gt;Escrever o mínimo de código para os testes passarem.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REFACTOR&lt;/td&gt;
&lt;td&gt;Melhorar o código sem quebrar os testes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ameaça e defesa
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvy4awm5rtzx1sqa2xa84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvy4awm5rtzx1sqa2xa84.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: Definir os requisitos
&lt;/h2&gt;

&lt;p&gt;Antes de escrever qualquer código, escreva o que o sistema precisa fazer em linguagem simples. Use a IA para transformar isso em um documento de requisitos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Crie um arquivo .md simples, listando os requisitos
necessários para criar um caso de uso de criar 
conta de usuário com nome, e-mail e senha,
apenas com o básico.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&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;# Criar Conta&lt;/span&gt;

&lt;span class="gu"&gt;## O que é isso?&lt;/span&gt;
Permite que uma pessoa crie uma conta na plataforma informando seu nome, e-mail e senha.

&lt;span class="gu"&gt;## O que o usuário precisa informar?&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Nome
&lt;span class="p"&gt;-&lt;/span&gt; E-mail
&lt;span class="p"&gt;-&lt;/span&gt; Senha

&lt;span class="gu"&gt;## Quando o cadastro é recusado?&lt;/span&gt;

| Situação | Motivo |
|----------|--------|
| Nome não foi preenchido | O nome é obrigatório |
| Nome tem menos de 3 letras | Nome muito curto para ser válido |
| E-mail não foi preenchido | O e-mail é obrigatório |
| E-mail está no formato errado | Precisa seguir o padrão nome@dominio.com |
| E-mail já foi usado em outro cadastro | Cada conta precisa ter um e-mail único |
| Senha tem menos de 8 caracteres | Senha muito curta |
| Senha não tem letras e números ao mesmo tempo | Senha fraca demais |

&lt;span class="gu"&gt;## O que acontece quando o cadastro dá certo?&lt;/span&gt;
A conta é criada e o sistema confirma com:
&lt;span class="p"&gt;-&lt;/span&gt; Código único da conta
&lt;span class="p"&gt;-&lt;/span&gt; Nome cadastrado
&lt;span class="p"&gt;-&lt;/span&gt; E-mail cadastrado
&lt;span class="p"&gt;-&lt;/span&gt; Data e hora do cadastro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Antes de avançar, pergunte à IA se faltou algum edge case. Requisitos incompletos geram testes incompletos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outra dica:&lt;/strong&gt; Peça para um modelo de IA diferente do que você está usando revisar os requisitos e apontar falhas graves, contradições ou cenários não cobertos. Modelos diferentes cometem erros diferentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Faltou alguma coisa importante que não considerei? Algum edge case?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 2: Visualizar o fluxo
&lt;/h2&gt;

&lt;p&gt;Com os requisitos prontos, gere um fluxograma para validar o entendimento antes de escrever código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Com base no arquivo .md criado, crie um fluxograma
da esquerda para a direita exemplificando o fluxo.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzg4no3nsg30meboxxyox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzg4no3nsg30meboxxyox.png" alt="Fluxograma do caso de uso CreateUser" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Por que isso importa?&lt;/strong&gt; O fluxograma torna visível a ordem das validações e os caminhos de erro. É mais fácil revisar um diagrama com o time do que revisar código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Passo 3: Criar a classe sem implementação (RED)
&lt;/h2&gt;

&lt;p&gt;Crie apenas o esqueleto da classe, com as dependências e a assinatura do método, sem nenhuma lógica. O método deve lançar &lt;code&gt;NotImplementedException&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Crie&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;classe&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="nc"&gt;Caso&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="nc"&gt;Uso&lt;/span&gt; &lt;span class="n"&gt;sem&lt;/span&gt; &lt;span class="n"&gt;implementação&lt;/span&gt; &lt;span class="n"&gt;alguma&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;método&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;apenas&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dependências&lt;/span&gt; &lt;span class="n"&gt;possíveis&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;nos&lt;/span&gt; &lt;span class="n"&gt;requisitos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreateUserUseCase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IUserReadRepository&lt;/span&gt; &lt;span class="n"&gt;_readRepository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IUserWriteRepository&lt;/span&gt; &lt;span class="n"&gt;_writeRepository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IPasswordHasher&lt;/span&gt; &lt;span class="n"&gt;_passwordHasher&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CreateUserUseCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;IUserReadRepository&lt;/span&gt; &lt;span class="n"&gt;readRepository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IUserWriteRepository&lt;/span&gt; &lt;span class="n"&gt;writeRepository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;IPasswordHasher&lt;/span&gt; &lt;span class="n"&gt;passwordHasher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_readRepository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readRepository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_writeRepository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;writeRepository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;_passwordHasher&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;passwordHasher&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CreateUserResponse&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ExecuteAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateUserCommand&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NotImplementedException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Implementação pendente"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 4: Escrever os testes (RED)
&lt;/h2&gt;

&lt;p&gt;Com a classe vazia criada, peça à IA para escrever os testes baseando-se nos requisitos. Os testes devem falhar neste momento, isso é esperado e correto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Uma observação sobre o ritmo:&lt;/strong&gt; no TDD clássico, o ciclo é executado um teste por vez: escreve um teste, faz passar, refatora, repete. Aqui estamos escrevendo todos os testes de uma vez antes de implementar, o que é uma adaptação prática para trabalhar com IA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Com&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;arquivo&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;requisitos&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;nessa&lt;/span&gt; &lt;span class="n"&gt;classe&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;caso&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;uso&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;escreva&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="n"&gt;testes&lt;/span&gt; &lt;span class="n"&gt;unitários&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;validem&lt;/span&gt; &lt;span class="n"&gt;cada&lt;/span&gt; &lt;span class="n"&gt;requisito&lt;/span&gt; &lt;span class="n"&gt;seguindo&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;padrão&lt;/span&gt; &lt;span class="nc"&gt;Arrange&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Act&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;confirme&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;eles&lt;/span&gt; &lt;span class="n"&gt;estão&lt;/span&gt; &lt;span class="n"&gt;falhando&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado: testes falhando:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkksj373octaqjfva856f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkksj373octaqjfva856f.png" alt="Testes falhando, fase RED" width="672" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes de avançar, verifique se a cobertura está completa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Esses testes estão cobrindo totalmente os requisitos
ou faltou algum caso?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Regra de ouro do TDD:&lt;/strong&gt; só avance para o GREEN depois que todos os testes estiverem escritos e falhando pelo motivo certo: &lt;code&gt;NotImplementedException&lt;/code&gt;, não erro de compilação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Passo 5: Fechar o agente e abrir uma nova sessão
&lt;/h2&gt;

&lt;p&gt;Antes de implementar, &lt;strong&gt;feche o agente completamente e abra uma nova conversa&lt;/strong&gt; ou limpe o contexto do agente, por exemplo com &lt;code&gt;/clean&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Na fase GREEN, a única fonte da verdade é o teste. Não o requisito, não o fluxograma, não a conversa anterior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Passo 6: Implementar para passar nos testes (GREEN)
&lt;/h2&gt;

&lt;p&gt;Na nova sessão, mostre apenas os testes e a classe vazia. O objetivo aqui é &lt;strong&gt;apenas fazer os testes passarem&lt;/strong&gt;, sem se preocupar com qualidade, padrões ou boas práticas ainda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Com&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="n"&gt;nos&lt;/span&gt; &lt;span class="n"&gt;testes&lt;/span&gt; &lt;span class="n"&gt;unitários&lt;/span&gt; &lt;span class="n"&gt;existentes&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;criação&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;usuário&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;crie&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;implementação&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;caso&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;uso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado: testes passando:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6grspa2q6ex35m65aks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6grspa2q6ex35m65aks.png" alt="Testes passando, fase GREEN" width="622" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; nesta fase é normal o código ficar feio. Validações inline, strings hardcoded, acoplamentos diretos, tudo isso é esperado. O que importa é: &lt;strong&gt;os testes passam&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Passo 7: Identificar os problemas (REFACTOR)
&lt;/h2&gt;

&lt;p&gt;Com os testes verdes, peça à IA para revisar o código com olhar crítico.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Pergunte o que está errado, não se está certo.&lt;/em&gt; Modelos de IA tendem a confirmar o que o usuário quer ouvir. "O código está bom?" quase sempre recebe um "sim". "Quais são os problemas?" força uma análise real.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Liste os problemas encontrados no código implementado
com base nas boas práticas de desenvolvimento.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F331j0ug2wvo4qj2kjrdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F331j0ug2wvo4qj2kjrdo.png" alt="Problemas encontrados no código" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 8: Refatorar (REFACTOR)
&lt;/h2&gt;

&lt;p&gt;Com a lista de problemas em mãos, peça à IA para corrigi-los. Os testes são a rede de segurança: se alguma refatoração quebrar o comportamento, os testes vão acusar imediatamente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Refatorar é mudar como, não o quê.&lt;/strong&gt; O comportamento externo deve permanecer idêntico antes e depois. Se um teste quebra durante a refatoração, significa que ele estava testando um detalhe interno de implementação em vez do comportamento, e provavelmente precisa ser revisado junto com o código.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Refatore&lt;/span&gt; &lt;span class="n"&gt;esses&lt;/span&gt; &lt;span class="n"&gt;pontos&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;melhoria&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;código&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oljfano4t7f7kmjq0vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4oljfano4t7f7kmjq0vh.png" alt="Código refatorado" width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Os problemas encontrados foram violações de SRP (uma classe deve ter apenas uma responsabilidade), OCP (aberto para extensão, fechado para         modificação), ISP (interfaces não devem forçar dependências desnecessárias), DIP (dependa de abstrações, não de implementações concretas), DRY (não repita a mesma lógica em lugares diferentes) e um problema de segurança com salt fixo na senha.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Passo 9: Confirmar que tudo ainda passa
&lt;/h2&gt;

&lt;p&gt;Após a refatoração, rode os testes novamente para garantir que nenhum comportamento foi quebrado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Execute novamente todos os testes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resultado: 24/24 passando:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe665v8k8tcvrcjxi92lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe665v8k8tcvrcjxi92lo.png" alt="Todos os testes passando após refatoração" width="618" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 10: Testar manualmente e em homologação
&lt;/h2&gt;

&lt;p&gt;Com os testes automatizados passando, valide o comportamento real da feature em ambiente de homologação ou por meio de testes manuais. Ferramentas e integrações que os testes unitários não cobrem só aparecem aqui.&lt;/p&gt;

&lt;p&gt;Se algo der errado, não tente corrigir diretamente no código. Volte ao Passo 1 e trate o bug como uma nova demanda:&lt;/p&gt;

&lt;p&gt;Descreva o comportamento incorreto como um requisito, o que deveria acontecer e o que está acontecendo, volte para o passo 1.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Por que isso importa?&lt;/strong&gt; Um bug corrigido sem teste pode voltar sem que ninguém perceba. O teste que comprova o bug é a garantia de que ele nunca mais vai passar despercebido.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O ciclo completo ficou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requisitos → Fluxograma → Esqueleto → Testes falhando
→ Fechar agente → Implementação passando → Refatoração → Testes passando
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;TDD com IA significa usar o agente de IA para acelerar cada etapa do ciclo enquanto você, desenvolvedor, mantém o controle das decisões importantes: o que o sistema deve fazer, quais casos precisam ser testados e quando o código está bom o suficiente para ir para produção. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TDD Is No Longer Optional in the World of AI Agents</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Mon, 16 Mar 2026 19:00:54 +0000</pubDate>
      <link>https://dev.to/andredarcie/tdd-is-no-longer-optional-in-the-world-of-ai-agents-5b1e</link>
      <guid>https://dev.to/andredarcie/tdd-is-no-longer-optional-in-the-world-of-ai-agents-5b1e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Test-Driven Development (TDD)&lt;/strong&gt; is a development practice where you write tests &lt;em&gt;before&lt;/em&gt; writing the code. The cycle is simple: write a failing test, implement the minimum code to make it pass, refactor. Repeated in a loop, this ensures the code does exactly what was specified.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A lot of people use AI like this: send the finished class and ask it to generate tests.&lt;/p&gt;

&lt;p&gt;The problem is that the model is just completing a token puzzle. It generates tests that match the existing code, not necessarily the correct behavior.&lt;/p&gt;

&lt;p&gt;For the model, it's not really understanding the system. It's just trying to predict the next likely token. So the test ends up being just a logical continuation of the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inverting the process
&lt;/h2&gt;

&lt;p&gt;What worked for me was inverting this using TDD.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The agent reads the &lt;strong&gt;functional requirements&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The agent generates tests based on those requirements.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;clear the context&lt;/strong&gt; (new agent, blank context).&lt;/li&gt;
&lt;li&gt;I ask it to &lt;strong&gt;implement the code that makes the tests pass&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point the agent has only one clear goal: &lt;strong&gt;make the tests pass&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It tries, fails, tries again, in a loop, until it succeeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works
&lt;/h2&gt;

&lt;p&gt;This works because &lt;strong&gt;tests are deterministic&lt;/strong&gt;. For the same code, the result will always be the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents are not deterministic&lt;/strong&gt;. There is randomness, there is hallucination, and we don't have full control over what the model will generate.&lt;/p&gt;

&lt;p&gt;So everything we can build to &lt;strong&gt;contain that behavior&lt;/strong&gt; helps.&lt;/p&gt;

&lt;p&gt;Tests end up being exactly that: &lt;strong&gt;a kind of cage to control the chaotic behavior of agents.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bugs too
&lt;/h2&gt;

&lt;p&gt;I've used this approach in critical projects where bugs simply weren't an option. The flow was: first have the agent create a test that actually breaks and reproduces the problem. Only then ask it to fix it.&lt;/p&gt;

&lt;p&gt;Because if you just ask the AI to "fix the bug," it might simply invent a solution and claim it worked.&lt;/p&gt;

&lt;p&gt;But tests don't lie.&lt;/p&gt;

&lt;p&gt;Tests create a &lt;strong&gt;forced feedback loop&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A good practice that became mandatory
&lt;/h2&gt;

&lt;p&gt;In the world of AI agents, TDD has gone from being an optional good practice to being practically mandatory.&lt;/p&gt;

&lt;p&gt;With AI-generated code, we saw a boom in automated tests. That made a big difference: code without tests lost value, because generating tests no longer costs anything. But we can go a level higher. Instead of generating tests for code, we generate tests for requirements. That's TDD, and it's the next step.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>testing</category>
      <category>tdd</category>
    </item>
    <item>
      <title>Qwen3.5 rodando localmente: super rápido e com ótima qualidade</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Sun, 08 Mar 2026 15:11:31 +0000</pubDate>
      <link>https://dev.to/andredarcie/qwen35-rodando-localmente-super-rapido-e-com-otima-qualidade-1ee8</link>
      <guid>https://dev.to/andredarcie/qwen35-rodando-localmente-super-rapido-e-com-otima-qualidade-1ee8</guid>
      <description>&lt;p&gt;Testei o Qwen3.5 rodando localmente e fiquei impressionado.&lt;/p&gt;

&lt;p&gt;Resolvi testar o novo modelo open source &lt;strong&gt;Qwen3.5&lt;/strong&gt; no meu notebook, sem muita pretensão. A ideia era só ver como ele se comportava rodando localmente.&lt;/p&gt;

&lt;p&gt;O que aconteceu me surpreendeu bastante: &lt;strong&gt;ele é brutalmente rápido&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As respostas vinham tão rápidas e tão boas que em um momento eu parei e fui conferir se aquilo realmente estava rodando &lt;strong&gt;em localhost&lt;/strong&gt; ou se, por algum motivo, estava chamando alguma API externa. Mas não. Era tudo local mesmo.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecojohfsyf2mnb8het3r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecojohfsyf2mnb8het3r.png" alt=" " width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LLM local
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Qwen3.5-9B&lt;/strong&gt; é desenvolvido pela Alibaba e tem 9 bilhões de parâmetros. Suporta &lt;strong&gt;256K tokens de contexto&lt;/strong&gt; e &lt;strong&gt;201 idiomas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma IA rodando &lt;strong&gt;100% offline no notebook&lt;/strong&gt;, sem API, sem custo e sem enviar dados para lugar nenhum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RTX 3060 Laptop (6GB VRAM)&lt;/li&gt;
&lt;li&gt;16GB RAM&lt;/li&gt;
&lt;li&gt;Windows 11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modelo: &lt;strong&gt;Qwen3.5-9B UD-Q4_K_XL&lt;/strong&gt; (Unsloth Dynamic 4-bit)&lt;/li&gt;
&lt;li&gt;Runtime: &lt;strong&gt;llama.cpp com CUDA&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Interface: &lt;strong&gt;llama-server com web UI em &lt;code&gt;localhost:8080&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;A performance ficou em torno de &lt;strong&gt;45 tokens por segundo&lt;/strong&gt;, rodando completamente na GPU.&lt;/p&gt;

&lt;p&gt;Para um notebook, isso é impressionante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Segui o guia oficial da Unsloth para rodar o modelo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://unsloth.ai/docs/models/qwen3.5" rel="noopener noreferrer"&gt;https://unsloth.ai/docs/models/qwen3.5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foi bem direto de configurar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Impressão geral
&lt;/h3&gt;

&lt;p&gt;A sensação é que &lt;strong&gt;LLMs locais realmente estão chegando em um nível muito prático de uso&lt;/strong&gt;. Rodar um modelo desse porte offline, no próprio notebook, com essa velocidade e qualidade de resposta, é algo que até pouco tempo atrás parecia distante.&lt;/p&gt;

&lt;p&gt;E agora está simplesmente rodando em &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
    <item>
      <title>A IA fez o trabalho de vários membros da minha equipe, e isso vai gerar demissões</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Fri, 13 Feb 2026 12:25:03 +0000</pubDate>
      <link>https://dev.to/andredarcie/com-ia-ou-sem-ia-os-problemas-sao-os-mesmos-de-sempre-5h4</link>
      <guid>https://dev.to/andredarcie/com-ia-ou-sem-ia-os-problemas-sao-os-mesmos-de-sempre-5h4</guid>
      <description>&lt;p&gt;A lógica é simples: se uma IA poderosa operada por 1 pessoa substitui a produtividade de uma equipe de 10, então podemos demitir 9 e está tudo resolvido? &lt;/p&gt;

&lt;p&gt;Não.&lt;/p&gt;

&lt;p&gt;Seguindo essa mesma lógica, 10 pessoas usando IA produziriam como 100. E se o seu concorrente fizer isso enquanto você reduz equipe, você acabou de se colocar em desvantagem.&lt;/p&gt;

&lt;p&gt;Ao demitir porque “a IA já entrega o mesmo que o time atual”, a empresa está presa à fotografia de hoje. Só que a régua mudou.&lt;/p&gt;

&lt;p&gt;Uma concorrente que mantenha seus desenvolvedores e os potencialize com IA não apenas preserva a capacidade de entrega, mas amplia velocidade, qualidade e experimentação. Enquanto isso, a empresa que encolhe o time corre o risco de ver seu produto evoluir mais lentamente, tornar-se superficial e perder competitividade.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>product</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Gone Home: o jogo que destruiu as regras e construiu um novo sentido para videogames [PT-BR]</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Thu, 01 May 2025 12:41:58 +0000</pubDate>
      <link>https://dev.to/andredarcie/gone-home-o-jogo-que-destruiu-as-regras-e-construiu-um-novo-sentido-para-videogames-pt-br-4mfn</link>
      <guid>https://dev.to/andredarcie/gone-home-o-jogo-que-destruiu-as-regras-e-construiu-um-novo-sentido-para-videogames-pt-br-4mfn</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Em 2013 joguei &lt;em&gt;Gone Home&lt;/em&gt;, há mais de dez anos, e ele mudou completamente o que eu achava que um videogame poderia ser. Destruiu minhas crenças. Me obrigou a encarar uma epifania tão bruta e desconfortável que levou mais de uma década para eu começar a digerir.&lt;/p&gt;

&lt;h1&gt;
  
  
  Jogo
&lt;/h1&gt;

&lt;p&gt;Quando penso em "jogo" no sentido mais puro e essencial, fora do digital, penso em um conjunto claro de regras que definem vencedores e perdedores, como no futebol, vôlei, golfe ou pôquer. O primeiro sucesso digital foi Pong (1972), lançado em 1972 pela Atari: basicamente um "tênis de mesa" virtual, dois jogadores controlam raquetes verticais e devem rebater uma bola em linha reta; deixar passar é ponto para o oponente. Depois vieram níveis, fases, mais desafio e ação com Space Invaders (1978), puzzles com Tetris (1984) e power-ups em Pac-Man (1980). Em Super Mario Bros. (1985), a essência é atravessar plataformas e vencer obstáculos; em The Legend of Zelda (1986), explorar, pegar itens e derrotar inimigos; em Metal Gear Solid (1998), mais cinematográfico, infiltrar-se em bases evitando ser detectado. Em todos esses casos, não importa a história, os gráficos ou a tecnologia: o núcleo sempre foi o mesmo — regras claras, objetivos definidos, ação estruturada em vencer, avançar, sobreviver ou resolver.&lt;/p&gt;

&lt;p&gt;Quando comecei &lt;em&gt;Gone Home&lt;/em&gt;, achei que fosse um jogo de terror: casa grande, chuva, noite, ambientes escuros, pequenos puzzles. Esperei um susto — nada aconteceu. Controle em primeira pessoa, mas sem voz, inventário, níveis, árvore de habilidades, barra de vida. Só olhos. E do outro lado? Nada. Sem inimigos. Sem puzzles de verdade. Sem correr contra o relógio. Sem armas. Sem habilidades. Você é apenas uma pessoa comum, em uma casa comum e vazia. Não existe aventura. Só exploração livre e reconstrução da história a partir do ambiente, sem diálogos, sem personagens interativos, sem missões.&lt;/p&gt;

&lt;h1&gt;
  
  
  Influência
&lt;/h1&gt;

&lt;p&gt;Gone Home rasgou o modelo tradicional de "ação e objetivo" e focou 100% em exploração e narrativa ambiental, algo praticamente inexistente na época. Embora Dear Esther já tivesse dado os primeiros passos nesse formato, foi Gone Home que consolidou e popularizou o gênero, provando seu potencial comercial e crítico. Mostrou que jogos podem contar histórias emocionais profundas — sobre família, sexualidade, aceitação — sem combate, sem missão, sem desafio, sem sequer levantar uma arma ou marcar pontos. Foi um dos marcos na criação do que hoje chamam de "walking simulator", influenciando títulos como The Stanley Parable, Firewatch e What Remains of Edith Finch, entre outros. Também quebrou barreiras temáticas, trazendo discussões polêmicas para o centro, de forma madura..&lt;/p&gt;

&lt;p&gt;O impacto foi tão grande que muita gente ficou perdida, sem saber se aquilo era mesmo um videogame. "Walking simulator" surgiu como termo pejorativo. E mesmo grandes estúdios, como a Naughty Dog, beberam dessa fonte, adicionando momentos mais contemplativos em &lt;em&gt;Uncharted 4&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Eu cresci jogando videogame. Já sabia o que esperar: vencer, perder, marcar pontos, completar fases. &lt;em&gt;Gone Home&lt;/em&gt; veio como um martelo. Destruiu esse conceito até sobrar uma folha em branco. Redefiniu para mim o que é videogame e o que ele pode ser.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;isso não é jogo.&lt;br&gt;
isso não é jogo.&lt;br&gt;
isso não é jogo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Gone Home&lt;/em&gt; foi pensado como uma ruptura proposital. Steve Gaynor e a Fullbright queriam uma narrativa íntima e emocional, sem inimigos, sem ação, focada em ambientação, inspirados por &lt;em&gt;Minerva’s Den&lt;/em&gt;. O sucesso, somado à polêmica ("isso não é jogo"), consolidou &lt;em&gt;Gone Home&lt;/em&gt; como o ponto zero dos walking simulators modernos, abrindo espaço para experiências focadas apenas em história e reflexão.&lt;/p&gt;

&lt;p&gt;Não há vitória. Não há derrota. Tampouco um objetivo explícito a ser conquistado. A lógica tradicional do triunfo é abandonada: não se escolhe entre modos Fácil, Médio ou Difícil. Em seu lugar, resta apenas a experiência sensível — sentir, compreender, refletir — como únicos movimentos possíveis dentro da narrativa.&lt;/p&gt;

&lt;p&gt;Gone Home foi &lt;a href="https://youtu.be/51LCXnBJG-M" rel="noopener noreferrer"&gt;essencial&lt;/a&gt; para a criação do Bitsy, ao mostrar a Adam Le Doux que a exploração de ambientes e a narrativa íntima poderiam ser o coração de uma experiência de jogo. Inspirado por essa abordagem, ele desenvolveu o Bitsy como uma ferramenta voltada para a criação de pequenos mundos e histórias pessoais. Apesar de sua simplicidade e minimalismo, o Bitsy conquistou um espaço de destaque no cenário mundial de desenvolvimento de jogos e, no Itch.io — a maior plataforma de jogos independentes — figura entre as 10 engines mais utilizadas, ao lado de gigantes como Unreal Engine, RPG Maker, Game Maker e Unity.&lt;/p&gt;

&lt;h1&gt;
  
  
  História
&lt;/h1&gt;

&lt;p&gt;Em Gone Home, você é Katie, uma jovem que retorna para casa depois de um ano viajando e encontra tudo vazio, ecoando ausências. Ao explorar cada canto, você descobre que sua irmã, Sam, viveu um romance secreto com outra garota, enfrentou a rejeição da família e, no fim, fugiu para viver esse amor. &lt;/p&gt;

&lt;p&gt;É estranho? Incomum? É cru, vulnerável. Um nível de exposição emocional que nem Hollywood costuma ter coragem de tocar, muito menos os games tradicionais. Aqui não há heróis salvando princesas, cientistas resolvendo catástrofes ou soldados combatendo terroristas. Existe apenas a vida real, com toda sua dor, desejo e imperfeição. É íntimo, é humano. Parece mais uma delicada história francesa, sussurrada, profunda.&lt;/p&gt;

&lt;h1&gt;
  
  
  O valor das experências
&lt;/h1&gt;

&lt;p&gt;Além da ruptura estrutural, Gone Home também foi alvo de críticas pela sua curta duração. Muitos jogadores questionaram pagar preço cheio por uma experiência que, para a maioria, dura entre uma e duas horas. Isso abriu um debate que se estenderia para outros jogos focados em narrativa: o valor de um jogo deveria ser medido pela quantidade de horas, pela profundidade da experiência, ou por outro critério? A polêmica expôs o quanto a indústria e o público ainda estavam presos à ideia de que tempo de jogo é equivalente a valor.&lt;/p&gt;

&lt;h1&gt;
  
  
  Comparação com a indústria
&lt;/h1&gt;

&lt;p&gt;Se você olha para as maiores franquias — Mario, Tetris, Call of Duty, Pokémon, GTA, Minecraft, FIFA — todas giram em torno da mesma base: regras claras, objetivos definidos, recompensa constante. Jogar para vencer. Jogar para progredir. Mesmo Minecraft, lembrado pelo modo criativo, ganha peso real no modo sobrevivência: construir, evoluir, proteger-se de monstros, resistir noite após noite.&lt;/p&gt;

&lt;p&gt;Num mundo onde Call of Duty é gigante e Counter-Strike movimenta milhões de jogadores na Steam, imaginar um jogo pacífico, explorativo, onde nem a sua história é vivida — apenas se descobre a história dos outros, lendo papéis e diários abandonados — soa quase absurdo. Não há herói. Só um observador.&lt;/p&gt;

&lt;p&gt;Myst (1993) construiu um mundo sem textos ou inimigos, focado em exploração e resolução intensa de puzzles como principal forma de narrativa. System Shock (1994) usou gravações de áudio e cenários destruídos para reconstruir uma catástrofe. Half-Life (1998) eliminou cutscenes e obrigou o jogador a presenciar os eventos dentro do próprio cenário. Deus Ex (2000) espalhou fragmentos de história em documentos, diálogos e espaços físicos, ligando narrativa a exploração e escolhas. BioShock (2007) transformou Rapture numa cidade-personagem, onde cada ruína, cada grafite e cada gravação reforçavam a falência de uma utopia. Dark Souls (2011) escondeu todo seu enredo em fragmentos do mundo e nas descrições de itens, exigindo do jogador leitura ativa do ambiente. Mas quase todos ainda dependiam de combate, vitória, progressão — até que Gone Home (2013) rompeu totalmente: nada de combate ou mecânicas profundas de gameplay. Só narrativa ambiental pura.&lt;/p&gt;

&lt;p&gt;Todos esses jogos são fantásticos e têm seus méritos. Mas Gone Home rompeu com tudo isso — e provou que, sim, existe espaço para algo realmente diferente.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Gone Home não foi só um jogo, foi um manifesto silencioso que desafiou os alicerces da indústria ao trocar ação por introspecção, desafio por contemplação, e vitória por empatia; ao abandonar as regras tradicionais que definem um jogo, ele não apenas abriu caminho para um novo gênero, mas escancarou a possibilidade de que experiências interativas podem ser também íntimas, humanas e profundamente emocionais — sem precisar das mecânicas e gameplay tradicional.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Profundos agradecimentos aos meus amigos que ajudaram a revisar o texto e a melhorá-lo de forma espetacular: Adriel, Danilo, Diguifi, Drão, Geovani e Jean — listados aqui em ordem alfabética.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Entenda DDD de uma vez por todas, na implementação [PT-BR]</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Fri, 21 Feb 2025 17:25:13 +0000</pubDate>
      <link>https://dev.to/andredarcie/entenda-ddd-de-uma-vez-por-todas-na-implementacao-pt-br-3776</link>
      <guid>https://dev.to/andredarcie/entenda-ddd-de-uma-vez-por-todas-na-implementacao-pt-br-3776</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;O Domain-Driven Design (DDD), conforme definido no livro original &lt;em&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/em&gt;, de Eric Evans, é uma abordagem para o desenvolvimento de software focada na modelagem do domínio central do negócio. Este post mostra uma implementação fiel aos conceitos do livro em um projeto de pagamentos usando C#.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que o DDD &lt;strong&gt;é&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Modelagem focada no domínio do negócio.&lt;/li&gt;
&lt;li&gt;✅ Comunicação clara entre desenvolvedores e especialistas do domínio.&lt;/li&gt;
&lt;li&gt;✅ Uso da Linguagem Onipresente (Ubiquitous Language).&lt;/li&gt;
&lt;li&gt;✅ Separação clara de responsabilidades.&lt;/li&gt;
&lt;li&gt;✅ Regras de negócio encapsuladas no domínio.&lt;/li&gt;
&lt;li&gt;✅ Limites explícitos entre diferentes contextos (Bounded Contexts).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O que o DDD &lt;strong&gt;não&lt;/strong&gt; é
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ Não é necessário para sistemas simples.&lt;/li&gt;
&lt;li&gt;❌ Não é sobre focar em detalhes técnicos.&lt;/li&gt;
&lt;li&gt;❌ Não é apenas uma divisão em camadas.&lt;/li&gt;
&lt;li&gt;❌ Não é obrigatório usar repositórios ou serviços para tudo.&lt;/li&gt;
&lt;li&gt;❌ Não é uma metodologia rígida, mas uma abordagem de design.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Conceitos Fundamentais do DDD
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bounded Contexts:&lt;/strong&gt; Define o limite explícito de cada parte do sistema, garantindo que cada contexto tenha seu próprio modelo e linguagem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entidades:&lt;/strong&gt; Representam objetos com identidade única.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Objects:&lt;/strong&gt; Representam conceitos do domínio sem identidade própria.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agregados:&lt;/strong&gt; Conjunto de entidades e objetos de valor que devem ser tratados como uma unidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repositórios:&lt;/strong&gt; Fornecem um acesso controlado aos agregados.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serviços de Domínio:&lt;/strong&gt; Contêm operações que não pertencem a uma única entidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fábricas:&lt;/strong&gt; Simplificam a criação de objetos complexos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.1 Linguagem Onipresente (Ubiquitous Language)
&lt;/h3&gt;

&lt;p&gt;Antes de ir para a implementação, é essencial definir a Linguagem Onipresente para garantir uma comunicação clara entre desenvolvedores e especialistas do domínio. No sistema de pagamentos, que vamos implementar apresenta conceitos como Pedido de Pagamento (conjunto de pagamentos de um cliente), Pagamento (transferência de valor) e Método de Pagamento (forma de pagamento, como "Cartão de Crédito" ou "PIX") são usados diretamente nas classes PedidoDePagamento, Pagamento e MetodoPagamento.&lt;/p&gt;

&lt;p&gt;Para isso, os desenvolvedores devem colaborar com equipes como o Comercial, para entender os tipos de transações e métodos de pagamento aceitos; o Financeiro, para garantir que as regras de cálculo e validação dos valores estejam corretas; e o Atendimento ao Cliente, para alinhar mensagens de erro claras, como "O valor do pagamento deve ser maior que zero". Essa colaboração garante que o sistema reflita a realidade do negócio.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 DDD Não é Sobre Arquitetura, é Sobre o Domínio
&lt;/h3&gt;

&lt;p&gt;Embora o DDD influencie a estrutura do código, ele não é sobre arquitetura, mas sim sobre compreender e modelar o domínio do negócio. Seu foco principal é capturar a lógica e os processos do domínio de forma clara e coesa, garantindo que o software reflita as necessidades da empresa. A arquitetura é apenas um meio de implementar esses conceitos, mas o verdadeiro valor do DDD está em alinhar a linguagem e o modelo do sistema com a realidade do negócio.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Mapa de Contexto (Context Map)
&lt;/h3&gt;

&lt;p&gt;O Mapa de Contexto é uma ferramenta essencial no DDD, utilizada para visualizar como os diferentes Bounded Contexts interagem entre si. Ele define as relações, dependências e formas de comunicação entre os contextos, garantindo que o sistema mantenha a coesão e a integridade do domínio.&lt;/p&gt;

&lt;p&gt;No sistema de pagamentos, por exemplo, o contexto de Pedidos de Pagamento poderia se relacionar com o contexto de Gestão Financeira para validar transações e gerar relatórios, enquanto o contexto de Atendimento ao Cliente acessa informações de pedidos para prestar suporte. Essas interações devem ser documentadas em um Mapa de Contexto, utilizando termos da Linguagem Onipresente, facilitando a comunicação entre equipes e garantindo que o design do sistema esteja alinhado às operações do negócio.&lt;/p&gt;

&lt;p&gt;Para este exemplo, focaremos apenas no contexto de Pedidos de Pagamento para simplificar a implementação e destacar os principais conceitos do DDD sem a complexidade das interações entre múltiplos contextos. Essa abordagem facilita o entendimento inicial, permitindo aprofundar-se em mapas de contexto em cenários mais avançados.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4 Simplicidade e Clareza
&lt;/h3&gt;

&lt;p&gt;Por fim, o DDD valoriza a simplicidade e a clareza do domínio, evitando abstrações desnecessárias e focando no que realmente importa para o negócio. No contexto de Pedidos de Pagamento, isso significa usar uma estrutura direta, com poucas camadas e apenas os componentes necessários para manter o domínio coeso. Repositórios, fábricas e serviços devem ser utilizados apenas quando agregam valor ao design.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Implementação
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.0 Entidade &lt;code&gt;Pagamento&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;A classe Pagamento é uma entidade que possui um identificador único (Id), o qual garante sua distinção dentro do agregado. O construtor da entidade assegura a consistência do domínio ao exigir um valor positivo e um objeto válido do Value Object MetodoPagamento, evitando a criação de objetos em estado inválido. A propriedade Valor representa o montante da transação, enquanto a propriedade Metodo incorpora o Value Object que descreve o método de pagamento utilizado. Como parte do agregado PedidoDePagamento, a entidade Pagamento não pode existir fora do contexto desse agregado, garantindo que todas as operações relacionadas ao seu ciclo de vida sejam controladas pelo Aggregate Root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;Valor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;MetodoPagamento&lt;/span&gt; &lt;span class="n"&gt;Metodo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="nf"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MetodoPagamento&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O valor do pagamento deve ser maior que zero."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;Valor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Metodo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.1 Entidade &lt;code&gt;PedidoDePagamento&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;A classe PedidoDePagamento é um Aggregate Root que possui um identificador único (Id), controla a adição de objetos do tipo Pagamento através do método AdicionarPagamento, e expõe apenas uma coleção de leitura (IReadOnlyCollection), garantindo que os pagamentos só possam ser modificados dentro do próprio agregado, mantendo a integridade do domínio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoDePagamento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pagamentos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IReadOnlyCollection&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Pagamentos&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_pagamentos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsReadOnly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="nf"&gt;PedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;_pagamentos&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;AdicionarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MetodoPagamento&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pagamento&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;_pagamentos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pagamento&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.2 Value Object &lt;code&gt;MetodoPagamento&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;A classe MetodoPagamento é um Value Object, não possui um identificador único, sendo caracterizada pelo valor da propriedade Nome, cuja imutabilidade é garantida pelo modificador somente leitura (get). Sua consistência é assegurada pelo construtor, que impede a criação de objetos com valores nulos ou em branco, garantindo que o objeto esteja sempre em um estado válido. Além disso, a classe existe apenas para descrever o meio de pagamento dentro de um contexto maior, como o agregado PedidoDePagamento, evidenciando que seu valor é mais relevante do que sua identidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MetodoPagamento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MetodoPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrWhiteSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"Método de pagamento não pode ser nulo ou vazio."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.3 Fábrica &lt;code&gt;PedidoDePagamentoFactory&lt;/code&gt;
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Obs: Segundo o DDD, as fábricas são necessárias apenas para a criação de objetos complexos. Como PedidoDePagamento não é tão complexo, a fábrica pode ser dispensada, adicionei apenas como exemplo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A classe PedidoDePagamentoFactory é uma Factory expõe o método estático CriarPedidoDePagamento, que simplifica o processo de criação de um PedidoDePagamento ao inicializar a entidade com um pagamento já adicionado. Esse método garante que o objeto seja criado em um estado válido, utilizando a classe MetodoPagamento para validar o nome do método de pagamento, promovendo a coesão e ocultando detalhes de implementação do processo de construção.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoDePagamentoFactory&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt; &lt;span class="nf"&gt;CriarPedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AdicionarPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;MetodoPagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.4 Repositório &lt;code&gt;IPedidoDePagamentoRepository&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;O Repositório é um padrão utilizado para abstrair o acesso aos dados, fornecendo uma interface que permite recuperar e armazenar objetos de domínio sem expor os detalhes da infraestrutura. A interface IPedidoDePagamentoRepository é um repositório que define o contrato para a persistência da entidade PedidoDePagamento, garantindo que o domínio permaneça independente da tecnologia de armazenamento. O método Adicionar permite incluir um novo pedido no repositório, enquanto o método ObterPorId possibilita a recuperação de um pedido existente a partir do seu identificador único (Guid), assegurando o encapsulamento do acesso aos dados e mantendo a coesão do domínio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPedidoDePagamentoRepository&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt; &lt;span class="nf"&gt;ObterPorId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.5 Serviço de Domínio &lt;code&gt;ProcessadorDePedido&lt;/code&gt;
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Obs: segundo o DDD, o serviço de domínio deve conter lógica que não pode ser atribuída a nenhuma entidade. Se o ProcessadorDePedido apenas delega para a fábrica e repositório, pode ser desnecessário, adicionei apenas como parte do exemplo, assim como a Factory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A classe ProcessadorDePedido é um serviço de domínio que coordena o processo de criação e persistência de um PedidoDePagamento, sem violar o princípio de responsabilidade única. Ela recebe uma instância de IPedidoDePagamentoRepository via injeção de dependência, promovendo a desacoplagem entre o domínio e a infraestrutura de dados. O método Processar utiliza a Factory PedidoDePagamentoFactory para garantir a criação consistente do pedido, e em seguida delega ao repositório a responsabilidade de armazená-lo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProcessadorDePedido&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IPedidoDePagamentoRepository&lt;/span&gt; &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ProcessadorDePedido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IPedidoDePagamentoRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_repository&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Processar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PedidoDePagamentoFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CriarPedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;_repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.6 DbContext &lt;code&gt;PagamentosDbContext&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;A classe PagamentosDbContext define os conjuntos de dados para as entidades PedidoDePagamento e Pagamento, permitindo operações de leitura e gravação no banco. O método OnModelCreating garante o mapeamento correto das entidades, definindo as chaves primárias com o método HasKey, assegurando a integridade dos dados no nível do banco. O Value Object MetodoPagamento é configurado como um Owned Type, de acordo com os princípios do DDD, garantindo que ele não possua uma tabela própria, mas seja armazenado junto à entidade Pagamento. Além disso, o construtor recebe as opções de configuração necessárias, promovendo a flexibilidade e a integração com diferentes provedores de banco de dados, enquanto mantém o domínio desacoplado da infraestrutura.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PagamentosDbContext&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DbContext&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PagamentosDbContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DbContextOptions&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PagamentosDbContext&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DbSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PedidosDePagamento&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DbSet&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Pagamentos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnModelCreating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ModelBuilder&lt;/span&gt; &lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="nf"&gt;HasKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="nf"&gt;HasKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Pagamento&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;().&lt;/span&gt;&lt;span class="nf"&gt;OwnsOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Metodo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metodo&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsRequired&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasMaxLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;HasColumnName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MetodoPagamentoNome"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OnModelCreating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;modelBuilder&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2.7 Repositório Concreto &lt;code&gt;PedidoDePagamentoRepository&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;A classe PedidoDePagamentoRepository é uma implementação concreta da interface IPedidoDePagamentoRepository, utilizando o PagamentosDbContext para realizar as operações de acesso ao banco de dados. O método Adicionar insere uma nova instância de PedidoDePagamento no contexto e salva as alterações no banco de dados através do método SaveChanges, garantindo a persistência imediata. O método ObterPorId busca uma instância de PedidoDePagamento com base no identificador único (Guid), utilizando o método Include para carregar a coleção de pagamentos associados, assegurando que o agregado seja recuperado em sua totalidade, conforme o princípio da consistência transacional do DDD. Dessa forma, o repositório mantém a integridade do domínio ao isolar os detalhes da persistência, promovendo um código mais limpo e coeso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoDePagamentoRepository&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPedidoDePagamentoRepository&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;PagamentosDbContext&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PedidoDePagamentoRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PagamentosDbContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_context&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Adicionar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidosDePagamento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SaveChanges&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PedidoDePagamento&lt;/span&gt; &lt;span class="nf"&gt;ObterPorId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PedidosDePagamento&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pagamentos&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Estutura final da implementação
&lt;/h3&gt;

&lt;p&gt;A camada Domain representa o núcleo do negócio, contendo as entidades Pagamento e PedidoDePagamento, o Value Object MetodoPagamento, a interface do repositório IPedidoDePagamentoRepository, o serviço de domínio ProcessadorDePedido e a fábrica PedidoDePagamentoFactory para a criação consistente dos agregados. Já a camada Infrastructure implementa os detalhes técnicos de persistência dos dados usando o EF Core, com o contexto PagamentosDbContext para configurar o banco de dados e o repositório concreto PedidoDePagamentoRepository, que realiza a interação com o banco seguindo o contrato definido na camada de domínio. Essa organização garante um sistema modular, coeso e de fácil manutenção, com o domínio livre de dependências externas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PagamentoProjeto
│
├── PagamentoContext
│   ├── Domain
│   │   ├── Aggregates
│   │   │   ├── PedidoDePagamento
│   │   │   │   ├── PedidoDePagamento.cs
│   │   │   │   ├── Pagamento.cs
│   │   │   │   └── ValueObjects
│   │   │   │       └── MetodoPagamento.cs
│   │   ├── Factories
│   │   │   └── PedidoDePagamentoFactory.cs
│   │   ├── Repositories
│   │   │   └── IPedidoDePagamentoRepository.cs
│   │   └── Services
│   │       └── ProcessadorDePedido.cs
│   │
│   └── Infrastructure
│       ├── Data
│       │   ├── Context
│       │   │   └── PagamentosDbContext.cs
│       │   └── Repositories
│       │       └── PedidoDePagamentoRepository.cs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. O Que Não Foi Utilizado do DDD Nesta Implementação
&lt;/h3&gt;

&lt;p&gt;Essa implementação optou por não utilizar alguns elementos que, embora recomendados, não eram essenciais para o exemplo apresentado. Não foram aplicados os conceitos de Domínio Rico (Rich Domain) em sua plenitude, nem o uso extensivo de Domain Events, que são úteis para notificar outras partes do sistema sobre mudanças no domínio. A camada de Application Services, que poderia coordenar a interação entre o domínio e a interface do usuário, também foi omitida para manter a simplicidade. Além disso, não foi abordado o uso de Anti-Corruption Layers para integração com sistemas externos, nem o padrão Specification, que ajuda a encapsular regras de negócio reutilizáveis. Essas ausências, no entanto, não comprometem o entendimento dos fundamentos do DDD, pois o foco do post foi demonstrar a aplicação prática dos elementos mais essenciais da abordagem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Conclusão
&lt;/h3&gt;

&lt;p&gt;Em suma, esta implementação exemplifica de forma clara e prática como aplicar os princípios do Domain-Driven Design (DDD) conforme definidos no livro original de Eric Evans. A organização modular do código, com entidades, Value Objects, agregados, repositórios e serviços de domínio, demonstra como esses componentes colaboram para manter a integridade do domínio e a coesão do sistema. Além disso, a separação entre as camadas de domínio e infraestrutura garante um design desacoplado, facilitando a manutenção e evolução do projeto. Dessa forma, a abordagem apresentada mostra como o DDD pode contribuir para o desenvolvimento de sistemas mais robustos, compreensíveis e alinhados às necessidades do negócio.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ddd</category>
      <category>architecture</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Como modelar microserviços corretamente? [PT-BR]</title>
      <dc:creator>André N. Darcie</dc:creator>
      <pubDate>Thu, 20 Feb 2025 11:06:26 +0000</pubDate>
      <link>https://dev.to/andredarcie/como-modelar-microservicos-corretamente-pt-br-1gog</link>
      <guid>https://dev.to/andredarcie/como-modelar-microservicos-corretamente-pt-br-1gog</guid>
      <description>&lt;p&gt;&lt;em&gt;Este post foi totalmente inspirado no livro &lt;em&gt;Building Microservices&lt;/em&gt; de Sam Newman.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Escrevi um post inicialmente sobre &lt;a href="https://dev.to/andredarcie/quando-nao-usar-microservicospt-br-4him"&gt;quando não usar microserviços&lt;/a&gt;, agora chegamos em um novo momento. Caso realmente faça sentido usar microserviços, como proceder? Como definir o que realmente faz sentido ser um microserviço? Qual parte do sistema deve ser isolada e se será apenas um ou vários para definir um fluxo de negócio de forma eficiente?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Como modelar microservices corretamente?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Modelar microservices não é apenas dividir uma aplicação monolítica em partes menores. É preciso definir boas fronteiras, garantir independência e criar uma arquitetura que realmente traga benefícios. Aqui estão alguns princípios essenciais:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Como fazer uma boa fronteira?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Uma boa fronteira de microserviço evita vazamento de informações, reduz dependências e melhora a escalabilidade. Para isso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Esconder dados e informações&lt;/strong&gt;: Cada microserviço deve expor apenas o necessário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coesão&lt;/strong&gt;: Serviços devem ter um propósito claro e bem definido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acoplamento&lt;/strong&gt;: Minimizar dependências entre serviços garante mais flexibilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coesão e Acoplamento juntos&lt;/strong&gt;: Um serviço bem coeso e com baixo acoplamento resulta em alta modularidade, permitindo maior escalabilidade e facilidade de manutenção.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tipos de acoplamento&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Existem diferentes formas de acoplamento que podem surgir ao modelar microservices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domínio (Aceitável)&lt;/strong&gt;: O serviço depende dos conceitos do negócio, o que é natural e desejável.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pass-through (Menos Aceitável)&lt;/strong&gt;: O serviço apenas encaminha chamadas sem lógica significativa, o que pode indicar uma falha na modelagem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Common (Ruim)&lt;/strong&gt;: Compartilhamento de código ou dependências comuns, como duas aplicações usando o mesmo banco de dados, pode gerar forte acoplamento e dificultar mudanças. Por exemplo, se um serviço precisa alterar o esquema do banco, o outro pode ser impactado, prejudicando a independência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content (Péssimo)&lt;/strong&gt;: Dependência de estrutura de dados interna de outro serviço, resultando em alto acoplamento e fragilidade na arquitetura.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;DDD e Microservices&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt; é um guia essencial para definir boas fronteiras e tornar os microservices mais independentes. Alguns conceitos-chave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linguagem Ubíqua&lt;/strong&gt;: Um vocabulário comum entre times técnicos e de negócio, garantindo que todos compreendam os termos do domínio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate&lt;/strong&gt;: Um aggregate deve agrupar entidades e objetos de valor que são tratados como uma única unidade, garantindo consistência interna. A definição de um aggregate deve seguir as seguintes regras:

&lt;ul&gt;
&lt;li&gt;As mudanças dentro do aggregate devem ser atômicas e consistentes.&lt;/li&gt;
&lt;li&gt;O acesso externo a entidades internas do aggregate deve ser mediado pelo aggregate root.&lt;/li&gt;
&lt;li&gt;Exemplo: Em um sistema de pedidos, o aggregate pode ser o Pedido, contendo itens, endereço de entrega e informações de pagamento. Qualquer alteração deve ser feita através do Pedido, garantindo integridade.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Bounded Context&lt;/strong&gt;: Define limites claros entre diferentes domínios de um sistema. Para modelar um bounded context corretamente:

&lt;ul&gt;
&lt;li&gt;Identifique os conceitos de negócio que pertencem ao mesmo contexto e separe-os daqueles que não têm relação direta.&lt;/li&gt;
&lt;li&gt;Evite dependências entre bounded contexts distintos para evitar acoplamento indesejado.&lt;/li&gt;
&lt;li&gt;Exemplo: Em um sistema de e-commerce, o contexto de "Pedidos" não deve depender do contexto de "Catálogo de Produtos", pois cada um possui regras específicas e independentes.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Por que DDD casa tão bem com microservices?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O DDD se encaixa perfeitamente com microservices porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite dividir o sistema em contextos bem definidos, facilitando a identificação das fronteiras dos microservices.&lt;/li&gt;
&lt;li&gt;Reduz a complexidade ao encapsular lógica de negócio dentro de aggregates, garantindo consistência interna.&lt;/li&gt;
&lt;li&gt;Facilita a comunicação entre times por meio da Linguagem Ubíqua, evitando mal-entendidos.&lt;/li&gt;
&lt;li&gt;Ajuda a evitar acoplamento excessivo ao definir boundaries bem estabelecidas, permitindo que cada microservice evolua de forma independente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Alternativas ao DDD&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Embora DDD seja uma abordagem sólida, existem outras estratégias para modelar microservices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volatilidade&lt;/strong&gt;: Separar serviços considerando a frequência de mudanças, isolando partes mais voláteis para evitar impactos em outros serviços.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dados&lt;/strong&gt;: Projetar microservices em torno da posse e acesso a dados, garantindo que cada serviço tenha seu próprio repositório.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tecnologia&lt;/strong&gt;: Definir serviços de acordo com a stack tecnológica, permitindo o uso da melhor tecnologia para cada caso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organização&lt;/strong&gt;: Criar serviços alinhados com a estrutura das equipes (Conway’s Law), promovendo autonomia e agilidade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Referências e Leituras Recomendadas&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para aprofundar seus conhecimentos sobre modelagem de microservices, recomendo as seguintes leituras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Building Microservices&lt;/strong&gt; - Sam Newman: Livro essencial sobre a arquitetura de microservices, que deu origem a ideia desse post, cobrindo desde a modelagem até a implementação e manutenção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain-Driven Design: Tackling Complexity in the Heart of Software&lt;/strong&gt; - Eric Evans: O livro original sobre DDD, explicando em profundidade os conceitos de agregados, bounded contexts e linguagem ubíqua.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao modelar microservices corretamente, evitamos armadilhas como dependências excessivas e serviços mal definidos, garantindo uma arquitetura escalável e sustentável. Como você tem modelado seus serviços?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>microservices</category>
    </item>
  </channel>
</rss>
