Generics em TypeScript Explicados com Exemplos

Por Que any Faz Você Perder o Tipo que Passou? Tipe um parâmetro como any e o TypeScript para de verificar tudo o que sai da função: 1 2 3 4 5 6 function firstElement(arr: any[]): any { return arr[0]; } const n = firstElement([1, 2, 3]); n.toUpperCase(); // compila, quebra em tempo de execução Você sabe que passou um array de números. O compilador não sabe, porque any faz ele parar de olhar. O tipo de n fica any, então chamar um método de string em um número compila sem problemas e lança TypeError: n.toUpperCase is not a function em tempo de execução. ...

27 de outubro de 2026 · 8 minutos · 1592 palavras · SpaghettiCoder

Exceptions vs Valores de Erro: Como Escolher uma Estratégia

Abra um arquivo que não existe em Python e open() lança um FileNotFoundError que sobe para fora da sua função. Faça o mesmo em Go e os.ReadFile devolve um valor error ao lado de um slice de bytes nil. Mesma falha, duas formas de código completamente diferentes em volta dela. A diferença não é cosmética. Ela decide se quem chama pode ignorar a falha por acidente, e se o compilador percebe quando isso acontece. ...

26 de outubro de 2026 · 8 minutos · 1640 palavras · SpaghettiCoder

Git Worktree: Como Trabalhar em Várias Branches Juntas

Você está no meio de um branch de feature, três arquivos alterados e nada commitado, quando um colega avisa sobre um null pointer quebrando a produção. O jeito usual é dar git stash, fazer checkout da main, corrigir, dar push, depois git stash pop e torcer para que nada na sua feature inacabada dependesse dos arquivos que você acabou de trocar. O git worktree elimina essa dança. Ele faz checkout do branch do hotfix em uma segunda pasta, ao lado do seu branch de feature, com os dois apoiados no mesmo repositório. ...

24 de outubro de 2026 · 6 minutos · 1078 palavras · SpaghettiCoder

Rate Limiting de API: Algoritmos e Como Construir Um

Um cliente travado num retry loop sem backoff pode colocar mais carga na sua API em um minuto do que os outros dez mil clientes juntos. Do seu lado, isso não parece um ataque. Parece um bug do lado deles, e se torna um incidente do seu lado. Um rate limiter contém esse cliente antes que ele chegue a esse ponto. O que um rate limiter realmente decide? A cada request, o limiter se faz uma única pergunta: essa chave fez requests demais na janela atual? Três escolhas transformam isso em algo que você pode implementar. ...

23 de outubro de 2026 · 8 minutos · 1553 palavras · SpaghettiCoder

Function Calling e Tool Use em LLMs, Explicados

O que o function calling realmente faz em um LLM Pergunte a um modelo “qual é a previsão do tempo em Austin agora” sem nenhuma conexão com o mundo externo, e ele tem duas opções: dizer que não sabe, ou inventar alguma coisa. O function calling dá a ele uma terceira opção. Ele descreve o que precisa, passa essa descrição para o seu código e espera uma resposta real antes de responder. ...

22 de outubro de 2026 · 8 minutos · 1611 palavras · SpaghettiCoder

Intersection Observer: Lazy Loading e Scroll Infinito

Um listener de scroll em window pode disparar centenas de vezes durante um único swipe. Se você executa getBoundingClientRect() em cada card de um feed a cada um desses eventos, cinquenta imagens já bastam para a página engasgar. A Intersection Observer API tira essa verificação do caminho do scroll: você registra quais elementos observar, e o navegador avisa quando a visibilidade deles muda de fato. Como o IntersectionObserver funciona Um observer vigia um ou mais elementos target em relação a um root (o viewport, por padrão) e chama um callback sempre que um target cruza um limite de visibilidade. ...

21 de outubro de 2026 · 6 minutos · 1141 palavras · SpaghettiCoder

O Que São Unicode e a Codificação UTF-8

Abra um arquivo salvo como UTF-8 em uma ferramenta que assume outra codificação e café se transforma em café. Os bytes no disco não mudaram. O que mudou foi a regra usada para transformá-los de volta em caracteres, e as duas regras discordam sobre o que o byte 0xC3 significa. A maioria dos bugs de “caracteres estranhos” sai da mesma raiz: nomes de arquivo corrompidos, formulários ilegíveis, um emoji que faz um insert no banco falhar, duas strings que parecem idênticas mas falham na comparação. Por trás de cada um está a confusão entre duas coisas distintas: Unicode e UTF-8. ...

20 de outubro de 2026 · 8 minutos · 1633 palavras · SpaghettiCoder

Closures em JavaScript Explicadas com Exemplos

O Que É uma Closure em JavaScript? 1 2 3 4 5 6 7 8 9 10 11 12 function makeCounter() { let count = 0; return function () { count += 1; return count; }; } const counter = makeCounter(); console.log(counter()); // 1 console.log(counter()); // 2 console.log(counter()); // 3 makeCounter executa uma vez, retorna uma função, e aí termina: seu stack frame não existe mais. Ainda assim, cada chamada a counter() continua lendo e atualizando count, uma variável declarada dentro de uma função que já terminou. count não volta para 0, e não é copiada. É a mesma variável, ainda viva, três chamadas depois. ...

19 de outubro de 2026 · 7 minutos · 1345 palavras · SpaghettiCoder

O Que É TDD e Como Funciona o Ciclo Red-Green-Refactor

Um teste escrito depois do código tende a verificar o que o código faz, não o que ele deveria fazer. O desenvolvimento guiado por testes (TDD) resolve isso invertendo a ordem: você escreve o teste, vê ele falhar, e então escreve o menor código possível que o faz passar. Como o teste existe antes do código que ele verifica, ele não pode confirmar silenciosamente o que quer que o código retorne. Kent Beck formalizou esse ciclo como red, green, refactor em seu livro de 2002 Test-Driven Development: By Example. O nome pegou. ...

18 de outubro de 2026 · 7 minutos · 1442 palavras · SpaghettiCoder

npm vs Yarn vs pnpm: Qual Gerenciador de Pacotes Usar

Rode npm install em um projeto, depois pnpm install sobre o mesmo package.json, e você tem duas árvores node_modules diferentes e dois lockfiles diferentes. Acrescente um colega que usa Yarn e o repositório acaba com três lockfiles no histórico, cada um descrevendo uma árvore de dependências ligeiramente diferente. Os três leem o mesmo package.json e baixam do mesmo registro do npm. O que eles não combinam entre si é o que gravar no disco. ...

17 de outubro de 2026 · 8 minutos · 1522 palavras · SpaghettiCoder