anúncios

Mostrando postagens com marcador DesenvolvimentoFrontend. Mostrar todas as postagens
Mostrando postagens com marcador DesenvolvimentoFrontend. Mostrar todas as postagens

terça-feira, 22 de setembro de 2026

Como entregar valor de verdade nos seus primeiros 90 Dias como Desenvolvedor

Entrar em um novo emprego ou conquistar o primeiro papel como desenvolvedor é incrível, mas costuma vir acompanhado de uma boa dose de ansiedade. É muito comum querer "mostrar serviço" logo na primeira semana, tentando resolver problemas gigantescos ou enviar centenas de linhas de código em um único Pull Request. No entanto, tentar abraçar o mundo no início costuma causar mais erros e frustrações do que resultados positivos.

Para ter uma transição suave e construir uma carreira sólida na nova empresa, o segredo é dividir os seus três primeiros meses em três fases estratégicas: Compreensão, Confiabilidade e Propriedade (Ownership).

O valor real de um desenvolvedor nos primeiros dias não vem da quantidade de código que ele escreve, mas sim do quanto ele entende o contexto e o negócio antes de agir.

Mês 1: Compreensão e Contexto

O foco total do primeiro mês deve ser absorver conhecimento sobre a empresa, a equipe e o produto. Não tente revolucionar a arquitetura nos primeiros 30 dias.

  • Entenda o motivo da vaga: A estratégia começa antes do Dia 1. Tente resgatar das entrevistas qual problema a equipe estava tentando resolver ao abrir a vaga. Isso dá uma pista direta do que eles consideram como sucesso.
  • Aprenda o Negócio: Identifique quem são os principais clientes, quais produtos geram mais receita e como a empresa ganha dinheiro. Desenvolvedores que entendem as regras de negócio entregam soluções muito mais inteligentes.
  • Busque por tarefas simples: Pegue tickets básicos, como trocar a cor de um botão ou alterar um texto. O objetivo aqui não é o impacto do código em si, mas entender o fluxo do time: como funcionam os Code Reviews, testes automatizados e o pipeline de CI/CD.
  • Aproveite a "visão de fora": Você nunca mais terá o olhar do recém-chegado. Aproveite esse período para documentar o processo de onboarding, atualizar manuais defasados e anotar gargalos nos processos antes que você se acostume com eles.

Mês 2: Confiabilidade (Reliability)

No segundo mês, após compreender a dinâmica da empresa, o foco se volta para a construção de confiança com seu gestor e seus pares.

  • Cumpra o que promete: Torne-se alguém previsível. Se estimou uma data ou aceitou um ticket, faça o possível para entregar dentro do alinhado.
  • Comunique impedimentos cedo: Encontrou um bloqueio técnico ou percebeu que a tarefa vai atrasar? Avise a equipe o quanto antes. O maior erro é guardar o problema para si e avisar apenas na reunião diária no dia da entrega.
  • Tenha autonomia de ponta a ponta: Ao assumir uma tarefa, acompanhe-a desde a fase de testes em staging até a validação em produção, sem precisar que alguém te lembre de fazer isso.

Mês 3: Sentimento de Dono (Ownership) e Proatividade

Chegando ao final do período de experiência, é hora de agir com mais autonomia e demonstrar impacto direto no produto e na equipe.

  • Domine uma área do projeto: Torne-se a pessoa de referência em algum módulo específico do sistema (por exemplo, no serviço de autenticação ou no fluxo de pagamentos).
  • Seja mais proativo e menos reativo: Em vez de apenas esperar pelas demandas prontas do formulário, identifique falhas na codebase, sugira pequenas melhorias de arquitetura e ajude no refinamento de novas tarefas.
  • Busque feedback real: Não espere a avaliação formal de 90 dias. Peça reuniões rápidas com seu gestor e colegas de time perguntando diretamente: O que posso melhorar ou ajustar no meu trabalho para o próximo mês?.

Considerações finais

Evoluir em uma empresa é uma maratona, não uma corrida de 100 metros. Entender o ecossistema no Mês 1, demonstrar consistência e confiabilidade no Mês 2, e assumir a responsabilidade pelas suas entregas no Mês 3 é a forma mais sustentável de garantir seu sucesso e crescimento como desenvolvedor.

Foque no processo, tire a pressão de saber tudo no primeiro dia e construa sua reputação passo a passo!

Feito!

sexta-feira, 17 de julho de 2026

Como sobreviver à "Inflação dos Tokens" com uma estrutura híbrida e local

Se você acompanha o mercado de tecnologia, certamente percebeu o burburinho recente. O lançamento de supermodelos como o Claude Fable 5 (derivado da poderosa e restrita família Mythos da Anthropic) trouxe um balde de água fria para a comunidade de desenvolvimento: o fim das assinaturas com uso ilimitado.

A era em que usávamos modelos de inteligência artificial de ponta de forma indiscriminada por uma taxa fixa mensal está chegando ao fim. O plano fixo virou um verdadeiro "taxímetro" de créditos e consumo real de tokens.

Mas por que isso aconteceu? E, mais importante, como nós, desenvolvedores e arquitetos de software, podemos nos adaptar a essa nova realidade sem ir à falência?

O Paradoxo da Memória: LLMs vs. Humanos

Para entender o limite dos LLMs, precisamos primeiro desmistificar o que eles são. Existe uma analogia fantástica para isso: a limitação de um LLM é muito parecida com a limitação da mente humana.

Pense bem. Um humano estuda durante anos, lê centenas de livros, faz cursos e consome horas de conteúdo de diversos assuntos. O aprendizado é eterno; sempre haverá algo que ainda não sabemos e precisamos continuar estudando. Porém, por mais inteligente que um profissional seja, ele tem uma capacidade de atenção limitada no momento presente (sua memória de trabalho). Se você lhe entregar um relatório de 1.000 páginas e exigir que ele correlacione instantaneamente uma linha da página 2 com outra da página 900, ele vai falhar ou demorar muito.

O mesmo se aplica aos LLMs:

Memória de Longo Prazo (Treinamento): O modelo foi treinado com bilhões de parâmetros de diversos assuntos. O conhecimento estático está lá.

Memória de Curto Prazo (Janela de Contexto): Na hora de resolver um problema na IDE, o modelo precisa carregar as informações na "janela de contexto". Encher o prompt de dados desnecessários gera sobrecarga cognitiva na IA (alucinações) e, principalmente, consome tokens de forma brutal.

Com as empresas de IA repassando o custo real de infraestrutura para o usuário, carregar contextos gigantescos em modelos proprietários caros tornou-se insustentável. A contabilidade bateu na porta do desenvolvimento de software.

A Rota de Fuga: IA Open Source e Execução Local

Se a "inflação de tokens" encareceu as APIs de nuvem, a comunidade Open Source nos deu a resposta perfeita: rodar modelos menores localmente para tarefas do dia a dia.

Hoje, máquinas comuns de desenvolvimento conseguem rodar com extrema facilidade e fluidez modelos eficientes de até 7B ou 8B parâmetros, como o recente Gemma 4 (Google) ou o Llama 3 (Meta).

Montar um ecossistema de IA local e totalmente gratuito é extremamente simples com três ferramentas:

Ollama (O Motor): Gerencia e executa seus LLMs locais em segundo plano de forma leve e rápida no sistema operacional.

Open WebUI (A Interface): Uma interface web fantástica, idêntica ao ChatGPT, que roda localmente. Ela permite gerenciar conversas, criar prompts do sistema e até fazer RAG (conversar com seus arquivos e PDF locais).

Continue.dev (A Integração na IDE): Uma extensão de código aberto para o VS Code que se conecta diretamente ao seu Ollama local. Ela atua como seu copiloto na geração de código, autocomplete e explicações, direto no editor.

Estratégia Híbrida: Mapeando suas Tarefas para Economizar

Para não ter que abrir mão do poder de modelos gigantescos (como o Claude Fable 5 ou o GPT-4o) quando eles forem realmente necessários, a melhor prática de engenharia é adotar uma abordagem híbrida.

Divida suas tarefas diárias com base no custo computacional e de raciocínio necessário utilizando a tabela de referência abaixo:

Complexidade Exemplo de Tarefa Modelo Recomendado Onde Rodar Custo por Token
Baixa Autocomplete de sintaxe, formatação de arquivos JSON, geração de documentação de métodos (Docstrings), refatoração simples de funções. Gemma 4 2B / 4B ou Qwen 2.5 3B Local (Ollama + VS Code) Zero (Custo Local)
Média Explicação de trechos de arquitetura de código, debug de erros comuns de runtime, geração de testes unitários com base em regras bem definidas. Gemma 4 12B ou Llama 3.1 8B Local ou API de baixo custo Extremamente baixo
Alta Arquitetura de microsserviços do zero, refatorações profundas aplicando Clean Architecture e SOLID, resolução de bugs complexos de concorrência ou segurança. Claude Fable 5 ou GPT-4o API comercial em nuvem Pago por uso (Taxímetro)

Considerações finais:

O Dev Consciente é o Novo Tech Lead da IA

O "fim do hype" não é um retrocesso; é um amadurecimento saudável do mercado de tecnologia. A ferramenta de IA deixou de ser uma "mágica de uso infinito" para se tornar um recurso de engenharia gerenciável, com custos, limites e arquitetura apropriada.

Como desenvolvedores, nossa missão agora é sermos inteligentes no uso da ferramenta de IA. Ao dominar o ecossistema local com ferramentas como o Ollama e utilizá-lo para 80% do nosso fluxo de trabalho básico, economizamos recursos preciosos para acionar a "artilharia pesada" da nuvem somente quando o desafio realmente exigir.

E você, já montou o seu ecossistema de IA local ou ainda está sofrendo com as contas das APIs na nuvem? Deixe sua experiência nos comentários!

Feito!

segunda-feira, 13 de julho de 2026

Upload de arquivos no desenvolvimento de software do jeito certo

Para quem está de fora ou mesmo para desenvolvedores que estão iniciando na carreira, a funcionalidade de upload de arquivos parece uma das tarefas mais simples e triviais do desenvolvimento de software. A experiência do usuário moderno é quase mágica: basta arrastar uma foto de perfil ou um vídeo pesado para uma caixinha na tela, e o navegador faz o resto. No entanto, por trás dessa interface amigável e minimalista, esconde-se uma complexidade arquitetural gigantesca.

Se você lida com o desenvolvimento de sistemas escaláveis, sabe que tratar o upload de arquivos simplesmente como um POST tradicional que recebe um binário e o cospe em um diretório ou banco de dados é uma receita certa para o desastre. Neste artigo, vamos explorar por que essa abordagem falha, as dores do crescimento de uma infraestrutura e como desenhar uma arquitetura robusta inspirada nos padrões de grandes players de tecnologia.

O perigo da abordagem tradicional: Banco de Dados e diretórios locais

