anúncios

sexta-feira, 27 de fevereiro de 2026

Entendendo o git worktree na prática

No dia a dia de engenharia de software, especialmente em projetos com múltiplas features, hotfixes e revisões paralelas, é comum enfrentar um problema recorrente: alternar entre branches sem quebrar o estado do workspace. Tradicionalmente, isso envolve stash, commits temporários ou até múltiplos clones do mesmo repositório. O git worktree resolve esse problema de forma elegante e eficiente.

No presente artigo, vamos entender o conceito, os benefícios arquiteturais no fluxo de trabalho e um exemplo prático que conecta teoria e prática.

O que é git worktree

git worktree é um recurso do Git que permite ter múltiplos diretórios de trabalho (working directories) associados ao mesmo repositório local. Cada diretório pode estar ligado a uma branch diferente, compartilhando o mesmo histórico e objetos Git.

Em termos técnicos:

  • Um único repositório .git
  • Vários diretórios de trabalho independentes
  • Cada diretório com sua própria branch ativa

Isso elimina a necessidade de:

  • Fazer checkout constante
  • Clonar o repositório várias vezes
  • Usar stash com frequência

O problema que o worktree resolve

Imagine um cenário comum em equipes de desenvolvimento.

Você está trabalhando em:

  • feature nova
  • correção de bug urgente
  • revisão de Pull Request

Sem worktree, o fluxo geralmente é:

  1. Commit parcial ou stash
  2. Checkout de outra branch
  3. Resolver a tarefa
  4. Voltar para a branch original
  5. Aplicar stash
  6. Resolver conflitos eventuais

Isso gera:

  • perda de foco
  • risco de conflitos
  • overhead mental
  • contexto misturado

Em projetos grandes (monorepos, microsserviços, projetos com CI/CD pesado), isso impacta diretamente a produtividade.

Benefícios do git worktree

  1. Paralelismo no desenvolvimento
  2. Você pode trabalhar em múltiplas branches ao mesmo tempo.

    Exemplo:

    
    repo/
     ├── main-workspace
     ├── feature-pagamentos
     ├── hotfix-producao
     
    

    Cada diretório tem sua branch ativa.

  3. Redução de conflitos e erros
  4. Ao evitar stash frequente e mudanças de branch no mesmo diretório, diminui:

    • arquivos modificados esquecidos
    • conflitos inesperados
    • commits acidentais
  5. Ideal para revisão de código
  6. Você pode abrir uma branch de PR sem interromper o trabalho atual.

  7. Excelente para testes de versões
  8. Muito útil quando você precisa rodar duas versões do sistema:

    • versão atual
    • nova feature

    Exemplo típico em backend:

    • API executando versão estável
    • nova implementação em paralelo
  9. Performance melhor que múltiplos clones
  10. Porque:

    • objetos Git são compartilhados
    • apenas o workspace muda

    Isso economiza:

    • disco
    • tempo de clone
    • download de dependências

Estrutura interna (como o Git organiza isso)

Quando você cria um worktree, o Git registra internamente:

.git/worktrees/

Cada worktree tem:

  • referência da branch
  • HEAD independente
  • index próprio

Mas todos compartilham:

  • histórico
  • objetos
  • commits

Isso torna o mecanismo extremamente eficiente.

Quando usar git worktree na prática

Situações ideais:

Desenvolvimento paralelo de features

Quando duas tarefas estão em andamento ao mesmo tempo.

Hotfix urgente

Você não quer interromper sua feature atual.

Revisão de Pull Requests

Abrir o PR localmente sem bagunçar o ambiente atual.

Testes de refatoração grande

Manter uma branch estável rodando.

Monorepos grandes

Especialmente em projetos com build pesado.

Exemplo prático (teoria -> prática)

Vamos simular um cenário real de desenvolvimento.

Projeto:

API backend com duas tarefas:

  • feature: sistema de notificações
  • hotfix: correção de autenticação

Branch atual:

develop

Estrutura inicial:

finance-api/

Passo 1: Criar uma nova feature com worktree

Criando um diretório para a feature:

git worktree add ../feature-notificacoes -b feature/notificacoes

O que aconteceu aqui:

  • Criou um novo diretório
  • Criou uma nova branch
  • Ligou a branch ao novo workspace

Agora temos:

finance-api/
feature-notificacoes/

Cada um com uma branch diferente.

Passo 2: Trabalhando em paralelo

Workspace 1:

finance-api
branch: develop

Workspace 2:

feature-notificacoes
branch: feature/notificacoes

Passo 3: Hotfix urgente

Bug em produção.

Criando outro worktree:

git worktree add ../hotfix-auth -b hotfix/auth

Estrutura final:

finance-api/
feature-notificacoes/
hotfix-auth/

Agora você tem três contextos isolados.

Passo 4: Fluxo real de desenvolvimento

No diretório hotfix

cd ../hotfix-auth

Corrige o problema:

