Por que prefiro reStructuredText a Markdown

2025-08-18
Por que prefiro reStructuredText a Markdown

Este artigo explica por que o autor prefere reStructuredText (rST) a Markdown para escrever livros técnicos. O rST, sendo uma representação de peso médio de uma árvore de documentação abstrata, oferece extensibilidade e personalização superiores em comparação com a abordagem leve do Markdown. O autor ilustra isso com exemplos de criação de imagens e tratamento de exercícios, mostrando como as diretivas personalizadas e as transformações de árvore de documentos do rST permitem estruturas de documentos complexas e funcionalidades difíceis de alcançar no Markdown. Embora reconheça a sintaxe potencialmente menos intuitiva do rST, o autor defende sua potência para documentação em larga escala, especialmente quando são necessárias extensões e transformações personalizadas, como demonstrado em seu livro, "Lógica para Programadores."

Leia mais
Desenvolvimento Escrita Técnica

A Explosão de Runtimes JavaScript: Uma Década de Inovação

2025-07-28
A Explosão de Runtimes JavaScript: Uma Década de Inovação

A última década testemunhou uma explosão de novos runtimes e engines JavaScript, permitindo a execução de JavaScript em diversos contextos com otimização específica para cada tarefa. Isso impulsionou o JavaScript para a nuvem, computação de borda, smart TVs, dispositivos móveis e até mesmo microcontroladores. Este artigo explora os fatores que impulsionaram essa diversidade e por que um único runtime ou engine não atende a todas as necessidades. Da ascensão da computação de borda e engines de baixo recurso para microcontroladores a engines poliglotas que facilitam a interoperabilidade com outras linguagens e o uso generalizado no desenvolvimento de aplicativos nativos, os runtimes JavaScript demonstram incrível adaptabilidade e crescimento vibrante. O artigo detalha vários runtimes e engines como Node.js, Deno, Cloudflare Workers, Bun, React Native, NativeScript e mais, descrevendo suas tecnologias subjacentes e evolução.

Leia mais
Desenvolvimento

Cache: Abstração, não otimização

2025-07-04
Cache: Abstração, não otimização

A sabedoria convencional diz que o cache acelera o software. O autor argumenta que isso é apenas parte da história. Após trabalhar com a movimentação de dados entre armazenamento de objetos, disco e memória, o autor propõe que o papel mais crucial do cache é simplificar o software. O artigo explora as limitações de algoritmos de cache pré-definidos (LRU, LFU, etc.) e sugere que o cache atua mais como uma camada de abstração, ocultando os detalhes de armazenamento subjacentes, liberando os programadores da preocupação com a localização do nível de dados. Os mecanismos de cache de banco de dados e SO exemplificam essa abstração. Embora o cache possa apresentar problemas, como o uso indevido do cache de páginas do SO e fsync, isso não significa que se deva abandonar o cache, mas sim entendê-lo e usá-lo melhor.

Leia mais
Desenvolvimento

A Epidemia da Solidão: Um Chamado para Sair de Casa

2025-06-29
A Epidemia da Solidão: Um Chamado para Sair de Casa

Este artigo aborda a questão generalizada da solidão na sociedade moderna, argumentando que sair de casa é crucial para combatê-la. O autor usa sua experiência com um cachorro e o engajamento comunitário em um parque de cães como um exemplo principal de construção de conexões. Ele destaca a importância da infraestrutura urbana, como calçadas, no fomento da comunidade. A peça critica o capitalismo tardio por lucrar e exacerbar a solidão, incentivando os leitores a participar ativamente da vida comunitária e experimentar a conexão humana.

Leia mais
Diversos

Resolvendo o Problema das Rainhas do LinkedIn com SMT: Mais Fácil que SAT!

2025-06-12
Resolvendo o Problema das Rainhas do LinkedIn com SMT: Mais Fácil que SAT!

Este artigo descreve como resolver o quebra-cabeça das 'Rainhas do LinkedIn' — uma variação do clássico problema das N-Rainhas com restrições regionais adicionais — usando o resolvedor SMT Z3. O autor demonstra que expressar o problema em SMT, utilizando variáveis ​​inteiras e restrições, é significativamente mais simples do que a formulação SAT equivalente, que requer muitas cláusulas booleanas. Embora os resolvedores SMT possam ser mais lentos do que os resolvedores SAT altamente otimizados como o Glucose, a facilidade de codificação torna o SMT preferível para muitos. A postagem inclui código completo e verificações de sanidade úteis para verificar a correção do modelo. Isso fornece uma explicação convincente para a preferência da indústria por ferramentas que compilam para SAT em vez de usar SAT diretamente.

