anúncios

Mostrando postagens com marcador EngenhariaSoftware. Mostrar todas as postagens
Mostrando postagens com marcador EngenhariaSoftware. Mostrar todas as postagens

sexta-feira, 17 de julho de 2026

Como sobreviver à "Inflação dos Tokens" com uma estrutura híbrida e local

Se você acompanha o mercado de tecnologia, certamente percebeu o burburinho recente. O lançamento de supermodelos como o Claude Fable 5 (derivado da poderosa e restrita família Mythos da Anthropic) trouxe um balde de água fria para a comunidade de desenvolvimento: o fim das assinaturas com uso ilimitado.

A era em que usávamos modelos de inteligência artificial de ponta de forma indiscriminada por uma taxa fixa mensal está chegando ao fim. O plano fixo virou um verdadeiro "taxímetro" de créditos e consumo real de tokens.

Mas por que isso aconteceu? E, mais importante, como nós, desenvolvedores e arquitetos de software, podemos nos adaptar a essa nova realidade sem ir à falência?

O Paradoxo da Memória: LLMs vs. Humanos

Para entender o limite dos LLMs, precisamos primeiro desmistificar o que eles são. Existe uma analogia fantástica para isso: a limitação de um LLM é muito parecida com a limitação da mente humana.

Pense bem. Um humano estuda durante anos, lê centenas de livros, faz cursos e consome horas de conteúdo de diversos assuntos. O aprendizado é eterno; sempre haverá algo que ainda não sabemos e precisamos continuar estudando. Porém, por mais inteligente que um profissional seja, ele tem uma capacidade de atenção limitada no momento presente (sua memória de trabalho). Se você lhe entregar um relatório de 1.000 páginas e exigir que ele correlacione instantaneamente uma linha da página 2 com outra da página 900, ele vai falhar ou demorar muito.

O mesmo se aplica aos LLMs:

Memória de Longo Prazo (Treinamento): O modelo foi treinado com bilhões de parâmetros de diversos assuntos. O conhecimento estático está lá.

Memória de Curto Prazo (Janela de Contexto): Na hora de resolver um problema na IDE, o modelo precisa carregar as informações na "janela de contexto". Encher o prompt de dados desnecessários gera sobrecarga cognitiva na IA (alucinações) e, principalmente, consome tokens de forma brutal.

Com as empresas de IA repassando o custo real de infraestrutura para o usuário, carregar contextos gigantescos em modelos proprietários caros tornou-se insustentável. A contabilidade bateu na porta do desenvolvimento de software.

A Rota de Fuga: IA Open Source e Execução Local

Se a "inflação de tokens" encareceu as APIs de nuvem, a comunidade Open Source nos deu a resposta perfeita: rodar modelos menores localmente para tarefas do dia a dia.

Hoje, máquinas comuns de desenvolvimento conseguem rodar com extrema facilidade e fluidez modelos eficientes de até 7B ou 8B parâmetros, como o recente Gemma 4 (Google) ou o Llama 3 (Meta).

Montar um ecossistema de IA local e totalmente gratuito é extremamente simples com três ferramentas:

Ollama (O Motor): Gerencia e executa seus LLMs locais em segundo plano de forma leve e rápida no sistema operacional.

Open WebUI (A Interface): Uma interface web fantástica, idêntica ao ChatGPT, que roda localmente. Ela permite gerenciar conversas, criar prompts do sistema e até fazer RAG (conversar com seus arquivos e PDF locais).

Continue.dev (A Integração na IDE): Uma extensão de código aberto para o VS Code que se conecta diretamente ao seu Ollama local. Ela atua como seu copiloto na geração de código, autocomplete e explicações, direto no editor.

Estratégia Híbrida: Mapeando suas Tarefas para Economizar

Para não ter que abrir mão do poder de modelos gigantescos (como o Claude Fable 5 ou o GPT-4o) quando eles forem realmente necessários, a melhor prática de engenharia é adotar uma abordagem híbrida.

Divida suas tarefas diárias com base no custo computacional e de raciocínio necessário utilizando a tabela de referência abaixo:

Complexidade Exemplo de Tarefa Modelo Recomendado Onde Rodar Custo por Token
Baixa Autocomplete de sintaxe, formatação de arquivos JSON, geração de documentação de métodos (Docstrings), refatoração simples de funções. Gemma 4 2B / 4B ou Qwen 2.5 3B Local (Ollama + VS Code) Zero (Custo Local)
Média Explicação de trechos de arquitetura de código, debug de erros comuns de runtime, geração de testes unitários com base em regras bem definidas. Gemma 4 12B ou Llama 3.1 8B Local ou API de baixo custo Extremamente baixo
Alta Arquitetura de microsserviços do zero, refatorações profundas aplicando Clean Architecture e SOLID, resolução de bugs complexos de concorrência ou segurança. Claude Fable 5 ou GPT-4o API comercial em nuvem Pago por uso (Taxímetro)

Considerações finais:

O Dev Consciente é o Novo Tech Lead da IA

O "fim do hype" não é um retrocesso; é um amadurecimento saudável do mercado de tecnologia. A ferramenta de IA deixou de ser uma "mágica de uso infinito" para se tornar um recurso de engenharia gerenciável, com custos, limites e arquitetura apropriada.

Como desenvolvedores, nossa missão agora é sermos inteligentes no uso da ferramenta de IA. Ao dominar o ecossistema local com ferramentas como o Ollama e utilizá-lo para 80% do nosso fluxo de trabalho básico, economizamos recursos preciosos para acionar a "artilharia pesada" da nuvem somente quando o desafio realmente exigir.

E você, já montou o seu ecossistema de IA local ou ainda está sofrendo com as contas das APIs na nuvem? Deixe sua experiência nos comentários!

Feito!

quarta-feira, 1 de julho de 2026

Os conceitos de Engenharia de Software que separam Devs Juniores de Seniores

No início da carreira na programação, é comum focarmos muito em sintaxe de linguagem, frameworks e na lógica de criar pequenas funcionalidades. No entanto, conforme os sistemas crescem e passam a atender milhões de usuários, os desafios mudam de figura. O que diferencia um desenvolvedor Júnior de um desenvolvedor Sênior não é apenas o domínio do código, mas o conhecimento em System Design (Arquitetura de Sistemas Distribuídos) e a capacidade de prever falhas antes que elas aconteçam.

Abaixo, explicamos de forma didática os principais conceitos de arquitetura que você precisa dominar para elevar o nível da sua carreira.

1. Idempotência

Idempotência é a garantia de que, não importa quantas vezes você execute a mesma ação, o resultado final e os efeitos colaterais serão exatamente os mesmos da primeira execução. Um exemplo clássico ocorre em transações financeiras: se você faz um PIX e a rede oscila, o aplicativo pode tentar reenviar a requisição. Um sistema idempotente gera uma chave única (geralmente um hash baseado nos dados da transação) e bloqueia a segunda tentativa se ela acontecer dentro de um curto intervalo de tempo, evitando cobranças duplicadas.

2. Transações Distribuídas

Em sistemas monolíticos antigos, garantir que tudo funcionasse ou falhasse junto era fácil usando o banco de dados. Em arquiteturas modernas de microsserviços, surge o desafio das Transações Distribuídas. Imagine comprar um pacote de viagens: o sistema precisa reservar o voo na companhia aérea, o quarto no hotel e o carro na locadora. Se o hotel falhar, o voo precisa ser cancelado. Para resolver isso, utilizam-se padrões como o Two-Phase Commit (2PC) ou o padrão Saga (Saga Pattern), que coordena transações compensatórias para desfazer passos anteriores em caso de erro.

3. Consistência Eventual

Em sistemas globais, atualizar um dado em todos os servidores do mundo instantaneamente é impossível devido à latência da rede. A Consistência Eventual aceita que os dados fiquem desatualizados por alguns segundos ou minutos, mas garante que, eventualmente, todos os servidores convergirão para o mesmo estado correto. Um exemplo prático é o contador de visualizações de um vídeo no YouTube: você no Brasil pode ver um número ligeiramente diferente de alguém acessando na China, mas depois de um tempo os valores se igualam.

