<?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: Aline Ávila</title>
    <description>The latest articles on DEV Community by Aline Ávila (@alineavila).</description>
    <link>https://dev.to/alineavila</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F351058%2F477d6548-b294-492b-ba4f-c7927b17504b.jpg</url>
      <title>DEV Community: Aline Ávila</title>
      <link>https://dev.to/alineavila</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alineavila"/>
    <language>en</language>
    <item>
      <title>Lidando com Concorrência em Java - Lock Pessimista</title>
      <dc:creator>Aline Ávila</dc:creator>
      <pubDate>Mon, 17 Nov 2025 01:09:18 +0000</pubDate>
      <link>https://dev.to/alineavila/lidando-com-concorrencia-em-java-lock-pessimista-9o3</link>
      <guid>https://dev.to/alineavila/lidando-com-concorrencia-em-java-lock-pessimista-9o3</guid>
      <description>&lt;p&gt;&lt;code&gt;Partindo do pressuposto que concorrências acontecerão em uma aplicação multithread, nesse post vou descrever de forma simples e intuitiva o lock pessimista. Ele é um mecanismo de controle de acesso a recursos compartilhados, ou seja, quando threads simultâneas acessam o mesmo registro.  🚀&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;code&gt;Importante entender também a estratégia de lock otimista e analisar qual se encaixa melhor no seu problema.&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Concorrência
&lt;/h2&gt;

&lt;p&gt;Bom, imagina uma aplicação multithread, ou seja, o mesmo recurso pode ser acessado simultaneamente por threads diferentes.&lt;/p&gt;

&lt;p&gt;Threads são processos em paralelo que estão rodando no seu programa e cada uma pode estar "disputando" o mesmo dado.&lt;/p&gt;

&lt;p&gt;Trazendo pra vida real, é como se você, leitor, tivesse tentando reservar a cadeira E10 da sessão de Velozes e Furiosos do dia 16/11 às 19:00 e Bento, no mesmíssimo instante, está fazendo a mesma reserva, na mesma cadeira, na mesma sessão. Ou seja, vocês estão "disputando" o mesmo recurso do banco de dados. Está aí um clássico exemplo de concorrência.&lt;/p&gt;

&lt;p&gt;Pra resolver esse caso temos várias alternativas e uma delas é o uso de Lock. &lt;/p&gt;

&lt;h2&gt;
  
  
  🔒 O que é Lock Pessimista e Lock Otimista?
&lt;/h2&gt;

&lt;p&gt;De maneira bastante resumida, um lock otimista assume que os conflitos são raros e o lock pessimista assume que os conflitos são comuns. &lt;/p&gt;

&lt;p&gt;Tá, mas o que isso significa? Signfica que as estratégias são diferentes para cada um. &lt;/p&gt;

&lt;p&gt;O Lock otimista verifica conflitos apenas na hora de atualizar o registro. Então, supondo que eu estou atualizando o registro de versão 2: se na hora de fazer o commit o lock vê que já existe a versão 3, significa que meu registro já não é o mais atual e a atualização para. &lt;/p&gt;

&lt;p&gt;Por exemplo, se você começou a editar com versão 2, mas outra transação já criou a versão 3, sua atualização será rejeitada (muito abstrato, eu sei, escrever sobre lock não está sendo fácil, mas no próximo artigo vamos aprofundar no lock otimista).&lt;/p&gt;

&lt;h3&gt;
  
  
  Lock Pessimista
&lt;/h3&gt;

&lt;p&gt;Aqui assumimos que os conflitos são comuns e por isso o lock pessimista "tranca" o registro. &lt;/p&gt;

&lt;p&gt;Podemos dizer que a tentativa de fazer a mesma reserva no cinema é comum, certo? Bom... então vamos implantar um lock pessimista nesse sistema. &lt;/p&gt;

&lt;p&gt;Isso significa que a partir de agora sempre que algum dado (a cadeira E10 da sessão de Velozes e Furiosos dia 16/11 as 19:00) estiver sendo disputado (por você e Bento) nós vamos trancar o acesso a essa linha do banco até que quem chegou primeiro finalize a operação que está tentando fazer.&lt;/p&gt;

