Comment le manque de Python de typage statique affectent maintenabilité et dans les grands projets d'extensibilité?

StackOverflow https://stackoverflow.com/questions/3671827

Question

Après avoir lu cette question très instructif (quoique un peu argumentatif) Je voudrais savoir votre expérience avec la programmation de grands projets avec Python. Est-ce que les choses deviennent un gérable que le projet devient plus grand? Cette préoccupation est une chose qui me tient attaché à Java. Je serais donc particulièrement intéressé à informé comparaisons de maintenabilité et de Java et l'extensibilité Python pour les grands projets.

Était-ce utile?

La solution

Je travaille sur un grand produit commercial à grande échelle fait en Python. Je donne une estimation très approximative de 5000 fichiers x 500 lignes chacun. Cela représente environ 2,5 millions de lignes de Python. Rappelez-vous la complexité de ce projet est probablement équivalent à 10 mil + lignes de code dans d'autres langues. Je n'ai pas entendu un seul ingénieur / architecture / gestionnaire qui se plaignent de code Python étant ingérable. D'après ce que j'ai vu de notre bug tracker, je ne vois pas de problème systémique qui pourrait être évité par la vérification de type statique. En fait, il y a très peu de bugs spawn d'une utilisation incorrecte du type d'objet du tout.

Je pense que c'est un très bon sujet académique pour étudier de manière empirique pourquoi le langage à base de classe statique ne semble pas être aussi critique que l'on pourrait penser.

Et à propos de l'extensibilité. Nous venons d'ajouter une base de données 2 au-dessus de la base de données 1 dans notre produit, tous les deux non-SQL. Il n'y a pas de problème lié à la vérification de type. Tout d'abord, nous avons conçu une API suffisamment souple pour anticiper la mise en œuvre sous-jacente différente. Je pense que la langue dynamique est une aide plutôt que obstacle à cet égard. Quand nous sommes allés à tester et de corriger le bogue phrase, nous travaillions sur le genre de personnes travaillant sur des bogues ne importe quelle langue aurait à faire face. Par exemple, les problèmes d'utilisation de la mémoire, cohérence et problèmes d'intégrité référentielle, les problèmes de gestion des erreurs. Je ne vois pas la vérification de type statique ont beaucoup d'aide sur l'un de ces défis. D'autre part, nous avons grandement bénéficié de langage dynamique en étant capable de coder inject mi-vol ou après patcher simple. Et nous sommes en mesure de tester notre hypothèse et de démontrer nos corrections rapidement.

Il est sûr de dire que la plupart de nos ingénieurs sont 100+ heureux et productifs en utilisant Python. Il est probablement impensable pour nous de construire le même produit en utilisant un langage typé statique dans le même laps de temps avec la même qualité.

Autres conseils

D'après mon expérience langues statiquement typé peut être difficile à maintenir. Par exemple permet de dire que vous avez une fonction d'utilité qui accepte une classe personnalisée en tant que paramètre. Si sur la route vous adopter une nouvelle convention de nommage que le nom de cette classe va devoir changer, et alors toutes les fonctions de votre utilitaire doivent changer aussi. Dans une langue comme python, il n'a pas d'importance tant au niveau des outils de classe les mêmes méthodes.

Personnellement, je méprisent une langue qui se trouve sur mon chemin. Vitesse d'exprimer vos idées est la valeur, ce qui est l'avantage Python a plus de Java.

Une grande base de code en python sans une bonne couverture de test pourrait être un problème. Mais c'est juste une partie de l'image. Il est tout au sujet des personnes et des approches appropriées pour faire le travail.

Sans

  • Contrôle source
  • Bug Tracking
  • tests unitaires
  • L'équipe Engagé

peut échouer avec tout type de langage.

Je me souviens des jours avant et après l'innovation de IntelliJ IDEA. Il existe des différences énormes. Avant, le typage statique est seulement pour la compilation, le développement traite essentiellement du code source sous forme de fichiers texte. Après, le code source est une information structurée, de nombreuses tâches de développement sont plus faciles doit, grâce à typage statique.

