<?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>Forem: Rodrigo de Avila</title>
    <description>The latest articles on Forem by Rodrigo de Avila (@rdeavila).</description>
    <link>https://forem.com/rdeavila</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4573%2F42719812-9c69-46c2-9ad9-8e11c7b7adba.png</url>
      <title>Forem: Rodrigo de Avila</title>
      <link>https://forem.com/rdeavila</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/rdeavila"/>
    <language>en</language>
    <item>
      <title>A Liberdade da Contenção Deliberada</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:57:09 +0000</pubDate>
      <link>https://forem.com/rdeavila/a-liberdade-da-contencao-deliberada-4kob</link>
      <guid>https://forem.com/rdeavila/a-liberdade-da-contencao-deliberada-4kob</guid>
      <description>&lt;p&gt;A verdadeira liberdade e agilidade em engenharia não vêm da busca incessante por novas ferramentas, mas sim do domínio profundo de um conjunto tecnológico estável e deliberadamente limitado. A estratégia de "escolher tecnologia tediosa" não freia o progresso; pelo contrário, atua como um método sofisticado para acelerá-lo. Ao adotar soluções que minimizam a carga cognitiva e os atritos operacionais, as organizações permitem que suas equipes atinjam ciclos de iteração rápidos e sustentáveis, em total conformidade com a Lei de Boyd.  &lt;/p&gt;

&lt;p&gt;O modelo do GitLab é uma prova concreta e irrefutável de que essa abordagem é não apenas teórica, mas uma estratégia comprovada para desenvolver e escalar um produto de software complexo com notável rapidez. A disciplina do GitLab em otimizar o que já existe e em resistir à complexidade desnecessária é o pilar de sua agilidade.  &lt;/p&gt;

&lt;p&gt;Com o avanço da Inteligência Artificial, a relevância desses princípios apenas se intensificou. A capacidade da IA de gerar código aparentemente funcional, mas fundamentalmente falho, para tecnologias desconhecidas, transformou a falta de experiência de um risco em uma verdadeira responsabilidade. Nesse novo cenário, o conhecimento aprofundado de um &lt;em&gt;stack&lt;/em&gt; "tedioso" adquire um valor sem precedentes, tornando-se um pré-requisito para utilizar a IA de forma segura e eficaz, potencializando suas capacidades.  &lt;/p&gt;

&lt;p&gt;Em sua essência, a Estratégia da Estabilidade é profundamente humanocêntrica. Ela reconhece que o recurso mais valioso e finito de uma empresa não é o código ou a infraestrutura, mas a energia criativa, o foco e o bem-estar da equipe de engenharia. O fundamento psicológico da "Ignorância Produtiva" permite que os engenheiros aceitem as restrições tecnológicas, liberando seu potencial humano para resolver os desafios que realmente importam para o negócio e seus clientes.&lt;/p&gt;

&lt;p&gt;As empresas mais inovadoras frequentemente são as mais "tediosas" em sua base, pois construíram uma plataforma estável que lhes permite avançar com segurança e rapidez para o futuro.&lt;/p&gt;




&lt;p&gt;Obrigado por chegar até aqui! Esta é a minha primeira série de artigos, onde tento "despejar" um pouco dos meus pensamentos e de como os artigos que leio por aí ajudaram a moldar minhas crenças. Espero que tenha sido útil pra você.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>Estrutura estratégica para decisões tecnológicas</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:56:13 +0000</pubDate>
      <link>https://forem.com/rdeavila/estrutura-estrategica-para-decisoes-tecnologicas-3ha5</link>
      <guid>https://forem.com/rdeavila/estrutura-estrategica-para-decisoes-tecnologicas-3ha5</guid>
      <description>&lt;p&gt;Para os líderes de tecnologia, a síntese entre as filosofias de tecnologia tediosa, iteração rápida e as realidades da era da IA exige mais do que uma compreensão superficial; é preciso uma estrutura prática. Esta seção tem como objetivo traduzir essa filosofia em políticas concretas, oferecendo um modelo para fomentar uma cultura de engenharia eficaz, gerenciar a adoção de novas&lt;br&gt;
tecnologias e tomar decisões estratégicas de forma sistemática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultura de Engenharia Eficaz
&lt;/h2&gt;

&lt;p&gt;A cultura é o alicerce de qualquer estratégia tecnológica bem-sucedida. A liderança deve promover ativamente a estabilidade e a velocidade, redefinindo a métrica do sucesso. Em vez de focar apenas na adoção de novas tecnologias, os líderes devem valorizar as equipes que entregam valor de negócio de forma consistente e confiável. Isso inclui reconhecer e recompensar a manutenção de sistemas estáveis, a refatoração que simplifica a complexidade e a escolha pragmática de soluções "tediosas" que aceleram a entrega.&lt;/p&gt;

&lt;p&gt;A comunicação é vital. Os líderes precisam explicar o "porquê" dessas decisões, conectando diretamente a tecnologia menos glamorosa à redução do estresse operacional (menos chamadas de madrugada), ao aumento da velocidade da equipe (ciclos OODA mais rápidos) e à capacidade de priorizar a inovação do produto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base Psicológica: Ignorância Produtiva
&lt;/h2&gt;

&lt;p&gt;Para que uma estratégia seja eficaz, é fundamental que ela se baseie em um sólido alicerce psicológico na cultura da equipe, um conceito que Kent Beck denomina "Ignorância Produtiva". Isso implica cultivar um ambiente onde os engenheiros se sintam seguros para admitir suas lacunas de conhecimento e onde a aprendizagem direcionada seja mais valorizada do que a busca incessante por novidades tecnológicas.&lt;/p&gt;

&lt;p&gt;A promoção da ignorância produtiva se manifesta através de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Celebração da Maestria:&lt;/strong&gt; Reconhecer publicamente a expertise de especialistas em tecnologias já estabelecidas e o valor inestimável que eles agregam.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalização da Incerteza:&lt;/strong&gt; Incentivar questionamentos e a transparência da liderança ao admitir quando não possui todas as respostas sobre novas tecnologias.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foco no Aprendizado Direcionado:&lt;/strong&gt; Alocar tempo e recursos para que as equipes aprofundem seus conhecimentos em ferramentas estrategicamente importantes, em vez de permitir uma exploração tecnológica sem rumo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa mentalidade é o pilar humano que sustenta o funcionamento da estrutura de governança. Sem ela, qualquer processo formal seria percebido como uma barreira burocrática, em vez de uma ferramenta estratégica essencial para o sucesso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um Processo de Governança para Novas Tecnologias
&lt;/h2&gt;

&lt;p&gt;Para evitar um crescimento desordenado de tecnologias, as organizações devem implementar um processo formal para a avaliação e adoção de novas soluções. Este processo, inspirado nas recomendações de McKinley, deve funcionar como um filtro cuidadoso, e não como uma barreira burocrática. Os passos incluem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Definição Clara do Problema:&lt;/strong&gt; Antes de propor uma nova tecnologia, a equipe deve justificar por escrito por que a pilha tecnológica existente é inviável ou muito custosa para resolver o problema. Se o "problema" for apenas o desejo de usar uma tecnologia nova, a proposta deve ser rejeitada.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação de Baixo Risco:&lt;/strong&gt; Se a nova tecnologia for aprovada na etapa inicial, ela deve ser testada em uma área de negócio não crítica e de baixo risco. Isso permite que a equipe adquira experiência prática em produção e comprove o valor da tecnologia antes de uma adoção mais ampla.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compromisso de Substituição:&lt;/strong&gt; Caso a nova tecnologia seja redundante em relação a uma ferramenta já existente, sua adoção deve ser acompanhada de um plano e cronograma claros para migrar a funcionalidade da ferramenta antiga e, posteriormente, desativá-la. Isso evita a proliferação de soluções ótimas localmente que aumentam a complexidade geral.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Diretrizes para a Era da IA
&lt;/h2&gt;

