• # Désolé

    Posté par . 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.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 ?

    public void foo() {
     System.out.println("start");
     new Thread(() -> {
     try {
     Thread.sleep(1_000);
     } catch (InterruptedException e) {
     e.printStackTrace();
     }
     System.out.println("Hello");
     }).start();
     System.out.println("end");
    }

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

    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'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 :

    protected static String getLocation() {
     String var0 = System.getProperty("os.name").toLowerCase();
     if (System.getenv("EPEIOS_SRC") == null) {
     return "./";
     } else if (var0.contains("windows")) {
     return "h:/bin/";
     } else {
     return var0.contains("mac") ? "/Users/csimon/bin/" : "/home/csimon/bin/";
     }
    }

    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
    • lis la doc des API que tu utilise, pour le plantage que j'ai en mode démo, tu aurais pu le corrigé si tu avais lu la seule ligne de la doc en question. Pour être magnanime voici le code qui pourrait corriger ça : https://github.com/chatty/chatty/issues/17

    Pour ma première partie :

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