Robby Russell prioriza poda de código após agentes travarem em legados

The Most Valuable Engineer Isn’t Shipping Features - Robby Russell — Ruby on Rails

Ruby on Rails

Com a produção de software barateada pela inteligência artificial, eliminar padrões obsoletos e arrumar o repositório gera mais valor do que entregar novas funcionalidades.

AI-assisted summary of The Most Valuable Engineer Isn’t Shipping Features - Robby Russell — original source. Check the original for full context.

Source published:

Key ideas

  • A produção massiva de código tornou-se barata e acessível com a inteligência artificial, mas avaliar o que pertence ao sistema e o que deve ser descartado continua dependendo estritamente do julgamento humano. (9:59)
  • Agentes autônomos de código interpretam repositórios como provas factuais e travam em loops dispendiosos ao sintetizar padrões conflitantes, já que não têm acesso à tradição oral e às regras informais da equipe. (13:45)
  • Dados da Pesquisa da Comunidade Rails 2026 revelam que decifrar a lógica de negócio e o modelo de domínio é o principal gargalo em bases legadas, superando o atrito da falta de documentação. (39:52)
  • O valor de engenharia mais sustentável não reside no heroísmo pontual que apaga incêndios, mas no papel de 'Q', que aprimora o ferramental interno e reduz a necessidade de atos heroicos futuros. (24:24)

Detailed notes

## Background Publicado pelo canal Ruby on Rails no YouTube em 27 de setembro de 2026, o vídeo registra a palestra de encerramento da Rails World 2026 conduzida por Robby Russell, fundador da Planet Argon. A apresentação aborda a dinâmica entre profissionais que criam sistemas novos (makers) e os que cuidam do que já existe (menders), examinando a 'oficina local' de atalhos e tradições orais que cada aplicação madura acumula e que agentes de código por IA agora precisam decifrar.

## TL;DR Robby Russell argumenta que o papel mais valioso na engenharia moderna não reside em entregar novas funcionalidades sem parar, mas em sustentar o sistema existente e desobstruir o caminho para o restante da equipe. Com a inteligência artificial barateando a geração de código, repositórios com múltiplos padrões conflitantes confundem agentes autônomos, que tratam débitos técnicos antigos como referências intencionais. Para resolver esse atrito, o palestrante propõe o framework WUTS (Wonder, Unpack, Tinker, Share) e orienta os engenheiros a agirem como o personagem Q em vez de heróis como James Bond, eliminando opções obsoletas, encurtando loops de feedback e tornando as decisões arquiteturais explícitas sem depender de autorização formal.

## Atmosphere & style A palestra equilibra humor descontraído e pragmatismo cirúrgico, conduzida com a franqueza de quem acumulou duas décadas de vivência real nas trincheiras do desenvolvimento de software. Russell cria uma conexão calorosa e cúmplice com a plateia ao validar as frustrações diárias com testes lentos, convenções herdadas e documentações fictícias, dispensando o jargão corporativo vazio. O tom geral transmite um misto de alívio e empoderamento reflexivo, convidando o ouvinte a enxergar a zeladoria de código não como um estorvo secundário, mas como uma forma essencial e gratificante de artesanato técnico.

## Bulletin - [09:59](https://www.youtube.com/watch?v=XXjTdyhml0c&t=599s) A produção massiva de código tornou-se barata e acessível com a inteligência artificial, mas avaliar o que pertence ao sistema e o que deve ser descartado continua dependendo estritamente do julgamento humano. - [13:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=825s) Agentes autônomos de código interpretam repositórios como provas factuais e travam em loops dispendiosos ao sintetizar padrões conflitantes, já que não têm acesso à tradição oral e às regras informais da equipe. - [39:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2392s) Dados da Pesquisa da Comunidade Rails 2026 revelam que decifrar a lógica de negócio e o modelo de domínio é o principal gargalo em bases legadas, superando o atrito da falta de documentação. - [24:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1464s) O valor de engenharia mais sustentável não reside no heroísmo pontual que apaga incêndios, mas no papel de 'Q', que aprimora o ferramental interno e reduz a necessidade de atos heroicos futuros.

## Key takeaways - [00:06](https://www.youtube.com/watch?v=XXjTdyhml0c&t=6s) Padrões conflitantes para fluxos idênticos acumulam-se em bases maduras não por má intenção, mas pela pressa diária e sobreposição de experimentos passados. - [02:40](https://www.youtube.com/watch?v=XXjTdyhml0c&t=160s) A barreira fundamental para corrigir código legado não é a complexidade arquitetural, mas a falta de autorização percebida pelos desenvolvedores para descartar abordagens obsoletas. - [04:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=264s) Bases de código funcionais normalizam o atrito e a tradição oral porque código exemplar e débito técnico compartilham a mesma aparência visual no repositório. - [07:08](https://www.youtube.com/watch?v=XXjTdyhml0c&t=428s) A sustentação e zeladoria do software ('mending') compõem a maior parte do trabalho real da engenharia, contrariando o mito de que apenas criar do zero tem valor. - [13:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=825s) Agentes de IA usam o histórico do repositório como evidência incontestável e sofrem a cada reset de contexto por não compartilharem da memória tácita humana. - [16:44](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1004s) O paradoxo de 'O Mítico Homem-Mês' ressurge na era da IA não pelo inchaço de pessoas, mas pela torrente de código gerado que satura a capacidade humana de absorção e revisão. - [19:51](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1191s) Enquanto seres humanos se adaptam a comandos e fluxos quebrados por compensação cognitiva, agentes automatizados queimam recursos tentando redescobrir as mesmas falhas. - [24:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1464s) A cultura técnica supervaloriza desenvolvedores heróicos no estilo James Bond, negligenciando a atuação de Q, que encurta loops de feedback e prepara o terreno preventivamente. - [25:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1552s) Engenheiros não precisam de permissão corporativa formal para aperfeiçoar sua oficina de desenvolvimento através de intervenções pequenas, visíveis e responsáveis. - [29:11](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1751s) O ciclo investigativo WUTS (Wonder, Unpack, Tinker, Share) propõe usar a estranheza inicial com falhas cotidianas como indicador de atrito sistêmico antes de alterar código. - [35:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2110s) Nem todo componente antigo e intocado é débito técnico descartável; a telemetria em produção é indispensável para distinguir regras críticas ativas de soluções abandonadas. - [39:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2392s) Compreender o modelo de domínio e a lógica de negócios figura como a maior dificuldade dos engenheiros em aplicações existentes, segundo a Pesquisa da Comunidade Rails 2026. - [40:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2445s) Tornar o caminho óbvio por meio de geradores executáveis padroniza stubs, fixtures e testes, evitando que engenheiros e agentes sintetizem implementações divergentes. - [42:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2530s) Testes lentos ou intermitentes forçam a criação de manuais informais de evasão, quebrando a velocidade de feedback e induzindo ferramentas automatizadas ao erro. - [44:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2685s) A meta do ambiente de desenvolvimento deve ser baratear o custo de reversão de falhas com feature flags e migrações estritamente reversíveis, em vez de perseguir a ilusão de evitar todo erro. - [46:20](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2780s) Encerrar opções obsoletas com acordos pragmáticos de 'agora faremos assim' alivia o esforço cognitivo e impede a replicação perpétua de padrões descontinuados.

## Detailed walkthrough ### [00:06](https://www.youtube.com/watch?v=XXjTdyhml0c&t=6s) Quatro padrões para a mesma integração e a herança do código legado

Robby Russell inicia sua palestra contando o caso real de uma empresa que procurou sua consultoria, a Planet Argon. A organização possuía uma aplicação Ruby on Rails madura e consolidada, fruto de anos de história, acompanhada por um time de engenharia em franca expansão: o quadro praticamente dobrou em pouco mais de um ano, saltando para cerca de 40 a 50 desenvolvedores. Ao analisar o sistema, a equipe se deparou com um cenário bizarro: coexistiam na base nada menos que quatro maneiras completamente distintas de implementar exatamente a mesma funcionalidade. Ao longo do tempo, a empresa construíra centenas de integrações para conectar novos clientes à plataforma, e todas executavam o ciclo clássico de software: receber dados, transformar, validar, despachar para outro destino, tratar erros, retentar, registrar logs e disparar alertas caso algo falhasse.

Apesar de cumprirem o mesmo objetivo operacional, cada geração dessas integrações exibia uma arquitetura diferente. Uma das abordagens nascera de uma ideia que um engenheiro lera no blog técnico de outra empresa anos atrás; a segunda veio de outro artigo lido em outro blog de engenharia; em seguida, um novo membro entrou na equipe, realizou experimentos e introduziu uma terceira fórmula. Todos esses experimentos continuaram se empilhando uns sobre os outros. Como todas as abordagens tecnicamente funcionavam, ninguém as descartava. O problema surge quando um novo desenvolvedor, com apenas seis meses de casa, precisa dar manutenção em uma integração antiga: ele deve seguir o padrão arcaico do arquivo em que está mexendo, tentar forçar o padrão que imagina ser o atual da equipe, ou iniciar uma refatoração cujo limite de escopo é imprevisível?

Robby destaca que padrões antigos não sobrevivem por malícia, mas sim pela pressa natural do cotidiano corporativo, em que muitas vezes o desenvolvedor precisa apenas entrar, alterar uma linha com urgência e sair. Afinal, ninguém registra um commit dizendo explicitamente: *"Acabei de decidir tornar essa plataforma confusa para todo mundo que vier a entrar nesta empresa"*. A complexidade acidental se acumula de forma sutil, decisão após decisão.

```mermaid flowchart TD accTitle: Acúmulo de padrões arquiteturais em uma aplicação legada accDescr: Diagrama ilustrando como experimentos e abordagens distintas se sobrepõem ao longo do tempo sem que as anteriores sejam removidas.

subgraph Evolucao ["Evolução dos Padrões na Base de Código"] A["Padrão Inicial<br/>(Solução original da aplicação)"] --> B["Padrão 2<br/>(Inspirado em blog de engenharia)"] B --> C["Padrão 3<br/>(Ideia de outro blog técnico)"] C --> D["Padrão 4<br/>(Experimentos de novos desenvolvedores)"] end

subgraph Dilema ["Dilema do Novo Engenheiro"] D --> E{"Nova integração ou bug fix"} E -->|"Copiar padrão arcaico local"| F["Preserva inconsistência"] E -->|"Adotar padrão mais recente"| G["Aumenta divergência"] E -->|"Refatorar tudo"| H["Risco de escopo descontrolado"] end ```

- **Crescimento acelerado do time:** A equipe de engenharia saltou de cerca de 20 para 40 a 50 engenheiros em pouco mais de um ano. - **Centenas de integrações idênticas:** O sistema acumulava centenas de rotinas de onboarding que repetiam o mesmo pipeline de ETL e tratamento de erros. - **Quatro estilos arquiteturais simultâneos:** Nenhum dos padrões antigos foi descontinuado ou migrado, criando quatro camadas geológicas de código funcional coexistindo no mesmo repositório.

---

