<?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: Matheus Moura</title>
    <description>The latest articles on DEV Community by Matheus Moura (@matheusmoura17).</description>
    <link>https://dev.to/matheusmoura17</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%2F1356132%2F37f0bd22-b470-4048-a411-8f75527a0128.jpeg</url>
      <title>DEV Community: Matheus Moura</title>
      <link>https://dev.to/matheusmoura17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matheusmoura17"/>
    <language>en</language>
    <item>
      <title>High-quality software development with AI</title>
      <dc:creator>Matheus Moura</dc:creator>
      <pubDate>Mon, 24 Aug 2026 00:25:28 +0000</pubDate>
      <link>https://dev.to/matheusmoura17/developing-a-high-quality-software-with-ai-1aj4</link>
      <guid>https://dev.to/matheusmoura17/developing-a-high-quality-software-with-ai-1aj4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Este artigo também está disponível em português no link &lt;a href="https://dev.to/matheusmoura17/desenvolvendo-software-de-qualidade-com-ia-279h"&gt;https://dev.to/matheusmoura17/desenvolvendo-software-de-qualidade-com-ia-279h&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hello! If you are reading this article, it is because you have heard the term Vibe Coding somewhere, come across some application/project that didn't work very well, or are just wanting to know a little more about it.&lt;br&gt;
In this article, I will provide a brief introduction to Vibe Coding, explain some Software Quality concepts, and then talk about a new approach that is becoming popular.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Vibe Coding
&lt;/h1&gt;

&lt;p&gt;It is an intuitive approach to building applications without needing to code a single line of code, you don't need technical knowledge, as the term itself suggests: "vibe" is similar to coding, but it's not exactly that, it's like having someone who will do the heavy lifting for you. In this methodology, you just instruct an LLM with your intuition and desires.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You describe what you want, for example: "Make a login form for a web page".&lt;/li&gt;
&lt;li&gt;An LLM makes all the decisions about which technology to use and generates the source code.&lt;/li&gt;
&lt;li&gt;No code generated by AI is bug-free, so you need to test everything and ensure it is working as it should. The focus is on the functionality itself, and not on reviewing the source code, meaning you will test the application as an end user.&lt;/li&gt;
&lt;li&gt;If everything is right, your code is ready, otherwise, describe the necessary changes as in step 1 and repeat the process until finished.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgriuwxs4bgxq70h12l8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsgriuwxs4bgxq70h12l8.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;p&gt;Whether you are a software engineer or a person who has no idea what code is, you will be able to test your idea quickly. This is great for validating short flows, of projects that may never go into production and can be discarded right after.&lt;/p&gt;

&lt;p&gt;I have a Designer friend who uses Vibe Coding to create screen prototypes, this allows him to validate flows quickly. Then, it's just a matter of converting everything to a Handoff (delivery documentation) in Figma, and passing it all to the developers, who will have the official layout to implement, as well as a navigable prototype to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;p&gt;You have no control over the generated code, and this creates drastic consequences for a software. Problems will arise, and a lot of dirt (dead code) will be left behind haunting the project throughout its existence, new features might end up deriving from places they shouldn't.&lt;/p&gt;

&lt;p&gt;I want to leave a reflection here about Vibe Coding: If you are a baker and you ask 10 people to bake a cake without specifying exactly what you want, each person will make a different cake, and you have no guarantee that the taste is as it should be, you are only evaluating the aesthetics.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fuj3owdrk2vadfsm2jc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fuj3owdrk2vadfsm2jc.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Software Quality
&lt;/h1&gt;

&lt;p&gt;Having a beautiful screen or well-structured code full of Design Patterns does not mean your software is good. There are globally accepted metrics as criteria for defining software quality, they range from a simple click on a button to an architectural choice that allows the portability of a microservice from AWS to Google Cloud for example.&lt;br&gt;
These quality criteria are defined in ISO/IEC 25010, and can be better visualized in the image below.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmforj4bvdu88iypzrzmo.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmforj4bvdu88iypzrzmo.png" alt=" " width="799" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When placing Vibe Coding and Software Quality side by side, it is noticeable that the two things do not work together, and the effort to have quality without knowing the code becomes increasingly arduous, even making us question whether it is worth using an LLM to generate code. If it takes you more time to make corrections than writing it manually, why use AI then? Relax, there are very effective alternatives to deal with this.&lt;/p&gt;