Quando começamos a construir uma aplicação monolítica rodando em um único servidor, a solução mais óbvia e simples é criar um endpoint clássico (como um POST /upload/foto), capturar o arquivo na aplicação e tomar uma de duas decisões:

  1. Salvar o binário diretamente no banco de dados: Utilizando tipos como BLOB (Binary Large Object) ou BYTEA.
  2. Salvar em um diretório local protegido: Armazenar o arquivo fisicamente no sistema de arquivos do próprio servidor que roda a aplicação, guardando apenas o caminho relativo no banco.

Embora a segunda opção seja muito superior à primeira por manter o banco de dados limpo, ambas esbarram em limites severos quando o sistema começa a escalar:

  • Saturação do Banco de Dados: Salvar arquivos pesados direto no banco destrói a performance das consultas, infla o tamanho dos backups rapidamente e inviabiliza a aplicação mesmo sob tráfego moderado. Banco de dados foi feito para dados relacionais e transacionais, não para mídia.
  • O Gargalo da Escalabilidade Horizontal (Stateless): Se sua aplicação crescer e você precisar subir múltiplas instâncias do seu backend atrás de um Load Balancer (balanceador de carga), o diretório local se torna um problema de estado. Se o usuário faz o upload de uma imagem que cai no Servidor A, quando ele tentar visualizar o arquivo e a requisição cair no Servidor B, o arquivo simplesmente não estará lá.
  • Consumo de Recursos de I/O e Banda: Processar leitura e escrita de gigabytes de dados diretamente no seu servidor de aplicação consome processamento (CPU), memória e largura de banda preciosos, impedindo que o servidor responda rapidamente a requisições HTTP leves e normais de outros usuários.

Pilares de uma arquitetura de Upload moderna e escalável

Para desatar esses nós e permitir que seu sistema suporte o upload de arquivos gigantescos, como vídeos de dezenas de gigabytes, sem derrubar a infraestrutura, o ecossistema moderno adota padrões consolidados de System Design. Abaixo estão os conceitos fundamentais para mudar o patamar da sua aplicação:

1. Divisão em pedaços (Chunking) e validação de integridade (Checksums)

Arquivos imensos não se comportam bem em conexões de rede instáveis. Em redes móveis ou conexões lentas, transmitir um arquivo único de 5 GB é inviável: se a rede oscilar nos 95%, todo o progresso é perdido. A solução para isso é o Chunking: o cliente divide o arquivo em dezenas de pedaços menores (ex: 50 blocos de 100 MB) antes do envio.

Aliado a isso, utilizamos o Checksum. O checksum funciona como uma "impressão digital" matemática calculada com base nos bits do arquivo. Com ele, o servidor consegue verificar se o arquivo não foi corrompido durante a transmissão e, em caso de interrupção, o sistema sabe exatamente quais pedaços (chunks) faltam receber para retomar o upload exatamente de onde parou, garantindo segurança contra fraudes na retomada do arquivo.

2. Desacoplamento total com Object Storage (Blob Store)

Na engenharia de software moderna, as instâncias de backend devem ser o mais stateless (sem estado) possível. Os dados transacionais e metadados (como o ID do usuário, tamanho do arquivo, tipo de mídia e status do processamento) continuam indo para o seu banco de dados relacional (ex: PostgreSQL). No entanto, o arquivo binário em si é direcionado para um serviço especialista em armazenamento de objetos grandes, amplamente conhecidos como Blob Stores, tais como o AWS S3, o Google Cloud Storage ou o Cloudflare R2.

3. Upload direto via presigned URLs (URLs Pré-Assinadas)

Se enviarmos o arquivo para a Blob Store fazendo-o passar por dentro do nosso servidor, ainda estaremos sofrendo com o gargalo de banda de rede e processamento. Para eliminar esse intermediário, o backend atua apenas como um orquestrador de segurança:

  • O cliente avisa ao backend que deseja realizar o upload de um arquivo e envia os metadados.
  • O backend valida se o usuário tem permissão, faz as checagens de segurança e solicita ao provedor de storage uma Presigned URL (uma URL temporária e autenticada com chaves criptográficas embutidas).
  • O backend devolve essa URL para o cliente, e o navegador faz o upload do arquivo binário pesado diretamente para o storage na nuvem, sem consumir um único bit de banda do seu servidor principal.

4. Processamento assíncrono com background Jobs

O fluxo de vida do arquivo não termina quando o upload é concluído. Sistemas profissionais utilizam filas de mensageria e workers em segundo plano para realizar processamentos necessários de forma assíncrona:

  • Transcodificação e Compressão: No caso de vídeos, comprimir e gerar arquivos em diferentes resoluções (480p, 720p, 1080p). No caso de imagens, redimensionar ou otimizar para formatos mais leves no cliente ou no backend.
  • Varredura Antivírus (Malware Scan): Nunca confie no arquivo enviado pelo usuário. Rotinas em segundo plano devem escanear o arquivo em busca de ameaças antes de marcá-lo como "pronto" no banco de dados.
  • Rotinas de Limpeza (Clean-up Jobs): Se um usuário iniciar um upload em pedaços e abandonar o processo no meio do caminho, esses blocos órfãos consumirão espaço e custo. Jobs agendados limpam periodicamente uploads inacabados.

A revolução dos custos: O fator Cloudflare R2

Embora AWS S3 e Google Cloud Storage dominem amplamente o mercado corporativo, um grande divisor de águas recente na arquitetura de mídias é o Cloudflare R2. O modelo tradicional de nuvem cobra pelo armazenamento (por GB guardado) e pelas chamadas de API, mas impõe taxas pesadas sobre o egresso de dados (data egress fees), ou seja, você paga caro por cada gigabyte que sai do storage para ser consumido pelos seus usuários na internet.

O R2 rompeu esse modelo ao eliminar totalmente as taxas de egresso. Para aplicações de alta intensidade de leitura, como plataformas de streaming, blogs com muitas imagens ou distribuição de software, essa mudança arquitetural reduz custos drasticamente e permite uma integração nativa e veloz com redes de entrega de conteúdo (CDNs).

Considerações finais

Migrar o modelo mental de salvar arquivos localmente em diretórios ocultos do servidor para uma infraestrutura distribuída com URLs Pré-Assinadas e Object Stores é o verdadeiro passo que separa aplicações amadoras de sistemas resilientes e prontos para produção em larga escala. Ao desonerar seu backend do tráfego pesado e delegar o armazenamento para serviços especialistas, você garante que sua aplicação possa escalar horizontalmente de forma infinita, segura e financeiramente sustentável.

Feito!

quarta-feira, 1 de julho de 2026

Os conceitos de Engenharia de Software que separam Devs Juniores de Seniores

No início da carreira na programação, é comum focarmos muito em sintaxe de linguagem, frameworks e na lógica de criar pequenas funcionalidades. No entanto, conforme os sistemas crescem e passam a atender milhões de usuários, os desafios mudam de figura. O que diferencia um desenvolvedor Júnior de um desenvolvedor Sênior não é apenas o domínio do código, mas o conhecimento em System Design (Arquitetura de Sistemas Distribuídos) e a capacidade de prever falhas antes que elas aconteçam.

Abaixo, explicamos de forma didática os principais conceitos de arquitetura que você precisa dominar para elevar o nível da sua carreira.

1. Idempotência

Idempotência é a garantia de que, não importa quantas vezes você execute a mesma ação, o resultado final e os efeitos colaterais serão exatamente os mesmos da primeira execução. Um exemplo clássico ocorre em transações financeiras: se você faz um PIX e a rede oscila, o aplicativo pode tentar reenviar a requisição. Um sistema idempotente gera uma chave única (geralmente um hash baseado nos dados da transação) e bloqueia a segunda tentativa se ela acontecer dentro de um curto intervalo de tempo, evitando cobranças duplicadas.

2. Transações Distribuídas

Em sistemas monolíticos antigos, garantir que tudo funcionasse ou falhasse junto era fácil usando o banco de dados. Em arquiteturas modernas de microsserviços, surge o desafio das Transações Distribuídas. Imagine comprar um pacote de viagens: o sistema precisa reservar o voo na companhia aérea, o quarto no hotel e o carro na locadora. Se o hotel falhar, o voo precisa ser cancelado. Para resolver isso, utilizam-se padrões como o Two-Phase Commit (2PC) ou o padrão Saga (Saga Pattern), que coordena transações compensatórias para desfazer passos anteriores em caso de erro.

3. Consistência Eventual

Em sistemas globais, atualizar um dado em todos os servidores do mundo instantaneamente é impossível devido à latência da rede. A Consistência Eventual aceita que os dados fiquem desatualizados por alguns segundos ou minutos, mas garante que, eventualmente, todos os servidores convergirão para o mesmo estado correto. Um exemplo prático é o contador de visualizações de um vídeo no YouTube: você no Brasil pode ver um número ligeiramente diferente de alguém acessando na China, mas depois de um tempo os valores se igualam.

4. Réplicas de Leitura (Read Replicas)

A imensa maioria das aplicações web lida com muito mais leituras do que escritas (por exemplo, milhares de pessoas leem uma postagem de rede social, mas poucas de fato escrevem uma). Para não sobrecarregar o banco de dados principal, cria-se uma estratégia onde apenas uma instância recebe as escritas (banco de Write) e várias cópias sincronizadas lidam apenas com as consultas dos usuários (bancos de Read).

5. Teorema de CAP

Este teorema dita que um sistema distribuído só pode garantir duas de três propriedades ao mesmo tempo: Consistência (C), Disponibilidade (A) e Tolerância a Partições de Rede (P). Como falhas de rede (Partições) são inevitáveis na realidade, o Teorema de CAP na prática força o arquiteto sênior a tomar uma decisão difícil quando a rede falha: ou o sistema nega a requisição para manter os dados idênticos (priorizando Consistência) ou aceita a alteração correndo o risco de dessincronização temporária (priorizando Disponibilidade).

6. Sistemas de Mensageria e Garantias de Entrega

Ao trafegar dados de forma assíncrona por ferramentas como o Apache Kafka, existem três decisões arquiteturais sobre como as mensagens serão entregues:

  • At Most Once (No máximo uma vez): A mensagem é enviada; se falhar no caminho, é perdida. Prioriza velocidade.
  • At Least Once (Pelo menos uma vez): A mensagem é reenviada até haver confirmação. Evita perda de dados, mas pode gerar duplicatas.
  • Exactly Once (Exatamente uma vez): O sistema garante que a mensagem será processada uma única vez. É o cenário ideal, porém o mais complexo e custoso de se implementar devido ao alto processamento necessário de coordenação.

7. Backpressure (Pressão de Retorno)

Imagine um sistema raspador de dados (Web Scraper) que baixa 20 imagens por segundo (Produtor), mas o serviço de compactação dessas imagens só consegue processar 5 por segundo (Consumidor). Sem um controle, a memória ou a fila do consumidor vai estourar. Backpressure é o mecanismo de comunicação reversa que permite ao Consumidor avisar o Produtor: "Estou cheio, diminua a velocidade de envio", salvando a estabilidade da infraestrutura.

8. Thundering Herd Problem

