Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ils veulent 200 millions d'utilisateurs

61 réponses
Avatar
yves
<http://www.linformaticien.com/actualites/id/20619/ubuntu-veut-200-millions-d-utilisateurs-en-2015.aspx>


Je suis resté 8 mois sous Ubuntu ,la je suis passé a Archlinux et j'en
suis tres content

10 réponses

3 4 5 6 7
Avatar
totof01
On 14 mai, 11:34, Alain Ketterlin wrote:
totof01 writes:

La facilité d'implémentation. Une "méthode" n'est pas autre chose q u'une
fonction, et il suffit de replacer o.m(...) par m(o,...). Rien de
subtil, mais pour les développeurs du langage c'est "plus cohérent".



Tu perds par contre en lisibilité : cette façon de procéder te permet
de déclarer une fonction en plein millieu d'une classe, cette fonction
n'ayant rien à voir avec cette classe. On perd ainsi l'un des
avantages qu'est censé avoir Python qui est la lisbilité du code.


-- Alain.
Avatar
Alain Ketterlin
totof01 writes:

On 14 mai, 11:34, Alain Ketterlin wrote:
totof01 writes:



La facilité d'implémentation. Une "méthode" n'est pas aut re chose qu'une
fonction, et il suffit de replacer o.m(...) par m(o,...). Rien de
subtil, mais pour les développeurs du langage c'est "plus cohé rent".



Tu perds par contre en lisibilité : cette façon de procéde r te permet
de déclarer une fonction en plein millieu d'une classe, cette foncti on
n'ayant rien à voir avec cette classe. On perd ainsi l'un des
avantages qu'est censé avoir Python qui est la lisbilité du cod e.



Non, ce que tu dis n'est pas juste.

(De toute façon, ce que j'écrivais plus haut était simplemen t une
réponse à ta question "Pourquoi self ?", mais malheureusement tu cites
mal les passages auxquels tu réponds.)

-- Alain.
Avatar
William
On 16-05-2011, totof01 wrote:
On 14 mai, 11:34, Alain Ketterlin wrote:
totof01 writes:



La facilité d'implémentation. Une "méthode" n'est pas autre chose qu'une
fonction, et il suffit de replacer o.m(...) par m(o,...). Rien de
subtil, mais pour les développeurs du langage c'est "plus cohérent".



Tu perds par contre en lisibilité : cette façon de procéder te permet
de déclarer une fonction en plein millieu d'une classe, cette fonction
n'ayant rien à voir avec cette classe. On perd ainsi l'un des
avantages qu'est censé avoir Python qui est la lisbilité du code.



Le fait de pouvoir créer une fonction en plein milieu d'une classe n'a
pas trop de rapport avec self...

Pourquoi cette fonction n'aurait rien à voir avec cette classe et en
quoi ça ne serait pas lisible ???

--
William Dodé - http://flibuste.net
Informaticien Indépendant
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 16/05/2011 11:37, William a écrit :
C'est le piège, tu considère ne pas avoir à "réaliser de contrôle",
considérant qu'en sachant le type ça te suffit. Hors le type ne signifie
absolument pas que la donnée est celle que tu attends. Par exemple si tu
attends un age, si j'envoie 2035, c'est bien un nombre mais ça n'est
sûrement pas une donnée valide. Donc dans tous les cas il faudra
vérifier d'avantage que le type pour être vraiment rigoureux.



Je suis d'accord avec toi, mais en Java, je n'ai justement pas à
m'occuper du typage, uniquement de la donnée.
Avec ton exemple, en Python, j'aurais l'obligation de d'abord tester si
l'argument est un nombre (sous peine que « < » plante lamentablement)
puis de vérifier s'il est bien inférieur à 150.
En Java, je sais que « < » fonctionnera à coup sûr, étant donné que
l'application a compilé. J'ai donc éliminé 50% des tests nécessaires à
une application robuste.
D'autant plus que pour moi « 0 < age < 150 » est une règle de gestion
métier, alors que « age instanceof Number » est une règle de
développement. Pour moi, il est normal de retrouver la 1ère dans le code
(et même dans la spec), pas la 2nde.

Par exemple

fonction imc(nombre poids, nombre taille)

Si tu inverse les arguments lors d'un refactoring, le compilateur ne
détectera rien, y a pas de miracle.



Là je suis d'accord avec toi.
Mais si je vais dans cette direction
fonction imc(Poids poids, Taille taille)
Java détecterait l'inversion des paramètres, pas Python.

Après, je suis d'accord que ça évitera certaines erreurs, il n'y a pas
de doute la dessus. Mais il n'y a pas de raison de se focaliser
particulièrement sur ces erreurs plus que d'autres.



Pour moi, ce type d'erreur n'est absolument pas anodin.
En méthode Agile, le concept est de refactorer le code à chaque
itération, les méthodes et les API évoluent constamment, quasiment tous
les jours.
S'il y a bien une source d'erreur qu'il faut absolument éviter avec
cette pratique, c'est bien celle-là.