git commit -m "fix: corrige validação do token"
git push origin hotfix/auth

Merge realizado.

Enquanto isso, a feature continua intacta

Sem stash.

Sem conflitos.

Sem troca de branch.

Listando worktrees existentes

git worktree list

Saída típica:

/home/reginaldo/projetos/finance-api develop
/home/reginaldo/projetos/feature-notificacoes feature/notificacoes
/home/reginaldo/projetos/hotfix-auth hotfix/auth

Isso ajuda muito em repositórios grandes.

Removendo um worktree

Após merge da feature:

git worktree remove ../feature-notificacoes

Ou manual:

rm -rf ../feature-notificacoes
git worktree prune

Boas práticas usando git worktree

  1. Criar um diretório padrão
  2. Exemplo:

    worktrees/

    Estrutura recomendada:

    
    repo/
    worktrees/
       feature-x
       hotfix-y
    
    
  3. Nomear worktrees por contexto
  4. Evite nomes genéricos:

    Errado:

    
    test
    dev2
    branch2
    
    

    Melhor:

    
    feature-pagamentos
    refactor-auth
    hotfix-prod
    
    
  5. Usar em conjunto com PR workflow
  6. Fluxo eficiente:

    1. Criar branch
    2. Criar worktree
    3. Desenvolver
    4. Commit
    5. Push
    6. PR
    7. Remover worktree
  7. Automatizar com script
  8. Exemplo simples:

    new-feature.sh

    
    #!/bin/bash
    
    branch=$1
    
    git worktree add ../wt-$branch -b $branch
    cd ../wt-$branch
    
    

    Uso:

    ./new-feature.sh feature/pix

    Isso acelera bastante o fluxo de trabalho.

Comparação: workflow tradicional vs worktree

Sem worktree

Fluxo:


stash
checkout
pull
resolver conflito
stash pop

Problemas:

risco de erro

perda de contexto

lentidão

Com worktree

Fluxo:


novo diretório
nova branch isolada
desenvolver

Resultado:

workflow limpo

paralelismo

mais produtividade

Uso avançado em times experientes

Equipes maduras usam git worktree para:

QA paralelo

Ambiente para teste de PR local.

Refatoração grande

Manter branch estável rodando.

Testar migração de framework

Exemplo real:

Migrar:

  • Spring Boot
  • Angular
  • React

Sem quebrar a base principal.

Integração com ferramentas modernas

Funciona muito bem com:

VSCode

Docker

Dev Containers

Monorepos

CI local

Exemplo prático com Docker:

Cada worktree pode subir um container diferente.

docker compose up

Com variáveis diferentes.

Quando não usar git worktree

Casos raros:

  • projetos muito pequenos
  • repositórios descartáveis
  • scripts simples

Mas na maioria dos casos profissionais, vale a pena.

Considerações finais

git worktree é um recurso subestimado do Git, mas extremamente poderoso para engenheiros de software que trabalham com múltiplos contextos de desenvolvimento.

Ele melhora:

  • organização
  • foco
  • produtividade
  • segurança no workflow

E reduz drasticamente problemas comuns como:

  • stash excessivo
  • conflitos inesperados
  • troca constante de branches

Em equipes que trabalham com:

  • microserviços
  • APIs
  • sistemas corporativos
  • projetos com CI/CD

O uso de git worktree pode se tornar um diferencial real no fluxo da engenharia de software.

Feito!

quarta-feira, 18 de fevereiro de 2026

O lado obscuro do Vibe Coding

O movimento Vibe Coding transformou a maneira como criamos software. A promessa é sedutora: você descreve sua ideia em linguagem natural, e uma plataforma de IA (Bolt.new, Lovable, Abacus) que são ferramentas especializadas para gerar um aplicativo full-stack funcional em minutos.

No entanto, há um perigo silencioso nesse fluxo de trabalho. Muitas dessas ferramentas utilizam o Supabase como backend padrão. Se você não for específico no seu prompt, pode acabar com uma aplicação onde qualquer pessoa na internet consegue ler, alterar ou deletar os dados de todos os seus usuários.

O Contexto Histórico: Da Rebeldia de Karpathy ao Mainstream

O termo Vibe Coding não nasceu em um laboratório de engenharia tradicional, mas sim de uma observação provocativa de Andrej Karpathy (cofundador da OpenAI) em fevereiro de 2025. Ao descrever um fluxo de trabalho onde a sintaxe é irrelevante e a "vibe" (a intenção e o feedback visual) é tudo, Karpathy deu nome a um movimento que o lendário produtor Rick Rubin comparou ao "Punk Rock do Software".

Em 2025, o termo foi eleito a palavra do ano pelo dicionário Collins, consolidando a ideia de que qualquer pessoa com uma boa ideia e um prompt pode ser um desenvolvedor. No entanto, essa origem focada na velocidade e na expressão criativa trouxe um efeito colateral: a negligência com fundamentos invisíveis, como o RLS, que agora, em 2026, define a fronteira entre um protótipo amador e um app profissional seguro.