Esse problema ocorre quando um recurso muito requisitado que estava guardado em cache expira repentinamente. No exato segundo da expiração, milhares de usuários que estavam lendo do cache tentam acessar o banco de dados principal de forma simultânea. Essa avalanche repentina de requisições pode derrubar o banco de dados instantaneamente.

9. Celebrity Problem (ou Hot Shard)

Para escalar bancos de dados, costuma-se dividi-los em pedaços menores chamados shards. Se o seu sistema armazena dados de usuários comuns divididos igualmente, o tráfego flui bem. Mas se uma celebridade gigantesca cai em um shard específico, todo o tráfego da rede social vai se concentrar naquela única máquina. Esse nó específico se torna um "Hot Shard", exigindo estratégias avançadas de distribuição para não colapsar.

10. Circuit Breaker (Disjuntor)

Inspirado nos disjuntores elétricos residenciais, este padrão monitora chamadas para serviços externos. Se uma API externa começa a falhar repetidamente, o Circuit Breaker "abre o circuito" e impede que novas requisições percam tempo tentando bater naquela API indisponível. Em vez disso, ele retorna imediatamente um erro amigável ou um caminho alternativo, protegendo os recursos internos do seu próprio sistema.

11. Feature Flags

Feature Flags são interruptores condicionais inseridos no código que permitem ativar ou desativar uma funcionalidade dinamicamente sem a necessidade de realizar um novo deploy. São extremamente úteis para realizar testes com pequenos grupos de usuários (testes beta) ou lançar atualizações de forma gradual. Contudo, desenvolvedores seniores alertam: esquecer de remover as flags antigas transforma o código em uma gambiarra difícil de manter.

12. Schema Evolution

Sistemas evoluem e as estruturas de seus dados mudam. Schema Evolution refere-se à habilidade de alterar o formato de uma tabela de banco de dados, de uma API ou de uma mensagem de evento mantendo a retrocompatibilidade. Isso garante que sistemas legados ou parceiros externos que ainda usam a estrutura antiga não quebrem quando você lançar uma atualização.

13. Migrations Conscientes

Muitos juniores cometem o erro clássico de enviar uma alteração de banco de dados (Migration) adicionando um novo campo obrigatório (Constraint NOT NULL) ao mesmo tempo em que sobem o código novo da aplicação. Durante o processo de alteração, o banco de dados pode sofrer um travamento completo (lock). Seniores planejam migrações críticas de forma faseada para mitigar riscos, utilizando passos intermediários descritos a seguir.

14. Backfill

O Backfill é o processo de preencher de forma incremental e segura dados retroativos em campos novos que foram criados no banco de dados. Em vez de travar o banco atualizando milhões de linhas de uma vez só, o desenvolvedor sênior cria o campo como opcional e roda rotinas em lotes pequenos (batches) em horários de menor movimento para popular o histórico.

15. Dual Rights (Escritas Duplas)

Estratégia usada em migrações complexas de infraestrutura onde a aplicação passa a salvar as informações simultaneamente em duas fontes de dados diferentes (o banco antigo e o banco novo). Isso permite validar a consistência e o comportamento do novo ambiente em tempo real sem desligar o sistema antigo.

16. Shadow Tables

Shadow Tables (Tabelas Espelho) funcionam como cópias ocultas que replicam as operações das tabelas principais em produção. Elas servem para testar migrações massivas em larga escala, permitindo que os desenvolvedores analisem a performance e possíveis erros de uma alteração sem impactar a experiência do usuário real.

17. Algoritmos de Rate Limit

Rate Limit é o ato de limitar quantas requisições um cliente pode fazer para proteger a API contra abusos ou ataques. Existem quatro principais maneiras de fazer isso:

  1. Fixed Window: Define uma janela rígida de tempo (ex: 100 requisições por hora). Se estourar o limite, bloqueia até a virada da hora cheia.
  2. Sliding Window: Uma janela de tempo móvel e dinâmica que avalia o histórico recente do usuário segundo a segundo, evitando abusos nas bordas do relógio.
  3. Token Bucket: Um balde virtual acumula fichas (tokens) em uma taxa constante. Cada requisição gasta uma ficha. Permite que o usuário faça rajadas rápidas de requisições se o balde estiver cheio, mas o bloqueia quando as fichas acabam até que novas caiam.
  4. Leaky Bucket: Semelhante ao balde de fichas, mas as requisições entram no balde e saem por um pequeno furo na base em uma velocidade perfeitamente constante e controlada, suavizando picos de tráfego.

18. Cache Invalidation

Existe uma famosa frase na computação que diz: "Só existem dois problemas difíceis na engenharia de software: invalidação de cache e escolher nomes para coisas". Guardar dados na memória (Cache) acelera o sistema, mas saber o momento exato de apagar esse cache quando o dado original muda no banco — para evitar que o usuário veja informações obsoletas — é um dos maiores desafios de arquitetura.

19. Cold Start

Muito comum em arquiteturas Serverless (como AWS Lambda), o Cold Start (Início Frio) é a latência ou demora que acontece quando uma função que estava desligada recebe uma requisição após muito tempo ociosa. O provedor de nuvem precisa criar uma máquina virtual do zero, baixar o código e iniciar o ambiente antes de responder ao usuário, gerando um gargalo inicial de performance.

20. Design para a Falha (Design for Failure)

Os desenvolvedores juniores programam assumindo que a rede nunca vai oscilar, que o banco de dados estará sempre online e que as APIs externas nunca vão falhar. Já os desenvolvedores seniores programam assumindo o oposto: tudo o que puder falhar, vai falhar em algum momento. O conceito de Design para a Falha dita que a arquitetura do sistema deve ser resiliente o suficiente para continuar funcionando (mesmo que de forma limitada ou degradada) quando partes dela colapsarem, utilizando mecanismos de redundância, retentativas inteligentes (com recuo exponencial) e caminhos de fallback automatizados.

Considerações finais

O maior aprendizado que diferencia os níveis de maturidade técnica é entender que não existem soluções mágicas, existem tradeoffs (compensações). Cada escolha arquitetural resolve um problema ao custo de introduzir uma nova complexidade. O papel de um desenvolvedor sênior é olhar para o cenário de negócios, analisar os prós e contras de cada conceito listado e escolher a ferramenta que melhor equilibra custo, segurança e escalabilidade.

Feito!

terça-feira, 16 de junho de 2026

O mito dos novos LLMs: Descubra onde está o segredo dos LLMs de agentes de IA

Se você tem acompanhado o mercado de Inteligência Artificial (IA) recentemente, deve ter notado um padrão. A cada poucas semanas, um grande provedor de nuvem ou laboratório de IA anuncia um novo modelo com gráficos impressionantes, prometendo revolucionar o desenvolvimento de software. No entanto, quem entende o que acontece "por debaixo dos panos" já percebeu a realidade: as LLMs brutas estagnaram em termos de capacidade cognitiva pura.

Os benchmarks inflados apresentados pelos influenciadores e vendedores de cursos com uso de ferramentas de IA tornaram-se falácias para iludir quem não possui uma base técnica sólida. O verdadeiro salto de desempenho e autonomia não vem mais do tamanho da rede neural, mas sim da engenharia aplicada ao redor dela.

A estagnação das LLMs e a ilusão dos benchmarks

Aumentar o número de parâmetros ou treinar modelos com mais dados textuais parou de trazer os retornos exponenciais de antes. Quando uma empresa anuncia que seu novo modelo superou o anterior em 2% ou 3% em um benchmark como o MMLU ou HumanEval, isso quase sempre se traduz em zero impacto no mundo real.

Esses testes tornaram-se ambientes controlados e, muitas vezes, os dados dos próprios benchmarks acabam vazando no conjunto de treinamento dos modelos. Para o desenvolvedor que precisa resolver problemas complexos de arquitetura, segurança ou depuração em sistemas legados, o modelo bruto continua cometendo as mesmas alucinações de sempre.

O Verdadeiro Segredo: O Harness Aplicado ao Agente

Se o modelo base não é mais o diferencial, onde está o segredo? A resposta está no harness (a armadura ou infraestrutura de orquestração) que envolve a LLM. Um agente de elite só é eficiente porque possui um ecossistema robusto de ferramentas, gerenciamento de estado e loops de feedback que estendem a capacidade do modelo.

O que influenciadores vendem como "a genialidade do Claude Code", por exemplo, nada mais é do que uma excelente engenharia de software local. O segredo do sucesso dessas ferramentas comerciais inclui:

  • Sistemas de busca especializados: Ferramentas nativas de indexação e busca de código baseadas em AST (Abstract Syntax Tree) ou ferramentas como grep otimizado.
  • Edição por Diff: Em vez de pedir para a LLM reescrever um arquivo inteiro de 2000 linhas (o que gera falhas e estouro de contexto), o harness intercepta a resposta e aplica apenas modificações cirúrgicas (diffs).
  • Ambientes de Execução Isolados: A capacidade de executar testes unitários em tempo real, ler os erros do terminal e corrigir a si mesmo antes de entregar o código ao usuário.

Criando suas próprias Skills sem depender de terceiros

Quando você entende esse conceito, percebe que pode construir seu próprio sistema de agentes modulares. Você pode criar "Skills" específicas para cada propósito do ciclo de desenvolvimento, encapsulando regras de negócio e ferramentas customizadas.


+-------------------------------------------------------+
|                    SEU HARNESS CORE                   |
+-------------------------------------------------------+
                           |
        +------------------+------------------+
        |                  |                  |
        v                  v                  v
+---------------+  +---------------+  +---------------+
| SKILL: STACK  |  | SKILL: QA     |  | SKILL: SECURITY|
| - Frontend    |  | - Testes Unit |  | - SAST / DAST |
| - Backend     |  | - Regressão   |  | - Sandboxing  |
+---------------+  +---------------+  +---------------+

Ao isolar essas especialidades, você remove a dependência de plataformas proprietárias. Se uma Skill de segurança (Security) for bem blindada com ferramentas de análise estática e validação rigorosa, você obtém uma capacidade equivalente ou superior aos recursos restritos de grandes corporações.

A soberania tecnológica contra bloqueios comerciais

Depender exclusivamente de ferramentas prontas de terceiros coloca seu fluxo de trabalho sob risco constante. Interrupções repentinas no fornecimento de recursos avançados por motivos regulatórios ou comerciais deixam desenvolvedores dependentes sem alternativas imediatas.

A alternativa técnica viável é construir sua própria infraestrutura de agentes. Utilizando protocolos de integração abertos e plugando modelos open-weight altamente eficientes dentro de um harness proprietário, você garante autonomia total sobre suas ferramentas de desenvolvimento.

Considerações finais

O mercado de marketing da IA continuará tentando vender o próximo modelo como o "melhor agente do mundo". Cabe aos engenheiros de software e arquitetos de soluções olhar além do hype, compreender que a inteligência está na orquestração e focar na construção de harnesses robustos, seguros e soberanos.

Feito!

sexta-feira, 12 de junho de 2026

Por que 90% dos Programadores Júnior não conseguem emprego? (E como não ser um deles)