Avec des outils
comme pylint on détecte également énormément d'erreurs, mais je n'irai
pas choisir un langage pour ça, ni accuser un langage de ne pas l'avoir.



Je n'accuse pas Python de ne pas l'avoir, mais j'essaie juste de
comprendre comment font les « vrais » développeurs Python pour éviter ce
genre de problèmes extrèmement courant sur les grosses applications avec
des équipes de plusieurs dizaines de personnes.
Pour avoir tenter, ça a été une catastrophe royale et certains membres
de l'équipe étaient même dédiés à plein temps à remettre d'aplomb les
appels des API après une refacto. Le temps (perdu) de débug a été
collossal comparé à un dev équivalent en Java.

Globalement ce n'est pas du tout ce que j'ai vérifié quand j'ai réécris
toutes mes applis java en python. J'ai considérablement gagné en clarté
de code (diminué au moins de moitié en quantité) et en temps de
maintenance.



Alors tu seras peut-être la bonne personne pour m'éclairer sur la
méthode à appliquer.
Même si je reste sceptique que le portage soit aussi robuste et fiable,
en ayant obligatoirement perdu tout contrôle de typage lors du portage
(sauf à avoir considérablement uglyfié le code…). Surtout pour de la
reprise de code future.
Je ne demande qu'à comprendre =)

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN1kLcAAoJEK8zQvxDY4P9ZRUH/3+26t9l+4Ct16n0nmKoB/3z
5tb1lRcNp/Ps6z1dRfUQLj0iGoIisROvPec6Ec5dDd48Ivevj+Cm2XS+zJWGTadO
snmLLovKLXtZQHVdKnqsGHj9bCbHeDA/+xfZzSAVbTeSmXGaqgl8Ijxie87uj+H4
kXZ61u+UVi9OmEHuZY4ODEUkahc1Gpu7Li8NC+NlptIFlnj4CwrRptaVnuJAhlvq
ldWyJrtP1iQVgvrIRgtrli3bDyKw0IGLQaN+dMf50qZa6B9ZEyNHeO6WCiOu8Qpw
Ws7ZBlZ6Zxm86jc4FYe9eQl6ZnSUJIJ9A+Fn3MpgQA4sfCbOI/q4J5dLMzhnoH8 It
-----END PGP SIGNATURE-----
Avatar
William
On 20-05-2011, Aéris wrote:

Le 16/05/2011 11:37, William a écrit :
C'est le piège, tu considère ne pas avoir à "réaliser de contrôle",
considérant qu'en sachant le type ça te suffit. Hors le type ne signifie
absolument pas que la donnée est celle que tu attends. Par exemple si tu
attends un age, si j'envoie 2035, c'est bien un nombre mais ça n'est
sûrement pas une donnée valide. Donc dans tous les cas il faudra
vérifier d'avantage que le type pour être vraiment rigoureux.



Je suis d'accord avec toi, mais en Java, je n'ai justement pas à
m'occuper du typage, uniquement de la donnée.
Avec ton exemple, en Python, j'aurais l'obligation de d'abord tester si
l'argument est un nombre (sous peine que « < » plante lamentablement)
puis de vérifier s'il est bien inférieur à 150.
En Java, je sais que « < » fonctionnera à coup sûr, étant donné que
l'application a compilé. J'ai donc éliminé 50% des tests nécessaires à
une application robuste.
D'autant plus que pour moi « 0 < age < 150 » est une règle de gestion
métier, alors que « age instanceof Number » est une règle de
développement. Pour moi, il est normal de retrouver la 1ère dans le code
(et même dans la spec), pas la 2nde.



Pourquoi pas la 2nde, ça me semble au contraire plus important et plus
fréquent comme erreur vu que ça englobe aussi les erreurs utilisateurs.

Ce que je veux dire s'est que soit on teste soit on ne teste pas. Si on
ne teste que le type ça ne suffit pas et si on teste la valeur on teste
le type en même temps. Dans le cas d'un test unitaire, peu importe que
ça lève une exception à cause du type ou de la valeur.


Par exemple

fonction imc(nombre poids, nombre taille)

Si tu inverse les arguments lors d'un refactoring, le compilateur ne
détectera rien, y a pas de miracle.



Là je suis d'accord avec toi.
Mais si je vais dans cette direction
fonction imc(Poids poids, Taille taille)
Java détecterait l'inversion des paramètres, pas Python.



En revanche, utiliser un objet Poids là où un simple entier suffirait va
rendre ton code 5x plus long...


Après, je suis d'accord que ça évitera certaines erreurs, il n'y a pas
de doute la dessus. Mais il n'y a pas de raison de se focaliser
particulièrement sur ces erreurs plus que d'autres.



Pour moi, ce type d'erreur n'est absolument pas anodin.
En méthode Agile, le concept est de refactorer le code à chaque
itération, les méthodes et les API évoluent constamment, quasiment tous
les jours.
S'il y a bien une source d'erreur qu'il faut absolument éviter avec
cette pratique, c'est bien celle-là.