Leia mais
Desenvolvimento resolvedor SMT

Indecidibilidade: A Caixa de Pandora dos Programadores

2025-05-28
Indecidibilidade: A Caixa de Pandora dos Programadores

Este artigo explica de forma clara o conceito de "indecidibilidade" na ciência da computação. Usando linguagem acessível e exemplos concretos (como determinar se um número é a soma de dois números primos), o autor explica os problemas de decisão e o papel das máquinas de Turing. A principal conclusão é que a indecidibilidade não significa que seja impossível dizer se um programa irá parar, mas sim que não existe um algoritmo universal para determinar o comportamento de parada de todos os programas. Isso torna muitos problemas (como verificar propriedades de programas) trabalhosos e possivelmente insolúveis, destacando a necessidade de campos como verificação formal e análise de programas.

Leia mais
Desenvolvimento máquina de Turing

Testes baseados em propriedades: Por que superam os testes unitários para entradas complexas

2025-05-21
Testes baseados em propriedades: Por que superam os testes unitários para entradas complexas

Este artigo debate os méritos dos testes baseados em propriedades (PBT) versus testes unitários tradicionais. O autor argumenta que, embora os testes unitários sejam suficientes para funções com entradas únicas, a explosão combinatória de casos de borda em funções com várias entradas torna o PBT, com sua geração de entrada aleatória, superior na descoberta de erros de borda ocultos. No entanto, o PBT tem uma curva de aprendizado; dominar estratégias complexas de geração de entrada é crucial. A maioria dos exemplos de PBT são muito simplistas para mostrar seu verdadeiro poder no tratamento de espaços de entrada complexos.

Leia mais

A Aposta do Serviço Postal dos EUA no E-mail: A Ascensão e Queda do E-COM

2025-05-14
A Aposta do Serviço Postal dos EUA no E-mail: A Ascensão e Queda do E-COM

Diante da ameaça do email, o Serviço Postal dos EUA lançou o E-COM em 1982, um serviço que imprimia emails e os entregava por meio de carteiros. Inicialmente bem-sucedido, o E-COM acabou falhando em 1985 devido a custos elevados, processos trabalhosos e falta de flexibilidade, resultando em perdas superiores a US$ 40 milhões. No entanto, o E-COM popularizou inadvertidamente o termo "email" e destacou as tentativas do serviço postal de se adaptar às mudanças tecnológicas.

Leia mais
Tecnologia

Segurança alimentar na América: Uma batalha contra mentiras e história

2025-04-30
Segurança alimentar na América: Uma batalha contra mentiras e história

Este artigo entrevista a jornalista científica Deborah Blum, explorando o estado atual e a história da segurança alimentar nos EUA. Blum destaca que, em meio à proliferação de desinformação e à desregulamentação governamental, os cidadãos americanos enfrentam riscos à segurança alimentar, com problemas semelhantes à adulteração de alimentos do século XIX ressurgindo. Ela usa seu livro, "The Poison Squad", para ilustrar o nascimento da Lei de Alimentos e Medicamentos Puros de 1906 e como o químico Harvey Wiley expôs problemas de segurança alimentar por meio de um experimento com uma 'esquadra de veneno'. Blum pede atenção pública para a segurança alimentar e critica a abordagem individualista que culpa os consumidores por doenças transmitidas por alimentos, enfatizando a responsabilidade do governo em garantir os direitos básicos.

Leia mais

Mudanças de requisitos até que parem: Métodos formais e evolução do sistema

2025-04-28
Mudanças de requisitos até que parem: Métodos formais e evolução do sistema

Este artigo explora como lidar com requisitos em constante mudança no desenvolvimento de software. Embora a modelagem formal extensa antecipada possa ser impraticável com mudanças frequentes, o autor argumenta que os métodos formais se tornam cruciais quando os sistemas atingem escala ou passam por mudanças arquitetônicas (transições de fase). A especificação e verificação formais garantem que as melhorias não quebrem a funcionalidade existente. Usando o exemplo da troca de atualizações síncronas para assíncronas, o autor demonstra como os métodos formais podem verificar se um novo sistema satisfaz os requisitos antigos, destacando a importância da manutenção de software e prevenindo a falha silenciosa de recursos.

Leia mais
Desenvolvimento mudança de requisitos

Resolvendo o Quebra-cabeça do Salão Proposicional do Príncipe Azul com Lógica

2025-04-21
Resolvendo o Quebra-cabeça do Salão Proposicional do Príncipe Azul com Lógica