Se você passou os últimos meses estudando, terminou cursos, enviou dezenas de currículos e não obteve retorno, ou pior, travou na hora da entrevista técnica, saiba que você não está sozinho. Existe uma crença de que o mercado de tecnologia está completamente fechado para iniciantes, mas a realidade é diferente: vagas existem, o que falta são candidatos com o nível mínimo de preparo prático.

O mercado saturou de pessoas que assistem a centenas de horas de vídeo, mas nunca escreveram uma linha de código do zero. Para ter sucesso, você precisa entender que as empresas não querem saber quantos certificados você tem, mas sim o que você é capaz de construir com o que aprendeu.

O Grande Insight: Seu Código é o Seu Currículo

Em profissões como arquitetura ou design, os profissionais apresentam portfólios com seus projetos e layouts. Na programação, o seu portfólio é o seu código, e o lugar dele é no GitHub. Enviar um currículo sem o link do seu portfólio de código é o mesmo que tentar uma vaga de design sem mostrar nenhuma arte.

O link do seu perfil deve estar no topo do seu currículo, se possível na primeira linha e em negrito. É a primeira coisa que um recrutador técnico vai olhar.

Os 6 Motivos que Impedem a Contratação de um Júnior

1. Falta de Base Prática

Muitos profissionais iniciantes dominam frameworks modernos, mas falham miseravelmente em conceitos fundamentais. Se você sabe usar ferramentas avançadas, mas não entende como funciona um loop ou uma estrutura de dados, você cairá no primeiro teste técnico.

2. Projetos Inacabados e Clones de Tutoriais

Ter um perfil cheio de repositórios com apenas um commit demonstra que você começa as coisas e nunca as termina. Vale muito mais ter um único projeto simples, mas que esteja completamente funcional e resolvendo um problema real, do que dez projetos inacabados ou copiados de tutoriais.

3. Não Saber Explicar o Próprio Código

Com a facilidade das ferramentas de Inteligência Artificial, ficou simples gerar códigos complexos. No entanto, os recrutadores identificam isso facilmente na entrevista ao pedir para você explicar o funcionamento de um trecho específico. Se você não conseguir explicar com calma o que escreveu, a empresa saberá que a IA fez o trabalho por você.

4. Ignorar o Banco de Dados (SQL)

Muitos cursos focam excessivamente na linguagem de programação e ignoram os bancos de dados. Saber o básico de SQL é obrigatório para quase totalidade das vagas de júnior. Você não precisa ser um especialista em infraestrutura de dados, mas precisa dominar comandos fundamentais como:

  • SELECT para consultar informações
  • INSERT para inserir dados
  • UPDATE para atualizar registros
  • DELETE para remover dados
  • Joins para relacionar tabelas

5. Currículos Desonestos ou Humildade Excessiva

Dizer que tem nível avançado em uma tecnologia sem dominar nem a lógica básica vai te desclassificar na primeira entrevista técnica. Por outro lado, o excesso de humildade e a insegurança extrema também afastam os recrutadores. A empresa já sabe que você é júnior; o que ela busca é alguém com fundamentos firmes e capacidade de aprender.

6. Invisibilidade no Mercado

Para ser contratado, você precisa existir na internet de forma profissional. Muitas vagas em empresas pequenas e médias ocorrem por indicação e visibilidade. Participar de comunidades, fóruns e interagir no LinkedIn ajuda a construir sua presença.

O Portfólio Ideal por Área de Atuação

Para se destacar, os projetos no seu portfólio precisam falar a mesma língua da vaga para a qual você está se candidatando:

Sistemas Corporativos (ERP)

É um dos mercados com maior volume de vagas. Para essa área, seu portfólio precisa conter um CRUD completo (cadastro, tela de interface, validações e conexão com o banco de dados). Criar uma aplicação simples de contas a pagar e receber, com um recurso que exporte relatórios para PDF ou Excel, aumentará drasticamente suas chances de contratação.

Desenvolvimento Web

É a área mais concorrida. Mostre que você consegue entregar uma aplicação do início ao fim construindo um sistema que integre front-end, back-end (uma API própria) e banco de dados. Implemente recursos reais como autenticação com login e senha protegidos por hash. Além disso, faça o deploy do projeto em servidores gratuitos para que o recrutador possa testar o sistema funcionando na prática.

Desenvolvimento Mobile

Uma área com escassez de profissionais qualificados. Crie um aplicativo funcional e, no arquivo explicativo do repositório, insira imagens ou um vídeo demonstrando o funcionamento dele. É importante demonstrar que o aplicativo consome dados de uma API externa (como uma busca de CEP) e armazena informações localmente no dispositivo.

Plano de Ação Prático

Se você deseja mudar o rumo das suas candidaturas, siga estes passos:

  • Faça uma limpeza no seu perfil de código, removendo exercícios soltos ou cópias de cursos.
  • Escolha uma aplicação simples e desenvolva ela inteiramente por conta própria, do começo ao fim.
  • Escreva uma boa documentação explicando o que o projeto faz, as tecnologias utilizadas e como executá-lo.
  • Estude e domine os comandos básicos de SQL.
  • Pare de acumular novos cursos e comece a construir coisas reais com o conhecimento que você já possui.

O mercado de tecnologia não está fechado para bons profissionais, mas está saturado para quem acredita que apenas assistir a aulas é o mesmo que aprender a programar. Quem entra no mercado é quem tem código real para mostrar.

Feito!

sexta-feira, 22 de maio de 2026

DDD explicado de forma didática

Domain-Driven Design: como modelar software complexo colocando o domínio no centro do universo

O que é DDD?

Domain-Driven Design (DDD) é uma abordagem de desenvolvimento de software criada por Eric Evans no livro azul de 2003. O nome pode assustar, mas a ideia é simples: em vez de começar pensando em bancos de dados, rotas HTTP ou frameworks, você começa pensando no domínio do negócio, ou seja, no problema que o software precisa resolver.

DDD não é uma tecnologia, nem um framework, nem uma arquitetura como MVC. É um conjunto de princípios e padrões que ajuda times de software a criar modelos mentais compartilhados com especialistas do negócio.

"O coração do software é a capacidade de resolver problemas do domínio." Eric Evans

Por que DDD existe?

Projetos de software falham com frequência porque o time técnico e os especialistas do negócio não falam a mesma língua. O desenvolvedor pergunta "qual o tipo desse campo?"; o especialista responde "é o código da agência". Ninguém se entende. O resultado são sistemas cheios de regras espalhadas, modelos anêmicos e código que ninguém consegue mudar sem quebrar tudo.

DDD propõe uma linguagem comum (chamada de Ubiquitous Language) usada por todos, do analista ao dev ao QA, e um modelo de software que reflete fielmente essa linguagem.

Os pilares do DDD

1. Linguagem Ubíqua (Ubiquitous Language)

É o vocabulário compartilhado entre todos os envolvidos. Se o especialista chama algo de "Transferência", o código deve ter uma classe Transferencia, a tabela deve se chamar transferencias, e a API deve expor /transferencias. Nada de Trans, TransfRecord ou transactions, usem o mesmo nome.

2. Domínio e Subdomínios

O domínio é o coração do negócio, é o problema principal que o sistema resolve. Um único sistema grande geralmente contém vários subdomínios:

  • Core Domain: a parte mais importante, que dá vantagem competitiva. Ex: o motor de precificação de um banco.
  • Supporting Subdomain: necessário, mas não estratégico. Ex: cálculo de impostos.
  • Generic Subdomain: pode ser comprado ou usado pronto. Ex: autenticação, envio de e-mail.
// Exemplo: o domínio de um sistema bancário
// Core Domain: Motor de crédito
class AnaliseDeCredito {
  constructor(private score: Score, 
  private rendaMonetaria: Renda) {}
  aprovar(): boolean {
      /* lógica de negócio central */
      }
}

// Supporting Subdomain: Cálculo de tarifas
class CalculadoraDeTarifas {
  calcular(operacao: Operacao): number { 
  /* complexo, mas não estratégico */ }
}

// Generic Subdomain: Autenticação (pronto, comprado)
// Usamos Keycloak, Auth0, ou similar

3. Contextos Delimitados (Bounded Contexts)

Um dos conceitos mais importantes do DDD. Um Bounded Context é uma fronteira explícita dentro da qual um modelo de domínio é válido. Dentro dela, a Linguagem Ubíqua tem significado único e consistente.

Por exemplo: no contexto de Vendas, "Cliente" tem endereço de entrega e histórico de pedidos. No contexto de Cobrança, "Cliente" tem CPF, score de crédito e data de vencimento. São modelos diferentes e devem viver em contextos separados (serviços, módulos, ou até repositórios distintos).

Cada Bounded Context pode ter sua própria arquitetura, seu próprio banco de dados e sua própria equipe. O que vale dentro de um, não vale dentro do outro.

Os blocos de construção táticos

DDD fornece padrões de modelagem para transformar a linguagem do negócio em código expressivo.

Entity

Um objeto que tem identidade própria. Dois objetos com os mesmos atributos mas identidades diferentes são entidades diferentes. Ex: um Cliente com id = 123 é diferente do cliente id = 456, mesmo que tenham o mesmo nome.

class Cliente {
  constructor(
    // identidade única
    readonly id: ClienteId,  
    private nome: Nome,
    private email: Email
  ) {}

  trocarEmail(novoEmail: Email): void {
    this.email = novoEmail;
  }
}

Value Object

Um objeto que não tem identidade, é definido apenas pelos seus atributos. Dois Value Objects com os mesmos valores são considerados iguais. São imutáveis.

  • Dinheiro (valor + moeda), R$ 50,00 não deixa de ser R$ 50,00 por ter "identidade".
  • CPF, Email, Endereco, todos imutáveis e comparados por valor.
class Dinheiro {
  constructor(
    readonly valor: number,
     // 'BRL', 'USD'
    readonly moeda: string 
  ) {}

  somar(outro: Dinheiro): Dinheiro {
    if (this.moeda !== outro.moeda)
      throw new Error('Moedas diferentes');
    return new Dinheiro(this.valor + 
                       outro.valor, this.moeda);
  }

  equals(outro: Dinheiro): boolean {
    return this.valor === outro.valor && 
               this.moeda === outro.moeda;
  }
}

Aggregate

Um cluster de objetos tratados como uma unidade. Cada Aggregate tem uma raiz (Aggregate Root) que é a única porta de entrada para o mundo externo. Toda consistência do cluster passa pela raiz.

// Aggregate Root: Pedido
class Pedido {
  constructor(
    readonly id: PedidoId,
    readonly clienteId: ClienteId,
    private itens: Item[],
    private status: StatusPedido
  ) {}

  adicionarItem(produto: Produto, 
    quantidade: number): void {
    if (this.status !== 'aberto')
      throw new Error('Pedido fechado não aceita itens');
    this.itens.push(new Item(produto, quantidade));
  }

  total(): Dinheiro {
    return this.itens.reduce(
      (acc, item) => acc.somar(item.subtotal()),
      new Dinheiro(0, 'BRL')
    );
  }
}

