Tout ce qu'on ne vous a jamais dit sur Python
Pourquoi ce texte?
- Je suis développeur Python à temps plein depuis plus d'un an et demi.
Je travaille sur un gros projet d'environ 200000 de lignes de code.
Cette expérience m'a permis d'acquérir certaines connaissances très
intéressantes à faire partager. J'ai été très surpris que ces
informations ne soient pas trouvables sur le net. Je
pense que c'est parce qu'il n'a presqu'aucun gros projet en Python à
part Zope.
- Vous allez voir qu'avec Python, tout n'est pas aussi rose qu'on le dit
avec les gros projets.
Génie logiciellement parlant
- Le typage latent est souvent cité comme une caractéristique
importante car il permettrait de gagner du temps de
développement (pas de variables à déclarer). Cette affirmation
est relativement vraie pour les petits
projets. En revanche dans les gros projets, ce typage latent amène
pas mal d'ennuis. Vous pouvez faire des changements très
rapidement mais vous ne vous rendez pas compte que vous avez
peut-être cassé une grande partie du code. Avec un langage
compilé, vous auriez eu des erreurs de compilation. A ce moment,
le fanatique Python va vous parler de tests unitaires. Le problème
c'est que sur les gros projets, c'est très difficile de tout
tester, car on perd beaucoup de temps. Au moins avec la
compilation, on a une vérification systèmatique. Cela évite les
erreurs bêtes qui jalonnent la vie du développeur Python: variables
non importées, modules non importés, ...
- Les techniques de conception objet et de développement dans
les langages à typage latent sont très différentes des méthodes
enseignées dans les filières acadèmiques commme les facs, les
universités. Je pense notamment au design pattern utilisant les
méta-classes, aux différences entre une conception objet dans un
langage compilé et une dans un langage typé dynamiquement.
Si vous êtes interessés, vous pouvez apprendre
rapidement grâce à certain documents sur le net et sur les
blogs
des développeurs Python. Par contre, si vous n'êtes pas motivé,
vous allez produire du mauvais code: lent et difficile à
maintenir. Ceci pose un problème dans les entreprises où les
gens ne sont pas tous motivés. Un bel exemple de code
catastrophique est analysé sur ce
site.
-
Les faibles performances de Python (voir après) améne certains
développeurs à déconseiller d'utiliser des accesseurs et suggère
plutôt des variables publiques ou des property. Mal compris par certains
programmeurs, cela amène à faire du code totalement inmaintenable.
- Il n'y a aucun moyen d'interdire la création d'attributs au
vol. Cela peut empêcher de voir que le code a été cassé ou
fonctionne d'une manière non prévue..
L'utilisation de
__slots__ dans ce but est déconseillé par la documentation
officielle de Python. Le but de __slots__ restant l'optimisation du
code.
-
Les bindings Python autour des grosses librairies sont souvent
mal documentés. Pour comprendre comment programmer efficacement,
vous êtes souvent obliger de lire le source du binding. De plus ce
mécanisme de binding pose un souci en cas de plantage. Il est très
difficile de savoir si le bug vient du binding ou de la librairie
elle-même. Par exemple, les bindings pour accéder à la base de
données PostgreSQL sont de qualité
très inégales. Et il est impossible de déterminer la qualité sans
lire les sources.
Performance
- Le GIL
empêche de faire du code Python vraiment
multi-thread. Toutes les technologies basées sur le multi-thread
deviennent moins performante sur Python (ex: CORBA). La
suppression du GIL est un sujet hautement polémique. De plus en
plus de développeurs ne comprennent pas cette limitation. Pourtant
les développeurs de python répondent à chaque fois que c'est très
délicat. Pour faire
court, je pense que ce n'est pas prêt d'arriver. Cela nécessiterai
de changer l'API binaire C de python (voir
blog du créateur de Python). Il faudrai donc réécrire
l'interpréteur plus tout les bindings si l'on veut tirer partie du
multithread. Sans parler qu'il va falloir maintenir deux versions
de l'interprêteur Python. Le problème étant que faire tourner
l'interprêteur multi-threadé sur un machine avec un seul coeur
entraine une sérieuse baisse de performance. Je ne suis pas sur
que la communauté Python ait suffisament de ressources pour
coder tout ça. Utiliser un interprêteur comme Jython n'est pas une solution car il
est un peu en retard sur l'interprêteur Python normal (ils en sont
à la version 2.2) et les
traditionnels bindings en C ne sont plus disponibles.
- De nombreuses fonctionnalités comme les property ou la
personnalisation des méthodes d'accès aux attributs pénalise très
fortement les performances. En effet lorsque vous écrivez a.b.c,
vous ne vous rendez pas compte que vous exécuter pas mal de code
Python. Dans un langage compilé, l'adresse aurez été résolu lors
de la compilation et le temps d'accès serait négligeable. De plus
les langages compilés mettent en place des techniques
d'optimisation du code pour placer les données en mémoire de
manière à optimiser les effets de cache processeur. C'est
complètement impossible avec les langages typés dynamiquement.
- Python est un langage encore très jeune et les versions se
succèdent très rapidement. En conséquence, cela obligue à
maintenir son code car certaines fonctionnalités ne sont plus
supportées. Continuer de développer avec de vieilles versions
de Python est une solution délicate, car de nombreux bindings
ne sont plus vraiment maintenus. Dans les gros projets, il arrive très souvent de
tomber sur des formes lourdes voire complètement déconseillées. Mais cela est du
qu'à l'époque il n'y avait pas d'autres possibilités d'écriture.
Au moins avec le C, la dernière norme date de 1999. Et encore,
beaucoup de gens continue à utiliser d'anciennes normes. Le
passage à Python3 est si délicat que beaucoup de projets pense
qu'ils ne migreront pas. Cette version a beaucoup divisée car
certaines redoute qu'un fracture se créée dans la communauté.
Le mot de la fin
- Python est un très bon langage pour ceux qui aime bidouiller du code et
apprendre de nouveaux langages. Il existe pas mal de projets écrit en
Python (Meld par exemple )
et ceux-ci fonctionnent très bien.
- Néanmoins, Python n'a rien inventé, il est juste basé sur des
compromis très différents des langages populaires (C, Java, ...).
Compromis très avantageux pour les petits projets. Mais au vu de
certaines demandes comme de retirer le GIL, on voit que Python est
utilisé pour des projets pour lesquels il n'est pas vraiment
efficace.
- Selon moi, le principal problème réside dans la trop faible maturité de
Python. Les écueils potentiels étant encore très mal connus.