4. Réplicas de Leitura (Read Replicas)

A imensa maioria das aplicações web lida com muito mais leituras do que escritas (por exemplo, milhares de pessoas leem uma postagem de rede social, mas poucas de fato escrevem uma). Para não sobrecarregar o banco de dados principal, cria-se uma estratégia onde apenas uma instância recebe as escritas (banco de Write) e várias cópias sincronizadas lidam apenas com as consultas dos usuários (bancos de Read).

5. Teorema de CAP

Este teorema dita que um sistema distribuído só pode garantir duas de três propriedades ao mesmo tempo: Consistência (C), Disponibilidade (A) e Tolerância a Partições de Rede (P). Como falhas de rede (Partições) são inevitáveis na realidade, o Teorema de CAP na prática força o arquiteto sênior a tomar uma decisão difícil quando a rede falha: ou o sistema nega a requisição para manter os dados idênticos (priorizando Consistência) ou aceita a alteração correndo o risco de dessincronização temporária (priorizando Disponibilidade).

6. Sistemas de Mensageria e Garantias de Entrega

Ao trafegar dados de forma assíncrona por ferramentas como o Apache Kafka, existem três decisões arquiteturais sobre como as mensagens serão entregues:

  • At Most Once (No máximo uma vez): A mensagem é enviada; se falhar no caminho, é perdida. Prioriza velocidade.
  • At Least Once (Pelo menos uma vez): A mensagem é reenviada até haver confirmação. Evita perda de dados, mas pode gerar duplicatas.
  • Exactly Once (Exatamente uma vez): O sistema garante que a mensagem será processada uma única vez. É o cenário ideal, porém o mais complexo e custoso de se implementar devido ao alto processamento necessário de coordenação.

7. Backpressure (Pressão de Retorno)

Imagine um sistema raspador de dados (Web Scraper) que baixa 20 imagens por segundo (Produtor), mas o serviço de compactação dessas imagens só consegue processar 5 por segundo (Consumidor). Sem um controle, a memória ou a fila do consumidor vai estourar. Backpressure é o mecanismo de comunicação reversa que permite ao Consumidor avisar o Produtor: "Estou cheio, diminua a velocidade de envio", salvando a estabilidade da infraestrutura.

8. Thundering Herd Problem

Esse problema ocorre quando um recurso muito requisitado que estava guardado em cache expira repentinamente. No exato segundo da expiração, milhares de usuários que estavam lendo do cache tentam acessar o banco de dados principal de forma simultânea. Essa avalanche repentina de requisições pode derrubar o banco de dados instantaneamente.

9. Celebrity Problem (ou Hot Shard)

Para escalar bancos de dados, costuma-se dividi-los em pedaços menores chamados shards. Se o seu sistema armazena dados de usuários comuns divididos igualmente, o tráfego flui bem. Mas se uma celebridade gigantesca cai em um shard específico, todo o tráfego da rede social vai se concentrar naquela única máquina. Esse nó específico se torna um "Hot Shard", exigindo estratégias avançadas de distribuição para não colapsar.

10. Circuit Breaker (Disjuntor)

Inspirado nos disjuntores elétricos residenciais, este padrão monitora chamadas para serviços externos. Se uma API externa começa a falhar repetidamente, o Circuit Breaker "abre o circuito" e impede que novas requisições percam tempo tentando bater naquela API indisponível. Em vez disso, ele retorna imediatamente um erro amigável ou um caminho alternativo, protegendo os recursos internos do seu próprio sistema.

11. Feature Flags

Feature Flags são interruptores condicionais inseridos no código que permitem ativar ou desativar uma funcionalidade dinamicamente sem a necessidade de realizar um novo deploy. São extremamente úteis para realizar testes com pequenos grupos de usuários (testes beta) ou lançar atualizações de forma gradual. Contudo, desenvolvedores seniores alertam: esquecer de remover as flags antigas transforma o código em uma gambiarra difícil de manter.

12. Schema Evolution

Sistemas evoluem e as estruturas de seus dados mudam. Schema Evolution refere-se à habilidade de alterar o formato de uma tabela de banco de dados, de uma API ou de uma mensagem de evento mantendo a retrocompatibilidade. Isso garante que sistemas legados ou parceiros externos que ainda usam a estrutura antiga não quebrem quando você lançar uma atualização.

13. Migrations Conscientes

Muitos juniores cometem o erro clássico de enviar uma alteração de banco de dados (Migration) adicionando um novo campo obrigatório (Constraint NOT NULL) ao mesmo tempo em que sobem o código novo da aplicação. Durante o processo de alteração, o banco de dados pode sofrer um travamento completo (lock). Seniores planejam migrações críticas de forma faseada para mitigar riscos, utilizando passos intermediários descritos a seguir.

14. Backfill

O Backfill é o processo de preencher de forma incremental e segura dados retroativos em campos novos que foram criados no banco de dados. Em vez de travar o banco atualizando milhões de linhas de uma vez só, o desenvolvedor sênior cria o campo como opcional e roda rotinas em lotes pequenos (batches) em horários de menor movimento para popular o histórico.

15. Dual Rights (Escritas Duplas)

Estratégia usada em migrações complexas de infraestrutura onde a aplicação passa a salvar as informações simultaneamente em duas fontes de dados diferentes (o banco antigo e o banco novo). Isso permite validar a consistência e o comportamento do novo ambiente em tempo real sem desligar o sistema antigo.

16. Shadow Tables

Shadow Tables (Tabelas Espelho) funcionam como cópias ocultas que replicam as operações das tabelas principais em produção. Elas servem para testar migrações massivas em larga escala, permitindo que os desenvolvedores analisem a performance e possíveis erros de uma alteração sem impactar a experiência do usuário real.

17. Algoritmos de Rate Limit

Rate Limit é o ato de limitar quantas requisições um cliente pode fazer para proteger a API contra abusos ou ataques. Existem quatro principais maneiras de fazer isso:

  1. Fixed Window: Define uma janela rígida de tempo (ex: 100 requisições por hora). Se estourar o limite, bloqueia até a virada da hora cheia.
  2. Sliding Window: Uma janela de tempo móvel e dinâmica que avalia o histórico recente do usuário segundo a segundo, evitando abusos nas bordas do relógio.
  3. Token Bucket: Um balde virtual acumula fichas (tokens) em uma taxa constante. Cada requisição gasta uma ficha. Permite que o usuário faça rajadas rápidas de requisições se o balde estiver cheio, mas o bloqueia quando as fichas acabam até que novas caiam.
  4. Leaky Bucket: Semelhante ao balde de fichas, mas as requisições entram no balde e saem por um pequeno furo na base em uma velocidade perfeitamente constante e controlada, suavizando picos de tráfego.

18. Cache Invalidation

Existe uma famosa frase na computação que diz: "Só existem dois problemas difíceis na engenharia de software: invalidação de cache e escolher nomes para coisas". Guardar dados na memória (Cache) acelera o sistema, mas saber o momento exato de apagar esse cache quando o dado original muda no banco — para evitar que o usuário veja informações obsoletas — é um dos maiores desafios de arquitetura.

19. Cold Start

Muito comum em arquiteturas Serverless (como AWS Lambda), o Cold Start (Início Frio) é a latência ou demora que acontece quando uma função que estava desligada recebe uma requisição após muito tempo ociosa. O provedor de nuvem precisa criar uma máquina virtual do zero, baixar o código e iniciar o ambiente antes de responder ao usuário, gerando um gargalo inicial de performance.

20. Design para a Falha (Design for Failure)

Os desenvolvedores juniores programam assumindo que a rede nunca vai oscilar, que o banco de dados estará sempre online e que as APIs externas nunca vão falhar. Já os desenvolvedores seniores programam assumindo o oposto: tudo o que puder falhar, vai falhar em algum momento. O conceito de Design para a Falha dita que a arquitetura do sistema deve ser resiliente o suficiente para continuar funcionando (mesmo que de forma limitada ou degradada) quando partes dela colapsarem, utilizando mecanismos de redundância, retentativas inteligentes (com recuo exponencial) e caminhos de fallback automatizados.

