<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcelo Palladino "Palla"</title>
    <description>The latest articles on DEV Community by Marcelo Palladino "Palla" (@marcelofpalladino).</description>
    <link>https://dev.to/marcelofpalladino</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3030696%2Fc9590446-364e-4f08-be55-af5994dd71df.jpeg</url>
      <title>DEV Community: Marcelo Palladino "Palla"</title>
      <link>https://dev.to/marcelofpalladino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marcelofpalladino"/>
    <language>en</language>
    <item>
      <title>Seu time trocou o refinamento pelo plan mode, e ninguém mais precisa se falar</title>
      <dc:creator>Marcelo Palladino "Palla"</dc:creator>
      <pubDate>Mon, 10 Aug 2026 01:28:57 +0000</pubDate>
      <link>https://dev.to/marcelofpalladino/seu-time-trocou-o-refinamento-pelo-plan-mode-e-ninguem-mais-precisa-se-falar-3d1k</link>
      <guid>https://dev.to/marcelofpalladino/seu-time-trocou-o-refinamento-pelo-plan-mode-e-ninguem-mais-precisa-se-falar-3d1k</guid>
      <description>&lt;p&gt;A &lt;strong&gt;BruLethy&lt;/strong&gt; era gerente sênior de dados numa das maiores empresas de tecnologia do mundo, e pediu demissão depois de oito anos lá dentro. Ela &lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c" rel="noopener noreferrer"&gt;gravou um vídeo&lt;/a&gt; contando por quê, e faz questão de dizer, no meio da própria história, que não foi culpa da inteligência artificial.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Eu não quero ser hipócrita em dizer que a minha vida foi destruída pelas inteligências artificiais. Eu vi como o meu trabalho foi potencializado, mas a forma com que isso foi implementado e a cobrança em cima disso foi o que transbordou o meu copo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c&amp;amp;t=621s" rel="noopener noreferrer"&gt;BruLethy, aos 10:21&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Guarde essa ressalva, porque ela é dela e vai na direção contrária deste texto, que passa daqui em diante falando do que a IA mudou. Eu acho que as duas coisas cabem. A ferramenta é a mesma para todo mundo. O que mudou foi o que ela tornou possível uma gestão fazer.&lt;/p&gt;

&lt;p&gt;O que aconteceu com ela foi uma reestruturação. Tiraram os analistas do time e, no lugar de gente, entregaram agentes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ao invés deles me darem pessoas para me ajudar, um time para me ajudar, eles me deram algumas inteligências artificiais que eu podia agora colocar para trabalhar para mim 24 horas por dia, sete dias por semana. Então os limites do que era humanamente possível de ser feito não existiam mais."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c&amp;amp;t=540s" rel="noopener noreferrer"&gt;BruLethy, aos 09:00&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E ela era boa nisso. Como sênior, batia o olho na saída do modelo e via o erro rápido. A recompensa por render bem foi mais área, mais projeto e mais agente, até chegar no ponto que ela descreve como cinco projetos planejados sozinha, com cinco modelos diferentes, para entregar tudo no mesmo dia.&lt;/p&gt;

&lt;p&gt;Isso tem nome, e eu venho usando ele há três anos. Só que o nome vem depois. Primeiro a frase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A IA não destruiu a colaboração. Ela removeu a obrigatoriedade dela.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Colaborar era necessidade estrutural de quem não conseguia segurar o problema inteiro sozinho. Hoje uma pessoa com um agente segura, e entrega. E o que vira opcional deixa de acontecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que dava mais medo era depender de uma pessoa só
&lt;/h2&gt;

&lt;p&gt;Em 2023 eu subi &lt;a href="https://www.youtube.com/watch?v=kuNj29Uu35M" rel="noopener noreferrer"&gt;no palco do TDC&lt;/a&gt; com uma frase que tinha acabado de escrever para &lt;a href="https://builder.aws.com/content/2fmLHThOhoYEONmzGUFsx1qVKKd/12-devops-best-practices-that-make-deploying-on-fridays-less-scary" rel="noopener noreferrer"&gt;um artigo sobre o que faz o deploy dar menos medo&lt;/a&gt;, publicado em inglês no Builder Center da AWS. &lt;strong&gt;Nada corrompe mais a cultura DevOps do que o heroísmo&lt;/strong&gt;. Repeti a sessão várias vezes desde então, e a última gravada é do &lt;a href="https://www.youtube.com/watch?v=gO7PI9Urft4" rel="noopener noreferrer"&gt;DevOpsDays Campinas de 2025&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A frase nasceu de um exercício simples. Eu queria entender o que exatamente me dava medo na hora de colocar alguma coisa em produção, depois de descontar ferramenta, automação e testes. Sobrava uma coisa só. Me dava medo subir código sabendo que, se desse problema, existia uma única pessoa capaz de resolver.&lt;/p&gt;

&lt;p&gt;O ponto que eu defendo nessa sessão é que herói não é falha da pessoa. É falha de liderança. Ninguém acorda querendo ser o único que sabe mexer em uma parte específica do sistema. A pessoa vai acumulando contexto, os outros vão saindo, a organização não cria mecanismo nenhum para espalhar aquilo, e um dia ela olha em volta e está sozinha segurando um pedaço da empresa. Os dois lados dessa moeda são ruins. Eu já estive nos dois.&lt;/p&gt;

&lt;p&gt;O que mudou de 2023 para cá é o tempo que leva para produzir um herói.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes o herói se formava por acidente
&lt;/h2&gt;

&lt;p&gt;Reparem na ordem dos acontecimentos no relato dela. Uma decisão de reestruturação, tomada de uma vez, removeu o time e colocou capacidade de máquina no lugar. O desgaste de anos que costuma produzir esse tipo de dependência foi pulado inteiro. E foi apresentada como melhoria de cargo. A frase dela é "voltei a ser uma super analista, super super sênior".&lt;/p&gt;

&lt;p&gt;É o herói sendo fabricado e comemorado dentro do mesmo processo.&lt;/p&gt;

&lt;p&gt;Ela também viveu os dois lados da moeda ao mesmo tempo, o que eu nunca tinha visto acontecer com a mesma pessoa. Era a única capaz de revisar aquele volume, e dependia inteiramente de um sistema que precisava conferir sozinha. Os dois papéis colapsaram em uma cadeira só.&lt;/p&gt;

&lt;p&gt;E o exercício que eu proponho na palestra para justificar tudo isso para a gestão, que é perguntar quanto custa se essa pessoa sair do time, acabou de rodar em público. Ela saiu. Passou por burnout, terapia e medicação antes de sair, e conta no vídeo que, ao conversar com os colegas, descobriu que não era só ela.&lt;/p&gt;

&lt;h2&gt;
  
  
  As cerimônias não eram amadas, eram obrigatórias
&lt;/h2&gt;