&lt;p&gt;A imagem abaixo mostra em alto nível como é realizado o lock.&lt;br&gt;
Supondo que Bento começou a reserva primeiro, você só poderá fazer modificações (reservar) aquele assento quando Bento terminar ou desistir do processo dele. &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%2F1v3a6z8xh6pyiee1kmbu.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%2F1v3a6z8xh6pyiee1kmbu.png" alt="lock-pessimista-flow" width="740" height="1474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  E em Java usando JPA ficaria assim:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Transactional&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processarPedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;pedidoId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. A transação começa aqui. O pool de conexões nos empresta uma conexão.&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Pedimos o lock PESSIMISTIC_WRITE&lt;/span&gt;
    &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entityManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;Pedido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pedidoId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;LockModeType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PESSIMISTIC_WRITE&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. O JPA traduz isso para SQL:&lt;/span&gt;
    &lt;span class="c1"&gt;// "SELECT * FROM pedidos WHERE id = ? FOR UPDATE"&lt;/span&gt;
    &lt;span class="c1"&gt;// O Banco de Dados AGORA bloqueia esta linha.&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. NENHUMA outra transação pode escrever (ou ler com FOR UPDATE)&lt;/span&gt;
    &lt;span class="c1"&gt;// esta linha. Elas ficarão na fila, esperando.&lt;/span&gt;

    &lt;span class="c1"&gt;// ... fazemos nossa lógica de negócio ...&lt;/span&gt;
    &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setStatus&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PROCESSADO"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 5. A transação faz COMMIT.&lt;/span&gt;
    &lt;span class="c1"&gt;// O lock é FINALMENTE liberado. A conexão é devolvida ao pool.&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Importante notar aqui que o recurso mais escasso da sua aplicação não é CPU ou memória, é o pool de conexões do banco de dados. &lt;br&gt;
O lock pessimista segura essa conexão durante todo o tempo de vida da transação. Se a sua "lógica de negócio" for lenta (ex: chamar uma API externa), sua aplicação irá parar.&lt;br&gt;
Por isso é importante trabalhar na arquitetura da sua aplicação e não deixar que a transação precise ficar esperando por respostas externas.&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Extras do JPA (o LockModeType)
&lt;/h2&gt;

&lt;p&gt;LockModeType não é uma coisa só. A especificação JPA nos dá opções, e a escolha errada tem consequências.&lt;/p&gt;