Considerações finais

O maior aprendizado que diferencia os níveis de maturidade técnica é entender que não existem soluções mágicas, existem tradeoffs (compensações). Cada escolha arquitetural resolve um problema ao custo de introduzir uma nova complexidade. O papel de um desenvolvedor sênior é olhar para o cenário de negócios, analisar os prós e contras de cada conceito listado e escolher a ferramenta que melhor equilibra custo, segurança e escalabilidade.

Feito!

quarta-feira, 24 de junho de 2026

O Guia do Full Cycle Developer: Por que escrever código virou Commodity na era dos agentes de IA

Se você acompanha o mercado de tecnologia, certamente já ouviu que "a programação acabou" ou que "qualquer um agora é desenvolvedor". Desde o impacto global gerado em 30 de novembro de 2022, ferramentas baseadas em Large Language Models (LLMs), como Claude Code, Gemini, ChatGPT, Perplexity e etc, transformaram radicalmente a nossa rotina.

No entanto, há uma grande confusão no ar. Antes de entendermos o novo papel do desenvolvedor, precisamos dar um passo atrás e ajustar os termos técnicos para não cair em clichês generalistas.

Desmistificando o Termo "IA"

Hoje, a sigla IA (Inteligência Artificial) tem sido usada erroneamente como um guarda-chuva para absolutamente tudo. Para quem está iniciando na área, é vital compreender que a IA é, na verdade, um amplo subcampo da Ciência da Computação.

Dentro desse universo, temos ramificações profundas:

  • Machine Learning (Aprendizado de Máquina): Algoritmos que aprendem a partir de padrões de dados.
  • Deep Learning (Aprendizado Profundo): Redes neurais artificiais complexas que baseiam os modelos de linguagem modernos.
  • Fine-Tuning (Ajuste Fino): O processo de treinar um modelo existente em um conjunto de dados específico para especializá-lo em uma tarefa.

Por isso, quando geramos código no VS Code ou no terminal, não estamos usando "a IA" de forma genérica. O termo correto é ferramenta / agente de IA ou ferramenta do provedor de LLM. O que você tem em mãos é um modelo de linguagem avançado atuando como um assistente, e não uma consciência mágica que resolve problemas de negócios sozinha.

O cliente não lê código: O foco no negócio

Com a sintaxe democratizada por essas ferramentas de LLM, escrever código isolado virou commodity. O cliente final, aquele que financia o projeto, não se importa com a stack utilizada, com a metodologia aplicada, e muito menos lê as linhas de código do repositório.

O que importa para o cliente é uma única coisa: o sistema atende ao que foi solicitado e resolve o negócio dele?

É aqui que o mero digitador de código perde espaço e se destaca o verdadeiro Engenheiro de Software. O ciclo de valor de um projeto maduro começa muito antes do banco de dados e termina muito depois do código pronto.

O Ciclo do Desenvolvimento Moderno (Full Cycle)

Para entregar valor real hoje, o profissional precisa dominar o fluxo de ponta a ponta, assumindo a postura de um Full Cycle Developer. Esse ecossistema se divide em etapas claras:

1. Engenharia de Requisitos e Prototipagem

Antes de modelar uma única tabela ou abrir a IDE, o processo começa com o desenho na folha de papel ou ferramentas como o Figma.

  • Escrita de Requisitos: Definição clara dos Requisitos Funcionais (RFs) e Não Funcionais (RNFs).
  • Validação Visual: O protótipo de tela permite que o cliente aprove o fluxo de negócio antes que a equipe gaste tempo e recursos com a modelagem ou codificação.

2. Arquitetura e Modelagem

Com o escopo e protótipos aprovados pelo cliente, inicia-se a engenharia de dados: desenhar a modelagem das tabelas do banco de dados consciente e escolher os padrões arquiteturais corretos que garantam a manutenibilidade do sistema.

3. Implementação e Testes de Valor

Aqui, as ferramentas do provedor de LLM brilham, atuando de forma altamente produtiva. No entanto, o desenvolvedor dita as regras e garante a qualidade:

  • Testes Unitários de Negócio: Cada funcionalidade implementada deve vir acompanhada de testes unitários que garantam o valor do negócio e impeçam que bugs cheguem em produção por falta desses testes.
  • Métricas de Qualidade: Integração contínua com ferramentas como o SonarQube para assegurar uma cobertura mínima de 80% do código implementado.

4. DevOps e Deploy Automatizado

O ciclo se fecha quando a solução está em produção gerando valor. O desenvolvedor moderno precisa ter conhecimentos além da engenharia de software tradicional, integrando práticas de DevOps para preparar o ambiente com pipelines de CI/CD automatizadas em uma VPS ou plataforma cloud.

Se o sistema não está em produção de forma segura e automatizada, o trabalho não terminou.

O verbo mudou: Da Construção para a Orquestração

A pergunta clássica que muitos fazem é: "Existe um programador que consegue codar com maior eficiência que a IA?"

A resposta correta é: Depende do seu prompt. A ferramenta de IA é um amplificador do seu conhecimento. Se você tiver experiência em engenharia de software e DevOps, sabe aplicar um prompt assertivo que obtém resultado de um Engenheiro de Software Sênior. Do contrário, o resultado será equivalente ao de um desenvolvedor júnior ou .

Podemos resumir essa dinâmica na seguinte relação matemática:

Resultado Final = Conhecimento de Engenharia × Capacidade da Ferramenta de IA

No fim das contas, o que são as ferramentas de IA das LLMs? Elas agem como um estagiário ou desenvolvedor júnior brilhante que não tem preguiça para programar e segue rigorosamente o que você colocou no prompt. As ferramentas evoluem, mas a habilidade de traduzir problemas de negócios complexos em softwares estáveis, escaláveis e testados continua sendo uma competência essencialmente humana.

Se o operador tiver conhecimento zero de arquitetura, boas práticas e negócios, a ferramenta do provedor de LLM entregará um código genérico, desconexo e difícil de manter. Por outro lado, nas mãos de um profissional sênior que sabe instruir o agente com contexto técnico e revisar o código de forma crítica, a tecnologia se torna um amplificador brutal de produtividade.

As ferramentas evoluem a cada semana, mas a habilidade de traduzir problemas de negócios complexos em softwares estáveis, escaláveis e testados continua sendo, e sempre será, uma competência essencialmente humana.

Feito!

terça-feira, 16 de junho de 2026

O mito dos novos LLMs: Descubra onde está o segredo dos LLMs de agentes de IA

Se você tem acompanhado o mercado de Inteligência Artificial (IA) recentemente, deve ter notado um padrão. A cada poucas semanas, um grande provedor de nuvem ou laboratório de IA anuncia um novo modelo com gráficos impressionantes, prometendo revolucionar o desenvolvimento de software. No entanto, quem entende o que acontece "por debaixo dos panos" já percebeu a realidade: as LLMs brutas estagnaram em termos de capacidade cognitiva pura.

Os benchmarks inflados apresentados pelos influenciadores e vendedores de cursos com uso de ferramentas de IA tornaram-se falácias para iludir quem não possui uma base técnica sólida. O verdadeiro salto de desempenho e autonomia não vem mais do tamanho da rede neural, mas sim da engenharia aplicada ao redor dela.

A estagnação das LLMs e a ilusão dos benchmarks

Aumentar o número de parâmetros ou treinar modelos com mais dados textuais parou de trazer os retornos exponenciais de antes. Quando uma empresa anuncia que seu novo modelo superou o anterior em 2% ou 3% em um benchmark como o MMLU ou HumanEval, isso quase sempre se traduz em zero impacto no mundo real.

Esses testes tornaram-se ambientes controlados e, muitas vezes, os dados dos próprios benchmarks acabam vazando no conjunto de treinamento dos modelos. Para o desenvolvedor que precisa resolver problemas complexos de arquitetura, segurança ou depuração em sistemas legados, o modelo bruto continua cometendo as mesmas alucinações de sempre.

O Verdadeiro Segredo: O Harness Aplicado ao Agente