&lt;p&gt;O processo de governança para a era da IA precisa ser aprimorado com diretrizes específicas, &lt;a href="https://www.brethorsting.com" rel="noopener noreferrer"&gt;conforme proposto por Brethorst&lt;/a&gt;. Estas regras servem como um importante controle de qualidade:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Capacidade de Revisão:&lt;/strong&gt; Antes de adotar uma nova tecnologia, questione: "Nossa equipe conseguiria revisar adequadamente o código de implementação gerado por IA para esta tecnologia?" Se a resposta for negativa, evite utilizá-la em projetos de missão crítica.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compreensão Aprofundada:&lt;/strong&gt; Se a equipe optar por usar um "token de inovação" para aprender uma nova tecnologia, ela deve se comprometer a investir tempo real para compreendê-la profundamente. Isso é essencial para verificar a exatidão das sugestões da IA, pois a simples ação de copiar e colar é inaceitável.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar Adoção Simultânea:&lt;/strong&gt; Não utilize as ferramentas de IA como justificativa para adotar múltiplas tecnologias novas (como uma nova linguagem, framework e infraestrutura) ao mesmo tempo. Isso compromete a capacidade de verificação adequada e multiplica os riscos.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Matriz de Decisão de Adoção de Tecnologia&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para colocar esses conceitos em prática, os líderes podem empregar uma ferramenta visual que auxilia na formulação e comunicação das decisões tecnológicas. A Matriz de Decisão de Adoção de Tecnologia posiciona as escolhas tecnológicas com base em duas dimensões cruciais: a relevância estratégica para o negócio e o nível de maturidade da tecnologia.&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;Tecnologia Nova&lt;/th&gt;
&lt;th&gt;Tecnologia "Tediosa"&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Importância Estratégica Alta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Aposta Estratégica: O Token de Inovação&lt;/strong&gt;  Este é o momento de investir estrategicamente um "token de inovação", direcionado a tecnologias com potencial de gerar uma vantagem competitiva crucial. Tal abordagem exige pesquisa aprofundada, prototipagem cuidadosa e uma gestão eficaz dos riscos envolvidos.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;O Core Tecnológico&lt;/strong&gt;  Este é o seu stack tecnológico fundamental, bem dominado, para o desenvolvimento de funcionalidades essenciais. Ele deve ser otimizado para o seu domínio específico, garantindo agilidade e confiabilidade. Nesse contexto, a inteligência artificial serve como um potente multiplicador de força.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Importância Estratégica Baixa&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;A Zona de Perigo de McKinley: Alto Risco, Baixa Recompensa&lt;/strong&gt;  Esta é a área a ser evitada a todo custo. Engenheiros que adicionam novas tecnologias "por diversão" acabam criando uma dívida operacional massiva, transformando um alto risco em uma baixa recompensa.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;O Cinto de Utilidades: A Escolha Inteligente para Soluções Não Críticas&lt;/strong&gt;  Esta é a opção ideal para funções de suporte que não são críticas. Priorize ferramentas já existentes e testadas, garantindo eficiência com o mínimo de complexidade. É a solução perfeita para tarefas rápidas e diretas.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Essa matriz orienta os líderes a fazer as perguntas essenciais antes de aprovar uma nova tecnologia: "Isso é um diferencial fundamental para o nosso negócio?" e "Qual é o perfil de risco dessa tecnologia?". Dessa forma, uma filosofia abstrata se transforma em um processo repetível e defensável, alinhando as decisões tecnológicas aos objetivos estratégicos da empresa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Esta estrutura estratégica estabelece as bases para uma abordagem deliberada e sistemática às decisões tecnológicas. &lt;a href="https://dev.to/rdeavila/a-liberdade-da-contencao-deliberada-4kob"&gt;No último artigo desta série&lt;/a&gt;, exploraremos como todos esses conceitos se unem no princípio da Contenção Deliberada, oferecendo um modelo prático para equilibrar inovação e estabilidade no desenvolvimento de software moderno.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>"Tecnologia Tediosa" Revisitada na Era da Inteligência Artificial</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:55:07 +0000</pubDate>
      <link>https://forem.com/rdeavila/tecnologia-tediosa-revisitada-na-era-da-inteligencia-artificial-420i</link>
      <guid>https://forem.com/rdeavila/tecnologia-tediosa-revisitada-na-era-da-inteligencia-artificial-420i</guid>
      <description>&lt;p&gt;A filosofia da tecnologia tediosa, criada antes da era da IA, ganha uma nova e ainda mais crucial relevância com o surgimento dos assistentes de codificação baseados em Inteligência Artificial. Aaron Brethorst, em "&lt;a href="https://www.brethorsting.com/blog/2025/07/choose-boring-technology,-revisited/" rel="noopener noreferrer"&gt;Choose Boring Technology, Revisited&lt;/a&gt;", argumenta que, embora os princípios fundamentais de McKinley continuem válidos, ferramentas como Copilot e Claude adicionam uma dimensão nova e perigosa à equação. A IA não anula a necessidade da tecnologia tediosa; pelo contrário, acentua os riscos de ignorá-la.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assistentes de Codificação de IA: O Novo Obstáculo
&lt;/h2&gt;

&lt;p&gt;A mudança mais significativa na indústria, desde o ensaio original de McKinley, é a proliferação de assistentes de codificação baseados em Modelos de Linguagem Grandes (LLMs). Embora essas ferramentas sejam extraordinariamente proficientes em gerar código plausível e profissional para uma vasta gama de tecnologias, incluindo implementações complexas como microsserviços com Kubernetes ou federação GraphQL, essa capacidade introduz um novo perigo: gerar código para uma tecnologia com a qual não está familiarizado.&lt;/p&gt;

&lt;p&gt;O problema reside no fato de que os LLMs podem "alucinar" detalhes técnicos, produzindo código que, à primeira vista, parece correto, mas é fundamentalmente defeituoso de maneiras sutis. Brethorst relata ter observado engenheiros aceitando código gerado por IA que continha APIs obsoletas, antipadrões de segurança ou problemas de desempenho que só se manifestariam sob carga de produção. A natureza enganosa desse código é que ele "parecia certo" — seguia as convenções de nomenclatura, incluía tratamento de erros adequado e parecia profissional. Apenas alguém com um conhecimento profundo da tecnologia subjacente seria capaz de detectar as falhas.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Efeito Multiplicador de Desconhecidos"
&lt;/h2&gt;

&lt;p&gt;A combinação de uma tecnologia desconhecida com código gerado por IA cria um cenário de incerteza exponencial. O engenheiro se vê em uma situação precária onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não consegue determinar se a framework escolhida é adequada para o problema.&lt;/li&gt;
&lt;li&gt;Não tem certeza se a implementação da IA segue as melhores práticas.&lt;/li&gt;
&lt;li&gt;Não consegue distinguir entre o código boilerplate e a lógica de negócio   essencial gerada pela IA.&lt;/li&gt;
&lt;li&gt;Desconhece quais modos de falha precisa antecipar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Brethorst compara essa situação a um "cargo-culting vezes 2.356", destacando o risco significativamente amplificado. O engenheiro deposita confiança cega em dois sistemas que não compreende: a nova tecnologia e o LLM. A confiança enganosa que o código de IA, com sua aparência profissional, proporciona, mascara uma profunda falta de entendimento, transformando a depuração futura em um verdadeiro pesadelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  IA: "Multiplicador de Força"
&lt;/h2&gt;

&lt;p&gt;A utilização de um assistente de IA em conjunto com uma tecnologia que o engenheiro domina — uma parte "tediosa" e familiar do seu stack — transforma a IA de um risco em um "multiplicador de força" potente. É aqui que a "Ignorância Produtiva" se manifesta com maior eficácia: o engenheiro aceita a IA para gerar a sintaxe exata de código repetitivo, confiando no seu conhecimento aprofundado para auditar o resultado.&lt;/p&gt;

