OVH Cloud OVH Cloud

Microsoft et Java

295 réponses
Avatar
Wykaaa
Microsoft semble reconnaître que Java permet de développer plus
rapidement que C# et qu'il y a moins de failles de sécurité dans Java
que dans .net :
http://dsi.silicon.fr/nouveautes/microsoft-java-forever%E2%80%A6-1366

10 réponses

Avatar
JKB
Le Sat, 18 Jun 2011 15:28:06 +0200,
Aéris écrivait :

Le 18/06/2011 14:46, JKB a écrit :
Et après, on récupère du code moisi.



Non, le code suit la procédure normale de QA : relecture de code
hebdomadaire, suivi des métriques via Sonar et Jenkins, normes de
codage, couverture de code…



Ne réponds pas à côté de la plaque en coupant comme un goret.

Je ne vois pas comment
assimiler en trois semaines tout ce qu'il faut pour utiliser
correctement un bloatware comme java associé à un autre bloatware
comme Netbeans ou Eclipse.



Seul Maven est une réelle barrière.

Eclipse n'est au final qu'un éditeur de texte enrichi, le reste des
plugins tournant en arrière-plan sans intervention de l'utilisateur.

Le reste des concepts (3 tiers, MVC, IoC) vient avec le temps,
l'architecte JEE ayant déjà fait son travail, le nouveau dev ne sera
qu'« utilisateur » de l'architecture mise en place au début.

Si on y arrive en trois
semaine, on a déjà de solides notions de POO. Sinon, c'est
parfaitement impossible (sauf à ne pas comprendre ce qu'on fait et à
utiliser des recettes toutes faites).



Notions de POO oui, notion de Java non.
Le dernier formé dans mon équipe est venu du monde .Net.



J'aimerais voir la tronche d'un développeur qui ne connaît rien à
Java et qui est parfaitement opérationnel en trois semaines.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sat, 18 Jun 2011 15:30:43 +0200,
Aéris écrivait :

Le 18/06/2011 15:20, JKB a écrit :
Mon
expérience me dit qu'il faut souvent oublier le code de la version
1 et repartir d'une page blanche (c'est même assez souvent vrai
lorsqu'on code en C++)



En tout cas sur mes applis Java, je n'ai jamais vu ça.
Le code est suffisamment propre et découplé pour pouvoir intervenir en
profondeur et sans effet de bord notable.



J'aime assez le _notable_. Chez moi, on n'a pas le droit au
_notable_. Et plutôt qu'essayer de comprendre comment le truc
fonctionne _exactement_, on a plus vite fait de repartir d'une
feuille blanche plutôt que passer 90% du temps à corriger des effets
de bord dont personne n'arrive à comprendre d'où il viennent.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 16:00, Nicolas George a écrit :
Ça, c'est juste factuellement faux.



Je parlais uniquement des ifdef/define qu'on trouve en début de .h pour
éviter l'inclusion récursive.

Ailleurs oui, ils sont parfaitement utiles.

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

iQEcBAEBAgAGBQJN/LB+AAoJEK8zQvxDY4P9SCsH/0RRP4+2+RU5ht2WfkvO04ZG
nOGCNqYut74HpfFuyd2OlGFDFGmZP/GjP9lHD4C9p/jyUobVlPHc9/vJVsX57z6l
VusxHuEFs/qH7uKpXnS/x4wYlZuqYzbxSqjqiMqb9oSwDb5nWs3YIIcAVAx6EPpV
mMP11ulp3tAIeqZQ885TGjAM3Pn3cbhpZigf0Iyp355yMb0sO9zzd+wV9ztNct7H
B+rcOZhz456KucskticoFmF1PXT+IJuh5o4hwQsGcE4DAATD9ytaBuS7Oc5oDK8U
lRx5PO/Tm4mnLMUTN8rd64yMwcyVzoAdybLWwfIWHtXjFpByPYD1wwfy8WK44Bk =OGtI
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 16:01, JKB a écrit :
Je t'aide : le XL n'a jamais été prévu pour être humainement
lisible.



