Est-ce que vous avez eu des problèmes à cause de a permissivité de certains langages ?

En voyant les réponses sur mon autre sujet Poor tast coding, je me demande si la permissivité de certains langages crée vraiment des problèmes/crash/bug.

Par exemple, en C++ si une variable est défini comme int, si tu essaies d’y mettre un string, la compilation échoue et tu dois corriger l’erreur.
En Python, tu peux très bien le faire, la console python va l’accepter mais ya 99% de chances que ton programme crash.

Comme il n’y a pas ce contrôle du compilateur, est-ce que vous rencontrez ce type d’erreurs (= des erreurs qui auraient été bloqués par la compilation) ? Est-ce que ça vous pose des problèmes au travail ?

  • Régulièrement
  • Occasionnellement
  • Rarement
  • Jamais (ou genre deux fois en 5ans)

0 votant

Ps: j’utilise Python à la place de bash … donc je passe d’un langage qui accepte tout à un langage qui accepte pratiquement tout

1 « J'aime »

Un langage permissif (js voir VB) permet d’être très flexible … au détriment des protections classiques.

Cette liberté repose le plus souvent sur la capacité du développeur à s’assurer de lui même que les données qu’il manipule sont cohérentes … Le problème survient quand le programmeur n’a pas le recul nécessaire pour s’assurer de cette cohérence. Pour les problèmes posés, ils sont souvent très important. Le gain gagné en productivité est vite perdu quand il nous faut des journées entières pour trouver un bug qui provient d’une variable non ou mal allouées utilisées beaucoup plus en amont de la séquence.

Mais encore une fois, ce n’est pas la liberté offerte par les langages le problème, mais plus le manque du recul d’un développeur à un instant donné. (reprise de code existant, complétion d’une fonctionnalité existante …)

1 « J'aime »

Je rejoins ce que dis @marcSauget. C’est plus un problème de recul que de typage.

Je prends l’exemple de JavaScript et Java, sur mon expérince personnelle.
La majorité des fonctions en js sont assez courtes (<10 lignes) et chaque variable utilisée une seule fois (et avec ES6, on les défini comme const). Du coup, on n’a pas ce problème, car on simplifie le code par sa structure.
Pour Java, à chaque projet que j’ai vu, la première chose qu’on essaye de faire, c’est de contourner le compilateur (reflection, annotations, configuration via XML, etc.). Et souvent, j’ai eu des erreurs runtime à cause de ça.
Donc, ce n’est pas le langage qui fait le problème, mais bien l’utilisation de celui-ci.

Cependant, en JS, j’ai eu souvent des problèmes quand je souhaitais additionner deux nombres, stockés dans des variables string (récupérées via un node.getAttribute, localStorage.getItem, etc.).

Le compilateur peut éviter des erreurs, mais ne corrige pas les erreurs algorithmiques et structuration.

Par contre, je cherche à me tourner vers des langages où lorsque je compile, les chances que des erreurs existent sont très faibles. ;)

Je pense qu’il y a une vraie incompréhension concernant ce sujet du typage. Je vais essayer de clarifier un peu tout ça :

  • Typage static fort : Java, Go, …etc. On doit déclarer un type et s’y tenir.
  • Typage dynamique fort : Python, Ruby, …etc. On n’est pas obligé de déclarer un type mais on ne peut pas faire n’importe quoi non plus comme par exemple addition un string et un int.
  • Typage dynamique faible : PHP, Javascript, …etc. On n’est pas obligé de déclarer un type et en plus on peut faire n’importe quoi : additionner des carottes et des patates et à la fin tu as une ratatouille en guise de code.

La situation en Python et en PHP a tendance à changer car maintenant on peut ajouter des annotations pour indiquer le typage des paramètres d’entrée/sortie des fonctions… ce qui génère des warnings/erreurs si on les transgresse.

Après certains compilateurs sont plus exigeant que ça, si je prends l’exemple de Go que je connais (ou commence à connaitre), il déclenche des erreurs à la compilation en cas de déclaration d’une variable non utilisée, déclaration d’une variable dans un bloc if/else et utilisation de celle-ci en dehors de ce bloc, mauvais formatage du code, …etc.

1 « J'aime »

Merci pour l’explication, mais je pense qu’il y a une vraie incompréhension concernant ce sujet de la question. Je vais essayer de clarifier un peu tout ça :

Si en PHP, je fais:

<?php
if ($i == 1)
  print $i;
else {
  print toto()
?>
<?php
  print "popo";
}
?>

Il manque un point virgule mais ça ne le gênera jamais PHP.
Ensuite si i vaut 1, tout ira bien.
Mais le jour où il devra exécuter toto(), il se rappellera qu’il ne connaît pas toto().

Dans ce cas, c’est l’absence du compilateur le problème. Mais ne connaissant pas tout les langages, je ne sais pas si d’autre langages non-compilé laissera ça passer.

1 « J'aime »

Concernant ton exemple : python et ruby réagissent comme en PHP.

Cependant, je pense qu’il ne faut pas tomber de le piège de croire qu’avec un langage compilé tu peux te passer de l’écriture de tests.

De plus, avec un éditeur bien configuré et le linter qui va bien, tu as directement une notification affichée pour signaler cette erreur en live… un peu comme le ferait un compilateur.

1 « J'aime »

Me concernant (je dev en Ruby), je n’ai quasiment jamais de problème avec le typage dynamique quand il s’agit de traiter, par exemple, des strings et des ints. Par contre, je me fais souvent avoir par des valeurs null que je n’avais pas anticipé.

Les langages avec un typage statique + inférence façon Crystal me font de l’œil, car ils forcent la prise en compte des null tout en donnant une sensation de typage dynamique fort. Un article sur le sujet : http://patshaughnessy.net/2016/10/7/need-a-second-opinion-on-your-ruby-code-ask-crystal

1 « J'aime »

En PHP j’ai rarement eu le problème.

Par contre j’ai eu énormément de problèmes en JS lorsque je faisais de la maintenance de vieux projets codés avec les pieds : asynchronicité qui ne tient pas compte de l’existence d’une variable, transtypage sauvage de variables non sécurisées/validées, c’est encore pire quand c’est 100% jQuery, ou que c’est une appli complète sous ExtJS par exemple.

Mais vu que je ne développe qu’en PHP, que j’essaye de rendre mes projets les plus “récents” possibles (typehint scalaire avec PHP7, ça permet de rendre plus strict le type des arguments d’une méthode/fonction, et on peut aussi forcer le type de retour d’une méthode/fonction), je n’ai pas si souvent que ça le problème en réalité.

Human Coders - Le centre de formation recommandé par les développeur·se·s pour les développeur·se·s