&lt;p&gt;Tem um trecho no vídeo dela que é a descrição mais precisa de mob programming que eu já vi, escrita por alguém que não usa esse nome e que está falando no passado.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Quando a gente tinha um problema que não conseguia resolver sozinho, o que a gente fazia? A gente chamava pessoas que a gente confiava, que a gente admirava intelectualmente. A gente sentava numa sala, mostrava o problema, todo mundo ali interagia colaborativamente para resolver esse problema e a gente chegava numa solução. E aquilo ali não existia mais, porque agora você só precisava escrever um prompt bem bonito e jogar para a inteligência artificial."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c&amp;amp;t=701s" rel="noopener noreferrer"&gt;BruLethy, aos 11:41&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.youtube.com/watch?v=ifZKpp_o5k0" rel="noopener noreferrer"&gt;Mano Deyvin assistiu e comentou esse vídeo ao vivo no canal dele&lt;/a&gt;, e ataca pelo outro lado, o do processo. Ele desenha a esteira antiga inteira no quadro, discovery, kickoff, priorização, planning, pré-refinamento, refinamento, e diz que com IA isso morreu. E aí o Henrique Breim, no chat, fecha o assunto melhor do que os dois.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Refinamento hj é plan mode do claude"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=ifZKpp_o5k0&amp;amp;t=686s" rel="noopener noreferrer"&gt;@HenriqueBreim, no chat do Mano Deyvin, aos 11:26&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ninguém nunca acordou feliz para o pré-refinamento. Aquilo funcionava porque estava no calendário e não dependia de alguém querer, e o efeito colateral de estar no calendário é que uma vez por semana o time inteiro era empurrado para dentro da mesma sala, olhando para o mesmo problema, com as mesmas dúvidas.&lt;/p&gt;

&lt;p&gt;O que removeram do processo foi justamente o que mantinha a colaboração de pé sem depender de vontade. E o que sobra quando a sala para de acontecer é o que ela conta no vídeo, &lt;strong&gt;semanas seguidas sem falar com ninguém sobre nada que não fosse uma entrega&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  60% preferem trabalhar sozinhos, e não estão errados
&lt;/h2&gt;

&lt;p&gt;O Mano Deyvin rodou uma enquete ao vivo durante a transmissão. 60% do chat dele preferem trabalhar sozinhos com IA. 40% preferem trabalhar com pessoas. O chat responde coisas como "somos antissociais" e "solta o Claude Code na minha mão". &lt;/p&gt;

&lt;p&gt;É enquete de chat ao vivo, autosselecionada, e sem número de respondentes divulgado. Serve como sintoma, e é assim que eu vou usar.&lt;/p&gt;

&lt;p&gt;O sintoma é a outra metade do mecanismo. A preferência por trabalhar sozinho sempre existiu. O que sustentava a sala de pé, mesmo contra ela, era a obrigatoriedade. Some a obrigatoriedade, some a sala. E isso também significa que qualquer proposta que dependa das pessoas passarem a gostar de sentar juntas já nasce morta.&lt;/p&gt;

&lt;p&gt;Ele mesmo, que passou o vídeo inteiro defendendo o lado humano, fecha com uma fronteira que eu acho mais precisa do que qualquer coisa que eu tinha formulado antes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Quando você tá numa empresa muito grande, tomar decisão sozinho com uma IA é ruim, é bom ter mais gente. Mas agora como um programador entregando task, solta o Claude Code na minha mão."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=ifZKpp_o5k0&amp;amp;t=1477s" rel="noopener noreferrer"&gt;Mano Deyvin, aos 24:37&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Grupo na decisão. Sozinho com o agente na execução.&lt;/p&gt;

&lt;p&gt;Isso resolve a tensão inteira, e é exatamente a ordem que a gente acabou seguindo sem ter formulado assim.&lt;/p&gt;

&lt;h2&gt;
  
  
  A revisão virou o trabalho, e ninguém está formando sênior
&lt;/h2&gt;

&lt;p&gt;A parte mais forte dele é quando desenha o fluxo e mostra onde a IA ajuda e onde não ajuda. Discovery e mão na massa, resolvido. Revisão, não. A frase dele é que você tem muito mais trabalho validando do que criando.&lt;/p&gt;

&lt;p&gt;Eu falei uma coisa parecida no DevOpsDays de 2025, e falei de forma absoluta demais. Disse que não faz o menor sentido gerar código com IA e depois botar IA para revisar. A parte que se sustenta é a da responsabilidade, e eu mantenho cada palavra dela. Se eu subo código para produção, eu respondo por aquele código, tendo usado assistente ou não. A parte que envelheceu mal é o absoluto. Revisão assistida como primeira passada, com uma pessoa assinando embaixo do merge, funciona e vai acontecer.&lt;/p&gt;

&lt;p&gt;Só que isso parte a revisão em duas, e as duas metades têm destinos diferentes. Ler o diff e apontar o que está estranho é delegável, e cada vez mais. Decidir quando desconfiar do resultado, e em que ponto parar, não é. A máquina assume a primeira. A segunda fica inteira com a pessoa, e é ela que exige &lt;strong&gt;repertório&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Só que o Mano Deyvin faz uma observação que fecha a armadilha. Escalar o time não resolve o gargalo de revisão, porque revisão exige alguém sênior. E aí volta o trecho mais grave do vídeo dela.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Agora era mais fácil pedir para escrever um código SQL do que ensinar o cara que acabou de chegar a escrever e corrigir os erros dele."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c&amp;amp;t=748s" rel="noopener noreferrer"&gt;BruLethy, aos 12:28&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Quem toma essa decisão todo dia fica sem sênior em poucos anos. E sem sênior não existe a revisão que acabamos de estabelecer como o gargalo. Sai barato hoje e cobra caro depois, porque formar sênior leva anos e a conta só chega quando já não dá tempo de formar ninguém. &lt;/p&gt;

&lt;p&gt;Mob programming é a resposta que eu tenho aqui, e a primeira versão dela está errada. A primeira versão é colocar quem sabe menos vendo quem sabe mais decidir, o que pressupõe alguém na sala com o repertório pronto.&lt;/p&gt;

&lt;p&gt;Não tem. Saber quando desconfiar de um agente é conhecimento novo, e os sêniores de hoje não adquiriram isso em lugar nenhum, porque não havia onde. Eu inclusive.&lt;/p&gt;

&lt;p&gt;Então não é transmissão, é construção. E a diferença importa mais do que parece. Quando o grupo constrói o julgamento junto, em cima de um problema de verdade, ele nasce distribuído. Quando uma pessoa constrói sozinha, ele nasce concentrado, e a gente já sabe onde isso termina.&lt;/p&gt;