Je t'aide aussi : tu peux le faire en YAML ou Groovy si ça te chante.

Encore faut-il avoir accès à /opt/repo



Met ça où ça te chante et où tu as les droits

et ne pas casser les
bibliothèques du voisin qui nécessite telle version et pas telle
autre. J'ai des tas de bouts de code Java qui demandent une version
bien spécifique d'un 'import' et qui refusent de fonctionner avec
une version plus récente.



Maven gère totalement le versionning.
Tu peux avoir X versions différentes de la même lib dans ton repo, c'est
lui qui gérera ton classpath pour y inclure les bonnes libs.
C'est justement pour ça qu'il est totalement faisable d'avoir un dépôt
commun à tous les devs et tous les projets.

Exemple chez moi, j'ai 11 versions différentes de Doxia
$ ls ~/.m2/repository/org/apache/maven/doxia/doxia
1.0/ 1.0-alpha-10/ 1.0-alpha-11/ 1.0-alpha-6/ 1.0-alpha-7/
1.0-alpha-9/ 1.1/ 1.1.2/ 1.1.3/ 1.1.4/ 1.2/

Non, pas plus. J'ai le droit d'avoir un org.com.truc.bidule qui est
strictement identique celui utilisé par quelqu'un d'autre à l'autre
bout du monde.



Le droit oui, le devoir non.
La propreté du code n'est qu'une histoire de convention communément
admises par une communauté, pas une chose intrinsèquement sûre.

Et encore une fois c'est un faux problème. Si tu
utilises un namespace en C++ qui s'appelle lib, le problème vient de
toi et non du langage.



Oui, mais que le nommage à utiliser soit conventionnée par l'ensemble de
la communauté, C⁺⁺ ne propose pas ça.

Que _tu_ ne considères pas comme propre ou maintenable.



Que beaucoup de développeurs considèrent comme non propre et non
maintenable. Pour n'en citer qu'un, Linux Torvald, qui ne se gène pas
pour gueuler sur les macros et les define (cf différentes flame wars sur
la kernel list) même s'il n'a souvent d'autre choix que de s'en servir.

Ne pas avoir de collision de symbole en C et surtout ne pas avoir à
corriger à la main tout un tas de nom de fonctions.



Chose que nous n'avons même pas à appliquer à Java car tout le monde
suit les mêmes conventions.

Déjà rien que les trucs de la fondation Apache,



Parlons-en. Il y a des trucs très bons et des vériables merdes
complètement inabouties.



Qui ne se retrouvent pas dans le dépôt central de Maven ou en tout cas
pas dans l'état « stable ».

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

iQEcBAEBAgAGBQJN/LOjAAoJEK8zQvxDY4P997oH/1LQFrPOg9X1M4emn3AwGY4X
sAJbNZ2QSta1+RJa4C0StDHXRaZ2F9oZX/Zq2WzWUC5jkx2LzvEUGWWMAqeHMAu3
bacm5SYMl5oEs6QvO3/exbCyxRxOgz9jlYuKRy+bGB0t5oIE7XKa7MiKsZ/oaUPc
T26Fqn1bFRt1fVggOybBj8P2NkGH9HVU4RUDuJvP6HxC0qFYPeP1SDS8SNJr/gZH
e6UXSs2Y0R4wLieozPlESFX1pYOqbUOeHpZv/DLTkUyj9lmewHyd6qQ6C5pocJYJ
mf4J+kIb1FUWcN7N7x44kBQb+qgAtwiV/0wAq6myvHBNa1q6kqcH59hPEYrqt1k =qyJ5
-----END PGP SIGNATURE-----
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 16:04, JKB a écrit :
et sans effet de bord notable.


J'aime assez le _notable_.



Par notable, j'entend qu'ils ne dépassent pas la couche où ils se
déclenchent (la couche suivante étant protégée des erreurs par
conception), qu'ils sont immédiatement détectés par les tests U ou la CI
et que la correction relève de moins de 1h.

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