Se o modelo base não é mais o diferencial, onde está o segredo? A resposta está no harness (a armadura ou infraestrutura de orquestração) que envolve a LLM. Um agente de elite só é eficiente porque possui um ecossistema robusto de ferramentas, gerenciamento de estado e loops de feedback que estendem a capacidade do modelo.

O que influenciadores vendem como "a genialidade do Claude Code", por exemplo, nada mais é do que uma excelente engenharia de software local. O segredo do sucesso dessas ferramentas comerciais inclui:

  • Sistemas de busca especializados: Ferramentas nativas de indexação e busca de código baseadas em AST (Abstract Syntax Tree) ou ferramentas como grep otimizado.
  • Edição por Diff: Em vez de pedir para a LLM reescrever um arquivo inteiro de 2000 linhas (o que gera falhas e estouro de contexto), o harness intercepta a resposta e aplica apenas modificações cirúrgicas (diffs).
  • Ambientes de Execução Isolados: A capacidade de executar testes unitários em tempo real, ler os erros do terminal e corrigir a si mesmo antes de entregar o código ao usuário.

Criando suas próprias Skills sem depender de terceiros

Quando você entende esse conceito, percebe que pode construir seu próprio sistema de agentes modulares. Você pode criar "Skills" específicas para cada propósito do ciclo de desenvolvimento, encapsulando regras de negócio e ferramentas customizadas.


+-------------------------------------------------------+
|                    SEU HARNESS CORE                   |
+-------------------------------------------------------+
                           |
        +------------------+------------------+
        |                  |                  |
        v                  v                  v
+---------------+  +---------------+  +---------------+
| SKILL: STACK  |  | SKILL: QA     |  | SKILL: SECURITY|
| - Frontend    |  | - Testes Unit |  | - SAST / DAST |
| - Backend     |  | - Regressão   |  | - Sandboxing  |
+---------------+  +---------------+  +---------------+

Ao isolar essas especialidades, você remove a dependência de plataformas proprietárias. Se uma Skill de segurança (Security) for bem blindada com ferramentas de análise estática e validação rigorosa, você obtém uma capacidade equivalente ou superior aos recursos restritos de grandes corporações.

A soberania tecnológica contra bloqueios comerciais

Depender exclusivamente de ferramentas prontas de terceiros coloca seu fluxo de trabalho sob risco constante. Interrupções repentinas no fornecimento de recursos avançados por motivos regulatórios ou comerciais deixam desenvolvedores dependentes sem alternativas imediatas.

A alternativa técnica viável é construir sua própria infraestrutura de agentes. Utilizando protocolos de integração abertos e plugando modelos open-weight altamente eficientes dentro de um harness proprietário, você garante autonomia total sobre suas ferramentas de desenvolvimento.

Considerações finais

O mercado de marketing da IA continuará tentando vender o próximo modelo como o "melhor agente do mundo". Cabe aos engenheiros de software e arquitetos de soluções olhar além do hype, compreender que a inteligência está na orquestração e focar na construção de harnesses robustos, seguros e soberanos.

Feito!

sexta-feira, 22 de maio de 2026

DDD explicado de forma didática

Domain-Driven Design: como modelar software complexo colocando o domínio no centro do universo

O que é DDD?

Domain-Driven Design (DDD) é uma abordagem de desenvolvimento de software criada por Eric Evans no livro azul de 2003. O nome pode assustar, mas a ideia é simples: em vez de começar pensando em bancos de dados, rotas HTTP ou frameworks, você começa pensando no domínio do negócio, ou seja, no problema que o software precisa resolver.

DDD não é uma tecnologia, nem um framework, nem uma arquitetura como MVC. É um conjunto de princípios e padrões que ajuda times de software a criar modelos mentais compartilhados com especialistas do negócio.

"O coração do software é a capacidade de resolver problemas do domínio." Eric Evans

Por que DDD existe?

Projetos de software falham com frequência porque o time técnico e os especialistas do negócio não falam a mesma língua. O desenvolvedor pergunta "qual o tipo desse campo?"; o especialista responde "é o código da agência". Ninguém se entende. O resultado são sistemas cheios de regras espalhadas, modelos anêmicos e código que ninguém consegue mudar sem quebrar tudo.

DDD propõe uma linguagem comum (chamada de Ubiquitous Language) usada por todos, do analista ao dev ao QA, e um modelo de software que reflete fielmente essa linguagem.

Os pilares do DDD

1. Linguagem Ubíqua (Ubiquitous Language)

É o vocabulário compartilhado entre todos os envolvidos. Se o especialista chama algo de "Transferência", o código deve ter uma classe Transferencia, a tabela deve se chamar transferencias, e a API deve expor /transferencias. Nada de Trans, TransfRecord ou transactions, usem o mesmo nome.

2. Domínio e Subdomínios

O domínio é o coração do negócio, é o problema principal que o sistema resolve. Um único sistema grande geralmente contém vários subdomínios:

  • Core Domain: a parte mais importante, que dá vantagem competitiva. Ex: o motor de precificação de um banco.
  • Supporting Subdomain: necessário, mas não estratégico. Ex: cálculo de impostos.
  • Generic Subdomain: pode ser comprado ou usado pronto. Ex: autenticação, envio de e-mail.
// Exemplo: o domínio de um sistema bancário
// Core Domain: Motor de crédito
class AnaliseDeCredito {
  constructor(private score: Score, 
  private rendaMonetaria: Renda) {}
  aprovar(): boolean {
      /* lógica de negócio central */
      }
}

// Supporting Subdomain: Cálculo de tarifas
class CalculadoraDeTarifas {
  calcular(operacao: Operacao): number { 
  /* complexo, mas não estratégico */ }
}

// Generic Subdomain: Autenticação (pronto, comprado)
// Usamos Keycloak, Auth0, ou similar

3. Contextos Delimitados (Bounded Contexts)

Um dos conceitos mais importantes do DDD. Um Bounded Context é uma fronteira explícita dentro da qual um modelo de domínio é válido. Dentro dela, a Linguagem Ubíqua tem significado único e consistente.

Por exemplo: no contexto de Vendas, "Cliente" tem endereço de entrega e histórico de pedidos. No contexto de Cobrança, "Cliente" tem CPF, score de crédito e data de vencimento. São modelos diferentes e devem viver em contextos separados (serviços, módulos, ou até repositórios distintos).

Cada Bounded Context pode ter sua própria arquitetura, seu próprio banco de dados e sua própria equipe. O que vale dentro de um, não vale dentro do outro.

Os blocos de construção táticos

DDD fornece padrões de modelagem para transformar a linguagem do negócio em código expressivo.

Entity

Um objeto que tem identidade própria. Dois objetos com os mesmos atributos mas identidades diferentes são entidades diferentes. Ex: um Cliente com id = 123 é diferente do cliente id = 456, mesmo que tenham o mesmo nome.

class Cliente {
  constructor(
    // identidade única
    readonly id: ClienteId,  
    private nome: Nome,
    private email: Email
  ) {}

  trocarEmail(novoEmail: Email): void {
    this.email = novoEmail;
  }
}

Value Object

Um objeto que não tem identidade, é definido apenas pelos seus atributos. Dois Value Objects com os mesmos valores são considerados iguais. São imutáveis.

  • Dinheiro (valor + moeda), R$ 50,00 não deixa de ser R$ 50,00 por ter "identidade".
  • CPF, Email, Endereco, todos imutáveis e comparados por valor.
class Dinheiro {
  constructor(
    readonly valor: number,
     // 'BRL', 'USD'
    readonly moeda: string 
  ) {}

  somar(outro: Dinheiro): Dinheiro {
    if (this.moeda !== outro.moeda)
      throw new Error('Moedas diferentes');
    return new Dinheiro(this.valor + 
                       outro.valor, this.moeda);
  }

  equals(outro: Dinheiro): boolean {
    return this.valor === outro.valor && 
               this.moeda === outro.moeda;
  }
}

Aggregate

Um cluster de objetos tratados como uma unidade. Cada Aggregate tem uma raiz (Aggregate Root) que é a única porta de entrada para o mundo externo. Toda consistência do cluster passa pela raiz.