&lt;p&gt;E aqui eu preciso separar duas senioridades que eu vinha tratando como uma. A antiga é repertório de domínio e de código, leva anos, e é ela que a decisão de pedir o SQL ao modelo em vez de ensinar quem chegou está destruindo. A nova é saber desconfiar do agente, e essa se constrói em meses, porque nem existia até outro dia.&lt;/p&gt;

&lt;p&gt;Só que a nova depende inteiramente da antiga. Ninguém desconfia de um resultado sem ter repertório para achar estranho o que está ali. E é por isso que destruir a formação da primeira inviabiliza a segunda, mesmo a segunda sendo rápida de construir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escrever skill é externalização, e a espiral não fecha
&lt;/h2&gt;

&lt;p&gt;Nonaka e Takeuchi já descreveram isso, e melhor do que eu. Eles descrevem quatro movimentos possíveis entre conhecimento tácito e explícito, formando uma espiral que gira porque o explícito volta a virar tácito no fim, e só um dos quatro dispensa documento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw3tplpzo0o07o8rsj8ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw3tplpzo0o07o8rsj8ev.png" alt="Quadro de dois por dois com os quatro movimentos. Socialização, de tácito para tácito, está destacada, com mob programming, pair programming e sessão de whiteboard como exemplos. Os outros três são externalização, onde entram pull request, playbook, RFC e skill de agente, mais internalização e combinação." width="799" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tem um detalhe nesse quadro que eu só enxerguei há pouco tempo. Quando a gente escreve uma skill para um agente, que é um documento de instruções que ele carrega e executa sozinho, está fazendo externalização, exatamente como quem escreve um playbook. A diferença aparece depois, em quem lê. Playbook uma pessoa lê, aplica, e aquilo vira reflexo, então a espiral gira. Skill o agente executa, e a volta para o tácito simplesmente não acontece.&lt;/p&gt;

&lt;p&gt;Dá para entregar cada vez mais assim, indefinidamente, sem que ninguém tenha aprendido no caminho. É a mesma conta do parágrafo anterior, vista pelo outro lado.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que a gente fez no Dati Labs, e por que o resultado não foi código
&lt;/h2&gt;

&lt;p&gt;O Dati Labs é a área de IA e modernização da Dati, e o que nos ocupa é entender o que muda no jeito de trabalhar quando agentes entram no trabalho para valer.&lt;/p&gt;

&lt;p&gt;Em julho o time inteiro passou um dia em cima de um problema de cliente que ninguém tinha resolvido antes, com voz em tempo real e avatar apresentando ao vivo em palco. Nada parecido com o dia a dia de ninguém ali.&lt;/p&gt;

&lt;p&gt;Estamos construindo um time, e eu queria fazer isso com problema real em vez de exercício, porque exercício todo mundo sabe que é exercício e ninguém se compromete de verdade com o resultado. E queria que a gente exercitasse programar com IA em grupo, e não cada um na sua máquina descobrindo sozinho o que funciona.&lt;/p&gt;

&lt;p&gt;O formato foi uma sessão longa de sabatina com o agente de IA no meio e com a condução mudando de mão o tempo todo ao longo do dia. A pessoa da vez assume o problema e leva as perguntas da sala inteira até a decisão ficar de pé, e então passa adiante. Todo mundo passou pela cadeira.&lt;/p&gt;

&lt;p&gt;A troca de mão tinha um artefato. Virava um documento escrito na hora, endereçado a quem assumia a cadeira, com o estado da discussão e a regra de como continuar. E a regra é a parte que interessa aqui. Se algo já decidido parecer errado, desafie uma vez, em voz alta, e deixe o time decidir, que é antiheroísmo escrito dentro do processo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvs0wm8njtbka5w21kd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvs0wm8njtbka5w21kd5.png" alt="Terminal mostrando o agente escrevendo um documento de handoff endereçado à próxima pessoa da sessão, com o estado da discussão, a skill em uso e a regra de não reabrir decisões já fechadas." width="800" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em algum ponto do dia o quadro branco entrou. Não estava planejado e não durou muito, uns cinco minutos, o tempo de desenhar o orquestrador no meio, as peças em volta, e colocar o time todo na mesma página.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F309i7hbtvsbypvs8o0ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F309i7hbtvsbypvs8o0ob.png" alt="Diagrama feito à mão num quadro branco digital. No centro, um círculo escrito orquestrador. Em volta, ligados por setas, os blocos contexto geral, falas em modo apresentador, gerenciamento de memória, mediador, start, título, primeiro slide e segundo slide." width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No fim do dia não havia código de produção. Havia uma especificação escrita e mais de sessenta tarefas especificadas e prontas para desenvolvimento.&lt;/p&gt;

&lt;p&gt;Isso me obrigou a atualizar a minha própria palestra. Nas duas gravações eu descrevo mob programming como gente revezando no teclado, quinze ou vinte minutos cada, resolvendo um problema de código de forma colaborativa. Foi assim que eu aprendi programação funcional nos meus primeiros dias no Nubank, todo torto, sem saber as teclas de atalho direito, e foi o período em que eu mais aprendi lá.&lt;/p&gt;

&lt;p&gt;Mob programming já estava na lista de antídotos contra o heroísmo que eu publiquei naquele artigo de 2023, junto com pair programming, game days e sessões de whiteboard. E o quadro branco está naquela lista por um motivo específico, que é impedir que a arquitetura desça pronta da cabeça de uma pessoa só.&lt;/p&gt;

&lt;p&gt;O teclado hoje é onde o agente trabalha. Então o que o time produz junto deixou de ser apenas o código e passou a ser aquilo que o agente vai consumir depois. O mecanismo continua o mesmo. Mudou o artefato que sai da sala no fim do dia.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fign5shw4dqkaigy7anc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fign5shw4dqkaigy7anc0.png" alt="Dois fluxos comparados. No primeiro, o time inteiro vai para um teclado e o resultado é código escrito por pessoas. No segundo, o time inteiro discute com um agente na conversa, produz uma especificação com sessenta tarefas, e o mesmo agente executa depois aquilo que o time decidiu." width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Toda sexta o time inteiro junto
&lt;/h2&gt;

&lt;p&gt;Hoje esse projeto está na mão de um desenvolvedor. Uma pessoa sozinha com um agente é, ponto por ponto, a configuração que quebrou a gerente do vídeo, e é o arranjo que produz herói mais rápido que qualquer outro que eu já tenha visto.&lt;/p&gt;

&lt;p&gt;Por isso o time inteiro para trinta minutos toda sexta-feira. E o combinado é explícito quanto ao que aquilo não é. Não é reunião de status de tarefa. Quem está no projeto conta o avanço e, principalmente, o método. O combinado até aqui é escolher um projeto por vez e tornar isso um hábito. Estamos só no começo disso. &lt;/p&gt;