iQEcBAEBAgAGBQJN/LRoAAoJEK8zQvxDY4P9nScH/ju9tz8AwQ2q7ABaVX3gXxM7
vkweZX91/RAnVLC7q7w9X7L38NSJ0g4Vm0LqRrRqTXXnSARF7s67ZG4+aCEZ9p6J
oWMdxAq1m+lCbDvVO6LHmuSKW/z4QGBBhuSaFCaMDQC8qx82HPaxp9fzUkuqlRCG
Hk3SEoOeNkc7n04gE9efDy/Jk9iQa39f594oeXncEyB9EjCRe8KeF4+6MpyDpCWX
UxZUOvILPkKQsuD9Z8ErU7QGSwD0h7FFii4XLbjOssODr+4qpuYaGwnc/1yd1u7t
mDs4rS/DGFwFuyrXszeWxKT+lOoganzs0qbb/adcbShE8eZfw3H6AsPy6lvYnjA =lc9H
-----END PGP SIGNATURE-----
Avatar
JKB
Le Sat, 18 Jun 2011 16:18:16 +0200,
Aéris écrivait :
Non, pas plus. J'ai le droit d'avoir un org.com.truc.bidule qui est
strictement identique celui utilisé par quelqu'un d'autre à l'autre
bout du monde.



Le droit oui, le devoir non.
La propreté du code n'est qu'une histoire de convention communément
admises par une communauté, pas une chose intrinsèquement sûre.



Donc ça n'apporte rien de plus que les namespaces du C++. Dis
autrement parce que j'ai l'impression qu'il faut te faire un dessin,
si j'ai une bibliothèque C++ qui s'appelle libtruc, il est idiot
d'utiliser le namespace 'machin'. Tu peux l'utiliser, mais il ne
faut pas après te plaindre d'une collision.

Et encore une fois c'est un faux problème. Si tu
utilises un namespace en C++ qui s'appelle lib, le problème vient de
toi et non du langage.



Oui, mais que le nommage à utiliser soit conventionnée par l'ensemble de
la communauté, C⁺⁺ ne propose pas ça.



Java ne l'impose pas non plus.

Que _tu_ ne considères pas comme propre ou maintenable.



Que beaucoup de développeurs considèrent comme non propre et non
maintenable. Pour n'en citer qu'un, Linux Torvald, qui ne se gène pas
pour gueuler sur les macros et les define (cf différentes flame wars sur
la kernel list) même s'il n'a souvent d'autre choix que de s'en servir.



Il y a des tas de choses que tu ne peux faire efficacement sans
macros. Encore une fois, une macro peut-être plus ou moins bien
écrite. Quant aux #define, je ne vois pas comment faire autrement de
façon propre pour initialiser un tableau statique vide ou une chaîne
statique vide.

Ne pas avoir de collision de symbole en C et surtout ne pas avoir à
corriger à la main tout un tas de nom de fonctions.



Chose que nous n'avons même pas à appliquer à Java car tout le monde
suit les mêmes conventions.



Ni plus ni moins qu'en C++.

Déjà rien que les trucs de la fondation Apache,



Parlons-en. Il y a des trucs très bons et des vériables merdes
complètement inabouties.



Qui ne se retrouvent pas dans le dépôt central de Maven ou en tout cas
pas dans l'état « stable ».



Ah ?

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
JKB
Le Sat, 18 Jun 2011 16:21:28 +0200,
Aéris écrivait :

Le 18/06/2011 16:04, JKB a écrit :
et sans effet de bord notable.


J'aime assez le _notable_.



Par notable, j'entend qu'ils ne dépassent pas la couche où ils se
déclenchent (la couche suivante étant protégée des erreurs par
conception), qu'ils sont immédiatement détectés par les tests U ou la CI
et que la correction relève de moins de 1h.