// Aggregate Root: Pedido
class Pedido {
  constructor(
    readonly id: PedidoId,
    readonly clienteId: ClienteId,
    private itens: Item[],
    private status: StatusPedido
  ) {}

  adicionarItem(produto: Produto, 
    quantidade: number): void {
    if (this.status !== 'aberto')
      throw new Error('Pedido fechado não aceita itens');
    this.itens.push(new Item(produto, quantidade));
  }

  total(): Dinheiro {
    return this.itens.reduce(
      (acc, item) => acc.somar(item.subtotal()),
      new Dinheiro(0, 'BRL')
    );
  }
}

Domain Event

Algo que aconteceu no domínio e interessa a outras partes do sistema. Usa-se verbos no passado: PedidoCriado, TransferenciaRealizada, ContaEncerrada.

class PedidoCriado {
  constructor(
    readonly pedidoId: PedidoId,
    readonly clienteId: ClienteId,
    readonly total: Dinheiro,
    readonly ocorridoEm: Date = new Date()
  ) {}
}

Repository

Abstração de persistência. Para o domínio, o Repository parece um coleção em memória. O domínio nunca sabe se está usando PostgreSQL, MongoDB ou arquivo JSON.

interface PedidoRepository {
  salvar(pedido: Pedido): Promise<void>;
  buscarPorId(id: PedidoId): Promise<Pedido | null>;
  buscarPorCliente(clienteId: ClienteId): Promise<
                                          Pedido[]>;
}

Domain Service

Quando uma operação não pertence naturalmente a uma Entity ou Value Object, criamos um Domain Service. Ele orquestra regras que envolvem múltiplos agregados.

class ServicoDeTransferencia {
  constructor(
    private contas: ContaRepository
  ) {}

  transferir(origemId: ContaId, destinoId: 
  ContaId, valor: Dinheiro): void {
    const origem = this.contas.buscarPorId(origemId);
    const destino = this.contas.buscarPorId(destinoId);

    origem.debitar(valor);
    destino.creditar(valor);

    this.contas.salvar(origem);
    this.contas.salvar(destino);
  }
}

DDD e arquitetura

DDD não exige uma arquitetura específica, mas se encaixa perfeitamente com Arquitetura Hexagonal (Ports & Adapters) e Clean Architecture. A regra de ouro é:

  • O domínio fica no centro, isolado de frameworks, banco de dados e UI.
  • A infraestrutura (HTTP, banco, filas) fica nas bordas e depende do domínio, não o contrário.
  • As dependências apontam para dentro (Dependency Inversion Principle).
src/
├── dominio/    # CORE  sem dependências externas
│   ├── entidades/
│   ├── value-objects/
│   ├── servicos/
│   └── repositorios/ # Interfaces apenas
├── aplicacao/        # Casos de uso (orquestração)
├── infra/            # Implementações concretas
│   ├── persistencia/
│   ├── http/
│   └── fila/
└── shared/           # Código compartilhado

Quando usar DDD?

  • Use quando o domínio do negócio é complexo e cheio de regras.
  • Use quando há especialistas de negócio dispostos a conversar com o time técnico.
  • Não use em CRUDs simples um formulário que só insere dados no banco não precisa de DDD.
  • Não use se o time não tem disciplina para manter a Linguagem Ubíqua viva.
  • Não use como dogma DDD é ferramenta, não religião.

Passos práticos para começar

  1. Entreviste especialistas sente com quem entende do negócio e faça perguntas. Anote os termos que eles usam.
  2. Crie um glossário monte a Linguagem Ubíqua com definições claras de cada termo.
  3. Identifique os Bounded Contexts desenhe fronteiras: o que faz parte de Vendas? O que faz parte de Cobrança?
  4. Modele os Aggregates descubra as raízes e o que pertence a cada uma.
  5. Implemente com TDD o domínio é a parte mais testável do sistema. Teste as regras de negócio sem tocar em banco ou HTTP.
  6. Refatore sem medo o modelo de domínio evolve com o negócio. DDD favorece a mudança.

Exemplo completo: Aluguel de Carros

Vamos modelar um pequeno domínio de locação de veículos usando DDD:

// ——— Value Objects ———
class Placa {
  constructor(readonly valor: string) {
    if (!/^[A-Z]{3}\d[A-Z]\d{2}$/.test(valor))
      throw new Error('Placa inválida');
  }
}

class Quilometragem {
  constructor(readonly valor: number) {
    if (valor < 0) throw new 
    Error('KM não pode ser negativo');
  }
}

class Periodo {
  constructor(readonly inicio: Date, 
  readonly fim: Date) {
    if (fim <= inicio) throw new 
    Error('Período inválido');
  }
  duracaoDias(): number {
    return (this.fim.getTime() - 
    this.inicio.getTime()) / 86400000;
  }
}

// ——— Aggregate: Veiculo ———
class Veiculo {
  constructor(
    readonly id: VeiculoId,
    readonly placa: Placa,
    private kmAtual: Quilometragem,
    private disponivel: boolean = true
  ) {}

  alugar(): void {
    if (!this.disponivel) throw new 
    Error('Veículo indisponível');
    this.disponivel = false;
  }

  registrarDevolucao(kmFinal: Quilometragem): void {
    this.disponivel = true;
    this.kmAtual = kmFinal;
  }
}

// ——— Aggregate: Locacao ———
class Locacao {
  constructor(
    readonly id: LocacaoId,
    readonly veiculoId: VeiculoId,
    readonly clienteId: ClienteId,
    readonly periodo: Periodo,
    readonly tarifaDiaria: Dinheiro,
    private status: 'ativa' | 'finalizada' = 'ativa'
  ) {}

  calcularTotal(): Dinheiro {
    const dias = this.periodo.duracaoDias();
    return new Dinheiro(dias * 
           this.tarifaDiaria.valor, 'BRL');
  }

  finalizar(): void {
    if (this.status === 'finalizada')
      throw new Error('Locação já finalizada');
    this.status = 'finalizada';
  }
}

// ——— Domain Event ———
class VeiculoAlugado {
  constructor(
    readonly veiculoId: VeiculoId,
    readonly locacaoId: LocacaoId,
    readonly clienteId: ClienteId
  ) {}
}

// ——— Repository (interface) ———
interface VeiculoRepository {
  salvar(veiculo: Veiculo): Promise<void>;
  buscarDisponivel(): Promise<Veiculo[]>;
  buscarPorId(id: VeiculoId): Promise<Veiculo | null>;
}

Para se aprofundar

  • Domain-Driven Design: Tackling Complexity in the Heart of Software Eric Evans (o "livro azul")
  • Implementing Domain-Driven Design Vaughn Vernon (o "livro vermelho")
  • Domain-Driven Design Distilled Vaughn Vernon (resumo prático, ótimo para começar)
  • DDD: The First 15 Years Artigos de diversos autores sobre a evolução do DDD

Considerações finais

DDD não é sobre diagramas bonitos ou arquitetura sofisticada. É sobre comunicação. É sobre criar um modelo de software que qualquer pessoa do negócio consegue ler e validar. É sobre colocar a complexidade do domínio no centro e usar padrões que a tornem controlável.

Comece pequeno: escolha um Bounded Context, crie a Linguagem Ubíqua com um especialista, modele alguns Aggregates e escreva testes. O resto vem com a prática.

DDD é uma jornada, não um destino.

Feito!

sexta-feira, 8 de maio de 2026

Os 8 Níveis de Maturidade em IA para Desenvolvedores

A Inteligência Artificial não vai substituir o desenvolvedor, mas o desenvolvedor que domina a IA certamente substituirá aquele que a ignora. Recentemente, um framework de 8 níveis de maturidade ganhou destaque na comunidade técnica, revelando que a produtividade real não vem da ferramenta que você usa (Cursor, Codex, Claude Code, Gemini CLI, etc), mas do seu modelo mental.

O segredo? A IA é um amplificador de conhecimento. Como diz o ditado: "Um dev ruim com IA apenas fará coisas ruins mais rápido; um dev bom será exponencialmente mais produtivo".

O Framework dos 8 Níveis

A jornada do uso de LLMs (Large Language Models) no desenvolvimento de software segue uma escala de complexidade, confiança e delegação de tarefas:

1. A Base: Do Nível 0 ao 2

Nestes estágios iniciais, a IA é vista apenas como um utilitário de consulta ou assistência visual.

  • Nível 0 (Negacionista): Ignora a ferramenta, acreditando ser apenas um hype passageiro. Escreve tudo à mão.
  • Nível 1 (Cauteloso): Usa o autocomplete básico na IDE. Aceita ou rejeita sugestões linha a linha.
  • Nível 2 (Perguntador): Substitui o Stack Overflow pelo Chat. A IA responde dúvidas teóricas, mas o dev ainda implementa 100% do código.

2. O Grande Salto: Do Nível 3 ao 4

Aqui ocorre a transição mais crítica: deixar de microgerenciar código para especificar comportamento.

  • Nível 3 (Delegador Básico): Pede funções isoladas, mas o processo é lento e exige muitos ajustes manuais ("copia e cola").
  • Nível 4 (Diretor): Você para de pedir "faça essa função" e passa a fornecer contexto e especificações de alto nível.

No Nível 4, o fluxo de trabalho geralmente começa pela definição do comportamento (Test-Driven Development):

// Exemplo de fluxo no Nível 4:
// 1. O Desenvolvedor escreve o teste
test('deve validar CPF com máscara corretamente', () => {
expect(validarCPF('123.456.789-00')).toBe(true);
});

// 2. O Desenvolvedor pede para a IA:
// "Implemente a lógica que faça este teste passar no contexto do projeto X"

3. A Maestria: Do Nível 5 ao 7

Nesta fase, você opera como um gestor de agentes digitais e foca na engenharia de sistemas.

  1. Nível 5 (Orquestrador): A IA usa ferramentas (como agentes) para navegar no projeto, ler arquivos e rodar testes de forma autônoma.
  2. Nível 6 (Multiagente): Você gerencia múltiplos agentes trabalhando em paralelo em diferentes partes da aplicação.
  3. Nível 7 (Arquiteto): O desenvolvedor define contratos de API e design de sistema. O código torna-se uma commodity gerada pelos agentes.

O Paradoxo da Skill: Por que o Hardness importa?

Existe um mito de que a IA facilitará a vida de quem não quer estudar. A realidade é o oposto: quanto mais alto o seu nível de uso de IA, mais conhecimento técnico (Hardness) você precisa.

Para ser um Arquiteto (Nível 7), você precisa dominar:

  • Design Patterns e SOLID.
  • Arquitetura de Software e Escalabilidade.
  • Segurança e Performance de Código.

Sem essa base, você não consegue instruir ao agente de IA corretamente nem julgar se a solução proposta é sustentável a longo prazo. O uso contínuo do LLM cria um ciclo de aprendizado: seu conhecimento técnico guia o agente de IA, e o retorno deste expande sua capacidade de entrega.

Considerações finais: Qual o seu próximo passo?

Se você está estagnado no Nível 2 (tirando dúvidas no chat), seu desafio para esta semana é subir para o Nível 4. Comece a escrever especificações e testes antes de pedir o código. O agente de IA não é uma muleta; é um exoesqueleto. Ela aumenta sua força, mas quem decide a direção é você.

Feito!

terça-feira, 5 de maio de 2026

ISO 27001: O Padrão Ouro que separa Desenvolvedores Profissionais dos Amadores

Se você é desenvolvedor e ainda pensa que "segurança é problema do setor de TI", prepare-se: a ISO 27001 não é mais apenas um certificado para pendurar na parede – é o divisor de águas entre equipes que entregam software confiável e aquelas que estão um erro de distância do próximo vazamento catastrófico. E sim, isso afeta diretamente o seu código hoje.

Por que a ISO 27001 É o que diferencia "Funciona na Minha Máquina" de "Funciona no Mundo Real"

Vamos falar sério: a maioria dos desenvolvedores enxerga frameworks de segurança como burocracia que atrasa o delivery. Mas aqui está o dado que vai fazer você repensar: 60% das pequenas empresas que sofreram um ataque cibernético fecharam as portas em menos de 6 meses. Não é sobre medo, é sobre matemática simples: vulnerabilidades no seu código são passivos que podem destruir o negócio onde você trabalha.

A ISO 27001 funciona como um Sistema de Gestão de Segurança da Informação (SGIS) que:

  • Mapeia riscos específicos do SEU contexto (nada de checklists genéricos que não se aplicam ao seu stack)
  • Aplica controles proporcionais ao risco real (sem excesso, sem falta)
  • Exige melhoria contínua (porque ameaças de ontem não são as de hoje)
  • Integra segurança no ciclo de desenvolvimento (Secure SDLC não é opcional para profissionais)

O Que Acontece Quando Você Trata ISO 27001 Como "Coisa de Auditor" (Alerta: Não É Bonito)

Lembre-se do vazamento da Equifax? Um simples patch evitou exposição de dados de 147 milhões de pessoas e prejuízo de US$ 1,4 bilhão. Ou o incidente recente com MOVEit Transfer que afetou centenas de organizações? Esses não foram "ataques sofisticados", foram explorações de vulnerabilidades conhecidas que boas práticas de segurança teriam evitado.

No desenvolvimento de software, ignorar práticas alinhadas à ISO 27001 significa:

  • Entregar código com falhas evitáveis que se tornam incêndios em produção
  • Pagar 30x mais para corrigir uma vulnerabilidade em produção vs. durante desenvolvimento (IBM Cost of a Data Breach Report)
  • Perder contratos com empresas que exigem certificação como pré-requisito mínimo
  • Viver em modo de apagão de incêndio вместо de entregar valor real

Como Implementar ISO 27001 sem matar sua velocity (Guia Prático para Devs que Odeiam Burocracia)

Esqueça aquelas imagens de salas cheias de papéis. A ISO 27001 moderna é sobre incorporar segurança no seu fluxo existente e sim, isso pode até acelerar seu time a longo prazo.

1. Comece analisando riscos de verdade (Não a Toa)


//Abordagem amadora: verificar se tem chave e parar por aí
if (secrets.get("API_KEY") == null) {
    throw new IllegalStateException("Missing API key");
}

//Abordagem profissional: 
//entender o CONTEXTO do risco
public class ApiKeyRiskAssessment {
  public RiskLevel evaluateExposure() {
   // Pergunte: 
   // - Qual é a probabilidade de vazamento? 
   //  (Depende do armazenamento, logs, etc.)
   // - Qual seria o impacto? 
   // (Acesso total ao sistema de pagamento? 
   // Apenas leitura de dados públicos?)
   // - Quão fácil é detectar se vazou? 
   // Só assim você decide se investe em cofre de chaves, rotação 
   // automática ou aceita o risco documentado
 }
}

2. Trate segurança como requisito não-funcional (Sério Mesmo)

Sua definição de "Pronto" deve incluir automaticamente:

  • Varredura de dependências vulneráveis (OWASP Dependency-Check, Snyk) no CI
  • Análise estática de segurança (SAST) em cada PR
  • Threat modeling para novas features críticas (não precisa ser BORING 30 minutos em um quadro já ajuda)
  • Treinamento trimestral em secure coding específico para sua stack

3. Documente o suficiente (Não o Máximo)

A ISO 27001 exige evidências, não romance:

  • Mantenha um risk register simples (planilha compartilhada com: risco, probabilidade, impacto, tratamento, responsável)
  • Documente por que você aceitou ou mitigou cada risco (ex: "Aceitamos risco X porque o custo de mitigação > impacto potencial")
  • Use evidências automatizadas (relatórios de scanner, logs de treinamento, screenshots de configuração)

O segredo que ninguém conta: ISO 27001 TE FAZ ENTREGAR MAIS RÁPIDO

Parece contra-intuitivo, mas equipes com SGIS maduro têm menor lead time e maior taxa de sucesso nas entregas. Por quê?

  • Menos emergências de segurança interrompendo sprints importantes
  • Maior confiança para inovar (você sabe que tem processos para gerir o risco novo)
  • Menos retrabalho por falhas que poderiam ser evitadas em design
  • Maior confiança do cliente – fechando negócios maiores e mais estáveis