&lt;p&gt;Brethorst exemplifica esta ideia: ele confia no Claude para gerar código Rails devido à sua familiaridade com a framework, o que lhe permite identificar rapidamente sugestões problemáticas. Da mesma forma, usa o Copilot para JavaScript, pois compreende as nuances da linguagem e pode verificar a exatidão do que é gerado. Neste cenário, a IA assume o trabalho pesado do código&lt;br&gt;
boilerplate, libertando o engenheiro para se concentrar na arquitetura e na lógica de negócio. A experiência do engenheiro serve como uma salvaguarda essencial, permitindo-lhe usufruir da produtividade da IA enquanto minimiza os riscos.&lt;/p&gt;

&lt;p&gt;Esta dualidade revela uma nova realidade na era da IA: aumentou a importância da experiência profunda em um stack tecnológico. A IA alterou a natureza do risco no desenvolvimento. Antes da IA, um engenheiro a trabalhar com uma framework desconhecida provavelmente produziria código visivelmente confuso ou não funcional. Agora, as ferramentas de IA podem gerar código sintaticamente correto e bem formatado que, no entanto, esconde falhas sutis.&lt;/p&gt;

&lt;p&gt;Assim, a competência crucial desloca-se da simples escrita de código para a capacidade de auditoria, exigindo um conhecimento profundo do domínio. A aptidão de analisar um bloco de código gerado por IA e identificar "Isto parece correto, mas está errado devido a X, Y e Z" tornou-se a nova habilidade de alto valor. Esta capacidade de auditoria só pode ser desenvolvida através de experiência prática e profunda com um stack tecnológico — a essência de dominar uma tecnologia "tediosa".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As decisões tecnológicas em uma era dominada pela IA requerem ainda mais cautela e deliberação. &lt;a href="https://dev.to/rdeavila/estrutura-estrategica-para-decisoes-tecnologicas-3ha5"&gt;No próximo artigo&lt;/a&gt;, exploraremos como avaliar e selecionar tecnologias de forma sistemática, considerando não apenas suas capacidades técnicas, mas também seu impacto a longo prazo na manutenibilidade e segurança do sistema.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>A Filosofia na Prática: O Modelo GitLab de Iteração Acelerada</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:54:01 +0000</pubDate>
      <link>https://forem.com/rdeavila/a-filosofia-na-pratica-o-modelo-gitlab-de-iteracao-acelerada-52j0</link>
      <guid>https://forem.com/rdeavila/a-filosofia-na-pratica-o-modelo-gitlab-de-iteracao-acelerada-52j0</guid>
      <description>&lt;p&gt;A teoria que associa a estabilidade da tecnologia tediosa à rapidez da iteração é persuasiva. No entanto, o seu verdadeiro valor reside na aplicação prática, e o GitLab é um exemplo concreto de como essa filosofia pode ser implementada em larga escala para gerar resultados notáveis. A empresa atribui explicitamente a sua capacidade de realizar 106 lançamentos em 106 meses consecutivos ao seu &lt;a href="https://about.gitlab.com/blog/boring-solutions-faster-iteration" rel="noopener noreferrer"&gt;compromisso com "soluções tediosas"&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Complexidade limita a Velocidade
&lt;/h2&gt;

&lt;p&gt;A filosofia do GitLab baseia-se num princípio fundamental: a velocidade da inovação é diretamente limitada pela complexidade total que se acumula. Cada nova tecnologia, abstração ou dependência adiciona uma sobrecarga incremental que, com o tempo, retarda toda a organização. Ao resistir ativamente a essa acumulação de complexidade e ao optar consistentemente pela solução mais simples e "tediosa", o GitLab conseguiu manter uma alta velocidade de iteração ao longo de uma década de crescimento.&lt;/p&gt;

&lt;p&gt;Essa abordagem reflete-se em uma série de decisões pragmáticas, muitas vezes contraintuitivas, que priorizam a velocidade de entrega em detrimento da elegância técnica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplos práticos de "tedioso"
&lt;/h2&gt;

&lt;p&gt;A cultura do GitLab de escolher soluções "tediosas" é melhor compreendida através de exemplos que demonstram uma preferência consistente por alavancar o que já existe, em vez de construir algo novo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aproveitar Funcionalidades Existentes:&lt;/strong&gt; Para implementar quadros de &lt;em&gt;issues&lt;/em&gt; (uma funcionalidade complexa) inicialmente, a equipe optou por usar a funcionalidade de etiquetas de &lt;em&gt;issues&lt;/em&gt; já existente para alimentar as listas. Essa "solução tediosa" permitiu a entrega rápida de uma nova funcionalidade, reutilizando componentes já compreendidos e mantidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evitar Interfaces de Usuário (UI) Desnecessárias:&lt;/strong&gt; Diante da necessidade de autenticar com o Vault, em vez de desenvolver uma nova UI ou CLI, a equipe escolheu usar um JSON Web Token e documentar o uso de &lt;code&gt;curl&lt;/code&gt; com os &lt;em&gt;endpoints&lt;/em&gt; da API. Essa solução "sem código" resolveu o problema do usuário com zero sobrecarga de desenvolvimento e manutenção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Ferramenta Mais Simples Possível:&lt;/strong&gt; Um exemplo marcante do compromisso do GitLab com a simplicidade foi a migração massiva e crítica do Microsoft Azure para o Google Cloud Platform (GCP). Para gerenciar esse projeto complexo, eles utilizaram a solução mais "tediosa" de todas: uma &lt;em&gt;checklist&lt;/em&gt; em uma &lt;em&gt;issue&lt;/em&gt; do GitLab. Embora essa &lt;em&gt;checklist&lt;/em&gt; tenha sofrido 140 alterações, o processo simples e transparente permitiu que a migração fosse executada sem problemas sérios. Eles resistiram à tentação de usar &lt;em&gt;software&lt;/em&gt; de gerenciamento de projetos sofisticado, confiando em uma ferramenta simples, visível e familiar para todos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incrementalismo Disciplinado:&lt;/strong&gt; Ao melhorar a experiência do usuário para tornar o título de uma &lt;em&gt;issue&lt;/em&gt; visível ao rolar a página, a proposta inicial era fixar apenas o título. No entanto, uma validação rápida mostrou que o MVP (Produto Mínimo Viável) deveria incluir também o estado da &lt;em&gt;issue&lt;/em&gt;. Crucialmente, a equipe resistiu à tentação de expandir o escopo para incluir outros elementos fixos, como a navegação por abas, ou aplicar a lógica a outros objetos, como &lt;em&gt;Merge Requests&lt;/em&gt;. Eles entregaram a menor alteração possível que agregava valor, demonstrando uma abordagem disciplinada à iteração.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  "Tedioso" não é Dogma, é Estratégia
&lt;/h2&gt;

&lt;p&gt;A abordagem do GitLab demonstra que a escolha de soluções "tediosas" não é permanente, mas estratégica e contextual. Inicialmente, ferramentas como o Gitolite foram adotadas por serem eficazes e permitirem foco na entrega de valor, sendo substituídas à medida que a empresa cresceu.&lt;/p&gt;

&lt;p&gt;Isso ressalta que "tedioso" não é um julgamento de valor, mas uma escolha para a ferramenta mais simples e com menor sobrecarga, otimizada para a velocidade de iteração e com a flexibilidade de revisão futura.&lt;/p&gt;

&lt;p&gt;Essa filosofia de soluções simples e iteração rápida é uma estratégia de engenharia humanizada. Ela valoriza a atenção, o foco e a energia criativa dos engenheiros, minimizando a fadiga cognitiva causada por stacks complexos. A metáfora da fadiga do piloto do MiG-15 ilustra o esgotamento mental ao lidar com tecnologias imprevisíveis, destacando a importância de um ambiente estável.&lt;/p&gt;