Un code est bon ou n'est pas bon. Il n'est pas notablement bon.
D'autant que la gestion des erreurs par exception est une aberration
née dans le cerveau dément d'un analyste fou. C'est le pire des
systèmes lorsqu'on veut récupérer une erreur efficacement et de
façon propre. Le principe à la C d'une fonction qui renvoie un code
d'erreur est bien mieux pensé car plus simple et en testant les
retours des fonctions, on laisse toujours le programme dans un état
cohérent. En C++ ou en Java, on peut rapidement avoir des surprises
amusantes.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 17:22, JKB a écrit :
Java ne l'impose pas non plus.



Rien n'est jamais imposé en développement.
Juste que le nommage des projets et des classes est réellement
MONDIALEMENT normalisé et communément admis et MONDIALEMENT appliqué sur
l'ensemble des projets Java, à de très rares exceptions près.

Extrait de la doc :
groupId: This is generally unique amongst an organization or a project.
*Note that the dot-notated groupId does not have to correspond to the
package structure that the project contains. _It is, however, a good
practice to follow._*
artifactId: The artifactId is generally the name that the project is
known by.
*It, along with the groupId, create a key that separates this project
from every other project in the world (_at least, it should_ :) ).*

Chose que nous n'avons même pas à appliquer à Java car tout le monde
suit les mêmes conventions.



Ni plus ni moins qu'en C++.



Trouve-moi 2 projets C⁺⁺ de 2 équipes différentes qui utilisent :
— La même arborescence et structure de fichiers
— Le même Makefile
— La même convention de nommage de classes et surtout de namespace

et en allant plus loin
— Le même découpage architectural
— Le même cycle de vie de développement

et en allant encore plus loin
— La même structure de site web
— La même structure de doc
— La même convention de versionning
— La même gestion de dépendance
— La même manière d'intégrer leur travail dans ton propre travail

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

iQEcBAEBAgAGBQJN/Mn0AAoJEK8zQvxDY4P9DvQH/1lu5vhOQdyjmFfrZA5EeOi3
978hTkXpcklNWNl9pzl5E2wLddbgNAHSvXH/V1Y/48bJQvN5LfZfeTH/P+a1gVgt
Z2Xs+ajDMBtIa96wXlmgpWakhGhvIgZdQ8brWtC4ng0KWi+4kzx84hXngT2gF4Hs
SqcoJl1MiLQWAd56nvtpEW+k11K1YggN7itu/c46hn96rXkMBxARBW3FmAliFufv
CUwEBJwMvRq9MMsGs2u7Foltf9+siOurTkIQzw/Gd0HFwF5Tfy6mLrdQ7A8XaP5d
dv0xJ1cexowjvaJM6Ic5pMNMNAZvHsYo4RjZgvHEdVtVqho2ey/vTGLDhwetNTo =XtIm
-----END PGP SIGNATURE-----
Avatar
JKB
Le Sat, 18 Jun 2011 17:53:29 +0200,
Aéris écrivait :

Le 18/06/2011 17:22, JKB a écrit :
Java ne l'impose pas non plus.



Rien n'est jamais imposé en développement.
Juste que le nommage des projets et des classes est réellement
MONDIALEMENT normalisé et communément admis et MONDIALEMENT appliqué sur
l'ensemble des projets Java, à de très rares exceptions près.



Ah ?

Extrait de la doc :
groupId: This is generally unique amongst an organization or a project.
*Note that the dot-notated groupId does not have to correspond to the
package structure that the project contains. _It is, however, a good
practice to follow._*
artifactId: The artifactId is generally the name that the project is
known by.
*It, along with the groupId, create a key that separates this project
from every other project in the world (_at least, it should_ :) ).*



Il existe des règles de bon codage dans n'importe quel langage (même
en Cobol, c'est dire !).

Chose que nous n'avons même pas à appliquer à Java car tout le monde
suit les mêmes conventions.



Ni plus ni moins qu'en C++.