Effectivement, si tu refactorise tous les jours ça sera pratique c'est
incontestable. Mais ça ne remplacera pas les tests unitaires qui eux
devraient couvrir aussi ces erreurs.


Avec des outils
comme pylint on détecte également énormément d'erreurs, mais je n'irai
pas choisir un langage pour ça, ni accuser un langage de ne pas l'avoir.



Je n'accuse pas Python de ne pas l'avoir, mais j'essaie juste de
comprendre comment font les « vrais » développeurs Python pour éviter ce
genre de problèmes extrèmement courant sur les grosses applications avec
des équipes de plusieurs dizaines de personnes.
Pour avoir tenter, ça a été une catastrophe royale et certains membres
de l'équipe étaient même dédiés à plein temps à remettre d'aplomb les
appels des API après une refacto. Le temps (perdu) de débug a été
collossal comparé à un dev équivalent en Java.



Je ne sais pas s'il y a des vrais et des faux développeurs ;-)
Ce qui est sûr c'est qu'il faut que la méthode de développement tire
partie du langage sinon c'est du temps perdu. Ca n'a pas du être le cas
dans ton exemple, mais on ne peut pas en faire une généralité.


Globalement ce n'est pas du tout ce que j'ai vérifié quand j'ai réécris
toutes mes applis java en python. J'ai considérablement gagné en clarté
de code (diminué au moins de moitié en quantité) et en temps de
maintenance.



Alors tu seras peut-être la bonne personne pour m'éclairer sur la
méthode à appliquer.



Non car je travaille essentiellement seul (pas bête hein !), je ne suis
donc pas confronté aux mêmes problèmes que toi. Je peux juste observer
que dans des projets libres avec des développeurs venus d'un peu partout
et pas forcément coordonnés il ne me semble pas que ça ce passe plus mal
en python qu'ailleurs. Plutôt mieux, et surtout l'arrivée de nouveaux
développeurs ne connaissant pas le langage au départ se passe très bien,
c'est un signe de facilité de maintenance je trouve.

Même si je reste sceptique que le portage soit aussi robuste et fiable,
en ayant obligatoirement perdu tout contrôle de typage lors du portage
(sauf à avoir considérablement uglyfié le code…). Surtout pour de la
reprise de code future.
Je ne demande qu'à comprendre =)



Au contraire, le code est beaucoup plus clair, c'est essentiellement
pour ça je pense que les applis sont plus fiables et plus faciles
à maintenir. Il y a une étude qui a montré que le nombre de bug était
proportionnel au nombre de lignes quelque soit le langage. C'est bête
mais je le vérifie. Je viens de compter (avec sloccount) une appli que
j'ai réécrite quasiment à l'identique il n'y a pas longtemps, elle est
exactement 2x plus petite qu'en java.

Un autre exemple

mercurial

python: 25691 (93.33%)
ansic: 1820 (6.61%)
xml: 16 (0.06%)

git

ansic: 121808 (47.07%)
sh: 86979 (33.61%)
perl: 23821 (9.21%)
tcl: 20351 (7.86%)
python: 3914 (1.51%)
lisp: 1785 (0.69%)
asm: 98 (0.04%)

Le calcul imc où tu vas utiliser un objet Poids et Taille illustre très
bien le débat. Le programme python va fonctionner parce qu'il va être
extrêmement simple, le programme java va fonctionner parce qu'à défaut
d'être simple il va être vérifié par le compilateur. Ce sont deux
optiques différentes. Je comprend que dans ton cas tu te dis qu'étant
donné qu'il y a énormément de développeurs ça ne sera jamais simple,
donc autant verrouiller, mais ça reste à prouver. Il faudrait demander
à Google, j'ai déjà entendu qu'ils utilisaient java pour des critères de
rapidité (ça sera de moins en moins nécessaire avec pypy), je n'ai
jamais entendu parler du critère de taille de projet ou nombre de
développeur.

Un autre exemple marrant c'est que j'ai eu à réécrire une appli en C qui
devait faire du calcul intensif d'itinéraires mais qui ramait et qui
était illisible. Je devais la réécrire en C ou java mais j'ai commencé
par faire un prototype en Python. Résultat le prototype a tourné
beaucoup plus vite qu'en C et on l'a gardé en python. C'est la facilité
de mise au point qui a permis d'élaborer un meilleur algo ce qui
a compensé très largement la lenteur du langage. Au passage le code est
bien entendu beaucoup plus court, il ne plante pas et il est maintenant
maintenu par quelqu'un qui n'avait jamais fait de python avant !

Comment expliques-tu que les applis en Java sont réputés si lentes alors
que le langage java lui-même est beaucoup plus rapide que python, de
très loin (plus pour très longtemps) ?


--
William Dodé - http://flibuste.net
Informaticien Indépendant
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 20/05/2011 23:09, William a écrit :
Pourquoi pas la 2nde, ça me semble au contraire plus important et plus
fréquent comme erreur vu que ça englobe aussi les erreurs utilisateurs.