No presente artigo, vamos entender a vulnerabilidade de RLS (Row Level Security) desabilitado e como corrigi-la com uma simples mudança na sua instrução inicial.

O que é Vibe Coding e por que o Supabase?

Vibe Coding é o termo cunhado para descrever o desenvolvimento de software focado na intenção e na iteração rápida através de prompts de IA, onde o desenvolvedor atua mais como um "maestro" do que como um digitador de sintaxe.

Para que essa "mágica" aconteça, a IA precisa de um backend que seja fácil de configurar programaticamente. O Supabase é a escolha ideal por ser um "Firebase Open Source" baseado em PostgreSQL, oferecendo banco de dados, autenticação e armazenamento de forma instantânea.

O problema surge na configuração padrão.

O Perigo: A Chave Anon e o RLS Desabilitado

Quando uma plataforma (Bolt.new, Lovable, Abacus) cria um app Supabase para você, ela gera um arquivo de configuração (geralmente .env) contendo a SUPABASE_URL e a SUPABASE_ANON_KEY.

Diferente de backends tradicionais onde a chave do banco de dados fica escondida no servidor, no modelo de arquitetura moderna (PostgREST), a chave anon é pública e fica exposta no navegador do usuário.

O que é RLS (Row Level Security)?

RLS significa Row Level Security (Segurança em Nível de Linha). É um recurso do banco de dados PostgreSQL que permite definir regras granulares para quem pode ver ou modificar cada linha em uma tabela.

Sem RLS: Se você tem a chave anon, você tem acesso total às tabelas.

Com RLS: Mesmo com a chave anon, o banco de dados pergunta: "Quem é este usuário e ele tem permissão para ver esta linha específica?"

A Anatomia da Vulnerabilidade

Imagine que você pediu na plataforma (Bolt.new, Lovable, Abacus):

"Crie um app de gestão de clientes para minha agência".

A plataforma (Bolt.new, Lovable, Abacus) cria uma tabela chamada clientes. Por padrão, para facilitar o desenvolvimento e garantir que o app "funcione de primeira" (a famosa "vibe"), muitas ferramentas de geração de código criam as tabelas sem habilitar o RLS.

O Cenário de Desastre

  1. O hacker acessa seu site.
  2. Abre o console do desenvolvedor (F12) e encontra sua SUPABASE_ANON_KEY.
  3. Utiliza uma ferramenta simples ou até o próprio terminal para fazer uma requisição à API do seu Supabase:
  4. curl 'https://seu-projeto.supabase.co/rest/v1/clientes?select=*' \
    -H "apikey: SUA_CHAVE_ANON" \
    -H "Authorization: Bearer SUA_CHAVE_ANON"

O resultado? O invasor recebe um JSON com todos os dados de todos os clientes, e-mails, faturamentos e notas administrativas. Se o RLS estiver desabilitado, a chave "Anônima" tem poderes de administrador sobre os dados públicos.

A Solução: Ajustando o seu Prompt

A boa notícia é que a IA é obediente. O erro não está na tecnologia, mas na omissão da segurança no prompt inicial. Para garantir que seu app seja seguro desde o "dia zero", você deve incluir instruções explícitas de segurança.

O "Prompt Seguro"

Sempre que iniciar um projeto de Vibe Coding, adicione este parágrafo ao seu comando:

"Habilite o Row Level Security (RLS) em todas as tabelas criadas no Supabase. Crie políticas de segurança para que usuários autenticados possam ler e escrever apenas seus próprios dados, e garanta que dados administrativos não sejam acessíveis via chave anon sem as devidas permissões."

Ao fazer isso, a IA na plataforma (Bolt.new, Lovable, Abacus) gerará o SQL necessário para proteger seu banco, parecido com este:

-- Exemplo do que a IA deve gerar nos bastidores
ALTER TABLE clientes ENABLE ROW LEVEL SECURITY;

CREATE POLICY "Usuários só vêem seus próprios clientes"
ON clientes FOR SELECT

USING (auth.uid() = user_id);

Tabela Comparativa: Sem RLS vs. Com RLS

Recurso Sem RLS (Padrão Vibe) Com RLS (Prompt Seguro)
Visibilidade da Chave Exposta no Browser (Normal) Exposta no Browser (Normal)
Acesso a dados alheios Livre (Risco Total) Bloqueado pelo Banco
Privacidade Inexistente Garantida por UID
Escalabilidade Perigosa Segura para Produção

Considerações finais

O Vibe Coding é o futuro, mas a segurança não pode ser deixada para depois. Ao entender que o Supabase delega a segurança para o nível da linha (RLS), você assume o controle da integridade dos dados dos seus usuários.

Não deixe que a agilidade de um prompt comprometa a confiança dos seus clientes. Segurança também faz parte da "vibe".

Feito!

quinta-feira, 12 de fevereiro de 2026