&lt;h1&gt;
  
  
  A new approach
&lt;/h1&gt;

&lt;p&gt;In the Software Engineering area, some terms have emerged such as "Vibe Engineering", "Engineering-Guided AI", "Agentic Programming", among others... I believe that at some point these terms will converge into a single one because they are very similar, so in this article we will view this new approach as something abstract and without a defined nomenclature (although I particularly really like the term Engineering-Guided AI lol).&lt;/p&gt;

&lt;p&gt;This method aims to centralize decisions on the engineer, as well as extract as much knowledge as they possess. A practical example: A team of 10 interns delivers code faster than a single senior engineer, in this context, the senior needs to clearly specify what needs to be delivered, and divide the work among the team. In a team with this amount of interns, you stop being a coder and become an orchestrator, you need to expose your ideas, review code, define architecture, and ensure that the code being developed and created meets your quality standards.&lt;/p&gt;

&lt;p&gt;The same applies to AI, Claude Code can generate great codes, and in a surreal amount of time, you just need to specify how you want it, and for that you need to define everything as if you were talking to an intern. By following this approach and paying attention to the software quality guidelines existing in ISO/IEC 25010, we will have highly efficient and extremely high-quality software.&lt;/p&gt;

&lt;p&gt;The idea behind it is not to outsource your macro vision and critical thinking, you must always be in control of everything that is being created, but you can use AI in absolutely all stages, even to generate insights about code review! Even in defining policies and reviewing code, just be careful not to turn a blind eye to some things...&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Define the development policies for your project, which architecture to use, cite references, and make it clear how the code should be written, you can put this in a claude.md file or another location of your choice.&lt;/li&gt;
&lt;li&gt;Now you need to interact with the code and there are several ways to do this, an engineer should not be limited to a single medium, but rather find what is best for their codebase, here I will cite some examples that I use in my daily life and see my engineer friends using:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SDD (Spec Driven Development)&lt;/strong&gt;: It is an approach where well-structured technical specifications become the source of truth, you create specifications instead of code. In fact, this approach has a "constitution" that acts as the software development policies I mentioned earlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt&lt;/strong&gt;: This is the simplest and most direct way to interact with your code, found a bug? Fix it using a prompt, need to find coupling flaws in your code? Request it via prompt! Perhaps this is the approach closest to Vibe Coding, but always be careful not to specify overly generic items, remember that you are an engineer and need to ensure the quality of the software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi Agents&lt;/strong&gt;: This is one of the most "attractive" ways to develop software, instead of creating multiple prompts every time, you can create them once, and store them in an Agents folder, so you have a specialized agent for a type of problem, such as creating unit tests, doing a security scan, validating architectural problems, etc...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Tools&lt;/strong&gt;: The tools allow you to interact with your codebase using external MCP servers like Figma, Jira, Github, or something of your preference, you can also create your own MCP server and provide tools that perform some specific action from your daily routine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Review the entire process, is the generated code correct? Does the application work as it should? Routinely check if the software development policy is being met.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xz89rr32g0096ed6dx0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5xz89rr32g0096ed6dx0.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pros
&lt;/h2&gt;

&lt;p&gt;You have control over everything that is being implemented, and act as a software engineer, you can ensure the quality of what is being delivered and do not need to write the code manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cons
&lt;/h2&gt;

&lt;p&gt;The process is slower compared to Vibe Coding, you need to review more and contextualize well, otherwise the result will come out bad and you will have to make many adjustments.&lt;/p&gt;

&lt;p&gt;Following the reflection I brought earlier, if you are a baker and you ask 10 people to bake a cake, but you specify everything that will be necessary from the beginning and review the result, everyone delivers the cake in the same way.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlun4uskjx979fcmjs6h.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlun4uskjx979fcmjs6h.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Vibe Coding cannot guarantee Software Quality, and therefore it is not suitable for robust production applications. Opt for Engineering-Guided AI, which is essential for applying advanced engineering practices since it keeps the developer at the center of decision-making.&lt;/p&gt;