Oui et non.
Si on s'en tient aux erreurs utilisateurs, la couche d'accès aux données
s'occupera de filtrer les valeurs aberrantes et renverra de jolis
messages d'erreur. De ce côté là, Python ou Java, c'est équivalent.
Le problème que j'ai rencontré a surtout été côté développement, avec
des développeurs qui se retrouvaient en face d'API dont ils n'avaient
aucune idée de quel type d'argument passer.
Je pense que l'exemple du « X509Certificate.setIssuer(issuer) » est un
très bon exemple. En Python, les développeurs de mon gros projet ont mis
une bonne heure à comprendre que l'issuer devait être un X509Name et non
un X509Certificate, et surtout que cette découverte n'a été possible que
par analyse du code de la librairie X509, la doc se contentant d'un
laminaire « set the issuer of the certificate ».

Ce que je veux dire s'est que soit on teste soit on ne teste pas. Si on
ne teste que le type ça ne suffit pas et si on teste la valeur on teste
le type en même temps. Dans le cas d'un test unitaire, peu importe que
ça lève une exception à cause du type ou de la valeur.



D'accord avec toi.
Et donc je préfère n'avoir que la partie data à vérifier, déléguant la
partie typage au compilateur. Il fera cela bien mieux que moi, avec
l'héritage et l'inférence de type en prime !

En revanche, utiliser un objet Poids là où un simple entier suffirait va
rendre ton code 5x plus long...



C'était juste un exemple =)
Le soucis en Python est que tout argument est permutable sans erreur et
la permutation ne sera visible qu'au runtime.

Effectivement, si tu refactorise tous les jours ça sera pratique c'est
incontestable. Mais ça ne remplacera pas les tests unitaires qui eux
devraient couvrir aussi ces erreurs.



Les méthodes Agile « imposent » de refactorer en continu.
Tout le process de dev est basé sur des itérations qui améliore au fur
et à mesure les fonctionnalités.
Donc oui, je refactore TRÈS souvent !

Et pour les tests U, 85% de couverture de code obligatoire !

Au contraire, le code est beaucoup plus clair, c'est essentiellement
pour ça je pense que les applis sont plus fiables et plus faciles
à maintenir.



Clair et concis, certes, Python est largement devant Java.
Mais le problème est toujours le même pour moi. Le code FINAL est clair,
concis et robuste grâce à des tests U efficaces, mais :
— les tests U sont généralisables à tout langage et tout projet
— le code INTERMEDIAIRE (en cours de dev) a demandé des efforts
surhumains aux développeurs pour en arriver à la version fiable.

Si je reprend l'exemple des certificats X509, le code obtenu a bien
évidemment testé unitairement et est fiable et robuste… sauf que les
devs ont mis une bonne heure à l'écrire…
En Java, j'arriverais au même résultat en quelques minutes, le typage
aidant dès le départ.

Il y a une étude qui a montré que le nombre de bug était
proportionnel au nombre de lignes quelque soit le langage. C'est bête
mais je le vérifie. Je viens de compter (avec sloccount) une appli que
j'ai réécrite quasiment à l'identique il n'y a pas longtemps, elle est
exactement 2x plus petite qu'en java.



Là je suis d'accord aussi.
Mais le soucis est toujours le même : le code Python sera plus court
donc moins buggé, mais aura demandé des efforts considérables pour les
développeurs.

Ce sont deux
optiques différentes. Je comprend que dans ton cas tu te dis qu'étant
donné qu'il y a énormément de développeurs ça ne sera jamais simple,
donc autant verrouiller, mais ça reste à prouver.