Este artigo detalha como resolver automaticamente um quebra-cabeça lógico do jogo Príncipe Azul usando lógica proposicional. O quebra-cabeça envolve três caixas (azul, branca, preta), cada uma fazendo afirmações, e regras afirmando que pelo menos uma caixa é totalmente verdadeira, pelo menos uma é totalmente falsa e o prêmio está em exatamente uma caixa. O autor modela o problema em lógica proposicional, usa uma abordagem de força bruta para encontrar todas as atribuições satisfatórias e, assim, determina a localização do prêmio. O artigo inclui uma implementação em JavaScript e discute a otimização do código.

Leia mais

AMP for Email do Google: Uma ousada falha

2025-04-18
AMP for Email do Google: Uma ousada falha

O Google tentou revolucionar o email com o AMP (Accelerated Mobile Pages), permitindo experiências interativas como reservar hotéis ou responder a comentários do Google Docs diretamente nos emails. No entanto, esta iniciativa falhou. O artigo analisa as razões por trás da falha do AMP for Email, incluindo a alta complexidade de desenvolvimento, a compatibilidade deficiente e os conflitos com as propriedades inerentes do email. A desconfiança dos desenvolvedores em relação à imposição do Google contribuiu significativamente para sua queda. Embora emails interativos não sejam impossíveis, eles devem priorizar a compatibilidade e a permanência, e não às custas da simplicidade e confiabilidade. O sucesso duradouro do email reside em sua simplicidade e descentralização.

Leia mais
Tecnologia

Além de NP: Um Problema de Complexidade Mais Intuitivo

2025-04-17
Além de NP: Um Problema de Complexidade Mais Intuitivo

O autor questiona o uso do Problema da Parada como o exemplo canônico de um problema mais difícil que NP-completo, argumentando que é confuso e pouco intuitivo. Embora indecidível, a verificação de uma resposta "sim" para o Problema da Parada pode ser feita executando o programa por um número finito de etapas. Uma alternativa mais fácil de entender é apresentada: mover uma peça em uma grade infinita para atingir um ponto alvo. Este problema é PSPACE-completo em dimensões inferiores, mas sua complexidade explode com o aumento das dimensões, eventualmente atingindo a completude de ACKERMANN, demonstrando visualmente uma complexidade muito além dos problemas NP.

Leia mais

Resolvendo um quebra-cabeça de Layton com elegância usando Prolog

2025-04-08
Resolvendo um quebra-cabeça de Layton com elegância usando Prolog

O autor reescreveu o capítulo sobre linguagens de programação lógica em seu livro "Lógica para Programadores", mostrando o poder do Prolog com um quebra-cabeça no estilo 'Layton'. O quebra-cabeça envolve deduzir a pontuação do quarto aluno com base nas pontuações dos três primeiros. Usando um código Prolog conciso (apenas 15 linhas!), o autor resolve elegantemente o problema, aproveitando a correspondência de padrões e a bidirecionalidade do Prolog para encontrar todas as possíveis chaves de resposta, determinando finalmente a pontuação do quarto aluno como 6. Uma comparação é feita com uma solução mais longa e menos eficiente. Embora o autor argumente contra o uso de quebra-cabeças para ensino, este exemplo demonstra o potencial de aplicação prática do Prolog.

Leia mais

É hora de parar de construir bancos de dados KV

2025-03-25
É hora de parar de construir bancos de dados KV

O autor critica os bancos de dados Key-Value por serem excessivamente simplistas e carentes de poder expressivo, tornando-os difíceis de usar. Embora populares entre fornecedores de mecanismos de armazenamento, os bancos de dados KV são meramente blocos de construção para modelos de dados razoáveis, obrigando os usuários a construí-los do zero, muitas vezes com resultados subótimos. O autor propõe um meio-termo: um banco de dados embutido com registros tipados, separando os esquemas lógicos e físicos, mas escrevendo consultas contra o esquema físico. Isso evita planejadores de consultas complexos, suporta alterações de esquema assíncronas e troca de layouts. Essa abordagem equilibra a independência de dados com a simplicidade necessária para sistemas embutidos, oferecendo uma alternativa convincente tanto para lojas KV simples quanto para as complexidades de bancos de dados relacionais completos.

Leia mais
Desenvolvimento

Desenvolvimento Priorizando a Verificação: Além do Desenvolvimento Guiado por Testes

2025-03-18
Desenvolvimento Priorizando a Verificação: Além do Desenvolvimento Guiado por Testes

