4

Harness segundo Fowler: 4 camadas no backend

Todo mundo hoje fala em "harness" para agente. Antes de gastar tempo montando um do zero, vale abrir o artigo sobre Continuous Integration de Martin Fowler (revisado por último em janeiro de 2024) e ler com esse vocabulário na cabeça. O texto descreve, sem usar a palavra, exatamente os quatro harness que seu backend já roda em produção agora. Você só chama isso de outra coisa.

Este texto é sobre um recorte específico: a lente de Fowler, aplicada ao backend real de 2026. Não é o artigo sobre "Agent = Modelo + Harness" (aquele é a leitura da LangChain), nem sobre os "Seis Componentes de um Harness" (aquele é a leitura anatômica). Aqui a pergunta é diferente: quando Fowler escreveu sobre CI (originalmente em 2000, com rewrites em 2006 e 2023-2024), o que ele já estava descrevendo?

O que Fowler escreveu

O artigo de Fowler abre com esta definição:

Continuous Integration is a software development practice where each member of a team merges their changes into a codebase together with their colleagues changes at least daily.

Note a estrutura: integrar frequentemente + verificar automaticamente cada integração. O texto não diz "harness". Mas se você lê "verificar automaticamente" e escreve o que isso significa em código, sai um harness. Uma malha de checagens que roda sem alguém rodar.

A parte que envelheceu bem é o item Automate the Build (o segundo da lista de práticas):

Turning the source code into a running system can often be a complicated process involving compilation, moving files around, loading schemas into databases, and so on. However like most tasks in this part of software development it can be automated - and as a result should be automated.

Fowler estava descrevendo o embrião do que hoje é um workflow de GitHub Actions. Ele não tinha a palavra .yml na cabeça. Tinha make e Ant. A ideia era a mesma: um sistema que reduz o gap entre "eu escrevi código" e "sabemos se o código quebrou alguma coisa".

Se você reler o artigo em 2026 mentalmente substituindo "build" por "harness", quase nada precisa mudar.

Os quatro harness que seu backend já tem

Peguei um repositório médio de backend Node.js de um projeto que ajudei a arrumar, listei as verificações automáticas ativas, e agrupei por camada. Deu quatro. Não é um número mágico: é o que apareceu naturalmente na hora de mapear "quem verifica o quê, e em que momento".

As 4 camadas de harness invisível no backend

1. Pre-commit hook

Roda no laptop do desenvolvedor, antes do commit ir para o repositório. Formatter, linter, type checker parcial. husky + lint-staged em Node, pre-commit framework em Python.

O que Fowler dizia: "detect integration errors as quickly as possible". O harness mais rápido é o que roda antes de o código sair da sua máquina. Você nem chama de harness — chama de "hook". Mesma coisa.

2. CI (GitHub Actions / GitLab CI / Bitbucket Pipelines)

Roda quando o commit chega no servidor de código. Roda os testes completos, build de produção, checagem de segurança em dependências. O que a máquina do desenvolvedor não conseguiu fazer em tempo aceitável, o CI faz em paralelo em runners.