&lt;p&gt;Um stack tecnológico "tedioso" e estável promove domínio e confiança, permitindo que os engenheiros entrem em estado de fluxo. Ao reduzir a carga cognitiva e a fadiga de decisão, os engenheiros podem direcionar sua criatividade para resolver problemas de clientes e gerar valor de negócio, focando no "o quê" em vez de se preocuparem constantemente com o "como" da infraestrutura.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agora que entendemos como a escolha por soluções tediosas pode acelerar a iteração e a entrega de valor, &lt;a href="https://dev.to/rdeavila/tecnologia-tediosa-revisitada-na-era-da-inteligencia-artificial-420i"&gt;vamos explorar&lt;/a&gt; um fenômeno que parece estar movendo a indústria na direção oposta: a IA. Como essas novas tecnologias se encaixam em uma filosofia que prioriza estabilidade e simplicidade?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>O Imperativo da Velocidade: A Lei de Boyd e o Ciclo OODA no Software</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:53:05 +0000</pubDate>
      <link>https://forem.com/rdeavila/o-imperativo-da-velocidade-a-lei-de-boyd-e-o-ciclo-ooda-no-software-58j1</link>
      <guid>https://forem.com/rdeavila/o-imperativo-da-velocidade-a-lei-de-boyd-e-o-ciclo-ooda-no-software-58j1</guid>
      <description>&lt;p&gt;A base para a estabilidade no desenvolvimento de software reside na filosofia da "tecnologia tediosa". Contudo, o imperativo da velocidade é impulsionado pela "Lei da Iteração de Boyd". Originalmente aplicada à análise de combate aéreo militar, esta lei revela que a velocidade do ciclo de aprendizagem é mais crucial do que a qualidade de uma decisão individual. Ao combinar a estabilidade proporcionada pela tecnologia tediosa com a agilidade da Lei de Boyd, cria-se uma sinergia poderosa, resultando em um desenvolvimento de software sustentável e de alta velocidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Ciclo OODA: Vantagem do Ritmo
&lt;/h2&gt;

&lt;p&gt;A lei formulada pelo Coronel da Força Aérea dos EUA, John Boyd, surgiu após a análise dos combates aéreos na Guerra da Coreia. Boyd notou um paradoxo: embora o caça a jato americano F-86 fosse tecnicamente inferior ao MiG-15 soviético em quase todos os indicadores de desempenho, como taxa de subida e raio de viragem, os pilotos de F-86 venciam seus adversários em uma proporção de nove para um.&lt;/p&gt;

&lt;p&gt;A conclusão de Boyd foi que o fator determinante para a vitória não era a superioridade em observar, orientar, decidir ou agir, mas sim a capacidade de executar este ciclo — denominado ciclo OODA (Observar, Orientar, Decidir, Agir) — mais rapidamente que o oponente. O piloto que conseguisse completar seu ciclo OODA de forma mais ágil conseguia interferir no processo de tomada de decisão do adversário, gerando confusão e desorientação, e assim, obtendo a vantagem.&lt;/p&gt;

&lt;p&gt;A razão pela qual o F-86 conseguia iterar mais rapidamente era surpreendentemente simples: seus controles de voo eram totalmente hidráulicos,enquanto os do MiG-15 eram manuais e demandavam maior força física para operar. A cada manobra, o piloto do MiG-15 ficava um pouco mais fatigado, retardando marginalmente seu ciclo OODA. Ao longo de um combate aéreo, essa pequena desvantagem de atrito acumulava-se, permitindo ao piloto do F-86, menos fatigado, ditar o ritmo do confronto. Essa analogia é profundamente relevante para o desenvolvimento de software: o atrito, seja ele cognitivo ou processual, é um obstáculo à velocidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Lei de Boyd no Desenvolvimento de Software
&lt;/h2&gt;

&lt;p&gt;No desenvolvimento de software, a rapidez na iteração é mais crucial do que a qualidade individual de cada iteração. A capacidade de testar hipóteses, obter feedback, aprender e adaptar-se rapidamente é mais valiosa do que buscar a solução perfeita desde o início. &lt;a href="https://blog.codinghorror.com/boyds-law-of-iteration/" rel="noopener noreferrer"&gt;Conforme demonstrado por Jeff Atwood&lt;/a&gt;, o ciclo OODA (Observar, Orientar, Decidir, Agir) é aplicado a práticas de desenvolvimento modernas, todas focadas em acelerar o ciclo de feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testes Unitários Rápidos:&lt;/strong&gt; Testes devem ser concisos e executados em segundos. Testes demorados levam os desenvolvedores a executá-los com menor frequência, atrasando o feedback sobre a qualidade do código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes de Usabilidade Ágeis:&lt;/strong&gt; A realização de pequenas alterações e testes regulares com usuários permite que as equipes identifiquem rapidamente o que não funciona, evitando o investimento prolongado em direções equivocadas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metodologias Ágeis:&lt;/strong&gt; A maioria das abordagens ágeis sugere iterações (sprints) de no máximo quatro semanas. Isso garante a entrega contínua de valor e a reorientação com base no feedback recebido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Falhar Cedo, Falhar Frequentemente:&lt;/strong&gt; O propósito dos testes de software não é comprovar sua funcionalidade, mas sim identificar falhas o mais cedo possível no ciclo de desenvolvimento, quando são mais baratas de corrigir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em todos esses cenários, o princípio subjacente é o mesmo: encurtar o ciclo OODA. O objetivo é aumentar o número de iterações em um determinado período, acelerando assim a aprendizagem e a adaptação organizacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estabilidade e Velocidade: Uma Relação Simbiótica
&lt;/h2&gt;

&lt;p&gt;A filosofia de "escolher tecnologia tediosa" e a "lei da iteração" de Boyd, embora distintas, são interdependentes e se fortalecem mutuamente. A estabilidade e previsibilidade de tecnologias "tediosas" são cruciais para acelerar o ciclo OODA de uma equipe de desenvolvimento, minimizando atritos.&lt;/p&gt;

&lt;p&gt;A analogia do F-86 ilustra isso: sua vantagem não veio de uma tecnologia revolucionária, mas de uma que reduzia a fadiga do piloto, ou seja, o atrito. No desenvolvimento de software, tecnologias novas e não comprovadas geram atrito e fadiga cognitiva. Engenheiros gastam tempo e energia desnecessários ao lidar com stacks desconhecidos. A "Ignorância Produtiva" — admitir não conhecer uma nova ferramenta e preferir uma já dominada — reduz esse atrito, permitindo que a equipe itere mais rapidamente na resolução de problemas reais.&lt;/p&gt;

&lt;p&gt;Em um stack desconhecido, o ciclo OODA (Observar, Orientar, Decidir, Agir) é impactado negativamente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Observar:&lt;/strong&gt; Dificuldade em identificar a causa de um bug ou quais métricas monitorar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orientar:&lt;/strong&gt; Desafios para entender o contexto de um sistema complexo e desconhecido, dificultando o raciocínio sobre causas e efeitos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decidir:&lt;/strong&gt; Planejar uma correção torna-se arriscado devido à incerteza das implicações, levando à paralisia da análise ou soluções excessivamente cautelosas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agir:&lt;/strong&gt; A implementação da correção é lenta e propensa a erros, com ciclos de depuração prolongados devido a falhas inesperadas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Por outro lado, um stack tecnológico "tedioso" e bem compreendido minimiza o atrito em todas as etapas do ciclo OODA. A equipe sabe onde procurar bugs (Observar), entende o sistema e suas interdependências (Orientar), pode prever com confiança o impacto de mudanças (Decidir) e implementar correções de forma rápida e segura (Agir).&lt;/p&gt;