Executando o Ollama no ambiente Docker

Executar o Ollama no Docker é a maneira mais prática de executar modelos de linguagem (LLMs) localmente, garantindo isolamento do sistema operacional e fácil gerenciamento.

O presente howto explica passo a passo para configurar o Ollama com Docker e instalar modelos, tanto com CPU quanto com GPU.

  1. Pré-requisitos
  2. A premissa é ter o Docker e Docker-Compose instalados, caso ainda não tenha, verifique Instalando Docker e Docker Compose no Linux (qualquer distro) ou Instalando Docker no Windows 10

    Nvidia Container Toolkit (Para GPU): Se você tem uma GPU Nvidia e quer aceleração, instale o Nvidia Container Toolkit para o Docker reconhecer sua placa.

  3. Executar o Ollama no Docker
  4. Abra o seu terminal e utilize os comandos abaixo:

    A. Apenas CPU

    -d: Roda o contêiner em segundo plano (detached mode).

    -v ollama:/root/.ollama:

    Cria um volume chamado ollama para garantir que seus modelos baixados não sejam apagados quando o contêiner for reiniciado.

    -p 11434:11434:

    Mapeia a porta padrão do Ollama.

    B. Com GPU NVIDIA (Aceleração) docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama --gpus=all:

    Permite que o contêiner acesse a GPU.

  5. Instalar e Rodar Modelos Abertos (Ollama Pull/Run)
  6. Com o contêiner rodando, você pode "entrar" nele e baixar os modelos através da CLI (Interface de Linha de Comando).

    Download de um modelo (ex: Llama 3.2):

    docker exec -it ollama ollama pull llama3.2

    Executar o modelo e interagir:

    docker exec -it ollama ollama run llama3.2

    Agora você pode conversar com o modelo diretamente no terminal.

    Outros modelos populares:

    docker exec -it ollama ollama run gemma2

    docker exec -it ollama ollama run deepseek-r1

    docker exec -it ollama ollama run qwen2.5
  7. Como ver os modelos instalados e gerenciar
  8. Para listar os modelos que você já baixou dentro do contêiner Docker, use:

    docker exec -it ollama ollama list

    Para remover um modelo:

    docker exec -it ollama ollama rm nome_do_modelo
  9. Dica Pro: Interface Web (Open WebUI)
  10. Para ter uma experiência tipo "ChatGPT" com o Ollama no Docker, a melhor opção é o Open WebUI.

    Use o docker-compose para rodar o Ollama e a interface gráfica juntos:

    Crie um arquivo docker-compose.yml:

    
    services:
      ollama:
        volumes:
          - ollama:/root/.ollama
        container_name: ollama
        image: ollama/ollama
        ports:
          - "11434:11434"
        networks:
          - ollama-net
        restart: always
    
      open-webui:
        image: ghcr.io/open-webui/open-webui:main
        container_name: open-webui
        volumes:
          - open-webui:/app/backend/data
        ports:
          - "3000:8080"
        environment:
          - OLLAMA_BASE_URL=http://ollama:11434
        networks:
          - ollama-net
        restart: always
    
    networks:
      ollama-net:
    
    volumes:
      ollama:
      open-webui:
    
    

    Execute: docker-compose up -d

    Acesse http://localhost:3000 no seu navegador.

Feito!

quarta-feira, 11 de fevereiro de 2026

Fazendo o Deploy do site com GitHub Actions

Configurar um site com GitHub Actions para fazer o deploy automático via FTP transforma seu fluxo de trabalho: você faz o git push e o GitHub cuida do resto.

O presente howto explica como fazer o deploy do seu site com GitHub Actions via FTP, comum em hospedagem compartilhada.

Segue os procedimentos:

  1. Salve suas credenciais com segurança
  2. Nunca coloque senhas diretamente no código. No seu repositório no GitHub:

    Vá em Settings > Secrets and variables > Actions.

    Clique em New repository secret e adicione:

    FTP_SERVER: O endereço ou nome de domínio do seu servidor.

    FTP_USERNAME: Seu usuário de FTP.

    FTP_PASSWORD: Sua senha de FTP.

  3. Crie o arquivo de Workflow
  4. No seu projeto local, crie a pasta .github/workflows/ e, dentro dela, um arquivo chamado main.yml. Cole o conteúdo abaixo:

    Se o site foi desenvolvido apenas com HTML, CSS e JS

    No seu projeto local, crie o diretório .github/workflows/ e, dentro dela, um arquivo chamado main.yml. Segue:

    .github/workflows/main.yml

    Se o site foi desenvolvido com React

    Diferente de um site estático simples (HTML/CSS/JS), o navegador não entende diretamente seu código React (JSX). O GitHub Actions precisa rodar o comando de compilação para criar a pasta final com os arquivos otimizados.

    No seu arquivo .github/workflows/main.yml, use esta estrutura

    .github/workflows/main.yml

  5. Suba as alterações
  6. Agora basta commitar e enviar para o GitHub:

    git add .

    git commit -m "Configurando deploy automático"

    git push origin main

    Você pode acompanhar o progresso em tempo real na aba Actions do seu repositório. Se tudo estiver certo, seu site será atualizado em poucos segundos!