Trouve-moi 2 projets C⁺⁺ de 2 équipes différentes qui utilisent :
— La même arborescence et structure de fichiers
— Le même Makefile
— La même convention de nommage de classes et surtout de namespace



En C++, on s'en fiche, seules comptent les interfaces et l'espace de
nommage. L'arborescence des sources n'a aucune siginification.

et en allant plus loin
— Le même découpage architectural
— Le même cycle de vie de développement



Ça n'a rien à faire ici. On peut avoir n'importe quel cycle de
développement dans n'importe quel langage.

et en allant encore plus loin
— La même structure de site web



On parle de code source.

— La même structure de doc



doxygen est un standard.

— La même convention de versionning



Justement, parlons-en...

— La même gestion de dépendance



Ce n'est pas à une application de gérer des dépendances, mais au
système, sauf à vouloir absolument foutre le bordel, mais c'est
ainsi.

— La même manière d'intégrer leur travail dans ton propre travail



Hors sujet. Lorsque je parle d'intégrer un travail externe dans le
mien, je spécifie des interfaces. C'est indépendant du langage (et
java est justement très mauvais là-dedans).

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/06/2011 17:27, JKB a écrit :
Un code est bon ou n'est pas bon. Il n'est pas notablement bon.



Au final le code sera toujours bon quelque soit le langage et la qualité
du code.

Le « notable » était juste là pour indiquer que toute modification
introduit potentiellement des effets de bord.
Le but d'un code propre n'étant pas de minimiser la fréquence de ces
effets de bord (ce qui est difficilement faisable) mais de rendre leur
correction rapide et fiable.

D'autant que la gestion des erreurs par exception est une aberration
née dans le cerveau dément d'un analyste fou.



Certes, mal géré cela peut devenir dangereux.

C'est le pire des
systèmes lorsqu'on veut récupérer une erreur efficacement et de
façon propre. Le principe à la C d'une fonction qui renvoie un code
d'erreur est bien mieux pensé car plus simple et en testant les
retours des fonctions, on laisse toujours le programme dans un état
cohérent.



Si tu as un mauvais développeur en C, il va oublier de checker le code
de retour, qui au final ne sert à rien métier-ement parlant.
En Java, au mieux le code ne compilera pas (l'exception n'étant pas
gérée), au pire en cas d'erreur au runtime (RuntimeException), le code
s'arrêtera plutôt que de continuer dans un état totalement pourri.
Dans les 2 cas, le comportement final est plus fiable que celui du code
en C…

En C++ ou en Java, on peut rapidement avoir des surprises
amusantes.



Et en C encore plus.
Parce que même en testant le code de retour, 99% des développeurs ne
savent de toute façon pas comment gérer l'erreur, et encore moins
proprement.

Au moins en Java, le langage en lui-même met un 1er garde-fou en
remontant l'erreur tout le long de la pile jusqu'à ce qu'elle soit
traitée, ou arrête le programme plutôt que de le laisser continuer dans
un état totalement incohérent si personne n'a daigné gérer cette erreur.

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

iQEcBAEBAgAGBQJN/MwsAAoJEK8zQvxDY4P9zUMIAJ+ldvObvUJgPZTnTKgiIQAH
8EcOoV5MXhlHZ/HH1sJIodG5KG4c42IC/3PlG5CaPEk3so3xvtmn4xhTs38VIEWM
03od3y9w1Rl1J3vHsruJhQoiXQuxOTT9PeMF0Irys0w5R7eaUTbyC1LOJ8a7zVdC
Ny0/oXx5OJBTKpaFSzUbVXIe+zfFTfyytydF4EQ0bwXSf/y9gB/6mQnCMJL9++M9
MW/djrJkYtXr9s4twYS+EFNqaxuJGZl84qGa7/q1/avOkVSjazov/H3MpR+TrGWK
EM65MZHu74LNZhUSnDHvFqD4Dtfv3CNDWI3X/0kXYnvdKb8SkK4OzcJM5qeuRkQ =ZFlI
-----END PGP SIGNATURE-----