&lt;p&gt;Ao reduzir a sobrecarga operacional e cognitiva, a tecnologia tediosa atua como os controles de voo hidráulicos do F-86. Ela libera a energia da equipe para que se concentrem na execução eficiente do trabalho, em vez de lutarem contra suas próprias ferramentas. A estabilidade não se opõe à velocidade; ela é o fundamento sobre o qual a velocidade sustentável é construída.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://dev.to/rdeavila/a-filosofia-na-pratica-o-modelo-gitlab-de-iteracao-acelerada-52j0"&gt;No próximo artigo&lt;/a&gt;, vamos explorar como implementar ciclos OODA mais rápidos através de práticas específicas de desenvolvimento, demonstrando como acelerar iterações sem comprometer a estabilidade do sistema.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>braziliandevs</category>
      <category>boringthechnology</category>
    </item>
    <item>
      <title>A Sabedoria Tediosa: Desconstruindo "Choose Boring Technology"</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:51:51 +0000</pubDate>
      <link>https://forem.com/rdeavila/a-sabedoria-tediosa-desconstruindo-choose-boring-technology-2dbm</link>
      <guid>https://forem.com/rdeavila/a-sabedoria-tediosa-desconstruindo-choose-boring-technology-2dbm</guid>
      <description>&lt;p&gt;A filosofia "Choose Boring Technology" de Dan McKinley é frequentemente vista como um repúdio ao avanço ou um apelo ao Ludismo, mas essa é uma interpretação equivocada. Na verdade, ela representa uma abordagem refinada para gerenciar riscos, otimizar a alocação de recursos e impulsionar o desempenho organizacional a longo prazo. Seu verdadeiro valor não está em rejeitar o novo, mas em escolher conscientemente o que é previsível e estável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definindo "Tedioso": Previsibilidade e Ignorância Produtiva
&lt;/h2&gt;

&lt;p&gt;Para entender essa filosofia, o primeiro passo é redefinir "tedioso". No vocabulário de McKinley, "tedioso" não significa "ruim", "desinteressante" ou "ultrapassado"; significa "bem compreendido". Uma tecnologia tediosa é aquela cujas capacidades e, mais importante, seus modos de falha, são conhecidos pela equipe e pela indústria. Tecnologias como PostgreSQL, Python, PHP e cron são "tediosas" não por falta de poder, mas porque seu comportamento sob estresse, suas limitações e suas peculiaridades operacionais foram documentados, discutidos e resolvidos ao longo de anos ou décadas de uso em produção.&lt;/p&gt;

&lt;p&gt;Isso se alinha diretamente com o princípio psicológico que Kent Beck denomina "Ignorância Produtiva". Num cenário de constante mudança, é ineficaz fingir que se sabe tudo. A ignorância produtiva é a atitude de aceitar a incerteza e priorizar o aprendizado focado. A seleção de tecnologias "tediosas" é uma aplicação estratégica dessa perspectiva. A equipe reconhece sua falta de conhecimento sobre as inovações tecnológicas mais recentes e decide operar em um campo onde sua expertise é sólida, direcionando assim sua energia de aprendizado para o problema de negócio em questão.&lt;/p&gt;

&lt;p&gt;A previsibilidade é crucial para minimizar surpresas na engenharia de software, uma disciplina já complexa. Novas tecnologias aumentam essa complexidade exponencialmente, introduzindo "desconhecidos desconhecidos" – problemas totalmente imprevistos, ao contrário dos "desconhecidos conhecidos" que podem ser antecipados e planejados, como uma partição de rede.&lt;/p&gt;

&lt;p&gt;Tecnologias inovadoras são repletas de "desconhecidos desconhecidos": não se sabe como se comportarão em escala, que tipo de interrupções inesperadas de garbage collection podem causar, ou quais vulnerabilidades de segurança sutis podem abrigar. Em contraste, uma tecnologia considerada "tediosa" já transformou a maioria de seus "desconhecidos desconhecidos" em "desconhecidos conhecidos" através do uso generalizado. A comunidade já encontrou as falhas, e as soluções são facilmente acessíveis, muitas vezes com uma simples pesquisa no Stack Overflow.&lt;/p&gt;

&lt;p&gt;Essa previsibilidade reduz drasticamente a carga cognitiva sobre a equipe de engenharia, permitindo que se concentrem na resolução de problemas de negócio, em vez de gastar tempo depurando a infraestrutura.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Economia do "Token de Inovação"
&lt;/h2&gt;

&lt;p&gt;Para contextualizar a adoção de novas tecnologias, McKinley introduz o conceito de "tokens de inovação". Ele sugere que cada empresa possui uma quantidade limitada desses tokens – talvez três – que representam sua capacidade de realizar trabalhos criativos, arriscados ou desafiadores. Esses tokens são um recurso estratégico escasso e devem ser "orçados" com a mesma atenção dedicada ao capital financeiro.&lt;/p&gt;

&lt;p&gt;Essa metáfora transforma a escolha tecnológica de uma decisão meramente técnica para uma decisão de alocação estratégica de portfólio. Utilizar um token de inovação em algo fundamental, como um banco de dados (por exemplo, optar por MongoDB quando a equipe já domina MySQL) ou um novo paradigma de programação (adotar NodeJS em uma empresa que usa Ruby), é um investimento de alto risco em uma área que não diferencia o negócio. Uma empresa não obtém vantagem competitiva por ter um banco de dados "moderno"; sua vantagem deriva do produto construído sobre ele. Ao gastar um token de inovação na infraestrutura, a organização esgota sua capacidade de inovar onde realmente importa: nas funcionalidades do produto principal, que os clientes percebem e valorizam.&lt;/p&gt;

&lt;p&gt;Assim, a gestão do portfólio de tecnologia, sob essa ótica, torna-se um exercício de gestão de risco. A função de um líder de tecnologia é alocar o orçamento de risco da empresa de forma eficaz. Escolher tecnologia "tediosa" para sistemas fundamentais e não diferenciadores é análogo a selecionar ativos estáveis e de baixo risco para a base de uma carteira de investimentos. Essa abordagem estabiliza o portfólio geral e preserva o "capital de risco" (os tokens de inovação) para ser investido em apostas de alto risco e alta recompensa que impactam diretamente a posição de mercado da empresa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custo real da tecnologia: Sobrecarga cognitiva e operacional
&lt;/h2&gt;

&lt;p&gt;A escolha de soluções tecnológicas, embora muitas vezes impulsionada pela busca da "melhor ferramenta", pode levar a uma otimização míope com custos sistêmicos significativos. McKinley ressalta que o verdadeiro custo de uma tecnologia vai além do desenvolvimento inicial, englobando o custo total de propriedade, que inclui a sobrecarga operacional e cognitiva.&lt;/p&gt;

&lt;p&gt;Essa sobrecarga se manifesta na necessidade de criar novas estratégias de monitoramento, desenvolver testes unitários, configurar scripts de inicialização, treinar novos engenheiros e, crucialmente, na carga cognitiva de gerenciar mais um sistema. Cada nova adição ao &lt;em&gt;stack&lt;/em&gt; tecnológico fragmenta o conhecimento e a atenção da equipe. O caso da empresa Etsy, mencionada por McKinley em seu ensaio, ilustra essa armadilha: a contratação de programadores Python resultou em uma "camada intermediária inútil" que levou anos para ser eliminada. Essa otimização local (aproveitar as habilidades dos programadores) gerou uma ineficiência global massiva e atrasou o sucesso da empresa.&lt;/p&gt;