Este artigo explora o Desenvolvimento Priorizando a Verificação (VFD), um paradigma que enfatiza o estabelecimento de mecanismos de verificação antes de escrever código. Isso pode envolver a escrita de testes, a definição de invariantes de tipo, a adição de contratos ou outros métodos. O VFD difere do Desenvolvimento Guiado por Testes (TDD), que é um caso específico do VFD e se concentra no uso de testes para direcionar o design do código. As vantagens do VFD incluem a redução da probabilidade de pular a verificação, a detecção precoce de erros e a melhoria da qualidade do código. No entanto, o VFD também apresenta desvantagens: pode retardar o desenvolvimento, dificultar a codificação exploratória e os métodos de verificação podem influenciar o design do código. O autor argumenta que o VFD, como uma técnica e não um paradigma, é mais flexível e integra-se facilmente com outras abordagens.

Leia mais
Desenvolvimento verificação prioritária

Cinco Tipos de Não-Determinismo: Insights Práticos de Métodos Formais

2025-02-20
Cinco Tipos de Não-Determinismo: Insights Práticos de Métodos Formais

Este artigo explora cinco tipos de não-determinismo em modelagem de sistemas: aleatoriedade verdadeira, concorrência, entrada do usuário, forças externas e abstração. O autor explica cada tipo claramente com exemplos práticos. A aleatoriedade verdadeira, embora frequentemente simulada com geradores de números pseudoaleatórios, é geralmente tratada como uma escolha não-determinista na modelagem. A concorrência é uma fonte principal de não-determinismo, exigindo tratamento especial devido à explosão do espaço de estados. A entrada do usuário e as forças externas são tratadas como influências externas não-deterministas. Fundamentalmente, a abstração simplifica processos determinísticos complexos em escolhas não-deterministas, simplificando modelos e aumentando a sensibilidade a erros potenciais. Isso fornece insights valiosos para entender o não-determinismo e suas aplicações no desenvolvimento de software.

Leia mais
Desenvolvimento modelagem de software

Eficiência vs. Escalabilidade Horizontal: Um Dilema Necessário?

2025-02-12
Eficiência vs. Escalabilidade Horizontal: Um Dilema Necessário?

Este artigo explora a tensão entre eficiência de software e escalabilidade horizontal. O autor argumenta que softwares otimizados para escalabilidade geralmente têm um desempenho ruim em ambientes de máquina única, e vice-versa. Isso decorre da Lei de Amdahl, sobrecarga de coordenação e limitações em recursos compartilhados. Algoritmos eficientes geralmente dependem de suposições sobre o sistema e o problema que podem não ser mais verdadeiras quando escalados horizontalmente. O autor também discute fatores culturais e tipos de tarefas que influenciam as escolhas, ilustrando com exemplos como o banco de dados Tigerbeetle e o GIL do CPython. Em última análise, uma compreensão profunda do problema e do ambiente é crucial para alcançar alta eficiência e escalabilidade.

Leia mais
Desenvolvimento

A Curiosa História das Âncoras de Expressões Regulares: Por que `$` e `^`?

2025-01-21
A Curiosa História das Âncoras de Expressões Regulares: Por que `$` e `^`?

Este artigo investiga as origens históricas do uso de `$` e `^` como âncoras de linha em expressões regulares. Remontando ao editor de texto QED, `$` inicialmente representava o fim do buffer, posteriormente adaptado por Ken Thompson para significar o fim de uma linha em regexes. A escolha de `^` provavelmente se deveu ao conjunto de caracteres limitado da máquina de escrever Teletype Model 35, com `^` já presente no ASCII-67. Não foi uma escolha de design brilhante, mas sim uma consequência das limitações de hardware e conjunto de caracteres daquela época, tornando-se uma convenção em regexes.

Leia mais
Desenvolvimento

Modelagem Matemática Revela o Quão Ruim é o Jogo de Dreidel

2024-12-18
Modelagem Matemática Revela o Quão Ruim é o Jogo de Dreidel

No ano passado, o autor usou a linguagem de modelagem probabilística PRISM para modelar o jogo tradicional de férias Dreidel, provando sua falta de diversão. Este ano, ele refinou o modelo para simular todo o jogo até sua conclusão. O novo modelo corrige a falha anterior de simular apenas a eliminação do primeiro jogador e melhora a lógica de cálculo para apostas e eliminação de jogadores. Por meio de simulação de modelo, o autor descobriu que, em média, um jogo de quatro jogadores leva 760 rodadas para terminar, e o mais longo pode até exceder 6 horas. Isso prova completamente que o jogo Dreidel é longo, tedioso e frustrante.

Leia mais