&lt;h3&gt;
  
  
  PESSIMISTIC_WRITE (O Lock Exclusivo)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SQL&lt;/strong&gt;: SELECT ... FOR UPDATE (na maioria dos dialetos).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que faz&lt;/strong&gt;: Impede que outras transações façam SELECT ... FOR UPDATE E impede que façam UPDATE ou DELETE. É um lock exclusivo total.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quando usar&lt;/strong&gt;: Este é o padrão. Você vai ler e definitivamente vai escrever na linha.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PESSIMISTIC_READ (O Lock Compartilhado... às vezes)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SQL&lt;/strong&gt;: SELECT ... FOR SHARE (ex: PostgreSQL/MySQL 8+) ou ... LOCK IN SHARE MODE (MySQL antigo).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que faz&lt;/strong&gt;: Impede que outras transações façam UPDATE ou DELETE, mas permite que outras transações também leiam com PESSIMISTIC_READ.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quando usar&lt;/strong&gt;: Cenário mais raro. Você quer garantir que o dado não mude enquanto você lê, mas sabe que outros podem estar lendo ao mesmo tempo sem intenção de escrita.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PESSIMISTIC_FORCE_INCREMENT (O Híbrido)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;O que faz&lt;/strong&gt;: Adquire um lock pessimista (FOR UPDATE) e, além disso, força um incremento na coluna &lt;a class="mentioned-user" href="https://dev.to/version"&gt;@version&lt;/a&gt; (a mesma usada pelo lock otimista), mesmo que você não altere nenhum outro campo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quando usar&lt;/strong&gt;: Útil se você precisa invalidar caches ou "sinalizar" para sistemas otimistas que algo mudou, mas garantindo isso de forma pessimista.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dicas Extras:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Considere configurar timeout no seu lock
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Define o timeout em milissegundos.&lt;/span&gt;
&lt;span class="c1"&gt;// "javax.persistence.lock.timeout" = 0 (não espere, falhe imediatamente)&lt;/span&gt;
&lt;span class="c1"&gt;// "javax.persistence.lock.timeout" = 5000 (espere 5 seg e lance LockTimeoutException)&lt;/span&gt;
&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"javax.persistence.lock.timeout"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entityManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pedido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;LockModeType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PESSIMISTIC_WRITE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Se você optar pelo locking pessimista, sua transação deve ser cirúrgica. Ela deve ser extremamente rápida, não fazer I/O externo e ter um plano de tratamento para deadlocks (ordem de lock) e timeouts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links úteis 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.baeldung.com/jpa-pessimistic-locking" rel="noopener noreferrer"&gt;Pessimistic Locking in JPA - Baeldung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jakarta.ee/learn/docs/jakartaee-tutorial/current/persist/persistence-locking/persistence-locking.html" rel="noopener noreferrer"&gt;Controlling Concurrent Access to Entity Data with Locking&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>jpa</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Spec Driven Development: IA como aliada do desenvolvedor</title>
      <dc:creator>Aline Ávila</dc:creator>
      <pubDate>Sun, 09 Nov 2025 05:10:01 +0000</pubDate>
      <link>https://dev.to/alineavila/spec-driven-development-ia-como-aliada-do-desenvolvedor-c3c</link>
      <guid>https://dev.to/alineavila/spec-driven-development-ia-como-aliada-do-desenvolvedor-c3c</guid>
      <description>&lt;p&gt;Neste post eu vou tentar te mostrar o que é o spec-driven development da maneira mais clara e acessível possível e meu intuito é que você possa aplicar alguns conceitos aí no seu código tornando seu agente de IA o seu melhor amigo 🤝🤖&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 A importância da especificação
&lt;/h2&gt;

&lt;p&gt;Tudo começa com um bom &lt;strong&gt;README&lt;/strong&gt; — ele pode (e deve) ser usado não só pela IA, mas também por seres humanos que passarem pelo seu código.&lt;br&gt;&lt;br&gt;
Um bom README geralmente contém:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tech Stack&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Getting Started&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project Structure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - &lt;strong&gt;Resources&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Aqui vamos nos abster de citar ferramentas específicas, já que o &lt;strong&gt;Copilot&lt;/strong&gt; chama suas instruções de &lt;em&gt;instructions&lt;/em&gt;, enquanto o &lt;strong&gt;Cursor&lt;/strong&gt; de &lt;em&gt;rules&lt;/em&gt; — e provavelmente este artigo se tornaria obsoleto em questão de segundos se tentássemos acompanhar a terminologia de cada editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que realmente importa é o conceito:&lt;/strong&gt;&lt;br&gt;
a &lt;strong&gt;especificação&lt;/strong&gt; define como o seu código deve se comportar e, mais importante ainda, ela é a &lt;strong&gt;fonte da verdade&lt;/strong&gt; para todos os seus agentes de IA e desenvolvedores que irão trabalhar naquele projeto.&lt;/p&gt;

&lt;p&gt;Imagina que você é um &lt;strong&gt;chef de cozinha&lt;/strong&gt; e suas especificações são o &lt;strong&gt;livro de receitas&lt;/strong&gt; — aquele que você escreveu com todos os detalhes, inclusive a quantidade exata de gramas de sal que cada cozinheiro deve usar.&lt;br&gt;&lt;br&gt;
Pronto: esse é o &lt;strong&gt;desenvolvimento guiado por especificação&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Seu time de cozinha, nesse caso, são os &lt;strong&gt;agentes de IA&lt;/strong&gt; — e eles irão performar exatamente de acordo com o que você especificar.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✍️ Um exemplo prático
&lt;/h2&gt;

&lt;p&gt;Vamos supor que o desenvolvedor &lt;strong&gt;Mike&lt;/strong&gt; está trabalhando em um novo post para este blog.&lt;/p&gt;