Domain Event

Algo que aconteceu no domínio e interessa a outras partes do sistema. Usa-se verbos no passado: PedidoCriado, TransferenciaRealizada, ContaEncerrada.

class PedidoCriado {
  constructor(
    readonly pedidoId: PedidoId,
    readonly clienteId: ClienteId,
    readonly total: Dinheiro,
    readonly ocorridoEm: Date = new Date()
  ) {}
}

Repository

Abstração de persistência. Para o domínio, o Repository parece um coleção em memória. O domínio nunca sabe se está usando PostgreSQL, MongoDB ou arquivo JSON.

interface PedidoRepository {
  salvar(pedido: Pedido): Promise<void>;
  buscarPorId(id: PedidoId): Promise<Pedido | null>;
  buscarPorCliente(clienteId: ClienteId): Promise<
                                          Pedido[]>;
}

Domain Service

Quando uma operação não pertence naturalmente a uma Entity ou Value Object, criamos um Domain Service. Ele orquestra regras que envolvem múltiplos agregados.

class ServicoDeTransferencia {
  constructor(
    private contas: ContaRepository
  ) {}

  transferir(origemId: ContaId, destinoId: 
  ContaId, valor: Dinheiro): void {
    const origem = this.contas.buscarPorId(origemId);
    const destino = this.contas.buscarPorId(destinoId);

    origem.debitar(valor);
    destino.creditar(valor);

    this.contas.salvar(origem);
    this.contas.salvar(destino);
  }
}

DDD e arquitetura

DDD não exige uma arquitetura específica, mas se encaixa perfeitamente com Arquitetura Hexagonal (Ports & Adapters) e Clean Architecture. A regra de ouro é:

  • O domínio fica no centro, isolado de frameworks, banco de dados e UI.
  • A infraestrutura (HTTP, banco, filas) fica nas bordas e depende do domínio, não o contrário.
  • As dependências apontam para dentro (Dependency Inversion Principle).
src/
├── dominio/    # CORE  sem dependências externas
│   ├── entidades/
│   ├── value-objects/
│   ├── servicos/
│   └── repositorios/ # Interfaces apenas
├── aplicacao/        # Casos de uso (orquestração)
├── infra/            # Implementações concretas
│   ├── persistencia/
│   ├── http/
│   └── fila/
└── shared/           # Código compartilhado

Quando usar DDD?

  • Use quando o domínio do negócio é complexo e cheio de regras.
  • Use quando há especialistas de negócio dispostos a conversar com o time técnico.
  • Não use em CRUDs simples um formulário que só insere dados no banco não precisa de DDD.
  • Não use se o time não tem disciplina para manter a Linguagem Ubíqua viva.
  • Não use como dogma DDD é ferramenta, não religião.

Passos práticos para começar

  1. Entreviste especialistas sente com quem entende do negócio e faça perguntas. Anote os termos que eles usam.
  2. Crie um glossário monte a Linguagem Ubíqua com definições claras de cada termo.
  3. Identifique os Bounded Contexts desenhe fronteiras: o que faz parte de Vendas? O que faz parte de Cobrança?
  4. Modele os Aggregates descubra as raízes e o que pertence a cada uma.
  5. Implemente com TDD o domínio é a parte mais testável do sistema. Teste as regras de negócio sem tocar em banco ou HTTP.
  6. Refatore sem medo o modelo de domínio evolve com o negócio. DDD favorece a mudança.

Exemplo completo: Aluguel de Carros

Vamos modelar um pequeno domínio de locação de veículos usando DDD:

// ——— Value Objects ———
class Placa {
  constructor(readonly valor: string) {
    if (!/^[A-Z]{3}\d[A-Z]\d{2}$/.test(valor))
      throw new Error('Placa inválida');
  }
}

class Quilometragem {
  constructor(readonly valor: number) {
    if (valor < 0) throw new 
    Error('KM não pode ser negativo');
  }
}

class Periodo {
  constructor(readonly inicio: Date, 
  readonly fim: Date) {
    if (fim <= inicio) throw new 
    Error('Período inválido');
  }
  duracaoDias(): number {
    return (this.fim.getTime() - 
    this.inicio.getTime()) / 86400000;
  }
}

// ——— Aggregate: Veiculo ———
class Veiculo {
  constructor(
    readonly id: VeiculoId,
    readonly placa: Placa,
    private kmAtual: Quilometragem,
    private disponivel: boolean = true
  ) {}

  alugar(): void {
    if (!this.disponivel) throw new 
    Error('Veículo indisponível');
    this.disponivel = false;
  }

  registrarDevolucao(kmFinal: Quilometragem): void {
    this.disponivel = true;
    this.kmAtual = kmFinal;
  }
}

// ——— Aggregate: Locacao ———
class Locacao {
  constructor(
    readonly id: LocacaoId,
    readonly veiculoId: VeiculoId,
    readonly clienteId: ClienteId,
    readonly periodo: Periodo,
    readonly tarifaDiaria: Dinheiro,
    private status: 'ativa' | 'finalizada' = 'ativa'
  ) {}

  calcularTotal(): Dinheiro {
    const dias = this.periodo.duracaoDias();
    return new Dinheiro(dias * 
           this.tarifaDiaria.valor, 'BRL');
  }

  finalizar(): void {
    if (this.status === 'finalizada')
      throw new Error('Locação já finalizada');
    this.status = 'finalizada';
  }
}

// ——— Domain Event ———
class VeiculoAlugado {
  constructor(
    readonly veiculoId: VeiculoId,
    readonly locacaoId: LocacaoId,
    readonly clienteId: ClienteId
  ) {}
}

// ——— Repository (interface) ———
interface VeiculoRepository {
  salvar(veiculo: Veiculo): Promise<void>;
  buscarDisponivel(): Promise<Veiculo[]>;
  buscarPorId(id: VeiculoId): Promise<Veiculo | null>;
}

Para se aprofundar

  • Domain-Driven Design: Tackling Complexity in the Heart of Software Eric Evans (o "livro azul")
  • Implementing Domain-Driven Design Vaughn Vernon (o "livro vermelho")
  • Domain-Driven Design Distilled Vaughn Vernon (resumo prático, ótimo para começar)
  • DDD: The First 15 Years Artigos de diversos autores sobre a evolução do DDD

Considerações finais

DDD não é sobre diagramas bonitos ou arquitetura sofisticada. É sobre comunicação. É sobre criar um modelo de software que qualquer pessoa do negócio consegue ler e validar. É sobre colocar a complexidade do domínio no centro e usar padrões que a tornem controlável.

Comece pequeno: escolha um Bounded Context, crie a Linguagem Ubíqua com um especialista, modele alguns Aggregates e escreva testes. O resto vem com a prática.

DDD é uma jornada, não um destino.

Feito!

sexta-feira, 8 de maio de 2026

Os 8 Níveis de Maturidade em IA para Desenvolvedores

A Inteligência Artificial não vai substituir o desenvolvedor, mas o desenvolvedor que domina a IA certamente substituirá aquele que a ignora. Recentemente, um framework de 8 níveis de maturidade ganhou destaque na comunidade técnica, revelando que a produtividade real não vem da ferramenta que você usa (Cursor, Codex, Claude Code, Gemini CLI, etc), mas do seu modelo mental.

O segredo? A IA é um amplificador de conhecimento. Como diz o ditado: "Um dev ruim com IA apenas fará coisas ruins mais rápido; um dev bom será exponencialmente mais produtivo".

O Framework dos 8 Níveis

A jornada do uso de LLMs (Large Language Models) no desenvolvimento de software segue uma escala de complexidade, confiança e delegação de tarefas:

1. A Base: Do Nível 0 ao 2

Nestes estágios iniciais, a IA é vista apenas como um utilitário de consulta ou assistência visual.

  • Nível 0 (Negacionista): Ignora a ferramenta, acreditando ser apenas um hype passageiro. Escreve tudo à mão.
  • Nível 1 (Cauteloso): Usa o autocomplete básico na IDE. Aceita ou rejeita sugestões linha a linha.
  • Nível 2 (Perguntador): Substitui o Stack Overflow pelo Chat. A IA responde dúvidas teóricas, mas o dev ainda implementa 100% do código.

2. O Grande Salto: Do Nível 3 ao 4

Aqui ocorre a transição mais crítica: deixar de microgerenciar código para especificar comportamento.

  • Nível 3 (Delegador Básico): Pede funções isoladas, mas o processo é lento e exige muitos ajustes manuais ("copia e cola").
  • Nível 4 (Diretor): Você para de pedir "faça essa função" e passa a fornecer contexto e especificações de alto nível.

No Nível 4, o fluxo de trabalho geralmente começa pela definição do comportamento (Test-Driven Development):

// Exemplo de fluxo no Nível 4:
// 1. O Desenvolvedor escreve o teste
test('deve validar CPF com máscara corretamente', () => {
expect(validarCPF('123.456.789-00')).toBe(true);
});

// 2. O Desenvolvedor pede para a IA:
// "Implemente a lógica que faça este teste passar no contexto do projeto X"

3. A Maestria: Do Nível 5 ao 7

Nesta fase, você opera como um gestor de agentes digitais e foca na engenharia de sistemas.

  1. Nível 5 (Orquestrador): A IA usa ferramentas (como agentes) para navegar no projeto, ler arquivos e rodar testes de forma autônoma.
  2. Nível 6 (Multiagente): Você gerencia múltiplos agentes trabalhando em paralelo em diferentes partes da aplicação.
  3. Nível 7 (Arquiteto): O desenvolvedor define contratos de API e design de sistema. O código torna-se uma commodity gerada pelos agentes.

O Paradoxo da Skill: Por que o Hardness importa?

Existe um mito de que a IA facilitará a vida de quem não quer estudar. A realidade é o oposto: quanto mais alto o seu nível de uso de IA, mais conhecimento técnico (Hardness) você precisa.

Para ser um Arquiteto (Nível 7), você precisa dominar:

  • Design Patterns e SOLID.
  • Arquitetura de Software e Escalabilidade.
  • Segurança e Performance de Código.

Sem essa base, você não consegue instruir ao agente de IA corretamente nem julgar se a solução proposta é sustentável a longo prazo. O uso contínuo do LLM cria um ciclo de aprendizado: seu conhecimento técnico guia o agente de IA, e o retorno deste expande sua capacidade de entrega.

Considerações finais: Qual o seu próximo passo?

Se você está estagnado no Nível 2 (tirando dúvidas no chat), seu desafio para esta semana é subir para o Nível 4. Comece a escrever especificações e testes antes de pedir o código. O agente de IA não é uma muleta; é um exoesqueleto. Ela aumenta sua força, mas quem decide a direção é você.

Feito!

quarta-feira, 6 de maio de 2026

Como simular a visualização responsiva no celular com esta extensão no Chrome