Seu plano de ação de 15 Minutos (Comece AGORA)

  1. Leia o guia executivo gratuito do Portal 27001 (5 minutos, eles explicam sem jargão de consultoria)
  2. Faça uma avaliação relâmpago (10 minutos):
    • Quais são os 3 maiores riscos de segurança no seu projeto atual?
    • Para cada um: qual é a pior coisa que poderia acontecer se explorado?
  3. Escolha UM controle do Anexo A da ISO 27001 para implementar nesta semana (ex: A.12.6.1 - Gestão de vulnerabilidades técnicas)
  4. Compartilhe isso com sua equipe na próxima retro – segurança é esporte coletivo, não tarefa do "cara de segurança"

"Segurança não é um produto que você compra. É um processo que você incorpora no jeito de trabalhar." Princípio básico da ISO 27001

A ISO 27001 não vai atrapalhar sua velocidade, ela vai proteger o impacto do trabalho que você tanto se esforça para criar. Na próxima vez que alguém disser que "isso é burocracia excessiva", pergunte calmamente: "Você preferiria explicar um vazamento de dados para seus clientes ou passar uma hora documentando como tratamos esse risco específico?"

P.S. Se seu software lida com dados pessoais (LGPD/GDPR), financeiros ou de saúde, a ISO 27001 não é opcional, é o preço de entrada para ser levado a sério no mercado profissional. Não deixe para amanhã o que pode impedir um incidente hoje.

Quer ver como aplicar isso na prática? Veja os recursos da ISO 27001

Feito!

terça-feira, 7 de abril de 2026

Além do Hype: O guia de sobrevivência em IA para Desenvolvedores

Se você abre o LinkedIn ou o YouTube hoje, é bombardeado por siglas: NLP, LLM, RAG, MCP, Agentes. Parece que a cada 24 horas o que você aprendeu ontem se tornou obsoleto. A sensação de insegurança é real, mas aqui vai um segredo: as ferramentas mudam, mas os fundamentos são os mesmos desde a década de 50.

No presente artigo, vamos dissecar os conceitos apresentados pelo canal balta, separando o que é barulho do que é base sólida para a sua carreira.

  1. IA não é uma "Ferramenta", é uma Categoria
  2. Muitas vezes ouvimos que "o Google lançou uma nova IA". Tecnicamente, isso está errado. A Inteligência Artificial é um termo "guarda-chuva" cunhado em 1956. O que estamos vendo hoje são novos modelos e arquiteturas dentro dessa categoria.

    Entender isso acalma os nervos. Você não precisa aprender uma "nova IA" toda semana; você precisa entender como os novos modelos se comportam dentro do ecossistema que já existe.

  3. O coração do código: Redes Neurais e Probabilidade
  4. Tudo o que vemos hoje, do ChatGPT, Gemini, Claude Code e etc baseia-se em Redes Neurais Artificiais.

    O que são: Microfunções (neurônios) organizadas em camadas.

    Como funcionam: Elas não "pensam". Elas recebem um input, processam através de pesos matemáticos e entregam uma probabilidade.

    Quando você interage com um LLM (Large Language Model), ele está apenas prevendo o próximo token (pedaço de palavra). Não existe um processo criativo ou consciência; existe estatística de alto nível.

    Por isso a alucinação acontece: a função do provedor de LLM é continuar o texto, mesmo que ela precise inventar algo para que a frase faça sentido gramatical.

  5. Onde está o valor real? (Dica: não é no modelo)
  6. Qualquer pessoa com R$ 100 pode assinar o ChatGPT Plus. Se o seu diferencial como dev ou empresa for apenas "usar o provedor de LLM", você não tem diferencial.

    O verdadeiro ouro está nos dados.

    Modelos como o GPT-4, Gemini, Claude Code foram treinados com dados públicos da internet (que muitas vezes são ruidosos ou desatualizados). O valor competitivo surge quando você conecta esses modelos aos seus dados privados e estruturados.

  7. O Trio de Ferro: RAG, MCP e Agentes
  8. Para tirar o provedor de LLM do "chat" e levá-la para o mundo real, usamos três pilares:

    • RAG (Retrieval-Augmented Generation)
    • O provedor de LLM é como um gênio que leu toda a biblioteca do mundo até 2023, mas não sabe o que aconteceu hoje de manhã na sua empresa. O RAG é a técnica de "dar um livro aberto" para o provedor de LLM consultar antes de responder. Você fornece o contexto (seus PDFs, bancos de dados) e ela responde com base nisso.

    • MCP (Model Context Protocol)
    • Não basta o provedor de LLM ler; ele precisa agir. O MCP é um protocolo que padroniza como o provedor de LLM se comunica com o seu sistema. É através dele que a IA entende que pode "chamar uma função" para emitir uma nota fiscal ou consultar um estoque.

    • Agentes e Skills
    • Agentes: São programas autônomos que decidem como resolver um problema passo a passo.

      Skills: São habilidades passivas (ex: saber formatar um texto em Markdown) que os agentes utilizam para cumprir sua missão.

  9. Por que os Programadores não vão sumir?
  10. O provedor de LLM é estocástica (imprevisível). Ela pode dar uma resposta diferente para o mesmo comando. Sistemas críticos, como transferências bancárias ou diagnósticos médicos, exigem determinismo.

    A engenharia de software continua sendo sobre como construir sistemas robustos, seguros e escaláveis. A IA será uma peça desse quebra-cabeça, mas o "arquiteto" que decide onde cada peça se encaixa ainda é você.

Considerações finais

O segredo para não temer aos provedores de LLM é parar de olhar para a interface de chat e começar a olhar para a arquitetura. Entender tokens, embeddings, camadas e protocolos transforma você de um simples "usuário de ferramentas" em um engenheiro capaz de construir o futuro.

Feito!

segunda-feira, 6 de abril de 2026

O novo "Contrato" do Desenvolvedor: Por que os agentes de IA não vão salvar seu código (mas podem te tornar um Arquiteto)

A era do desenvolvimento assistido por Inteligência Artificial (IA) chegou com uma promessa tentadora: "Copie e cole sua ideia, e nós geramos o código". E, de fato, os agentes de IA dos provedores de LLM (ChatGPT/Codex da OpenAI, Claude Code da Anthropic, Gemini do Google e etc) são impressionantes. Eles escrevem funções em segundos, sugerem refatorações e explicam bugs complexos.

No entanto, há um coro crescente nos fóruns de programação: "A IA introduziu um bug sutil no meu projeto" ou "Pedi X e ela entregou Y, totalmente fora do contexto".

A verdade crua é: a responsabilidade pelo código final continua sendo, 100%, do desenvolvedor.

Os agentes de IA não são "mágicos"; eles são ferramentas de processamento de linguagem extremamente avançadas. Atribuir a culpa de um bug a um LLM é como culpar o compilador por um erro de sintaxe. O erro estava na intenção ou na instrução.

Vamos explorar o paralelo que define essa nova fase do desenvolvimento e os desafios técnicos onde os agentes de IA ainda falham terrivelmente.

O Paralelo com o PO: Prompt raso = Requisito raso

Imagine a cena (clássica para qualquer Dev): o Product Owner (PO) ou o Scrum Master (SM) chega com um requisito de uma linha: "Precisamos de um sistema de login". Você, o desenvolvedor, acena, acha que entendeu e implementa um sistema simples com email/senha. Na entrega, o PO diz: "Mas eu precisava de login social (Google/Apple) e autenticação em dois fatores (2FA)".

O resultado? Frustração e retrabalho. De quem é a culpa? Do desenvolvedor que aceitou o requisito sem questionar.

O mesmo se aplica aos agentes de IA dos provedores de LLM. Um prompt raso é um requisito raso. O agente, treinado para ser útil, vai "adivinhar" o resto do contexto com base nos seus dados de treinamento. É aqui que nascem as "alucinações": o agente cria uma solução que parece correta, mas que não se encaixa no seu ecossistema específico.

A lição: Do mesmo modo que exigimos requisitos completos do PO, devemos fornecer contextos completos (prompts detalhados) aos agentes. Se você não tirar as dúvidas antes de gerar o código, o agente vai entregar o que "acha" que você quer, não o que você precisa.