Cependant, ce n'est pas comme les vieux jours ont été l'enfer vivant. Nous avons pris comme est, faire tout le nécessaire, utiliser les outils disponibles à ce jour, obtenir le système intégré, la satisfaction. Il n'y avait pas trop de mauvais souvenirs. C'est probablement ce que les programmeurs de typage dynamique se sentent maintenant. Il est pas si mal.

Bien sûr, je ne retournerai jamais au bon vieux temps. Si je suis interdit d'utiliser un tel IDE, je suppose que je vais nous donner programmation tous ensemble.

Essayez remonter la source d'un objet apparemment malformé dans un grand cadre typé dynamiquement avec beaucoup de IoC ou d'autres modèles de conception où l'objet ne peut être retracée directement la pile.

Maintenant, essayez de faire cela dans un langage statiquement typé.

A moins que le type de l'objet est documenté près de l'utilisation du site (par exemple via des annotations de type, une bibliothèque de la typesafe de Python) ou quelque part sur la pile, déduisant où il vient peut être pratiquement impossible. Je parle d'expérience, après avoir essayé de pièces de débogage du cadre de BuildBot. Il impliquait une immense quantité de recherche de texte brut dans le cadre, même en utilisant dIDE fantaisie tels que PyDev, Komodo et Wingware.

Je ne doute pas qu'il est possible d'imposer des contraintes de type sur les langages dynamiques, mais l'absence de normalisation sur ce qui semble être un obstacle à toute personne essayant de partie de débogage d'un grand cadre existant.

EDIT: depuis 2014, Guido ajouté PEP484, MyPy et le module de frappe. Cela a fait mon expérience beaucoup, beaucoup mieux en termes de maintien de grands projets.

Dans mon expérience, maintenabilité dépend de couplage faible, une bonne documentation, bon processus de développement, et un excellent test. Le typage statique a très peu à voir avec tout cela.

Les erreurs que Java attraperez au moment de la compilation ne sont qu'une petite partie des erreurs qui peuvent se produire. Ils sont également presque toujours le plus trivial à détecter par des tests; il n'y a aucun moyen que vous pouvez manquer d'appeler une méthode sur un objet de la mauvaise classe si vous testez que votre code produit la bonne réponse! À cet égard on pourrait dire que Python est en fait mieux pour assurer la qualité; par forçant pour tester au moins un peu pour vous assurer que votre code est libre de simples fautes de frappe, il veille à ce que vous avez réellement faire Test au moins un peu.

En fait Java est même pas un très bon exemple d'une langue avec des contrôles statiques de forte pour attraper beaucoup de bugs. Essayez la programmation en Haskell ou Mercury pour voir ce que je veux dire, ou mieux encore essayer la programmation Scala et l'interface avec les bibliothèques Java; la différence de combien « correct » le compilateur est en mesure de garantir pour vous est frappant lorsque vous comparez le code normal Scala idiomatiques en utilisant les bibliothèques Scala au code qui doit traiter avec les bibliothèques Java (je l'ai vraiment fait, puisque le programme I a bit dans Scala sur les applications).

Votre capacité à écrire du bon code maintenable dans les grandes bases de code travaillé par de nombreux développeurs sur de longues périodes de temps, malgré les défauts de détection d'erreur statique Java par rapport aux langues comme Scala, dépend de exactement les mêmes techniques programmeurs Python utilisent pour faire la même chose dans leur grand code-bases, malgré les défauts de détection d'erreur statique Python par rapport à Java.

Je l'ai utilisé Python pour de nombreux projets, de quelques centaines de lignes à plusieurs milliers de lignes. typage dynamique est un grand gain de temps et il fait des concepts OO comme manière polymorphisme plus facile à utiliser. Le système de type ne fait pas les projets inmaintenable. Si vous avez du mal à imaginer que, essayez d'écrire un certain nombre de choses en Python et voir comment ils vont.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top