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
leeed
Le 12-05-2011, Hugolino a écrit :

J'utilise slrn + vim correctement pouffiné




C'est vrai qu'slrn et vim sont de vraies poufs' :]
(j'ai pas pu m'en empêcher, je sais, la porte est par là ^^)
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 13/05/2011 15:07, totof01 a écrit :
Pour ma part je peux m'en passer, je ne suis pas codeur à plein temps,
et le temps passé à apprendre à utiliser un IDE de-la-mort-qui-
increase-my-productivity sera trop important par rapport aux
bénéfices apportés.



Moi je suis codeur à plein temps, et Python pour du « vrai » dev, j'ai
vite oublié…
Je m'en sers quasiment exclusivement que comme alternative aux shells
pour des petits scripts de quelques lignes.
L'utiliser pour des applis plus lourdes est à mon avis clairement
inenvisageable, pour les raisons sus-citées.

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

iQEcBAEBAgAGBQJNzVLeAAoJEK8zQvxDY4P9YvoH/i8e1j1ThDEZzPIalIdJfpFr
ng2Qauj2H00MpLP5X4JHKbtJY8XhQ525JsXzWWiLOaSYfNnzWhry2ADjHzR0Gqu1
tOaLAW/4+wqExZWAkyKXvIKF1HYVB6at0aQeB9Uo5AMrJy3GXMzza+XnEXbc62ck
vhdGsofzPQvwUb9hwmWRsIlzBp/3RQIfQQwULc3OxGwVlTzIUjwYXhKTPCsQC+Dk
uMbpsoTAWTHWayzWyl8bVn7z6x7rY4IaAx/ofZQtBYrRpPT6YSM/9vyMnKB7WGPf
6YZTgPTjWpPoxi1qQdgOGctlNxiCHml4Nc9OVp2ljJCf+9DZv7DTUPZX60rVBHE =+yGm
-----END PGP SIGNATURE-----
Avatar
William
On 13-05-2011, Aéris wrote:

Le 13/05/2011 10:54, totof01 a écrit :
Le second point qui me fait détester python est que tout est trop
explicite, ce qui vient à compliquer les choses simples. Le fait
d'avoir un langage qui nécessite de tout indiquer explicitement n'est
pas le problème : ce qui me gène c'est que ce soit pour un langage
"duck typing" : ce n'est absolument pas cohérent. Si on veut un
langage contraignant, on utilise ADA, pas Python.



C'est un peu la même chose qui m'a fait abandonner le Python, outre le
soucis de refactoring.

Ce duck typing devient extrèmenent pénible à l'usage, surtout quand tu
utilises des API tierces.
Que dois-tu passer comme paramètres, et surtout avec quels attributs et
méthodes, pour appeler la méthode « foo(bar) » ? Aucun moyen de le
savoir, sauf à se taper le code-source de cette méthode pour voir ce
dont elle a besoin… Et même la documentation n'est bien souvent d'aucune
utilité ici.



Soit tu sais très bien ce que fait la méthode que tu utilise et donc ses
paramètres, soit tu ne sais pas et dans ce cas c'est pernicieux de se
baser simplement sur le type de ses paramètres.

Ca explique pourquoi tu as du mal a envisager des programmes importants
en Python. Ca ne vient pas du langage mais de ta façon de l'aborder (je
ne dis pas qu'elle est mauvaise, elle n'est pas adapté).


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

Le 13/05/2011 19:51, William a écrit :
Soit tu sais très bien ce que fait la méthode que tu utilise et donc ses
paramètres, soit tu ne sais pas et dans ce cas c'est pernicieux de se
baser simplement sur le type de ses paramètres.

Ca explique pourquoi tu as du mal a envisager des programmes importants
en Python. Ca ne vient pas du langage mais de ta façon de l'aborder (je
ne dis pas qu'elle est mauvaise, elle n'est pas adapté).



Si je sais à quoi devrait servir une méthode « Socket.open(inetAddress)
» fournie par une API tierce en Python, je n'ai aucune manière de savoir
de ce à quoi s'attend à trouver comme méthodes et attributs sur l'objet
« inetAddress » la méthode « open ».
Utilise-t-elle les attributs « addr » et « port », ou « address » et «
port », ou encore des getter « getAddress() » et « getPort() », ou pire
encore un tableau associatif « { addr: … , port: … } » comme en usent et
abusent les développeurs Python ?
Seul Dieu le sait…
Et sur la valeur de retour, c'est encore pire…