&lt;p&gt;There are various models and frameworks available, but they mean nothing without proper application. Think like a Software Engineer; explore ways to optimize your time with AI without compromising quality. The golden rule is to never outsource your critical thinking. Take control of the architecture and let AI do the heavy lifting for you.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sources and links
&lt;/h1&gt;

&lt;p&gt;Vibe Coding&lt;br&gt;
&lt;a href="https://copilot4devops.com/vibe-coding/" rel="noopener noreferrer"&gt;https://copilot4devops.com/vibe-coding/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qualidade de Software&lt;br&gt;
&lt;a href="https://www.sofist.co/blog/iso-iec-25010" rel="noopener noreferrer"&gt;https://www.sofist.co/blog/iso-iec-25010&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spec Kit&lt;br&gt;
&lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;https://github.com/github/spec-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spec Driven Development&lt;br&gt;
&lt;a href="https://www.softdesign.com.br/blog/spec-driven-development/" rel="noopener noreferrer"&gt;https://www.softdesign.com.br/blog/spec-driven-development/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Desenvolvendo um Software de Qualidade com IA</title>
      <dc:creator>Matheus Moura</dc:creator>
      <pubDate>Sun, 23 Aug 2026 08:06:06 +0000</pubDate>
      <link>https://dev.to/matheusmoura17/desenvolvendo-software-de-qualidade-com-ia-279h</link>
      <guid>https://dev.to/matheusmoura17/desenvolvendo-software-de-qualidade-com-ia-279h</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article is also available in English: &lt;a href="https://dev.to/matheusmoura17/developing-a-high-quality-software-with-ai-1aj4"&gt;https://dev.to/matheusmoura17/developing-a-high-quality-software-with-ai-1aj4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Olá! Se você está lendo este artigo, é porque já ouviu o termo Vibe Coding em algum lugar, se deparou com alguma aplicação/projeto que não funcionou muito bem, ou então está querendo saber um pouco mais sobre isso. &lt;br&gt;
Neste artigo vou abordar uma breve introdução sobre Vibe Coding, explicar alguns conceitos de Qualidade de Software e em seguida falar sobre uma nova abordagem que está se popularizando.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é Vibe Coding
&lt;/h1&gt;

&lt;p&gt;É uma abordagem intuitiva de construir aplicações sem precisar codificar nenhuma linha de código, você não precisa de um conhecimento técnico, como o próprio termo sugere: "vibe" é parecido com codificar, mas não é bem isso, é como ter alguém que vai fazer o trabalho pesado para você. Nessa metodologia você apenas instrui uma LLM com a sua intuição e desejos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Você descreve o que você deseja, por exemplo: "Faça um formulário de login para uma página web".&lt;/li&gt;
&lt;li&gt;Uma LLM toma todas as decisões sobre qual tecnologia utilizar e gera o código-fonte.&lt;/li&gt;
&lt;li&gt;Nenhum código gerado por IA está livre de bugs, então você precisa testar tudo e garantir que está funcionando como deveria. O foco é a funcionalidade em si, e não a revisão do código-fonte, ou seja, você irá testar a aplicação como um usuário final.&lt;/li&gt;
&lt;li&gt;Se tudo estiver certo, seu código está pronto, caso contrário, descreva as alterações necessárias como no passo 1 e repita o processo até finalizar.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmw97voafupyotxdfhwvu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmw97voafupyotxdfhwvu.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prós
&lt;/h2&gt;

&lt;p&gt;Seja você um engenheiro de software ou uma pessoa que não faz a menor ideia do que é um código, você vai conseguir testar sua ideia rapidamente. Isso é ótimo para validar fluxos curtos, de projetos que talvez nunca vão entrar em produção e podem ser descartados em seguida.&lt;/p&gt;