Je ne parle pas forcément de grosses équipes.
Déjà à 2 personnes sur du Python, si l'autre n'est pas dispo pour
expliquer son API et ce qu'il attend.
Toujours sur X509, je te met au défi de me faire un certificat X509
valide avec l'API Python
(http://packages.python.org/pyOpenSSL/openssl-x509.html) uniquement avec
la doc et sans aller chercher de tuto et/ou regarder le code de la lib.
Je pense que c'est mission impossible ou alors j'ai raté un épisode dans
le dev Python…
Rien que de racrocher les bons types aux bonnes méthodes Python,
j'aurais fini le même en Java
(http://www.bouncycastle.org/docs/mdocs1.6/index.html)…

Comment expliques-tu que les applis en Java sont réputés si lentes alors
que le langage java lui-même est beaucoup plus rapide que python, de
très loin (plus pour très longtemps) ?



Comme tu le dis, elles ne sont que « réputées » très lentes.
C'était essentiellement vrai il y a quelques années (Java ≤1.3), depuis
Java 1.4 et surtout 5 et 6, Java est quasiment à égalité avec C/C++ (en
moyenne 10% de perfs en moins).

Après en Java, c'est surtout la vitesse de développement qui est un
argument très important.
Le langage en lui-même (generic, enum…), les bonnes pratiques (méthodes
Agile, test U, coverage…), les outils (Maven, Gradle, Sonar, Jenkins,
SCM…) et les architectures (MVC, 3-tiers, IoC, ORM, programmation
aspect…) y sont très en avance sur les autres langages.
Java est un des seuls langages (voire le seul ?) à aborder le
développement de manière globale et non pas du simple point de vue code.
Depuis l'IDE (Eclipse la plupart du temps), tu peux contrôler
l'intégralité de ton cycle de vie projet, de la gestion de conf au
bugtracker en passant par la gestion des dépendances, la compilation, la
construction des bdd, les tests U ou la release, et le tout avec
quasiment un seul outil (Maven).
Et pour ça, un client est prêt à « perdre » 20% de perfs s'il peut
gagner 80% de temps de développement. Surtout qu'au final l'application
sera aussi robuste en Java qu'en Python.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN1uvGAAoJEK8zQvxDY4P9kMQIAL97hN+sntdrq5pDaSDHDbXL
PB8omoy9RcekrTXDFsaJo4avkYmYpFfa1yxRm01CXKcxIU3igauZ+ZykkKK/KgGG
L5XD6Dcfd6i7KmigwqVs+ZnhHNAq5sXfKZVk+HKHqeMdwYu4MgoAOfrKmJ7b2QGV
FqCNpYiCX2B8+DOLV6o+2vrn2BIpNPR4LpiqoBOWLMZ0kUVmef/4HHk8mZAKtpG4
gYa7w5cU+qP92Ly6lmZgNKD3IVbM25eWTZH2wvn1aoN2K9Y2rIpcp24nwrkfLsRs
IrhFFQRZA4iS326xXAlktQe+XivodBdZptFiXzsONpTkOJkqF2UWY9+5p5OIufU =FT+M
-----END PGP SIGNATURE-----
Avatar
William
On 20-05-2011, Aéris wrote:

Le 20/05/2011 23:09, William a écrit :
Pourquoi pas la 2nde, ça me semble au contraire plus important et plus
fréquent comme erreur vu que ça englobe aussi les erreurs utilisateurs.



Oui et non.
Si on s'en tient aux erreurs utilisateurs, la couche d'accès aux données
s'occupera de filtrer les valeurs aberrantes et renverra de jolis
messages d'erreur. De ce côté là, Python ou Java, c'est équivalent.
Le problème que j'ai rencontré a surtout été côté développement, avec
des développeurs qui se retrouvaient en face d'API dont ils n'avaient
aucune idée de quel type d'argument passer.
Je pense que l'exemple du « X509Certificate.setIssuer(issuer) » est un
très bon exemple. En Python, les développeurs de mon gros projet ont mis
une bonne heure à comprendre que l'issuer devait être un X509Name et non
un X509Certificate, et surtout que cette découverte n'a été possible que
par analyse du code de la librairie X509, la doc se contentant d'un
laminaire « set the issuer of the certificate ».



C'est clairement un problème de doc là...


Ce que je veux dire s'est que soit on teste soit on ne teste pas. Si on
ne teste que le type ça ne suffit pas et si on teste la valeur on teste
le type en même temps. Dans le cas d'un test unitaire, peu importe que
ça lève une exception à cause du type ou de la valeur.



D'accord avec toi.
Et donc je préfère n'avoir que la partie data à vérifier, déléguant la
partie typage au compilateur. Il fera cela bien mieux que moi, avec
l'héritage et l'inférence de type en prime !



Au niveau du test, un assert poids < 150 va vérifier en même temps le
type et la valeur, inutile de rajouter quoique ce soit à la main.


En revanche, utiliser un objet Poids là où un simple entier suffirait va
rendre ton code 5x plus long...



C'était juste un exemple =)



Il est typique de Java...

Le soucis en Python est que tout argument est permutable sans erreur et
la permutation ne sera visible qu'au runtime.



Il y a une solution simple, s'est d'utiliser uniquement des paramètres
nommés.


Effectivement, si tu refactorise tous les jours ça sera pratique c'est
incontestable. Mais ça ne remplacera pas les tests unitaires qui eux
devraient couvrir aussi ces erreurs.



Les méthodes Agile « imposent » de refactorer en continu.
Tout le process de dev est basé sur des itérations qui améliore au fur
et à mesure les fonctionnalités.
Donc oui, je refactore TRÈS souvent !



Une refactorisation ne se contentera de toutes façon pas de juste
changer l'ordre des paramètres, il y aura donc dans tous les cas besoin
de vérifier le code impliqué...


Et pour les tests U, 85% de couverture de code obligatoire !



Y a au moins un point où tout le monde est d'accord !


Au contraire, le code est beaucoup plus clair, c'est essentiellement
pour ça je pense que les applis sont plus fiables et plus faciles
à maintenir.



Clair et concis, certes, Python est largement devant Java.
Mais le problème est toujours le même pour moi. Le code FINAL est clair,
concis et robuste grâce à des tests U efficaces, mais :
— les tests U sont généralisables à tout langage et tout projet
— le code INTERMEDIAIRE (en cours de dev) a demandé des efforts
surhumains aux développeurs pour en arriver à la version fiable.



Surhumains, en python par rapport à java, c'est la première fois que
j'entends ça... Ca me fait donc plutôt penser à un cas particulier.


Si je reprend l'exemple des certificats X509, le code obtenu a bien
évidemment testé unitairement et est fiable et robuste… sauf que les
devs ont mis une bonne heure à l'écrire…
En Java, j'arriverais au même résultat en quelques minutes, le typage
aidant dès le départ.

Il y a une étude qui a montré que le nombre de bug était
proportionnel au nombre de lignes quelque soit le langage. C'est bête
mais je le vérifie. Je viens de compter (avec sloccount) une appli que
j'ai réécrite quasiment à l'identique il n'y a pas longtemps, elle est
exactement 2x plus petite qu'en java.



Là je suis d'accord aussi.
Mais le soucis est toujours le même : le code Python sera plus court
donc moins buggé, mais aura demandé des efforts considérables pour les
développeurs.



Encore une fois, c'est sûrement un cas bien particulier. Pour ma part
s'est plutôt un facteur 2 ou 3 en faveur de python et c'est ce que j'ai
toujours observé ailleurs.


Ce sont deux
optiques différentes. Je comprend que dans ton cas tu te dis qu'étant
donné qu'il y a énormément de développeurs ça ne sera jamais simple,
donc autant verrouiller, mais ça reste à prouver.



Je ne parle pas forcément de grosses équipes.
Déjà à 2 personnes sur du Python, si l'autre n'est pas dispo pour
expliquer son API et ce qu'il attend.



C'est pas ce que j'observe du tout...

Toujours sur X509, je te met au défi de me faire un certificat X509
valide avec l'API Python
(http://packages.python.org/pyOpenSSL/openssl-x509.html) uniquement avec
la doc et sans aller chercher de tuto et/ou regarder le code de la lib.
Je pense que c'est mission impossible ou alors j'ai raté un épisode dans
le dev Python…



Je ne connais pas donc je ne peux pas te dire...

La où je suis d'accord c'est que les docs java sont souvent très bien
faites, c'est une habitude, ça m'a beaucoup appris quand j'ai utilisé ce
langage. En python, sûrement du fait du manque de moyen il y a des
lacunes à ce niveau. Je pense que tes réticences viennent de là.

Rien que de racrocher les bons types aux bonnes méthodes Python,
j'aurais fini le même en Java
(http://www.bouncycastle.org/docs/mdocs1.6/index.html)…

Comment expliques-tu que les applis en Java sont réputés si lentes alors
que le langage java lui-même est beaucoup plus rapide que python, de
très loin (plus pour très longtemps) ?



Comme tu le dis, elles ne sont que « réputées » très lentes.
C'était essentiellement vrai il y a quelques années (Java ≤1.3), depuis
Java 1.4 et surtout 5 et 6, Java est quasiment à égalité avec C/C++ (en
moyenne 10% de perfs en moins).



Le JIT de java est plus vieux que ça non ? Déjà Java, le langage
lui-même a toujours été beaucoup plus rapide que python. Je crois
surtout qu'il était très mal utilisé tout simplement. Avec de superbes
exercices de styles mais impossible à implémenter de manière efficace.


Après en Java, c'est surtout la vitesse de développement qui est un
argument très important.



Par rapport au C oui, pas par rapport à Python

Le langage en lui-même (generic, enum…), les bonnes pratiques (méthodes
Agile, test U, coverage…), les outils (Maven, Gradle, Sonar, Jenkins,
SCM…) et les architectures (MVC, 3-tiers, IoC, ORM, programmation
aspect…) y sont très en avance sur les autres langages.
Java est un des seuls langages (voire le seul ?) à aborder le
développement de manière globale et non pas du simple point de vue code.
Depuis l'IDE (Eclipse la plupart du temps), tu peux contrôler
l'intégralité de ton cycle de vie projet, de la gestion de conf au
bugtracker en passant par la gestion des dépendances, la compilation, la
construction des bdd, les tests U ou la release, et le tout avec
quasiment un seul outil (Maven).



Ce sont deux optiques différentes. Je préfère utiliser plusieurs petits
outils bien spécifiques qu'une seule grosse usine à gaz.

Et pour ça, un client est prêt à « perdre » 20% de perfs s'il peut
gagner 80% de temps de développement. Surtout qu'au final l'application
sera aussi robuste en Java qu'en Python.



Je suis d'accord mais c'est encore plus vrai en python ;-)

--
William Dodé - http://flibuste.net
Informaticien Indépendant
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 21/05/2011 16:58, William a écrit :
C'est clairement un problème de doc là...



Peut-être bien.
Mais dans ce cas, c'est un problème énorme et général pour Python car la
plupart des docs que j'ai pu trouver sur ce langage, toutes sont plus ou
moins du même style.

Au niveau du test, un assert poids < 150 va vérifier en même temps le
type et la valeur, inutile de rajouter quoique ce soit à la main.



Pour l'utilisateur oui.
Pour le développeur, ce n'est pas suffisant car il n'aura pas d'autre
choix que d'aller voir dans le code quel type de paramètres la méthode
attend.

Toujours sur l'exemple X509, on est bien d'accord que la méthode «
X509Certificate.setIssuer(issuer) » sera robuste aux erreurs, avec tous
les assert que tu veux et tous les tests U de la Terre.
Sauf que le développeur qui va devoir utiliser cette API, sauf à aller
voir la gueule du code directement, n'a aucun moyen de savoir s'il doit
écrire :
# X509Certificate.setIssuer(X509Certificate certificate)
certificate.setIssuer(issuerCertificate)
ou :
# X509Certificate.setIssuer(X509Name name)
certificate.setIssuer(issuerCertificate.name)
voire même :
# X509Certificate.setIssuer(ASN1Encoded certificateEncoded)
certificate.setIssuer(issuerCertificate.getEncoded())
ou encore :
# X509Certificate.setIssuer(ASN1Encoded nameEncoded)
certificate.setIssuer(issuerCertificate.name.getEncoded())

Il va devoir y aller à tatons, et tester peut-être les 4 appels avant de
trouver le bon…
C'est cette difficulté que j'ai du mal à contourner aujourd'hui (ou
peut-être est-ce ma trop grande habitude de Java) et à appliquer sur de
gros projets où potentiellement tu n'utilises que des APIs développées
par d'autres membres de l'équipe voire des APIs externes.

Encore une fois, c'est sûrement un cas bien particulier. Pour ma part
s'est plutôt un facteur 2 ou 3 en faveur de python et c'est ce que j'ai
toujours observé ailleurs.



Après, c'est aussi peut-être une histoire d'ordre de grandeur.

La plupart des projets Java sur lesquels j'intervient comporte plus de
70.000 lignes de code, avec des pointes à 500.000 lignes.
Le plus gros projet Python auquel j'ai participé pèse 1.7Go de sources
et prend plus de 8h30 à compiler (mélange de C++ et de Python).
Et tous mes projets sont faits par des équipes de 10 personnes minimum,
dont certaines externalisées.

Et là clairement, j'ai moins de soucis d'intégration des différentes
parties de code et API en Java qu'en Python, ou en tout cas j'y passe
beaucoup moins de temps et le debuggage est plus rapide et ne relève que
très rarement de la boule de cristal.
En particulier sur le gros projet Python, il était TRÈS rageux d'avoir
compiler pendant 8h pour finir par s'entendre dire que Toto avait
inversé 2 arguments, chose qui était assez rare en Java étant donné que
les IDE signalaient immédiatement l'erreur à l'édition.

Ce sont deux optiques différentes. Je préfère utiliser plusieurs petits
outils bien spécifiques qu'une seule grosse usine à gaz.



C'est pas très usinagaz Maven.
Ça ne pèse que quelques Mo, c'est juste la conf qui est un poil
laborieuse. Mais une fois faite, elle est réutilisable sur la plupart
des projets.

Je suis d'accord mais c'est encore plus vrai en python ;-)



Ben pour le moment je ne l'ai pas encore vu =)
Après comme je te l'ai dis, je suis ici surtout pour apprendre et
comprendre les bonnes méthodes en Python sur de gros projets.
Et mon plus gros soucis reste cette histoire d'utilisation/intégration
d'API au niveau développement qui m'a fait me casser les dents à
plusieurs reprises.

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN19mRAAoJEK8zQvxDY4P99zAH/iZu26nx5Wg27ze6CIdZyYlm
tbyqvFk0taPPWjoJpeC/vpFX5cPO1GpQQcn1PJX43F4Y0f92uw2C6EGIIiyyGwLd
xUc8ZLXjJA5glFDgEGTM2Ni4ElNWDpTq/awFKVyacK+ILBd8JPyeQBmXpe2kxOZ6
wK58C96/FZuJN2Xfmlm4UfDHKxcMopmUW3Oz9jVXnQp3Wq65TPOsxV2R2ewbM3iv
fBoFFshTTl8BuswOnPVmBJsUl0UhZE+jwCncNA5m363UloyjGx9PgcEkEqmS8CSF
WKXu7X5vTthfJLwas+HJsP8NJsYXDe62fvluako2syqamUW7Q+pAHphYl/JNsE4 ÄCw
-----END PGP SIGNATURE-----
Avatar
William
On 21-05-2011, Aéris wrote:

Le 21/05/2011 16:58, William a écrit :
C'est clairement un problème de doc là...



Peut-être bien.
Mais dans ce cas, c'est un problème énorme et général pour Python car la
plupart des docs que j'ai pu trouver sur ce langage, toutes sont plus ou
moins du même style.



Je pense qu'on va finir par se comprendre...
C'est clair que les moyens mis en œuvre autour de Python sont sans
commune mesure avec Java et ça se voit sur les docs. Et inversement Java
est très bien fourni à ce niveau, il y a des règles très bien
respectées, j'ai beaucoup appris à l'époque où je l'utilisais.

Par contre, généralement, quand il n'y a pas beaucoup de doc c'est que
le code est explicite, il ne faut pas hésiter à le consulter. Je sais,
ça fait drôle, mais ça se fait et on s'y habitue (je ne l'aurai jamais
tenté en Java).
Quand j'utilise une nouvelle librairie je commence par créer tout un tas
de petits bouts de code pour l'essayer et ensuite je m'en sert comme
doc. Pour mes applis je fait un peu pareil, certains tests unitaires
servent de doc.