&lt;p&gt;A palavra que carrega peso ali é &lt;strong&gt;método&lt;/strong&gt;. Status qualquer um extrai do repositório, de uma ferramenta de tarefas, e um agente extrai melhor e mais rápido do que a gente. Por que a pessoa desconfiou do agente naquele ponto específico, o que ela tentou antes, e o que fez ela mudar de ideia, isso não está em commit nenhum.&lt;/p&gt;

&lt;p&gt;Nas minhas sessões eu compartilho uma prática parecida chamada &lt;strong&gt;rotação do bombeiro&lt;/strong&gt;. A ideia original é rodar quem fica de plantão, semana a semana, para que o time inteiro aprenda a apagar incêndio e ninguém acabe sendo o único que sabe. Esta sexta-feira que estamos colocando no Dati Labs é a mesma mecânica aplicada a conhecimento em vez de incidente, e &lt;strong&gt;ela entrou na agenda antes de existir um herói para dissolver&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Naquele artigo de 2023 eu escrevi que a organização pronta para fazer deploy na sexta é a que entende que cultura de time vale mais que talento individual. Ironicamente, nossa reunião é às sextas-feiras. Só que agora deployment não é o assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que ainda não sabemos
&lt;/h2&gt;

&lt;p&gt;Isso foi um dia, num projeto. É anedota, não evidência, e eu não vou fingir o contrário.&lt;/p&gt;

&lt;p&gt;O que a anedota ilustra, porém, não é anedota. O &lt;a href="https://cloud.google.com/resources/content/2025-dora-ai-assisted-software-development-report" rel="noopener noreferrer"&gt;relatório da DORA de 2025&lt;/a&gt;, com quase cinco mil profissionais ouvidos, achou três coisas que conversam direto com este texto. A adoção de IA passou a ter relação positiva com throughput, o que é uma virada em relação a 2024. Ela continua tendo relação negativa com estabilidade de entrega. E 30% relatam pouca ou nenhuma confiança no código que a IA gera, o que o relatório lê como necessidade de capacidade crítica de validação.&lt;/p&gt;

&lt;p&gt;Aceleração expondo fraqueza mais adiante no fluxo, e validação virando a habilidade escassa. É o mesmo mecanismo que eu descrevi aqui, medido em escala que eu não tenho.&lt;/p&gt;

&lt;p&gt;Falta dizer o que me faria mudar de ideia, porque admitir que é anedota é honestidade sobre a evidência e não sobre a tese. Em seis meses de sexta-feira eu vou olhar duas coisas. Se alguém de fora do projeto conseguir contar o método em voz alta, funcionou. Se a pauta começar a escorregar para status sem ninguém ter decidido isso, virou mais uma reunião no calendário e eu conto aqui.&lt;/p&gt;

&lt;p&gt;Também não vou fingir que é uma prática confortável. Na minha sessão eu conto que já trabalhei com gente que simplesmente não entrava no mob, e a parte irônica é que costumavam ser justamente as pessoas com quem eu mais teria aprendido. Expor o que você não sabe na frente do time é desconfortável, e é legítimo que seja. Sem cultura de confiança construída antes, isso não funciona, vira constrangimento e o time abandona na segunda tentativa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Créditos
&lt;/h2&gt;

&lt;p&gt;A ideia de que heroísmo é anti-padrão não é minha. Ela está em &lt;a href="https://itrevolution.com/product/the-phoenix-project/" rel="noopener noreferrer"&gt;The Phoenix Project&lt;/a&gt;, no personagem do Brent, está no &lt;a href="https://www.oreilly.com/library/view/effective-devops/9781491926291/ch05.html" rel="noopener noreferrer"&gt;Effective DevOps&lt;/a&gt;, de Jennifer Davis e Ryn Daniels, que trata heroísmo entre os anti-padrões culturais.&lt;/p&gt;

&lt;p&gt;E está na DORA. O &lt;a href="https://cloud.google.com/resources/content/2025-dora-ai-assisted-software-development-report" rel="noopener noreferrer"&gt;State of AI-assisted Software Development de 2025&lt;/a&gt; achou sete perfis de time por análise de cluster, e um deles é o hero team, que entrega com qualidade e impacto sobre uma fundação instável apoiada em heroísmo individual em vez de processo. Eu escrevi uma frase com superlativo em cima de um problema que a comunidade já tinha nomeado, e a frase é o que eu reivindico, não o diagnóstico.&lt;/p&gt;

&lt;p&gt;O quadro dos quatro movimentos tem duas datas, e vale separar. Os quatro padrões de conversão entre tácito e explícito já estão no &lt;a href="https://hbr.org/1991/11/the-knowledge-creating-company-2" rel="noopener noreferrer"&gt;artigo que o Nonaka publicou sozinho na Harvard Business Review em 1991&lt;/a&gt;, onde o tácito para explícito se chama articulação. Os nomes que eu uso aqui, externalização inclusive, vêm do livro de 1995, com o Takeuchi. Vale uma correção que eu preciso fazer em mim mesmo. No artigo de 2023 eu escrevi que revisão de código transfere conhecimento tácito por socialização, com essa palavra. No palco, eu apresento três dos quatro movimentos e deixo a socialização de fora. Escrevi certo e falei errado por dois anos.&lt;/p&gt;

&lt;p&gt;Mob programming também não é invenção nossa, e eu usei o termo o texto inteiro sem dizer de onde ele vem. A prática foi nomeada pelo &lt;a href="https://mobprogramming.org/" rel="noopener noreferrer"&gt;Woody Zuill&lt;/a&gt; e pelo time dele, e o desenho original é o time inteiro no mesmo problema, ao mesmo tempo, no mesmo espaço e no mesmo computador. O que eu descrevo aqui, com a sessão terminando em especificação em vez de código, é um desvio desse desenho. O desvio é meu, e a crítica sobre ele também deve vir para mim. Vale dizer que parte da comunidade hoje prefere chamar a prática de ensemble programming.&lt;/p&gt;