&lt;p&gt;Tenho um amigo Designer que utiliza Vibe Coding para criar protótipos de telas, isso permite que ele valide fluxos rapidamente. Em seguida é só converter tudo para um Handoff (documentação de entrega) no Figma, e repassar tudo para os desenvolvedores, que terão o layout oficial para implementar, e também um protótipo navegável para explorar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contras
&lt;/h2&gt;

&lt;p&gt;Você não tem nenhum controle sobre o código que foi gerado, e isso gera consequências drásticas para um software. Problemas surgirão, e muita sujeira (código morto) vai ficar para trás assombrando o projeto durante toda sua existência, novas features podem acabar se derivando de locais que não deveriam. &lt;/p&gt;

&lt;p&gt;Quero deixar aqui uma reflexão sobre Vibe Coding: Se você é um confeiteiro e pede para 10 pessoas fazerem um bolo sem especificar exatamente o que você quer, cada pessoa fará um bolo diferente, e você não tem nenhuma garantia de que o sabor está como deveria, você avalia apenas a estética.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1qclj3z9eb1v4s7dwaj.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb1qclj3z9eb1v4s7dwaj.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Qualidade de software
&lt;/h1&gt;

&lt;p&gt;Ter uma tela bonita ou um código bem estruturado cheio de Design Patterns não significa que seu software é bom. Existem métricas aceitas globalmente como critérios para definir a qualidade de um software, elas vão desde um simples clique num botão até uma escolha de arquitetura que permite a portabilidade de um microsserviço da AWS para Google Cloud por exemplo.&lt;br&gt;
Esses critérios de qualidade são definidos na &lt;a href="https://www.sofist.co/blog/iso-iec-25010" rel="noopener noreferrer"&gt;ISO/IEC 25010&lt;/a&gt;, e podem ser melhor visualizados na imagem abaixo.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi78lyo642e17zcmmh8n5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi78lyo642e17zcmmh8n5.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao colocar Vibe Coding e Qualidade de Software lado a lado, é notável que as duas coisas não trabalham juntas, e o esforço para ter qualidade sem conhecer o código fica cada vez mais árduo, fazendo-nos questionar inclusive se vale a pena usar uma LLM para gerar código. Se você leva mais tempo para fazer correções do que escrevendo manualmente, por que usar IA então? Calma, existem alternativas muito eficazes de lidar com isso.&lt;/p&gt;

&lt;h1&gt;
  
  
  Uma nova abordagem
&lt;/h1&gt;

&lt;p&gt;Na área de Engenharia de Software têm surgido alguns termos como "Vibe Engineering", "Engineering-Guided AI", "Agentic Programming", e entre outros... Acredito que em algum momento esses termos irão convergir em um único pois são bem similares, então nesse artigo vamos enxergar essa nova abordagem como algo abstrato e sem uma nomenclatura definida (apesar de particularmente eu gostar muito do termo Engineering-Guided AI rsrsrs).&lt;/p&gt;

&lt;p&gt;Este método visa centralizar as decisões no engenheiro, assim como extrair o máximo possível de conhecimento que ele possua. Um exemplo prático: Uma equipe com 10 estagiários entrega código mais rápido do que um único engenheiro sênior, nesse contexto, o sênior precisa especificar bem o que precisa ser entregue, e dividir o trabalho entre o time. Numa equipe com essa quantidade de estagiários, você deixa de ser um codificador e passa a ser um orquestrador, você precisa expor suas ideias, revisar código, definir arquitetura e garantir que o código que está sendo desenvolvido e criado atenda seus padrões de qualidade.&lt;/p&gt;

&lt;p&gt;O mesmo se aplica à IA, o Claude Code consegue gerar ótimos códigos, e num tempo surreal, você só precisa especificar como você quer, e para isso você precisa definir tudo como se estivesse falando com um estagiário. Seguindo essa abordagem e nos atentando nas diretrizes de qualidade de software existentes na ISO/IEC 25010, teremos um software altamente eficiente e de extrema qualidade.&lt;/p&gt;