Testar a responsividade de sites é essencial para desenvolvedores e designers. Em vez de alternar entre múltiplos dispositivos físicos, você pode usar uma extensão do Chrome para simular diferentes tamanhos de tela diretamente no navegador. Este guia mostra como instalar e usar a extensão Mobile simulator - responsive testing tool.

Passo 1: Acesse a página de extensões do Chrome

  1. Abra o Google Chrome.
  2. Clique nos três pontinhos verticais (⋮) no canto superior direito da barra de endereços.
  3. No menu suspenso, selecione More tools → Extensions.
  4. Alternativamente, digite chrome://extensions/ diretamente na barra de endereços e pressione Enter.

Passo 2: Abra a Chrome Web Store

Na página de extensões (chrome://extensions/), procure pelo menu de navegação no canto superior esquerdo (três linhas horizontais ou ☰) e clique nele. Em seguida, escolha a opção Open Chrome Web Store.

Você também pode acessar diretamente a loja através deste link: Chrome Web Store.

Passo 3: Procure pela extensão

Na Chrome Web Store, localize a barra de pesquisa no topo da página. Digite exatamente:

Mobile simulator - responsive testing tool

e pressione Enter. A extensão desejada aparecerá como o primeiro resultado da busca.

Passo 4: Instale a extensão

  1. Clique no cartão ou título da extensão Mobile simulator - responsive testing tool para abrir sua página de detalhes.
  2. Na página da extensão, clique no botão azul Add to Chrome.
  3. Uma caixa de diálogo de confirmação aparecerá; clique em Add extension para concluir a instalação.

Após a instalação, o ícone da extensão (que se parece com um smartphone) será exibido ao lado da barra de endereços do Chrome.

Passo 5: Use o simulador para testar sites

  1. Navegue até o site que você deseja testar pela responsividade.
  2. Clique no ícone da extensão Mobile simulator - responsive testing tool na barra de ferramentas do Chrome.
  3. Um painel será aberto com várias opções de dispositivos pré-definidos (como iPhone X, Pixel 2, iPad, etc.) e um campo para inserir dimensões personalizadas.
  4. Selecione um dispositivo ou digite uma largura e altura específicas (em pixels).
  5. A página será redimensionada automaticamente para simular a tela selecionada, permitindo que você visualize como o site aparece naquele formato.

Dicas para uso avançado

  • Modo retrato/paisagem: Muitos simuladores incluem um botão de rotação para alternar entre orientações.
  • Teste de múltiplos breakpoints: Mantenha o painel da extensão aberto enquanto desenvolve para alternar rapidamente entre tamanhos de tela.
  • User-Agent personalizado: Para testes mais avançados, combine esta extensão com as ferramentas de modo de dispositivo do Chrome DevTools para modificar o User-Agent.
  • Atalhos de teclado: Verifique se a extensão oferece atalhos para acelerar seu fluxo de trabalho (geralmente acessíveis em chrome://extensions/shortcuts).

Considerações finais

A extensão Mobile simulator - responsive testing tool oferece uma maneira rápida e eficiente de validar a responsividade de sites sem sair do Chrome. Ao seguir estes simples passos, você pode integrar testes de tela variados ao seu ciclo de desenvolvimento, economizando tempo e garantindo uma melhor experiência do usuário em todos os dispositivos. Experimente hoje mesmo e aprimore seu fluxo de trabalho de design e desenvolvimento web!

Link direto para a extensão (exemplo - verifique a ID atual na Chrome Web Store): Mobile simulator - responsive testing tool

Feito!

terça-feira, 5 de maio de 2026

ISO 27001: O Padrão Ouro que separa Desenvolvedores Profissionais dos Amadores

Se você é desenvolvedor e ainda pensa que "segurança é problema do setor de TI", prepare-se: a ISO 27001 não é mais apenas um certificado para pendurar na parede – é o divisor de águas entre equipes que entregam software confiável e aquelas que estão um erro de distância do próximo vazamento catastrófico. E sim, isso afeta diretamente o seu código hoje.

Por que a ISO 27001 É o que diferencia "Funciona na Minha Máquina" de "Funciona no Mundo Real"

Vamos falar sério: a maioria dos desenvolvedores enxerga frameworks de segurança como burocracia que atrasa o delivery. Mas aqui está o dado que vai fazer você repensar: 60% das pequenas empresas que sofreram um ataque cibernético fecharam as portas em menos de 6 meses. Não é sobre medo, é sobre matemática simples: vulnerabilidades no seu código são passivos que podem destruir o negócio onde você trabalha.

A ISO 27001 funciona como um Sistema de Gestão de Segurança da Informação (SGIS) que:

  • Mapeia riscos específicos do SEU contexto (nada de checklists genéricos que não se aplicam ao seu stack)
  • Aplica controles proporcionais ao risco real (sem excesso, sem falta)
  • Exige melhoria contínua (porque ameaças de ontem não são as de hoje)
  • Integra segurança no ciclo de desenvolvimento (Secure SDLC não é opcional para profissionais)

O Que Acontece Quando Você Trata ISO 27001 Como "Coisa de Auditor" (Alerta: Não É Bonito)

Lembre-se do vazamento da Equifax? Um simples patch evitou exposição de dados de 147 milhões de pessoas e prejuízo de US$ 1,4 bilhão. Ou o incidente recente com MOVEit Transfer que afetou centenas de organizações? Esses não foram "ataques sofisticados", foram explorações de vulnerabilidades conhecidas que boas práticas de segurança teriam evitado.

No desenvolvimento de software, ignorar práticas alinhadas à ISO 27001 significa:

  • Entregar código com falhas evitáveis que se tornam incêndios em produção
  • Pagar 30x mais para corrigir uma vulnerabilidade em produção vs. durante desenvolvimento (IBM Cost of a Data Breach Report)
  • Perder contratos com empresas que exigem certificação como pré-requisito mínimo
  • Viver em modo de apagão de incêndio вместо de entregar valor real

Como Implementar ISO 27001 sem matar sua velocity (Guia Prático para Devs que Odeiam Burocracia)

Esqueça aquelas imagens de salas cheias de papéis. A ISO 27001 moderna é sobre incorporar segurança no seu fluxo existente e sim, isso pode até acelerar seu time a longo prazo.

1. Comece analisando riscos de verdade (Não a Toa)


//Abordagem amadora: verificar se tem chave e parar por aí
if (secrets.get("API_KEY") == null) {
    throw new IllegalStateException("Missing API key");
}

//Abordagem profissional: 
//entender o CONTEXTO do risco
public class ApiKeyRiskAssessment {
  public RiskLevel evaluateExposure() {
   // Pergunte: 
   // - Qual é a probabilidade de vazamento? 
   //  (Depende do armazenamento, logs, etc.)
   // - Qual seria o impacto? 
   // (Acesso total ao sistema de pagamento? 
   // Apenas leitura de dados públicos?)
   // - Quão fácil é detectar se vazou? 
   // Só assim você decide se investe em cofre de chaves, rotação 
   // automática ou aceita o risco documentado
 }
}

2. Trate segurança como requisito não-funcional (Sério Mesmo)

Sua definição de "Pronto" deve incluir automaticamente:

  • Varredura de dependências vulneráveis (OWASP Dependency-Check, Snyk) no CI
  • Análise estática de segurança (SAST) em cada PR
  • Threat modeling para novas features críticas (não precisa ser BORING 30 minutos em um quadro já ajuda)
  • Treinamento trimestral em secure coding específico para sua stack

3. Documente o suficiente (Não o Máximo)

A ISO 27001 exige evidências, não romance:

  • Mantenha um risk register simples (planilha compartilhada com: risco, probabilidade, impacto, tratamento, responsável)
  • Documente por que você aceitou ou mitigou cada risco (ex: "Aceitamos risco X porque o custo de mitigação > impacto potencial")
  • Use evidências automatizadas (relatórios de scanner, logs de treinamento, screenshots de configuração)

O segredo que ninguém conta: ISO 27001 TE FAZ ENTREGAR MAIS RÁPIDO

Parece contra-intuitivo, mas equipes com SGIS maduro têm menor lead time e maior taxa de sucesso nas entregas. Por quê?

  • Menos emergências de segurança interrompendo sprints importantes
  • Maior confiança para inovar (você sabe que tem processos para gerir o risco novo)
  • Menos retrabalho por falhas que poderiam ser evitadas em design
  • Maior confiança do cliente – fechando negócios maiores e mais estáveis

Seu plano de ação de 15 Minutos (Comece AGORA)

  1. Leia o guia executivo gratuito do Portal 27001 (5 minutos, eles explicam sem jargão de consultoria)
  2. Faça uma avaliação relâmpago (10 minutos):
    • Quais são os 3 maiores riscos de segurança no seu projeto atual?
    • Para cada um: qual é a pior coisa que poderia acontecer se explorado?
  3. Escolha UM controle do Anexo A da ISO 27001 para implementar nesta semana (ex: A.12.6.1 - Gestão de vulnerabilidades técnicas)
  4. Compartilhe isso com sua equipe na próxima retro – segurança é esporte coletivo, não tarefa do "cara de segurança"

"Segurança não é um produto que você compra. É um processo que você incorpora no jeito de trabalhar." Princípio básico da ISO 27001

A ISO 27001 não vai atrapalhar sua velocidade, ela vai proteger o impacto do trabalho que você tanto se esforça para criar. Na próxima vez que alguém disser que "isso é burocracia excessiva", pergunte calmamente: "Você preferiria explicar um vazamento de dados para seus clientes ou passar uma hora documentando como tratamos esse risco específico?"

P.S. Se seu software lida com dados pessoais (LGPD/GDPR), financeiros ou de saúde, a ISO 27001 não é opcional, é o preço de entrada para ser levado a sério no mercado profissional. Não deixe para amanhã o que pode impedir um incidente hoje.

Quer ver como aplicar isso na prática? Veja os recursos da ISO 27001

Feito!

quinta-feira, 16 de abril de 2026

A era da IA Generativa: Ainda vale a pena aprender a programar?

Se você está começando agora na área de tecnologia ou já atua como desenvolvedor Júnior, provavelmente já se deparou com a pergunta: "Por que gastar meses estudando lógica, sintaxe e estruturas de dados se o ChatGPT, Gemini, Claude Code, ou GitHub Copilot escrevem o código em segundos?"

Antes de aprofundarmos, é preciso fazer uma distinção técnica fundamental: quando falamos popularmente em "IA", estamos simplificando um campo vasto da Ciência da Computação. O que utilizamos hoje para gerar código são, na verdade, Agentes de IA baseados em LLMs (Large Language Models - Grandes Modelos de Linguagem). Ferramentas como ChatGPT, Claude, Gemini e GitHub Copilot não "pensam" no sentido humano; elas são modelos probabilísticos altamente sofisticados que preveem o próximo token de código com base em padrões de bilhões de linhas de dados.

A sensação para muitos iniciantes é de que a barra de entrada subiu ou que a profissão está desaparecendo. No entanto, a realidade é oposta: nunca houve um momento tão estratégico para aprender a programar, desde que você entenda a diferença entre escrever código e engenharia de software.

1. O Código como Commodity: A Mudança de Paradigma

Para entender por que a programação ainda é essencial, precisamos primeiro aceitar que o "código" em si tornou-se uma commodity. No mercado de TI, uma commodity é algo que pode ser produzido em massa e tem pouco valor agregado se não houver um diferencial competitivo.

Para o cliente final ou para o dono de uma empresa, o código é apenas o meio para atingir um fim. O cliente não compra "um sistema em Java com Spring Boot", ele compra a solução para um problema de negócio (ex: "preciso que meu estoque seja atualizado em tempo real").

Os agentes de LLM são excelentes em gerar a sintaxe (o "como"), mas eles não possuem visão de negócio nem consciência do contexto organizacional (o "o quê" e o "porquê"). O desenvolvedor que foca apenas na sintaxe será substituído; o desenvolvedor que foca na resolução de problemas usando a tecnologia como ferramenta será promovido.

2. A Armadilha da "Ilusão de Competência"

Um dos maiores riscos para os estagiários e juniores hoje é a ilusão de competência. Isso acontece quando um estudante pede para um agente de IA gerar uma função complexa, o código funciona de primeira e ele assume que "sabe" como aquilo funciona.

O problema surge no momento do debug. Quando o código do LLM falha, e ele falha frequentemente em casos de borda (edge cases) — quem não domina os fundamentos não consegue rastrear o erro. Sem a base, você não é o piloto da IA, você é apenas um passageiro que espera que a máquina não bata.

A diferença entre Operador de Prompt e Engenheiro de Software

Critério Operador de Prompt (Dependente) Engenheiro de Software (Autônomo)
Abordagem Tenta a sorte com prompts até o código "funcionar". Planeja a arquitetura e usa a IA para implementar partes.
Validação Executa o código e, se não deu erro, assume que está correto. Analisa a complexidade temporal, espacial e a segurança.
Manutenção Dificuldade em alterar o código sem quebrar outras partes. Aplica princípios de SOLID e Design Patterns para escalabilidade.
Resolução de Bugs Copia o erro no prompt e reza para a IA corrigir. Usa debuggers, logs e conhecimento de memória/stack para resolver.

3. Os Pilares Inegociáveis: O que você DEVE aprender

Se os agentes de LLM geram o código, onde você deve focar seus estudos? A resposta é: nos fundamentos que a IA não consegue simular com consciência.

  1. Lógica de Programação e Algoritmos: Você precisa entender como os dados fluem. Se você não sabe a diferença entre um Array e uma LinkedList, você não saberá pedir ao LLM a estrutura mais eficiente para o seu caso.
  2. Estruturas de Dados: Saber quando usar um HashMap em vez de percorrer uma lista com um loop for é a diferença entre um sistema que escala e um sistema que trava.
  3. Engenharia de Software:
    • SOLID: Para garantir que o código gerado pela IA não seja um "monolito" impossível de manter.
    • Design Patterns: Saber implementar um Observer ou um Factory para organizar a comunicação entre objetos.
    • Testes Automatizados: O LLM pode gerar o código, mas você deve escrever os testes unitários e de integração para provar que o código é confiável.
  4. Arquitetura de Sistemas: Entender a diferença entre Monólitos, Microsserviços e Serverless. O agente de IA pode escrever a função, mas ele não desenha a topologia da rede ou a estratégia de cache do Redis.

4. O Agente de IA como o "Novo Compilador"

Historicamente, a programação sempre evoluiu para abstrações maiores. Antigamente, programava-se em binário, depois Assembly, depois C, depois linguagens de alto nível como Java e Python.

O uso de LLMs é apenas a próxima camada de abstração. Eles não substituem o programador, eles substituem a digitação manual de códigos repetitivos (boilerplate).


// Exemplo de código commodity 
// (Agente de LLM faz em 1 segundo):
public class User {
    private String name;
    private String email;
    // Getters e Setters repetitivos...
}

O valor real não está em escrever a classe acima, mas em decidir se esse User deve ser persistido em um banco NoSQL para performance de leitura ou em um Relacional para consistência ACID.

5. Considerações finais: O Futuro do Desenvolvedor

A pergunta "Ainda vale a pena aprender a programar?" deve ser substituída por: "Como posso me tornar um desenvolvedor que domina as ferramentas de LLM, em vez de ser dominado por elas?"

A responsabilidade final pelo software continua sendo do ser humano. Se o sistema de um banco falha ou se os dados de um hospital são vazados, a culpa não é do modelo de linguagem que gerou o snippet de código, mas do engenheiro que validou e implementou aquele código sem a devida análise crítica.

Portanto, para os estagiários e juniores: estudem a base. Aprendam a ler código. Questionem cada linha que a IA gera. Transformem-se em arquitetos de soluções. O código é a ferramenta, mas a engenharia é a arte. E a arte, por enquanto, continua sendo humana.

Feito!

terça-feira, 14 de abril de 2026

MUDANÇA NO CNPJ: O que você precisa fazer no seu projeto

A Receita Federal confirmou: a partir de julho de 2026, o CNPJ será alfanumérico (com letras e números). Novo formato: 14 caracteres sendo 12 primeiros alfanuméricos + 2 dígitos verificadores (DV) numéricos.

Isso vai quebrar muitos sistemas. Vamos aos impactos:

1. CNPJ como Integer no banco de dados

Problema: CNPJs novos terão letras (ex: 12AB3456C0001). Tipo INTEGER não suporta letras.

Solução: Migrar coluna para VARCHAR(18) ou CHAR(14), mantenham o tamanho fixo para compatibilidade com sistemas legados.

2. CNPJ como Primary Key

Problema: PKs inteiras não funcionam + índices unique baseados em Integer falharão para novos registros.

Solução:

  • Alterar tipo da PK para VARCHAR(18) ou CHAR(14)
  • Atualizar foreign keys em todas as tabelas relacionadas
  • Regenerar índices unique

3. Validação de DV (Módulo 11)

Problema: Algoritmo atual não reconhece letras.

Solução: Ver algoritmo em pseudocódigo abaixo.

4. Máscaras e formats existentes

Problema: XX.XXX.XXX/0001-XX pode não funcionar com letras.

Solução: Criar máscara flexível que aceite alfanumérico.

5. Integração com APIs e ERPs

Problema: Sistemas legados que recebem CNPJ como número quebrarão.

Solução: Revisar APIs, contratos, e integrações -> tipar como string, não integer.

Cronograma

  • Julho 2026: Primeiros CNPJs alfanuméricos emitidos
  • CNPJs atuais: Permanecem válidos (não precisam migrar)

Ação imediata

  • ✓ Audit no banco: identifique colunas CNPJ com tipo Integer
  • ✓ Planeje migração para VARCHAR/CHAR
  • ✓ Teste o novo algoritmo de validação
  • ✓ Revise integrações externas

Algoritmo de Validação do DV (Módulo 11)

O algoritmo a seguir funciona para CNPJs numéricos (atuais) e CNPJs alfanuméricos (novos).

Tabela de Conversão

Caractere Valor para cálculo
0-9 0-9 (valor numérico)
A 17
B 18
C 19
D 20
E 21
F 22
G 23
H 24
I 25
J 26
K 27
L 28
M 29
N 30
O 31
P 32
Q 33
R 34
S 35
T 36
U 37
V 38
W 39
X 40
Y 41
Z 42

Pseudocódigo

FUNÇÃO obterValorCaractere(caractere):
    SE caractere >= '0' E caractere <= '9':
        RETORNAR inteiro(caractere)
    FIM SE
    
    SE caractere >= 'A' E caractere <= 'Z':
        codigoASCII <- inteiro(caractere)
        RETORNAR codigoASCII - 48
    FIM SE
    
    RETORNAR -1  // Caractere inválido
FIM FUNÇÃO


FUNÇÃO calcularDV(cnpj, posicaoDV):
    // posicaoDV = 1 para primeiro DV, 2 para segundo DV
    
    SE posicaoDV == 1://Primeiros 12 caracteres do CNPJ
        pesos <- [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        digitos <
    SENÃO://Primeiros 12 caracteres do CNPJ + primeiro DV
        pesos <- [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        digitos <
    FIM SE
    
    soma <- 0
    PARA i DE 0 ATÉ comprimento(digitos) - 1:
        valor <- obterValorCaractere(digitos[i])
        soma <- soma + (valor * pesos[i])
    FIM PARA
    
    resto <- soma MOD 11
    
    SE resto <= 1:
        DV <- 0
    SENÃO:
        DV <- 11 - resto
    FIM SE
    
    RETORNAR DV
FIM FUNÇÃO


FUNÇÃO validarCNPJ(cnpj):
    // Remove máscara (pontos, barras, hífen)
    cnpjLimpo <- limparMascara(cnpj)
    
    SE comprimento(cnpjLimpo) != 14:
        RETORNAR FALSO
    FIM SE
    
    // Extrai os DVs informados no CNPJ
    dv1Informado <- inteiro(cnpjLimpo[12])
    dv2Informado <- inteiro(cnpjLimpo[13])
    
    // Calcula primeiro DV
    dv1Calculado <- calcularDV(cnpjLimpo, 1)
    
    SE dv1Informado != dv1Calculado:
        RETORNAR FALSO
    FIM SE
    
    // Calcula segundo DV
    dv2Calculado <- calcularDV(cnpjLimpo, 2)
    
    SE dv2Informado != dv2Calculado:
        RETORNAR FALSO
    FIM SE
    
    RETORNAR VERDADEIRO
FIM FUNÇÃO

Exemplo de Implementação em JavaScript

function obterValorCaractere(char) {
    if (char >= '0' && char <= '9') {
        return parseInt(char, 10);
    }
    const codigoASCII = char.charCodeAt(0);
    if (codigoASCII >= 65 && codigoASCII <= 90) {
        return codigoASCII - 48;
    }
    return -1;
}

function calcularDV(cnpj, posicaoDV) {
    const pesos = posicaoDV === 1 
        ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
        : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
    
    const digitos = posicaoDV === 1 
        ? cnpj.substring(0, 12) 
        : cnpj.substring(0, 12) + cnpj.charAt(12);
    
    let soma = 0;
    for (let i = 0; i < digitos.length; i++) {
        const valor = obterValorCaractere(digitos[i]);
        soma += valor * pesos[i];
    }
    
    const resto = soma % 11;
    return resto <= 1 ? 0 : 11 - resto;
}

function validarCNPJ(cnpj) {
    const cnpjLimpo = cnpj.replace(/[.\/-]/g, '');
    
    if (cnpjLimpo.length !== 14) {
        return false;
    }
    
    const dv1 = parseInt(cnpjLimpo[12], 10);
    const dv2 = parseInt(cnpjLimpo[13], 10);
    
    if (calcularDV(cnpjLimpo, 1) !== dv1) {
        return false;
    }
    
    if (calcularDV(cnpjLimpo, 2) !== dv2) {
        return false;
    }
    
    return true;
}

// Testes
// true (CNPJ atual válido)
console.log(validarCNPJ('83.847.133/0001-25')); 

// true (CNPJ novo fictício válido)
console.log(validarCNPJ('53.RRV.R8C/9PHH-34')); 

// false
console.log(validarCNPJ('12345678900013')); 

// false
console.log(validarCNPJ('77.888.364/0001-81')); 

// false
console.log(validarCNPJ('X3.VGJ.TBC/0001-43')); 

Referências

Instrução Normativa RFB nº 2.229/2024

Nota Técnica Conjunta CNPJ Alfanumérico 2025.001

Nota Técnica Conjunta COCAD/SUARA/RFB nº 49/2024

A mudança não é complexa, mas exige atenção. Quem esperar o dia pode enfrentar problemas de última hora.

Feito!

terça-feira, 7 de abril de 2026

Além do Hype: O guia de sobrevivência em IA para Desenvolvedores

Se você abre o LinkedIn ou o YouTube hoje, é bombardeado por siglas: NLP, LLM, RAG, MCP, Agentes. Parece que a cada 24 horas o que você aprendeu ontem se tornou obsoleto. A sensação de insegurança é real, mas aqui vai um segredo: as ferramentas mudam, mas os fundamentos são os mesmos desde a década de 50.

No presente artigo, vamos dissecar os conceitos apresentados pelo canal balta, separando o que é barulho do que é base sólida para a sua carreira.

  1. IA não é uma "Ferramenta", é uma Categoria
  2. Muitas vezes ouvimos que "o Google lançou uma nova IA". Tecnicamente, isso está errado. A Inteligência Artificial é um termo "guarda-chuva" cunhado em 1956. O que estamos vendo hoje são novos modelos e arquiteturas dentro dessa categoria.

    Entender isso acalma os nervos. Você não precisa aprender uma "nova IA" toda semana; você precisa entender como os novos modelos se comportam dentro do ecossistema que já existe.

  3. O coração do código: Redes Neurais e Probabilidade
  4. Tudo o que vemos hoje, do ChatGPT, Gemini, Claude Code e etc baseia-se em Redes Neurais Artificiais.

    O que são: Microfunções (neurônios) organizadas em camadas.

    Como funcionam: Elas não "pensam". Elas recebem um input, processam através de pesos matemáticos e entregam uma probabilidade.

    Quando você interage com um LLM (Large Language Model), ele está apenas prevendo o próximo token (pedaço de palavra). Não existe um processo criativo ou consciência; existe estatística de alto nível.

    Por isso a alucinação acontece: a função do provedor de LLM é continuar o texto, mesmo que ela precise inventar algo para que a frase faça sentido gramatical.

  5. Onde está o valor real? (Dica: não é no modelo)
  6. Qualquer pessoa com R$ 100 pode assinar o ChatGPT Plus. Se o seu diferencial como dev ou empresa for apenas "usar o provedor de LLM", você não tem diferencial.

    O verdadeiro ouro está nos dados.

    Modelos como o GPT-4, Gemini, Claude Code foram treinados com dados públicos da internet (que muitas vezes são ruidosos ou desatualizados). O valor competitivo surge quando você conecta esses modelos aos seus dados privados e estruturados.

  7. O Trio de Ferro: RAG, MCP e Agentes
  8. Para tirar o provedor de LLM do "chat" e levá-la para o mundo real, usamos três pilares:

    • RAG (Retrieval-Augmented Generation)
    • O provedor de LLM é como um gênio que leu toda a biblioteca do mundo até 2023, mas não sabe o que aconteceu hoje de manhã na sua empresa. O RAG é a técnica de "dar um livro aberto" para o provedor de LLM consultar antes de responder. Você fornece o contexto (seus PDFs, bancos de dados) e ela responde com base nisso.

    • MCP (Model Context Protocol)
    • Não basta o provedor de LLM ler; ele precisa agir. O MCP é um protocolo que padroniza como o provedor de LLM se comunica com o seu sistema. É através dele que a IA entende que pode "chamar uma função" para emitir uma nota fiscal ou consultar um estoque.

    • Agentes e Skills
    • Agentes: São programas autônomos que decidem como resolver um problema passo a passo.

      Skills: São habilidades passivas (ex: saber formatar um texto em Markdown) que os agentes utilizam para cumprir sua missão.

  9. Por que os Programadores não vão sumir?
  10. O provedor de LLM é estocástica (imprevisível). Ela pode dar uma resposta diferente para o mesmo comando. Sistemas críticos, como transferências bancárias ou diagnósticos médicos, exigem determinismo.

    A engenharia de software continua sendo sobre como construir sistemas robustos, seguros e escaláveis. A IA será uma peça desse quebra-cabeça, mas o "arquiteto" que decide onde cada peça se encaixa ainda é você.

Considerações finais

O segredo para não temer aos provedores de LLM é parar de olhar para a interface de chat e começar a olhar para a arquitetura. Entender tokens, embeddings, camadas e protocolos transforma você de um simples "usuário de ferramentas" em um engenheiro capaz de construir o futuro.

Feito!

segunda-feira, 6 de abril de 2026

O novo "Contrato" do Desenvolvedor: Por que os agentes de IA não vão salvar seu código (mas podem te tornar um Arquiteto)

A era do desenvolvimento assistido por Inteligência Artificial (IA) chegou com uma promessa tentadora: "Copie e cole sua ideia, e nós geramos o código". E, de fato, os agentes de IA dos provedores de LLM (ChatGPT/Codex da OpenAI, Claude Code da Anthropic, Gemini do Google e etc) são impressionantes. Eles escrevem funções em segundos, sugerem refatorações e explicam bugs complexos.

No entanto, há um coro crescente nos fóruns de programação: "A IA introduziu um bug sutil no meu projeto" ou "Pedi X e ela entregou Y, totalmente fora do contexto".

A verdade crua é: a responsabilidade pelo código final continua sendo, 100%, do desenvolvedor.

Os agentes de IA não são "mágicos"; eles são ferramentas de processamento de linguagem extremamente avançadas. Atribuir a culpa de um bug a um LLM é como culpar o compilador por um erro de sintaxe. O erro estava na intenção ou na instrução.

Vamos explorar o paralelo que define essa nova fase do desenvolvimento e os desafios técnicos onde os agentes de IA ainda falham terrivelmente.

O Paralelo com o PO: Prompt raso = Requisito raso

Imagine a cena (clássica para qualquer Dev): o Product Owner (PO) ou o Scrum Master (SM) chega com um requisito de uma linha: "Precisamos de um sistema de login". Você, o desenvolvedor, acena, acha que entendeu e implementa um sistema simples com email/senha. Na entrega, o PO diz: "Mas eu precisava de login social (Google/Apple) e autenticação em dois fatores (2FA)".

O resultado? Frustração e retrabalho. De quem é a culpa? Do desenvolvedor que aceitou o requisito sem questionar.

O mesmo se aplica aos agentes de IA dos provedores de LLM. Um prompt raso é um requisito raso. O agente, treinado para ser útil, vai "adivinhar" o resto do contexto com base nos seus dados de treinamento. É aqui que nascem as "alucinações": o agente cria uma solução que parece correta, mas que não se encaixa no seu ecossistema específico.

A lição: Do mesmo modo que exigimos requisitos completos do PO, devemos fornecer contextos completos (prompts detalhados) aos agentes. Se você não tirar as dúvidas antes de gerar o código, o agente vai entregar o que "acha" que você quer, não o que você precisa.

Onde os agentes de IA falham e onde você é indispensável?

Mesmo com o melhor prompt do mundo, os agentes de IA atuais têm limitações estruturais que exigem o raciocínio humano.

  1. A falta de visão sistêmica e arquitetural
  2. Os agentes de IA são excelentes em resolver o "problema da função" atual (ex: ordenar uma lista). Eles muitas vezes falham em enxergar o sistema como um todo.

    O risco: Ao pedir para alterar um módulo de pagamento para aceitar uma nova moeda, o agente pode não perceber que essa mudança quebra a conciliação financeira em um microsserviço legado do outro lado da arquitetura. Ele foca no contexto imediato (o arquivo aberto), não na integridade arquitetural a longo prazo.

  3. A "última milha" da depuração profunda (Deep Debugging)
  4. Bugs de lógica simples? Os LLMs resolvem. Mas e as condições de corrida (race conditions)? Vazamentos de memória sutis? Bugs que só ocorrem sob alta latência de rede?

    O risco: O agente trabalha com o código estático ou logs que você fornece. Ele não "sente" o ambiente de execução. Depurar um erro que só acontece quando o banco de dados está a 90% de carga e o usuário cancela a requisição no meio do handshake ainda exige o instinto detetive de um desenvolvedor experiente.

  5. Segurança e a "alucinação de pacotes"
  6. Este é um risco crescente e crítico (Supply Chain Security).

    O risco: Às vezes, o agente sugere bibliotecas ou pacotes que não existem ou, pior, que foram criados por atacantes com nomes similares (typosquatting) para injetar código malicioso. Se o desenvolvedor apenas copia e cola (npm install), ele abre uma brecha de segurança grave. A curadoria de dependências continua sendo uma tarefa estritamente humana.

  7. As regras de negócio implícitas
  8. A documentação do Jira raramente contém 100% da verdade. O conhecimento real muitas vezes está na cabeça dos desenvolvedores sêniores.

    O risco: O agente de IA pode sugerir remover um trecho de código "feio" ou "redundante" por um ( Clean Code). O que ele não sabe é que esse código trata uma exceção bizantina de um cliente que representa 40% do faturamento da empresa. A IA não conhece a história e a política por trás do código.

O Caminho: Spec-Driven Development (SDD)

Então, como usar os agentes de IA dos provedores de LLM de forma profissional? O segredo não é "pedir código", é "pedir validação".

Esta é a fronteira entre o amadorismo e o profissionalismo no uso de IA:

  • Brainstorm com o agente:
  • Use a skill de brainstorm do agente. Diga: "Tenho essa ideia de recurso. Que perguntas você me faria para garantir que entende todos os requisitos de negócio, técnicos e de segurança?".

  • Geração da Spec.md:
  • Com base nas suas respostas, peça ao agente para gerar um arquivo Spec.md (Especificação Técnica) detalhando a implementação.

  • Validação Humana (SEU PAPEL):
  • Leia a especificação. É o que o negócio precisa? Segue a arquitetura? É seguro? Valide a Spec.

  • Geração do Código:
  • Só depois de validar a Spec, peça para o agente gerar o código com base nela.

É mais barato corrigir um parágrafo de texto do que 500 linhas de código em alguma linguagem de programação.

Considerações finais

O desenvolvimento de software não mudou fundamentalmente; as ferramentas mudaram. O maior desafio hoje não é escrever código, mas sim saber o que pedir e garantir que o que foi entregue é o que o negócio precisa.

O desenvolvedor deixou de ser apenas um construtor de tijolos para ser o arquiteto que revisa cada viga da obra. Os agentes de IA são seus operários mais rápidos, mas você ainda é o responsável pelo prédio não cair.

Feito!