Onde os agentes de IA falham e onde você é indispensável?

Mesmo com o melhor prompt do mundo, os agentes de IA atuais têm limitações estruturais que exigem o raciocínio humano.

  1. A falta de visão sistêmica e arquitetural
  2. Os agentes de IA são excelentes em resolver o "problema da função" atual (ex: ordenar uma lista). Eles muitas vezes falham em enxergar o sistema como um todo.

    O risco: Ao pedir para alterar um módulo de pagamento para aceitar uma nova moeda, o agente pode não perceber que essa mudança quebra a conciliação financeira em um microsserviço legado do outro lado da arquitetura. Ele foca no contexto imediato (o arquivo aberto), não na integridade arquitetural a longo prazo.

  3. A "última milha" da depuração profunda (Deep Debugging)
  4. Bugs de lógica simples? Os LLMs resolvem. Mas e as condições de corrida (race conditions)? Vazamentos de memória sutis? Bugs que só ocorrem sob alta latência de rede?

    O risco: O agente trabalha com o código estático ou logs que você fornece. Ele não "sente" o ambiente de execução. Depurar um erro que só acontece quando o banco de dados está a 90% de carga e o usuário cancela a requisição no meio do handshake ainda exige o instinto detetive de um desenvolvedor experiente.

  5. Segurança e a "alucinação de pacotes"
  6. Este é um risco crescente e crítico (Supply Chain Security).

    O risco: Às vezes, o agente sugere bibliotecas ou pacotes que não existem ou, pior, que foram criados por atacantes com nomes similares (typosquatting) para injetar código malicioso. Se o desenvolvedor apenas copia e cola (npm install), ele abre uma brecha de segurança grave. A curadoria de dependências continua sendo uma tarefa estritamente humana.

  7. As regras de negócio implícitas
  8. A documentação do Jira raramente contém 100% da verdade. O conhecimento real muitas vezes está na cabeça dos desenvolvedores sêniores.

    O risco: O agente de IA pode sugerir remover um trecho de código "feio" ou "redundante" por um ( Clean Code). O que ele não sabe é que esse código trata uma exceção bizantina de um cliente que representa 40% do faturamento da empresa. A IA não conhece a história e a política por trás do código.

O Caminho: Spec-Driven Development (SDD)

Então, como usar os agentes de IA dos provedores de LLM de forma profissional? O segredo não é "pedir código", é "pedir validação".

Esta é a fronteira entre o amadorismo e o profissionalismo no uso de IA:

  • Brainstorm com o agente:
  • Use a skill de brainstorm do agente. Diga: "Tenho essa ideia de recurso. Que perguntas você me faria para garantir que entende todos os requisitos de negócio, técnicos e de segurança?".

  • Geração da Spec.md:
  • Com base nas suas respostas, peça ao agente para gerar um arquivo Spec.md (Especificação Técnica) detalhando a implementação.

  • Validação Humana (SEU PAPEL):
  • Leia a especificação. É o que o negócio precisa? Segue a arquitetura? É seguro? Valide a Spec.

  • Geração do Código:
  • Só depois de validar a Spec, peça para o agente gerar o código com base nela.

É mais barato corrigir um parágrafo de texto do que 500 linhas de código em alguma linguagem de programação.

Considerações finais

O desenvolvimento de software não mudou fundamentalmente; as ferramentas mudaram. O maior desafio hoje não é escrever código, mas sim saber o que pedir e garantir que o que foi entregue é o que o negócio precisa.

O desenvolvedor deixou de ser apenas um construtor de tijolos para ser o arquiteto que revisa cada viga da obra. Os agentes de IA são seus operários mais rápidos, mas você ainda é o responsável pelo prédio não cair.

Feito!

quarta-feira, 28 de janeiro de 2026

Engenharia de Software além do Hype

Em um mercado frequentemente guiado por tendências, frameworks da moda e promessas de produtividade instantânea, projetos com stack legada costumam ser vistos como algo a ser evitado. No entanto, essa visão simplista ignora um aspecto fundamental da engenharia de software: software existe para sustentar negócios, não para satisfazer preferências tecnológicas.

Atuar em projetos legados não é sinal de atraso técnico. Pelo contrário, muitas vezes é ali que se exerce engenharia de software em seu estado mais puro.

Stack legada não sobrevive por acaso

Um sistema que permanece ativo por anos, ou décadas, não o faz por inércia. Ele permanece porque:

  • Resolve um problema real
  • Sustenta operações críticas
  • Gera receita
  • Está profundamente integrado ao negócio

Se fosse irrelevante, já teria sido descartado.

Do ponto de vista empresarial, longevidade é evidência de valor. Sistemas legados geralmente representam investimentos já amortizados, com custo previsível e retorno conhecido. Substituí-los implica risco operacional, custo elevado e, frequentemente, perda de conhecimento implícito.

Tecnologia é meio, não o fim

Uma das principais armadilhas na carreira de desenvolvedores é confundir stack com valor profissional. Frameworks, linguagens e ferramentas são transitórios. O que permanece é a capacidade de:

  • Entender regras de negócio
  • Traduzir requisitos complexos em soluções estáveis
  • Tomar decisões técnicas considerando impacto financeiro e operacional

A stack é apenas o instrumento pelo qual o negócio se materializa em software. Apegar-se excessivamente à tecnologia, ignorando o domínio, é um erro comum em perfis mais juniores.

Engenheiros de software maduros entendem que:

  • Dominar o negócio é o que permite dominar a tecnologia, e não o contrário.

O verdadeiro desafio do legado não é técnico

Contrariando o senso comum, o maior desafio em projetos legados raramente é a linguagem ou o framework utilizado. O desafio real está em:

  • Regras de negócio não documentadas
  • Exceções históricas codificadas ao longo do tempo
  • Dependências críticas entre módulos
  • Fluxos que refletem decisões estratégicas do passado

Esses sistemas carregam conhecimento tácito, muitas vezes ausente em documentação formal. Quem compreende esse contexto passa a ser um agente-chave dentro da organização.

Engenharia de software acontece de verdade no legado

Projetos legados exigem práticas que vão além de "codar features":

  • Leitura e interpretação crítica de código
  • Análise de impacto antes de qualquer mudança
  • Refatorações incrementais e seguras
  • Forte preocupação com regressão
  • Conservadorismo técnico quando o risco é alto

Não há espaço para soluções impulsivas ou reescritas ingênuas. Aqui, decisões erradas não geram apenas bugs, geram prejuízo financeiro, indisponibilidade e perda de confiança.

Isso é engenharia de software aplicada à realidade.

Modernizar não é reescrever do zero

Desenvolvedores experientes sabem que a maioria dos grandes fracassos tecnológicos vem da tentativa de "jogar tudo fora e começar de novo".

Em projetos maduros, modernização acontece por:

  • Estrangulamento gradual
  • Introdução de novas camadas
  • Criação de APIs e contratos estáveis
  • Evolução controlada, não ruptura

Nesse contexto, o conhecimento da stack legada é o que viabiliza a evolução, não o que impede.

Valor profissional de quem domina sistemas legados

No mercado, profissionais capazes de sustentar e evoluir sistemas críticos possuem características raras:

  • Visão sistêmica
  • Capacidade analítica elevada
  • Comunicação com áreas de negócio
  • Responsabilidade técnica real

Esses profissionais:

  • Reduzem risco operacional
  • Aumentam a previsibilidade
  • Tomam decisões alinhadas ao negócio
  • São difíceis de substituir

Enquanto stacks mudam, o engenheiro que entende o negócio permanece relevante.

Considerações finais

Atuar em projetos com stack legada não é um retrocesso técnico. É um exercício de maturidade profissional.

  • Stacks passam.
  • Frameworks mudam.
  • Negócios permanecem.

O engenheiro de software que compreende isso deixa de ser apenas um executor de código e passa a ser um agente estratégico, capaz de sustentar, evoluir e proteger sistemas que realmente importam.

No fim, a tecnologia é apenas o meio.

O valor está no impacto que ela gera.

Feito!