&lt;p&gt;E o &lt;a href="https://www.youtube.com/watch?v=4AAzr-rQP9c" rel="noopener noreferrer"&gt;vídeo&lt;/a&gt; que abre este texto é &lt;a href="https://www.youtube.com/@Bru_Lethy" rel="noopener noreferrer"&gt;da BruLethy&lt;/a&gt;, com o &lt;a href="https://www.youtube.com/watch?v=ifZKpp_o5k0" rel="noopener noreferrer"&gt;comentário ao vivo do Mano Deyvin&lt;/a&gt; por cima. Os dois merecem ser assistidos inteiros, e a discordância entre eles é mais interessante do que a concordância.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ifZKpp_o5k0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>braziliandevs</category>
      <category>career</category>
    </item>
    <item>
      <title>O detalhe que decide se o seu radar de tecnologia vive ou morre</title>
      <dc:creator>Marcelo Palladino "Palla"</dc:creator>
      <pubDate>Mon, 20 Jul 2026 13:26:17 +0000</pubDate>
      <link>https://dev.to/marcelofpalladino/o-detalhe-que-decide-se-o-seu-radar-de-tecnologia-vive-ou-morre-1o4i</link>
      <guid>https://dev.to/marcelofpalladino/o-detalhe-que-decide-se-o-seu-radar-de-tecnologia-vive-ou-morre-1o4i</guid>
      <description>&lt;p&gt;Em 2022, eu e o Francisco Edilton (&lt;a href="https://builder.aws.com/community/heroes/FranciscoEdilton" rel="noopener noreferrer"&gt;Chico, AWS Community Hero&lt;/a&gt;) nos encontrávamos todas as terças-feiras, sete da noite no horário do Brasil, para escrever a &lt;a href="https://www.herobuzz.com.br/arquivo/" rel="noopener noreferrer"&gt;HeroBuzz&lt;/a&gt;. Ele em Lisboa, eu em São Paulo. A newsletter era a desculpa. O que a gente realmente fazia era jogar conversa fora.&lt;/p&gt;

&lt;p&gt;A maioria das pessoas olha para uma hora marcada no calendário e pergunta quanto tempo aquilo vai durar. Comigo e com o Chico a pergunta sempre é como aproveitar melhor esse tempo. E era nessa "perda de tempo" que apareciam as histórias que compartilhamos na HeroBuzz. Coisas que a gente tinha visto dar errado, times que quebraram do mesmo jeito em organizações que não tinham nada a ver uma com a outra, decisões óbvias em retrospecto que ninguém tomou na hora. De vez em quando uma delas era boa demais para morrer ali, e um de nós dizia "e se a gente escrevesse sobre isso?".&lt;/p&gt;

&lt;p&gt;Foi assim que nasceu a &lt;a href="https://ckarchive.com/b/p9ueh9hvpe87" rel="noopener noreferrer"&gt;edição #33&lt;/a&gt;, em abril daquele ano. Na semana anterior tínhamos falado sobre o Technology Radar da ThoughtWorks e como ele é organizado. Naquela, pegamos o gancho para falar sobre por que uma organização poderia querer criar um radar próprio. Escrevemos sobre conhecimento concentrado em poucas cabeças, sobre o efeito copia e cola entre times, sobre stack que cresce sem gestão até virar problema de segurança. E terminamos com uma pergunta ao leitor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nós conhecemos algumas organizações que se beneficiariam muito de um radar próprio. E você, acha que faz sentido para a sua realidade? Quais seriam os anéis e quadrantes do radar para sua organização?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Era muito fácil escrever aquilo. A gente estava olhando de fora.&lt;/p&gt;

&lt;p&gt;Há 45 dias assumi a direção de AI &amp;amp; Modernization na &lt;a href="https://www.dati.com.br/" rel="noopener noreferrer"&gt;Dati&lt;/a&gt; e estou liderando as iniciativas do Dati Labs. A pergunta voltou endereçada a mim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boas ideias param na máquina de quem as teve
&lt;/h2&gt;

&lt;p&gt;Essa cena eu já tinha visto se repetir em lugares que não tinham nada em comum, e levei tempo para entender que era sempre a mesma cena.&lt;/p&gt;

&lt;p&gt;Alguém chega numa conversa e diz que a tecnologia "X" está muito melhor que as outras tecnologias que usamos na empresa. Qual é a prova? Não existe. É uma impressão legítima, formada por alguém competente, que não vira decisão de ninguém porque não tem lastro nem lugar para morar. Ou alguém inicia uma iniciativa que outro time já estava tocando havia semanas. Repare que aí ninguém errou. Os dois times fizeram exatamente o que se esperava deles, com autonomia e velocidade. O desperdício aconteceu do mesmo jeito.&lt;/p&gt;

&lt;p&gt;Velocidade individual produz desperdício coletivo quando não existe um canal para as pessoas saberem umas das outras. E o problema é difícil de combater porque nunca se apresenta como falha. Ele se apresenta como movimento. Todo mundo ocupado, todo mundo entregando, e a organização andando menos do que se espera. É um dos sintomas clássicos de falta de coordenação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Duas formas de escalar engenharia
&lt;/h2&gt;

&lt;p&gt;Para simplificar a discussão aqui, podemos dizer que existem dois jeitos de organizar isso.&lt;/p&gt;

&lt;p&gt;O primeiro é o time opinativo. A stack está decidida e o desenvolvedor não gasta julgamento escolhendo ferramenta. Ele gasta julgamento no negócio. Isso escala muito bem e entrega rápido, e quem despreza esse modelo normalmente nunca precisou sustentar cinquenta times ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;O segundo é o time onde experimentar é normal e até esperado. Você compra capacidade de descobrir coisas e paga em dispersão. No caso do Dati Labs, é o modelo certo. Nosso trabalho é justamente descobrir, e a gente não descobre nada sem experimentar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Dati Labs é a área de AI &amp;amp; Modernization da Dati, e o que nos ocupa é a transformação do trabalho com IA agêntica. A pergunta que a gente quer responder é o que muda no jeito de fazer as coisas quando agentes passam a participar do trabalho para valer, e como isso vai se refletir nas organizações, nos processos e no software.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Dati Labs, autonomia é uma escolha deliberada. É como acreditamos que se constrói um time que precisa explorar tecnologia em constante mudança. Só que essa escolha tem uma conta, e a conta é transparência.&lt;/p&gt;

&lt;h2&gt;
  
  
  A conta da autonomia
&lt;/h2&gt;

&lt;p&gt;Autonomia cria imediatamente dois desafios de comunicação que não existiam antes.&lt;/p&gt;

&lt;p&gt;O primeiro é para cima. Como comunicar à liderança o que o time está explorando? Se a resposta for uma apresentação que você monta de vez em quando, com o que lembrar na véspera, então a autonomia do time está apoiada na sua memória, e isso não sobrevive a nenhum trimestre difícil. E, principalmente, não sobrevive à sua saída. Líderes vêm e vão, a organização continua. Quem está acima de você não vai retomar decisões por má-fé. Vai retomar porque ninguém consegue defender o que não enxerga.&lt;/p&gt;

&lt;p&gt;O segundo é para os lados. Como permitir que seu time aprenda com outros times, e que outros times aprendam com o seu? Colaboração entre áreas não acontece por boa vontade. Acontece quando existe alguma coisa visível para colaborar em cima.&lt;/p&gt;

&lt;p&gt;Foi aí que a ficha caiu sobre o que eu mesmo tinha escrito quatro anos atrás. Autonomia sem transparência produz desperdício com aparência de produtividade. E a transparência que resolve isso não é um relatório produzido por alguém, porque relatório tem a assinatura e o recorte de quem o produziu. Tem que ser um artefato que pertence ao time, que qualquer um consegue ler, e que continua existindo independente de quem está na sala.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transparência morre quando é cara
&lt;/h2&gt;