&lt;p&gt;A ideia por trás é não terceirizar sua visão macro e pensamento crítico, você deve estar sempre no controle de tudo que está sendo criado, mas você pode usar AI em absolutamente todas as etapas, até para gerar insights sobre a revisão do código! Até mesmo na definição das políticas e na revisão do código, só tome cuidado para não fazer vista grossa para algumas coisas...&lt;/p&gt;

&lt;h2&gt;
  
  
  Como funciona
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Defina as políticas de desenvolvimento do seu projeto, qual arquitetura usar, cite referências e deixe claro como o código deve ser escrito, você pode colocar isso num arquivo &lt;code&gt;claude.md&lt;/code&gt; ou outro local de sua escolha.&lt;/li&gt;
&lt;li&gt;Agora você precisa interagir com o código e existem várias formas de fazer isso, um engenheiro não deve se limitar a um único meio, mas sim encontrar o que é melhor para sua base de código, aqui vou citar alguns exemplos que utilizo no meu dia a dia e vejo meus amigos engenheiros utilizando:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SDD (Spec Driven Development)&lt;/strong&gt;: É uma abordagem onde as especificações técnicas bem estruturadas se tornam a fonte da verdade, você cria especificações ao invés de código. Inclusive, essa abordagem possui uma "constituição" que funcionam como as políticas de desenvolvimento de software que mencionei anteriormente.&lt;/li&gt;
&lt;li&gt;b. &lt;strong&gt;Prompt&lt;/strong&gt;: Esta é a forma mais simples e direta de interagir com seu código, encontrou um bug? Corrija utilizando prompt, precisa encontrar falhas de acoplamento no seu código? Solicite isso via prompt! Talvez essa seja a abordagem mais próxima do Vibe Coding, mas esteja sempre atento a não especificar itens genéricos demais, lembre-se que você é um engenheiro e precisa garantir a qualidade do software.&lt;/li&gt;
&lt;li&gt;c. &lt;strong&gt;Multi Agents&lt;/strong&gt;: Essa é uma das formas mais "atraentes" de desenvolver um software, ao invés de ficar criando vários prompts toda vez, você pode criar uma única vez, e guardar numa pasta Agents, assim você tem um agente especialista num tipo de problema, como criar testes unitários, fazer uma varredura de segurança, validar problemas de arquitetura, etc...
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Tools&lt;/strong&gt;: As tools permitem que você interaja com sua base de código utilizando servidores MCP externos como Figma, Jira, Github ou algo de sua preferência, você também pode criar seu próprio servidor MCP e fornecer ferramentas que realizem alguma ação específica do seu dia a dia.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Revise todo o processo, o código gerado está correto? A aplicação funciona como deveria? Verifique rotineiramente se a política de desenvolvimento de software está sendo atendida.&lt;/li&gt;
&lt;/ol&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2l95mawgc80ocwc6p16.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb2l95mawgc80ocwc6p16.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prós
&lt;/h2&gt;

&lt;p&gt;Você tem controle de tudo que está sendo implementado, e age como um engenheiro de software, consegue garantir a qualidade do que está sendo entregue e não precisa escrever o código manualmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contras
&lt;/h2&gt;

&lt;p&gt;O processo é mais lento comparado ao Vibe Coding, você precisa revisar mais e contextualizar bem, caso contrário o resultado vai sair ruim e você terá que fazer muitos ajustes.&lt;/p&gt;

&lt;p&gt;Seguindo a reflexão que trouxe anteriormente, se você é um confeiteiro e pede para 10 pessoas fazerem um bolo, mas especifica tudo que será necessário desde o início e revisa o resultado, todos entregam o bolo da mesma maneira.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjtekyggbk8pwrwzhktz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjtekyggbk8pwrwzhktz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Vibe Coding não consegue garantir a Qualidade de Software, portanto, não serve para aplicações robustas em produção. Prefira o Engineering-Guided AI, que se mostra essencial para aplicar práticas avançadas de engenharia, uma vez que mantém o desenvolvedor no centro das decisões.&lt;/p&gt;

