Há muitas opiniões fortes em torno do debate, mas obviamente isso não é realmente uma questão de opinião, é uma questão de fatos . Portanto , devemos olhar para a pesquisa empírica . E a evidência disso é clara:
Sim , a digitação estática vale a pena - e não apenas um pouco, mas de fato substancialmente . De fato, evidências sólidas mostram que a digitação estática pode reduzir o número de bugs no código em pelo menos 15% (e essa é uma estimativa baixa, a porcentagem real é quase certamente maior). Esse é um número surpreendentemente alto : acho que mesmo a maioria dos defensores da tipagem estática não pensaria que isso fazia uma diferença tão drástica.
Considere o seguinte: se alguém lhe dissesse que havia uma maneira simples de reduzir os bugs em seu projeto em 15% da noite para o dia, isso seria um acéfalo. 1 É quase a bala de prata proverbial.
As evidências são apresentadas no artigo Para digitar ou não digitar: quantificando erros detectáveis em JavaScript por Zheng Gao, Christian Bird e Earl T. Barr. Encorajo todos a lerem, é um artigo bem escrito que apresenta pesquisa exemplar.
É difícil resumir sucintamente o quão rigorosamente os autores realizaram sua análise, mas aqui está um esboço (muito aproximado):
TypeScript e Flow são duas linguagens de programação baseadas em JavaScript que, embora permaneçam compatíveis, adicionam dicas de tipo e verificação de tipo estático. Isso permite aumentar o código existente por tipos e depois digitá-lo.
Os pesquisadores coletaram projetos de código aberto escritos em JavaScript no GitHub, analisaram os relatórios de bugs resolvidos e tentaram reduzir cada um dos bugs relatados para um pedaço de código que seria capturado pelo verificador de tipo estático do TypeScript ou Flow. Isso permitiu que eles estimassem que um limite inferior da porcentagem de bugs poderia ser corrigido usando a digitação estática.
Os pesquisadores tomaram precauções rigorosas para garantir que suas análises não considerassem um bug não relacionado ao tipo como sendo relacionado aos tipos. 2
Comparado a estudos anteriores, este novo estudo tem pontos fortes:
- Há uma comparação direta entre a digitação estática e a digitação dinâmica, com poucos (se houver) fatores de confusão, pois a única diferença entre JavaScript e TypeScript / Flow é a digitação.
- Eles executam a replicação em várias dimensões, verificando o TypeScript e o Flow (ou seja, sistemas de tipos diferentes) e fazendo com que pessoas diferentes reproduzam a anotação de tipo (manual) para corrigir os erros. E eles fazem isso em um grande número de bases de código de diferentes projetos.
- O artigo mede o impacto direto da digitação estática em bugs corrigíveis (em vez de uma qualidade mais vaga).
- Os autores definem um modelo rigoroso do que medir e como, antecipadamente. Além disso, sua descrição é incrivelmente clara e facilita a análise de falhas (sempre é bom quando um trabalho de pesquisa se abre para ataques: se nenhum ataque consegue minar seus argumentos, ele fica ainda mais forte). 3
- Eles realizam uma análise de potência adequada para que o tamanho da amostra seja suficiente e a análise estatística subsequente seja hermética.
- Eles são excessivamente conservadores para excluir explicações confusas e medem apenas uma única parte móvel. Além disso, eles restringem sua análise a erros corrigidos imediatamente pela inclusão de tipos e excluem qualquer coisa que possa exigir refatoração mais avançada para acomodar a digitação. Então, na realidade, o efeito é plausivelmente muito maior, mas certamente não menor do que o que eles relataram.
- E, finalmente, eles não encontram um efeito leve, mas uma diferença impressionante . Apesar de seu procedimento excessivamente conservador, mesmo no nível mais baixo do intervalo de confiança de 95%, eles descobrem que há pelo menos 10% de erros que simplesmente desapareceriam com o mínimo de verificação de tipo adicionado.
A menos que exista uma falha fundamental no artigo que ninguém ainda tenha descoberto, o artigo mostra conclusivamente um grande benefício da digitação estática, quase sem nenhum custo. 4
Em uma nota histórica, a pesquisa sobre a digitação de disciplinas em programação teve um início difícil, porque, por um longo tempo, as evidências não eram claras. A razão para isso é que não é fácil realizar experimentos sistemáticos para examinar o efeito da tipagem estática versus dinâmica: um experimento sistemático deve isolar o efeito que estamos investigando. E, infelizmente, não podemos isolar o efeito da disciplina de digitação, pois ela está ligada às linguagens de programação.
Na verdade, havia linguagens de programação que permitiam digitar estática e dinâmica em diferentes dialetos (por exemplo, VB com Option Strict
On
ou Off
, ou Lisp tipicamente estatístico). No entanto, eles não eram adequados para uma comparação direta, o mais importante porque não havia bases de código suficientemente grandes e existentes que permitissem comparação direta. Na melhor das hipóteses, poderíamos compará-los em "ambientes de laboratório", onde os participantes do teste resolvem aleatoriamente uma tarefa na variante do idioma com estatica ou dinâmica.
Infelizmente, essas atribuições de programação artificial não modelam bem o uso no mundo real. Em particular, muitos deles têm escopo pequeno e resolvem um problema bem definido que pode ser resumido em meia página de texto.
Felizmente isso aconteceu no passado, porque TypeScript, Flow e JavaScript são realmente as mesmas linguagens, exceto para a digitação estática, e porque há um extenso conjunto de dados do mundo real de código e bugs para amostragem.
1 Inspirado por uma citação do papel original.
2 Não estou inteiramente satisfeito com isso: um dos principais pontos fortes das linguagens estaticamente tipadas é que problemas ostensivamente não relacionados ao tipo podem ser expressos de maneiras que podem ser verificadas estaticamente. Isso transforma muitos erros lógicos em erros de tipo, o que aumenta drasticamente a taxa de erros que podem ser detectados pela digitação estática. De fato, o artigo classifica aproximadamente bugs não relacionados a tipos e eu afirmo que uma grande porcentagem deles pode de fato ser capturada pela digitação estática.
3 Convido qualquer pessoa, especialmente os defensores da tipagem dinâmica, a tentar encontrar falhas não corrigidas na análise. Não acho que haja muitos (se houver), e estou confiante de que nenhuma falha em potencial alteraria materialmente o resultado.
4 Suspeito que o custo real da digitação estática em projetos reais de grande escala seja inexistente, pois ele se torna uma parte natural da arquitetura e pode até simplificar o planejamento. A correção de erros do tipo estático leva tempo, mas muito menos que os erros descobertos posteriormente. Isso foi extensivamente estudado empiricamente e é conhecido há décadas (ver, por exemplo, Código Completo ).