# .github/workflows/ci.yml — um recorte comum
name: CI
on: [pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm test -- --coverage

Isso é um harness. Ele tem entrada (o PR), verificação (lint + type + test), e um veredito público (o status na PR). Fowler descreveu esse formato em prosa antes de o GitHub existir.

3. Deploy gate

Roda no momento da promoção para staging ou produção. Executa smoke tests, verifica migration compatível, roda canary por 5 minutos antes de expandir tráfego. É menos comum de ver escrito em .yml porque muitas equipes fazem manualmente ou dentro de scripts internos.

Mesmo quando é manual (por exemplo, "só publica se o Kaio aprovar no Slack") ainda é um harness. A checagem existe, tem critério, e bloqueia a próxima etapa. A automação é o objetivo; a existência do gate é o que importa.

4. Observability alerting

Roda em produção, depois do código ter subido. Prometheus + Grafana ou Datadog com alertas que dizem "a taxa de erro 5xx desse endpoint passou de 1% nos últimos 3 minutos". Isso é feedback loop do estado do sistema real.

Fowler não escreveu sobre isso na versão original de 2000 (não tinha SRE ainda como disciplina nomeada). Mas leia o item "Fix Broken Builds Immediately" do artigo e substitua "build" por "produção". A ideia de "detectar rápido + corrigir rápido" é a mesma. Observability é o harness da camada mais externa.

Por que reconhecer os quatro importa

Você provavelmente já tem os quatro rodando. O ganho de reconhecê-los como harness é operacional:

  • Cada camada tem um SLA de detecção diferente. Pre-commit: segundos. CI: minutos. Deploy gate: minutos-a-hora. Observability: minutos-a-dia. Se você move uma checagem para a camada errada (por exemplo, roda testes de integração no pre-commit), o SLA quebra e ninguém entende por quê.
  • Duplicação de verificação vira custo. Se o linter roda no pre-commit e de novo no CI e de novo no deploy gate, você pagou três vezes por uma checagem que era para rodar uma vez só. Um mapeamento explícito das quatro camadas evita esse desperdício.
  • Buracos aparecem. Quando você desenha as quatro camadas lado a lado, fica visível que sua stack tem CI e observability mas não tem deploy gate. Aí você sabe onde investir a próxima hora de trabalho de plataforma.

O AGENTS.md que a equipe usa para orientar agente de IA se beneficia disso também. Escrever "o agente pode fazer commit direto após pre-commit passar" é uma frase pequena, mas ela só faz sentido quando você já mapeou explicitamente qual camada de harness cobre o quê.

O que Fowler não previu

Uma parte do artigo envelheceu. Fowler assumia que o build era operado por humanos: o item "Fix Broken Builds Immediately" cita Kent Beck ("nobody has a higher priority task than fixing the build") e sugere que "a couple of people" revertam o commit faltoso. Em 2026 o agente que quebra o build costuma ser um bot que abriu 15 PRs de update de dependência às 3h da manhã. O harness precisa ser desenhado para lidar com bots que operam mais do que humanos.

O outro ponto que Fowler não tinha em mente é o custo de rodar CI em runner pago. Em 2000 build era grátis (rodava na máquina do dev ou num servidor da própria empresa). Em 2026, cada push custa alguns centavos de runner e alguns segundos de vida. Um harness que roda 40 minutos por PR não é apenas lento: é caro. Otimizar tempo de CI virou parte do design de harness, o que não aparece em Fowler.

Mas o esqueleto conceitual "verificar automaticamente + detectar rápido + corrigir rápido" se sustenta. A palavra "harness" é nova. A prática vem do artigo original de 2000.

Referência


ken imoto · WebRTC & Voice AI engineer · kenimoto.dev · TabNews

Carregando publicação patrocinada...
4

Meus 2 cents,

Parabens pelo post !

Tai um ponto que diferencia muito o DEV que usa agentes de uma pessoa de outra area tambem programando com agentes: a consciencia situacional e compreender os passos que devem ser agregados no sistema (como testes).

Recentemente tive de corrigir um sistema que um cliente desenvolveu para uso de uma area especifica (a evolucao das planilhas de Excel), que quebrou justamente por ausencia de testes (que o cliente nem sabe que existem).

Pelo menos por enquanto, os agentes ainda nao tem este tipo de antecipacao (precisam ser orientados a criar os testes) entao dai temos um diferencial a favor dos DEVs que estudaram/amadureceram durante anos o conhecimento especifico para melhorar o desenvolvimento (CI/CD eh um exemplo bem claro disso).

Obrigado por compartilhar !

Saude e Sucesso !


Este post foi favoritado via extensão TABNEWS FAVORITOS

Tem curiosidade sobre IA ? Da uma olhada no meu LIVRO: IA PARA ENGENHEIROS

1

Valeu pelo comentário, Oletros, e concordo com o ponto da consciência situacional: é o que separa quem monta o sistema de quem só pede o código pronto.

Peguei um legado para substituir faz pouco tempo. O sintoma era esse: o processo terminava com sucesso aparente, sem código de saída, e o erro não chegava a lugar nenhum. Falha silenciosa é pior que quebra escandalosa, porque ninguém vai atrás do que não apareceu.

E não é só teste que falta. O agente escreve teste, sim, quando você pede, mas o que ele escreve é o caminho feliz: entra input válido, sai resultado esperado. A exceção fica de fora. Quem lembra dela é quem já levou plantão de madrugada.

Hoje meu AGENTS.md separa isso por camada, exceção inclusa. O agente escreve o teste quando eu peço, e confesso que eu também só escrevia quando alguém pedia.