Blog

  • Angular v21 e o Fim da Cobertura de Testes Exclusivamente em TypeScript: Por Que Precisamos Repensar os Testes de Componentes

    Angular v21 e o Fim da Cobertura de Testes Exclusivamente em TypeScript: Por Que Precisamos Repensar os Testes de Componentes

    Neste artigo, vamos explorar uma mudança significativa no Angular v21 que afeta a forma como testamos nossos componentes. O Angular v21 introduz o Vitest como a biblioteca de testes padrão, substituindo a antiga configuração Jasmine/Karma. Embora isso possa parecer apenas uma atualização de ferramentas, tem implicações profundas para nossas estratégias de teste.

    A verdadeira mudança reside na adequação às diretrizes de estilo modernas do Angular, no encapsulamento apropriado e na cobertura de testes precisa.

    Se você atualizou recentemente para o Angular v21 (ou migrou para o Vitest) e de repente notou lacunas de cobertura que não existiam antes, não se preocupe. Vamos explorar por que isso está acontecendo e como adaptar seus testes para atender às expectativas do Angular.

    Este é um artigo de opinião sobre os próximos passos nos testes com Angular v21+.

    O Modelo Mental Legado: Cobertura Exclusiva de TypeScript

    Durante muito tempo, os aplicativos Angular foram testados usando:

    • Jasmim + Karma
    • Configurações baseadas em Jest

    Independentemente do executor, a cobertura era efetivamente exclusiva do TypeScript :

    • .tsos arquivos foram instrumentados
    • .htmlOs modelos geralmente eram ignorados.

    espaço reservado

    Isso levou a um padrão de teste comum, no qual os desenvolvedores costumavam:

    • Chame os métodos dos componentes diretamente (já que eles eram públicos).
    • Ler ou modificar propriedades de componentes em testes (já que eram públicas)
    • Afirmar sobre o estado interno

    Enquanto o método fosse executado, a cobertura aumentava, mesmo que o modelo nunca exercesse essa lógica .

    O resultado? Altas métricas de cobertura que pareciam ótimas no papel, mas não refletiam com precisão a confiabilidade da interface do usuário.

    Angular v21 + Vitest: Os modelos agora fazem parte da cobertura de testes.

    O Angular v21 altera a configuração de teste padrão para Vitest . A mudança mais significativa está na forma como a cobertura é relatada:

    Os modelos HTML agora estão incluídos nos relatórios de cobertura.

    espaço reservado

    O que isso significa na prática? A cobertura agora inclui:

    • Associações de eventos como (click)e(change)
    • Renderização condicional ( @ife outros controles)
    • Diretrizes estruturais
    • Caminhos de execução orientados por modelos

    Como resultado:

    • Chamar um método de componente diretamente não “encobre” mais a lógica do template.
    • Agora, as lacunas de cobertura aparecem exatamente onde a interface do usuário não está sendo utilizada.

    Isso não é uma regressão. É o Angular fornecendo uma visão mais precisa e honesta da saúde da sua aplicação.

    O impacto dos membros protegidos

    Desde a versão 20 do Angular, o guia de estilo do Angular recomenda:

    Dê preferência ao acesso protegido para quaisquer membros que devam ser lidos a partir do modelo do componente.

    Isso adiciona mais um desafio à abordagem de teste legada. Se um membro for `null` protected, ele não estará acessível no seu arquivo de teste. Você não pode simplesmente acessar o componente e verificar uma propriedade ou chamar um método diretamente.

    O que isso significa? Mesmo que você quisesse ignorar o modelo e testar a lógica diretamente, o TypeScript não permitiria.

    Portanto, temos duas forças nos impulsionando na mesma direção:

    1. O Vitest requer a execução de um modelo para cobertura.
    2. O Guia de Estilo do Angular restringe o acesso à lógica interna dos componentes.

    A mensagem é clara: pare de testar detalhes de implementação. Comece a testar o comportamento.

    Um exemplo real: componente ProductListComponent

    Para ilustrar isso, vejamos um exemplo real. O ProductListComponentexemplo do meu modern-angularrepositório demonstra esse padrão:

    app/products/product-list
    

    Este componente foi projetado seguindo os padrões modernos do Angular:

    • Lógica orientada a modelos : O modelo gerencia as interações do usuário.
    • Membros protegidos : Propriedades e métodos usados ​​apenas no modelo são marcados comoprotected
    • API pública mínima : O componente expõe apenas o que é estritamente necessário.

    Este design segue as recomendações que o guia de estilo do Angular vem incentivando desde a versão 20.

    Padrão de teste legado (pré-v21)

    Antes do Angular v21, um teste típico geralmente se parecia com isto:

    it('filters products by category', () => {
      component.selectedCategory = 'Books';
      component.applyFilter();
    
      expect(component.filteredProducts.length).toBe(2);
    });
    

    Por que isso pareceu correto?

    • O método foi executado com sucesso.
    • As afirmações foram aprovadas.
    • As métricas de cobertura do TypeScript aumentaram.

    No entanto, eis o que realmente aconteceu:

    • O modelo nunca esteve envolvido no teste.
    • Nenhuma interação do usuário (clique, entrada de dados, etc.) foi simulada.
    • O teste validou detalhes da implementação, não o comportamento real.

    Com o Vitest, a cobertura de HTML permanece intacta e os relatórios de cobertura revelam a verdade: o componente não foi totalmente testado .

    O desafio: APIs protegidas não são fáceis de testar.

    Em componentes Angular modernos:

    • Propriedades e métodos exclusivos do modelo são marcados com protected.
    • O TypeScript impede corretamente o acesso direto a esses membros a partir dos testes.

    Isso cria atrito para estilos de teste legados. Soluções alternativas comuns incluem:

    • Convertendo o componente para any.
    • Métodos de criação criados publicexclusivamente para fins de teste.

    Mas, com a cobertura que leva em consideração os modelos, essas soluções alternativas falham por dois motivos:

    1. Eles violam os princípios de encapsulamento.
    2. Eles não melhoram a cobertura do modelo.

    O Angular está basicamente nos dizendo: se o seu teste não passar pelo modelo, ele não conta.

    A solução: Teste através do modelo

    A solução não é lutar contra o framework, mas sim mudar a forma como testamos os componentes .

    Em vez de invocar a lógica diretamente, devemos:

    • Interagir com o DOM
    • Eventos de gatilho
    • Verifique a saída renderizada

    Vamos refatorar o teste anterior para seguir esta abordagem:

    it('filters products when a category is selected', async () => {
      const select = fixture.nativeElement.querySelector('select');
    
      select.value = 'Books';
      select.dispatchEvent(new Event('change'));
      fixture.detectChanges();
    
      const items = fixture.nativeElement.querySelectorAll('.product-item');
      expect(items.length).toBe(2);
    });
    

    O que está acontecendo aqui?

    • A interação de teste começa com o modelo (como os usuários realmente usam seu aplicativo).
    • A lógica protegida permanece protegida (encapsulamento adequado).
    • A cobertura agora inclui TypeScript e HTML.

    Este teste reflete como os usuários realmente interagem com o componente, garantindo uma aplicação mais robusta e confiável.

    💡 Bônus : Você obtém cobertura de testes tanto para o modelo HTML quanto para o código TypeScript dentro do componente!

    Que mudanças ocorrem na prática?

    Com o Angular v21+, seus testes devem:

    • Prefira a interação com o DOM em vez de chamadas de método.
    • Afirme o comportamento visível , não o estado interno.
    • Considere o modelo como o ponto de entrada.

    O que você ganhará com essa mudança:

    • Os testes tornam-se mais fáceis de refatorar.
    • O encapsulamento melhora naturalmente
    • Os números de cobertura finalmente refletem o uso real.

    Isso está perfeitamente alinhado com a direção de design do Angular e com as melhores práticas modernas de teste.

    Conclusão

    Ao atualizar para o Angular v21 + Vitest, espere o seguinte:

    • Observe a queda na cobertura em componentes com uso intensivo de interface do usuário.
    • Identifique testes que exercitem apenas a lógica TS.
    • Reescreva os testes para acionar o comportamento por meio do modelo assim que você tornar as propriedades e os métodos protegidos.

    Cobertura de versões pré-Angular v21 com Jest:

    espaço reservado

    Angular v21 com Vitest:

    espaço reservado

    Inicialmente, essa mudança parece desconfortável. Mas, na realidade, o Angular v21 está fazendo algo importante:

    • Alinhar as diretrizes de estilo com as ferramentas.
    • Incentivar testes baseados no comportamento
    • Eliminando a falsa confiança da cobertura exclusiva de TS

    O Angular não está tornando os testes mais difíceis. Está tornando os testes mais honestos .

    Boa programação!

  • SQL: Quebrando Scripts em Pequenos Lotes

    SQL: Quebrando Scripts em Pequenos Lotes

    Existem momentos do dia a dia de quem usa um banco de dados que é necessário executar operações simples que acabam consumindo muitos recursos do servidor. Em casos mais críticos, pode acontecer que tais operações nem possam ser executadas.

    Recentemente passei por situações assim num projeto que participei. Dependendo da operação (CRUD) e do servidor envolvido, meus scripts SQL geravam erros relacionados a um determinado limite que tinha sido excedido, como por exemplo tempo de execução. E a solução sempre era “particionar” a declaração para gerar lotes menores.

    Neste artigo, apresento um modo simples de usar a própria linguagem SQL para gerar múltiplos scripts SQL que tratam lotes menores. 

    O Problema

    No exemplo que comentei acima, me pediram para verificar os registros referentes a cerca de 30 mil transações que precisavam ser validadas em dois ambientes diferentes. 

    Para isso, eu havia recebido um arquivo CSV com a lista de chaves que deveria buscar. Portanto eu precisava criar uma consulta SQL bem simples, como mostra o quadro abaixo.

    Executei a consulta no primeiro ambiente com sucesso.  Mas, para minha surpresa, a coisa foi bem diferente no segundo ambiente, que apresentou um erro de “timeout”. 

    Avaliando a documentação, entendi que eu só poderia gerar consultas que considerassem uma lista muito pequena de chaves. Para este exemplo, vamos considerar o limite 100 chaves por lista. 

    Em poucas palavras:  meu script precisaria ser quebrado em pelo menos 300 consultas distintas.

    Particionando a Lista de Chaves

    Evidente que é muito arriscado gerar manualmente centenas de scripts, pois a chance de erro é muito alta. Além disso, um processo manual tomaria um tempo enorme para construir centenas scripts.

    Por isso decidi automatizar o processo. É verdade que eu tinha vários modos de abordar o problema. Na minha opinião, a vantagem de se usar consultas separadas é que isso me dá mais controle sobre a execução do processo. No caso de um erro execução, por exemplo, eu poderia identificar facilmente o lote que causou o problema.

    Bastava então criar um procedimento para geração automática desses scripts. Isso não é tão difícil considerando que os scripts serão exatamente iguais, com exceção da lista de chaves pesquisadas (veja este quadro).

    A seguir, apresento os detalhes desse processo.

    1º Passo – Carregando a lista de chaves

    Entre tantas outras  opções, eu usei o comando BULK INSERT para carregar o arquivo CSV que continha as chaves. 

    Esta operação tem como pré-requisito a configuração de dois parâmetros globais de operação do servidor SQL, que são executados no início da operação. Em seguida criei uma tabela temporária, já que este procedimento será executado apenas uma vez. Finalmente, carreguei os dados do arquivo CSV para a tabela temporária, como se vê a seguir.

    2º Passo – Criando Listas  com “N” Chaves

    Para gerar a lista de chaves consideradas em cada uma das consultas, a primeira preocupação é identificar a qual “lote” pertence a chave que está sendo tratada. Eu usei a cláusula OVER() e função ROW_NUMBER() para tratar este caso. 

    Conhecendo a que lote pertence a chave,  usei a função STRING_AGG para concatenar as 100 chaves numa única cadeia de caracteres.

    O quadro a seguir mostra o script para gerar a lista de chaves que será usada como filtro em cada um dos lotes e uma amostra do resultado obtido.

    3º Passo – Criando as Declarações SQL 

    Por uma questão de didática, incluo aqui um passo intermediário para explicar a construção das declarações SQL que serão usadas.

    Para isso, eu adaptei o script apresentado no quadro anterior, criando duas variáveis que informam os caracteres que devem vir antes e depois da lista de chaves de maneira a criar uma declaração SQL válida. O próximo mostra estas variáveis.

    Na sequência do script, transformei o segundo SELECT numa segunda CTE e, finalmente, adicionei outro SELECT para construir a declaração que será executada em cada lote. 

    Assim chegamos na primeira versão das declarações SQL particionadas. O quadro a seguir mostra o script completo do gerador de declarações SQL particionadas e o resultado obtido.

    4º Passo – Coletando os Resultados das Consultas

    Já temos os scripts particionados prontos para uso, mas a verdade é que eles ainda não são bons o suficiente, porque eu teria que coletar os resultados de 300 consultas. Esse é um novo e enorme gargalo para concluir a operação.

    O que fazer?

    Uma maneira simples de agrupar estes dados é gravando o resultado de cada lote em uma tabela temporária. Ou seja, o gerador passa a construir declarações SQL do tipo INSERT.

    Ao final da operação, leio e copio todas as declarações e executo numa outra sessão.

    Definida a estratégia, começo alterando a variável @sqlPreffix, que se converte em uma operação de inserção na tabela #tempSQL.

    Para facilitar a vida do usuário que vai gerar o script, eu inseri duas novas declarações SQL no gerador de scripts: uma antes da lista de INSERTs, criando a tabela temporária, e a segunda ao final do script, lendo os resultados da tabela temporária.

    Para garantir a ordem das declarações dentro do script que foi gerado, incluí o campo que especifica a ordem de apresentação das declarações (batchNumber). 

    Chegamos à versão final do script, apresentada neste quadro :

    O resultado é um script completo com 315 lotes. As imagens a seguir apresentam partes deste script.

    Comentários Finais

    Faz muitos anos que eu tenho estes “geradores de script” como parte das ferramentas que uso no dia a dia. 

    É evidente que a grande maioria das situações por que passamos não requer um particionamento de scripts. Mas quando isso acontece, a dor de cabeça vai ser grande, dependendo da quantidade de partições necessárias.

    Essa abordagem tem vários pontos positivos, entre eles:

    • ter controle individual dos resultados da operação de cada lote
    • ser extremamente flexível e aplicável a qualquer tipo de declarações SQL
    • requerer apenas a sua IDE para SQL.

    Espero que tenha gostado!

    Até a próxima

  • Docker de imagem. Para rodar projetos PHP em menos de 30 segundos

    Docker de imagem. Para rodar projetos PHP em menos de 30 segundos

    Nesta semana, lançamos a 8.5 da nossa imagem Docker para aplicações PHP , agora com PHP 8.5 e nesse post vamos falar um pouco da versão de como utilizar essa imagem.

    Na Convenia , maior HR Tech do Brasil, utilizamos essa imagem de forma padronizada em todos os nossos projetos . Isso significa que qualquer desenvolvedor da equipe sabe exatamente como iniciar, testar e implantar aplicações sem surpresas no ambiente — seja em desenvolvimento, homologação ou produção. Em outro post abordamos todas as vantagens de padronizar a forma de executar aplicações

    Essa imagem está disponível desde a 8.1 , sendo amplamente testada e utilizada em produção em centenas de projetos e pipelines da Convenia e já acumula versão mais de 10K de pulls no Docker Hub .


    O que é a imagem Docker PHP Full?

    A imagem Docker PHP Full é um ambiente containerizado que já contém tudo o que as aplicações PHP precisam para rodar com segurança e desempenho:

    • PHP pré-configurado com versões modernas
    • Servidor web integrado
    • Ferramentas úteis como Composer, cron e extensões comuns
    • Testes de verificação e verificações regulares

    A Convenia mantém padrão esse há diversas versões — do PHP 8.1 até o novo 8.5 — garantindo estabilidade e suporte contínuo para todos os projetos da empresa.


    Como usar a imagem

    Instalação

    Para começar com a imagem PHP Full da Convenia, basta usar o Docker ou Docker Compose.

    Usando Docker

    docker run --rm -p 80:80 convenia/php-full:8.5

    Ao acessar seu localhost será possível ver uma documentação semelhante a essa

    Documentação da imagem sendo servida pela própria imagem em execução


    Essa página é a própria documentação da imagem sendo servida pelo PHP + nginx. O próximo exemplo do docker compose que vemos como executar nossa aplicação dentro da imagem é apenas montar um volume ou copiar uma aplicação para o diretório /var/www/appdentro do contêiner.

    Usando com Docker Compose

    Crie um arquivo docker-compose.ymlna raiz do seu projeto:

    services:
      app:
        image: convenia/php-full:8.5
        container_name: app
        volumes:
          - .:/var/www/app
        ports:
          - "80:80"

    Depois, execute:

    docker-compose up -d

    Esse arquivo pode ser colocado na raiz de um projeto Laravel por exemplo, e ao subir a pilha do compose o projeto já deve executar sem maiores problemas.

    Na verdade é possível colocar esse arquivo em qualquer aplicação PHP que tenha a massa pública como ponto de entrada do request, aplicações Symfony, Laravel. Se o ponto de entrada para a raiz apenas atmosférica a pasta pública ao montar o volume:

        volumes:
          - .:/var/www/app/public
    

    Atualizações automáticas

    A imagem é construída e atualizada semanalmente para garantir o uso de versões seguras e livres de vulnerabilidades conhecidas, com varredura contínua de dependências. A última compilação pode ser consultada no fluxo de trabalho do Github Actions


    Segurança

    • O serviço FPM (porta 9000) é exposto apenas internamente no container
    • É recomendado bloquear a porta 9000 em ambientes externos
    • A imagem já vem com as configurações de segurança recomendadas para produção. Como desabilitar mensagens de erros e afins.

    Exemplos de personalização

    Substituir configuração do Nginx

    Você pode substituir a configuração padrão do servidor web:

    services:
      app:
        image: convenia/php-full:8.5
        volumes:
          - ./nginx.conf:/etc/nginx/http.d/default.conf

    Assim adapte o contêiner às regras específicas do seu projeto.


    tarefas agendadas com cron

    A imagem já inclui o binário cron, facilitando tarefas agendadas:

    1. Adicione um arquivo crontabcom os comandos desejados;
    2. Copie para o container:
    COPY crontab /etc/crontabs/root
    1. Inicie cron no container:
    docker run --rm mycronimage crond -l 2 -f

    Isso facilita a execução de comandos como o agendador do Laravel.


    Conclusão

    Segue uma listinha com as vantagens da utilização dessa imagem em projetos PHP:

    • Constituição entre ambientes
    • Facilidade de uso
    • Atualizações contínuas
    • Padrão único para toda a empresa
  • GraphQL no Front-end com Vue.js: Type Safety Automática com Codegen

    GraphQL no Front-end com Vue.js: Type Safety Automática com Codegen

    A adoção do GraphQL no front-end traz benefícios quando combinada com ferramentas de geração de código. Neste artigo, vou compartilhar como implementamos GraphQL com Vue.js utilizando GraphQL Code Generator e Vue Apollo Composable , alcançando type safety completa e automaticamente.

    O Problema da Tipagem Manual

    Em aplicações tradicionais REST + TypeScript, é comum manter tipos duplicados:

    • Backend define os tipos
    • Frontend precisa recriar manualmente esses tipos
    • Mudanças no backend desativar atualização manual no front
    • Riscos de inconsistência e erros em tempo de execução

    Uma Solução: GraphQL + Gerador de Código

    GraphQL Code Generator transforma suas consultas e mutações em código TypeScript totalmente tipado, usando o esquema como fonte única da verdade .

    Principais vantagens

    1. Tipo de segurança de ponta a ponta

    • Tipos gerados automaticamente do backend ao frontend
    • Garantias em tempo de compilação
    • Autocomplete completo na IDE

    2. Detecção Automática de Breaking Changes

    • Mudanças no esquema são bloqueadas instantaneamente
    • Erros de compilação quando tipos ficam desatualizados
    • Impossível usar campos que não foram solicitados na consulta

    3. Produtividade Acelerada

    • Eliminação de trabalho manual de criar tipos
    • Foco no desenvolvimento da lógica de negócio
    • Composables prontos para uso com reatividade do Vue

    4. Experiência do desenvolvedor superior

    • Documentação embutida na IDE
    • Validação em tempo real
    • Redução significativa de bugs

    Configuração no Projeto

    1. Configuração do Gerador de Código GraphQL

    // codegen.ts 
    import  type { CodegenConfig } from  '@graphql-codegen/cli'
    const  config : CodegenConfig = { 
      overwrite : true , 
      schema : ` ${process.env.VITE_API_SERVICE_URL} /graphql` , 
      documents : [ 'src/graphql/**/*.gql' ], 
      generates : { 
        'src/generated/graphql.ts' : { 
          plugins : [ 
            'typescript' , 
            'typescript-operations' , 
            'typescript-vue-apollo'
           ], 
          config : { 
            withCompositionFunctions : true , 
            vueApolloComposableImportFrom : '@vue/apollo-composable' , 
            vueCompositionApiImportFrom : 'vue' , 
            skipTypename : true , 
            dedupeOperationSuffix : true , 
            documentMode : 'documentNode'
           } 
        } 
      } 
    }

    2. Definindo Consultas GraphQL

    # src/graphql/queries/GetProducts.gql 
    query GetProducts ( 
      $offset : Int ! 
      $limit : Int ! 
      $search : String 
      $category : String 
    )  {
       getProducts ( 
        input :  { 
          offset :  $offset 
          limit :  $limit 
          search :  $search 
          category :  $category 
        } 
      )  {
         data {
           id 
          name 
          description 
          price 
          category 
          inStock 
          createdAt 
        }
         total 
      } 
    }

    3. Arquivo Gerado Automaticamente

    O Code Generator cria tipos e composables prontos para uso:

    // src/generated/graphql.ts (gerado automaticamente) 
    export  type  GetProductsQueryVariables = Exact <{ 
      offset : Scalars [ 'Int' ][ 'input' ]; 
      limit : Scalars [ 'Int' ][ 'input' ]; 
      search?: InputMaybe < Scalars [ 'String' ][ 'input' ]>; 
      category?: InputMaybe < Scalars [ 'String' ][ 'input' ]>; 
    }>;
    export  type  GetProductsQuery = { 
      getProducts : { 
        data : Array <{ 
          id : string ; 
          name : string ; 
          description?: string | null ; 
          price : number ; 
          category : string ; 
          inStock : boolean ; 
          createdAt : string ; 
        }>; 
        total : number ; 
      }; 
    }; 
    export  function  useGetProductsQuery ( 
      variables: GetProductsQueryVariables | VueCompositionApi.Ref<GetProductsQueryVariables>, 
      options?: VueApolloComposable.UseQueryOptions<GetProductsQuery, GetProductsQueryVariables>
     ) { /* ... */ }

    Usando no Componente Vue

    Aqui está um exemplo real de como usar os elementos que podem ser compostos gerados:

    < template > 
      < div > 
        < SearchInput  
          v-model = "searchTerm" 
          placeholder = "Buscar produtos..."
         /> 
        
        < LoadSpinner  v-if = "loading" /> 
        
        < ErrorMessage  
          v-if = "errorExist" 
          message = "Não foi possível carregar os produtos"
         /> 
        
        < ProductList  :products = "products" /> 
      </ div > 
    </ template >
    <script setup lang= "ts" > 
    import { ref, computed } from  'vue' 
    import { useGetProductsQuery } from  '@/generated/graphql' 
    // Estado reativo 
    const searchTerm = ref ( '' ) 
    const products = ref ([]) 
    const errorExist = ref ( false ) 
    // Variáveis ​​da query (reativas) 
    const queryVariables = computed ( () => ({ 
      offset : 0 , 
      limit : 20 , 
      search : searchTerm.value , category 
      : ' electronics'
     })) 
    // Composable gerado automaticamente com tipos completos 
    const { loading, onResult, onError } = useGetProductsQuery ( 
      queryVariables, 
      { 
        fetchPolicy : ' cache - and-network' }
       ) 
    // 
    Handlers com tipos inferidos automaticamente onResult 
    ( ( result ) => {   // result.data é 
      totalmente tipado! products.value = result.data.getProducts.data.map ( produto => ({ id : produto. id , título : produto. nome , subtítulo : produto. descrição || 'Sem descrição' , preço : produto. preço , disponível : produto. em estoque   })) }) onError ( ( erro ) => {   erroExist. valor = true console . erro ( 'Erro ao carregar produtos:' , erro) }) </script>
    
    

    Benefícios Autocomplete Inteligente

    Ao acessar result.data.getProducts.data[0]., o IDE sugere apenas os campos que você solicita na consulta do GraphQL. Se tentar acessar um campo não solicitado, erro de compilação!

    Refatoração Segura

    Mudou o nome de um campo no backend? O TypeScript acusará erro em todos os lugares onde aquele campo é usado no front-end.

    Validação de Variáveis

    As variáveis ​​da consulta são validadas no tempo de construção. Tipos errados ou campos obrigatórios faltando = erro antes mesmo de rodar o código.

    Reatividade Nativa do Vue

    Os composables gerados se integram perfeitamente à Composition API, suportando refcomputede toda a reatividade do Vue 3.

    Fluxo de trabalho de desenvolvimento

    1. Designer cria/atualiza uma consulta GraphQL em.gql
    2. Roda o codegen :npm run codegen
    3. Importar o composable gerado sem componente
    4. TypeScript garante que tudo está correto
    5. IDE oferece preenchimento automático completo

    Mutações com Segurança de Tipo

    O mesmo vale para mutações:

    < script  setup  lang = "ts" > 
    import { useCreateProductMutation } from '@/generated/graphql'
    const { mutate : createProduct, loading, onDone } = useCreateProductMutation () 
    const  handleSubmit = async ( formData ) => { 
      await  createProduct ({ 
        input : { name 
          : formData.name , price 
          : formData.price , // TypeScript valida todos os campos!     }   }) } onDone ( ( result ) => { // result totalmente tipado console.log ( ' Produto criado : ' , result.data.createProduct.id ) } ) </script>
    

    Conclusão

    A combinação de GraphQL + Code Generator + Vue Apollo Composable oferece:

    ✅ Zero esforço manual para manter tipos sincronizados
    ✅ Detecção automática de alterações quebradas
    ✅ Developer Experience superior com autocomplete total
    ✅ Type safety end-to-end do backend ao UI
    ✅ Integração perfeita com Vue 3 Composition API
    ✅ Menos bugs em produção

    Se você usa GraphQL no front-end sem gerador de código, está perdendo uma das maiores vantagens da tecnologia. A produtividade e a segurança que essa pilha oferece transformam completamente o desenvolvimento de aplicações modernas.

  • Começar 2026 mexe comigo de um jeito diferente

    Começar 2026 mexe comigo de um jeito diferente

    Quando o iMasters nasceu, há quase 25 anos, a internet no Brasil ainda engatinhava. Tudo era mais lento, mais incerto e, ao mesmo tempo, cheio de possibilidades. O que existia era curiosidade, vontade de compartilhar conhecimento e a convicção de que aprender em comunidade podia transformar carreiras e abrir caminhos.

    Ao longo dessa história, vi tecnologias surgirem, promessas desaparecerem, modas passarem e outras se tornarem pilares. Vi pessoas começarem como curiosas, se tornarem profissionais, líderes, referências. Vi eventos pequenos crescerem, encontros virarem tradição e conversas mudarem rumos.

    O iMasters sempre foi isso: um ponto de encontro.
    De ideias, de pessoas, de perguntas melhores do que respostas prontas.

    Chegar a 2026 sabendo que o iMasters completa 25 anos é, ao mesmo tempo, emocionante e desafiador. Porque olhar para trás traz orgulho — mas olhar para frente exige coragem.

    Vivemos um momento em que a tecnologia, especialmente a inteligência artificial, surpreende todos os dias. E talvez esse seja o paralelo mais bonito com a história do iMasters: a capacidade de se reinventar, de aprender continuamente e de não ter medo do novo.

    Se os primeiros 25 anos foram sobre construir, compartilhar e conectar, os próximos serão sobre surpreender ainda mais. Com conteúdos mais relevantes, eventos mais vivos — online e presenciais — e conversas que ajudem a entender não só para onde a tecnologia vai, mas para onde nós vamos junto com ela.

    2026 não é apenas mais um ano.
    É um marco.
    E, sinceramente, tenho a sensação de que a história mais surpreendente do iMasters ainda está sendo escrita.

    Seguimos juntos. 🚀

  • Portfólio em T.I.: O que realmente importa para quem está começando

    Portfólio em T.I.: O que realmente importa para quem está começando

    Entenda como montar um portfólio em tecnologia da informação mesmo sem experiência profissional

    Uma das frases mais comuns entre estudantes de Tecnologia da Informação é:

    “Ainda não tenho portfólio porque não sei o suficiente.”

    Essa crença é um dos principais fatores que atrasam a entrada de iniciantes no mercado de tecnologia e a construção de um bom portfólio em T.I.

    Portfólio em T.I. não é prova de genialidade técnica. É prova de aprendizado em movimento.

    Este artigo complementa o Artigo #1 da coluna Empregabilidade em T.I., mostrando como transformar aprendizado acadêmico em ativo de carreira.

    O maior mito sobre portfólio em T.I.

    Esse pensamento cria uma expectativa irreal sobre o que é um portfólio no início da carreira.

    Muitos iniciantes acreditam que um bom portfólio em tecnologia precisa ter:

    • Projetos complexos
    • Arquitetura avançada
    • Tecnologias da moda
    • Soluções “inovadoras”

    Na prática, o mercado não espera isso de um iniciante.

    Para vagas de estágio e posições júnior, o portfólio serve para responder perguntas simples:

    • Essa pessoa consegue começar e terminar algo?
    • Sabe organizar minimamente um projeto?
    • Entende o que está fazendo?
    • Consegue explicar suas escolhas técnicas?

    Um projeto simples, funcional e bem explicado vale mais do que vários projetos abandonados.

    O que o mercado realmente avalia em um portfólio em T.I. para iniciantes

    Mais do que tecnologias específicas, recrutadores e líderes técnicos observam sinais claros de maturidade profissional, como:

    • Clareza: é fácil entender o objetivo do projeto?
    • Organização: o código segue uma estrutura mínima?
    • Consistência: há mais de um projeto concluído?
    • Evolução: projetos mais recentes mostram progresso?
    • Comunicação: o autor consegue explicar o projeto?

    Portfólio é menos sobre tecnologia específica e mais sobre postura profissional.

    Projetos que funcionam em um portfólio de T.I. iniciante

    Projetos eficazes para um portfólio em T.I. costumam resolver problemas simples e reais.

    Alguns exemplos:

    • Aplicação CRUD funcional
    • Pequeno sistema web com login e listagem
    • Automação de tarefas repetitivas
    • Scripts de organização ou análise de dados
    • Dashboards simples com dados públicos

    Mais importante do que a complexidade é:

    • O projeto funcionar de ponta a ponta
    • Ter um README claro
    • Explicar decisões técnicas
    • Estar finalizado

    O que não vale tanto esforço em um portfólio para iniciantes

    Aqui estão erros comuns que mais atrapalham do que ajudam no início da carreira:

    • Copiar projetos prontos sem entender
    • Seguir tutoriais sem personalização
    • Começar projetos grandes demais
    • Usar muitas tecnologias sem domínio
    • Focar apenas em aparência visual

    Portfólio não é vitrine de ego. É uma ferramenta de comunicação profissional.

    Onde e como apresentar seu portfólio em T.I.

    Para iniciantes, o básico bem feito é mais do que suficiente:

    • GitHub organizado
    • README explicando cada projeto
    • Link do GitHub no LinkedIn
    • Descrição clara do que está aprendendo

    Um GitHub honesto e bem documentado gera mais confiança do que um site sofisticado sem conteúdo relevante.

    Caminho prático para montar seu portfólio em tecnologia

    Para quem quer começar sem travar, um caminho simples e sustentável é:

    • Escolher um problema simples
    • Desenvolver uma solução funcional
    • Documentar o projeto
    • Publicar no GitHub
    • Repetir o processo

    Um projeto por mês, ao longo da graduação, cria um portfólio sólido e sustentável.

    Considerações finais

    Portfólio em T.I. não é um pré-requisito para começar. É consequência de quem começa.

    No início da carreira em tecnologia, consistência vale mais do que complexidade — e essa é uma das chaves da empregabilidade em T.I.

    Próximo artigo da coluna

    No próximo artigo da coluna Empregabilidade e Carreira em T.I., vamos abordar:

    Estágio em Tecnologia: Por que tantos alunos não conseguem (e como virar o jogo)

  • Posso utilizar o Visual Studio Community na minha empresa para desenvolver Integration Services, Analysis Services e Reporting Services?

    Posso utilizar o Visual Studio Community na minha empresa para desenvolver Integration Services, Analysis Services e Reporting Services?

    Hoje vamos mergulhar em um tema que gera muita confusão na cabeça de DBAs, desenvolvedores de BI e gestores de TI: a evolução das ferramentas de desenvolvimento para o ecossistema SQL Server e, principalmente, o polêmico licenciamento do Visual Studio Community para projetos de dados na stack de BI do SQL Server.

    Muitas vezes me perguntam: “Dirceu, eu trabalho em uma multinacional, posso usar o Visual Studio Community para desenvolver meus pacotes de SSIS ou meus cubos de Analysis Services?”. A resposta curta é: SIM, e eu vou te provar o porquê usando a própria documentação da Microsoft, além de passar por toda a linha do tempo desde os tempos áureos do BIDS.

    A Era do BIDS: Onde tudo começou

    Para quem é da velha guarda como eu, você deve se lembrar do BIDS (Business Intelligence Development Studio).

    Esse produto surgiu lá no SQL Server 2005 e se consolidou na versão 2008 e 2008 R2. Naquela época, a experiência era totalmente acoplada ao instalador do SQL Server. Você abria o “Setup.exe” do SQL, selecionava as ferramentas de cliente e, magicamente, tinha um Visual Studio 2008 minimalista instalado na sua máquina, focado exclusivamente em projetos de BI.

    O BIDS era robusto para a época, mas sofria com o descompasso entre as versões do Visual Studio e as versões do SQL Server. Muitas vezes estávamos usando um VS 2008 para desenvolver para um banco de dados que já suportava recursos muito mais modernos.

    A Transição para o SSDT (SQL Server Data Tools)

    Com a chegada do SQL Server 2012, a Microsoft mudou a nomenclatura e a estratégia. O BIDS morreu e deu lugar ao SSDT (SQL Server Data Tools).

    Aqui começou uma fase de certa confusão, pois existiam versões diferentes do SSDT: uma para Database Projects (o antigo “DataDude”) e outra para Business Intelligence (SSAS, SSIS, SSRS).

    Nesse período, a Microsoft passou a disponibilizar o “Visual Studio Shell”. Era uma versão gratuita e limitada do Visual Studio que servia apenas como “hospedeira” para os templates de projetos de BI. Se você não tivesse o Visual Studio pago (Professional ou Enterprise), o instalador do SSDT instalava esse Shell para você.

    O Marco do Visual Studio Community (2015 até 2026)

    A partir da versão 2015 do Visual Studio, o jogo mudou completamente. A Microsoft lançou a edição Community, substituindo as antigas edições “Express”.

    A ideia era dar uma ferramenta completa (com suporte a extensões, refatoração, testes, etc.) para desenvolvedores independentes, pequenas empresas e projetos open source.

    No entanto, para o nosso mundo de SQL Server, houve uma mudança técnica fundamental. O SSDT deixou de ser um instalador “stand-alone” com Shell próprio para se tornar uma carga de trabalho (workload) ou uma extensão dentro do Visual Studio.

    Observação: A partir do Visual Studio 2019 e 2022, e continuando agora na versão 2026, você não baixa mais um instalador de “SSDT-BI”. Você instala o Visual Studio e, dentro dele, baixa as extensões “Microsoft Analysis Services Projects”, “Microsoft Integration Services Projects” e “Microsoft Reporting Services Projects” diretamente do Marketplace.

    Performance e Arquitetura: 32-bit vs 64-bit

    Um ponto técnico crucial na evolução foi a migração do Visual Studio para 64-bit, que ocorreu na versão 2022. Até o VS 2019, o ambiente de design (devenv.exe) era um processo de 32 bits. Isso limitava muito o desenvolvimento de pacotes complexos de SSIS ou modelos tabulares gigantescos de SSAS, pois o Visual Studio frequentemente travava por falta de memória (o famoso erro de OutOfMemory).

    Com o VS 2022 e agora o 2026, o ambiente de desenvolvimento é 64-bit nativo. Isso permite que você manipule metadados muito maiores sem que a IDE trave.

    Alerta Crítico: Embora a IDE agora seja 64-bit, o Runtime do Integration Services ainda pode exigir execução em 32-bit se você utilizar drivers antigos (como drivers Access ou Excel via Jet/ACE). Fique atento à propriedade “Run64BitRuntime” nas configurações de debug do projeto.

    Evolução das Versões: De 2015 a 2026

    Abaixo, preparei uma tabela comparativa sobre como as ferramentas de BI se comportaram ao longo das versões do Visual Studio:

    Licenciamento Community em Empresas “Enterprise”

    Existe um tópico nos termos da licença Community de que empresas com faturamento superior a 1 milhão de dólares ou mais de 250 computadores (a definição de “Enterprise” da Microsoft) são terminantemente proibidas de usar a edição Community.

    Se você ler apenas o resumo da licença, pode chegar a essa conclusão. Mas o segredo está nas exceções. Vamos analisar o texto oficial da licença (versões 2022 e 2026):

    Existe um item na licença do Visual Studio Community 2022 que diz o seguinte:

    1) DIREITOS DE INSTALAÇÃO E USO
    a. Licença Individual: Se você for uma pessoa física trabalhando em seus próprios aplicativos, seja para vendê-los ou para qualquer outra finalidade, você poderá usar o software para desenvolver e testar esses aplicativos.
    b. Licença Organizacional: Se você for uma organização, seus usuários poderão usar o software da seguinte forma:

    1. Qualquer quantidade de seus usuários poderá usar o software para desenvolver e testar aplicativos liberados de acordo com as licenças de software livre aprovados pela Iniciativa de Software Livre (OSI).
    2. Qualquer quantidade de usuários poderá usar o software para desenvolver e testar extensões para o Visual Studio.
    3. Qualquer quantidade de usuários poderá usar o software para desenvolver e testar drivers de dispositivos para o sistema operacional Windows.
    4. Qualquer quantidade de usuários poderá usar o software somente para o desenvolvimento do Microsoft SQL Server quando estiver usando o SQL Server Data Tools ou as extensões “Microsoft Analysis Services Projects”, “Microsoft Reporting Services Projects” ou “SQL Server Integration Services Projects” para desenvolver projetos de banco de dados do Microsoft SQL Server ou Analysis Services, Reporting Services, Servidor de Relatórios do Power BI ou projetos do Integration Services.
    5. Qualquer número de seus usuários poderá usar o software para desenvolver e testar seus aplicativos como parte do treinamento em sala de aula online ou presencial ou ainda para executar pesquisa acadêmica.
    6. Se nenhuma das condições acima se aplicarem e você também não for uma empresa (definida abaixo), até cinco dos seus usuários individuais poderão usar o software simultaneamente para desenvolver e testar seus aplicativos.
    7. Se você for uma empresa, seus funcionários e prestadores de serviços não poderão usar o software para desenvolver nem testar seus aplicativos, exceto para: (i) software livre; (ii) extensões do Visual Studio; (iii) drivers de dispositivo para o sistema operacional Windows; (iv) desenvolvimento do SQL Server; e (v) fins de treinamento, conforme permitido anteriormente. “Empresa” é qualquer organização e suas afiliadas que possuem, coletivamente, (a) mais de 250 PCs ou usuários ou (b) mais de um milhão de dólares americanos (ou o equivalente em outras moedas) em receitas anuais, e “afiliadas” significa essas entidades que controlam (por meio de participação majoritária), são controladas ou estão sob controle comum em uma organização.

    Na licença do Visual Studio Community 2026, temos o seguinte texto:

    2) DIREITOS DE INSTALAÇÃO E USO
    a. Disposições gerais: Sujeito a (b) e (c) a seguir, um ou mais usuários podem instalar e usar cópias do software em seus dispositivos para desenvolver e testar aplicativos. Isso inclui usar cópias do software em seus próprios servidores internos que permanecem totalmente dedicados a seu próprio uso. No entanto, você não pode separar os componentes do software (exceto quando indicado de outra forma nestes termos de licença) e executá-los em um ambiente de produção, em dispositivos de terceiros, ou para qualquer finalidade que não seja desenvolver e testar seus aplicativos. A execução do software no Microsoft Azure pode implicar em taxas de uso à parte.
    b. Licença Individual: Se você for uma pessoa física trabalhando em seus próprios aplicativos, seja para vendê-los ou para qualquer outra finalidade, você poderá usar o software para desenvolver e testar esses aplicativos.
    c. Licença Organizacional: Se você for uma organização, seus usuários poderão usar o software da seguinte forma:
    – Qualquer número de usuários pode usar o software para desenvolver e testar:

    1. aplicativos lançados sob licenças de software de código aberto aprovadas pela Open Source Initiative (OSI)
    2. extensões para o Visual Studio
    3. drivers de dispositivo para o sistema operacional Windows
    4. suas aplicações como parte de treinamento e educação presencial ou on-line, ou para realizar pesquisas acadêmicas
    5. Projetos de banco de dados do Microsoft SQL Server ou projetos do Analysis Services, Reporting Services, Power BI Report Server ou Integration Services ao usar o SQL Server Data Tools ou as extensões “Microsoft Analysis Services Projects”, “Microsoft Reporting Services Projects” ou “SQL Server Integration Services Projects”.

    – Se nenhuma das opções (1) a (5) acima se aplicar, e você também não for uma empresa (definida abaixo), até 5 de seus usuários individuais poderão usar o software simultaneamente para desenvolver e testar seus aplicativos.

    d. Uso empresarial

    • Uma “empresa” é qualquer organização e suas afiliadas que possuem, coletivamente, (a) mais de 250 PCs ou usuários ou (b) mais de um milhão de dólares americanos (ou o equivalente em outras moedas) em receitas anuais, e “afiliadas” significa essas entidades que controlam (por meio de participação majoritária), são controladas por ou estão sob controle comum em uma organização.
    • Se você for uma empresa, seus funcionários e contratados não poderão usar o software para desenvolver ou testar seus aplicativos, exceto para os usos listados na Seção 2(c) acima.
    Atenção: Isso significa que, independentemente do tamanho da sua empresa, você PODE usar o Visual Studio Community legalmente se o uso for exclusivo para desenvolvimento de SQL Server (SSIS, SSAS, SSRS e Database Projects). Mas tenha cuidado: A exceção de licenciamento não permite o uso do Visual Studio Community para desenvolvimento de aplicações corporativas internas, APIs, portais web, sistemas .NET, ferramentas internas ou qualquer outro tipo de software que não esteja diretamente relacionado ao desenvolvimento de projetos de SQL Server.

    Essa é uma informação valiosíssima para o DBA que precisa justificar a instalação da ferramenta para o time de Compliance ou Auditoria. Você não precisa gastar milhares de dólares em licenças Professional ou Enterprise se o seu time vai apenas construir pipelines de dados no Integration Services ou cubos do Analysis Services.

    Conclusão

    A evolução do Visual Studio para o ecossistema SQL Server mostra um amadurecimento da Microsoft em separar a IDE (o ambiente de desenvolvimento) dos componentes de servidor. O Visual Studio Community é uma ferramenta poderosíssima e, como vimos, perfeitamente legal para o uso profissional dentro de qualquer empresa, desde que o foco seja o desenvolvimento de objetos do SQL Server.

    Entender o licenciamento não é apenas uma tarefa do setor jurídico, mas também do DBA que atua como mentor tecnológico na empresa, garantindo que o time tenha as melhores ferramentas sem custos desnecessários.

    Espero que tenham gostado dessa postagem, um grande abraço e até a próxima!

  • O impacto da IA generativa no suporte técnico: o que muda para TI

    O impacto da IA generativa no suporte técnico: o que muda para TI

    O avanço da IA generativa nos ambientes corporativos está pressionando áreas historicamente operacionais a revisarem seus modelos de atuação. O service desk é um dos casos mais visíveis. A adoção de LLMs (Large Language Models) em fluxos de atendimento técnico alterou não apenas a jornada do usuário, mas a própria lógica de triagem, resolução e escalonamento de incidentes. O ponto central não é se a IA substitui o analista, mas sim como ela redesenha a arquitetura operacional e impõe novas exigências à equipe de suporte.

    Diferentemente das ondas anteriores de automação, centradas em scripts estáticos e bots de interação linear, o que se vê agora é a incorporação de motores de linguagem capazes de interpretar, inferir e sugerir ações a partir de descrições ambíguas ou mal formuladas. Isso altera radicalmente o desenho de operação dos service desks, reposicionando o analista humano como um elo crítico entre o conhecimento técnico acumulado e os sistemas de inferência probabilística que passaram a mediar parte significativa do atendimento.

    No plano tático, a introdução de IA generativa reconfigura o ciclo de vida de um chamado. A entrada, antes limitada a formulários predefinidos ou atendentes humanos, agora pode ser feita via linguagem natural, interpretada em tempo real por um modelo de linguagem treinado em tickets históricos, bases de conhecimento e logs operacionais.

    A partir desse ponto, o sistema classifica o chamado, sugere prioridade com base em contexto, tais como frequência, impacto, criticidade, histórico de incidentes correlatos, e até propõe soluções com base em respostas anteriores — que podem ser automaticamente redigidas, testadas e enviadas ao usuário final, dependendo do grau de autonomia definido pela política interna. O analista não desaparece desse fluxo, mas passa a operar em outra instância: como validador, auditor e — mais importante — como modelador do próprio conhecimento que alimenta a IA.

    Um novo campo de atuação para o atendimento humano

    Esse deslocamento funcional exige uma requalificação estrutural do papel do analista. A lógica anterior, centrada na execução direta e no conhecimento operacional tácito, dá lugar a uma demanda por competências interpretativas e estruturantes. O analista precisa entender como a IA toma decisões, quais vieses podem comprometer a acurácia das sugestões, como os dados de entrada,  sintéticos, ruidosos ou incompletos, afetam o resultado, e de que modo se controla a degradação de performance dos modelos com o tempo.

    Esse novo perfil não é um luxo de empresas de ponta, mas uma resposta direta às pressões por redução de SLA e aumento da taxa de resolução de primeira linha. Em muitas operações, os tickets de baixa complexidade estão sendo inteiramente absorvidos por sistemas de IA. Isso tende a elevar artificialmente a complexidade média dos chamados restantes, o que, se não for devidamente interpretado pelas lideranças, pode dar a falsa impressão de queda de performance humana, quando na verdade é reflexo da filtragem automatizada.

    É nesse ponto que o analista precisa ser mais do que um resolvedor de tickets: ele passa a ser um intérprete da própria estrutura do suporte, atuando na reconfiguração contínua dos fluxos, na calibragem dos modelos e na gestão ativa da base de conhecimento.

    Curva de adoção no Brasil

    No país, existem diferentes estágios de adoção dessas tecnologias. Enquanto grandes operações corporativas já testam copilotos de IA para auxiliar seus analistas em tempo real, sugerindo scripts, comandos ou diagnósticos com base em padrões extraídos de tickets anteriores, a maioria das empresas opera em um modelo híbrido, onde fluxos automatizados convivem com zonas manuais de contenção.

    A questão central, porém, é menos tecnológica do que organizacional: a IA já está presente, mas o arcabouço de governança, curadoria de dados e capacitação técnica ainda engatinha. Isso gera uma tensão estrutural: a promessa de ganho de eficiência não se sustenta se a equipe humana não souber operar, validar e evoluir o sistema.

    Outro ponto relevante é a forma como a IA responde às demandas. Modelos generativos operam por inferência estatística, ou seja, sugerem a resposta mais provável, não necessariamente a mais correta. Em ambientes de suporte técnico, onde a margem de erro pode comprometer a segurança da informação, a estabilidade do ambiente ou o atendimento a requisitos regulatórios, isso impõe a necessidade de filtros humanos qualificados.

    A supervisão analítica passa a ser mandatória: o analista precisa saber identificar alucinações do modelo, respostas fora de escopo ou inferências equivocadas geradas por bases mal treinadas.

    Essa supervisão, aliás, é parte de uma camada estratégica de operação que tende a se expandir. Na medida q em que a IA assume tarefas de baixa densidade cognitiva, o analista de suporte é puxado para camadas de decisão mais complexas, como a integração entre ferramentas de observabilidade e sistemas de resposta automática, a configuração de alertas preditivos com base em aprendizado contínuo, ou a definição de parâmetros de auto escalonamento.

    O suporte técnico passa a ser, então, um nó crítico na cadeia de resiliência operacional das empresas. E o analista que se adapta a esse novo papel deixa de ser executor de tarefas e passa a ser curador de inteligência.

    Em síntese, a IA generativa não representa uma ameaça ao trabalho humano no suporte técnico — mas impõe uma mudança de ordem. O modelo operacional se reconfigura, e com ele a exigência de novas habilidades, novas linguagens e novos modelos mentais. O analista que entender essa transição e assumir um papel ativo na arquitetura e curadoria dos sistemas inteligentes terá não apenas lugar garantido no novo ecossistema — mas protagonismo. Ignorar esse movimento é uma escolha que cobra um preço: o da irrelevância técnica em um setor onde a automação já deixou de ser promessa e se tornou infraestrutura.

  • Segurança em containers: Docker Hardened Images como um serviço gratuito

    Segurança em containers: Docker Hardened Images como um serviço gratuito

    Aplicações nas mais variadas stacks vêm sofrendo cada vez mais com ataques de supply-chain, com vários incidentes de packages maliciosos que foram adicionados de forma inadvertida a dependências de um projeto, vulnerabilidades reportadas em pacotes e imagens Docker, dentre outras variações relacionadas a esses tipos de ocorrências. A própria OWASP Top 10 em sua versão mais atualizada (2025) lista ataques de supply-chain na 3a posição:

    https://owasp.org/Top10/2025/0x00_2025-Introduction/

    Press enter or click to view image in full size

    Considerando especificamente o mundo das aplicações/serviços containerizados e uma necessidade em maior segurança dentro do mundo corporativo, a Docker, Inc lançou ainda no mês de Maio/2025 um novo serviço: Docker Hardened Images (DHI)… Trata-se de uma solução com um amplo catálogo de imagens e charts Helm (atualmente +1000), artefatos estes otimizados visando uma maior segurança:

    Tais otimizações incluem uma menor superfície de ataque a partir do uso de distribuições baseadas em Alpine ou Debian, passando também pela remoção de componentes que não sejam essenciais nestas imagens. Há ainda um esforço contínuo em se reduzir ao máximo o número de CVEs (Common Vulnerabilities and Exposures) em tais imagens, de forma a garantir uma maior segurança na utilização das mesmas.

    Tivemos uma ótima notícia envolvendo Docker Hardened Images nesta no dia 17/12/2025 (uma quarta-feira) -> o uso de DHI passou a ser gratuito, estando sob a licença Apache 2.0 e possibilitando uma maior segurança a aplicações containerizadas desde o estágio de build:

    https://www.docker.com/blog/docker-hardened-images-for-every-developer/

    Press enter or click to view image in full size

    De qualquer forma, existirá ainda uma camada paga (Enterprise) com recursos mais avançados e que acabam por ir além dos oferecidos como uma alternativa open source.

  • Porque trocar devs juniores por IA é uma ideia imbecil e você deveria ficar tranquilo(a) — por enquanto

    Porque trocar devs juniores por IA é uma ideia imbecil e você deveria ficar tranquilo(a) — por enquanto

    Muitas pessoas perguntam a minha opinião sobre o uso das IAs generativas para codificar. Vou ser honesto: eu acho incrível. Se você sabe o que está fazendo, ou seja, já tem uma boa base em programação, a IA vai te ajudar demais aquelas inúmeras tarefinhas chatas que a programação tem, como: criar testes (cenários, por exemplo), código boilerplate, documentações e assim por diante.

    Mas se você não tem essa base, a IA se torna uma ferramenta desastrosa. Parece que vai dar tudo certo com um prompt e apertar de um botão até a coisa desandar (e água bater no bumbum).

    Arquitetura insustentável, regras básicas de segurança que não são seguidas, vazamento de dados… são algumas das coisas que começam a acontecer.

    E é por isso mesmo que quero te convencer de que se você está iniciando sua carreira em tecnologia agora, fique tranquilo(a) que você não será substituído(a) — pelo menos não se continue aprendendo, estudando, praticando e usando a IA também.

    Então vou apresentar 3 motivos que resumem tudo o que eu penso sobre o assunto:

    Motivo 1 — Há tarefas que desativam o julgamento humano

    Fazer tudo o que citei anteriormente com a IA é realmente muito bom, mas deixar decisões de arquitetura de software, avaliar trade-offs, entender as regras de negócio, modelar e ter uma visão do passado, presente e futuro do software são algumas das tarefas que existem julgamento humano, experiência e intuição.

    No blog do StackOverflow, no artigo “Generative AI is not going to build your nursing team for you” ( link aqui ), destaca que “o código gerado frequentemente […] pode não seguir práticas ou convenções, pode ter campos que não existem, variáveis ​​inventadas, etc.; frequentemente requer revisão detalhada, correção, coesão com o código existente”.

    E sim, eu sou o tipo de cara que ainda gosta de usar o StackOverlow.

    Motivo 2 — A troca de experiências e o plano de sucessão

    A única certeza que temos na vida é que um dia vamos de “arrasta pra cima”, certo? Se isso é verdade, isso significa que uma hora ou outra, mesmo os profissionais de nível uma hora vão sair das cargas. Quando isso acontecer, quem vai substituí-los? Os robôs?!

    Se as empresas substituírem juniores por IA, haverá um vácuo gigantesco no fluxo de pessoas que fariam o próximo nível (pleno, sênior) porque ninguém adquirirá aquela base de experiência. Isso é apontado por Matt Garman, CEO da AWS: ele afirmou que “ substituir desenvolvedores de nível básico por IA é ‘uma das coisas mais idiotas que já ouvi’” , justamente porque as empresas precisam de aprendizado prático para construir um tempo forte no futuro.

    Motivo 3 — Nós amamos profissionais juniores

    Todo profissional comete erros, especialmente os mais novos, mas é exatamente por isso que eles aprendem bem. Há muitos motivos para amarmos os profissionais juniores.

    Primeiramente, o seu custo de aquisição é infinitamente mais barato que o de um sênior e com isso as empresas investem na sua formação e retorno a longo prazo (foi assim comigo, por exemplo ❤).

    Além disso, eles tendem a aprender muito rápido, tem uma cabeça fresca e uma sede de aprendizado impressionandas, o que os fazem ótimos para adoção de novas tecnologias, abertura para novas formas de tranquilidade e trazer inovação para práticas antigas (que muitas vezes nem fazem mais sentido).

    Tempos formados por diferentes níveis de experiência proporcionam vivências riquíssimas para todos, como: mentorias, revisões de código, brainstorm, compartilhar conhecimento.

    É importante lembrar que desenvolver software não é apenas produzir código. É necessário construir equipe, coerência e escalar todo o know-how.

    Em resumo

    Déficit de antiguidade no futuro : se não há juniores, não haverá pessoas para subir para níveis mais elevados; isso pode deixar vezes envelhecidos ou com escassez de pessoas com experiência interativa ou plena;

    Qualidade do produto, estabilidade, manutenção : A IA pode ( e vai! ) introduzir fragilidades, dependências obscuras, dificuldades de manutenção se quem revisa não tiver conhecimento profundo.

    Sobrecarga de verificação/ajuste : usar IA não é “apertar um botão e tudo pronto”; Muito do trabalho de juniores, mesmo com IA, será revisto, corrigido, ajustado. Se não há alguém com experiência, esse custo pode subir muito ou não ser bem resolvido

    O Matt Garmam, o CEO da AWS que citei anteriormente, disse que substituir funcionários juniores por IA é “uma das coisas mais estúpidas que já ouvi”. E não poderia concordar mais.

    Mas então a IA não oferece nenhum risco? Terei meu emprego garantido?

    Eu não disso isso. Eu diria que ao invés de pensarmos em substituição temos que pensar em complementação. Eu acredito que os desenvolvedores usam ferramentas de IA para acelerar tarefas epossuem conhecimentos e habilidades importantes como: compreender algoritmos, pensamento crítico, resolução de problemas, comunicação, bons fundamentos de arquitetura, segurança, manutenção, etc.