&lt;p&gt;Ao mesmo tempo, a desenvolvedora &lt;strong&gt;Clara&lt;/strong&gt; também está escrevendo um artigo sobre síndrome do impostor e quer publicá-lo aqui.&lt;/p&gt;

&lt;p&gt;Foi definido que os posts do blog devem seguir uma estrutura específica:&lt;br&gt;&lt;br&gt;
devem conter &lt;strong&gt;título&lt;/strong&gt;, &lt;strong&gt;descrição&lt;/strong&gt;, &lt;strong&gt;categoria&lt;/strong&gt;, &lt;strong&gt;tags&lt;/strong&gt;, &lt;strong&gt;data&lt;/strong&gt; e &lt;strong&gt;data de publicação&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Além disso, o texto deve seguir um estilo de escrita consistente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O idioma principal é &lt;strong&gt;português&lt;/strong&gt;;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Termos técnicos&lt;/strong&gt; devem permanecer em &lt;strong&gt;inglês&lt;/strong&gt;;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Códigos&lt;/strong&gt; devem ter comentários em português;
&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;título&lt;/strong&gt; deve respeitar um limite de caracteres;
&lt;/li&gt;
&lt;li&gt;Cada post pode ter &lt;strong&gt;no máximo 5 tags&lt;/strong&gt;;
&lt;/li&gt;
&lt;li&gt;Existem diferentes &lt;strong&gt;tipos de posts&lt;/strong&gt; — &lt;em&gt;news&lt;/em&gt;, &lt;em&gt;tutorial&lt;/em&gt; e &lt;em&gt;explicações gerais&lt;/em&gt; (como este) — cada um com suas próprias regras;
&lt;/li&gt;
&lt;li&gt;E o mais importante: &lt;strong&gt;nenhum conteúdo do post deve ser gerado por IA&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso é documentado em um arquivo Markdown de especificação, como por exemplo:&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="gu"&gt;### File Structure Requirements&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-001**&lt;/span&gt;: Every blog post MUST be created as a Page Bundle in &lt;span class="sb"&gt;`/content/posts/[post-slug]/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-002**&lt;/span&gt;: The main content file MUST be named &lt;span class="sb"&gt;`index.md`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-003**&lt;/span&gt;: Each post MUST include a featured image named &lt;span class="sb"&gt;`featured.jpg`&lt;/span&gt; or &lt;span class="sb"&gt;`featured.png`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-004**&lt;/span&gt;: All post assets (images, diagrams) MUST be stored in the same folder as &lt;span class="sb"&gt;`index.md`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-005**&lt;/span&gt;: Post slug (folder name) MUST use lowercase letters, numbers, and hyphens only

&lt;span class="gu"&gt;### Front Matter Requirements&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-006**&lt;/span&gt;: Every post MUST include the following front matter fields:
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`title`&lt;/span&gt;: String (40–60 characters, title case)
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`description`&lt;/span&gt;: String (120–160 characters)
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`categories`&lt;/span&gt;: Array (typically &lt;span class="sb"&gt;`["tech"]`&lt;/span&gt;)
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`tags`&lt;/span&gt;: Array (3–5 tags, lowercase, hyphen-separated)
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`date`&lt;/span&gt;: Date (YYYY-MM-DD format)
&lt;span class="p"&gt;  -&lt;/span&gt; &lt;span class="sb"&gt;`publishDate`&lt;/span&gt;: Date (YYYY-MM-DD format)

&lt;span class="gu"&gt;### Content Structure Requirements&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-010**&lt;/span&gt;: Every post MUST start with a Lead section using &lt;span class="sb"&gt;`{{&amp;lt;/* lead */&amp;gt;}}`&lt;/span&gt; shortcode
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-011**&lt;/span&gt;: Posts with disclaimers or context notes MUST use &lt;span class="sb"&gt;`{{&amp;lt;/* alert */&amp;gt;}}`&lt;/span&gt; shortcode
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-012**&lt;/span&gt;: Every post MUST include a "Resumo rápido (em 1 minuto) ✨" section with 4–6 bullet points
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-013**&lt;/span&gt;: Every post MUST include an "O que isso significa para você 🧭" section
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-014**&lt;/span&gt;: Every post MUST conclude with a "Links úteis 🔗" section with at least 3 relevant links
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-015**&lt;/span&gt;: Main content sections MUST use &lt;span class="sb"&gt;`##`&lt;/span&gt; (H2) headers with relevant emoji
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**REQ-016**&lt;/span&gt;: Subsections MUST use &lt;span class="sb"&gt;`###`&lt;/span&gt; (H3) headers