&lt;p&gt;Em contrapartida, a contenção deliberada pode gerar benefícios a longo prazo. Os &lt;em&gt;feeds&lt;/em&gt; de atividade da Etsy, por exemplo, foram construídos sobre um &lt;em&gt;stack&lt;/em&gt; "tedioso" (PHP, MySQL, Memcached, Gearman). Embora a implementação inicial tenha sido mais complexa do que seria com uma ferramenta moderna como o Redis, essa escolha permitiu que a funcionalidade escalasse 20 vezes ao longo de vários anos sem exigir atenção constante. A estabilidade e a familiaridade do &lt;em&gt;stack&lt;/em&gt; subjacente garantiram seu funcionamento confiável em segundo plano, liberando os engenheiros para focar em problemas mais urgentes. A lição é clara: os custos operacionais de longo prazo de uma tecnologia geralmente superam a conveniência de desenvolvimento de curto prazo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Compreender e aplicar a filosofia de "Tecnologias Tediosas" é um primeiro passo crucial para construir sistemas robustos e escaláveis. No entanto, essa abordagem frequentemente enfrenta resistência quando confrontada com a pressão por velocidade e inovação. &lt;a href="https://dev.to/rdeavila/o-imperativo-da-velocidade-a-lei-de-boyd-e-o-ciclo-ooda-no-software-58j1"&gt;No próximo artigo&lt;/a&gt;, exploraremos como equilibrar essa aparente contradição entre estabilidade e rapidez no desenvolvimento de software.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>Soluções Tediosas: Estratégia para uma Engenharia Sustentável</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Sat, 18 Oct 2025 12:51:08 +0000</pubDate>
      <link>https://forem.com/rdeavila/solucoes-tediosas-estrategia-para-uma-engenharia-sustentavel-2dhi</link>
      <guid>https://forem.com/rdeavila/solucoes-tediosas-estrategia-para-uma-engenharia-sustentavel-2dhi</guid>
      <description>&lt;p&gt;Na engenharia de software atual, há um conflito central: a atração por novas tecnologias versus a solidez de sistemas já estabelecidos. Desenvolvedores frequentemente se veem divididos, seduzidos pelas últimas ferramentas que prometem soluções mágicas, enquanto a experiência adverte sobre os custos ocultos da novidade. Nesta série de artigos vamos ver que a contenção tecnológica estratégica não barra a inovação; pelo contrário, ela a impulsiona.&lt;/p&gt;

&lt;p&gt;A verdadeira agilidade e liberdade na engenharia vêm do domínio profundo de um conjunto de ferramentas estável e intencionalmente limitado, e não da busca incessante pelo que é novo. Por trás dessa abordagem, há um fundamento psicológico vital: uma mentalidade de engenharia que valoriza o aprendizado aprofundado em detrimento da exploração constante.&lt;/p&gt;

&lt;p&gt;Para desenvolver essa ideia, vamos nos apoiar em quatro pilares filosóficos que, juntos, criam uma base sólida para a liderança tecnológica.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/rdeavila/a-sabedoria-tediosa-desconstruindo-choose-boring-technology-2dbm"&gt;Primeiro&lt;/a&gt;, será explorada a filosofia de Dan McKinley, "&lt;a href="https://boringtechnology.club" rel="noopener noreferrer"&gt;Choose Boring Technology&lt;/a&gt;" (Escolha Tecnologia Tediosa), vista como uma estratégia inteligente de gerenciamento de risco e alocação de recursos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/rdeavila/o-imperativo-da-velocidade-a-lei-de-boyd-e-o-ciclo-ooda-no-software-58j1"&gt;Em segundo lugar&lt;/a&gt;, será analisada a "Lei da Iteração" do Coronel John Boyd, um princípio militar que mostra como a velocidade de iteração é uma vantagem competitiva crucial no desenvolvimento de software.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/rdeavila/a-filosofia-na-pratica-o-modelo-gitlab-de-iteracao-acelerada-52j0"&gt;Em terceiro lugar&lt;/a&gt;, vamos examinar como esses conceitos abstratos são aplicados na prática, usando o GitLab como estudo de caso. A empresa atribui sua impressionante cadência de lançamentos à sua preferência por "soluções tediosas".&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/rdeavila/tecnologia-tediosa-revisitada-na-era-da-inteligencia-artificial-420i"&gt;Por fim&lt;/a&gt;, a filosofia será atualizada para o cenário contemporâneo com a reavaliação de Aaron Brethorst, que argumenta que a chegada dos assistentes de codificação com Inteligência Artificial (IA) torna os princípios da tecnologia tediosa ainda mais importantes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depois de desmembrar esses pilares, examinaremos &lt;a href="https://dev.to/rdeavila/estrutura-estrategica-para-decisoes-tecnologicas-3ha5"&gt;como aplicar esses conceitos&lt;/a&gt; na tomada de decisões tecnológicas, estabelecendo critérios objetivos para avaliar novas ferramentas e manter a consistência arquitetural ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Ao desmembrar e depois interligar esses pilares, você terá um guia prático   para líderes de tecnologia que buscam construir organizações de engenharia sustentáveis, produtivas e verdadeiramente inovadoras.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>boringtechnology</category>
    </item>
    <item>
      <title>DoH: como funciona a consulta DNS no Clear Address?</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Fri, 08 Aug 2025 16:30:00 +0000</pubDate>
      <link>https://forem.com/rdeavila/doh-como-funciona-a-consulta-dns-no-clear-address-4e7c</link>
      <guid>https://forem.com/rdeavila/doh-como-funciona-a-consulta-dns-no-clear-address-4e7c</guid>
      <description>&lt;p&gt;Olá, pessoal!&lt;/p&gt;

&lt;p&gt;Recentemente, o &lt;a href="https://www.tabnews.com.br/valterpatrick" rel="noopener noreferrer"&gt;valterpatrick&lt;/a&gt; sugeriu que mostrasse &lt;a href="https://www.tabnews.com.br/valterpatrick/dee07c60-b9ad-4938-9c8c-6e72cc84bc38" rel="noopener noreferrer"&gt;como as consultas DNS são realizadas&lt;/a&gt; no site &lt;a href="https://clear-address.rda.run" rel="noopener noreferrer"&gt;clear-address.rda.run&lt;/a&gt;. Agradeço muito pela pergunta, pois ela abre espaço para discutirmos um tema que considero fascinante e muito útil: &lt;strong&gt;DNS over HTTPS (DoH)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em vez de usar o protocolo DNS tradicional, que geralmente opera de forma não criptografada na porta 53, o site utiliza as APIs públicas de resolvedores DNS que suportam HTTPS. Na prática, isso significa que uma consulta DNS se transforma em uma simples chamada HTTP. Isso traz uma camada extra de privacidade e segurança, pois a consulta se camufla como tráfego HTTPS comum.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Mágica por Trás da Cortina: As APIs
&lt;/h2&gt;

&lt;p&gt;O backend do Clear Address faz chamadas para resolvedores DoH, como os oferecidos pela Cloudflare e pelo Google. A escolha entre eles pode variar, mas o princípio é exatamente o mesmo.&lt;/p&gt;

&lt;p&gt;A ideia é enviar uma requisição GET para um endpoint específico, passando o domínio e o tipo de registro desejado como parâmetros na URL. O servidor responde com um JSON contendo os resultados da consulta.&lt;/p&gt;

&lt;h2&gt;
  
  
  DoH via Cloudflare
&lt;/h2&gt;

&lt;p&gt;A Cloudflare é uma das provedoras mais conhecidas de serviços DoH. A documentação completa pode ser encontrada &lt;a href="https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para consultar o registro &lt;code&gt;AAAA&lt;/code&gt; (endereço IPv6) do próprio &lt;code&gt;clear-address.rda.run&lt;/code&gt;, a URL da API fica assim:&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;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//cloudflare-dns.com/dns-query?name=clear-address.rda.run&amp;amp;type=AAAA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando cURL
&lt;/h3&gt;

&lt;p&gt;Você pode testar isso diretamente no seu terminal com o &lt;code&gt;cURL&lt;/code&gt;. O header &lt;code&gt;Accept&lt;/code&gt; é importante para garantir que a Cloudflare nos devolva uma resposta em JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Accept: application/dns-json'&lt;/span&gt; &lt;span class="s1"&gt;'https://cloudflare-dns.com/dns-query?name=clear-address.rda.run&amp;amp;type=AAAA'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Usando Go
&lt;/h3&gt;