&lt;p&gt;Essa é a parte que eu subestimei em 2022, e é onde a maioria das tentativas fracassa.&lt;/p&gt;

&lt;p&gt;Se contribuir com o artefato exigir ter uma opinião formada, ninguém contribui. A pessoa viu um lançamento interessante numa quinta-feira à noite, não tem tempo de avaliar, não quer ou não tem tempo para se posicionar sobre aquilo depois, e simplesmente não registra. A ideia volta a morrer na máquina de quem a teve, agora com um processo bonito por cima.&lt;/p&gt;

&lt;p&gt;O que resolveu isso para o Dati Labs foi separar duas coisas que parecem uma só. Registrar e julgar.&lt;/p&gt;

&lt;p&gt;Registrar precisa ser quase gratuito. Nome, categoria, link, data. Ninguém precisa ter opinião para colocar algo na fila, e colocar não significa endossar. Julgar é um passo separado e deliberado, que acontece depois, com calma e critério. Quando você mistura os dois, obriga cada pessoa a chegar com posição pronta, e o custo disso silencia justamente quem tem menos tempo e mais contexto de campo.&lt;/p&gt;

&lt;p&gt;Essa separação é o que tenho de mais transferível para oferecer aqui, e ela não depende de ferramenta nenhuma.&lt;/p&gt;

&lt;p&gt;Vale dizer o que pode dar errado do meu lado da mesa. Radar interno pode virar cemitério de blips (cada item registrado no radar) com uma facilidade impressionante, e quase sempre pelo mesmo motivo. Alguém confunde o artefato com o processo e começa a exigir campos, revisão e reunião de curadoria. O custo de entrada sobe, o mecanismo passa a servir a si mesmo, e o time volta a decidir por fora mantendo a aparência por dentro. Quando ninguém alimenta, a primeira hipótese que eu tenho que considerar é que eu tornei a entrada ou a avaliação cara demais.&lt;/p&gt;

&lt;p&gt;Baixar esse custo de entrada e de avaliação é, por si só, um desafio e tanto. E é exatamente o tipo de coisa que IA agêntica resolve muito bem. No Dati Labs a gente já começou a usar agentes para isso. Mas esse é assunto para outro texto.&lt;/p&gt;

&lt;h2&gt;
  
  
  O radar começa como espelho
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgxl7rif8k8lp1dpxdxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgxl7rif8k8lp1dpxdxx.png" alt="Radar de Adoção do Dati Labs: gráfico circular com os mesmos quatro quadrantes e quatro anéis. Usando, Validando, Explorando e Descartado — representando a postura do Labs sobre o que já avaliou, o que está em produção e o que foi descartado." width="800" height="807"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cheguei imaginando que o trabalho inicial seria montar um mecanismo para decidir o que vem pela frente. Errei a ordem.&lt;/p&gt;

&lt;p&gt;Quando você chega a uma organização que já entrega muito, não está diante de uma folha em branco. As pessoas já entregaram projetos, já resolveram problemas difíceis, já formaram opinião sólida sobre um monte de coisa. Já existe postura. Talvez ela só não seja recuperável por ninguém além de quem a formou. Fica viva no julgamento de cada pessoa e invisível para todas as outras ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Descobrir isso não depende de epifania. É conversando com as pessoas e entendendo o contexto. Influência se constrói conhecendo as pessoas e o terreno, e eu passei as primeiras semanas aprendendo bem mais com o meu time do que o contrário. É um time talentoso e eu tenho sorte de trabalhar com eles.&lt;/p&gt;

&lt;p&gt;Então o primeiro trabalho de um radar não é decidir nada. É dar nome ao que já é verdade. Você registra a postura que o time já tem antes de começar a triar o que chega de fora, e só depois de existir esse espelho é que faz sentido montar o filtro.&lt;/p&gt;

&lt;h2&gt;
  
  
  A matriz de fronteira e relevância do Dati Labs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5todpgiwz8d53grhulk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk5todpgiwz8d53grhulk.png" alt="Radar de Fronteira do Dati Labs: gráfico circular dividido em quatro quadrantes (Técnicas, Ferramentas, Plataformas &amp;amp; Serviços, Modelos &amp;amp; Frameworks) e quatro anéis concêntricos — Mergulhar, Acompanhar, Observar e Passar. Com lançamentos numerados triados por fronteira e relevância." width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando o filtro entra em cena, a tentação é ordenar tudo por novidade. Achamos que essa é a régua errada, e ela é o motivo de tanta gente boa gastar a semana correndo atrás do que está mais barulhento na timeline. O hype pelo hype.&lt;/p&gt;

&lt;p&gt;No Dati Labs, a gente usa duas perguntas, e a segunda pesa mais que a primeira.&lt;/p&gt;

&lt;p&gt;A primeira é sobre o &lt;strong&gt;potencial de mudança&lt;/strong&gt;: &lt;em&gt;isso muda o teto do que era possível, reabrindo casos que a gente considerava inviáveis, ou melhora muito alguma coisa que já dava para fazer?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A segunda é sobre &lt;strong&gt;relevância&lt;/strong&gt;: &lt;em&gt;isso toca os nossos clientes e/ou a nossa stack, ou é interessante para o mundo e distante do que a gente entrega e da estratégia?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Percebe? No limite, tudo é interessante. Então ter uma régua de relevância é fundamental para não desperdiçar energia.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Perto do nosso jogo&lt;/th&gt;
&lt;th&gt;Longe do nosso jogo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Muda o teto do que é possível&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anel 1: Mergulhar.&lt;/strong&gt; Testar agora.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anel 3: Observar.&lt;/strong&gt; De longe.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Melhora o que já era possível&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anel 2: Acompanhar.&lt;/strong&gt; De perto, sem correr.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anel 4: Passar.&lt;/strong&gt; Registrar e seguir.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A relevância pesar mais é o que muda o resultado, o que é um tanto contraintuitivo, se você pensar bem. Mas vem comigo, uma coisa impressionante que não toca no seu jogo, que não conversa com a  estratégia de negócio, merece menos energia do que uma coisa entediante que toca. Faz sentido? Pense nisso como &lt;strong&gt;antídoto&lt;/strong&gt; para o "isso aqui está muito melhor agora" solto numa conversa de corredor, porque a régua nos leva a completar a frase.&lt;/p&gt;

&lt;p&gt;"Melhor para quê? Melhor para quem? Melhor quanto?"&lt;/p&gt;