À comparer à « Socket Socket.open(InetAddr inetAddress) » de Java, où je
sais exactement ce que je dois lui passer, et ceci sans devoir aller
voir COMMENT est implémenté le « open ». Je me contente de savoir ce que
j'ai à fournir (QUOI).

Se poser la question du COMMENT est pour moi une assez mauvaise pratique
en programmation, qui augure très fortement que le code va être 100%
dépendant de l'implémentation choisie dans tous le reste de l'application.
Le QUOI est signe qu'on ne s'occupe pas de l'implémentation mais
uniquement du besoin primitif.

Un bon programme est un programme qui ne s'occupe que de ce que lui a à
faire, et non de ce que les autres ont à faire voire même pire de
comment ils le font…

Sur un programme complexe en Python, on en arrive vite à avoir de très
grosses régressions à la moindre modification, chaque bout de code étant
100% dépendant des autres bouts de code.
Et en cas de modif foireuses, pas de type safe, on lance, ça démarre et
on est content ou ça plante et on pleure pendant des lustres…

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

iQEcBAEBAgAGBQJNzYuAAAoJEK8zQvxDY4P9cmUH/0yJkJEdAAbBZgpAxuaKLJrx
A+KZPB9EECESsgOiE6IlDhLzdHVfysuNf2+VztP9Zyd/YnEU2PYttyLcuywf/G1W
/HCqspxjgxQGvaCgAr9vWe3TKwU9DaUxK70yRBqXty/ag++RTbzqbSKq79p45TL4
65KcjU7iy+So4Q+dy5HtkmNcncwHwW32fZaHaXowfKYwSEDgeku//GrN3FAdpcNn
20ejKfkRgAiX/2C74Lmk8HceUg4yfB/2wBWXu/0ZatRYTSGuz1TDbKkPW+J8LEII
V8NMs7wFUYl/+LSuFJ0qCrSH6qdNkEOwxjjY9LSSFJnfMd9o9qwg8SztDQxpGQY =DH+Y
-----END PGP SIGNATURE-----
Avatar
Paul Gaborit
À (at) Fri, 13 May 2011 21:50:32 +0200,
Aéris écrivait (wrote):

Si je sais à quoi devrait servir une méthode « Socket.open (inetAddress)
» fournie par une API tierce en Python, je n'ai aucune manière de savoir
de ce à quoi s'attend à trouver comme méthodes et attribut s sur l'objet
« inetAddress » la méthode « open ».
Utilise-t-elle les attributs « addr » et « port », ou « address » et «
port », ou encore des getter « getAddress() » et « ge tPort() », ou pire
encore un tableau associatif « { addr: … , port: … } » comme en usent et
abusent les développeurs Python ?
Seul Dieu le sait…
Et sur la valeur de retour, c'est encore pire…



Dieu ne sait rien... En revanche, la documentation de la méthode doit
tout vous dire. Si cette documentation n'existe pas, changez d'API. Si
elle existe mais que vous ne savez pas la retrouver... vous aurez le
même souci avec n'importe quel langage.

À comparer à « Socket Socket.open(InetAddr inetAddress) » de Java, où je
sais exactement ce que je dois lui passer, et ceci sans devoir aller
voir COMMENT est implémenté le « open ». Je me conten te de savoir ce que
j'ai à fournir (QUOI).



Mais comment faites-vous pour construire votre objet InetAddr ? Vous
irez bien lire la documentation de l'un de ses constructeurs... Et puis
en sachant ce que vous passez à cette méthode, cela ne vous dit p as ce
qu'elle en fera (même si vous croyez le savoir).

[...]
Et en cas de modif foireuses, pas de type safe, on lance, ça dé marre et
on est content ou ça plante et on pleure pendant des lustres…