Pontos importantes para React:

Diretório Local (local-dir): Se você usa Vite (o padrão atual), a pasta de saída é a dist/. Se usa o antigo Create React App, é a build/.

Roteamento (SPA): Se o seu site usa react-router-dom, lembre-se de configurar um arquivo .htaccess no seu servidor para redirecionar todas as rotas para o index.html, caso contrário, você receberá erro 404 ao atualizar a página.

Variáveis de Ambiente: Se o seu React usa .env, você precisará cadastrar essas variáveis nos Secrets do GitHub e injetá-las no passo de build.

Caso criou o projeto React com Vite, precisa adicionar uma configuração.

O segredo aqui é que o GitHub Actions vai criar um "computador virtual", instalar o Node.js, baixar suas bibliotecas e transformar seu código JSX em arquivos que qualquer servidor entende.

Dica de Ouro: O arquivo .htaccess

Para sites React (Single Page Applications), se você não configurar o servidor, as rotas (ex: ://seusite.com) darão erro 404 ao atualizar a página. Crie um arquivo chamado .htaccess na sua pasta public do projeto com este conteúdo:



  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]


ATENÇÃO

  1. Verifique se o nome da pasta de saída no seu projeto é realmente dist (padrão do Vite) ou build.
  2. Certifique-se de que as Secrets (FTP_SERVER, FTP_USERNAME, FTP_PASSWORD) foram adicionadas corretamente no GitHub.
  3. Faça o git push e acompanhe a "mágica" na aba Actions.

Feito!

terça-feira, 10 de fevereiro de 2026

O segredo da escalabilidade no n8n que poucos conhecem

O n8n usa SQLite por padrão em instalações self-hosted, mas isso pode gerar gargalos de desempenho e concorrência em cenários com múltiplos acessos simultâneos. Para ambientes de produção ou workflows de grande escala, a recomendação oficial é migrar para PostgreSQL.

Banco de dados padrão no n8n

Self-hosted: por padrão, utiliza SQLite (leve, embutido, sem necessidade de servidor separado).

n8n Cloud: planos básicos usam SQLite; apenas planos Enterprise usam PostgreSQL.

Limitações do SQLite

Concorrência limitada: não lida bem com múltiplas conexões simultâneas.

Escalabilidade restrita: adequado apenas para testes, ambientes pessoais ou pequenos projetos.

Risco de bloqueios: em workflows com muitos acessos, pode ocorrer lentidão ou falhas de escrita/leitura.

Recomendações para produção

Migrar para PostgreSQL:

Melhor suporte a conexões simultâneas.

Transações robustas e maior confiabilidade.

Ferramentas de backup, replicação e escalabilidade.

Configuração básica:

Definir variáveis do ambiente Docker:

DB_TYPE=postgresdb
DB_POSTGRESDB_DATABASE, DB_POSTGRESDB_HOST, DB_POSTGRESDB_USER, DB_POSTGRESDB_PASSWORD

Criar usuário e banco dedicados para o n8n.

Comparativo Rápido

Critério SQLite (default) PostgreSQL (recomendado)
Instalação Simples, embutido Requer servidor dedicado
Concorrência Limitada Alta, ideal para múltiplos acessos
Escalabilidade Baixa Elevada, suporta clusters
Manutenção Fácil Mais complexa, mas robusta
Uso ideal Testes, projetos pequenos Produção, workflows críticos

Considerações finais

Se você pretende rodar o n8n em produção com múltiplos usuários ou workflows pesados, não use SQLite. Configure PostgreSQL para garantir estabilidade, desempenho e escalabilidade.

Feito!

sexta-feira, 6 de fevereiro de 2026

O melhor método para aprender qualquer idioma

Aprender um novo idioma é um objetivo comum entre profissionais de tecnologia, estudantes e pessoas que desejam crescer pessoal e profissionalmente. No entanto, apesar da enorme oferta de cursos, aplicativos e métodos milagrosos, muitos acabam frustrados por não alcançarem fluência.

A verdade é simples e, ao mesmo tempo, poderosa: o melhor método para aprender qualquer idioma é o mesmo que você utilizou para aprender sua língua materna quando era bebê/criança.

Esse método segue uma ordem natural:

  • Ouvir
  • Falar (repetindo o que ouviu)
  • Ler
  • Escrever

E sim, esse mesmo processo se aplica a qualquer idioma, seja inglês, espanhol, francês, italiano, alemão, russo ou até mesmo linguagens técnicas usadas no dia a dia da área de TI.

Como Analista Desenvolvedor, com mais de 8 anos de experiência em tecnologia, documentação técnica, leitura de código e aprendizado constante, posso afirmar: idiomas se aprendem como sistemas — por exposição, prática contínua e uso real.