&lt;p&gt;Na mesma semana avaliamos duas novidades da mesma categoria, do mesmo fornecedor. As duas eram boas. Mas apenas uma reabria casos de uso que antes eram inviáveis para nós. A outra apenas melhorava uma solução que já funcionava. Pela régua do hype, elas competiriam pela mesma priorização. Pela nossa régua de fronteira x relevância, tiveram destinos diferentes. Uma foi para teste imediato, para o mergulho, enquanto a outra foi para acompanhamento. Nenhum dos dois foi ignorado. Registrar o segundo é o que impede o time de reavaliar a mesma coisa do zero daqui a três meses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Créditos
&lt;/h2&gt;

&lt;p&gt;Nada disso é invenção nossa. O Technology Radar da ThoughtWorks é a técnica original, e a ThoughtWorks mantém o &lt;a href="https://github.com/thoughtworks/build-your-own-radar" rel="noopener noreferrer"&gt;build-your-own-radar&lt;/a&gt; aberto justamente para que qualquer empresa monte o seu.&lt;/p&gt;

&lt;p&gt;O que mudou não foi a técnica, foi a pressão. O Technology Radar é um retrato curado e periódico. Ele não foi desenhado para a vazão diária de lançamentos que a gente vive hoje, o que não é defeito nenhum, é escopo. Na prática, quando a entrada acelera desse jeito, você precisa de um lugar separado para o que chegou e ainda não foi julgado. Se a fila de triagem se misturar com a lista de posturas, as duas perdem sentido, porque você deixa de saber o que foi decidido e o que só foi anotado. Foi por isso que acabamos com dois níveis, um para o que está chegando e outro para o que já é postura, com uma ponte entre eles para o que sobrevive ao teste.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que ainda não sabemos
&lt;/h2&gt;

&lt;p&gt;Estamos bem no começo disso. O que queremos construir é justamente uma forma de fazer com que as pessoas do time da Dati se sintam confortáveis em contribuir, mesmo sem certeza de que aquilo vale a pena. O mecanismo é o meio para que isso aconteça, não o objetivo.&lt;/p&gt;

&lt;p&gt;Em 2022 eu e o Chico perguntamos aos leitores quais seriam os anéis e quadrantes do radar da empresa deles. A pergunta continua valendo. Só que hoje eu sei que escolher os anéis é a parte fácil. A parte difícil é alimentar e manter aquilo numa terça-feira comum, com entrega pressionando e ninguém cobrando.&lt;/p&gt;

&lt;p&gt;Me pergunte de novo daqui a seis meses.&lt;/p&gt;




&lt;p&gt;Se você também está pensando em como a IA agêntica transforma o trabalho e as organizações, &lt;a href="https://www.linkedin.com/in/mfpalladino/" rel="noopener noreferrer"&gt;entre em contato comigo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>leadership</category>
      <category>software</category>
      <category>career</category>
    </item>
    <item>
      <title>Speech-to-Speech AI: From Dr. Sbaitso to Amazon Nova Sonic</title>
      <dc:creator>Marcelo Palladino "Palla"</dc:creator>
      <pubDate>Wed, 09 Apr 2025 14:34:14 +0000</pubDate>
      <link>https://dev.to/aws/speech-to-speech-ai-from-dr-sbaitso-to-amazon-nova-sonic-51nc</link>
      <guid>https://dev.to/aws/speech-to-speech-ai-from-dr-sbaitso-to-amazon-nova-sonic-51nc</guid>
      <description>&lt;p&gt;I will never forget a certain night in the 1990s. It must have been around 1992 or 1993 - I was at my friend Junior's house, crowded with a bunch of other kids around his parents' computer. I am pretty sure it was a 386, or maybe a 286? All I knew back then was that it had a fancy multimedia kit. The source of our fascination was a program called Dr. Sbaitso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuh29f3mh6gww5ka07ta.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuh29f3mh6gww5ka07ta.jpg" alt="Dr. Sbaitso"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Released by Creative Labs, Dr. Sbaitso was one of the first computer chat programs, created to demonstrate the capabilities of the Sound Blaster sound card. The name is actually an acronym for "Sound Blaster Artificial Intelligent Text to Speech Operator" &lt;em&gt;(to be honest, I only learned it while I was writing this article)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The system simulated a digital psychotherapist and became known for its sometimes strange responses and its characteristic robotic voice. It was quite limited in its interactions. One of its most famous phrases was "TELL ME MORE ABOUT THAT”, which it frequently repeated during conversations, back then, with our cluelessness, it felt we were living in a sci-fi movie. &lt;/p&gt;

&lt;p&gt;"Can you fall in love?" while everyone laughed beside me.&lt;/p&gt;

&lt;p&gt;"TELL ME MORE ABOUT THAT", it would respond with its characteristic artificial voice.&lt;/p&gt;

&lt;p&gt;We would not give up. We spent hours making up stories, creating scenarios, trying to convince that digital therapist to fall in love with one of our friends. With each disconnected response, we laughed more and tried even more hard.&lt;/p&gt;

&lt;p&gt;It's funny how these memories stick with you. That clunky old PC with its robotic voice seems almost prehistoric now, but it was pure magic to us back then. Three decades later, I'm still amazed every time I think about how far we've come. During this time, the way people and machines interact has changed dramatically. From those first tries with voice synthesis, through different assistant experiments, up to the AI assistants that are now just part of our daily lives. And now here I am, working with &lt;a href="https://aws.amazon.com/ai/generative-ai/nova/speech?trk=92ed481f-0929-405b-acc1-5857a9852861&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Nova Sonic&lt;/a&gt; and &lt;a href="https://aws.amazon.com/bedrock?trk=92ed481f-0929-405b-acc1-5857a9852861&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Bedrock&lt;/a&gt;, building the kind of natural conversations I could only dream about back then.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Amazon Nova Sonic
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/ai/generative-ai/nova/speech?trk=92ed481f-0929-405b-acc1-5857a9852861&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;Amazon Nova Sonic&lt;/a&gt; is a model that does everything together. Instead of the way where you needed different models and separate steps for STT (Speech-to-Text), processing, and TTS (Text-to-Speech), Amazon Nova Sonic just handles everything in one go, processing audio real-time both ways through complete two-way streaming. This means you can build systems that keep all the important stuff like tone, emotions, and how people actually talk throughout the whole conversation.&lt;/p&gt;

&lt;p&gt;Let me show you a quick demo to see how this works. Meet &lt;strong&gt;DR ANSMUE&lt;/strong&gt; &lt;em&gt;(Amazon Nova Sonic Model Usage Example)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpbtrm424xftnp9n1fqp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frpbtrm424xftnp9n1fqp.jpg" alt="DR ANSMUE sample in action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Yeah, I know it is not super original. But cut me some slack, ok?&lt;/em&gt; In this example, users can submit their code and chat with our "code therapist" about whatever code they sent in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn0639jo885f8qkg4gda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyn0639jo885f8qkg4gda.png" alt="DR ANSMUE architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Under the hood&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What I'm going to show you here is based on the Bidirectional Audio Streaming sample (the one using Amazon Nova Sonic and Amazon Bedrock with TypeScript) that you can find in the &lt;a href="https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech" rel="noopener noreferrer"&gt;Amazon Nova Sonic Speech-to-Speech Model Samples&lt;/a&gt;. So, instead of getting into all the specific technical details of this sample, I'll focus on walking you through the key things you need to know for build this kind of application.&lt;/p&gt;