En résumant (peut-être trop), c'est le "strong typing" qui vous s emble
indispensable. C'est l'avis de nombreux programmeurs. Mais d'autres,
tout aussi nombreux, s'en passent sans problème. Ceux-là arrivent très
bien à utiliser Python (ou d'autres langages du même type) sur de gros
projets.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
totof01
On 14 mai, 00:49, Paul Gaborit wrote:
À (at) Fri, 13 May 2011 21:50:32 +0200,
Aéris écrivait (wrote):

> Si je sais à quoi devrait servir une méthode « Socket.open(inetAd dress)
> » fournie par une API tierce en Python, je n'ai aucune manière de s avoir
> de ce à quoi s'attend à trouver comme méthodes et attributs sur l 'objet
> « inetAddress » la méthode « open ».
> Utilise-t-elle les attributs « addr » et « port », ou « addre ss » et «
> port », ou encore des getter « getAddress() » et « getPort() », ou pire
> encore un tableau associatif « { addr: … , port: … } » comme en usent et
> abusent les développeurs Python ?
> Seul Dieu le sait…
> Et sur la valeur de retour, c'est encore pire…

Dieu ne sait rien... En revanche, la documentation de la méthode doit
tout vous dire. Si cette documentation n'existe pas, changez d'API. Si
elle existe mais que vous ne savez pas la retrouver... vous aurez le
même souci avec n'importe quel langage.

> À comparer à « Socket Socket.open(InetAddr inetAddress) » de Ja va, où je
> sais exactement ce que je dois lui passer, et ceci sans devoir aller
> voir COMMENT est implémenté le « open ». Je me contente de savo ir ce que
> j'ai à fournir (QUOI).

Mais comment faites-vous pour construire votre objet InetAddr ? Vous
irez bien lire la documentation de l'un de ses constructeurs... Et puis
en sachant ce que vous passez à cette méthode, cela ne vous dit pas c e
qu'elle en fera (même si vous croyez le savoir).

[...]

> Et en cas de modif foireuses, pas de type safe, on lance, ça démarr e et
> on est content ou ça plante et on pleure pendant des lustres…

En résumant (peut-être trop), c'est le "strong typing" qui vous sembl e
indispensable. C'est l'avis de nombreux programmeurs. Mais d'autres,
tout aussi nombreux, s'en passent sans problème. Ceux-là arrivent tr ès
bien à utiliser Python (ou d'autres langages du même type) sur de gro s
projets.



Pour ma part le "strong typing ne me parait pas indispensable, je m'en
accomode très bien en Ruby. Par contre je trouve qu'un langage comme
Python, qui est pénible sur certains points (notamment le self à
trainer partout), devrait l'implémenter. Carendrait le langage un peu
plus cohérent. Sinon, est-ce que quelqu'un pourrait m'expliquer
l'intéret de se trainer un "self" systématique lorsqu'on crée une
méthoe d'un objet ? Il y a peut-être une raison qui m'échappe.
Avatar
Alain Ketterlin
totof01 writes:

Pour ma part le "strong typing ne me parait pas indispensable, je m'en
accomode très bien en Ruby.



Je pense que tu parles de "static typing" plutôt que "strong typing".

Il n'y a pas que dans le développement que le typage dynamique pose
problème. Il y a aussi tous les aspects de performance, qui néces sitent
souvent un typage statique (soit explicite, soit obtenu par inférence de
type, c'est un détail). L'échec relatif de unladden_swallow est
éclairant de ce point de vue. Mais ça n'a jamais été un e préoccupation
majeure de python.

Par contre je trouve qu'un langage comme Python, qui est pénible sur
certains points (notamment le self à trainer partout), devrait
l'implémenter. Carendrait le langage un peu plus cohérent. Sino n,
est-ce que quelqu'un pourrait m'expliquer l'intéret de se trainer un
"self" systématique lorsqu'on crée une méthoe d'un objet ? Il y a
peut-être une raison qui m'échappe.



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éren t".

-- Alain.
Avatar
William
On 13-05-2011, Aéris wrote:

Le 14/05/2011 00:49, Paul Gaborit a écrit :
Dieu ne sait rien... En revanche, la documentation de la méthode doit
tout vous dire. Si cette documentation n'existe pas, changez d'API. Si
elle existe mais que vous ne savez pas la retrouver... vous aurez le
même souci avec n'importe quel langage.



Sur des méthodes simples (les primitives Pythons en gros), la doc suffit
effectivement généralement, les arguments étant quasiment tous des types
primitifs (int, string, boolean…).

Sur des API plus costaud, tel que X.509
(http://packages.python.org/pyOpenSSL/openssl-x509.html), je vous met au
défi de me créer un certificat X.509 auto-signé uniquement à partir de
la doc et sans aller voir dans le code de l'API…

set_issuer(issuer)
Set the issuer of the certificate to issuer.
C'est quoi « issuer » ? Un string ? Un X509Name ? Un X509 ?
Les 3 sont potentiellement valables…


...

Tu pointes des problèmes de documentation... En quelque sorte tu veux
dire qu'en java par exemple le fait de déclarer le type fait office de
documentation. Tu détournes la doc faite pour le compilateur là ;-)

C'est un peu comme dans l'autre sens si on dit que python est clair
grâce à l'indentation obligatoire.


add_extensions(extensions)
Add the extensions in the sequence extensions to the certificate.
C'est quoi « extensions » ? Une liste de X509Extension ? Un tableau de
tableau d'identifiant ASN1 ? Idem, les 2 sont totalement valable…

Et dans les 2 cas, le seul moment où je saurais si j'ai fait le bon
choix, c'est à l'exécution.



Il y a tellement de cas qui font que l'on ne sait si on a fait les bons
choix qu'à l'exécution...
A part pour du refactoring (la je te l'accorde), les erreurs dus à une
erreur de type sont vraiment rares et sont facile à résoudre au premier
test unitaire.


En résumant (peut-être trop), c'est le "strong typing" qui vous semble
indispensable. C'est l'avis de nombreux programmeurs. Mais d'autres,
tout aussi nombreux, s'en passent sans problème. Ceux-là arrivent très
bien à utiliser Python (ou d'autres langages du même type) sur de gros
projets.



C'est pas trop mal résumé =)
Après, je ne suis pas là pour critiquer Python, qui est un langage que
j'apprécie beaucoup pour de petits scripts en remplacement des shells.

Je n'ai peut-être pas la bonne approche d'un langage comme Python, étant
donné que je suis plutôt un adepte des langages très fortement contraints.
Plus ça pète tôt en cas de soucis (si possible dès la compilation voire
dès l'IDE !), mieux je me porte.



L'inconvénient de cette démarche est que tu rajoute du code de
vérification au milieu de ton algo, ce qui le rend moins lisible et donc
plus sujet à bug de logique.
L'avantage de python est que le code est très concis, ça permet de se
concentrer d'avantage sur l'algo. Un truc tout bête, mais un code qui
tien sur l'écran sera beaucoup plus facile à comprendre que s'il faut
scroller.

Je préfère avoir à deboguer une erreur de type qu'une erreur d'algo !


J'ai déjà expérimenté Python sur un très gros projet (1.7Go de code
source, moitié Python moitié C++, assez voire pas du tout documenté…) et
j'avoue avoir pas mal lutté à cause de ces problèmes d'arguments et de
typage.



Comme tu le dis à nouveau : problème de doc...

Sans l'aide du développeur qui a écrit une API quelconque, afin de
savoir exactement ce qu'il attendait comme types d'arguments et les
types de ce qu'il me retournait (vive les retours multiples autorisés
par Python !), c'était mission impossible de s'en servir.

Si vous avez des pistes ou des manières de penser pour bien appréhender
ces problèmes, je suis totalement preneur.



Pour tout ce qui est vérification de code il y a les tests unitaires
bien sûr, les types seront vérifiés de fait et bien d'autres choses.

Pour les petits tests qui font office de doc, un peu comme les
déclaration de type, il y a les "doctest", il ne faut pas en abuser mais
ça peut-être vraiment bien, mieux qu'une doc pas à jour.

Pour ce qui est de la vérification de code avant exécution il
y a pyflakes qui vérifie le code dans l'ide (vim chez moi), et pylint
qui peut être lancé avant exécution.

En résumé je dirai qu'il faut utiliser le temps et la concision du code
gagnée pour peaufiner la logique générale et les tests et pas se
contenter d'un "vite fait bien fait".

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

Le 14/05/2011 14:23, William a écrit :
L'inconvénient de cette démarche est que tu rajoute du code de
vérification au milieu de ton algo, ce qui le rend moins lisible et donc
plus sujet à bug de logique.
L'avantage de python est que le code est très concis, ça permet de se
concentrer d'avantage sur l'algo. Un truc tout bête, mais un code qui
tien sur l'écran sera beaucoup plus facile à comprendre que s'il faut
scroller.

Je préfère avoir à deboguer une erreur de type qu'une erreur d'algo !



C'est là que je ne te suis plus du tout.

Justement avec Java, je ne vais avoir aucun contrôle à réaliser avec mes
données, le compilateur va me garantir que le typage est correct et que
je manipule bien les données que j'attend, Y COMPRIS POUR DES
UTILISATIONS FUTURES:

void setIssuer(X509Certificate issuer) {
// J'ai la garantie que l'argument est correct
this.issuer = issuer;
}

En Python, si je veux réellement être robuste, je vais devoir me taper
le test de type de chaque argument à l'entrée de la méthode:

def setIssuer(self, issuer):
if not issuer.__class__ != X509Certificate.__class__:
raise InvalidArgumentException("Issuer must be a X509Name")

# Si je ne fais pas le test ci-dessus, le code ne
# lèverait aucune erreur et les algos risquent fort
# de tourner court si j'ai passer un string à la place
# par exemple
# Soucis: l'erreur pourrait apparaître 20 ans après la
# cause réelle de l'erreur…
self._issuer = issuer;
}

Même pire si je ne veux pas contraindre le typage (duck typing, parce
qu'au final la méthode ci-dessus est équivalente à faire du strong
typing avec de gros doigts), je dois tester non pas la classe mais les
propriétés attendues DANS L'ENSEMBLE DE L'APPLICATION:

def setIssuer(self, issuer):
# Lance des exceptions si introuvables
getattr(issuer, 'name')
getattr(issuer, 'publicKey')
getattr(issuer, 'serialNumber')
getattr(issuer, 'dateBefore')
getattr(issuer, 'dateAfter')


self._issuer = issuer;
}

C'est un des gros problèmes que j'ai rencontré lors de mon passage sur
un gros projet Python (outre les soucis de documentation).
Des plantages survenaient aléatoirement avec des causes primaires
d'erreur très éloignées dans le temps.
Du fait du duck typing, les types étaient correctement instanciés pour
l'usage « proche » qui allait en être fait. Mais pour les usages plus «
lointains » qui en étaient fait, il manquait certains attributs ou méthodes.

Si je reprend la belle définition de Wikipedia du duck typing:
« Si *je* vois un animal qui vole comme un canard, cancane
comme un canard, et nage comme un canard, alors *j*'appelle cet
oiseau un canard »
Je pense que le « je » n'est pas annodin. Ça vole, cacane et nage comme
un canard, donc c'est un canard *pour moi* mais ce n'est pas forcément
un canard pour les autres.
Si j'ai un élevage de «moi-»canards, le jour où je les envoie à
l'abattoir, *ILS* ne pourront pas en faire du paté de canard…
Idem, si j'ai besoin de plumes, j'en ai pas forcément…

Exemple concret :

… Je me lance dans l'élevage de canards …

class Canard( object ):
pass

class Ferme:
canards = []

def addCanard(self, canard):
getattr(canard, 'vol')
getattr(canard, 'cancane')
getattr(canard, 'nage')

self.canards.append(canard)
print "Ajout d'un canard"

unVraiCanard = Canard()
setattr(unVraiCanard, 'vol', 1)
setattr(unVraiCanard, 'cancane', 1)
setattr(unVraiCanard, 'nage', 1)
setattr(unVraiCanard, 'nbPlumes', 1)

unFauxCanardSansPlume = Canard()
setattr(unFauxCanardSansPlume, 'vol', 1)
setattr(unFauxCanardSansPlume, 'cancane', 1)
setattr(unFauxCanardSansPlume, 'nage', 1)

f = Ferme()
f.addCanard(unVraiCanard)
f.addCanard(unFauxCanardSansPlume) # Aucune erreur!!!!

… 15.000 lignes et 2 ans plus tard, les canards partent à l'abbatoir …

class Abbatoir:
nbPlumes = 0

def doPate(self, canard):
self.enlevePlume(canard)
print "Pate fait"

def enlevePlume(self, canard):
getattr(canard, 'nbPlumes')

self.nbPlumes += canard.nbPlumes
canard.nbPlumes = 0
print "Plumes enlevees"

a = Abbatoir()
for c in f.canards:
a.doPate(c) # Baam… Plantage…

python duck.py
Ajout d'un canard
Ajout d'un canard
Plumes enlevees
Pate fait
Traceback (most recent call last):
File "duck.py", line 46, in <module>
a.doPate(c) # Baam... Plantage
File "duck.py", line 16, in doPate
self.enlevePlume(canard)
File "duck.py", line 20, in enlevePlume
getattr(canard, 'nbPlumes')
AttributeError: 'Canard' object has no attribute 'nbPlumes'

Origine primaire du soucis : 15.000 lignes et 2 ans avant l'apparition
effective de l'erreur. Temps passé à débugguer et déplomber très (trop)
conséquent…

J'ai du mal à voir comment une application en Python un tant soit peu
conséquente peut se prémunir de ce type de problème, sans recourir :
— À du strong typing, même simulé (cf plus haut)
— À une doc qui devra déclarer quels sont les types d'arguments attendus
Et au final les 2 cumulés, j'ai l'impression qu'on tombe typiquement
dans de la Javadoc et du strong typing et que de rester en Python relève
de l'inconscience collective

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

iQEcBAEBAgAGBQJNz+oNAAoJEK8zQvxDY4P9vOUH/2xdHC32L8pysTzaOlA9GoY9
it8U8hSbw8ZwTEuX5UQxW4X6yPAW2HDSOi3YuaCWFVYvtYXOuWbtX66F9LDAaWMK
1zkk4FIg12kNE/pwJt7wKtiD8XskZkSUboa6WE5Nl1GX20b91czUpCunHz44HxC8
ERD+BPD7XEvX+LrANNmmxeOwaeZA7Kry50SnYwUTivklTY9TDzKXnjiMXyjf7DLy
8F5BybigZ0gD7rLdviw4WXwmADwkfNtG0IeKq792CBhXgwdJ9bgTTqbuQD1iqLar
m1y7DDL+Trv3WIog9u9E6SK5BctxOPxXi1jalg2yUxlbUHZQbw1tzZvWHSnl598 =QpmA
-----END PGP SIGNATURE-----
Avatar
William
On 15-05-2011, Aéris wrote:

Le 14/05/2011 14:23, William a écrit :
L'inconvénient de cette démarche est que tu rajoute du code de
vérification au milieu de ton algo, ce qui le rend moins lisible et donc
plus sujet à bug de logique.
L'avantage de python est que le code est très concis, ça permet de se
concentrer d'avantage sur l'algo. Un truc tout bête, mais un code qui
tien sur l'écran sera beaucoup plus facile à comprendre que s'il faut
scroller.

Je préfère avoir à deboguer une erreur de type qu'une erreur d'algo !



C'est là que je ne te suis plus du tout.

Justement avec Java, je ne vais avoir aucun contrôle à réaliser avec mes
données, le compilateur va me garantir que le typage est correct et que
je manipule bien les données que j'attend, Y COMPRIS POUR DES
UTILISATIONS FUTURES:



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.

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.

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. 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.


Origine primaire du soucis : 15.000 lignes et 2 ans avant l'apparition
effective de l'erreur. Temps passé à débugguer et déplomber très (trop)
conséquent…



Encore une fois, tu te focalise sur un problème en particulier et tu en
fait 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. Tout ce temps gagné me permet de réaliser des programmes
beaucoup mieux conçus et donc d'éviter beaucoup de problèmes.


J'ai du mal à voir comment une application en Python un tant soit peu
conséquente peut se prémunir de ce type de problème, sans recourir :
— À du strong typing, même simulé (cf plus haut)
— À une doc qui devra déclarer quels sont les types d'arguments attendus
Et au final les 2 cumulés, j'ai l'impression qu'on tombe typiquement
dans de la Javadoc et du strong typing et que de rester en Python relève
de l'inconscience collective



mdr ton fud

Tu jettes le bébé avec l'eau du bain. Tant mieux, il vaut mieux qu'un
langage reste utilisé par ceux qui savent l'apprécier, ça évite qu'il
soit mal orienté.


--
William Dodé - http://flibuste.net
Informaticien Indépendant
3 4 5 6 7