[02:40](https://www.youtube.com/watch?v=XXjTdyhml0c&t=160s) O problema não é a arquitetura, é a falta de autorização

Chamada para atuar como especialista externa, a equipe da Planet Argon foi encarregada de diagnosticar a base de código, entrevistar os desenvolvedores e definir qual das quatro arquiteturas deveria se tornar o padrão oficial. O pedido veio embalado na roupagem tradicional de *"precisamos de ajuda com a nossa arquitetura"* e *"precisamos de um olhar novo de especialistas"*. No entanto, ao conversar com os engenheiros e investigar o que gerava atrito, quais restrições ainda eram válidas e como eles construiriam uma integração no dia seguinte, a constatação foi surpreendente: a arquitetura em si nunca fora o verdadeiro gargalo.

O problema central residia no fato de que ninguém no time se sentia autorizado ou disposto a assumir o papel de liderança para decretar publicamente: *"Agora vamos fazer assim"*. Havia uma razão psicológica compreensível para essa paralisia. A maioria dos engenheiros atuais não havia criado nenhum daqueles padrões originais; eles apenas os herdaram. Os arquitetos que conceberam as soluções já haviam deixado a empresa, e muitos dos profissionais atuais estavam diante de sua primeira grande aplicação em Rails. Ironicamente, a própria empresa se gabava da ergonomia do Rails por permitir contratar desenvolvedores talentosos sem histórico no framework e torná-los produtivos de imediato. Contudo, ao ingressarem e encontrarem quatro formas distintas funcionando, esses engenheiros se perguntavam: *"Quem sou eu para decidir quais abordagens não servem mais?"*

Além disso, ninguém é contratado com uma descrição de cargo que peça: *"Por favor, venha e reconsidere o ambiente de desenvolvimento que já criamos para você"*. Os engenheiros são contratados para entregar funcionalidades, corrigir bugs urgentes e tentar reduzir a lista interminável de tarefas do backlog. O foco imediato é invariavelmente pegar o próximo ticket e entregá-lo o mais rápido possível, sem espaço institucional para questionar as premissas vigentes.

---

[04:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=264s) A tradição oral e o software escrito "na mesma fonte"

Ao tentar simplesmente fechar o próximo ticket, o desenvolvedor esbarra no atrito invisível da base de código: surgem três implementações distintas de *service objects*; salvar um modelo `ActiveRecord` dispara cinco callbacks em cadeia, enfileira dois jobs em segundo plano, transmite dados via streaming e envia mensagens para o que parece ser um aparelho de fax empoeirado em algum escritório remoto sobre o qual só se ouviu falar por boatos; os deploys demoram entre 18 e 32 minutos dependendo do dia da semana e da posição do sol; e alterar um único campo visual de formulário exige cinco modificações espalhadas em dois repositórios diferentes.

Nenhuma dessas dores impede o fechamento do ticket de forma absoluta; elas apenas tornam a navegação no sistema lenta e penosa. O novato presume que, se os veteranos não estão reclamando e a aplicação continua no ar faturando, deve existir uma razão plausível para tamanha complexidade. Quando ele cria coragem e pergunta sobre alguma esquisitice no código, costuma ouvir respostas evasivas como: *"É, isso é meio estranho mesmo... mas eu não me preocuparia com isso hoje"*. Seis meses depois, esse mesmo engenheiro repete a mesmíssima frase para o próximo recém-chegado. Dessa forma, consolida-se uma tradição oral de desvio, cujo único objetivo é evitar tocar em áreas do sistema que ninguém mais compreende.

Robby sintetiza esse fenômeno com uma frase marcante: *"Um software que funciona tem o dom de fazer com que todas as decisões antigas pareçam intencionais"*. Uma aplicação madura mistura escolhas deliberadas, restrições que já caducaram, experimentos esquecidos e remendos de emergência que ninguém revisou. A grande dificuldade reside no fato de que *"todas elas estão escritas na mesma fonte"*, sem qualquer distinção visual entre código exemplar e débitos técnicos acumulados.

Com o tempo, o time aprende a compensar: os desenvolvedores descobrem quais testes quebram de maneira intermitente, quais trechos são seguros de copiar, a quem recorrer antes de encostar no módulo de faturamento e que o arquivo `README` serve mais como documento arqueológico do que como guia de instruções. O verdadeiro perigo desse processo adaptativo é que, quanto melhores os engenheiros se tornam em contornar as disfunções, menos anômalas essas disfunções parecem no dia a dia.

- **Efeitos colaterais em callbacks:** Um simples salvamento de registro disparando múltiplos callbacks, jobs assíncronos e transmissões obscuras. - **Deploys imprevisíveis:** Ciclos de entrega oscilando de 18 a 32 minutos sem motivo evidente. - **README histórico:** A documentação formal perde o valor operacional e o conhecimento real passa a residir na tradição oral da equipe. - **Acomodação pelo hábito:** O perigo de compensar o atrito técnico a ponto de normalizar a ineficiência do sistema.

---

[07:08](https://www.youtube.com/watch?v=XXjTdyhml0c&t=428s) Makers vs. Menders e a mentira do "trabalho de verdade"

Robby resgata um conceito apresentado há mais de uma década por Andrea Goulet, da consultoria Corgibytes, que dividiu os profissionais de tecnologia em dois perfis essenciais: os *"makers"* (criadores) e os *"menders"* (consertadores/zeladores). Enquanto os *makers* sentem atração pelo novo, pela invenção, por arquitetar coisas do zero e inovar onde nada existia antes, os *menders* encontram motivação em cuidar, consertar, estabilizar e expandir o que já existe no mundo real. Robby declara sua identificação total com o perfil de *mender*: para ele, ver um sistema instável, que de vez em quando pega fogo e contém comentários como `"Solução provisória, removida depois do almoço"` datados de 2013, não gera desespero, mas sim uma enorme curiosidade investigativa.

Essa reflexão expõe uma desconexão fundamental da indústria de software. Ao contrário da narrativa de que a engenharia consiste em começar do zero todos os dias, a imensa maioria do trabalho profissional é manutenção contínua. Os desenvolvedores passam seus dias lidando com decisões arquiteturais tomadas por terceiros anos atrás, tentando atualizar dependências, mitigar riscos de segurança, corrigir regressões e entender por que alguém no passado achou que colocar GraphQL resolveria magicamente os problemas da empresa — brincando com um bem-humorado *"Obrigado, Bruce"*.

A grande ilusão que a engenharia cultiva é acreditar que cuidar do sistema atual é um desvio que nos afasta do "trabalho de verdade" — aquele trabalho idealizado focado exclusivamente em novas features. Com veemência e uma pitada de indignação, Robby enfatiza: *"A mentira é que cuidar do sistema nos afasta do trabalho... Para a maioria de nós, isso é uma parte significativa da porra do trabalho"*. Melhorar as condições em torno do código, tornar o comportamento do sistema inteligível e assegurar que as mudanças sejam previsíveis e confiáveis não é perda de tempo; é exatamente o trabalho de maior impacto que um engenheiro sênior pode desempenhar. Essas lições, ressalta ele, não são fábulas heróicas em que consultores chegam e salvam o dia rumo ao pôr do sol, mas sim o padrão recorrente que ele testemunha em auditorias com clientes, nos oito anos como podcaster e nas conversas sinceras de bastidores em conferências.

- **Conceito de Andrea Goulet (Corgibytes):** - *Makers:* Focados na criação do zero, inovação e arquitetura verde (*greenfield*). - *Menders:* Dedicados à sustentação, refatoração, evolução e cuidado com sistemas legados (*brownfield*). - **O mito do "trabalho real":** A crença equivocada de que manutenção e resolução de dívida técnica são interrupções indesejadas, e não a essência da engenharia profissional de software. - **Origem das observações:** Bagagem acumulada pela consultoria Planet Argon, mais de 8 anos de entrevistas em podcast e conversas de corredor com a comunidade técnica.

[09:59](https://www.youtube.com/watch?v=XXjTdyhml0c&t=599s) Notas de campo e a oficina compartilhada do Rails

Robby Russell esclarece que não está no palco para fazer profecias sobre onde a engenharia de software estará daqui a cinco anos ou cinco meses; ele se apresenta como uma espécie de correspondente de campo trazendo anotações sobre o que já está acontecendo na prática. A realidade imediata é que gerar código se tornou muito mais fácil e barato, mas a capacidade de discernir o que realmente pertence ao sistema, em que partes confiar e o que deve ser modificado ainda depende fundamentalmente do bom senso e do julgamento humano — "pelo menos por enquanto".

Essa discussão ganha um peso especial no palco do Rails World porque o Ruby on Rails passou mais de duas décadas aperfeiçoando o que Robby define como uma grande "oficina" (*workshop*). Mesmo sem ter feito isso de maneira perfeita ou consistente, a comunidade investiu continuamente no ecossistema ao redor da construção de aplicações web: convenções compartilhadas, estruturas previsíveis, padrões sensatos, abstrações reutilizáveis e a eliminação sistemática de decisões desnecessárias. O Rails nunca eliminou a complexidade intrínseca do desenvolvimento web, mas estabeleceu um ponto de partida comum. Qualquer desenvolvedor que entre em uma aplicação desconhecida já sabe exatamente onde procurar o rastreamento de uma requisição, as alterações de banco de dados, os testes ou o processamento de tarefas em segundo plano. Essa estrutura comum poupa o time de ter que rediscutir e reinventar a roda para cada relação, validação ou resposta visual.

Contudo, sobre essa base comunitária, cada aplicação desenvolve inevitavelmente a sua própria "oficina local", repleta de atalhos próprios, ferramentas customizadas, exceções e premissas que moldam o cotidiano da equipe. A experiência acumulada ao navegar por diversos projetos permite ao engenheiro comparar e identificar o que é convenção padrão do Rails, o que é uma adaptação local razoável e o que é pura esquisitice técnica. Para quem está em seu primeiro projeto maduro, no entanto, essa lente comparativa não existe: tudo o que está dentro do repositório parece igualmente válido pelo simples fato de já estar lá. É essa perda de contexto histórico que leva às famosas respostas conformistas diante de uma estrutura bizarra: "É, isso é um pouco estranho".

- Convenções compartilhadas funcionam como linha de base para formular perguntas melhores: essa decisão fora do padrão foi intencional? A restrição da época ainda se aplica hoje, ou trata-se de um experimento abandonado pela metade? - O discernimento e a expertise técnica nascem da comparação prática entre múltiplas bases de código ao longo do tempo.

---

[13:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=825s) Agentes leem o repositório como prova concreta

Com a introdução de agentes autônomos de IA no fluxo de trabalho, essas ferramentas chegam às aplicações Rails com a vantagem prévia de já compreenderem suas convenções fundamentais de pastas e arquivos. A oficina padrão do Rails reduz o leque de possibilidades a serem consideradas antes de o agente começar a operar. O perigo real reside no fato de que as aplicações corporativas frequentemente enterram essa vantagem sob anos de padrões conflitantes, dependências desnecessárias, código morto e instruções obsoletas que ninguém se sente autorizado a revisar ou deletar. O framework não tem como impedir uma equipe de criar quatro maneiras concorrentes de resolver a mesma coisa, nem tem como avisar quando uma restrição local já perdeu a validade.

```mermaid flowchart TD accTitle: Fluxo de assimilação de contexto entre humanos e agentes accDescr: Compara a leitura de padrões locais por engenheiros humanos e por agentes autônomos de IA.

subgraph Base["Repositório e Oficina Local"] C["Padrões Locais Conflitantes e Código Obsoleto"] end

subgraph Deteccao["Absorção de Contexto"] H["Engenheiro Humano:<br/>Aprende tradição oral e descobre diretórios abandonados com o tempo"] A["Agente de IA:<br/>Assume todo exemplo como evidência válida a cada reset de contexto"] end

C --> H C --> A ```

É exatamente nesse ponto que a dinâmica se complica: os agentes examinam o repositório encarando o código existente como prova concreta do que deve ser seguido. Enquanto um novato humano eventualmente aprende pela convivência quais pastas estão abandonadas e quais estão ativas, o agente apenas enxerga três abordagens plausíveis no código e tenta sintetizá-las, precisando reaprender essa distinção toda vez que sua janela de contexto é reiniciada. A ambiguidade sempre esteve na base de código, mas a presença dos agentes escancara o quanto os humanos se acostumaram a criar atalhos mentais para contorná-la.

Para ilustrar o limite dessa automação, Robby cita o exemplo de pedir ao agente: "Torne a CI mais rápida". A ferramenta pode encontrar uma etapa lenta, otimizar o cache, paralelizar tarefas e economizar um minuto de compilação. Mas ninguém pode simplesmente deixar o agente rodando em loop infinito e esperar que a CI fique instantânea a ponto de rodar testes antes mesmo de serem escritos. Em algum momento, a engenharia esbarra em perguntas fundamentais que não são sobre sintaxe de código: até que ponto confiamos no que o sistema está gerando? Conhecemos os pontos de falha? Conseguimos confiar no feedback obtido? Quanto risco estamos dispostos a tolerar? Essas decisões pertencem puramente à cultura e aos acordos do time.

---

[16:44](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1004s) Tidy First e o novo Mítico Homem-Mês

Ao abordar o livro *Tidy First?*, publicado por Kent Beck em 2023, Robby destaca a premissa central de que, antes de fazer uma mudança difícil, deve-se primeiro tornar a mudança fácil. No fluxo de trabalho convencional de plataformas como Jira ou Linear, isso significa separar a arrumação estrutural da mudança de comportamento, quebrando um ticket em múltiplos pull requests menores para facilitar a revisão humana. Essa abordagem clássica, contudo, partia do pressuposto de que arrumar o código era caro porque consumia o tempo direto do desenvolvedor.

Ao delegar a arrumação e a produção de código para agentes de IA, esse equilíbrio se rompe. Um único ticket pode rapidamente virar uma enxurrada de pull requests contendo refatorações, documentação, dezenas de testes extras e atualizações de dependências. O resultado parece altamente produtivo à primeira vista, até cair nas mãos de quem precisa revisar tudo. Kent Beck observou que o "gênio" agora cospe código em um ritmo humanamente impossível de acompanhar, e revisar código é apenas parte da equação: alguém ainda precisa entender as alterações, testar o comportamento, coordenar os impactos laterais e decidir o que de fato tem permissão para entrar na aplicação.

Robby conecta esse cenário ao clássico *The Mythical Man-Month* (O Mítico Homem-Mês), escrito por Fred Brooks há mais de 50 anos, cuja premissa era demonstrar que adicionar mais pessoas a um projeto atrasado gera sobrecarga de coordenação ("mais gente, mais problemas"). Na era da inteligência artificial, as equipes entraram em sua própria versão moderna do homem-mês mítico: não porque contrataram dezenas de novos desenvolvedores, mas porque a capacidade de produzir código ultrapassou a capacidade humana de absorver, alinhar e encaminhar essa produção. A única vantagem prática, ironiza Robby, é que os agentes não têm sentimentos:

- Não é preciso marcar reuniões 1:1 com o agente para dar feedbacks desconfortáveis ou suavizar críticas sobre abstrações malfeitas. - Se o pull request estiver gigantesco ou péssimo, basta fechar, apagar tudo, trocar o modelo e recomeçar do zero sem constrangimento moral. - Apesar disso, o agente continua entrando exatamente na mesma oficina bagunçada que a equipe construiu para si mesma.

---

[19:51](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1191s) O problema do chuveiro do hotel

Robby introduz uma analogia prática ao pedir que a plateia levante a mão caso alguém tenha passado um tempo absurdo tentando entender os controles do chuveiro do hotel durante a semana da conferência. Brincando com a clássica técnica de falar em público ("estou imaginando todos vocês nus agora mesmo para conseguir superar isso"), ele descreve o momento universal de frustração em que um engenheiro se vê parado no box, congelando ou tentando não se queimar, enquanto questiona a própria inteligência: "Com certeza eu deveria ser mais esperto do que isso, certo?". A experiência ilustra como interfaces cotidianas, quando desprovidas de convenções óbvias ou sobrecarregadas de idiossincrasias locais, derrotam até os profissionais mais qualificados.

[20:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1210s) O problema do chuveiro de hotel e a compensação humana

Robby Russell inicia esta parte de sua apresentação com uma analogia cotidiana sobre o atrito invisível: chuveiros de hotéis. Todo mundo sabe, em teoria, como um chuveiro funciona após uma vida inteira de uso. Mesmo assim, ao entrar em um quarto de hotel desconhecido, o hóspede fica girando botões, puxando alavancas e tentando decifrar o mecanismo. Na manhã seguinte, o processo já é mais rápido porque o cérebro se adapta. Do ponto de vista do hotel, o sistema funciona perfeitamente: "Temos chuveiros. Funcionam muito bem."

No desenvolvimento de software, a mesma dinâmica se repete de forma contínua: - Os desenvolvedores sabem que a tarefa de banco de dados (`db:seed` ou comandos de carga local) da aplicação não funciona de verdade, então criam rotinas próprias e silenciosas para obter dados úteis nos ambientes de desenvolvimento. - Uma mensagem de erro bizarra é lida sabendo-se de antemão que ela "significa algo completamente diferente". - O software em si não melhorou com o tempo; a equipe apenas aprendeu a compensar as falhas e a ignorar os atritos da "oficina local" (o *workshop*).

Humanos são excepcionalmente eficazes em contornar sistemas quebrados: decoram exceções estranhas, identificam padrões implícitos, pulam instruções desatualizadas da documentação, evitam rodar comandos perigosos e sabem exatamente qual colega detém o contexto oral não documentado. Com o tempo, esses remendos passam a parecer normais. Contudo, os agentes de inteligência artificial não possuem essa memória tácita de longo prazo. A cada reinicialização de contexto, o agente pesquisa de novo, deduz do zero e queima recursos para reaprender o que a equipe já sabia. Se os humanos compensavam os atritos em silêncio, o agente agora torna o custo financeiro e temporal dessas falhas gritante e mensurável.

---

[22:08](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1328s) Engenharia de plataforma e a ausência de equipes dedicadas

Em grandes organizações, a resposta formal para cuidar da oficina é a criação de equipes dedicadas, como Engenharia de Plataforma (*Platform Engineering*) ou equipes de Experiência do Desenvolvedor (DevEx). Essas equipes existem unicamente para desobstruir os fluxos de trabalho, aprimorar a configuração das máquinas de desenvolvimento, acelerar pipelines de CI, criar ferramentas internas e prover acessos seguros à produção.

Robby traz exemplos práticos de conversas recentes com líderes técnicos da comunidade Rails: - **Austin Storey (Doximity):** Construiu wrappers em torno de agentes de codificação e ferramentas de linha de comando para estabelecer sandboxes seguras, além de implementar um mercado interno de habilidades (*skills marketplace*), evitando que comandos e fluxos úteis fiquem confinados ao histórico de terminal de um único engenheiro. - **Brian Scanlon (Fin):** Compartilha competências utilizáveis por qualquer pessoa da organização (inclusive profissionais de fora da engenharia) e desenvolveu wrappers controlados sobre ferramentas nativas como `rails console` e `rails runner` para regular o acesso dos agentes aos sistemas de produção.

No entanto, a grande maioria dos desenvolvedores não atua em corporações com orçamento para bancar uma equipe inteira focada nisso. Robby ressalta a dura realidade: ninguém em uma equipe de 20, 8 ou 3 pessoas vai voltar ao trabalho na semana seguinte e descobrir que a empresa contratou repentinamente cinco engenheiros dedicados exclusivamente a polir a experiência de desenvolvimento. A questão central permanece: quando não existe um time de plataforma, quem é a pessoa que nota o atrito recorrente e assume a responsabilidade de consertá-lo? Pois o problema não deixa de existir só porque ninguém tem o cargo formal para resolvê-lo.

---

[24:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1464s) Seja o Q, não o James Bond

```mermaid flowchart TD accTitle: Fluxo de Valor de Engenharia - Modelo James Bond versus Modelo Q accDescr: Comparação entre a abordagem heroica do agente James Bond e o foco estrutural de sustentação do personagem Q.

subgraph BondRole["A Mitologia de James Bond (Heroísmo)"] direction TB B1["Recebe a missão crítica"] --> B2["Corre pela cidade e apaga incêndios"] B2 --> B3["Destrói o carro caro no oceano"] B3 --> B4["Entrega a feature, mas mantém o risco alto"] end

subgraph QRole["O Papel de Q (Engenharia de Sustentação)"] direction TB Q1["Melhora as condições da oficina"] --> Q2["Reduz ciclos de feedback e cria sandboxes"] Q2 --> Q3["Elimina caminhos legados perigosos"] Q3 --> Q4["Garante que a próxima missão exija menos heroísmo"] end ```

Robby evoca a figura clássica de Q, o chefe de pesquisa e desenvolvimento do MI6 nas histórias de James Bond (007). Enquanto Bond recebe a missão, é perseguido, bebe martinis e afunda carros caríssimos no oceano, Q se concentra em melhorar as condições e as ferramentas do ambiente onde a missão ocorre: a caneta com função secreta, os dispositivos inusitados e a blindagem dos veículos.

A cultura da engenharia de software tradicional incentiva o desenvolvedor a se enxergar como Bond — o herói que resolve o problema no limite do prazo e empurra a feature a qualquer custo. "Mas, às vezes, a pessoa mais valiosa da equipe é aquela que garante que a próxima missão exija menos heroísmo." O verdadeiro valor de Q não está no artefato em si, mas em tornar o caminho do próximo engenheiro (ou do próximo agente autônomo) muito mais simples e seguro, encurtando ciclos de feedback e fechando rotas obsoletas.

---

[25:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1552s) "Você não precisa de permissão para fazer bem o seu trabalho"

Muitos engenheiros sentem uma profunda hesitação antes de ajeitar as ferramentas internas: pensam que foram contratados apenas para entregar código de negócio e fechar tickets do backlog, ou temem não ter permissão para atuar na infraestrutura do dia a dia. Ao deparar com um atrito óbvio, preferem ignorá-lo e voltar para a fila de tarefas.

Robby esclarece que ninguém deve desaparecer por três meses para construir um portal interno gigante que ninguém pediu — "Isso não é responsabilidade. Isso é uma situação de reféns." A proposta é outra: dedicar pequenas fatias de tempo responsável para entender dores recorrentes. "Estou aqui para dizer que você não precisa de permissão para fazer bem o seu trabalho."

Hoje, o desenvolvedor conta com uma nova justificativa política corporativa: se as pessoas ignoravam o tempo humano desperdiçado em processos manuais ruins, as empresas reagem imediatamente ao desperdício financeiro de agentes de IA: - Agentes esbarram em instrução defasada e entram em loops de erro. - A IA queima milhares de tokens tentando deduzir uma rota que um humano já sabia estar quebrada. - O argumento do "estamos queimando dinheiro de API com agentes perdidos" agora funciona como moeda de troca para aprovar a faxina técnica que há anos era negligenciada.

A meta consiste em fazer a menor melhoria responsável possível: algo visível, reversível e imediatamente útil para o próximo colega, começando por "uma gaveta que ninguém reorganizou desde 2019".

---

[29:11](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1751s) Do FAFO ao WUTS: Wonder, Unpack, Tinker, Share

Para que essa curiosidade não se transforme em perda de foco em detalhes irrelevantes, é necessária uma estrutura mental. O método tradicional informal é o clássico FAFO (*Fuck Around and Find Out*, adaptado com humor pelo palestrante como uma versão peculiar de "programação em pares"): sentar diante de um trecho enigmático, deletar linhas e ver o que explode para entender o comportamento.

O FAFO tem sua utilidade exploratória, mas Robby propõe um método mais deliberado e reflexivo: o acrônimo **WUTS** (ou **O quê?**), composto por quatro fases sucessivas:

```mermaid flowchart LR accTitle: Ciclo da estrutura investigativa WUTS accDescr: As quatro etapas da abordagem WUTS explicadas por Robby Russell - Wonder, Unpack, Tinker e Share.

W["Wonder (Maravilhar-se / Estranhar)"] --> U["Unpack (Explorar / Desempacotar)"] U --> T["Tinker (Brincar / Mexer)"] T --> S["Share (Compartilhar)"] S -.->|"Gera novos aprendizados"| W ```

- **Wonder (Maravilhar-se / Estranhar):** O ponto de partida nunca é o impulso imediato de consertar, mas o reconhecimento de uma discordância ou anomalia. É o momento sutil em que o código não se comporta conforme o esperado, em que dois desenvolvedores descrevem a mesma rotina de negócios usando premissas opostas, ou quando uma rake task falha na primeira execução e só roda com sucesso na segunda tentativa. Essa curiosidade é tratada como um sinal vital de atrito estrutural, e não como uma prova imediata de defeito a ser atacada às cegas.

[30:44](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1844s) O Método WUTS: Da Curiosidade à Arqueologia de Código (Wonder & Unpack)

Quando os desenvolvedores se deparam com algo desconhecido ou bizarro na base de código, a distração momentânea serve como um sinal que merece atenção. Em vez de simplesmente descartar a estranheza ou se irritar com uma convenção de nomenclatura decidida por alguém doze anos atrás — o que apenas desperdiça energia —, vale a pena fazer uma pausa e avaliar a situação com seriedade. Robby Russell convida a plateia a refletir sobre os últimos trinta dias em suas próprias aplicações Rails: qual foi aquele detalhe comum que os fez parar e soltar um sonoro "Que porra é essa?" Não se trata do maior dilema de arquitetura do sistema, mas de atritos corriqueiros: uma etapa bizarra de configuração no ambiente local que todo mundo sempre esquece de rodar, um aviso no terminal que a equipe inteira aprendeu a ignorar mecanicamente, um comentário citando uma integração externa ou fornecedor que sequer foi mencionado durante o onboarding, ou até um valor de timeout arbitrariamente configurado em exatos 47 segundos.

A partir desse ponto de interrogação inicial (o *Wonder*), entra em cena o processo de dissecar e investigar (o *Unpack*). É nesse estágio que a equipe precisa separar suposições precipitadas de fatos concretos, resistindo à tentação de pular imediatamente do "hmm, que estranho" para o "eu já sei como consertar". O trabalho se assemelha a uma verdadeira arqueologia de software: investigar como aquele código foi parar ali, qual problema específico o autor original estava tentando resolver e sob quais limitações técnicas ou organizacionais da época aquela solução foi concebida. Afinal, uma decisão que soa ridícula hoje pode ter sido a escolha mais sensata e pragmática seis anos atrás.

Antes de aplicar qualquer alteração, o desenvolvedor deve agir como um perito: medir o comportamento, analisar o ambiente de produção, revirar o histórico de commits no Git e rastrear o que causou aquele cenário. Se as pistas locais não forem suficientes, o próximo passo natural seria consultar quem escreveu o código — mas e quando esse engenheiro já saiu da empresa há anos? Movido por essa dúvida, Robby realizou uma enquete informal no X e no LinkedIn com pouco mais de 200 participantes para descobrir se ex-funcionários estariam dispostos a responder dúvidas sobre códigos criados cinco anos antes. Surpreendentemente, quase 80% afirmaram que ajudariam com prazer. Ainda assim, Robby reforça: antes de perseguir autores antigos no Git Blame e mandar mensagens no LinkedIn, faça o seu dever de casa. Muitas vezes, essa lição de casa revela que o código esquisito está ali por um motivo perfeitamente válido, e compreender por que algo deve continuar intacto já representa um avanço tremendo.

- **Perguntas de diagnóstico inicial:** O que chamou minha atenção? O que eu esperava ver? Mais alguém já passou por isso? Acontece com frequência ou é só implicância com decisões antigas de nomenclatura? - **Fatores comuns de atrito ignorados:** Passos de setup esquecidos, warnings normalizados, fornecedores fantasmas no código e números mágicos (como timeouts de 47 segundos). - **Pesquisa informal no X e LinkedIn:** Mais de 200 respostas; aproximadamente 8 em cada 10 engenheiros afirmaram estar abertos a tirar dúvidas sobre códigos legados que deixaram para trás em empregos anteriores.

```mermaid flowchart TD accTitle: Fluxo do ciclo WUTS accDescr: Diagrama ilustrando as quatro etapas do método WUTS: Wonder, Unpack, Tinker e Share.

subgraph WUTS["Ciclo WUTS"] W["Wonder<br/>(Identificar a estranheza)"] --> U["Unpack<br/>(Arqueologia e evidências)"] U --> T["Tinker<br/>(Hipótese e testes reversíveis)"] T --> S["Share<br/>(Documentação e ferramentas)"] end ```

---

[33:35](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2015s) Experimentar e Compartilhar: Fechar o Ciclo da Oficina (Tinker & Share)

A etapa seguinte do ciclo é o ajuste experimental (*Tinker*), momento em que o engenheiro testa na prática se o que presumiu na fase de investigação corresponde à realidade. Robby frisa que testar não significa sair alterando arquivos de forma indiscriminada. Antes de tocar em qualquer linha de código, o desenvolvedor deve dedicar trinta segundos para formular e anotar explicitamente sua hipótese: "o que eu espero que aconteça após esta intervenção?" Em seguida, deve-se aplicar a menor alteração reversível possível, cuja finalidade primária seja extrair informação útil. O objetivo aqui não é entregar a solução final de imediato; muitas vezes, constatar que a premissa inicial estava completamente equivocada é o resultado mais valioso que a experimentação pode oferecer.

O elo final do processo é o compartilhamento (*Share*), justamente a fase que a maioria dos times de tecnologia negligencia. Compartilhar o aprendizado não se resume a soltar uma mensagem vaga no canal do Slack dizendo "olha só que coisa bizarra que descobri hoje". Trata-se de transformar o conhecimento recém-adquirido em um artefato reutilizável pela próxima pessoa que passar pelo mesmo caminho. Isso pode assumir a forma de documentação formal de restrições de arquitetura, um registro de decisão (ADR), ou até mesmo a criação de uma automação que impeça futuros colegas de tropeçar nas mesmas armadilhas.

O grande propósito é devolver esse aprendizado ao ecossistema local da oficina (*workshop*). Quando as equipes falham em fechar esse ciclo, cria-se o cenário caótico mencionado anteriormente na palestra, no qual múltiplos engenheiros implementaram abordagens concorrentes ao longo dos anos sem documentar o encerramento das antigas, deixando para os sucessores quatro respostas diferentes e igualmente plausíveis para resolver exatamente o mesmo problema de negócio.

- **Princípio da menor alteração:** Fazer intervenções mínimas e facilmente reversíveis cujo objetivo principal seja gerar dados e validar hipóteses. - **Formulação de expectativas:** Gastar 30 segundos anotando o resultado previsto antes de executar a mudança no ambiente. - **Devolver à oficina:** Compartilhar significa traduzir descobertas em ferramentas, documentação ou melhorias de processo, impedindo que futuros membros do time tenham que redescobrir a roda.

---

[35:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2110s) Casos Reais: O Caos do `order.save` e o Middleware Esquecido de 2018

Para ilustrar como o método WUTS se traduz no cotidiano, Robby apresenta dois cenários reais retirados de bases legadas. O primeiro envolve o clássico método `order.save`. Em uma primeira leitura, a chamada parece uma persistência trivial de modelo no Rails, mas esconde um emaranhado assustador: o salvamento dispara uma cascata de callbacks que geram jobs assíncronos, emitem transmissões de websockets, executam trilhas de auditoria, invalidam camadas de cache e, de forma surpreendente, atualizam um sistema externo de gerenciamento de estoque de armazém sobre o qual ninguém havia falado durante o processo de integração. Aplicando o processo, o desenvolvedor mapeia as ramificações e efeitos colaterais (*Unpack*), isola comportamentos com nomes explícitos em um ambiente controlado para ver o que quebra (*Tinker*), e, em vez de guardar a descoberta para si, adiciona um diagrama no Mermaid no repositório ou documenta o fluxo na wiki (*Share*).

O segundo exemplo trata de uma situação prática encontrada pela consultoria: um Rack middleware esquecido que não sofria commits desde 2018, responsável por limpar determinados caracteres Unicode em requisições de entrada. O comentário no código afirmava categoricamente que a classe deveria ser removida assim que o aplicativo móvel legado fosse descontinuado — e o engenheiro atual sabia que esse app já havia sido aposentado bem antes de sua contratação. Seria a oportunidade perfeita para simplesmente deletar o arquivo? A arqueologia no Git revelou que o middleware fora adicionado às pressas após um fim de semana desastroso de centenas de exceções no Bugsnag.

Em vez de deletar o trecho no escuro, o time adicionou instrumentação de logs controlados. Sete dias depois, a surpresa: o middleware havia sido acionado 41 vezes na produção. Nenhuma das chamadas vinha do finado app mobile, mas sim de webhooks enviados por um parceiro de integração cujo rastreador injetava caracteres estranhos. A lógica de negócio permaneceu exatamente a mesma, mas o comentário desatualizado foi corrigido. Robby pontua que "nem tudo que é antigo está errado", e que o verdadeiro objetivo da manutenção não é eliminar qualquer peculiaridade do código, mas diferenciar com precisão as escolhas intencionais daquelas que foram meramente abandonadas pelo tempo.

- **Exemplo do `order.save`:** Uma chamada simples que escondia mutações críticas em estoque físico de armazém; a solução passou por desenhar diagramas (como Mermaid) no próprio repositório para orientar os próximos colegas. - **Exemplo do middleware de 2018:** Sanitizador de Unicode supostamente atrelado a um app mobile morto, que na verdade protegia a aplicação de payloads malformados de webhooks de parceiros (41 ocorrências em uma semana). - **Distinção fundamental:** Discernir entre idiossincrasias que têm propósito funcional ativo e atalhos que foram esquecidos no passado.

---

[37:28](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2248s) Observando o Trabalho Alheio e a "Carta para o Seu Substituto"

Identificar atalhos e remendos no próprio trabalho costuma ser uma tarefa inglória, pois as pessoas normalizam seus próprios hábitos estranhos até torná-los invisíveis. Em contrapartida, é incrivelmente fácil notar os malabarismos na rotina alheia. Robby sugere que os desenvolvedores adotem práticas consagradas de equipes de produto: sentar-se ao lado de um colega (presencialmente ou em sessões de pair programming remoto) e simplesmente observar como ele realiza tarefas cotidianas, sem intervir, dar conselhos ou corrigir o fluxo. Prestar atenção em onde a pessoa hesita, quais comandos ela evita rodar no terminal, quais etapas ela repete manualmente e onde ela criou desvios excêntricos revela com clareza as deficiências da oficina. O mesmo cuidado deve ser dedicado aos novos agentes de código de inteligência artificial, que operam sem conhecer esses truques invisíveis.

Para diagnosticar com profundidade o conhecimento não documentado de uma equipe, Robby propõe um exercício de pensamento provocativo: imaginar que hoje é, impreterivelmente, seu último dia na empresa. Sem entrar nos pormenores da demissão ou transição com o RH, a missão é redigir uma carta de aviso para o engenheiro que sentará na sua cadeira amanhã.

A estrutura da carta começa simples: *"Caro substituto, seja bem-vindo ao grupo. Esta é, em grande parte, uma aplicação Rails normal, exceto por..."* É no preenchimento dessa lacuna que mora a verdade do projeto. Quais comandos jamais devem ser executados em produção? Quais peculiaridades arquiteturais só existem na cabeça de quem está há anos no time? Para tornar a dinâmica ainda mais reveladora, a liderança deve pedir que diferentes membros da equipe escrevam suas próprias cartas de forma independente e depois as comparem lado a lado. Quase sempre descobre-se que um engenheiro sênior guarda restrições que ninguém mais conhece, expondo o abismo perigoso entre o que o código declara e o que a tradição oral sustenta.

- **Técnica de observação silenciosa:** Acompanhar colegas em tarefas triviais para mapear atritos, repetições desnecessárias e truques ocultos, estendendo esse monitoramento aos agentes de IA da equipe. - **O exercício da carta de despedida:** Redigir um guia sincero de advertências ("Esta é uma aplicação normal, exceto por...") listando perigos que não constam na documentação oficial. - **Confronto de tradições orais:** Comparar as versões escritas por diferentes desenvolvedores para identificar lacunas de contexto e regras não ditas antes que os colaboradores deixem a organização.

---

[39:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2392s) A Tradição Oral e os Achados da Pesquisa da Comunidade Rails 2026

Essa lacuna entre o comportamento real do software e o conhecimento informal compartilhado nos corredores compõe parte integrante da oficina de qualquer empresa de tecnologia. Para comprovar que esse fenômeno é sistêmico e não um caso isolado de times desorganizados, Robby Russell traz dados preliminares da Pesquisa da Comunidade Rails 2026 (*2026 Rails Community Survey*). Ao analisar os dados colhidos junto a profissionais do mundo inteiro sobre suas maiores barreiras ao ingressar em aplicações já existentes, o padrão se confirmou com clareza cristalina: o obstáculo número um apontado pela comunidade não é o framework, a infraestrutura ou ferramentas obsoletas, mas a imensa dificuldade de compreender a lógica de negócios e o modelo de domínio construídos sobre a aplicação.

[40:11](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2411s) Os desafios do código herdado e os três pilares da oficina

Ao analisar os dados da pesquisa da comunidade Rails, os dois maiores obstáculos relatados pelos desenvolvedores logo após o topo são familiares: em segundo lugar, a dificuldade de compreender código antigo ou herdado; em terceiro, a crônica falta de documentação. Como Robby Russell observa, isso não deveria surpreender ninguém, pois evidencia um padrão claro de que o verdadeiro atrito no dia a dia da engenharia não reside em inventar a próxima linha de código, mas sim em decifrar o sistema que se acabou de herdar. Essa constatação expõe exatamente os pontos críticos onde o entendimento compartilhado se desfez e o custo de redescoberta tornou-se proibitivo.

Diante desse cenário, a pergunta central passa a ser: onde as equipes devem concentrar seu tempo e esforço para melhorar o ambiente de trabalho? Essas melhorias estruturais no "workshop" se dividem em três grandes categorias fundamentais: 1. Tornar o caminho óbvio; 2. Tornar o feedback rápido e confiável; 3. Tornar os erros mais baratos de reverter.

---

[40:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2445s) Categoria 1: Tornar o caminho óbvio

Se uma equipe precisa criar novas integrações com frequência, uma abordagem comum e informal é dizer aos desenvolvedores: "veja a última integração que fizemos e use-a como modelo". Essa orientação parece razoável à primeira vista, mas rapidamente desanda quando a integração escolhida como exemplo tiver sido, na verdade, um experimento isolado ou fora do padrão. Em vez de depender desse improviso, uma equipe madura transforma os aprendizados acumulados em um gerador de código executável — uma ferramenta interna que já gera a estrutura de classes adequada, o tratamento de erros padrão, fixtures, stubs de teste e até a documentação esperada.

```mermaid flowchart TD accTitle: Do exemplo disperso ao gerador executável accDescr: Comparação entre buscar exemplos manuais e usar um gerador com padrões canônicos

subgraph AbordagemTradicional["Abordagem Tradicional"] A["240+ exemplos no repositório"] --> B["Desenvolvedor ou Agente escolhe ao acaso"] B --> C["Sintetiza padrão inconsistente"] end

subgraph AbordagemCanonica["Abordagem Recomendada"] D["Gerador de Código"] --> E["Estrutura padrão, stubs e fixtures"] E --> F["Código consistente e revisões fáceis"] end ```

Quando uma decisão arquitetônica é codificada em um gerador, ela deixa de exigir interpretação subjetiva. Enquanto uma instrução em markdown diz "é assim que trabalhamos" e um exemplo canônico diz "é isso que pretendemos agora", um gerador declara assertivamente "comece exatamente por aqui", eliminando o excesso de escolhas plausíveis. Isso aplica a clássica alavancagem do ecossistema Rails diretamente à oficina local da aplicação. Essa clareza é indispensável não apenas para seres humanos, mas sobretudo para agentes de IA: é incomparavelmente mais eficiente e seguro entregar a um agente um gerador configurado com as expectativas da equipe do que deixá-lo varrer centenas de integrações antigas para tentar deduzir sozinho um meio-termo inconsistente.

- Instruções em texto reduzem alternativas, mas geradores fornecem um ponto de partida concreto sem margem para interpretação ambígua. - Evita que agentes de IA vasculhem o repositório entre centenas de variações históricas para "sintetizar a 143ª versão" de um padrão.

---

[42:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2530s) Categoria 2: Tornar o feedback rápido e confiável

A segunda melhoria essencial consiste em transformar o ciclo de retorno em algo ágil e digno de confiança, pois um feedback rápido que induz ao erro não tem valor algum, e um feedback demorado que todos ignoram torna-se inútil. Em toda organização de engenharia surge uma espécie de "manual do usuário oculto" — regras implícitas que nunca foram redigidas ou aprovadas em documento algum, mas que todo mundo assimila para sobreviver no ecossistema:

> "Você aprende a não executar mais o conjunto completo de testes localmente porque demora muito. Você aprende que o ambiente de teste raramente é tão confiável assim. Você descobre quais avisos todo mundo parece ignorar. Ninguém colocou essas regras por escrito, mas o ambiente as ensinou."

Quando agentes de codificação automatizados são introduzidos nesse contexto, eles herdam involuntariamente esse mesmo manual disfuncional. O agente pode ser ultrarrápido para gerar alterações, mas continuará preso na fila de integração contínua (CI), dependendo de um ciclo lento e tendo de adivinhar se uma falha intermitente de teste tem ou não relevância. Casar uma ferramenta ágil com uma infraestrutura lenta e frágil apenas perpetua um sistema moroso. A pergunta que os engenheiros devem se fazer é direta: o que demora 40 minutos hoje e poderia rodar em 5? Quais são as mensagens de erro que obrigam os desenvolvedores a vasculhar o histórico do Slack em busca de respostas antigas? O objetivo pragmático não é tornar todos os testes instantâneos a qualquer custo, mas garantir o nível ideal de validação no momento certo do fluxo de entrega.

---

[43:47](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2627s) A metáfora do técnico de guitarra

Refletindo sobre o suporte silencioso nos bastidores, Robby traça um paralelo com sua paixão pela música. Embora hoje esteja no palco dando palestras e tocando, ele confessa que, em outra vida, trabalhar como técnico de guitarra teria sido uma carreira dos sonhos. Na juventude, a atração natural é pelos holofotes e pelo papel de músico principal, mas a maturidade traz apreço genuíno pela pessoa que viabiliza o espetáculo sem aparecer.

Um excelente técnico de guitarra estuda a fundo o repertório da banda: sabe com precisão qual instrumento será exigido na faixa seguinte, afina-o antes mesmo de ser chamado, permanece atento a qualquer ruído no palco e intervém discretamente diante do menor imprevisto. Terminada a apresentação, é ele quem conserta o equipamento que apresentou falhas durante a noite para garantir que ninguém enfrente o mesmo problema no dia seguinte. Embora pareça servir apenas ao guitarrista, sua dedicação destina-se, em última instância, ao público — exatamente como o trabalho invisível de aprimorar ferramentas e pipelines atende, no fim das contas, aos usuários finais do software.

---

[44:45](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2685s) Categoria 3: Tornar mais barato reverter os erros

A terceira categoria foca em reduzir o custo de recuperação diante de falhas. Há uma distinção crítica aqui: o objetivo não é a ilusão de "evitar erros", que soa admirável como lema, mas funciona como um péssimo modelo operacional. Quando as apostas de qualquer mudança são elevadas e tudo parece irreversível, a equipe simplesmente para de experimentar. Esse comportamento conservador não decorre de desleixo ou preguiça, mas sim de uma gestão de risco racional.

Basta uma implantação desastrosa, uma migração com bloqueio de banco ou um arquivo esquecido para imobilizar três engenheiros durante dias investigando a produção. O prejuízo nunca esteve no equívoco pontual, mas no custo exorbitante da recuperação. Diante de experiências traumáticas, o medo se institucionaliza no workshop: as pessoas passam a recomendar não tocar em trechos sensíveis, exigem reuniões abarrotadas para aprovar commits banais e preferem sempre adiar lançamentos para a semana seguinte.

Transformar o ambiente de trabalho envolve desarmar esse pânico operacional por meio de proteções arquitetônicas concretas: - *Feature flags* que permitem desligar funcionalidades comissionadas em instantes; - Migrações de banco estritamente reversíveis; - Ambientes efêmeros de pré-visualização (*preview environments*); - Lotes reduzidos de implantação frequente.

Essas salvaguardas não eliminam os erros humanos ou de código, mas tornam o ato de recuar tão simples e econômico que a equipe recupera a segurança psicológica necessária para explorar e inovar.

---

[46:20](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2780s) Reduzir opções obsoletas e a coragem de dizer "agora faremos assim"

Para além dessas três frentes, existe uma alavanca transformadora que muitos ignoram: a eliminação sistemática de opções obsoletas. Toda vez que um padrão antigo e abandonado permanece no repositório, ele atua como um sinal aberto de que aquele método ainda é aceitável, distorcendo aquilo que a base de código ensina para novatos e modelos de IA. Embora a engenharia costume associar a geração de valor apenas à criação e adição de recursos, a exclusão deliberada de código é uma das decisões arquitetônicas mais nobres e impactantes.

Cuidar do workshop envolve ações diversas: às vezes é construir uma nova ferramenta; às vezes é apenas "etiquetar uma gaveta" ou redigir um comentário explicando por que uma dependência incomum ainda precisa existir. O propósito final é deixar o caminho preferencial evidente. Retomando o caso do cliente citado no início da apresentação, aquela empresa acreditava precisar de consultores para descobrir uma "arquitetura perfeita", quando na verdade não existia uma resposta mágica: > "O que eles precisavam era de alguém disposto a dizer: 'Já aprendemos o suficiente com esses experimentos. Agora vamos fazer assim.' Não para sempre, apenas o tempo suficiente para deixar de tomar a mesma decisão de forma independente todas as vezes."

---

[47:32](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2852s) Conclusão: Seja Q, não James Bond

Muitas aplicações Rails maduras continuam operando sob decisões tomadas para contextos de negócios que já não existem mais. Alguns caminhos foram remendos emergenciais; outros, decisões temporárias esquecidas por antigos colegas. O complicador é que, dentro do editor de texto, tudo continua sendo renderizado "com aquela mesma maldita fonte", sem aviso visual do que é moderno e do que é legado abandonado.

Robby encerra a palestra com um apelo direto aos engenheiros: quando um trecho de código soar confuso ou estranho, não o contorne às pressas; siga a curiosidade e busque compreender a causa raiz antes de apenas aplicar outro remendo. Ao desvendar o funcionamento de algo complexo, formalize esse conhecimento e entregue à próxima pessoa — seja um colega contratado daqui a seis meses ou alguém que comece amanhã — um ponto de partida claro e documentado.

Não é necessário tentar encarnar o agente James Bond em cada missão diária. O trabalho mais nobre e transformador da engenharia costuma ser o do personagem Q: desenhar e aprimorar as ferramentas para colocá-las nas mãos dos outros, reduzindo o heroísmo desnecessário das próximas tarefas. No fim das contas, os engenheiros mais valiosos de uma organização não serão simplesmente aqueles que mais entregam itens dentro da oficina, mas aqueles dedicados a aprimorar a própria oficina.

## Notable quotes > [00:06](https://www.youtube.com/watch?v=XXjTdyhml0c&t=6s) Acabei de decidir tornar essa plataforma confusa para todo mundo que vier a entrar nesta empresa — Robby Russell

> [04:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=264s) Um software que funciona tem o dom de fazer com que todas as decisões antigas pareçam intencionais — Robby Russell

> [04:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=264s) todas elas estão escritas na mesma fonte — Robby Russell

> [07:08](https://www.youtube.com/watch?v=XXjTdyhml0c&t=428s) A mentira é que cuidar do sistema nos afasta do trabalho... Para a maioria de nós, isso é uma parte significativa da porra do trabalho — Robby Russell

> [24:24](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1464s) Mas, às vezes, a pessoa mais valiosa da equipe é aquela que garante que a próxima missão exija menos heroísmo. — Robby Russell

> [25:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1552s) Isso não é responsabilidade. Isso é uma situação de reféns. — Robby Russell

> [25:52](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1552s) Estou aqui para dizer que você não precisa de permissão para fazer bem o seu trabalho. — Robby Russell

> [30:44](https://www.youtube.com/watch?v=XXjTdyhml0c&t=1844s) Que porra é essa? — Robby Russell

> [42:10](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2530s) Você aprende a não executar mais o conjunto completo de testes localmente porque demora muito. Você aprende que o ambiente de teste raramente é tão confiável assim. Você descobre quais avisos todo mundo parece ignorar. Ninguém colocou essas regras por escrito, mas o ambiente as ensinou. — Robby Russell

> [46:20](https://www.youtube.com/watch?v=XXjTdyhml0c&t=2780s) O que eles precisavam era de alguém disposto a dizer: 'Já aprendemos o suficiente com esses experimentos. Agora vamos fazer assim.' Não para sempre, apenas o tempo suficiente para deixar de tomar a mesma decisão de forma independente todas as vezes. — Robby Russell

## Mentioned Robby Russell, Planet Argon, Ruby on Rails, Rails World 2026, Andrea Goulet, Corgibytes, Kent Beck, Tidy First?, Fred Brooks, The Mythical Man-Month, Austin Storey, Doximity, Brian Scanlon, Fin, James Bond, Q, Jira, Linear, GraphQL, ActiveRecord, Rack, Bugsnag, Mermaid, X, LinkedIn, Slack, 2026 Rails Community Survey

## Video description Makers build new things. Menders tend what already exists, and most professional software work is mending. In this closing keynote from Rails World 2026, Robby Russell (Planet Argon) talks about the "local workshop" every mature Rails app builds on top of the framework: the patterns, shortcuts, workarounds and oral traditions that teams quietly learn to compensate for, and that AI coding agents now have to rediscover every time their context resets.

Drawing on client work, years of podcast interviews and conversations in conference hallways, Robby shares agrees that while producing code has gotten cheaper, deciding what belongs, what can be trusted and what should change still takes human judgment.

CHAPTERS 00:00 Four ways to build the same integration 07:12 Makers and menders 09:58 Field notes from a field correspondent 10:32 Rails and the shared workshop 13:45 Agents read the repository as evidence 16:44 Tidy First and the new Mythical Man-Month 19:51 The hotel shower problem 22:18 Who improves the workshop without a platform team? 24:24 Be Q, not Bond 27:06 You don't need permission to do your job well 29:11 From FAFO to WUTS: Wonder, Unpack, Tinker, Share 35:12 Example: what really happens on order.save 36:18 Example: the middleware nobody's touched since 2018 38:55 A letter to your replacement 39:54 2026 Rails Community Survey findings 40:45 Make the path obvious 42:10 Make feedback fast and trustworthy 43:47 The guitar tech 44:45 Make mistakes cheaper to reverse 46:20 Reduce obsolete choices 47:32 "We're doing it this way now"

REFERENCED IN THIS TALK - Makers and menders, Andrea Goulet (Corgibytes) - Tidy First? by Kent Beck - The Mythical Man-Month by Fred Brooks - 2026 Rails Community Survey (results coming soon)

ABOUT THE SPEAKER Robby Russell is the founder and CEO of Planet Argon, a Portland-based Rails consultancy, the creator of Oh My Zsh, and host of the On Rails podcast.

Thank you @shopify for sponsoring the editing and post-production of these videos. Check out insights from the Engineering team at: https://shopify.engineering/

#RailsWorld #RubyOnRails #Rails #LegacyCode #DeveloperExperience #AIAgents

[Source](https://www.youtube.com/watch?v=XXjTdyhml0c)

中文简报

AI智能体因遗留代码受阻,Robby Russell主张优先精简代码 随着人工智能降低软件生产成本,消除过时模式并整理代码库比交付新功能带来更大价值。 Robby Russell认为,现代工程中最有价值的角色并非一味交付新功能,而是维护现有系统并为团队其他成员扫清障碍。随着人工智能降低代码生成成本,存在多种冲突模式的代码库会误导自主智能体,使它们将旧的技术债务视为设计范式。为解决这一阻碍,演讲者提出了WUTS框架(Wonder、Unpack、Tinker、Share),并建议工程师效仿《007》中的角色“Q博士”而非英雄詹姆斯·邦德,主动消除过时选项、缩短反馈循环,并在无需等待正式批准的情况下明确架构决策。 借助人工智能,大规模代码生产已变得廉价且易得,但评估哪些代码属于系统、哪些应当废弃,仍严格依赖人类判断。 (9:59) 自主代码智能体会将代码库视作既定事实,且因无法获知团队口耳相传的经验与非正式规则,在整合冲突模式时容易陷入成本高昂的循环。 (13:45) 2026年Rails社区调查数据显示,理解业务逻辑和领域模型是遗留代码库中的首要瓶颈,其带来的阻碍已超过缺乏文档的问题。 (39:52) 最具可持续性的工程价值不在于救火式的个人英雄主义,而在于扮演“Q博士”的角色,通过优化内部工具来减少未来对英雄之举的依赖。 (24:24)

Reading summary

Segundo Robby Russell, o engenheiro mais valioso de uma equipe não é aquele focado exclusivamente em lançar novas funcionalidades, mas quem atua na manutenção contínua e na melhoria das ferramentas internas do sistema. Ao tratar a base de código como uma oficina compartilhada, a prioridade técnica deve ser reduzir o atrito invisível e tornar o trabalho previsível tanto para humanos quanto para agentes de inteligência artificial. A ilusão das features e a acomodação técnica (7:08) Apoiando-se no conceito de Andrea Goulet que divide profissionais entre criadores (makers) e zeladores (menders), Russell argumenta que a manutenção não é uma distração do trabalho real, mas a essência da engenharia profissional. Com o crescimento das equipes e a rotação de colaboradores, sistemas maduros acumulam camadas geológicas de decisões passadas. Em um caso atendido por sua consultoria, um time que dobrou para cerca de 50 engenheiros mantinha quatro arquiteturas concorrentes para realizar exatamente a mesma integração de dados, gerando paralisia e indecisão sobre qual modelo adotar. Como todo o código aparece com a mesma formatação visual no editor, desenvolvedores não conseguem distinguir escolhas deliberadas de remendos emergenciais. Instala-se, então, uma tradição oral de desvios: a equipe aprende a conviver com suítes de testes pouco confiáveis, deploys que oscilam entre 18 e 32 minutos e efeitos colaterais ocultos em callbacks. Esse processo de adaptação normaliza disfunções e perpetua a complexidade acidental, já que a maioria dos engenheiros não se sente autorizada institucionalmente a podar caminhos obsoletos. Agentes de IA e o homem-mês moderno (13:45) A integração de agentes autônomos de inteligência artificial acentua os custos da desorganização arquitetural. Enquanto engenheiros veteranos aprendem informalmente quais arquivos ou diretórios ignorar, o modelo de IA examina o repositório assumindo todo código existente como evidência válida a ser imitada, precisando reaprender esse discernimento a cada reinicialização de contexto. Russell conecta esse cenário ao clássico The Mythical Man-Month, de Fred Brooks: a velocidade descomunal na geração de pull requests não resolve os gargalos de alinhamento, pois a capacidade de gerar código ultrapassou a capacidade humana de revisar, testar e coordenar impactos colaterais. Se as deficiências de configuração antes eram amortecidas pelo esforço manual silencioso dos desenvolvedores, agora elas se traduzem em custos financeiros diretos de consumo de tokens e loops infinitos de erro na automação. O modelo de Q e o método WUTS (24:24) Em vez de personificar o herói James Bond — que conclui a missão no limite do prazo e deixa um rastro de destruição operacional —, Russell defende que o engenheiro sênior deve agir como Q, o armeiro focado em aperfeiçoar os equipamentos para que as próximas missões exijam menos sacrifício. Assumir essa responsabilidade não requer cargos formais em equipes de plataforma nem longos afastamentos para criar portais complexos, mas a aplicação contínua da menor melhoria responsável possível. Para guiar essa investigação técnica sem cair em modificações inconsequentes, Russell propõe o método WUTS: Wonder (notar anomalias e atritos rotineiros), Unpack (investigar o contexto histórico e restrições originais no Git), Tinker (formular hipóteses explícitas e testar alterações mínimas reversíveis) e Share (formalizar o conhecimento em documentações, diagramas ou testes). Um exemplo prático citado envolveu um middleware esquecido desde 2018 que, em vez de ser deletado sumariamente, foi instrumentado e revelou proteger a produção contra 41 falhas semanais geradas por webhooks de parceiros. Três pilares para reestruturar a base técnica (40:45) Dados preliminares da Pesquisa da Comunidade Rails 2026 indicam que a compreensão da lógica de negócios e do código herdado supera ferramentas ou frameworks como o maior obstáculo enfrentado por desenvolvedores. Para combater essa barreira, Russell sintetiza a evolução do ambiente em três frentes essenciais: tornar o caminho óbvio, acelerar ciclos de feedback confiáveis e baratear o custo de reversão de falhas. Tornar o caminho óbvio exige substituir instruções subjetivas por geradores executáveis que estabeleçam o ponto de partida canônico para novas implementações, eliminando variações desnecessárias. Paralelamente, otimizar rotinas lentas de integração contínua e introduzir salvaguardas estruturais — como feature flags, migrações de banco reversíveis e implantações em lotes reduzidos — remove o medo institucional de errar e devolve à equipe a confiança para inovar sem burocracias excessivas. Russell conclui que a maioria dos sistemas maduros não sofre por carência de novas ideias arquiteturais, mas pela hesitação em formalizar consensos e descontinuar soluções ultrapassadas. O valor transformador da engenharia reside na coragem de determinar o padrão vigente, documentar advertências críticas e investir na saúde cotidiana do repositório, assegurando que o ambiente permaneça sustentável tanto para novos contratados quanto para as ferramentas que virão.

Source quotes

[0:06] Robby Russell: Acabei de decidir tornar essa plataforma confusa para todo mundo que vier a entrar nesta empresa [4:24] Robby Russell: Um software que funciona tem o dom de fazer com que todas as decisões antigas pareçam intencionais [4:24] Robby Russell: todas elas estão escritas na mesma fonte [7:08] Robby Russell: A mentira é que cuidar do sistema nos afasta do trabalho... Para a maioria de nós, isso é uma parte significativa da porra do trabalho [24:24] Robby Russell: Mas, às vezes, a pessoa mais valiosa da equipe é aquela que garante que a próxima missão exija menos heroísmo. [25:52] Robby Russell: Isso não é responsabilidade. Isso é uma situação de reféns. [25:52] Robby Russell: Estou aqui para dizer que você não precisa de permissão para fazer bem o seu trabalho. [30:44] Robby Russell: Que porra é essa? [42:10] Robby Russell: Você aprende a não executar mais o conjunto completo de testes localmente porque demora muito. Você aprende que o ambiente de teste raramente é tão confiável assim. Você descobre quais avisos todo mundo parece ignorar. Ninguém colocou essas regras por escrito, mas o ambiente as ensinou. [46:20] Robby Russell: O que eles precisavam era de alguém disposto a dizer: 'Já aprendemos o suficiente com esses experimentos. Agora vamos fazer assim.' Não para sempre, apenas o tempo suficiente para deixar de tomar a mesma decisão de forma independente todas as vezes.

Original transcript

[0:06] Tudo bem. [0:12] Então, eu estava conversando com essa empresa que entrou em contato conosco. [0:15] Eles tinham uma aplicação em Rails já consolidada, com anos de história, [0:18] e uma equipe de engenharia em crescimento. [0:20] Acho que o número de engenheiros praticamente dobrou, chegando a cerca [0:24] de 40 ou 50, em pouco mais de um ano. [0:25] E eles se viram em uma situação em que tinham quatro padrões diferentes — acho [0:29] que dá para dizer assim — de implementar basicamente os mesmos tipos de [0:32] funcionalidades em seu aplicativo. [0:34] Veja bem, ao longo dos anos, eles criaram centenas e centenas de [0:37] integrações à medida que incorporavam novos clientes à sua plataforma. [0:40] E cada uma dessas integrações precisava fazer mais ou menos o mesmo tipo de coisa. [0:45] Receber alguns dados, transformá-los, validá-los, enviar parte deles para outro [0:49] lugar, lidar com erros, tentar novamente, registrar o que aconteceu e notificar [0:53] alguém quando as coisas dessem errado. [0:55] Você sabe, software. [0:57] Mas cada geração dessas integrações tinha uma aparência bem diferente. [1:00] Uma abordagem surgiu de algo que um dos engenheiros leu no blog de engenharia [1:05] de outra pessoa anos antes. [1:07] E então surgiu outra ideia a partir de algo que alguém leu no blog [1:11] de outra equipe de engenharia. [1:12] Isso soa familiar? [1:13] Depois, outra pessoa se juntou à equipe, começou a fazer experimentos [1:17] e teve outra ideia. [1:18] E continuaram acumulando todos esses experimentos uns sobre os outros. [1:22] Ora, cada uma dessas abordagens funcionava tecnicamente, mas, de certa forma, [1:26] isso fazia parte do problema. [1:29] Eles começaram com essa abordagem inicial. [1:31] Ela resolveu aquele problema inicial da aplicação naquele momento, e, [1:34] por um tempo, foi simplesmente assim que eles faziam as coisas. [1:37] Mas então a equipe começou a fazer experiências. [1:43] E essas experiências também faziam sentido naquele momento. [1:47] Mas o problema é que nenhuma dessas abordagens anteriores [1:50] realmente desapareceu. [1:51] Elas simplesmente continuaram se acumulando. [1:54] Então, imagine agora que você é um engenheiro trabalhando nessa aplicação [1:58] hoje e está lá há apenas 6 meses. [2:00] Quando você se depara com uma dessas integrações mais antigas, [2:03] você segue o padrão que acha que a equipe está usando agora, quando ela tem [2:07] centenas e centenas de integrações? [2:10] Ou você tenta alinhá-lo com o que acha que a equipe está fazendo hoje? [2:14] E se você começar a reorganizar, até onde vai nesse caminho? [2:17] Às vezes, a gente só precisa entrar de cabeça em alguma coisa, [2:21] fazer uma mudança rápida e sair, certo? [2:23] Mas é assim também que os padrões antigos sobrevivem. [2:26] Raramente vamos encontrar um commit no nosso histórico do Git que diga: “Acabei [2:30] de decidir tornar essa plataforma confusa para todo mundo que vier [2:33] a entrar nesta empresa”. [2:35] Não, essas coisas acontecem gradualmente. [2:38] Uma decisão que vai se somando a outra. [2:40] Então, eles pediram para minha equipe ir até lá. [2:42] Analisar o código deles, conversar com os engenheiros e ajudá-los a [2:46] decidir qual abordagem deveriam adotar como padrão. [2:49] À primeira vista, claro, isso parecia um daqueles casos comuns: [2:52] “precisamos de ajuda com nossa arquitetura”, “precisávamos de um [2:55] novo olhar de especialistas”, certo? [2:58] Então, foi o que fizemos. [3:00] Analisamos o código, conversamos com a equipe deles e pedimos [3:03] que explicassem os diferentes padrões que estavam usando, o que estava causando [3:07] atrito, quais restrições eles achavam que ainda se aplicavam e, [3:10] se tivessem que criar uma nova integração amanhã, por que abordagem optariam? [3:14] Rapidamente, ficou claro que a arquitetura não era realmente o problema aqui. [3:18] O problema era que ninguém estava disposto a ser a pessoa que dissesse: [3:22] “Agora vamos fazer assim”. [3:24] E, para ser sincero, eu entendi o motivo. [3:27] Veja bem, a maioria das pessoas que trabalhava nessa base de código não [3:31] havia criado esses padrões originais. Elas os herdaram. [3:34] Muitas entraram na equipe depois que muitos dos engenheiros [3:37] originais já haviam saído. [3:38] Para algumas, essa era sua primeira grande aplicação em Rails. [3:41] Na verdade, a empresa comentava que esse era um dos pontos fortes do Rails: a [3:45] possibilidade de contratar esses engenheiros talentosos com pouquíssima [3:49] experiência em Rails e colocá-los em ação de forma bastante produtiva. [3:53] Mas esses engenheiros chegaram e encontraram quatro abordagens concorrentes [3:57] já em operação, e todas pareciam funcionar. [3:59] Então, quem eram eles para simplesmente chegar e decidir quais [4:02] não se encaixavam mais? [4:03] E há outro motivo para isso acontecer. [4:05] A maioria dos engenheiros não é contratada com instruções explícitas do tipo: “por [4:09] favor, venha e reconsidere o ambiente de desenvolvimento que já criamos para você”. [4:13] Você é contratado porque há trabalho a ser feito, certo? [4:16] Há funcionalidades a serem lançadas, bugs a serem corrigidos e uma lista de [4:19] tarefas do produto a ser reduzida — ou, pelo menos, tentar reduzir. [4:22] Então, naturalmente, é nisso que você se concentra. [4:24] Você pega o próximo ticket e tenta concluir esse trabalho. [4:29] Mas, enquanto você tenta fazer esse trabalho, você se depara [4:32] com várias coisas. [4:33] Talvez existam três padrões diferentes de objetos de serviço espalhados [4:38] pela base de código. [4:39] Talvez salvar um modelo ActiveRecord acione cinco callbacks, [4:42] gere dois trabalhos em segundo plano, transmita algo e envie uma mensagem para o [4:47] que parece ser um aparelho de fax em funcionamento em um escritório sobre o [4:51] qual você só ouviu falar em alguns rumores entre sua equipe. [4:55] Talvez as implantações levem de 18 a 32 minutos, dependendo do dia da [4:59] semana e da posição do sol. [5:00] Talvez alterar um campo em um formulário exija que você faça 5 alterações [5:04] diferentes na base de código em 2 repositórios. [5:08] Agora, nenhuma dessas coisas está necessariamente impedindo [5:11] você de encerrar esse ticket. [5:12] Elas só estão tornando o trabalho um pouco mais difícil de acessar e de navegar. [5:17] Então você pensa: “Hã, o aplicativo parece estar funcionando, [5:20] e há outras pessoas aqui que estão na empresa há mais tempo do que eu. [5:24] Então, talvez” — e ninguém na equipe parece estar particularmente [5:27] preocupado com isso. [5:28] Então, talvez haja uma explicação razoável para isso. [5:32] De vez em quando, você pode até perguntar a alguém: “Ei, o que é essa coisa estranha [5:35] aqui?” E a pessoa responde: “É, isso é um pouco estranho. [5:38] Eu não me preocuparia muito com isso hoje.” E isso faz sentido, porque você [5:41] precisa fechar esse ticket, certo? [5:42] Seis meses depois, outra pessoa entra para a sua equipe e pergunta sobre isso, [5:46] e você acaba dizendo: “É, isso é um pouco estranho.” [5:48] Provavelmente eu não me preocuparia muito com isso. [5:53] Com o tempo, sua equipe acaba criando uma tradição oral em torno de evitar coisas [5:57] que ninguém mais entende direito. [5:59] Um software que funciona tem o dom de fazer com que todas as decisões [6:03] antigas pareçam intencionais. [6:05] Mas um aplicativo maduro contém muitas escolhas deliberadas, [6:08] restrições ultrapassadas, experimentos que acabaram se mantendo e [6:12] soluções alternativas que ninguém mais revisitou. [6:15] O difícil é que todas elas estão escritas na mesma fonte. [6:20] A boa notícia é que, com o tempo, a gente acaba ficando [6:23] razoavelmente bom nisso tudo. [6:25] Aprendemos onde não pisar, quais testes parecem ser repetidos, [6:29] quais exemplos são seguros para copiar. [6:31] Aprendemos a quem perguntar antes de mexer em qualquer código relacionado a cobrança, [6:36] quais partes do aplicativo exigem um pouco mais de cuidado e atenção. [6:40] Aprendemos que o README é mais um documento histórico do que um [6:43] conjunto confiável de instruções. [6:45] Aprendemos a diferença entre o que o aplicativo diz e como a equipe [6:49] realmente trabalha nele. E assim, compensamos. [6:52] Mas o perigo está no fato de que, quanto mais ficamos hábeis em compensar [6:55] algo, menos incomum isso começa a parecer. [6:57] E é isso que torna o trabalho com software maduro um tipo de engenharia tão [7:01] diferente, mesmo que não venhamos a fazer isso por muito mais tempo. [7:08] Bem, há pouco mais de uma década, me deparei com esse post da Andrea Goulet, [7:13] de uma empresa chamada Corgibytes, que descrevia os “makers” e os “menders”. [7:17] E, parafraseando-a aqui, os “makers” são atraídos pela criação de [7:21] algo novo, pela invenção, pela inovação, por fazer algo que não existia antes. [7:26] Já os “menders” são atraídos por cuidar, consertar, melhorar e [7:30] ampliar o que já existe. [7:31] E essa distinção me tocou profundamente. [7:34] Pessoalmente, me identifico mais com o rótulo de “consertador”. [7:38] Me mostre algo que funcione mais ou menos, que de vez em quando pegue fogo e que [7:42] tenha um comentário de 2013 dizendo: “Solução provisória, [7:45] removida depois do almoço”. [7:46] Agora você despertou minha curiosidade. [7:51] A razão pela qual essa ideia ficou na minha cabeça é que, [7:54] apesar do que nosso setor diz sobre si mesmo, a maior parte do trabalho [7:57] profissional com software não é feita a partir do zero. [8:00] A maioria de nós não acorda todas as manhãs, toma uma xícara de café ou chá e, [8:04] em seguida, passa o dia inteiro projetando novos padrões de arquitetura [8:07] e lançando novos recursos. [8:08] Estamos lidando com decisões que já foram tomadas. [8:11] Estamos modificando o software enquanto tentamos não prejudicar as partes [8:14] das quais as pessoas ainda dependem. [8:16] Estamos atualizando dependências, corrigindo regressões, [8:19] reduzindo riscos e tentando lembrar por que alguém achou que seria uma ótima ideia [8:23] adicionar o GraphQL a isso e que isso iria melhorar tudo. [8:26] Obrigado, Bruce. [8:30] Então, passamos anos dizendo a nós mesmos que, assim que resolvermos alguns [8:35] problemas do mainframe, finalmente voltaremos ao trabalho de [8:39] verdade, ao trabalho inovador, ao trabalho divertido, ao trabalho de [8:44] desenvolvimento de recursos, certo? [8:46] E, no entanto, de alguma forma, o sistema existente continua [8:50] exigindo nossa maldita atenção. [8:52] A mentira é que cuidar do sistema nos afasta do trabalho. [8:56] Deixe-me repetir isso. [8:58] A mentira é que cuidar do sistema nos afasta do trabalho. [9:03] Para a maioria de nós, isso é uma parte significativa da porra do trabalho. [9:08] Às vezes, o trabalho de maior impacto consiste em melhorar as condições em torno [9:13] do trabalho, tornando o sistema mais fácil de entender, fazendo com que as mudanças [9:18] sejam mais seguras de serem implementadas, avaliadas e nas quais se possa confiar. [9:22] Isso também é uma forma de consertar. [9:25] E, às vezes, os engenheiros originais já se foram há muito tempo. [9:28] E a equipe atual fica tentando descobrir o que foi intencional e o que foi [9:33] simplesmente um acúmulo de resíduos. [9:35] Ora, não estou aqui hoje com uma coleção de histórias de batalha — nem de casos de [9:39] sucesso de consultoria em que a Planet Argon chegou, salvou o dia e partiu [9:44] rumo a um pôr do sol com o código perfeitamente refatorado. [9:49] Mas esses são padrões com os quais me deparo constantemente no nosso trabalho [9:52] com clientes, nas entrevistas de podcast que venho fazendo nos últimos 8 anos e nas [9:56] conversas informais em conferências como esta. [9:59] Estou aqui hoje como uma espécie de correspondente de campo. [10:02] Estas não são minhas previsões sobre onde acredito que a engenharia de software [10:06] estará daqui a 5 anos ou daqui a 5 meses. [10:08] São anotações de campo sobre o que já está acontecendo. [10:10] E eis o que estou observando. [10:13] Sim, produzir código ficou mais fácil e mais barato, [10:16] mas entender o que é adequado, em que podemos confiar e o que [10:20] devemos mudar ainda exige bom senso. [10:22] Pelo menos por enquanto. [10:26] Agora, uma das razões pelas quais isso parece especialmente relevante no [10:30] RailsWorld é que o Ruby on Rails vem aprimorando o que gosto de chamar [10:33] de “oficina” há mais de 20 anos. [10:35] Não de forma perfeita, nem sempre de maneira consistente, talvez [10:39] até com um pouco de confiança a mais. [10:41] Mas a comunidade Rails passou esses anos investindo no ambiente em torno [10:45] do desenvolvimento de aplicativos. [10:47] Principalmente no desenvolvimento de aplicativos web. [10:50] Nossas convenções compartilhadas, estruturas previsíveis, padrões sensatos, [10:54] abstrações reutilizáveis, documentação, colaborações de código aberto, [10:58] discussões online, exemplos e trabalhos anteriores, [11:01] além da eliminação constante de decisões desnecessárias. [11:05] O Rails não eliminou a complexidade na criação de aplicativos web, mas nos [11:09] proporcionou um ponto de partida comum. [11:11] Isso porque, ao entrar em um aplicativo Rails com o qual você não está [11:15] familiarizado, já se tem uma ideia de onde procurar. [11:18] Onde se rastreia uma solicitação? [11:20] Onde se encontram as alterações no banco de dados? [11:23] Onde geralmente ocorrem as tarefas em segundo plano? [11:26] Onde ficam os testes? [11:27] Essa estrutura comum nos proporcionou uma vantagem como seres humanos, [11:31] pois reduz o número de perguntas que precisamos responder antes de podermos [11:35] começar a desenvolver nossos próprios aplicativos. [11:38] Onde ficam esses tipos de arquivos? [11:39] Como representamos esses tipos de relações? [11:42] Como validamos esse registro? [11:44] Como representamos esse tipo de — Visualização. [11:46] Resposta. [11:47] Ora, as respostas nem sempre são perfeitas, mas ter uma resposta [11:50] compartilhada é muito mais valioso do que ter que rediscutir cada decisão. [11:55] Então, mais uma vez, o Rails nos dá um ponto de partida, [11:58] mas cada uma de nossas aplicações constrói o que gosto de chamar de [12:01] “oficina local” sobre essa base. [12:03] Ela tem seus próprios padrões, atalhos, ferramentas, exceções e suposições. [12:08] E essas escolhas locais acabam se tornando o ambiente no qual a [12:12] equipe precisa trabalhar. [12:14] E o Rails nos oferece outra coisa útil nesse sentido: a comparação. [12:18] Depois de ter a oportunidade de trabalhar com várias aplicações Rails, [12:22] você começa a reconhecer o que é convencional, o que é uma adaptação local [12:27] razoável e o que é incomum em uma base de código. [12:30] É por meio dessa comparação que desenvolvemos discernimento e [12:34] expertise em nossas carreiras. [12:36] E é isso que me mantém na ativa. [12:39] Mas alguém que está começando a trabalhar em seu primeiro aplicativo Rails maduro [12:43] talvez ainda não tenha essa experiência comparativa. [12:46] Tudo no repositório parece igualmente válido simplesmente porque já está lá. [12:50] As convenções compartilhadas, sim, nos dão essa base de referência. [12:54] Elas nos oferecem um ponto de partida a partir do qual podemos começar [12:57] a fazer perguntas melhores. [12:59] É mais ou menos assim que o Rails normalmente abordaria isso? [13:03] E, se não for o caso, essa mudança foi intencional? [13:05] Será que algumas dessas restrições estavam levando a equipe para [13:09] uma direção diferente? [13:10] Talvez tenha sido assim, mas será que essa restrição ainda existe hoje? [13:14] Ou estamos diante de um experimento que nunca chegou realmente a uma conclusão? [13:18] Então, pare um momento e pense nos seus aplicativos por um segundo. [13:23] Existe algum padrão de pastas, uma biblioteca ou algum elemento da sua [13:26] infraestrutura que você parece saber como contornar, mas não tem certeza absoluta do [13:30] motivo pelo qual ele existe dessa forma? [13:34] E você já respondeu, ou alguém já perguntou sobre isso e você [13:37] respondeu: “É, isso é um pouco estranho”? [13:42] É assim que soa quando o contexto desaparece. [13:44] Então, agora temos esses agentes se juntando a nós também e [13:48] assumindo nossos trabalhos. [13:49] E, no entanto, quando esses agentes entram em nossos aplicativos Rails, [13:53] eles já têm uma ideia razoável de onde procurar as coisas, como elas costumam ser [13:57] estruturadas e quais padrões é provável que encontrem. [14:00] Há menos possibilidades a serem consideradas antes que ele possa [14:04] começar a trabalhar por conta própria. [14:06] O workshop já está ensinando a ele como temos trabalhado em nossos aplicativos. [14:12] E, ao longo desses 20 anos, o Rails voltou a criar aplicativos em [14:15] Rails, ou melhor, temos trabalhado para tornar esses aplicativos muito mais [14:19] legíveis, repetíveis e compartilháveis. [14:21] E agora teremos esses agentes de IA trabalhando conosco, [14:24] e eles vão se beneficiar disso. [14:30] Mas nosso aplicativo em Rails ainda pode enterrar essa vantagem sob anos e [14:35] anos de padrões locais conflitantes. [14:37] Código obsoleto, instruções desatualizadas e dependências desnecessárias. [14:42] E decisões que ninguém realmente se sente autorizado a rever. [14:46] Porque a estrutura não pode nos impedir de criar quatro respostas [14:50] concorrentes para a mesma questão. [14:52] Ela não pode nos obrigar a escolher uma delas mais tarde. [14:56] Ele não consegue determinar o que foi o não consegue determinar quando [15:00] uma restrição local expirou. [15:01] E não consegue fazer com que compartilhemos o que [15:03] aprendemos uns com os outros. [15:05] Essa parte ainda pertence a todos nós, por enquanto. [15:09] E, mais uma vez, agora temos esses agentes se juntando a nós, e eles também estão [15:14] analisando o repositório como prova. [15:16] Os novatos humanos acabarão descobrindo que um diretório está atualizado e [15:20] outro será abandonado em alguns meses. [15:22] Sim, podemos, de certa forma, instruir nossos agentes a fazer [15:26] coisas semelhantes já agora. [15:27] É um ponto meio óbvio, mas um agente verá apenas três exemplos [15:31] plausíveis e talvez precise reaprender essa distinção toda vez que sua [15:35] janela de contexto for zerada. [15:37] Essa ambiguidade já existia, mas os agentes estão revelando o [15:40] quanto aprendemos a contorná-la. [15:45] Você já fez uma pergunta a um agente de IA do tipo: “Como podemos tornar nossa CI [15:48] mais rápida?” Acho que provavelmente todos nós já tentamos isso. [15:52] Talvez você tenha pulado as formalidades e dito simplesmente: [15:55] “Torne a CI mais rápida”. [15:56] Talvez ele tenha identificado uma etapa demorada. [15:58] Talvez tenha aprimorado o cache na sua CI. [16:01] Talvez isso tenha dividido suas tarefas. [16:03] Talvez, após alguns ciclos de prompt, você tenha economizado um [16:06] minuto na sua compilação de CI. Ótimo. [16:08] Isso é útil. [16:09] Mas provavelmente você não pode simplesmente deixar o agente rodando para [16:12] sempre e esperar que a CI fique cada vez mais rápida, [16:15] a ponto de os testes terminarem antes mesmo de você os ter escrito. [16:19] Com o tempo, vamos nos deparar com questões que já não dizem [16:22] mais respeito ao código em si. [16:23] Serão perguntas como: até que ponto confiamos no que o [16:26] sistema está produzindo? Podemos testá-lo? [16:28] Conseguimos entender o que deu errado? [16:30] Podemos confiar no feedback que estamos recebendo? [16:34] E quanto risco estamos dispostos a tolerar? [16:36] Essas ainda são decisões com as quais todos nós estamos lutando como equipes, [16:42] porque são questões que dizem respeito à forma como queremos atuar. [16:46] Bem, em 2023, Kent Beck publicou um livro chamado *Tidy First*. [16:50] Alguém já leu? Ótimo. [16:53] É um bom livro. E uma das ideias centrais é bem simples. [16:56] Ora, antes de fazer uma mudança difícil, primeiro torne a mudança mais fácil. [17:01] Você pega seu ticket no Linear, no Jira ou no que quer que sua equipe esteja usando. [17:06] Agora, o comportamento solicitado por quem criou o ticket, ou algo do tipo, parece [17:11] ser simples, mas o código envolvido não é. [17:15] Então, você tem a oportunidade de organizar essa área primeiro. [17:18] O trabalho de organização é separado da mudança de comportamento. [17:21] Basicamente, a ideia é que um ticket possa resultar — estou simplificando — em, [17:26] digamos, duas pull requests. [17:27] Supostamente, é mais fácil aprovar cada uma delas. [17:30] Assim, em vez de uma grande pull request, você tem duas pull requests menores. [17:34] E agora temos PRs em pilha e coisas do tipo. [17:36] Essa regra partia do pressuposto de que a organização era dispendiosa. [17:40] Porque, quando você é quem tem que fazer o trabalho, esse trabalho extra de [17:44] organização tem um custo real: o seu tempo. [17:47] Mas agora podemos delegar essa regra a um agente. [17:50] Um ticket agora pode levar a talvez vários PRs, mudanças de comportamento, [17:54] documentação, testes melhores e mais numerosos, talvez até atualizações de [17:58] dependências — o que soa e talvez pareça produtivo até você ser quem [18:02] tem que revisar tudo isso. [18:05] Kent Beck vem falando bastante sobre isso desde então. [18:08] E eis que, em dezembro passado, ele afirmou que o “gênio” produz código a [18:11] um ritmo que nenhum revisor humano consegue acompanhar. [18:18] E revisar o código é apenas parte do processo. [18:20] Alguém ainda precisa entender o que mudou, testar, revisar e coordenar com [18:24] tudo o mais que está acontecendo. [18:26] Alguém ainda precisa decidir o que deve fazer parte dos nossos sistemas. [18:32] Bem, esse problema não é totalmente novo. [18:35] É e não é, mas há mais de 50 anos, Fred Brooks já escrevia sobre por que [18:39] adicionar mais engenheiros não resulta simplesmente em um aumento [18:43] proporcional da capacidade. [18:45] Mais produção também gera mais coordenação, ou seja, [18:48] mais gente, mais problemas. [18:49] Acho que essa foi basicamente a origem do livro dele. [18:52] Então, fico me perguntando: será que já entramos em nossa própria [18:56] versão do mítico “homem-mês”? [18:59] Não porque, de repente, tenhamos contratado mais 20 engenheiros, [19:02] mas porque, de repente, conseguimos produzir mais do [19:05] que somos capazes de dar conta. [19:06] Toda essa produção ainda precisa ser encaminhada para algum lugar. [19:14] Mas há um lado positivo nisso. [19:16] Presume-se que os agentes não levem o feedback para o lado pessoal. [19:20] Você pode dizer a eles que a abstração deles está ruim. [19:24] Que o PR deles é muito grande e que precisam recomeçar do zero. [19:27] Ou você nem precisa dizer nada. [19:29] É só apagar tudo, recomeçar, mudar o seu modelo. [19:32] Você não precisa marcar uma reunião individual, dar feedback a eles e dizer [19:36] algo como: “Ei, amigo, precisamos conversar sobre seus PRs”. [19:40] Mas eles ainda estão entrando no mesmo workshop que criamos para nós mesmos. [19:47] Tudo bem. [19:47] Vamos fazer uma votação rápida por levantamento de mãos. [19:49] Quantos de vocês tiveram que gastar um tempo absurdo tentando descobrir como [19:52] funcionava o chuveiro do hotel esta semana? [19:58] Mantenham a mão levantada se, em algum momento, vocês estiverem ali [20:01] em pé, talvez até parcialmente nus. [20:03] Estou imaginando todos vocês nus agora mesmo. [20:05] Isso me ajuda a superar isso. [20:06] Mas pensem: com certeza devo ser mais esperto do que isso, certo? [20:09] Excelente. [20:10] Obrigado por contribuírem para a parte da minha palestra de hoje dedicada à [20:14] pesquisa sobre chuveiros de hotel. [20:16] Suponho que vocês saibam como funcionam os chuveiros, certo? [20:19] Acho que a maioria de vocês provavelmente já os usa há quase toda a vida. [20:23] E, mesmo assim, lá estão vocês, girando botões, puxando coisas, tentando [20:27] descobrir como funcionam por aqui. [20:33] Com o tempo, você vai pegar o jeito. [20:35] E amanhã de manhã, vamos supor — a menos que você tome banho à noite —, [20:40] você provavelmente vai ser mais rápido. [20:42] E, do ponto de vista do hotel, o chuveiro funciona pra caramba. [20:46] Temos chuveiros. Funcionam muito bem. [20:49] Fazemos isso o tempo todo com software. [20:51] Sabemos que a tarefa DBC do nosso aplicativo não funciona de verdade, [20:55] então não a usaríamos. [20:56] Temos nossa própria maneira de obter dados úteis para nossos ambientes locais. [21:01] Sabemos que aquela mensagem de erro significa algo completamente diferente. [21:05] O software também não melhorou. [21:08] Acabamos de aprender a compensar isso. [21:10] E esse workshop traz muitos atritos que aprendemos a ignorar. [21:13] Essa é apenas uma pequena amostra do que me vem à cabeça. [21:17] E não se preocupem, vou compartilhar os slides ainda esta [21:20] semana para que vocês não precisem tirar fotos como prova. [21:24] Mas, mas suspeito que algumas dessas situações sejam bem familiares. [21:30] Os seres humanos são notavelmente bons em contornar as falhas desse sistema. [21:33] Lembramos das exceções estranhas, identificamos padrões, [21:36] ignoramos as instruções incorretas e sabemos quais comandos [21:39] não devem ser executados. [21:40] Aprendemos quem detém o contexto não documentado. [21:43] Com o tempo, as soluções alternativas passam a parecer normais. [21:46] Mas os agentes, por sua vez, nem sempre desenvolvem essa [21:49] mesma compreensão duradoura. [21:51] Eles pesquisam de novo, deduzem de novo, gastam recursos para [21:54] chegar ao que já sabemos. [21:55] Aprendemos que a solução alternativa — aprendemos sobre as soluções alternativas [21:59] e seguimos em frente, mas o agente acabou de tornar esse custo muito mais visível. [22:08] Então, o que a gente faz? [22:11] O que vamos fazer em relação a tudo isso? [22:13] Bem, para algumas organizações, há uma resposta mais ou menos clara. [22:16] Elas podem ter algo como uma equipe de engenharia de plataforma ou [22:20] algo com nome semelhante. [22:21] Essas equipes se concentram basicamente em melhorar o ambiente relacionado [22:25] à criação e operação de software. [22:27] Elas trabalham na configuração dos desenvolvedores, na implantação de CI, [22:31] nas ferramentas internas, garantindo que tenhamos um acesso mais [22:34] seguro à produção e fluxos de trabalho compartilhados. [22:37] O trabalho deles, essencialmente, é tornar o ambiente de trabalho cada [22:40] vez mais fácil ao longo do tempo. [22:41] Recentemente, conversei com o Austin Storey, da Doximity. [22:43] Um abraço para o Austin, onde quer que você esteja. [22:45] Ainda não tive a oportunidade de colocar o papo em dia com você, [22:48] mas falamos sobre parte do trabalho que a equipe dele vem realizando. [22:50] Eles criaram wrappers em torno de agentes de codificação e ferramentas de linha de [22:53] comando para garantir sandboxes de segurança mais confiáveis. [22:56] Eles também criaram um mercado interno de habilidades para que os fluxos de trabalho [23:00] úteis não fiquem presos na configuração local ou no histórico de [23:03] comandos de um único engenheiro. [23:05] Ouvi algo semelhante de Brian Scanlon quando o entrevistei sobre o [23:08] Rails para — ele trabalha na Fin. [23:09] A equipe dele compartilha competências que qualquer pessoa da organização pode usar, [23:13] inclusive quem não é propriamente engenheiro de software. [23:16] Eles criaram wrappers para ferramentas como o Rails Console e o Rails Runner, [23:19] proporcionando aos próprios agentes de produção formas ainda mais controladas [23:23] de acessar suas aplicações. [23:24] Empresa diferente, mas padrões semelhantes. [23:27] Mas nem todo mundo trabalha em uma organização com capacidade ou orçamento [23:31] para ter uma equipe dedicada à plataforma. [23:34] Acho que, provavelmente, muitas pessoas nesta sala não vão voltar [23:37] ao trabalho na próxima semana e descobrir que, de repente, contrataram cinco pessoas [23:42] cuja única função é melhorar a experiência interna dos desenvolvedores. [23:46] Então, quem faz esse trabalho em uma equipe de, digamos, 20 desenvolvedores, [23:51] ou 8, ou talvez apenas 3? [23:52] Quem percebe quando há um atrito estranho que não para de surgir e lida com isso? [23:57] Porque esse trabalho não desaparece simplesmente porque ninguém [24:01] se responsabiliza por ele. [24:04] Essas coisas elas ainda precisam da atenção de alguém. [24:11] Mas quem? [24:16] Quem aqui conhece esse senhor? [24:20] Vejo algumas pessoas levantando a mão por aí. [24:24] Então, para todos os demais, este é o Q das histórias de James Bond, o 007. [24:29] Q chefia o departamento de pesquisa e desenvolvimento do MI6. [24:32] Sua equipe cria as ferramentas, os dispositivos, os recursos inusitados [24:37] dos carros e essa caneta que, sem dúvida, se tornará importante 45 [24:41] minutos depois na história. [24:43] Bond recebe a missão. [24:44] Bond é perseguido pela cidade. [24:46] Bond pede o martini. [24:48] E Bond joga o carro caro no oceano. Mas e o Q? [24:52] Ele se concentra em melhorar o ambiente em que essa missão se desenrola. [24:57] No entanto, a cultura da engenharia incentiva muitos de nós a [25:02] nos imaginarmos como o Bond. [25:06] James Bond. Eu tinha que fazer isso. [25:08] Tudo bem. [25:08] Mas, às vezes, a pessoa mais valiosa da equipe é aquela que garante que a [25:13] próxima missão exija menos heroísmo. [25:15] Talvez ela desenvolva uma ferramenta mais segura, reduza os ciclos de feedback e [25:20] elimine um caminho que ninguém deveria mais seguir. [25:23] Eles facilitam o sucesso do próximo engenheiro ou agente. [25:27] E esse é, na verdade, o objetivo do trabalho da Queue. [25:31] Este é outro dos carros do David que ele ainda não postou. [25:35] Portanto, o dispositivo é, de certa forma, apenas um artefato, mas o valor vem do [25:41] que o próximo agente pode fazer com ele. [25:44] Então, quando converso com engenheiros sobre esse tipo de trabalho, [25:48] a mesma hesitação sempre volta à tona. [25:52] Isso é mesmo responsabilidade minha? [25:53] Fui contratado para trabalhar em funcionalidades, para encerrar tickets. [25:57] Ou talvez a versão mais discreta seja: será que eu realmente tenho permissão [26:00] para dedicar algum tempo a isso? [26:04] Estou curioso: quantos de vocês já perceberam algum atrito e tiveram o [26:08] pressentimento de que “deve haver uma maneira melhor”? [26:11] Mas, como ninguém pediu para vocês resolverem isso, vocês simplesmente [26:15] continuaram trabalhando no backlog. [26:19] Isso soa familiar? [26:20] Como você decide se vale a pena dedicar algum tempo a isso? [26:23] Você está descumprindo um compromisso? [26:26] Está gastando muito mais tempo com isso do que o problema talvez mereça? [26:30] Ou está aprendendo algo que poderia facilitar a vida de outra pessoa? [26:35] Ou algo do tipo. [26:36] Ora, há muitos motivos para não se lançar de cabeça em algo que ninguém [26:39] pediu para você mexer. [26:41] Não estou sugerindo que todos saiam por aí, ajam por conta própria, [26:44] sumam pelos próximos três meses e, depois, criem, desenvolvam algum portal interno [26:49] para desenvolvedores que ninguém pediu. [26:51] Isso não é responsabilidade. [26:52] Isso é uma situação de reféns. [26:56] Mas dedicar um tempinho para entender alguns atritos recorrentes Isso [27:00] me parece bastante razoável. [27:06] Estou aqui para dizer que você não precisa de permissão para fazer [27:09] bem o seu trabalho. [27:10] Se você, seus colegas de trabalho ou aqueles seus amiguinhos da IA que estão [27:15] tentando tomar o seu lugar estão enfrentando atritos repetidamente, [27:18] faz parte do seu trabalho tentar amenizar isso. [27:24] Isso não precisa se tornar um grande projeto. [27:26] Basta identificar o obstáculo. [27:28] Encontre alguém que também esteja passando por isso. [27:31] Depois, melhore talvez uma coisinha e veja o que você aprende. [27:37] E se alguém te perguntar sobre isso agora, você tem esse novo trunfo na manga. [27:40] Você pode dizer: “Enquanto eu trabalhava nisso, nossos amiguinhos agentes de [27:43] IA ficavam esbarrando em um obstáculo. [27:45] Isso os bloqueava, os levava a uma espiral de falhas e consumia um monte de tokens na [27:49] tentativa de encontrar uma solução alternativa.” [27:54] Porque, aparentemente, o fato de os agentes estarem “queimando [27:57] dinheiro” agora nos dá o argumento que nunca pudemos usar quando se tratava [28:02] de desperdício de tempo humano. [28:04] Agora, não estou sugerindo que vocês abusem dessa desculpa, [28:07] mas fiquem à vontade para tirar uma captura de tela disso — ou uma [28:11] foto — e enviar para o seu chefe. [28:13] Então, pensem nisso. [28:14] Quais são algumas das menores melhorias responsáveis que vocês podem fazer que [28:19] sejam visíveis, reversíveis e úteis para outra pessoa? [28:22] Bem, talvez vocês não sejam donos de toda a oficina, como eu disse, [28:26] mas provavelmente há pelo menos uma gaveta que ninguém reorganizou [28:29] desde, digamos, 2019. [28:32] Agora, quero acrescentar um aviso importante. [28:35] Não estou sugerindo que todos saiam do “Rails World” e comecem a [28:38] procurar coisas para consertar. [28:39] Vocês vão se deparar com essas coisas naturalmente. [28:42] E quando algo chamar sua atenção, é bom dar um pouco de [28:44] estrutura a essa curiosidade. [28:46] Portanto, antes de falarmos sobre algumas coisas específicas que podemos fazer para [28:50] melhorar nossos ambientes — pelo menos da maneira como minha cabeça parece funcionar [28:54] mal —, é importante ter uma estrutura para abordar esse tipo de trabalho. [28:58] Caso contrário, é fácil se perder em detalhes irrelevantes. [29:01] Bem, acho que muitos de nós provavelmente já estamos bem familiarizados com o método [29:05] clássico de desenvolvimento de software conhecido como — programação em pares. [29:11] FAFO. Para descobrir, você precisa descobrir. [29:14] Imagine-se sentado diante do seu código. [29:16] O que diabos esse código está fazendo? [29:17] O que acontece se eu simplesmente apagar isso? [29:21] Às vezes, a maneira mais rápida de entender um software é mexer nele sem dó. [29:26] Talvez não em ambiente de produção. [29:28] Bem, o FAFO tem seu lugar, mas venho experimentando algo [29:32] um pouco mais deliberado. [29:34] Eu chamo isso de O quê? [29:38] Como se pronuncia isso? [29:40] É vagamente inspirado na aprendizagem baseada na investigação, [29:44] na experimentação científica e na minha necessidade de dar um nome engraçado a uma [29:49] sequência de comportamentos que, de outra forma, seriam normais. [29:53] Significa “maravilhar-se, explorar, brincar e compartilhar”. [29:57] O quê? [30:02] Bem, o Whats não é uma estrutura para resolução de problemas. [30:05] Vocês já são uma sala cheia de pessoas que adoram resolver problemas, presumo. [30:08] Portanto, não vou ficar aqui hoje fingindo que sou melhor do que qualquer um [30:12] de vocês na resolução de problemas. [30:13] Na verdade, eu nem gostaria de tirar essa parte do trabalho de vocês. [30:16] Trata-se de uma estrutura baseada na curiosidade. [30:19] E tudo começa com aquele pequeno momento. [30:22] O código não está fazendo o que eu esperava. [30:25] Hein? [30:27] Duas pessoas estão descrevendo o mesmo fluxo de trabalho de [30:29] maneiras muito diferentes. [30:34] O quê? [30:35] Essa tarefa do rake só funcionou na segunda vez que eu a executei. [30:39] Estranho. Essa curiosidade é um sinal. [30:41] Mas não é prova de que haja algo errado. [30:44] É um sinal de que talvez valha a pena entender algo. [30:47] Então, é assim que funciona. [30:49] Quando nos distraímos — vou me adiantar um pouco em relação aos meus slides aqui. [30:53] Quando nos distraímos, basicamente estamos apenas levando [30:56] esse sinal a sério por um momento. [30:58] O que chamou minha atenção? [31:01] O que eu esperava, afinal? [31:02] Alguém mais já passou por isso? [31:04] Isso acontece com frequência? [31:06] Ou será que estou apenas irritado com uma decisão de nomenclatura que [31:10] outra pessoa tomou há 12 anos? [31:12] Não se prender demais a essa última questão pode economizar muito tempo. [31:17] Pense nas suas aplicações Rails de novo por um segundo. [31:20] Qual foi uma coisa que você encontrou, digamos, nos últimos 30 dias, [31:24] que te fez parar e pensar: “Que porra é essa?” Não escolha o maior problema [31:28] arquitetônico para esse exemplo. [31:30] Escolha apenas algo comum. [31:31] Talvez seja uma etapa estranha de configuração que você parece sempre [31:35] esquecer de executar, ou um aviso que todo mundo já aprendeu a [31:39] ignorar, ou um comentário referindo-se a um sistema ou fornecedor que você não [31:43] ouviu ninguém mencionar durante sua integração, ou um tempo limite definido [31:47] exatamente em 47 segundos por algum motivo bem específico. [31:56] Então, começamos a analisar. [31:57] E é nessa análise que separamos o que presumimos do que [32:00] realmente podemos aprender. [32:02] Então, talvez comecemos com um pouco de “arqueologia” aqui. [32:05] Como isso chegou até aqui? [32:06] Que problema alguém estava tentando resolver? [32:09] Que limitações existiam naquela época? [32:11] Afinal, um código que hoje parece ridículo pode ter feito todo o [32:15] sentido há seis anos. [32:18] É aqui que precisamos evitar pular diretamente de “hmm” para [32:21] “eu sei como resolver isso”. [32:22] Portanto, antes de mudarmos qualquer coisa, vamos reunir algumas evidências. [32:25] Vamos acompanhar o comportamento por tempo suficiente para que possamos, então, [32:29] explicar o que realmente está acontecendo. [32:30] Analise o ambiente de produção, faça medições, examine o histórico e [32:33] identifique a alteração que causou o problema. [32:35] Faça o trabalho que você mesmo pode realizar. [32:38] Então, se você ainda precisar de mais informações, tente encontrar alguém [32:42] que possa se lembrar do motivo. [32:43] Mas, às vezes, aquele engenheiro ou pessoa original pode já não trabalhar mais lá. [32:48] O que você faz nesse caso? [32:49] Isso me deixou curioso. [32:51] Até que ponto os desenvolvedores estão dispostos a serem procurados por causa de [32:55] uma decisão que tomaram em uma base de código há 5 anos, quando já nem [32:59] trabalhavam mais na empresa? [33:02] Você já fez isso? [33:03] Então, fiz uma enquete bem pouco científica no X e no LinkedIn. [33:06] Para minha alegria, depois de pouco mais de 200 respostas, [33:10] cerca de 8 em cada 10 desenvolvedores disseram que estariam dispostos a ajudar. [33:16] Então, talvez seja legal explorar um pouco mais o Git Blame. [33:18] Dê uma olhada no LinkedIn. [33:19] Mas, de qualquer forma, ainda recomendo que todos vocês [33:22] façam o dever de casa primeiro. [33:25] E, às vezes, esse trabalho de casa mostra que o que chamou sua atenção está lá por [33:30] um motivo perfeitamente válido, o que é ótimo. [33:32] Entender por que algo deve permanecer já é um avanço. [33:35] Depois, fazemos ajustes. [33:37] Esses ajustes, basicamente, são o momento em que testamos [33:40] o que achamos que aprendemos. [33:41] Isso não significa mudar as coisas aleatoriamente. [33:45] Então, antes de mexer em qualquer coisa, anote o que você espera que aconteça. [33:50] Essa parte leva talvez apenas 30 segundos, e muitas vezes as pessoas a ignoram. [33:54] Em seguida, faça a menor alteração reversível que lhe forneça [33:58] alguma informação útil. [33:59] Esse é o objetivo: informação. [34:01] Experimentar não precisa necessariamente resultar na solução definitiva. [34:06] Às vezes, descobrir que você estava errado em sua suposição é o resultado mais útil. [34:11] E compartilhar é um passo que, na minha opinião, muitas equipes [34:15] simplesmente ignoram por completo. [34:16] E isso não significa postar no Slack: “Ei, aprendi algo bem estranho hoje”. [34:21] Compartilhar significa transformar o que você aprendeu em algo que a próxima [34:25] pessoa possa realmente usar. [34:26] E há muitas maneiras de compartilhar o que aprendemos. [34:30] Parte disso envolve anotar coisas, documentar restrições, registrar decisões, [34:34] mas compartilhar nem sempre se resume apenas à documentação. [34:38] Talvez criemos uma ferramenta para que ninguém precise se lembrar das soluções [34:42] alternativas inusitadas, ou mostremos a outra pessoa como algo funciona. [34:45] O objetivo é devolver ao ambiente o que aprendemos, para que a próxima [34:49] pessoa não precise redescobrir isso. [34:53] Pense naquela empresa do início. [34:55] Ao longo dos anos, ela havia experimentado diversas abordagens, mas não havia [34:59] fechado o ciclo de forma consistente. [35:01] Assim, os engenheiros que vieram depois herdaram quatro respostas igualmente [35:05] plausíveis para a mesma questão. [35:07] Muito bem, vamos aplicar isso a alguns exemplos comuns aqui. [35:10] Digamos que você entre em uma empresa e esteja analisando o método `order. [35:14] save` em seu código-fonte. [35:16] Parece algo bastante comum, só que aciona callbacks, que, por sua vez, [35:19] geram tarefas, transmissões, auditorias e invalidação de cache. [35:22] Aparentemente, isso atualiza um sistema de estoque de armazém que ninguém [35:26] mencionou durante sua integração. [35:27] O que diabos está acontecendo aqui? [35:29] Então, ficamos nos perguntando o que realmente acontece. [35:32] Daí, analisamos a situação. [35:33] Rastreamos os callbacks. [35:35] Mapeamos os efeitos colaterais. Analisamos os detalhes. [35:37] Fazemos nosso trabalho, certo? Depois, vamos ajustando. [35:39] Talvez consigamos isolar um desses efeitos colaterais estranhos e atribuí-lo [35:42] a algo com um nome mais explícito. [35:44] Talvez, em um ambiente seguro, possamos desativar temporariamente algumas [35:48] callbacks e ver o que muda quando chamamos o método. [35:50] Depois, compartilhamos. [35:51] Fizemos todo esse trabalho para entender o que acontece quando chamamos `order. [35:55] save`. [35:55] Não deixe esse conhecimento apenas na sua cabeça. [35:58] Talvez possamos, por exemplo, adicionar um diagrama do Mermaid para [36:01] incluir isso no repositório, ou, pelo menos, colocar um esboço na wiki. [36:05] Coloque o que aprendemos em algum lugar onde a próxima pessoa [36:08] possa realmente usar isso. [36:10] Aqui está outro exemplo. [36:11] Imagine que você se depare com um middleware que ninguém mexe desde 2018. [36:15] Ele faz a limpeza de alguns caracteres Unicode. [36:18] Esse é um exemplo real que encontramos. [36:21] O Unicode de alguma solicitação recebida indica que ele deve ser removido assim que [36:24] o aplicativo móvel antigo for descontinuado. [36:25] Você tem quase certeza de que o aplicativo móvel já havia sido descontinuado [36:28] antes mesmo de você ser contratado. [36:34] Será que podemos excluir isso, nos perguntamos? [36:36] Verificamos o histórico. [36:37] Começamos a analisar. [36:38] Acontece que isso foi adicionado depois de um fim de semana terrível, em que tivemos [36:42] centenas de erros de produção no Bugsnag. [36:44] Há muito tempo atrás. [36:46] Tudo bem, isso é um pouco mais interessante do que o comentário sugeria. [36:49] Então, vamos dar uma ajustada. [36:51] Não, você não apaga isso imediatamente. [36:52] Talvez a gente adicione um pouco de instrumentação ou alguns [36:55] registros de log e espere. [36:56] E, uma semana depois, descobrimos que ele foi acionado mais 41 vezes. [37:00] Nenhuma delas vem de um aplicativo móvel que tenha sido efetivamente descontinuado. [37:05] Elas vêm de um rastreador em um dos webhooks de um de seus parceiros. [37:08] Hmm. [37:08] Talvez nada mude em relação ao comportamento, mas o comentário muda. [37:12] Agora, a próxima pessoa sabe por que ele ainda existe e o que ainda depende dele. [37:16] Esse é um resultado útil. [37:18] Porque nem tudo que é antigo está errado, e o objetivo não é eliminar cada [37:22] detalhe estranho do nosso código. [37:24] O objetivo é distinguir as peculiaridades intencionais das que foram esquecidas. [37:28] Mais uma vez, você não precisa sair procurando por um monte dessas coisas. [37:32] E o complicado é que você provavelmente já nem percebe mais algumas das suas [37:36] próprias soluções alternativas. [37:39] Elas já se tornaram parte da sua maneira de trabalhar. [37:42] Mas você provavelmente consegue identificar as de outras pessoas. [37:45] Então, faça o que as boas equipes de produto fazem. [37:48] Observe alguém trabalhando nesse ambiente. [37:50] Sente-se ao lado de alguém ou trabalhe em dupla com essa pessoa remotamente, [37:54] não importa como, e observe-a enquanto realiza tarefas rotineiras. [37:59] Resista à tentação de intervir e simplesmente ajudá-los ou [38:01] dizer a eles como fazer. Apenas observe, fique de olho. [38:05] Talvez eles também não saibam identificar suas próprias soluções alternativas. [38:10] Onde eles fazem uma pausa? [38:11] O que eles onde eles repetem? [38:12] O que eles parecem estar evitando? [38:14] Onde eles desenvolveram suas próprias soluções alternativas esquisitas? [38:17] E fique de olho nos seus agentes e nos agentes deles também, ou nos seus agentes. [38:22] Eles ainda não aprenderam seus truques. [38:26] Uma observação rápida. [38:27] A Queue nunca mandaria ninguém embora de mãos vazias, então tem um presentinho na [38:30] sua sacola de brindes para segunda-feira, quando você voltar para a sua oficina. [38:34] Mas antes de voltar para a sua oficina, imagine por um momento que você [38:38] não fosse voltar de jeito nenhum. [38:39] Gosto de usar esse exercício quando estou tentando entender onde uma equipe carrega [38:43] consigo um contexto não documentado. [38:45] Vamos imaginar que hoje será seu último dia trabalhando no seu aplicativo. [38:49] Você está saindo e não vai mais voltar. [38:50] Não precisamos entrar em detalhes sobre o motivo; isso é assunto entre você e o RH. [38:53] Mas você precisa escrever uma carta para quem vai assumir o seu lugar. [38:59] Já dá para fazer isso no aplicativo Keynote da DHH? [39:04] Caro substituto, seja bem-vindo ao grupo. [39:07] Esta é, em grande parte, uma aplicação Rails normal, [39:10] exceto por ponto, ponto, ponto. [39:12] Você respondeu rápido demais. [39:13] O que há de estranho nas suas aplicações? [39:16] Sobre quais partes você os alertaria? [39:18] Quais comandos eles devem evitar executar? [39:20] Quais aspectos dependem do contexto que você sabe muito bem que não [39:22] estão escritos em lugar nenhum? [39:26] E, para ganhar pontos extras, peça a alguns de seus colegas de trabalho [39:30] que escrevam suas próprias cartas e, em seguida, compare-as. [39:33] Eles alertam sobre as mesmas coisas? [39:35] Será que um engenheiro sabe de uma restrição que ninguém mais menciona? [39:38] Pois o que você está colocando no papel é, basicamente, a tradição oral [39:42] que sua equipe vem transmitindo. [39:44] E provavelmente há algo útil escondido nessa lacuna entre o que o [39:47] aplicativo diz e o que a equipe sabe. [39:50] Essa lacuna também faz parte do seu workshop. [39:52] Recentemente, realizamos a Pesquisa da Comunidade Rails 2026. [39:55] Agradecemos a todos que participaram. [39:57] Os resultados da pesquisa serão divulgados em breve. [39:59] Perguntamos às pessoas quais são as maiores dificuldades que elas enfrentam [40:02] ao ingressar em um projeto já existente. [40:05] E as respostas foram bastante reveladoras. [40:07] A número 1 apontou para a compreensão do modelo de domínio e da lógica de negócios. [40:11] A número 2, a compreensão de código antigo ou herdado. [40:14] E a número 3, a falta de documentação. [40:16] Provavelmente, isso não é tão surpreendente assim. [40:20] Há um padrão aqui. [40:21] A dificuldade não está necessariamente em descobrir como escrever o [40:24] próximo trecho de código. [40:26] Está em compreender o sistema que acabaram de herdar. [40:28] Provavelmente nada disso é tão surpreendente, mas nos indica para onde [40:32] devemos olhar: para os pontos em que o entendimento comum é fraco [40:35] e a redescoberta é onerosa. [40:38] Então, onde devemos investir nosso tempo? [40:40] Acho que essas melhorias se enquadram, de certa forma, em três grandes categorias. [40:45] Primeiro, tornar o caminho claro. [40:47] Suponha que sua equipe esteja adicionando integrações regularmente. [40:51] Uma abordagem é dizer às pessoas: “Encontrem a mais recente e usem-na como [40:55] inspiração”, o que é ótimo — até que isso se torne um experimento. [41:01] Ou você pode transformar o que a equipe aprendeu em algo como um gerador, [41:05] capaz de criar a configuração de classe esperada, o tratamento de erros, [41:10] os fixtures, os stubs, a documentação — tudo o que deve [41:13] constar em cada uma dessas integrações. [41:16] Essa decisão passa então a ser executável. [41:19] Pessoas podem usá-lo, agentes podem usá-lo, e os revisores [41:22] reconhecem e apreciam a consistência. [41:25] Porque uma instrução no repositório diz: “é assim que trabalhamos na aplicação”; um [41:30] exemplo canônico diz: “é isso que queremos dizer no momento”; e um gerador diz: [41:35] “comece por aqui” — todos eles reduzem o número de opções plausíveis. [41:40] Mas o gerador vai um passo além. [41:42] Isso oferece um ponto de partida, em vez de você ter que interpretar um. [41:47] É a alavancagem no estilo Rails aplicada ao seu ambiente de trabalho local. [41:51] E, quanto aos agentes, pelo menos eu gostaria de pensar que [41:55] prefiro muito mais fornecer a eles um gerador que reflita as expectativas atuais [42:00] da equipe do que pedir que vasculhem o repositório, encontrem 242 exemplos [42:04] plausíveis e, então, sinteticem o 143º. [42:07] Mas talvez os agentes simplesmente contornem isso de qualquer maneira. [42:11] Em segundo lugar, vamos tornar o feedback rápido e confiável. [42:15] Porque um feedback rápido que te engana não adianta nada. [42:18] E um feedback demorado que todo mundo simplesmente ignora [42:20] também não adianta nada. [42:23] Todo ambiente de engenharia tem esses, digamos, manuais do usuário ocultos [42:27] que ninguém realmente escreveu. [42:28] Ninguém os revisou nem aprovou. [42:30] Mas todo mundo acaba aprendendo a lidar com eles. [42:32] Você aprende a não executar mais o conjunto completo de testes [42:35] localmente porque demora muito. [42:37] Você aprende que o ambiente de teste raramente é tão confiável assim. [42:41] Você descobre quais avisos todo mundo parece ignorar. [42:43] Ninguém colocou essas regras por escrito, mas o ambiente as ensinou. [42:47] E os agentes simplesmente herdam esse mesmo manual de instruções oculto. [42:50] Eles ainda precisam aguardar nossa integração contínua (CI). [42:53] Ainda precisam decidir se uma falha realmente tem algum significado. [42:58] Porque, quando associamos um agente de codificação rápido a um ciclo de feedback [43:02] lento e pouco confiável, ainda estamos tendo que operar dentro [43:05] de um sistema lento e pouco confiável. [43:07] Então, onde todo mundo está esperando? [43:09] O que leva 40 minutos quando poderia levar apenas 5? [43:11] Que erros fazem as pessoas ficarem vasculhando conversas estranhas no Slack? [43:15] Que feedback chega tão tarde que você já passou para a próxima tarefa? [43:20] No entanto, nem toda verificação precisa ser instantânea. [43:23] Algumas provavelmente devem levar algum tempo. [43:25] Outras devem ocorrer um pouco mais perto da fase de produção. [43:29] Mas o objetivo é obter a quantidade certa de feedback na fase certa do [43:32] trabalho que você está realizando. [43:34] Bem, anteriormente falei sobre a fila e como talvez seja possível melhorar o [43:38] ambiente em torno da missão, mas há outra versão dessa ideia [43:41] que me toca um pouco mais de perto. [43:44] Embora eu seja músico, acho que, talvez em outra vida, [43:47] ser técnico de guitarra teria sido um dos empregos dos meus sonhos. [43:51] Quando eu era mais jovem, queria ser o músico no palco. [43:55] Acabei vindo parar aqui, no palco. [43:57] Mas hoje em dia consigo valorizar de verdade a pessoa que garante que o músico [44:02] no palco possa fazer bem o seu trabalho. [44:04] Porque um bom técnico de guitarra conhece o repertório. [44:08] Eles sabem qual guitarra é necessária para a próxima música. [44:11] Estão afinando-a antes mesmo que alguém peça. [44:13] Estão atentos ao que está acontecendo no palco. [44:15] Se algo começa a dar errado, eles já estão por perto tentando [44:18] ajudar a resolver o problema. [44:20] E, depois do show, estão consertando o que quer que tenha causado problemas esta [44:23] noite, para que, com sorte, ninguém precise lidar com isso novamente amanhã. [44:28] Eles estão constantemente atentos ao ambiente ao redor da apresentação. [44:32] E, à primeira vista, claro, eles estão trabalhando para o músico, mas, [44:36] na verdade, estão trabalhando para o público. [44:38] E, no fim das contas, é para quem estamos trabalhando: [44:41] as pessoas que usam nosso software. [44:45] A terceira categoria consiste em tornar mais barato reverter os erros. [44:49] Observe que eu não disse “evitar erros”, o que é uma ambição linda, [44:54] mas um modelo operacional péssimo. [44:56] Com que frequência sua equipe diz: “Vamos descobrir?” [45:02] Se cada experiência parecer irreversível, adivinhem só? [45:05] As pessoas param de experimentar. [45:07] Não por preguiça, mas porque estão gerenciando riscos. [45:11] Quando a recuperação de erros sai mais barata, as pessoas podem ficar [45:15] mais dispostas a explorar. [45:17] Já vimos como isso deixa de acontecer. [45:19] Uma implantação, uma migração, um arquivo de configuração esquecido e, [45:23] de repente, três engenheiros passam os próximos dois dias depurando [45:26] o ambiente de produção. [45:27] O erro em si não foi o que custou caro. [45:29] O que custou caro foi a recuperação. [45:31] E, depois de alguns incidentes como esse, a equipe aprende uma lição. [45:35] É preciso ter cuidado. [45:36] Não toque nisso. Chame mais gente para a sala. [45:39] Vamos esperar até segunda-feira antes de lançar isso. [45:42] Esse medo passa a fazer parte do nosso workshop. [45:45] Portanto, parte da melhoria do ambiente consiste em mudar essa forma de pensar. [45:50] Flags de recurso, migrações reversíveis, ambientes de pré-visualização, [45:54] implantações menores. [45:56] Todas essas são formas de nos proporcionar um espaço mais seguro para cometer erros. [46:00] Elas não eliminam os erros. [46:02] Simplesmente tornam a recuperação mais econômica. [46:07] Porque, quando a recuperação é fácil, você vai explorar. [46:09] Mas, quando a recuperação é assustadora, você aprende a não mexer nas coisas. [46:17] E, em todas as três categorias, há mais uma coisa que podemos [46:20] fazer: reduzir as opções obsoletas. [46:22] Pois cada padrão abandonado que ainda está presente transmite a mensagem de que “bem, [46:27] essa é uma das maneiras como fazemos as coisas por aqui”. [46:31] Isso altera o que o sistema ensina. [46:33] E, como engenheiros, tendemos a pensar que o impacto vem da adição de algo. [46:38] Às vezes, isso ocorre ao remover algo que ninguém deveria mais estar usando. [46:43] A exclusão é uma decisão arquitetônica. [46:50] E, às vezes, melhorar a oficina significa construir uma ferramenta. [46:53] É isso mesmo. Às vezes, significa etiquetar uma gaveta. [46:56] E, às vezes, significa explicar por que aquela ferramenta estranha [46:59] ainda precisa estar lá. [47:01] O objetivo é tornar a maneira preferida de fazer as coisas um pouco mais óbvia [47:05] para quem ou o que vier depois. [47:08] Aquela empresa, no início desta palestra, achava que precisava de alguém de fora e [47:12] de alguns especialistas para identificar a arquitetura certa. [47:15] Mas provavelmente não havia uma resposta perfeita. [47:17] Havia, porém, uma opção que se encaixava bem o suficiente no sistema que eles [47:21] tinham naquele momento para documentar, testar, gerar, revisar de forma [47:24] consistente e aprimorar posteriormente. [47:26] O que eles precisavam era de alguém disposto a dizer: “Já aprendemos o [47:30] suficiente com esses experimentos. [47:31] Agora vamos fazer assim.” [47:34] Não para sempre, apenas o tempo suficiente para deixar de tomar a mesma decisão [47:38] de forma independente todas as vezes. [47:40] E acho que isso pode estar acontecendo dentro de suas bases de código, [47:43] em seus workshops. [47:44] Vocês estão trabalhando com base em decisões tomadas para momentos diferentes. [47:48] Algumas provavelmente ainda fazem sentido, mas outras eram temporárias. [47:52] Algumas foram deixadas acidentalmente por um ex-colega de trabalho. [47:56] E, anos depois, não há nada que realmente indique qual é qual. [48:00] Mais uma vez, infelizmente, todas ainda estão escritas com [48:04] aquela mesma maldita fonte. [48:06] Então, quando algo fizer você parar para pensar, quero que você preste [48:10] um pouco mais de atenção nisso. [48:12] Quero que você siga essa curiosidade. [48:14] Quero que você entenda o que está acontecendo antes de se [48:18] apressar em consertar. [48:21] E quando você aprender algo útil, dê à próxima pessoa um ponto de partida. [48:26] Porque outra pessoa vai acabar trabalhando nessa parte do código. [48:29] Ela pode entrar na equipe daqui a seis meses, ou pode ser um colaborador que [48:31] apareça amanhã de manhã sem ter conhecimento de nenhuma das soluções [48:34] alternativas que você já acumulou. [48:38] Mais uma vez, nem sempre precisamos ser o Bond. [48:41] Às vezes, o trabalho que vale a pena é ser o Q, colocar uma ferramenta [48:45] melhor nas mãos de outra pessoa. [48:47] Para garantir que a próxima missão exija um pouco menos de heroísmo. [48:53] Porque os engenheiros que geram maior impacto não serão apenas aqueles que [49:01] produzem mais dentro da oficina, mas sim aqueles que a aprimoram. [49:08] Obrigado. Obrigado, Robby.