&lt;p&gt;When the user starts talking, the web frontend gets the audio from the microphone using WebAudio API and sends it to the server through WebSockets. On the server side, we have got the &lt;code&gt;StreamSession&lt;/code&gt; class that manages the audio chunks and puts them in line for processing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audioInput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Convert base64 string to Buffer&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audioBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Stream the audio&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;streamAudio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works in collaboration with the &lt;code&gt;S2SBidirectionalStreamClient&lt;/code&gt; class, which handles the back-and-forth communication using &lt;code&gt;AsyncIterable&lt;/code&gt; to create a two-way stream with Amazon Bedrock, using the new capabilities of Amazon Bedrock SDK.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;createSessionAsyncIterable&lt;/code&gt; method in &lt;code&gt;S2SBidirectionalStreamClient&lt;/code&gt; creates an iterator that feeds into the &lt;code&gt;InvokeModelWithBidirectionalStreamCommand&lt;/code&gt;, a new invoke way from the Amazon Bedrock SDK, sending those audio chunks (in base64) to Amazon Nova Sonic. At the same time, processResponseStream handles what comes back from the Amazon Berock, figuring out the audioOutput and textOutput it receives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;createSessionAsyncIterable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;AsyncIterable&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InvokeModelWithBidirectionalStreamInput&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;asyncIterator&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IteratorResult&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InvokeModelWithBidirectionalStreamInput&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Wait for items in the queue or close signal&lt;/span&gt;
          &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;race&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
              &lt;span class="nf"&gt;firstValueFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queueSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;
              &lt;span class="nf"&gt;firstValueFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;closeSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;take&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;

          &lt;span class="c1"&gt;// Get next item from the session's queue&lt;/span&gt;
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
          &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Actual invocation of the bidirectional stream command&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bedrockRuntimeClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvokeModelWithBidirectionalStreamCommand&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;modelId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;amazon.nova-sonic-v1:0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;asyncIterable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;S2SBidirectionalStreamClient&lt;/code&gt; keeps track of what is happening using the data structure &lt;code&gt;SessionData&lt;/code&gt;, controlling signals, and event handlers. When the model comes back with something, it goes back through the same WebSocket to the frontend, where the browser plays it using WebAudio API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;processResponseStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jsonResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;textOutput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;textOutput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jsonResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jsonResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;audioOutput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;audioOutput&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jsonResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audioOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of this happens right away. The &lt;code&gt;streamAudioChunk&lt;/code&gt; method in &lt;code&gt;StreamSession&lt;/code&gt; manages a queue through &lt;code&gt;audioBufferQueue&lt;/code&gt;, which avoids things from getting overloaded and keeps all the audio data in the right order, so conversations feel natural and smooth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;processAudioQueue&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isProcessingAudio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Process chunks in the queue&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audioBufferQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audioChunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;audioBufferQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;audioChunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;streamAudioChunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;audioChunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To make all of this work smoothly, we are using &lt;strong&gt;HTTP/2&lt;/strong&gt; to call the Amazon Bedrock. The cool thing is that, unlike HTTP, HTTP/2 lets us send multiple streams over the same connection. That is helpful to keep the audio flowing in both directions &lt;br&gt;
without delays. Another nice thing is performance. it compresses headers and figures out which parts to prioritize, so everything feels quicker and more natural. Especially when there is a lot going on at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nodeClientHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NodeHttp2Handler&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;requestTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sessionTimeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;disableConcurrentStreams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxConcurrentStreams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bedrockRuntimeClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BedrockRuntimeClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clientConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;us-east-1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;requestHandler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nodeClientHandler&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;In a nutshell&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It might look complex at first, but in a nutshell, what is happening is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User =&amp;gt; Server: User speaks into their microphone, and their voice travels to the server.&lt;/li&gt;
&lt;li&gt;Server =&amp;gt; Amazon Bedrock: The server forwards user voice to Amazon Bedrock, but &lt;strong&gt;&lt;em&gt;doesn't wait&lt;/em&gt;&lt;/strong&gt; for user to finish speaking.&lt;/li&gt;
&lt;li&gt;Amazon Bedrock =&amp;gt; Server: As soon as it can, Amazon Bedrock starts sending responses back to the server.&lt;/li&gt;
&lt;li&gt;Server =&amp;gt; User: The server immediately forwards the responses to user browser, which plays them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This all happens in near real-time, creating a natural conversation where responses can overlap with user speaking, just like in human conversations.&lt;/p&gt;

&lt;h2&gt;
  
  
  New possibilities
&lt;/h2&gt;

&lt;p&gt;It opens up a bunch of possibilities that used to feel super hard to achieve. Imagine calling customer support and being able to interrupt and actually fix something mid-sentence, instead of waiting for any pauses to finish. Or think about a virtual assistant joining your team meeting and just keeping up, responding like a real person instead of lagging behind.&lt;/p&gt;

&lt;p&gt;This kind of thing could be huge for accessibility too. People with visual or motor impairments could interact with systems more easily. And in classrooms, virtual tutors could actually listen and answer questions like a real conversation. Even live translation could feel smoother, like you’re actually talking to someone, not just waiting for a machine to catch up.&lt;/p&gt;

&lt;p&gt;Start building with AWS SDK's bidirectional streaming API, Amazon Nova Sonic and Amazon Bedrock today. Check the &lt;a href="https://aws.amazon.com/developer/generative-ai/bedrock?trk=92ed481f-0929-405b-acc1-5857a9852861&amp;amp;sc_channel=el" rel="noopener noreferrer"&gt;resources for developers to build, deploy, and scale AI-powered applications&lt;/a&gt; and &lt;a href="https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech" rel="noopener noreferrer"&gt;Amazon Nova Sonic Speech-to-Speech Model Samples&lt;/a&gt; to learn more about how to implement it in your own applications.&lt;/p&gt;

&lt;p&gt;As I write about these possibilities, I find myself increasingly eager to explore their practical applications. But before diving into new projects, I &lt;strong&gt;need&lt;/strong&gt; to try this one more time with DR ANSMUE:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Hey Doc, can you fall in love?” 💔&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xrgdImGP0t4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Made with ♥ from DevRel&lt;/p&gt;

</description>
      <category>amazonbedrock</category>
      <category>amazonnova</category>
      <category>ai</category>
      <category>speechtospeech</category>
    </item>
  </channel>
</rss>