&lt;p&gt;No backend, o processo é similar. Aqui está um exemplo simples em Go de como fazer essa chamada e processar a resposta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"encoding/json"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"io"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// Estrutura para receber a resposta da API da Cloudflare&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DNSResponse&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Status&lt;/span&gt;   &lt;span class="kt"&gt;int&lt;/span&gt;  &lt;span class="s"&gt;`json:"Status"`&lt;/span&gt;
    &lt;span class="n"&gt;TC&lt;/span&gt;       &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"TC"`&lt;/span&gt;
    &lt;span class="n"&gt;RD&lt;/span&gt;       &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"RD"`&lt;/span&gt;
    &lt;span class="n"&gt;RA&lt;/span&gt;       &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"RA"`&lt;/span&gt;
    &lt;span class="n"&gt;AD&lt;/span&gt;       &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"AD"`&lt;/span&gt;
    &lt;span class="n"&gt;CD&lt;/span&gt;       &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="s"&gt;`json:"CD"`&lt;/span&gt;
    &lt;span class="n"&gt;Question&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
        &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"type"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="s"&gt;`json:"Question"`&lt;/span&gt;
    &lt;span class="n"&gt;Answer&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
        &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"type"`&lt;/span&gt;
        &lt;span class="n"&gt;TTL&lt;/span&gt;  &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"TTL"`&lt;/span&gt;
        &lt;span class="n"&gt;Data&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"data"`&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="s"&gt;`json:"Answer"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// URL da API da Cloudflare para a consulta desejada&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"https://cloudflare-dns.com/dns-query?name=clear-address.rda.run&amp;amp;type=AAAA"&lt;/span&gt;

    &lt;span class="c"&gt;// Cria uma nova requisição&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Adiciona o header 'Accept' para especificar o formato da resposta&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Accept"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/dns-json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Executa a requisição&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Do&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c"&gt;// Lê o corpo da resposta&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Decodifica o JSON na nossa struct&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dnsResp&lt;/span&gt; &lt;span class="n"&gt;DNSResponse&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Unmarshal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;dnsResp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Imprime os resultados&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Resultados da consulta DNS:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dnsResp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Answer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;dnsResp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Answer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" - Domínio: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"   Tipo: AAAA&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"   TTL: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"   Endereço IPv6: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nenhum registro AAAA encontrado."&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;h2&gt;
  
  
  DoH via Google
&lt;/h2&gt;

&lt;p&gt;O Google oferece um serviço similar, documentado &lt;a href="https://developers.google.com/speed/public-dns/docs/doh/json?hl=pt-br" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;. A lógica é a mesma, mudando apenas a URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://dns.google/resolve?name=clear-address.rda.run&amp;amp;type=AAAA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A implementação, seja com cURL ou Go, seguiria o mesmo padrão, adaptando-se apenas à estrutura do JSON de resposta do Google, que pode ter pequenas diferenças.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend vs. Frontend
&lt;/h2&gt;

&lt;p&gt;Uma observação importante: no Clear Address, essas chamadas são sempre feitas pelo backend. Nunca tentei fazê-las diretamente pelo frontend (via JavaScript no navegador), então não sei dizer se haveria problemas com CORS (Cross-Origin Resource Sharing) ou a necessidade de algum header específico para que a requisição fosse aceita. Fazer pelo backend simplifica o processo e mantém a lógica de negócio no servidor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;E é isso! Sem grande complexidade, o Clear Address apenas utiliza as APIs públicas e bem documentadas de grandes players para resolver nomes de domínio de forma segura e privada.&lt;/p&gt;

&lt;p&gt;Espero que este artigo tenha saciado a curiosidade e mostrado como é simples implementar algo parecido.&lt;/p&gt;

&lt;p&gt;O que vocês acham dessa abordagem? Já usaram DoH em algum projeto? Deixem suas experiências e dúvidas nos comentários.&lt;/p&gt;

&lt;p&gt;Um abraço.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>dns</category>
      <category>go</category>
    </item>
    <item>
      <title>Por que sua validação de e-mail com Regex provavelmente está errada.</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Fri, 08 Aug 2025 13:45:55 +0000</pubDate>
      <link>https://forem.com/rdeavila/por-que-sua-validacao-de-e-mail-com-regex-provavelmente-esta-errada-5ea6</link>
      <guid>https://forem.com/rdeavila/por-que-sua-validacao-de-e-mail-com-regex-provavelmente-esta-errada-5ea6</guid>
      <description>&lt;p&gt;Olá, pessoal!&lt;/p&gt;

&lt;p&gt;Hoje quero discutir um tópico que parece simples, mas que esconde uma complexidade enorme: a validação de endereços de e-mail.&lt;/p&gt;

&lt;p&gt;Se você trabalha com desenvolvimento, provavelmente já precisou validar um campo de e-mail. E qual é a primeira solução que vem à mente? Uma bela expressão regular (Regex), certo? A gente busca no Stack Overflow, copia, cola e pronto. Mas e se eu te disser que essa abordagem, na maioria das vezes, está errada?&lt;/p&gt;

&lt;p&gt;Em 2021, um artigo chamado "&lt;a href="https://www.netmeister.org/blog/email.html" rel="noopener noreferrer"&gt;Your E-Mail Validation Logic is Wrong&lt;/a&gt;" de Jan Schaumann, do blog Netmeister, me deixou surpreso. Ele demonstrou, com base nas RFCs (os documentos que padronizam a internet), uma série de casos extremos e sintaxes válidas de e-mail que 99% das expressões regulares rejeitariam. O artigo é um grande alerta sobre como a nossa intuição sobre o que é um e-mail válido pode estar completamente desalinhada com os padrões oficiais.&lt;/p&gt;

&lt;p&gt;Então, qual é a única forma 100% garantida de validar um e-mail? &lt;strong&gt;Enviando uma mensagem para ele.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É o que fazemos em fluxos de cadastro: o usuário informa o e-mail e nós enviamos um link de confirmação. Simples e eficaz.&lt;/p&gt;

&lt;h3&gt;
  
  
  O problema das listas de e-mail existentes
&lt;/h3&gt;

&lt;p&gt;A situação muda quando uma organização possui uma base de dados antiga, com milhares de e-mails coletados ao longo dos anos, sem o devido cuidado na validação. Enviar uma campanha para essa lista "suja" é um convite para altas taxas de &lt;em&gt;bounce&lt;/em&gt; (devolução), reclamações de spam e, consequentemente, um dano terrível à reputação do seu domínio.&lt;/p&gt;

&lt;p&gt;Mesmo que um endereço seja tecnicamente válido, fatores como caixa de entrada cheia, filtros de spam agressivos ou problemas temporários no servidor do destinatário podem impedir a entrega. E, claro, nem vou entrar no mérito da compra de listas de e-mail. Isso é uma prática péssima e deve ser evitada a todo custo.&lt;/p&gt;