Encore une fois, c'est sûrement un cas bien particulier. Pour ma part
s'est plutôt un facteur 2 ou 3 en faveur de python et c'est ce que
j'ai toujours observé ailleurs.



Après, c'est aussi peut-être une histoire d'ordre de grandeur.



J'imagine que sur des gros projets comme chez google par exemple il doit
y avoir un tas de règles de dev spécifiques.

Il faudrait demander à des projets comme openerp par ex.

Mon domaine c'est plutôt les petits projets très spécifiques.
Dès que ça dépasse 10000 lignes généralement je le découpe.
Par contre étant seul, j'ai intérêt à ce que le développement ne traine
pas et que la maintenance soit facile sinon j'aurai déjà mis la clé sous
la porte. Au départ ça m'a carrément bluffé ! C'est pour ça que c'est
assez difficile à décrire et à démontrer. Je me fait plaisir.


Je suis d'accord mais c'est encore plus vrai en python ;-)



Ben pour le moment je ne l'ai pas encore vu =)
Après comme je te l'ai dis, je suis ici surtout pour apprendre et
comprendre les bonnes méthodes en Python sur de gros projets.



Ca doit aussi dépendre de l'expérience de chacun, j'imagine facilement
qu'avec plusieurs développeurs c'est encore plus compliqué.