&lt;p&gt;Existem vários modelos e frameworks, mas eles não significam nada sem a aplicação correta. Pense como um Engenheiro de Software, explore formas de otimizar o seu tempo com IA sem abrir mão da qualidade. A regra de ouro é nunca terceirizar o seu pensamento crítico. Assuma o controle da arquitetura e deixe a IA executar o trabalho pesado para você.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fontes e links
&lt;/h1&gt;

&lt;p&gt;Vibe Coding&lt;br&gt;
&lt;a href="https://copilot4devops.com/vibe-coding/" rel="noopener noreferrer"&gt;https://copilot4devops.com/vibe-coding/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qualidade de Software&lt;br&gt;
&lt;a href="https://www.sofist.co/blog/iso-iec-25010" rel="noopener noreferrer"&gt;https://www.sofist.co/blog/iso-iec-25010&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spec Kit&lt;br&gt;
&lt;a href="https://github.com/github/spec-kit" rel="noopener noreferrer"&gt;https://github.com/github/spec-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Spec Driven Development&lt;br&gt;
&lt;a href="https://www.softdesign.com.br/blog/spec-driven-development/" rel="noopener noreferrer"&gt;https://www.softdesign.com.br/blog/spec-driven-development/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Definindo o type certo para seu array filter</title>
      <dc:creator>Matheus Moura</dc:creator>
      <pubDate>Fri, 15 Mar 2024 21:35:52 +0000</pubDate>
      <link>https://dev.to/matheusmoura17/definindo-o-type-certo-para-seu-array-filter-3mc7</link>
      <guid>https://dev.to/matheusmoura17/definindo-o-type-certo-para-seu-array-filter-3mc7</guid>
      <description>&lt;p&gt;Um problema comum que muitos desenvolvedores enfrentam ao utilizar &lt;code&gt;Array.filter&lt;/code&gt; em Typescript, é a utilização de runtime ao invés de type em operações de &lt;code&gt;array.filter&lt;/code&gt; com checagem de nulos.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Types&lt;/span&gt;
&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IFruitModel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
    &lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Models&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;banana&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IFruitModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Banana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🍌&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Data manipulation&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;banana&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;banana&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruitsIcons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruitsIcons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima irá gerar o erro &lt;code&gt;'fruit' is possibly 'null'.(18047)&lt;/code&gt;. Isso acontece pois durante o &lt;code&gt;filter&lt;/code&gt; as frutas nulas são removidas, mas o type recebido no &lt;code&gt;map&lt;/code&gt; é &lt;code&gt;IFruitModel | null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Durante o &lt;code&gt;map&lt;/code&gt;, temos certeza que não existem frutas nulas, nosso código está correto e temos um erro de tipagem que não faz sentido.&lt;/p&gt;

&lt;p&gt;Vou listar abaixo a forma incorreta, e a forma certa de resolver este problema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚨 Exemplo do que não fazer&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruitsIcons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;IFruitModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso, é utilizado runtime para corrigir um problema de tipagem, comprometendo a performance do sistema em prol de um simples problema que poderia ser evitado, o código transpilado para JavaScript ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruitsIcons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que o primeiro map não faz nada a não ser retornar a própria fruta, é um desperdício de processamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Exemplo do que fazer&lt;/strong&gt;&lt;br&gt;
A forma mais adequada de se resolver este problema, é definindo o predicado.&lt;/p&gt;

&lt;p&gt;Em um &lt;code&gt;array.filter(predicate: () =&amp;gt; boolean)&lt;/code&gt;, o predicado é a função que é passada por parâmetro e sempre retorna um booleano.&lt;/p&gt;

&lt;p&gt;Podemos modificar este predicado para injetar um valor de saída no &lt;code&gt;array.filter&lt;/code&gt; da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruitsIcons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;IFruitModel&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deste modo a fruta que entra no filter ainda é &lt;code&gt;IFruitModel | undefined&lt;/code&gt;, mas o retorno será um array de &lt;code&gt;IFruitModel&lt;/code&gt;. Viabilizando o &lt;code&gt;map&lt;/code&gt; que vem em seguida.&lt;/p&gt;

&lt;p&gt;O código equivalente em javascript seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fruitsIcons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fruits&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;icon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