&lt;p&gt;Se a validação com Regex não é confiável e enviar um e-mail para cada contato não é uma opção viável, como podemos limpar essa base de contatos? A resposta está em analisar as duas partes que compõem um endereço: a &lt;strong&gt;parte local&lt;/strong&gt; (antes do &lt;code&gt;@&lt;/code&gt;) e o &lt;strong&gt;domínio&lt;/strong&gt; (depois do &lt;code&gt;@&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Validando o Domínio com DNS
&lt;/h3&gt;

&lt;p&gt;A primeira e mais importante verificação é no domínio. Uma simples consulta DNS nos diz muito sobre a capacidade dele de receber e-mails.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Registro NS (Name Server):&lt;/strong&gt; A primeira coisa a fazer é verificar se o domínio realmente existe e está registrado em algum lugar. Uma consulta pelo registro NS nos dá essa resposta. Se não houver registro NS, o domínio é inválido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Registro MX (Mail Exchange):&lt;/strong&gt; Este é o registro crucial. Ele lista quais servidores de e-mail são responsáveis por receber mensagens para aquele domínio. Se um domínio não possui registros MX, seus e-mails não chegarão a lugar nenhum. Para ser ainda mais assertivo, você pode fazer uma consulta DNS dos registros A/AAAA de cada servidor listado no MX para garantir que eles também existam.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;No meu artigo anterior, "&lt;a href="https://www.tabnews.com.br/rdeavila/doh-como-funciona-a-consulta-dns-no-clear-address" rel="noopener noreferrer"&gt;DoH: como funciona a consulta DNS no Clear Address?&lt;/a&gt;", eu mostro como é possível fazer essas consultas usando uma API pública, o que facilita a automação desse processo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Cuidado com os domínios temporários ou descartáveis
&lt;/h3&gt;

&lt;p&gt;Além de verificar a existência dos registros DNS, precisamos ter cuidado com um tipo especial de serviço: os &lt;strong&gt;E-mails Descartáveis&lt;/strong&gt;. Serviços como Temp Mail ou 10 Minute Mail oferecem endereços temporários. Usuários os utilizam para se cadastrar em serviços sem revelar seu e-mail principal, evitando spam. Para as empresas, enviar campanhas para esses endereços é jogar dinheiro fora. O e-mail deixará de existir em minutos ou horas, poluindo sua lista, piorando seu engajamento e prejudicando sua reputação. Existem dezenas de repositórios no GitHub com listas atualizadas desses domínios, que precisam ser constantemente monitoradas, pois novos serviços surgem a todo momento.&lt;/p&gt;

&lt;p&gt;Existem dezenas de repositórios no Github com listas de domínios atualizadas constantemente, contendo os domínios desses serviços. As listas precisam mesmo ser atualizadas com frequência, pois esses serviços mudam de nome, ou de domínio, com frequência. Comparar o domínio com essas listas pode ajudar a eliminar muitos endereços que, apesar de serem corretos, não servem para nada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando mais de uma pessoa cuida de uma conta
&lt;/h3&gt;

&lt;p&gt;Outra coisa a cuidar são os &lt;strong&gt;Endereços Funcionais (Role-Based)&lt;/strong&gt;. Endereços como &lt;code&gt;vendas@&lt;/code&gt;, &lt;code&gt;contato@&lt;/code&gt; ou &lt;code&gt;suporte@&lt;/code&gt; são genéricos e pertencem a uma função, não a um indivíduo. O envio de marketing para esses e-mails é problemático. A pessoa que se cadastrou pode não fazer mais parte da equipe, e o novo responsável, ao receber uma comunicação que nunca solicitou, tem uma grande chance de marcar sua mensagem como spam.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;A abordagem que apresentei aqui não garante que a caixa de e-mail existe, que a parte local (&lt;code&gt;usuario&lt;/code&gt;) está correta ou que a conta pode receber novas mensagens.&lt;/p&gt;

&lt;p&gt;No entanto, ela &lt;strong&gt;aumenta drasticamente a probabilidade de um endereço estar bem estruturado e apontando para um domínio legítimo e capaz de receber e-mails.&lt;/strong&gt; Essa validação é extremamente útil para a higiene de listas, pois permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduzir taxas de devolução causadas por erros de digitação ou domínios inexistentes.&lt;/li&gt;
&lt;li&gt;Identificar e remover endereços descartáveis que apenas geram custo.&lt;/li&gt;
&lt;li&gt;Segmentar ou remover endereços funcionais que podem gerar reclamações de spam.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Shameless plug
&lt;/h3&gt;

&lt;p&gt;Para facilitar esse processo, desenvolvi uma ferramenta gratuita chamada &lt;strong&gt;Clear Address&lt;/strong&gt;. &lt;a href="https://www.tabnews.com.br/rdeavila/pitch-e-mails-invalidos-criei-o-clear-address-para-validar-enderecos-de-forma-simples" rel="noopener noreferrer"&gt;Falei dela em um Pitch essa semana&lt;/a&gt;. Com uma única chamada de API, você pode realizar todas essas verificações.&lt;/p&gt;

&lt;p&gt;Por exemplo, uma simples requisição &lt;code&gt;GET&lt;/code&gt; para a API &lt;code&gt;https://clear-address.rda.run/v1/contato@temp-mail.org&lt;/code&gt; irá te informar que o domínio pertence a um serviço descartável e que a parte local é um endereço funcional.&lt;/p&gt;

&lt;p&gt;Fica o convite para testarem a ferramenta.&lt;/p&gt;

&lt;h3&gt;
  
  
  E você? Como valida seus e-mails?
&lt;/h3&gt;

&lt;p&gt;Como você lida com a validação e limpeza de e-mails nas suas empresa?&lt;/p&gt;

</description>
      <category>regex</category>
      <category>rfc</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>AlmaLinux: habilitar NTP Sync</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Tue, 25 Jul 2023 02:13:29 +0000</pubDate>
      <link>https://forem.com/rdeavila/almalinux-habilitar-ntp-sync-jc</link>
      <guid>https://forem.com/rdeavila/almalinux-habilitar-ntp-sync-jc</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo timedatectl set-ntp true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quer ver se está habilitado? Veja se o comando abaixo retorna &lt;code&gt;System clock synchronized: yes&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo timedatectl
               Local time: Thu 2023-07-13 09:24:39 -03
           Universal time: Thu 2023-07-13 12:24:39 UTC
                 RTC time: Thu 2023-07-13 12:24:39
                Time zone: America/Sao_Paulo (-03, -0300)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>sre</category>
      <category>ptbr</category>
      <category>almalinux</category>
      <category>beginners</category>
    </item>
    <item>
      <title>LVM: como adicionar novo disco a um volume group</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Tue, 25 Jul 2023 02:09:24 +0000</pubDate>
      <link>https://forem.com/rdeavila/lvm-como-adicionar-novo-disco-a-um-volume-group-566c</link>
      <guid>https://forem.com/rdeavila/lvm-como-adicionar-novo-disco-a-um-volume-group-566c</guid>
      <description>&lt;p&gt;Qual disco será usado, e qual grupo será extendido?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   16G  0 disk
|-sda1            8:1    0    1G  0 part /boot
`-sda2            8:2    0   15G  0 part
  |-centos-root 253:0    0 29.4G  0 lvm  /
  `-centos-swap 253:1    0  1.6G  0 lvm
sdb               8:16   0   16G  0 disk
sr0              11:0    1 1024M  0 rom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui eu quero adicionar &lt;code&gt;sdb&lt;/code&gt; ao &lt;code&gt;/&lt;/code&gt; (grupo &lt;code&gt;centos-root&lt;/code&gt;). Execute sempre como usuário &lt;code&gt;root&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pvcreate /dev/sdb
lvmdiskscan -l
vgextend centos /dev/sdb
lvm lvextend -l +100%FREE /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>sre</category>
      <category>lvm</category>
      <category>ptb</category>
    </item>
    <item>
      <title>Como fazer redirecionamento de portas no Windows 10</title>
      <dc:creator>Rodrigo de Avila</dc:creator>
      <pubDate>Fri, 13 Mar 2020 17:01:59 +0000</pubDate>
      <link>https://forem.com/rdeavila/como-fazer-redirecionamento-de-portas-no-windows-10-152i</link>
      <guid>https://forem.com/rdeavila/como-fazer-redirecionamento-de-portas-no-windows-10-152i</guid>
      <description>&lt;p&gt;Já precisou fazer um redirecionamento de portas no Windows? Por acaso você já usou Docker Toolbox, e queria saber como evitar o uso do &lt;code&gt;192.168.99.100&lt;/code&gt;? Hoje eu aprendi que dá pra usar o comando &lt;code&gt;netsh&lt;/code&gt; pra isso. &lt;/p&gt;

&lt;p&gt;Acesse o Powershell como administrador, e digite&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portproxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v4tov4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listenport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;listenaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connectport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connectaddress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;99&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para saber se a regra foi aplicada, execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;netsh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;portproxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>windows10</category>
      <category>dockertoolbox</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