&lt;span class="gu"&gt;### Scope&lt;/span&gt;
This specification applies to:
&lt;span class="p"&gt;-&lt;/span&gt; All blog posts published under &lt;span class="sb"&gt;`/content/posts/`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Technical articles, tutorials, and opinion pieces
&lt;span class="p"&gt;-&lt;/span&gt; Content written in Portuguese (pt-BR) for the Brazilian developer audience
&lt;span class="p"&gt;-&lt;/span&gt; Posts using Hugo Page Bundle architecture with Blowfish theme v2.91.0
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="gs"&gt;**Structure generation only**&lt;/span&gt; — content creation is out of scope for AI assistance
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🤖 IA + especificação = harmonia
&lt;/h2&gt;

&lt;p&gt;Mike pede ao seu agente de IA para criar um novo post.&lt;br&gt;
Paralelamente, Clara faz o mesmo com sua LLM preferida.&lt;/p&gt;

&lt;p&gt;Se a especificação estiver bem documentada, cada agente saberá exatamente como e quais regras seguir, resultando em dois posts estruturados de forma idêntica — mesmo sendo criados por modelos diferentes.&lt;/p&gt;

&lt;p&gt;Com as especificações do projeto em arquivos Markdown, Clara e Mike podem usar um prompt como este:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Usando os arquivos contidos na pasta specs, crie um novo post com o título Spec Driven Development.&lt;br&gt;
Este post será do tipo explicações gerais, com a categoria tech e as tags AI e programming.&lt;br&gt;
O conteúdo será escrito por mim, portanto não escreva nenhum conteúdo, apenas configure a estrutura conforme a especificação.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🚀 Escalando o conceito
&lt;/h2&gt;

&lt;p&gt;Esse é um exemplo simples, mas o mesmo raciocínio pode ser aplicado a contextos muito mais complexos — definindo regras de negócio, estruturas de dados, validações, ou até pipelines de CI/CD que evoluem primeiro na especificação e só depois no código.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Observaçoes importantes
&lt;/h2&gt;

&lt;p&gt;Sua especificação não deve se preocupar com linguagem, framework ou ferramenta — ela apenas descreve o comportamento esperado.&lt;/p&gt;

&lt;p&gt;No fim, Spec Driven Development é sobre escrever a documentação primeiro e codificar depois.&lt;br&gt;
É sobre transformar a especificação na ponte entre humanos e IAs, garantindo clareza, consistência e previsibilidade no desenvolvimento.&lt;/p&gt;

&lt;p&gt;E é assim que a IA deixa de ser apenas um assistente — e se torna a melhor amiga do dev. 💜&lt;/p&gt;




&lt;h2&gt;
  
  
  🐈 Dica extra pra quem utiliza github-copilot:
&lt;/h2&gt;

&lt;p&gt;O projeto desse blog no git está especificado utilizando os arquivos de referencia que o github-copilot utiliza. Com convenções de nomeação de pastas e arquivos de acordo com a documentação oficial até a data deste post. &lt;/p&gt;

&lt;p&gt;Caso queira pegar de exemplo, pode ficar a vontade 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Links úteis para se aprofundar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/alineavila/alineavila.dev" rel="noopener noreferrer"&gt;Este blog no github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/ai-and-ml/generative-ai/spec-driven-development-with-ai-get-started-with-a-new-open-source-toolkit/" rel="noopener noreferrer"&gt;Toolkit de specificações oficiais do github copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html" rel="noopener noreferrer"&gt;Understanding Spec-Driven-Development: Kiro, spec-kit, and Tessl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
    </item>
  </channel>
</rss>