No presente artigo, vou explicar esse método em profundidade, com exemplos práticos, gratuitos e aplicáveis à rotina de quem trabalha com tecnologia.

Como aprendemos nosso idioma nativo

Quando você era bebê, ninguém lhe entregou um livro de gramática.

Você não começou decorando regras, tempos verbais ou exceções.

O processo foi natural:

  • Você ouviu as pessoas ao seu redor o tempo todo
  • Começou a repetir sons, mesmo errando
  • Aos poucos passou a associar sons a significados
  • Depois veio a leitura
  • Por fim, a escrita

Esse aprendizado aconteceu por imersão, não por memorização.

E aqui está o erro mais comum ao aprender um novo idioma na fase adulta: tentar inverter a ordem.

O erro clássico no aprendizado de idiomas

A maioria das pessoas começa assim:

  • Estudando gramática
  • Decorando regras
  • Traduzindo palavra por palavra

Isso gera um efeito colateral grave: a pessoa entende, mas não fala.

Na área de TI, isso é semelhante a:

Ler sobre uma linguagem de programação, mas nunca escrever código.

Você até entende o conceito, mas trava na hora de aplicar.

Idiomas funcionam exatamente da mesma forma.

Etapa 1: Ouvir (Input antes de Output)

O primeiro passo é ouvir massivamente.

Antes de falar bem, você precisa se acostumar com o som do idioma.

Exemplos práticos (100% gratuitos)

  • Vídeos no YouTube
  • Podcasts
  • Séries e filmes
  • Conteúdos técnicos (no caso de TI)

Se você trabalha com tecnologia, isso é uma enorme vantagem.

Exemplos para profissionais de TI:

  • Palestras técnicas no YouTube (conferências, talks)
  • Vídeos de código comentado
  • Podcasts de tecnologia em inglês

Mesmo sem entender tudo, seu cérebro começa a reconhecer padrões.

Assim como acontece quando você aprende uma nova stack ou framework.

Imersão total no dia a dia

É necessário fazer uma imersão 100% no idioma que se quer aprender, utilizando esse idioma nos dispositivos e ferramentas usadas diariamente.

Isso significa alterar o idioma do sistema operacional, celular, navegador, IDE, documentação e ferramentas de trabalho. Essa mudança força o cérebro a lidar com o idioma de forma constante, criando familiaridade com termos, estruturas e padrões, exatamente como acontece na infância, quando aprendemos nossa língua materna por exposição contínua.

Para profissionais de TI, essa imersão é ainda mais natural: logs, mensagens de erro, documentações oficiais, commits e issues já estão majoritariamente em inglês. Ao parar de traduzir tudo e passar a conviver com o idioma, o aprendizado acelera drasticamente.

Etapa 2: Falar (repetição sem medo de errar)

Bebês falam errado.

E ninguém ri deles.

Eles aprendem porque repetem.

No aprendizado de idiomas, o adulto trava porque tem medo de errar.

Mas errar é parte do processo.

Técnicas práticas e gratuitas

  • Repetir frases em voz alta
  • Fazer shadowing (ouvir e repetir junto)
  • Falar sozinho descrevendo ações do dia

Exemplo prático:

Ao assistir um vídeo técnico:

"This API handles authentication"

Pause e repita em voz alta.

Não traduza. Apenas repita.

Isso é muito parecido com aprender comandos no terminal Linux:

Você não pensa em português, você executa.

Etapa 3: Ler (reforçando padrões)

Depois de ouvir bastante, a leitura passa a fazer sentido.

Aqui, novamente, profissionais de TI saem na frente.

Exemplos práticos:

  • Documentações oficiais
  • Artigos técnicos
  • Blogs de tecnologia
  • Issues no GitHub

Você começa a perceber algo interessante:

Aquilo que você ouviu, agora aparece escrito.

Isso cria conexões mentais fortes.

Assim como quando você lê código depois de já ter visto exemplos funcionando.

Etapa 4: Escrever (organizando o pensamento)

A escrita é a etapa mais avançada.

Ela exige:

  • Vocabulário
  • Estrutura
  • Clareza de pensamento

Por isso, ela vem por último.

Como praticar gratuitamente

Escrever comentários em inglês

Criar pequenos textos no LinkedIn

Escrever README.md em projetos pessoais

Documentar código em inglês

Como profissional de TI, você pode transformar o aprendizado em algo produtivo.

Você aprende o idioma e melhora seu portfólio.

A conexão direta com a área de TI

Aprender idiomas é muito parecido com aprender tecnologia.

Aprendizado de Idiomas Aprendizado em Programação
Ouvir Ver exemplos e demonstrações
Falar Programar e executar código
Ler Ler documentação e artigos técnicos
Escrever Criar projetos, documentar e refatorar código

Ninguém aprende programação apenas lendo livros.