--
William Dodé - http://flibuste.net
Informaticien Indépendant
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 21/05/2011 22:09, William a écrit :
Je pense qu'on va finir par se comprendre...
C'est clair que les moyens mis en œuvre autour de Python sont sans
commune mesure avec Java et ça se voit sur les docs. Et inversement Java
est très bien fourni à ce niveau, il y a des règles très bien
respectées, j'ai beaucoup appris à l'époque où je l'utilisais.



Oui, Java est essentiellement basé sur les bonnes pratiques de
développement, doc comprise.
Et tous les projets suivent globalement les mêmes normes, concepts,
méthodes et architectures.

Par contre, généralement, quand il n'y a pas beaucoup de doc c'est que
le code est explicite, il ne faut pas hésiter à le consulter. Je sais,
ça fait drôle, mais ça se fait et on s'y habitue (je ne l'aurai jamais
tenté en Java).



Euh…
Là je sors mon Joker ^^
Python est très « mal » documenté, et le code est parfois laborieux à
comprendre, et aussi à tracer dans l'intégralité du comportement d'un
programme.

Garantir qu'une méthode sera « correctement » appelée en Python ne
garantit pas que la post-condition de la méthode sera suffisante pour le
reste du programme.

Ça ressemble à un canard, ça crie comme un canard mais ce n'est pas un
canard… Le jour où tu as besoin d'une vraie fonctionnalité « canard » et
que tu as un faux canard, boom =)

