Salut ! Je vais prendre le temps de te dire ce que je pense de ton approche :) Ça va peut être être rude, mais comprends bien que si je prends du temps pour écrire un commentaire c'est bien que je veux être constructif. De plus je distingue totalement ton travaille de la personne que tu es (c'est important). Mais il y a pas mal de choses à dire je trouve.
Ton approche
Background
Tu connais le C++, tu vis le C++ en autarcie, tu nous explique à longueur de journée que les pratiques classiques comme les tests ne sont pas pour toi. En informatique comme ailleurs affirmer que l'on est plus malin/différents/le cas à part, c'est se tromper. Tu as des centaines de milliers de personnes dans le monde qui après une cinquantaine d'années à tenter de construire une certaine qualité logicielle. Arriver et dédaigner leur travail, par un « bof c'est pour les autres », c'est forcément se tromper. On exerce une science dure, pour affirmer des choses il faut avoir des arguments autre que « je fais de la factorisation poussée » (personne d'autre ne factorise ?). De tout ce que tu nous as décrit ça "fonctionne" parce que tu es le seul à coder et que tu accepte de voir très tard les bugs (tu reconstruit les autres logiciels et tu teste s'il plantent).
Tu pars donc très très très mal : tu nous propose d'utiliser un code pas tester (yay !), mais pour quoi donc ?
Objectif
Tu ne sais faire que du C++, quelqu'un te demande de faire du web, tu fais du web en C++. Très bien. Mais la populace fais déjà du web avec un tas d'autres choses. Il va falloir nous donner une raison d'abandonner nos stack libres bien plus fiables que la tienne (dont le copyright est partagé, supporté par une communauté, testée, testée massivement,...).
En plus du web, il existe un énorme paquet de techno qui apparaît. Ça signifie qu'il y a déjà énormément d'idées qui ont étaient essayée. D'autant que ça fais des années que ça dure !
Tu ne nous a pas donné d'autres arguments sur le pourquoi utiliser ta pile autre que c'est du C++ et c'est simple... oui mais.
Alternatives
Tu n'a aucune idée de si c'est simple, tu en ai l'utilisateur-codeur et tu n'es même pas allé voir ce qui se fait ailleurs. On ne souffre pas la comparaison quand on en fait pas mais on va forcément la faire pour toi. Qu'est-ce que ça donne comparé à du CGI ? Qu'est-ce que ça donne face à Wt ? Pourquoi les gens choisiraient le code d'un développeur dans son garage (pas testé) par rapport à tout ce qui peut exister ailleurs ?
J'ai parlé de techno C++, mais alors j'ai pas de doute qu'en PHP, Java et JS c'est pire encore.
Finalement
En vrai je ne sais pas pourquoi tu nous présente des plus ou moins portages dans d'autres langages, tu ne les utilise pas et tu n'explique pas en quoi les développeurs de ce langage gagneraient à utiliser ton code.
Pire encore, tu nous parle d'une bibliothèque C++, je sais pas ce qu'elle fais. Si je vais voir http://atlastk.org/ (pas de https ?), tu nous dis que c'est du C++ donc c'est rapide. Si tu ne le corrobore pas avec des benchmarks c'est du vent. Tu nous explique pas en quoi ta bibliothèque est performante. Quelle archi est-ce que tu utilise ? Comment-est-ce que tu t'assure que tes bindings restent performant ? Tu connais netty ? C'est ce qui permet à Java d'être performant sur le réseau, il faut vraiment avoir des arguments pour pouvoir dire qu'on est plus performant que ça.
La mise en œuvre
D'un point de vu utilisateur
Ton code nous montre du html dans des String. Donc on peut dire au revoir à la validation du html. On peut faire autrement ? Très bien montre nous et c'est là dessus qu'on évaluera si c'est facile ou pas. Tu nous montre aussi des manipulation de DOM, c'est affreux à utiliser... et c'est extrêmement lent ! C'est bien pour ça que toutes les techno utilisent un DOM virtuel... Aie...
D'un point de vu conception
Si je regarde Atlas.jar c'est ta classe principale, hein ? Tu as des chemins codés en dur dans ton code... C'est pas une question de java, il n'y a pas de langage dans le quel c'est une bonne pratique...
Tu lance des Threads non managés. Tu ne les nettoie pas. Ton code explose, c'est une garantie.
D'après toi qu'est-ce qui est affiché par ce code ?
Même si tu ne lançais un thread qu'à chaque connexion, ça exploserais à quelques dizaines de milliers de connexions. Le problème ce n'est pas que tu refuserais des connexions, mais bien que le serveur tombe à ce moment là...
Tentons de voir s'il n'y a pas un truc que je rate dans ton code. Si je tente de lancer ton premier exemple :
michel@MBA:/tmp/tmp.msaUgm9EXO % java -cp .:Atlas.jar Hello
java.lang.UnsupportedOperationException: The BROWSE action is not supported on the current platform!
at java.awt.Desktop.checkActionSupport(Desktop.java:225)
at java.awt.Desktop.browse(Desktop.java:381)
at info.q37.xdhq.dom.DOM_DEMO.<init>(DOM_DEMO.java:154)
at info.q37.xdhq.DOM.<init>(DOM.java:48)
at info.q37.atlas.DOM.<init>(DOM.java:24)
at info.q37.atlas.Atlas.<init>(Atlas.java:28)
at Hello.<init>(Hello.java:3)
at Hello.main(Hello.java:48)
Exception in thread "Thread-0" java.lang.NullPointerException
at info.q37.xdhq.DOM.getAction(DOM.java:62)
at info.q37.atlas.Atlas.run(Atlas.java:38)
at java.lang.Thread.run(Thread.java:748)
Mais ça continue à s'exécuter, mais il n'écoute pas de port. Awt c'est une bibliothèque graphique, je ne sais pas ce que ça vient faire là, je pensais lancer un serveur web... Le code lance, une classe démo de ta bibliothèque ?...
Bon je vais plus loin, en farfouillant ton code je vois qu'il y a un mode PROD face à un mode DEV ou DEMO (selon où on se trouve ça n'a pas le même nom...). En suivant des trucs et des bidules dans la classe XDH, je trouve la méthode statique isDev() qui vérifie que la variable d'environnement EPEIOS_SRC existe. Soit on va la positionner et voir ce que ça donne.
michel@MBA:/tmp/tmp.msaUgm9EXO [130]% EPEIOS_SRC=foo java -cp .:Atlas.jar Hello
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jreq in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at info.q37.jreq.Wrapper.Init(JRE.java:56)
at info.q37.jreq.JRE.register(JRE.java:67)
at info.q37.xdhq.XDH_PROD.<clinit>(XDH_PROD.java:27)
at info.q37.xdhq.XDH.launch(XDH.java:65)
at info.q37.atlas.Atlas.launch(Atlas.java:135)
at info.q37.atlas.Atlas.launch(Atlas.java:170)
at Hello.main(Hello.java:45)
Et c'est reparti...
Tu tente de charger une bibliothèque "jreq" que je n'ai semble-t'il pas. Quand je lance ton truc dans mon debuggeur je tombe sur la classe Wrapper de la bibliothèque atlas), elle contient une méthode getLocation() dont voici l'implémentation :
Donc cette fameuse variable d'environnement sert à définir où se trouve des binaires (en plus de définir si on utilise le mode prod ou pas...), mais elle ne permet pas de choisir où ça se trouve soit on ne la définit pas et on lance le truc en démo et cherche le binaire dans le dossier courant (spoiler alert : même si j'avais pu lancer le browser, ça aurait planté), soit je la défini et faut que j'aille la chercher chez toi.
Je vais m'arrêter là, je ne peux pas faire fonctionner ton truc sans patcher ta bibliothèque. Fais des tests, pour vérifier que ton truc peut se lancer. Si tu veux des conseils :
commence par utiliser un IDE java, il te listera un tas d'erreurs que tu fais
une fois que tu les aura toutes corrigée, joue avec sonarqube il t'en donnera d'autres
arrête définitivement les chemins en dur où que ce soit
segmente les choses si pour toi factoriser c'est donner 2 sémantiques à une même variable, c'est vraiment un problème (et je t'en donne l'exemple ci-dessus)
même si tout ça avait fonctionné je suis certain de faire exploser le serveur sans problème vu la gestion des threads
garde l'humilité d'aller voir ce qui se fait ailleurs
si tu veux qu'on passe du temps à apprendre ton truc explique nous ce qu'il a de plus et être en C++ ça n'est pas une bonne raison (surtout si c'est pour tout coder en java)
J'ai passé du temps a regarder ce que tu as fais et à rédiger mon commentaire (il est mieux construit au début qu'à la fin, mais c'est la fatigue), je suis réellement allé cherché ton code et j'ai tenté de le lancer. Comprends que si ton truc ne marche pas en y aillant passé environ 1h30 à 2h, c'est qu'il y a un vrai problème. Je connais le java et je peux aller voir ce qu'il s'y passe. J'aurais pu lancer n'importe quel hello world vu, angular, react, elm, python ou brainfuck en 10 minutes. En terme de qualité c'est très loin de ce que l'on peut attendre d'un truc qu'on voudrait réutiliser (dans un cadre professionnel ou pas).
# Désolé
Posté par barmic . En réponse au journal Du développement full-stack en Java. Évalué à 10. Dernière modification le 03 août 2018 à 21:56.
Sommaire
Salut ! Je vais prendre le temps de te dire ce que je pense de ton approche :) Ça va peut être être rude, mais comprends bien que si je prends du temps pour écrire un commentaire c'est bien que je veux être constructif. De plus je distingue totalement ton travaille de la personne que tu es (c'est important). Mais il y a pas mal de choses à dire je trouve.
Ton approche
Background
Tu connais le C++, tu vis le C++ en autarcie, tu nous explique à longueur de journée que les pratiques classiques comme les tests ne sont pas pour toi. En informatique comme ailleurs affirmer que l'on est plus malin/différents/le cas à part, c'est se tromper. Tu as des centaines de milliers de personnes dans le monde qui après une cinquantaine d'années à tenter de construire une certaine qualité logicielle. Arriver et dédaigner leur travail, par un « bof c'est pour les autres », c'est forcément se tromper. On exerce une science dure, pour affirmer des choses il faut avoir des arguments autre que « je fais de la factorisation poussée » (personne d'autre ne factorise ?). De tout ce que tu nous as décrit ça "fonctionne" parce que tu es le seul à coder et que tu accepte de voir très tard les bugs (tu reconstruit les autres logiciels et tu teste s'il plantent).
Tu pars donc très très très mal : tu nous propose d'utiliser un code pas tester (yay !), mais pour quoi donc ?
Objectif
Tu ne sais faire que du C++, quelqu'un te demande de faire du web, tu fais du web en C++. Très bien. Mais la populace fais déjà du web avec un tas d'autres choses. Il va falloir nous donner une raison d'abandonner nos stack libres bien plus fiables que la tienne (dont le copyright est partagé, supporté par une communauté, testée, testée massivement,...).
En plus du web, il existe un énorme paquet de techno qui apparaît. Ça signifie qu'il y a déjà énormément d'idées qui ont étaient essayée. D'autant que ça fais des années que ça dure !
Tu ne nous a pas donné d'autres arguments sur le pourquoi utiliser ta pile autre que c'est du C++ et c'est simple... oui mais.
Alternatives
Tu n'a aucune idée de si c'est simple, tu en ai l'utilisateur-codeur et tu n'es même pas allé voir ce qui se fait ailleurs. On ne souffre pas la comparaison quand on en fait pas mais on va forcément la faire pour toi. Qu'est-ce que ça donne comparé à du CGI ? Qu'est-ce que ça donne face à Wt ? Pourquoi les gens choisiraient le code d'un développeur dans son garage (pas testé) par rapport à tout ce qui peut exister ailleurs ?
J'ai parlé de techno C++, mais alors j'ai pas de doute qu'en PHP, Java et JS c'est pire encore.
Finalement
En vrai je ne sais pas pourquoi tu nous présente des plus ou moins portages dans d'autres langages, tu ne les utilise pas et tu n'explique pas en quoi les développeurs de ce langage gagneraient à utiliser ton code.
Pire encore, tu nous parle d'une bibliothèque C++, je sais pas ce qu'elle fais. Si je vais voir http://atlastk.org/ (pas de https ?), tu nous dis que c'est du C++ donc c'est rapide. Si tu ne le corrobore pas avec des benchmarks c'est du vent. Tu nous explique pas en quoi ta bibliothèque est performante. Quelle archi est-ce que tu utilise ? Comment-est-ce que tu t'assure que tes bindings restent performant ? Tu connais netty ? C'est ce qui permet à Java d'être performant sur le réseau, il faut vraiment avoir des arguments pour pouvoir dire qu'on est plus performant que ça.
La mise en œuvre
D'un point de vu utilisateur
Ton code nous montre du html dans des
String. Donc on peut dire au revoir à la validation du html. On peut faire autrement ? Très bien montre nous et c'est là dessus qu'on évaluera si c'est facile ou pas. Tu nous montre aussi des manipulation de DOM, c'est affreux à utiliser... et c'est extrêmement lent ! C'est bien pour ça que toutes les techno utilisent un DOM virtuel... Aie...D'un point de vu conception
Si je regarde
Atlas.jarc'est ta classe principale, hein ? Tu as des chemins codés en dur dans ton code... C'est pas une question de java, il n'y a pas de langage dans le quel c'est une bonne pratique...Tu lance des Threads non managés. Tu ne les nettoie pas. Ton code explose, c'est une garantie.
D'après toi qu'est-ce qui est affiché par ce code ?
Même si tu ne lançais un thread qu'à chaque connexion, ça exploserais à quelques dizaines de milliers de connexions. Le problème ce n'est pas que tu refuserais des connexions, mais bien que le serveur tombe à ce moment là...
Tentons de voir s'il n'y a pas un truc que je rate dans ton code. Si je tente de lancer ton premier exemple :
Mais ça continue à s'exécuter, mais il n'écoute pas de port. Awt c'est une bibliothèque graphique, je ne sais pas ce que ça vient faire là, je pensais lancer un serveur web... Le code lance, une classe démo de ta bibliothèque ?...
Je vais un peu plus loin. Tu tente silencieusement d'accéder à "http://atlastk.org/atlas.php?_token=c6f39490-1d1d-4e1d-9f21-b7eec4935e5d". Là ça commence à vraiment être mauvais tu piste potentiellement les gens qui utilisent ta techno...
Bon je vais plus loin, en farfouillant ton code je vois qu'il y a un mode PROD face à un mode DEV ou DEMO (selon où on se trouve ça n'a pas le même nom...). En suivant des trucs et des bidules dans la classe XDH, je trouve la méthode statique
isDev()qui vérifie que la variable d'environnementEPEIOS_SRCexiste. Soit on va la positionner et voir ce que ça donne.Et c'est reparti...
Tu tente de charger une bibliothèque "jreq" que je n'ai semble-t'il pas. Quand je lance ton truc dans mon debuggeur je tombe sur la classe
Wrapperde la bibliothèque atlas), elle contient une méthodegetLocation()dont voici l'implémentation :Donc cette fameuse variable d'environnement sert à définir où se trouve des binaires (en plus de définir si on utilise le mode prod ou pas...), mais elle ne permet pas de choisir où ça se trouve soit on ne la définit pas et on lance le truc en démo et cherche le binaire dans le dossier courant (spoiler alert : même si j'avais pu lancer le browser, ça aurait planté), soit je la défini et faut que j'aille la chercher chez toi.
Je vais m'arrêter là, je ne peux pas faire fonctionner ton truc sans patcher ta bibliothèque. Fais des tests, pour vérifier que ton truc peut se lancer. Si tu veux des conseils :
Pour ma première partie :
J'ai passé du temps a regarder ce que tu as fais et à rédiger mon commentaire (il est mieux construit au début qu'à la fin, mais c'est la fatigue), je suis réellement allé cherché ton code et j'ai tenté de le lancer. Comprends que si ton truc ne marche pas en y aillant passé environ 1h30 à 2h, c'est qu'il y a un vrai problème. Je connais le java et je peux aller voir ce qu'il s'y passe. J'aurais pu lancer n'importe quel hello world vu, angular, react, elm, python ou brainfuck en 10 minutes. En terme de qualité c'est très loin de ce que l'on peut attendre d'un truc qu'on voudrait réutiliser (dans un cadre professionnel ou pas).