E ninguém aprende idiomas apenas estudando gramática.

A importância da consistência

Bebês e crianças aprendem porque estão expostos todos os dias.

Não é intensidade. É constância.

Melhor:

20 minutos por dia

Do que:

3 horas uma vez por semana

Na TI, isso é o mesmo que:

Estudar um pouco todos os dias ao invés de maratonar conteúdos.

Gramática: inimiga ou aliada?

Gramática não é vilã.

Ela só não deve ser o ponto de partida.

Use gramática como:

  • Ajuste fino
  • Correção de erros
  • Consolidação

Nunca como base principal.

Um plano simples e realista

Rotina diária

10 min ouvindo conteúdo

5 min repetindo frases

5 min lendo algo simples

Total: 20 minutos por dia

Sem custo.

Sem pressão.

Considerações finais

O melhor método para aprender qualquer idioma já é conhecido por você.

Você usou ele quando aprendeu a falar.

A diferença é que agora você é adulto, trabalha com tecnologia e tem acesso a uma quantidade absurda de conteúdo gratuito.

Se você:

  • Ouvir
  • Falar
  • Ler
  • Escrever

Na ordem correta.

Com constância.

Sem medo de errar.

Você aprende.

Idiomas não são diferentes de sistemas, frameworks ou linguagens de programação.

Eles exigem exposição, prática e uso real.

E isso, como profissional de TI, você já sabe fazer muito bem.

Feito!

quinta-feira, 29 de janeiro de 2026

A maturidade do desenvolvedor que fala por si através dos commits

Em processos seletivos técnicos, avaliações de performance ou até em análises informais entre pares, um padrão recorrente chama a atenção de qualquer desenvolvedor experiente ou arquiteto de software: repositórios públicos com um único commit intitulado "first commit", acompanhados de um README.md padrão gerado automaticamente por frameworks como React, Angular, Vue.js, Laravel, Spring Boot, Quarkus, NestJS ou AdonisJS.

Esse padrão, embora comum, carrega sinais claros, não apenas sobre o projeto em si, mas sobre o nível de maturidade profissional de quem o publica. O problema não está em fazer cursos online, tampouco em utilizar boilerplates ou scaffolds. O problema está em não compreender o repositório como um artefato profissional, parte essencial do portfólio e da narrativa técnica do desenvolvedor.

No presente artigo, vamos analisar de forma argumentativa por que commits granulares, históricos evolutivos e READMEs bem escritos são indicadores concretos de senioridade, pensamento arquitetural e responsabilidade profissional.

O repositório como evidência de pensamento técnico

Um repositório Git não é apenas um local de armazenamento de código. Ele é, essencialmente:

  • Um registro histórico de decisões técnicas
  • Uma linha do tempo da evolução de uma solução
  • Um documento vivo de arquitetura, domínio e trade-offs

Quando um projeto possui apenas um commit genérico, o que se perde não é apenas a granularidade do código, mas a capacidade de avaliação do raciocínio técnico. Um arquiteto, um Tech Lead ou um recrutador sênior não avalia apenas o que foi feito, mas como foi feito.

E o "como" está nos commits.

Commits não são burocracia: são comunicação

Existe um equívoco comum entre desenvolvedores iniciantes (e até intermediários e avançados): tratar commits como uma obrigação mecânica, algo que "precisa existir" apenas para subir o código ao repositório remoto.

Na prática, commits são mensagens de comunicação assíncrona entre:

  • Desenvolvedores do time
  • O "eu do futuro"
  • Revisores de código
  • Auditores técnicos
  • Ferramentas de CI/CD
  • Gestores técnicos

Um histórico saudável de commits revela:

  • Implementação incremental de features
  • Correções de bugs contextualizadas
  • Refatorações conscientes
  • Ajustes arquiteturais
  • Evolução de requisitos

Um único "first commit" apaga toda essa narrativa.

Projetos de curso vs. projetos autorais

Não há absolutamente nenhum problema em publicar projetos de cursos. O problema surge quando eles são apresentados como projetos autorais sem qualquer contextualização.

Projetos de curso geralmente têm características claras:

  • Commits únicos ou genéricos
  • README padrão do framework
  • Ausência de contexto de negócio
  • Código muito similar a centenas de outros repositórios
  • Falta de decisões arquiteturais explícitas

Já projetos autorais, mesmo simples, costumam apresentar:

  • Commits por feature ou tarefa
  • Ajustes progressivos de estrutura
  • README explicativo
  • Escolhas tecnológicas justificadas
  • Código com identidade própria

Para um arquiteto de software, essa distinção é evidente em poucos minutos de análise.

README.md: o documento mais subestimado do projeto

O README.md é, frequentemente, o primeiro e às vezes único ponto de contato de alguém com o projeto. Ainda assim, muitos repositórios mantêm:

  • README padrão do React (npm start, npm test, etc.)
  • README vazio
  • README genérico sem contexto

Isso é um erro estratégico.