Quand j'utilise une nouvelle librairie je commence par créer tout un tas
de petits bouts de code pour l'essayer et ensuite je m'en sert comme
doc. Pour mes applis je fait un peu pareil, certains tests unitaires
servent de doc.



J'allait y venir.
J'ai l'impression que beaucoup des docs Python sont axés snippet et
autres micro-exemples de fonctionnement.
Ce n'est pas forcément un mal, mais cela me semble demander encore plus
de temps qu'une simple Javadoc bien foutue. Quand le développeur fait de
la doc tout court…

Ca doit aussi dépendre de l'expérience de chacun, j'imagine facilement
qu'avec plusieurs développeurs c'est encore plus compliqué.



Oui, c'est une grosse partie de mes tourments.
J'arrive encore à savoir comment fonctionnent mes APIs Python =)
Mais dès que je dois faire du Python en groupe, surtout sur des projets
plus conséquents, je sens la galère avant même d'avoir commencé…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJN2B+EAAoJEK8zQvxDY4P9ae8H/0YFVwN0bgd8FWMclTzRlab+
iIjqPG3sFkY5DJ+GuEptxpSD9UEAkwTPDxbEW39SyJ6w14OO0RQwFbwItqRD9nuN
rzESdFLFwEzNdmimcs35JJsTDCnyjhEyj03w8V5mE8h6W4851TrT99TvsJJOBRXf
9cs0inr1tIwGY7iYzlXDkviZRgTj0P7z1vJW7GcerF4rN7WX94MjX0MoJKf8mOvT
KW+LHzuo6leZP+wPwISEnisyb9/8Um5HxstqwmsXHqE/36WIrlQyPCjAxn9yiR9/
1KJ/j7+wdwf8VlcjwS7zZqYI1eiDRDU76TEv2zz+zgtMHafNlJ+dc22OS9ZwP4E =sOnR
-----END PGP SIGNATURE-----
3 4 5 6 7