Il y a beaucoup d'opinions fortes autour du débat mais évidemment ce n'est pas une question d'opinion, c'est une question de faits . Donc , nous devrions envisager la recherche empirique . Et la preuve en est claire:
Oui , le typage statique en vaut la peine - et pas seulement un peu, mais de manière substantielle . En fait, des preuves solides montrent que le typage statique peut réduire le nombre de bogues dans le code d'au moins 15% (et il s'agit d'une estimation basse, le pourcentage réel est presque certainement supérieur). C'est un nombre choquant : je pense que même la plupart des partisans du typage statique n'auraient pas pensé que cela faisait une différence aussi radicale.
Considérez ceci: si quelqu'un vous disait qu'il y avait un moyen simple de réduire les bugs de votre projet de 15% du jour au lendemain, cela devrait être une évidence. 1 C’est presque la solution miracle.
La preuve est présentée dans le document Taper ou ne pas taper: Quantifier les bogues détectables en JavaScript par Zheng Gao, Christian Bird et Earl T. Barr. J'encourage tout le monde à le lire, c'est un article bien écrit qui présente une recherche exemplaire.
Il est difficile de résumer succinctement la rigueur avec laquelle les auteurs ont effectué leur analyse, mais voici un aperçu (très approximatif):
TypeScript et Flow sont deux langages de programmation basés sur JavaScript qui, tout en restant compatibles, ajoutent des conseils de type et une vérification de type statique. Cela permet d'augmenter le code existant par types, puis de le vérifier.
Les chercheurs ont collecté des projets Open Source écrits en JavaScript à partir de GitHub, ont examiné les rapports de bogues résolus et ont tenté de réduire chacun des bogues signalés à un morceau de code qui serait intercepté par le vérificateur de type statique de TypeScript ou Flow. Cela leur a permis d'estimer qu'une limite inférieure du pourcentage de bogues pourrait être corrigée en utilisant un typage statique.
Les chercheurs ont pris des précautions strictes pour que leur analyse ne considère pas un bogue lié à un type comme étant lié à un type. 2
Par rapport aux études antérieures, cette nouvelle étude présente des atouts particuliers:
- Il existe une comparaison directe entre le typage statique et le typage dynamique, avec peu (le cas échéant) de facteurs de confusion, car la seule différence entre JavaScript et TypeScript / Flow est le typage.
- Ils effectuent la réplication sur plusieurs dimensions en vérifiant à la fois TypeScript et Flow (c.-à-d. Différents systèmes de types) et en demandant à différentes personnes de reproduire l'annotation de type (manuelle) pour corriger les bogues. Et ils le font sur un grand nombre de bases de code issues de différents projets.
- Le document mesure l'impact direct du typage statique sur les bogues corrigables (plutôt que sur une qualité plus vague).
- Les auteurs définissent un modèle rigoureux de ce qu'il faut mesurer, et comment, dès le départ. De plus, leur description est incroyablement claire et facilite l’analyse des défauts (c’est toujours bon quand un document de recherche s’ouvre aux attaques: si aucune attaque ne parvient à entamer ses arguments, elle en sortira encore plus forte). 3
- Ils effectuent une analyse de puissance appropriée afin que la taille de leur échantillon soit suffisante, et leur analyse statistique ultérieure est étanche.
- Ils sont trop conservateurs pour exclure les explications confuses et ne mesurent qu’une seule pièce mobile. En outre, ils limitent leur analyse aux bogues immédiatement réparables en incluant des types et excluent tout ce qui peut nécessiter un refactoring plus avancé pour tenir compte de la frappe. Donc, en réalité, l'effet est vraisemblablement beaucoup plus important, mais certainement pas inférieur à ce qu'ils ont rapporté.
- Et finalement, ils ne trouvent pas un léger effet, mais une différence stupéfiante . Malgré leur procédure trop conservatrice, même au bas de l'intervalle de confiance de 95%, ils s'aperçoivent qu'au moins 10% des bogues disparaîtraient simplement avec un minimum de vérifications de type.
À moins d’un défaut fondamental dans le document que personne n’a encore découvert, le document présente de manière concluante un avantage considérable du typage statique, et ce, à peu de frais. 4
Sur le plan historique, la recherche sur les disciplines de dactylographie dans la programmation a connu des débuts difficiles, car pendant longtemps, les preuves n’étaient pas claires du tout. La raison en est qu’il n’est pas facile de faire des expériences systématiques pour examiner l’effet du typage statique par rapport au typage dynamique: une expérience systématique doit isoler l’effet recherché. Et malheureusement, nous ne pouvons pas isoler l’effet de la discipline de frappe, car elle est liée aux langages de programmation.
Il existait en fait des langages de programmation autorisant à la fois le typage statique et dynamique dans différents dialectes (par exemple, VB avec Option Strict
On
ou Off
, ou le type Lisp statique). Cependant, ceux-ci n'étaient pas bien adaptés à une comparaison directe, surtout parce qu'il n'existait aucune base de code suffisamment grande pour permettre une comparaison directe. Au mieux, nous pourrions les comparer dans des «paramètres de laboratoire», où les sujets de test résolvent une tâche de manière aléatoire dans la variante typée statiquement ou dynamiquement du langage.
Malheureusement, ces tâches de programmation artificielles ne modélisent pas bien l’utilisation dans le monde réel. En particulier, beaucoup d’entre eux ont une petite portée et résolvent un problème bien défini qui peut être résumé sur une demi-page de texte.
Heureusement, c'est du passé, parce que TypeScript, Flow et JavaScript sont les mêmes langages, à l'exception du typage statique, et qu'il existe un vaste ensemble de données de code et de bogues réels dans lesquels échantillonner.
1 Inspiré par une citation du document original.
2 Je ne suis pas entièrement satisfait de cela: l'un des principaux atouts des langages à typage statique est que les problèmes apparemment apparentés au type peuvent être formulés de manière à pouvoir être contrôlés statiquement. Cela transforme de nombreuses erreurs de logique en erreurs de type, ce qui augmente considérablement le nombre de bogues pouvant être détectés par le typage statique. En fait, le document classe grossièrement les bogues non liés au type et je soutiens qu’un grand pourcentage d’entre eux pourrait en fait être attrapé par le typage statique.
3 J'invite n'importe qui, en particulier les partisans du typage dynamique, à rechercher des failles non résolues dans l'analyse. Je ne pense pas qu'il y en ait beaucoup (le cas échéant) et je suis convaincu qu'aucun défaut éventuel ne modifierait de manière significative le résultat.
4 Je soupçonne que le coût réel du typage statique dans les projets réels de grande envergure est inexistant, car il devient alors une partie naturelle de l’architecture et pourrait même simplifier la planification. La correction des erreurs de type statique prend du temps, mais beaucoup moins que les erreurs découvertes ultérieurement. Cela a fait l'objet de nombreuses études empiriques et connues depuis des décennies (voir par exemple Code Complete ).