Um bom README não serve apenas para explicar como rodar o projeto. Ele serve para responder perguntas fundamentais:

  1. Qual é o objetivo do projeto?
  2. Todo projeto nasce de um problema. Um README profissional deixa isso explícito.

    Exemplo:

    "Este projeto surgiu da necessidade de automatizar o controle financeiro pessoal, reduzindo erros manuais e centralizando informações de receitas, despesas e contas."

    Isso demonstra pensamento orientado a problema, não apenas a tecnologia.

  3. Qual problema motivou a solução?
  4. Arquitetura começa no problema, não no framework.

    Explicitar o contexto inicial demonstra:

    • Capacidade de análise
    • Entendimento de domínio
    • Clareza de propósito
  5. Quais decisões técnicas foram tomadas e por quê?
  6. Não basta listar tecnologias. É preciso justificar.

    Exemplo:

    Por que React e não Angular?

    Por que PostgreSQL e não MySQL?

    Por que arquitetura monolítica e não microsserviços?

    Essa seção diferencia um executor de código de um engenheiro de software.

  7. Stack tecnológica utilizada
  8. Aqui sim entra a lista objetiva:

    • Linguagem
    • Frameworks
    • Banco de dados
    • Ferramentas auxiliares
    • Infraestrutura (quando aplicável)

    Mas sempre com coerência com o problema proposto.

  9. Como configurar e executar o projeto localmente
  10. Essa é a parte que muitos confundem como sendo "todo o README".

    Ela é importante, mas não suficiente.

    Inclua:

    • Pré-requisitos
    • Variáveis de ambiente
    • Scripts de execução
    • Observações específicas do ambiente

    Isso demonstra preocupação com reprodutibilidade, um conceito fundamental em engenharia de software.

Commits granulares refletem maturidade

Vamos ser diretos:

Desenvolvedores seniores não trabalham com um commit único por projeto.

Commits granulares indicam:

  • Organização mental
  • Capacidade de dividir problemas
  • Disciplina técnica
  • Experiência com trabalho colaborativo
  • Familiaridade com revisão de código

Exemplos de bons commits:

  • feature: adicionar cadastro de usuários
  • fix: corrigir cálculo de saldo negativo
  • refactor: separar camada de serviço
  • docs: atualizar README com instruções de setup

Esses commits contam uma estória. E arquitetos avaliam estórias.

O impacto disso em processos seletivos

Em entrevistas técnicas mais maduras, o repositório Git é analisado como:

  • Evidência prática de experiência
  • Fonte de discussão arquitetural
  • Base para perguntas profundas

Um repositório com um único commit limita drasticamente essa conversa. Já um projeto bem versionado permite perguntas como:

  • "Por que você refatorou essa parte?"
  • "O que motivou essa decisão?"
  • "Como você lidaria com esse código em escala?"

Ou seja: abre espaço para avaliar senioridade real.

Frameworks não definem senioridade

Outro ponto crítico: usar React, NextJS, Angular, Vue.js, Laravel, Spring Boot, Quarkus, NestJS, AdonisJS não torna ninguém automaticamente sênior. Frameworks são ferramentas. O que define maturidade é:

  • Capacidade de modelar domínio
  • Clareza arquitetural
  • Organização do código
  • Evolução incremental
  • Comunicação técnica (commits e README)

Manter apenas o README padrão do framework passa a mensagem de que o projeto não foi apropriado pelo desenvolvedor, apenas executado.

O repositório como produto profissional

Um arquiteto de software enxerga o repositório como um produto em si. Mesmo projetos pessoais seguem padrões profissionais porque refletem:

  • Identidade técnica
  • Rigor conceitual
  • Postura profissional

Isso é especialmente relevante para quem:

  • Busca posições sênior
  • Atua como PJ
  • Trabalha como consultor
  • Quer se posicionar como especialista

Seu GitHub é, na prática, um cartão de visitas técnico.

Qualidade não está na quantidade de projetos

Outro erro comum é tentar compensar falta de profundidade com volume de repositórios. Dez projetos com:

  • Um commit cada
  • README genérico
  • Código semelhante

Valem menos do que um único projeto bem documentado, versionado e contextualizado.

Arquitetura é profundidade, não superficialidade.

Considerações finais

Repositórios com apenas um "first commit" e README padrão não são, por si só, um problema técnico. Eles são um sinal. Um sinal de que o desenvolvedor ainda não internalizou que:

  • Código é comunicação
  • Versionamento é narrativa
  • README é documentação estratégica
  • Projetos contam histórias profissionais

Como Analista Desenvolvedor Sênior (Full Cycle Developer), afirmo: não é a stack que revela maturidade, é o cuidado com o todo. Commits bem feitos, README bem escrito e clareza de propósito são marcas de quem entende que software é mais do que código, é engenharia, contexto e decisão.

Se o seu repositório fala pouco, ele será interpretado como pouco.

Faça com que ele fale por você.

Feito!