Funcionava no mês passado, está partido hoje, e pelo meio há duzentos commits. A forma manual de encontrar o culpado é ir recuando e experimentando — e são duzentas tentativas no pior caso. O git bisect faz uma busca binária pelo histórico: com duzentos commits, encontra-o em oito tentativas. 1. À m…
Ler o artigo→Durante vinte e cinco anos, o sort() e o reverse() alteraram o array em que eram chamados. É a origem de uma classe inteira de bugs: uma função recebe uma lista, ordena-a para mostrar, e devolve-a alterada a quem a emprestou. O ECMAScript 2023 acrescentou quatro métodos que fazem o mesmo sem tocar n…
Ler o artigo→Toda a gente sabe que deve fazer cópias de segurança. O que se descobre tarde é que uma cópia por restaurar não é uma cópia — é uma esperança . 1. A regra 3-2-1 3 cópias dos dados — a original e duas. 2 suportes diferentes — não as duas no mesmo disco, nem as duas na mesma máquina. 1 fora do sítio —…
Ler o artigo→Um ecrã que carrega dados tem três estados possíveis, e quase toda a gente os escreve assim: type Estado = { aCarregar: boolean; dados?: Artigo[]; erro?: string; }; O problema deste tipo é que ele permite coisas impossíveis: aCarregar: true com dados e com erro ao mesmo tempo. Nada no compilador imp…
Ler o artigo→É o problema de desempenho mais comum em qualquer aplicação com base de dados, e o mais difícil de ver a olho nu — porque o código que o causa parece perfeitamente razoável. const artigos = await db.artigos.findMany({ take: 20 }); for (const artigo of artigos) { artigo.autor = await db.autores.findU…
Ler o artigo→O Object.groupBy entrou no JavaScript com o ECMAScript 2024 e resolve uma coisa que toda a gente já escreveu à mão pelo menos uma vez: separar uma lista em grupos, segundo um critério qualquer. O que muda Deixa de ser preciso um reduce com um acumulador e a verificação do costume para o caso de a ch…
Ler o artigo→Acessibilidade tem fama de ser um assunto enorme, com uma norma de centenas de páginas. É verdade — e também é verdade que uma mão-cheia de hábitos apanha a maior parte dos problemas reais de um site normal. 1. HTML com significado É o mais importante, e o mais barato: um <button> já é focável, já r…
Ler o artigo→Uma imagem Docker de uma aplicação Node feita à pressa leva lá dentro o compilador de TypeScript, as ferramentas de teste, o node_modules de desenvolvimento inteiro e o código-fonte. Nada disso corre em produção — mas tudo isso é descarregado a cada deploy, e tudo isso é superfície de ataque. O mult…
Ler o artigo→Uma consulta que respondia em 3 ms com mil linhas passa a demorar 900 ms com duzentas mil. O código não mudou. O que mudou foi a base ter passado do tamanho em que ler tudo era aceitável para o tamanho em que não é. 1. Perguntar ao Postgres o que ele faz EXPLAIN ANALYZE SELECT id, title FROM posts W…
Ler o artigo→Há uma escolha que o TypeScript obrigava a fazer desde sempre: ou se anota o tipo de uma constante — e perde-se tudo o que ela tem de específico — ou não se anota nada, e ninguém verifica se está certa. O satisfies , que chegou no TypeScript 4.9 , acaba com a escolha: verifica o valor contra um tipo…
Ler o artigo→Este código funciona em desenvolvimento e cai em produção: import { readFile } from 'node:fs/promises'; const conteudo = await readFile('registos.csv', 'utf8'); const linhas = conteudo.split('\n'); Com um ficheiro de teste de 2 MB, é instantâneo. Com o ficheiro real de 3 GB, o processo tenta carrega…
Ler o artigo→Quem vem do Webpack e experimenta o Vite pela primeira vez faz sempre a mesma pergunta: como é que o servidor de desenvolvimento está pronto em menos de um segundo, num projeto onde o outro demorava trinta? A resposta não é "é mais rápido a fazer o mesmo". É que faz outra coisa . 1. O Webpack constr…
Ler o artigo→Uma transferência bancária são duas operações: tirar de uma conta e pôr noutra. Se o processo morre entre as duas, o dinheiro desapareceu. É o exemplo de sempre, e explica para que serve uma transação. BEGIN; UPDATE contas SET saldo = saldo - 100 WHERE id = 1; UPDATE contas SET saldo = saldo + 100 W…
Ler o artigo→Está em todas as linhas de dependências de todos os projetos, e é frequentemente lido como decoração. Não é: é um contrato sobre o que pode entrar no seu projeto sem ninguém dar por isso. 1. Os três números 3 . 4 . 2 │ │ └── PATCH: correções, sem mudar comportamento │ └────── MINOR: funcionalidades …
Ler o artigo→Carregar imagens só quando são precisas, animar uma secção quando ela aparece, marcar no menu o capítulo que está a ser lido: são três funcionalidades diferentes com o mesmo problema por baixo — saber o que está visível. A forma antiga era ouvir o evento scroll e medir posições. Corria dezenas de ve…
Ler o artigo→"É preciso escrever testes" é um conselho inútil sem a segunda metade: quais . Escrever os errados custa tempo, dá falsa confiança e trava as alterações que devia proteger. 1. Os três andares Unitários — uma função, sem base de dados nem rede. Milissegundos. É onde se testam as regras: cálculos, val…
Ler o artigo→Duas técnicas para o mesmo problema — um evento que dispara vezes de mais — e que resolvem casos diferentes. Trocá-las dá sempre uma sensação estranha na interface. Debounce: espera que pare . Só executa quando as coisas acalmam. Throttle: executa durante , mas no máximo uma vez a cada X. 1. Debounc…
Ler o artigo→Um formulário de upload é um convite para pôr ficheiros no seu servidor. Vale a pena aceitar com regras. 1. A extensão não prova nada Mudar virus.php para foto.jpg demora um segundo. O que se verifica é o conteúdo : os primeiros bytes de um ficheiro dizem o que ele é. // Assinaturas: os primeiros by…
Ler o artigo→Há um reflexo antigo em JavaScript: precisa de formatar uma data, instala uma biblioteca. Só que o objeto Intl está no browser e no Node há anos, sabe o que é o português europeu, e não pesa um byte no bundle. 1. Datas const data = new Date('2026-04-07T15:30:00'); new Intl.DateTimeFormat('pt-PT').fo…
Ler o artigo→A ligação está lenta, a pessoa carrega em "Pagar", não acontece nada visível, e carrega outra vez. Ou o telemóvel perde a rede a meio e a aplicação repete o pedido sozinha. Em qualquer dos casos, o servidor recebe dois pedidos iguais — e a pergunta é se isso faz duas encomendas. 1. O que a palavra q…
Ler o artigo→