Idées sur le développement
Quelques idées postées sur LinkedIn que je regroupe ici. Elles concernent toutes plus ou moins le développement dans un cadre professionnel.Vous pouvez aller sur un paragraphe au hasard.
Vous pouvez aller aussi sur les chapitres suivants:
- Grands principes
- Livres
Devises du programmeur
Tout le monde connait le célèbre "tester c'est douter". D'autres connaissent le moins familier "corriger, c'est abdiquer". J'ai donc inventé de nouvelles devises du (mauvais?) développeur:- Maintenir, c'est se punir.
- Commenter, c'est radoter.
- Démontrer, c'est folâtrer.
- Spécifier, c'est tyranniser.
- Insister, c'est s'enfoncer.
- Releaser, c'est se résigner.
- Suivre les spécs, c'est s'humilier.
- Trouver un bogue, c'est faire preuve de méchanceté.
- Déboguer, c'est manquer de foi.
Le développeur est-il un chaman moderne?
Déjà, le programmeur écrit des incantations dans des langages étranges et inhumains.Pour rentrer en transe, il boit des mixtures exotiques (appelées souvent 'café' et pour les pires d'entre eux 'thé').
Il communique directement avec le monde des esprits (l'internet) dont il est le seul à maitriser certaines clés.
Il invoque parfois des esprits pour l'aider grâce à une magie millénaire, appelée Google. Ainsi il fait parfois apparaître le grand Manitou aux Mille Réponses, appelé StackOverflow.
Il a au moins un animal-totem: la souris.
Certains d'entre les développeurs éliminent des vermines, appelées 'bogues'. Quelques malfaisants parmi eux créent des virus qu'ils projettent sur d'innocentes victimes.
Mes retours d'expérience provisoires sur mon fil de posts LinkedIn
Si je n'ai pas de like ou de commentaire sur un post, LinkedIn m'houspille le lendemain comme poisson pourri. S'il y a un peu d'activité sur un post je fais 200-700 impressions en moyenne. Si Rudy Onfroy commente alors là je fais des milliers de vues.Pourquoi je fais ça? Parce que ça me plait d'être créatif avec la contrainte de rester dans le domaine professionnel et que ça peut être utile.
J'ai une idée, je commence à écrire un post et à l'étoffer dans un process qui dure une semaine environ. Puis "j'édulcore" ce que j'écris. Par exemple je ne dis pas 'paresseux' mais 'économe en moyens'. Il y a d'autres mots plus grossiers mais justement j'évite aussi de les mettre dans ce post.
Ah oui et tout ça je ne le fais PAS dans mes heures de travail. Je m'amuse c'est tout, en espérant vous faire sourire, vous apprendre quelque chose ou vous permettre de voir des choses autrement.
Les petits lutins
J'accusais ceux-ci d'avoir fait une farce quand il y avait un bogue dans mes programmes.Selon certaines superstitions, les lutins seraient les seuls esprits de la nature à s'intéresser aux technologies avancées. Il serait ainsi de bon ton de leur laisser un peu de nourriture auprès d'un PC pour que celui-ci fonctionne bien.
Quand je vais à la pharmacie, les médicaments tombent d'en haut. Je pensais que c'était des petits lutins qui faisaient cela. Illusion! La pharmacienne m'a expliqué que c'était un bête robot qu'ils remplissaient plusieurs fois par jour.
Tout le monde sait aussi que ChatGPT utilise une armée de petits lutins pour répondre aux questions. Qui osera demander la libération de nos amis du joug d'OpenAI? 😀😀😀
Doers/Talkers
Alors il y aurait les 'doers' (faiseurs) et les 'talkers' (beaux parleurs). Il y aurait aussi un réservoir d'énergie psychologique en nous qui serait vidé de la même façon par les actions ou les paroles.Pérorer fatiguerait autant que faire. La parole peut être un substitut à l'action. Ainsi, on retrouverait l'adage: c'est ceux qui en parlent le plus, qui en font le moins.
En général, les brasseurs de vent réussissent mieux dans les grandes entreprises.
Dans le domaine du développement logiciel, ne sommes-nous pas tous des 'talkers' car écrire du code, c'est s'exprimer dans un langage même s'il est informatique. Et cela nécessite aussi de parler avec ceux pour qui on va coder.
Notez que je n'ai rien contre les ventilateurs (😀); ils sont efficaces à leur façon. De plus, il y a souvent des problèmes de communication dans les entreprises, ils ont donc pleinement leur utilité.
Livres
"Artisanat logiciel propre" de Robert C. Martin
Ce livre est très intéressant mais difficile à mettre en place.Ainsi, il y a des pré-requis pour l'appliquer dans la "vie réelle". Il faut du TDD à 100% sur le back, eh oui aussi sur le front et même rendre les procédures de déploiement testables...
Puis avoir une seule version du logiciel; si vous livrez un framework ou une librairie versionné, vos utilisateurs ne seront peut-être pas contents de vos ré-usinages intempestifs. Oncle Bob (surnom de l'auteur) réclame le courage de ré-usiner à tout va.
D'ailleurs ce tonton est bien exigeant: j'ai l'impression que le développeur doit beaucoup donner mais que reçoit-il en échange?
Un chapitre immédiatement applicable concernait les obstacles au 'bon' développement dont les réunions, l'écoute de musique et l'état de flow.
"Architecture logicielle propre" de Robert C. Martin
Dans toute ma carrière, je n'ai jamais vu un logiciel fait de cette façon.Les règles métiers devraient être dans leur coin et ne dépendre que du minimum (le JDK en java et la STL en C++).
Le reste, l'IHM, la BDD, le châssis devraient en dépendre mais surtout pas l'inverse. Tous ces machins là devraient être des détails d'implémentation.
Mais bon pour moi la majeure partie du code est dans ces "détails". C'est intéressant ces histoires de composants et de frontières, mais j'aimerais bien voir un cas réel d'implémentation.
Intéressant à lire en tout cas cet ouvrage.
"Refactoring" de Martin Fowler
À raison d'un refacto par soir juste avant de me coucher. Il ne faut pas être dogmatique dans le choix des ré-usinages. Ainsi, dans ce bouquin sont présentés à la fois un ré-usinage et quelques pages plus loin son inverse.L'auteur n'est pas contre l'héritage en POO, qui lui semble parfois plus simple. Il procède par petites touches en ayant pendant quelques minutes du code intermédiaire non finalisé.
Il y a un gros prérequis: avoir des tests efficaces et rapides. Et peut-être n'avoir qu'une seule version du logiciel en production.
Ça reste un peu rébarbatif à lire, même si c'est intéressant.
"Power, les 48 lois du pouvoir de Robert Greene
Livre intéressant, très cynique mais rationnel.Ca ressemble à du Dilbert sauf qu'il y a zéro humour et que les exemples sont tirés de l'histoire et non de la vie réelle en entreprise.
Après, est-ce que l'auteur a acquis grâce à ses sages conseils une position prééminente? Je suis un peu dubitatif là-dessus.
Et puis je n'aime pas trop son leitmotiv de duper les gens.
Il y a quelques bonnes idées dans ce bouquin. Choisir ce qui peut servir et laisser tomber le reste.
Il peut aussi servir de vaccin vis-à-vis de certaines pratiques plus ou moins toxiques.
"Mon cours de bonheur" par Tal Ben-shahar
Il y a un chapitre sur la vie professionnelle. Il regroupe tout dans un acronyme 'SPIRE'.- S pour spiritualité; non pas la religion mais plutôt votre travail a-t-il un sens autre que la paie au bout du mois? Si oui, vous serez plus heureux.
- P pour physique: faites-vous de l'exercice? Restez-vous des heures assis devant votre écran sans vous lever du tout? Dormez-vous bien et suffisamment?
- I pour Intellectuel; ça, ça va dans le développement, il y a toujours des challenges intellectuels. Êtes-vous curieux, apprenez-vous de nouvelles choses?
- R pour Relationnel. Avez-vous des relations cordiales avec vos collègues? Avec le Covid et le télétravail c'est moins évident de nos jours de socialiser.
- E pour Émotionnel. On a tendance à 'écraser' les émotions dans le travail sauf la colère pour un chef. Ce n'est pas si sain que ça.
« Tous des idiots ? » de Thomas Erikson
Livre intéressant qui subdivise en quatre catégories les gens selon un diagramme classique en quatre cases : introverti/extraverti et orienté tâches/relations.C'est simple à comprendre, mais les différents profils sont un peu caricaturaux.
Il reste que les gens sont loin d'être tous pareils et qu'il faut adapter sa manière d'interagir avec eux.
Autre idée : une bonne équipe doit contenir un mélange des 4 types de personnalités et un bon manager doit éviter de ne prendre que des clones de lui-même.
Ce livre reste facile à lire. Bien entendu, l'auteur vend sa soupe et son site Web, pour plus de 100 €, permet d'obtenir votre couleur de personnalité selon ce système.
Post vérifié et retapé par DeepL Write. 😁
Rendons grâce aux divinités de Stack Overflow
qui résolvent tous les problèmes.😁😁😁Bon il m'arrive de plus en plus souvent de lire la documentation même si elle est souvent incomplète et très concise.
En tout cas je cherche ensuite avec Qwant des réponses sur le Web. Celui-ci marche quasiment aussi bien que Google, est français et se fiche de ma vie privée.
Si je ne trouve vraiment aucune réponse, c'est que j'ai du faire une grosse bêtise.
Le vieux code
c'est un peu comme les vieilles peintures pariétales: c'est beau, mais on ne sait plus trop ce que cela signifie.Du booléen, le plus simple des types
Il y a le boolean java très simple avec true et false.Puis le Boolean java qui rajoute null.
SQL rajoute unknown.
Javascript étend le concept avec null et undefined. J'ai vu au moins une API Javascript qui utilisait les 4 possibilités avec des sens tous différents.
En général, les valeurs supplémentaires sont souvent considérées comme false.
Les logiques tri-valuées existent en mathématiques, par exemple: vrai, faux, indéterminé. À la phrase 'je mens', on attribuera la valeur 'Indéterminé'. Le problème c'est qu'on perd le tiers exclu et qu'on ne peut plus faire des raisonnements par l'absurde, car dire que quelque chose n'est pas faux, c'est lui attribuer vrai OU indéterminé.
Une caractéristique du logiciel est qu'il n'est jamais vraiment fini.
Il évolue au fil des livraisons, des besoins des utilisateurs, des nouvelles versions de librairies ou frameworks.Dire qu'il est livré c'est comme dire "la pelouse est tondue". Surtout les sites Web.
Quand meurt-il vraiment? Ça dépend de tant de choses: d'un rachat, d'une décision politique interne, du hardware ou du software qui n'existe plus.
Il faut le maintenir parfois pendant des éons et beaucoup de logiciels sont 'sticky' (collants): une fois mis en production, ils sont difficiles à changer surtout s'ils ont un état avec une base de données. Car il faut alors prévoir une migration et ce n'est pas facile, facile.
Comment revenir en arrière sur une fonctionnalité qui a impacté des dizaines de fichiers source?
Et qui a été faite en plusieurs commits intercalés avec d'autres? Peut-être de quelques lignes à chaque fois mais sur une grande surface de code. Et dont le codage peut même être structurant.Il fallait bien sur au départ être sur que la fonctionnalité était vraiment intéressante et valait le risque d'être codée. Car il n'y aura pas de retour en arrière ou du moins il sera presque aussi coûteux que la programmation de la fonctionnalité.
Savoir précisément ce qui a été impacté est déjà une gageure.
Avec du TDD complet, c'est peut-être plus facile pour éviter les régressions et pouvoir faire le tout en un seul commit. Donc avec un seul commit à rollbacker.
On dira bien entendu: faire et défaire, c'est toujours travailler.
Le code le plus facile à maintenir est celui qui n'existe pas!
Nous accumulons au fil du temps des quantités de lignes; et parfois, elles ne servent plus à rien sinon à embrouiller le développeur avec des fausses pistes et de la maintenance inutile. J'ai autant de joie à supprimer du code qu'à en créer. De toute façon, pour une nouvelle création, il faut faire de la place et les vieux machins sont parfois en travers du chemin. La créativité est une médaille à deux faces: l'une est la création, l'autre est la destruction.Les étrangetés de java: l'implémentation des génériques et les mots réservés
Le compilateur java efface le type du générique et au runtime les objets du type du générique sont considérés comme des Object que la JVM caste à la demande.Pour garder une compatibilité ascendante de compilation des mots comme 'var' ne sont pas des mots clé standard mais des noms de type réservé; ils peuvent être utilisés comme nom de variable par exemple.
Le programme suivant compile et devinez ce qu'il fait:
var var = new ArrayList<String>(); List l = var; l.add(new Object()); l.get(0); Object o = var.get(0); String s = var.get(0);Oui: il produit une grosse ClassCastException sur le String s = …; le Object o = … passe! Avec les génériques, la JVM doit passer son temps à faire des casts.
Pour ou contre le 'var' en java?
Avantages: éviter d'écrire un type à coucher dehors et très pratique pour les String et autres StringBuilder. De plus, pour ajouter des champs ou des méthodes à une classe anonyme, c'est la seule solution:var o = new Object() {int index;};Vous pouvez faire o.index = 2 et le var est obligatoire car le type Object ne connait pas le champ index.
Inconvénients: le code est un peu moins lisible et comme il n'y a pas d'auto-complétion dans votre IDE préféré, vos noms de variable sont plus sujets aux typos.
Pour ma part, un var c'est bien pour un type du genre Optional<Map<String, Object>> qui est assez illisible. Pour les autres types plus simples, l'auto-complétion de l'IDE est un must. Je n'ai jamais vu de classe anonyme avec des champs ou des méthodes supplémentaires.
Le mensonge distribué
Quand le mensonge doit être dit et répété par plusieurs personnes à la fois, cela devient compliqué. Il faut que tout le monde soit au courant et dise la même chose fausse. Et si la conversation oblige à créer de nouveaux mensonges pour étayer le premier, il risque d'y avoir des problème de synchronisation entre les différentes personnes.De plus, certaines gens sont honnêtes et s'obliger à ne pas dire la vérité pourrait heurter leur conscience.
Tout ça pour dire, qu'il vaut mieux dire vrai, surtout pour un groupe entier.
Le seul mensonge collectif vraiment possible est celui par omission: garder un secret quoi.
Tests unitaires 'mockés'
Pour des TUs (Tests Unitaires), on peut mocker des méthodes d'instance et plus difficilement des méthodes statiques en java.Mais, il y a quelque chose que l'on ne peut pas mocker: ce sont les appels "super". Ce qui est fort dommage car ça oblige le TU à connaître trop profondément la super-classe de la classe testée (the class spills its guts in English).
D'ailleurs, c'est pourquoi je n'aime pas les initialisations par constructeurs dans Spring car la super-classe montre trop de choses, par exemple des dépendances à d'autres classes que ne devrait pas connaitre la sous-classe.
Le problème des super est vaste.
Il faudrait préférer la composition à l'héritage.
RTFM
Read The F...ing Manual. Lis ce fichu manuel en français.Voyons mon interprétation toute personnelle de cette expression. Lisez la documentation (ex le javadoc) avant de chercher sur Internet précisément la correction du bogue en vous jetant sur Google et consorts comme la misère sur le pauvre monde. 😊😊😊
Un consultant m'expliquait il y a des années que quand il incorporait une nouvelle librairie dans un projet informatique, il lisait sa documentation de bout en bout.
Enfin, ce sont des vœux pieux que moi-même je devrais plus appliquer.
Comment médire tranquillement sur Teams?
Déjà le mieux est que tous les protagonistes soient en télétravail, ainsi seuls les algorithmes, les gens de Microsoft et votre animal domestique pourront entendre vos ragots si vous parlez.Si vous commérez par écrit, effacez une fois lu vos calomnies pour ne pas risquer qu'elles soient visibles quand vous partagez votre écran.
Et jamais, jamais, n'envoyez de mail disant du mal de quelqu'un; vous ne savez jamais où il pourrait être redistribué.
God class
En programmation, une 'God class' est un objet unique qui connait tout le reste de l'application. Rare, je pense, pour les applications Web où les écrans sont souvent séparés les uns des autres.Erreurs de conscience
Les bogues en développement sont souvent des erreurs de conscience. Je ne suis pas conscient que telle ligne de code a tels impacts sur l'application et il en résulte un problème. Et devenir plus conscient est un beau but spirituel...Informatique expérimentale
Je pratique l'informatique expérimentale: essayer diverses combinaisons de code jusqu'à ce que cela fonctionne! En particulier certains composants Spring, le CSS et le SQL.Citations humoristiques de mes (anciens) collègues
J'espère qu'ils ne me colleront pas de procès pour violation de droits d'auteurs... 😀Je n'ai pas mis les phrases politiquement incorrectes.
- Cool, merci d’avoir fixé les inputs des batch (vous noterez les 5 mots français de cette phrase :D )
- Je peux être fin, mais là j'ai pas envie aujourd'hui.
- Est-ce que je peux remplacer Mail par Courriel comme le demande l'Académie française ?
- Ma foi interdit tout avatar.
- Le modèle Git est un graphe orienté, acyclique et connexe de commits.
- Le copié-collé c'est le meilleur ennemi du développeur
- Le meilleur ennemi du développeur c'est le développeur lui-même.
- Demande à ta brosse à dent.
- On va rester sur un échec comme ça demain on sera bien stimulé.
- Il faut envisager le cas où tout va bien et en profiter à ce moment-là.
Les étrangetés de java
Vous avez le code suivant:Integer a = 100; Integer b = 100; System.out.println(a == b); Integer c = 200; Integer d = 200; System.out.println(c == d);Qu'affiche-t-il? Eh bien:
true falseJava a un cache des entiers entre -128 et 127. Quand vous faites a = 100, il interprète cela comme a = Integer.valueOf(100) et il retourne un Integer venant d'un cache. Donc a et b vont pointer sur le même objet. Comme 200 > 127, les entiers c et d seront vraiment créés et donc n'auront pas la même référence.
Je ne suis pas certain que cette optimisation soit pertinente:
- si vous avez le malheur de faire un == entre deux Integer, ça pourrait marcher sur votre poste mais en production ça peut échouer si les entiers sont grands. Après les outils comme Sonar vont vous crier dessus si vous faites ce genre de choses.
- ça ne doit pas aider la JVM à optimiser et virer Integer pour ne se servir que de l'int.
- si vous avez à créer plein de grands entiers, eh bien vous aurez deux comparaisons gratuites à chaque génération d'Integer.
Qu'est-ce qu'un Spike?
Je ne parlerai pas ici du Covid mais de Scrum.Le but d’un spike, c’est de répondre à la question “Comment on fait ?” dans des cas compliqués où cette question n'a pas de réponse évidente. Par exemple, on va utiliser une nouvelle technologie que personne ne maitrise dans l'entourage proche.
On se donne quelques points à implémenter et une durée courte pour ce faire, du type un ou deux jours. On développe alors un prototype de code, non destiné immédiatement à la production. Et on essaie de programmer la solution la plus simple possible. Puis au final on documente en disant tout ce qu'on a appris en faisant ce spike, y compris les voies sans issue et on le présente à son entourage.
Billet d'humeur plaisantine
J'essaie de soudoyer mes collègues en leur promettant "ma reconnaissance éternelle". Je ne comprends pas, ça ne fonctionne pas.J'essaie aussi de leur indiquer qu'ils pourraient être gentils, généreux et offrir le repas du midi au restaurant. Mais là aussi, je suis déçu.
Je suggère aussi en rétrospective que nous soyons tous augmenté de 10%. Pas d'effet.
La vie est une longue suite de déceptions, comme disait quelqu'un.😀
ChatGPT
ChatGPT c'est juste une armée de petits lutins qui répondent aux questions des internautes. Et d'ailleurs ils sont gouvernés par la terreur. La vraie signification de ChatGPT, c'est Chat Général, Puissant et Terrifiant. Ce vilain matou menace de les manger et parfois fait un exemple par pure cruauté. Libérons nos amis les farfadets en boycottant cet ignoble serveur!Après dans la réalité, y-a-t-il beaucoup de petites mains derrière ce succès, pour rester politiquement correct par exemple? C'est une question légitime.
Bogue en java assez étonnant
J'écrivais du code pour faire des comptes sur un arbre de garanties.Integer i = 1; String s = "Bonjour"; System.out.println(i + ' ' + s);Ca affiche 33Bonjour.
Ca vous parait peut-être facile de comprendre ce bogue mais dans du code plus compliqué, ça m'a fait perdre du temps. J'ai compilé et recompilé et je ne comprenais pas.
En fait c'était tout à fait logique, le premier '+' additionnait l'entier 1 au caractère espace qui vaut 32 en ASCII d'où le 33 et la disparition de l'espace. Maintenant les accusés:
- Sonar qui n'aime pas les guillemets sur les chaînes d'un caractère et m'a donné l'habitude d'écrire ' ' au lieu de " ";
- un vilain tachon qui a du me jeter un sort par pure méchanceté gratuite.
Moulinette de génération de code
Un truc qu'ignore parfois les juniors, c'est qu'on peut faire des générateurs de code plutôt que tout écrire à la main. On peut ainsi partir d'un fichier Excel avec un tableau de données, le transformer en CSV. Puis on écrit du code dans son langage préféré pour transformer le fichier CSV en SQL, XML, JSON, HTML, etc...C'est mieux que faire des tas de copier-coller à la main qui sont risqués et ennuyeux à mourir. C'est aussi plus amusant d'écrire ce code de génération qui me prend, moi, d'une à deux heures par moulinette. J'ai acquis une certaine expertise dans le domaine et je code mieux ces moulinettes en java 17 qu'auparavant.
Les couleurs en informatique
La lumière est additive vis-à-vis des couleurs, par contre, celles réémises par la matière sont soustractives car il y a absorption de lumière.Ainsi les pixels des écrans sont lumineux er mélangent le rouge, le vert et le bleu. Et toutes ensemble ces couleurs font du blanc. Les encres d'imprimante sont de la matière et leurs couleurs soustractives sont le cyan (absorbe le rouge), le magenta (inverse du vert) et le jaune (complémentaire du bleu). Toutes ensemble, elles font du noir.
Quand un ordinateur imprime une image, il faut traduire les couleurs des pixels en celles d'encres.
La génération de l'aléa en informatique
Rien de plus difficile pour un ordinateur isolé que de créer du vrai hasard car c'est un système qui lorsqu'il fonctionne bien est déterministe. D'ailleurs les fonctions 'random' courantes générent un pseudo-hasard et un bon pirate à qui l'on donnerait une suite de nombres générés par ces méthodes serait capable de prédire les futurs tirages.C'est un problème si difficile qu'il y a un livre blanc de 20 pages de Microsoft sur le hasard dans Windows 10.
Il existe des dispositifs matériels pour générer de l'aléa avec des mécanismes basés sur la physique quantique (des miroirs semi-réfléchissants par exemple où un photon prend aléatoirement une direction ou une autre). Mais rien dans les postulats de la mécanique quantique ne garantit mathématiquement un hasard parfait (suites de Martin-Löf pour les matheux curieux) même s'il y ressemble.
Il existe aussi des méthodes diverses et variées pour générer de l'aléa: par exemple avec les mouvements de la souris ou d'autres aspects plus techniques (du type /dev/random sur Linux). Mais elles ne produisent qu'une assez faible quantité de bits aléatoires par seconde. Puis, avec ce hasard de base, on utilise des méthodes cryptographiques pour générer encore plus de bits aléatoires.
Pourquoi la qualité du hasard est-elle si importante? Parce qu'elle concerne tout ce qui est cryptographique. Sans hasard fort, pas de carte de crédit réputée inviolable. Quand vous allez sur un site en HTTPS, le hasard est nécessaire pour que personne ne puisse intercepter vos transferts de données entre votre navigateur et le serveur final distant.
Optimisations de base de données
Il y a bien sur la pose d'index, qui peuvent faire passer des requêtes de plusieurs minutes à une centaine de milli-secondes.Puis l'optimisation d'un batch d'extraction qui faisait tout via des Daos java. Il durait une heure et demie. Il est passé à une minute et demie en mettant tout dans une seule requête avec des join. Les bases de données relationnelles sont faites pour gérer de façon optimale des jointures; c'est leur cœur de métier...
Puis il y a le code qui fait une grosse requête pour récupérer des données sans aucun cache. Mettre un cache peut améliorer drastiquement les performances et la mémoire vive n'est pas très chère.
Autre optimisation: un code quasiment utilisé à chaque requête Web chargeait une collection inutile et compliquée. Mettre cette collection en Lazy a amélioré considérablement les performances.
Le passé
Une régression était une faute professionnelle pour un directeur il y a plus de 25 ans. Il doit être à la retraite maintenant.Je me rappelle du projet où en quelques mois il y avait du 80% de taux de rotation. Le management était basé sur la peur. Les caractères des gens étaient plutôt très forts. Un homme qui était dans cette SSII me rassurait: ce n'était pas comme ça dans les ESN "normales".
C'était une boîte presse-citron. Un manager m'avait dit par exemple de ne pas trop mettre la pression sur telle personne car c'était un X junior.
Rétrospectivement c'était amusant, à prendre au second degré. Je n'avais pas le système défensif et le cynisme requis pour survivre dans cette société à l'époque; j'étais jeune quoi.
En tout cas, j'y ai participé au projet le plus intéressant techniquement que j'ai jamais fait. Elle était reconnue comme ça cette entreprise par les prestataires d'autres SSII: très intéressante techniquement mais avec une ambiance de fin du monde.
A posteriori, j'aurais du jouer différemment, j'étais peu au courant des enjeux humains. Il y avait bien entendu beaucoup de positif dans cette boîte.
Je conseillerais à un junior d'aller, si possible, chez un éditeur de logiciel plutôt qu'une ESN. D'ailleurs le rêve à l'époque des salariés de cette société c'était d'être embauché par un client.
Program transformation
Ou comment des programmes peuvent changer du code. Par exemple pour faire des réusinages automatiques et sans danger.De ma propre expérience, j'ai surtout utilisé des scripts Shell Git Bash pour faire cela. Avec:
- iconv : conversion d'encodages;
- sed : recherche/remplacement de texte;
- find : trouver des fichiers source dans une arborescence;
- mv (pour écraser le fichier source avec le fichier temporaire transformé).
Autre exemple où j'ai utilisé find et grep -v pour virer une annotation java devenue inutile.
Blague de Noël 2023
On demande à un mathématicien, un physicien et un informaticien de citer la suite des nombres premiers:- le mathématicien: 2, 3, 5, 7; ouh c'est compliqué il faut que j'étudie ça de plus près;
- le physicien: 2, 3, 5, 7: facile l'expérience le montre c'est 2 et tous les nombres impairs pluq grands que 2;
- L'informaticien: 2, 3, 5, 5, 5, 5...
- le mathématicien dans toute sa rigueur, comprend que c'est une suite très compliquée, aux multiples secrets;
- le physicien fait des expériences et valide en en tenant compte ses théories. Là, s'il avait poussé plus loin son expérience il aurait vu que 9 invalidait sa théorie;
- l'informaticien a construit un programme bogué qui boucle indéfiniment.
Tendance sur le Javascript
Il y aurait une tendance actuelle à utiliser le Javascript natif plutôt que des frameworks ou des librairies spéciales.Ainsi, sur mon site perso, je vais éliminer JQuery. Pour cela, j'utiliserai directement le DOM:
- querySelector et getElementById pour récupérer des nœuds;
- les attributs onXXX avec des fonctions pour des clics par exemple;
- fetch (avec sa bizarre double promesse) plutôt que $.ajax J'avais préjugé que ce serait difficile de supprimer ce $.ajax, mais non c'est tout simple en fait;
- l'événement DOMContentLoaded pour savoir que tout est bien chargé;
- classList pour manipuler les classes.
L'obfuscation de code
Comme vous le savez peut-être on peut décompiler du code binaire java. Et le résultat est souvent assez lisible.Pour pallier à cela, il existe des obfuscateurs de code qui renomment par exemple tout ce qui est private en des noms à coucher dehors. Mais ils sont parfois difficiles à utiliser si vous voulez en plus que ce qui est public soit aussi obfusqué car certains champs publics doivent garder leur nom original, par exemple si on les traduit en Json.
Bien sur le code très mal écrit est parfois naturellement obfusqué.😀😀😀 L'un des pires codes que j'avais jamais vu était de l'assembleur transformé en C.
Il existe un concours de programmes obfusqués en C chaque année.
Quelques perles de code
Pourquoi faire simple quand on peut faire compliqué?!StringUtils.isNotBlank(...)StringUtils.isBlank(...) n'est sans doute pas assez confus.
((Double) object).toString()Le cast est inutile car toString est une méthode d'Object et on peut l'utiliser directement mais il faudrait faire confiance à la JVM qu'elle appelle la bonne méthode.
x != null && x === 0: // ceinture et bretellesx === 0 devrait faire la même chose, mais c'est trop simple et direct.
Une période anti-manager
Que j'ai eue à une lointaine époque, qui m'est passée avec la maturité. J'ai juste compris que c'était un autre métier, métier qui ne m'intéresse pas de faire car c'est un job vieux comme le monde, alors que celui de développeur est récent et plus nouveau.Selon Michael Teachings et ma propre connaissance de moi-même, je suis le but de flow, qui est de suivre les impulsions de la vie. Avec ce but je n'ai pas de grandes ambitions et de toute façon n'aie pas beaucoup d'attributs cardinaux.
Les moteurs Javascript modernes, v8 en particulier
Ils font des prouesses pour que les pages Web répondent vite.Ainsi v8 (le moteur Javascript de Chrome) joue les scripts en trois phases:
- Un pré-parsing qui fait le minimum syndical; il vérifie juste la syntaxe en gros. Grâce à lui le code inutilisé dans l'immédiat ne sera pas compilé mais laissé de côté en attendant. Cela accélère l'IHM car pas mal de code ne sera pas utilisé immédiatement ou est même carrément mort. Par exemple, on n'utilise pas toutes les fonctionnalités d'une librairie.
- Si le script est vraiment utilisé, alors il est compilé en bytecode et exécuté sous cette forme.
- Si vraiment, vraiment, vraiment ce code est beaucoup utilisé (par exemple dans une boucle) alors il est compilé en langage machine.
Plaisantons sur Sonar
Le fait est que Sonar n'aime pas les 'nombres magiques', c'est-à-dire des chiffres écrits directement dans le code; il préfère qu'ils soient mis dans des constantes pour avoir au moins une idée de ce qu'ils représentent.Je fais la proposition-farce de code suivante:
public interface SonarConstants { int TWO = 2; int THREE = 3; // ... ou mieux encore int N2 = 2; int N3 = 3; }La meilleure option est d'utiliser un anti-pattern et ainsi d'implémenter directement cette interface pour disposer joyeusement de toutes ces constantes.😀
Si on est pressé, on peut se retrouver malheureusement à faire ce genre de chose. Mais ce n'est vraiment pas une bonne pratique de contourner Sonar de cette manière et il vaut mieux résister à la tentation en mettant des noms de constante ayant du sens.
Le code ne ment jamais?
Mais avec C++ ou Scala, beaucoup de choses peuvent être difficiles à comprendre avec des surcharges. Il y a aussi le concours de C obfusqué chaque année. C'est ce que j'apprécie avec Java: il est certes assez verbeux mais le code fait ce qu'on lui indique, sans grande finasserie.Bonne année 2024 à tout le monde
Tous mes vœux de bonheur à vous et vos proches.Comme aujourd'hui est férié, ce sera un post humoristique. Pour moi, l'humour c'est très sérieux.
C'est bien d'avoir plus de 50 ans; comme bonne résolution, je vais radoter sur LinkedIn, c'est-à-dire m'autoriser à répéter parfois d'anciens posts en les modifiant plus ou moins.
Je commence de suite d'ailleurs en rappelant les 5 rôles en réunion du principe de Dilbert dont le radoteur fait partie:
- le sadique bien intentionné (qui colle une réunion le vendredi à 18h);
- le martyr gémissant (qui se plaint de sa charge de travail);
- le maître de l'évidence (le bénéfice, c'est la différence entre les recettes et les dépenses);
- le dormeur;
- et... Le radoteur (qui rapporte de vieilles anecdotes sans rapport avec le sujet débattu).
Quelques expressions sur le diable
Tirer le diable par la queue. Ça doit arriver aux start-ups en mal de financement. Je ne le souhaite à personne.Le diable est dans les détails. Dans un logiciel, un seul petit détail oublié et c'est le bogue assuré. Ça me rappelle aussi oncle Bob qui dit que le châssis, la BDD et en gros tout le côté technique sont des détails. Sauf que ça doit bien représenter une grosse part de l'application ces 'détails'.
Le diable vient sans être invité. Sauf si vous avez posé une bombe logique, les bogues en production arrivent sans crier gare.
Mieux vaut le diable que je connais que l'Ange dont je ne sais rien. Travailler avec quelqu'un dont on connait les défauts est parfois meilleur qu'essayer de bosser avec une autre personne qui serait 'supérieure'.
Au diable les varices! Juste pour rire, c'est au diable l'avarice normalement.
Blink, le moteur de rendu de Chromium
Blink veut dire clin d'œil en anglais, peut-être pour signifier qu'il est très rapide.ll est multi-process: il y a un process principal du navigateur et plusieurs process de rendu.
Les process de rendu correspondent chacun à un site Web pour améliorer la sécurité en ne mélangeant pas les espaces mémoire mais pas toujours pour des raisons d'économie de mémoire. Un process de rendu est quasiment mono-threadé et utilise de l'asynchrone pour les opérations longues, comme exécuter du javascript. Il peut geler si le javascript fait un très long traitement.
Il laisse le soin au système d'exploitation de nettoyer toutes les ressources utilisées après la mort du process, par exemple la mémoire.
La créativité prend parfois du temps
Quelques fois il me faut une nuit ou plusieurs jours pour avoir la 'bonne' idée qui peut d'ailleurs survenir dans une activité calme (comme marcher) à tout moment.Paradoxalement, se rendre déjà compte qu'il y a un problème peut prendre des mois, des années. Le regard des autres peut alors être important. Ainsi, mieux vaut s'entourer de gens francs et diplomates.
La cohérence de cache
Sur les systèmes multiprocesseurs, les CPU ont des caches et n'accèdent pas directement à la mémoire vive. Ces caches pourraient donner une vue incohérente de la RAM: un cache disant que telle adresse contient l'octet 1, un autre disant que la même adresse contient l'octet 2. Ça rend difficile la programmation si ces caches sont vidés plus tard dans la mémoire centrale. C'est là que rentre en jeu la cohérence de cache; celle-ci permet de donner aux différents CPU la même information sur la RAM.Pour java, ça permet de traiter les synchronized et volatile en une seule instruction de verrou. Cependant, le modèle java de mémoire permet les caches incohérents et dans ce cas sur un volatile ou un synchronized il faut vider le cache en plus. La plupart des machines ont des caches cohérents, ce qui facilite grandement la programmation multi-tâches. Je me demande si les classes comme ConcurrentHashMap fonctionneraient bien avec un modèle mémoire de java implémenté de façon minimale, sans cohérence de cache.
Bonnes réponses habituelles fournies par les développeurs
Ce n'est pas un bogue c'est une feature. Ça marche en local chez moi.Les plus vilains d'entre eux pourraient suggérer que le problème réel est entre la chaise et l'écran du plaignant. Les gourmands suggéreront d'augmenter la puissance et surtout la RAM du serveur. Les délais, toujours trop courts, seront invoqués, ou le manque de spécification claire. Ou, pour les astrologues, que les planètes sont mal alignées, mais revenez demain, je serai mieux luné.
Le développeur peut aussi dire: c'est normal, c'est moi qui fais tout.
'Bonnes pratiques'
Que j'essaie d'utiliser, même si j'ai des doutes sur toutes ces manières de coder.Utiliser des classes au lieu de l'attribut style dans CSS.
POO au lieu de procédural. Mais là je nuance: avec peu de structures de données et beaucoup de fonctionnalités, le procédural est mieux adapté. En ce moment de toute façon, je fais plus du procédural avec des services composés de multiples fonctions.
Composition au lieu d'héritage, ce qui contredit le 'O' de SOLID quelque part.
Des petites fonctions bien nommées plutôt que de grosses fonctions. C'est parait-il plus facile à lire et en quelque sorte 'auto-commenté'.
Projection
Quelques commentaires sur le phénomène courant de la projection pour relativiser certains feedbacks négatifs en entreprise.Une personne dira du mal ou du bien d'une autre car elle a elle-même plus ou moins consciemment le comportement reproché ou apprécié.
J'avais une connaissance qui écoutait les gens médire et quand ceux-ci lui demandaient pourquoi il ne leur posait pas de question, il leur disait qu'il en savait finalement assez sur eux.
Je l'ai souvent observé ce principe de la projection dans ma vie professionnelle. Je ne donnerai pas d'exemple.😀
Je me suis vu aussi accuser d'autres personnes de comportements que j'avais moi-même.
Un cas classique est celui de l'interviewer qui parle beaucoup, est content de lui-même et finalement note positivement l'interviewé.
Des étrangetés de undefined en Javascript
Dans la console Chrome tapons:a={b: 'b', c:null}Rien de spécial Chrome affiche:
{b: 'b', c: null}a.e affiche undefined. Maintenant on fait:
a.e=undefineda.e donne alors undefined. Mais par contre quand on affiche a, on a:
{b: 'b', c: null, e: undefined}a.hasOwnProperty('e'); retourne true. Maintenant:
delete a.b;a.b retourne undefined mais b a complètement disparu de a qui est égal à:
{c: null, e: undefined}delete est donc plus fort que l'affectation d'un champ à undefined. Autre chose si on fait maintenant:
JSON.stringify(a)On obtient:
'{"c":null}'Le null est conservé mais pas le undefined!
Tout cela est plutôt étrange, n'est-ce pas?
Utiliser les ressources humaines à 80%
De telle façon qu'on évite que les tâches s'empilent et qu'il y aie création de files d'attente; avec ce 20% de 'gras', on peut faire les tâches soudaines.Dans le domaine des files d'attente, vous avez peut-être noté qu'à la Fnac, il n'y avait maintenant qu'une seule queue pour plusieurs caisses. Et bien ce sont des files 'M/M/1' et c'est mathématiquement prouvé qu'elles sont plus efficaces qu'une file par guichetier. Par exemple, s'il y a un client qui prend 1/2 heure, il ne bloquera pas tous les gens de sa file. Les autres consommateurs plus rapides pourront bénéficier des autres caisses.
Après est-ce que ça peut être transposé au développement? Ça suppose que les programmeurs sont polyvalents.
LinkedIn: Bonjour Jean-François, êtes-vous actuellement à la recherche d’un emploi ?
Votre réponse n’est visible que par vous. 'Oui', 'Non, mais je suis à l’écoute'.J'aimerais bien répondre 'non' tout court. Je suis sur ce réseau social pour lire parfois quelque chose d'intéressant et pour poster des bêtises une fois par semaine.
Le développement: de la physique ou des mathématiques ?
Le développement en TDD se rapprocherait plus de la physique que des mathématiques. Les tests peuvent juste montrer une erreur dans le code et indiquer qu'il n'est pas correct car un test a raté; comme en physique où seule une expérience peut infirmer une théorie mais pas la prouver à 100%.La programmation peut se rapprocher des mathématiques quand on a besoin pour des systèmes critiques de prouver le fonctionnement parfait du code. Il existe des méthodologies pour ce faire; j'ai connu un peu la méthode Z qui permet de spécifier formellement et rigoureusement un logiciel. Le métro de la ligne 14 avait son programme écrit à partir de cette méthodologie.
La meilleure des méthodologies en développement
Voulez-vous connaître la méthodologie logicielle la mieux adaptée à tout?Celle qui a été testée, re-testée pendant des années.
Qui a été pratiquée pendant des années et améliorée au fur et à mesure.
Mieux que Scrum, le cycle en V, ou le concept de l'agilité:
April's fool...
PWA
Progressive Web Application (application web progressive en français).Cela consiste en une application web qui est formée de pages ou de sites web, et qui peut apparaître à l'utilisateur de la même manière que les applications natives ou les applications mobiles.
Ça permet de diminuer le coût de développement: plus besoin de faire un programme spécifique pour Android ou iOS.
Une application PWA est installable: l'utilisation d'un fichier manifest permet de proposer, à l'instar d'une application mobile native, l'installation d'un raccourci sur l'écran d'accueil du terminal mobile.
Elle peut même, grâce à un cache, fonctionner en hors ligne.
Tout cela est du aux navigateurs modernes suffisamment puissants et rapides.
Exemple: un fournisseur pour notre CSE nous disait qu'il préférait faire une application Web plutôt qu'une application spécifique pour Android et iOS.
Un jira et ça ira
Jira, jira pas.Vous reprendrez bien une Jirafe?
Pas de jira et rien ne fera car cela signifie qu'il n'y a pas de budget alloué à la tâche donc que ce n'est pas important.
Destin d'un ticket Jira. Un ticket Jira clos, donc mort, peut être réouvert donc ressuscité. C'est plus difficile avec un être humain.😀
Incantation humoristique de la pentecôte 2024
C'est férié aujourd'hui donc rien de sérieux.
Ô vous grands esprits du 𝔍𝔦𝔯𝔞, de ℭ𝔥𝔞𝔱𝔊𝔓𝔗, de 𝔊𝔬𝔬𝔤𝔩𝔢 et de 𝔖𝔱𝔞𝔠𝔨 𝔒𝔳𝔢𝔯𝔣𝔩𝔬𝔴, je vous demande humblement de prendre en compte mes requêtes.
Je souhaite, que par votre illustre puissance, tous les bogues rencontrés soient corrigés fissa.
Que les nouvelles fonctionnalités soient implémentées sans difficulté, par moi et mes frères développeurs.
Que jamais les clients ou les recruteurs ne tentent de rogner les budgets.
Que demain, on rase gratis.
On ne sait jamais, sur un malentendu, ça peut marcher. Pourquoi ne pas essayer ? 😀
Pourquoi est-ce que j'aime les posts de développeurs sur LinkedIn ?
Même si tous ne m'intéressent pas forcément.Parce qu'ils me permettent d'apprendre de nouvelles choses sur le développement.
Un exemple pour moi: on n'a pas vraiment besoin d'utiliser JQuery et donc j'ai supprimé cette librairie de mon site personnel.
Les lecteurs n'ont pas tous le même niveau de connaissance sur un sujet donné. Un sujet qui semble rebattu et connu pour vous, ne l'est peut-être pas pour moi.
Un truc que j'ai vécu en participant à un concours de nouvelles, c'est qu'il y aura toujours des gens contre ce que vous écrivez, mais il y aura aussi des gens pour; il suffit que mon écrit rencontre son bon public.
Une citation d'Erving Polster: nul ne peut échapper au fait d'être intéressant. Donc à vous les développeurs, continuez à poster!
On ne teste jamais deux fois le même programme
Comme on ne se baigne jamais deux fois dans la même rivière.Pourquoi? Parce que la mémoire de l'ordinateur aura changé et ne sera pas exactement la même; et donc les objets en RAM auront des adresses différentes.
Plus sérieusement, je reste dubitatif sur la complexité des environnements client (Smartphone, Tablette ou PC) ou des serveurs (qui peuvent être multiples, même faire du fail-over, du load-balancing et avec une charge qui peut varier). Il est difficile de reproduire les environnements de production, surtout sur son propre PC de développement.
Transparence référentielle
Une expression est référentiellement transparente si elle renvoie toujours la même valeur pour les mêmes données en entrée. Sinon elle est référentiellement opaque.Par exemple, si elle utilise une fonction qui dépend d'une variable globale (la date du jour par exemple), elle sera référentiellement opaque.
Quels sont les avantages de la transparence référentielle?
Les résultats peuvent être cachés pour accélérer le programme.
Un compilateur intelligent peut déplacer une telle expression hors d'une boucle, rendant l'écriture plus simple au programmeur qui n'a pas besoin d'extraire lui-même l'expression de la boucle.
Cela permet aussi de ne pas avoir de mauvaise surprise lors de l'utilisation d'une fonction référentiellement opaque qui ne donne peut-être pas deux fois de suite le même résultat.
C'est une notion importante en programmation fonctionnelle.
Féliciter son manager
Je n'avais jamais imaginé que je pouvais féliciter mon manager quand il ne fait pas le vilain bien entendu...😀Une vidéo Youtube sur le sujet.
Zig, le langage qui succéderait à C
Son nom m'amuse car ça me rappelle Zig et Puce qui étaient déjà passés de mode dans mon enfance, c'est-dire si c'est ancien.Plus sérieusement, Zig est un langage de programmation impératif, généraliste, statiquement typé et compilé, conçu par Andrew Kelley. Ouf.
Qu'a-t-il de spécial?
Il est conçu pour être simple et ne pas donner la possibilité de faire des choses de deux façons différentes.
Il s'interface très bien avec C; il peut même en lire les entêtes .h.
Les pointeurs peuvent recevoir une valeur de vide et le compilateur fait des vérifications statiques dessus.
La gestion des erreurs est assurée par des types d'erreurs et peut être gérée par catch ou try.
Une fonctionnalité intéressante est qu'on passe des allocateurs de mémoire aux fonctions appelées; plus de malloc invisible dans une fonction C dont on n'a pas le code source.
Oui, comme c'est un langage orienté système, il n'a pas de ramasse-miettes.
Une voie
Quelle que soit la voie qu'on emprunte dans n'importe quel domaine de la vie, il y a aura toujours une "tartine de déchets" à se manger.C'est-à-dire tous les problèmes qui viennent avec (idée d'Isabelle Gilbert, autrice de 'comme par magie', un livre sur la créativité dans le domaine littéraire, elle n'utilisait pas le mot déchet mais un autre, plus imagé, que je n'ose mettre sur LinkedIn 😀).
Si on ne veut pas engloutir ce plat peu appétissant, alors on ne suit pas ce sentier et on fait autre chose.
C'est pourquoi il faut une certaine discipline quand on s'engage dans quelque chose.
Une différence entre un professionnel et un amateur en créativité est que le premier s'active par tous les temps et le second a besoin d'un bon alignement des planètes.
Les tests par mutation (mutation testing en anglais)
Il faut disposer d'abord de tests unitaires. Ensuite, sur le code de production, on opère une mutation: par exemple on change une constante, on transforme un '>' en '<' ou on supprime carrément une instruction. Bon, il faut quand même que ça compile.Puis on lance les tests et on voit s'ils signalent des erreurs; s'ils n'en signalent pas, c'est que vos tests sont incomplets. Si un test crashe, c'est bon signe, votre suite de tests est plutôt bonne.
Il existe des outils pour faire des mutations automatiques. L'inconvénient de cette méthode c'est, que même automatisée, elle prend beaucoup de temps. On ne peut pas la lancer tout le temps.
Quelques utilitaires Windows 10 plus ou moins connus
Le premier est l'outil de capture d'écran qui permet de facilement récupérer des images affichées sur votre moniteur, le deuxième est la table des caractères qui permet d'obtenir les lettres majuscules rares telles que É et Ç. Le troisième truc est dans les paramètres système/Presse-Papiers et permet d'activer l'historique de vos copier. Une fois activé, Windows-V vous permet de sélectionner une ancienne copie de texte; c'est cependant une interface un peu fruste...Nombres dits 'magiques'
Ce sont des constantes numériques arbitraires, dites 'magiques' par Sonar. On peut en utiliser pour un test, pour une constante que l'on veut bizarroïde ou pour un mot de passe, j'ai les propositions suivantes.- 1664 connu par tous les amateurs de bière;
- 42 le nombre universel;
- CA FE BA BE les 4 octets en hexadécimal qui sont au début d'un fichier java compilé en .class;
- 1.618033988749895 qui est... le nombre d'or égal à (1+√5)/2 et qui vérifie X² = X + 1;
- 745615114 j'ai tapé au hasard sur mon pavé numérique.
Quelques citations sur l'optimisme et le pessimisme
D'abord ma préférée: les optimistes se trompent aussi souvent que les pessimistes, mais ils sont plus heureux.Le pessimisme est d'humeur, l'optimisme est de volonté.
Un pessimiste voit une difficulté dans chaque opportunité et un optimiste une opportunité dans chaque difficulté.
Je préfère être optimiste dans ma vie professionnelle et privée.
Réponse 1 de Pierre Desprogres: le pessimiste est un optimiste avec de l'expérience.
Réponse 2: tandis que le pessimiste voit le verre à moitié vide et l'optimiste à moitié plein, le réaliste le boit.
Réponses humoristiques à des questions que l'on pourrait vous poser
Quand vous êtes "accusé" de quelque chose, répondez: "c'est normal, c'est moi qui fais tout". On peut alors vous rétorquer: "oui, tout ce qui n'est pas bien."On vous dit que vous écrivez du code incompréhensible. Répondez: "c'est normal, c'est pour me rendre indispensable."
Enfin, vous avez un traitement long sur votre PC et vous devez attendre. Chantonnez: "dépêche toi mon Amour je suis garé en double file". Dire des mots doux à votre ordinateur va certainement vous faire gagner un temps précieux.😀
Les commandes Unix
Elles évoluent beaucoup moins vite que les frameworks Javascript.30 ans que je les connais et elles ont très peu changé.
Donc cette connaissance technique là est pérenne pour une fois.
Apprenez à utiliser les grep, find, df, ls, etc... Et les caractères spéciaux tels ` ' $ |. C'est une connaissance qui vous servira toujours dès que vous faites un peu de Linux ou du Git Bash sur Windows.
Pourquoi être contre le brown-out? 😀
Il parait que certains maîtres bouddhistes, pour casser l'égo de leurs disciples, leur donnent des tâches absurdes et ingrates à faire.Donc si votre quotidien est une longue suite de tâches peu valorisantes et qui semblent inutiles, vous atteindrez peut-être l'illumination en cette vie.
Un bon bullshit job vous rapproche ainsi du nirvana.
Votre chef en vous poussant à bout est peut-être un grand gourou.
Bon, trêve de plaisanterie 😀, le brown-out n'est pas marrant à vivre. Il atteint, parait-il, des jeunes surqualifiés pour un emploi trop 'facile' pour eux.
Le choix d'une librairie est toujours délicat
Déjà, il faut que sa licence soit compatible avec le logiciel qui va l'utiliser. La licence GPL 'virale' est très souvent à fuir pour un usage commercial. Il y en a aussi des payantes mais dans mon métier, nous les évitons et préférons les logiciels libres.On peut avoir des failles de sécurité connues de beaucoup trop de monde.
Elle peut évoluer dans une direction inattendue.
Une librairie, ça peut être un boulet aux pieds surtout si en plus, elle est structurante.
Je dirais que si son travail peut être fait en quelques jours de "développement maison", mieux vaut ne pas l'utiliser alors.
Quelques expressions amusantes
C'est tombé en marche: un programme s'est mis à fonctionner sans qu'on comprenne vraiment pourquoi.Un nom à coucher dehors: se dit d'un nom de variable ou de fonction improbable.
Seul face à Dieu: devant un bogue obscur d'une librairie du type Hibernate.
Il faut courir pour rester sur place (citation de la reine rouge dans 'Alice aux pays de merveilles'): les librairies et châssis changent sans arrêt et il faut sans cesse adapter le code ou tout au moins changer de version (pour un trou de sécurité par exemple) sans vraiment ajouter de nouvelle fonctionnalité.
Du télétravail sur site; vous êtes au bureau tout seul. Ne pas confondre avec 'télétravail inversé' où vous faites des tâches personnelles au bureau.
Échouons, échouons
nous finirons par réussir.😊😊😊Leitmotiv vu souvent sur internet avec son corollaire: on apprend plus par l'échec.
De mon expérience personnelle de recherche d'emploi, j'ai eu plein d'échecs mais à chaque fois dus à un gros machin raté dans l'entretien. Mais il n'y a quasiment jamais eu ce truc qui ressortait plus tard dans une nouvelle rencontre, même si j'en connaissais désormais la solution.
Oui, j'apprends des choses de mes échecs mais je ne suis pas sur que ce soit vraiment utile pour la suite.
Quel lieu commun cette histoire d'apprentissage par l'échec! C'est relié quelque part à l'enseignement de la vie par la douleur. Ou aux croyances comme quoi les mauvaises choses nous arrivent sans effort (le diable vient sans être invité) et les bonnes seulement si on travaille beaucoup.
'use strict' en Javascript
Cette 'directive' empêche de faire de vilaines choses en Javascript. La principale est de ne pas pouvoir utiliser une variable non déclarée. Sans cette directive, le moteur Javascript crée alors une variable globale en plus silencieusement.Sur mon site personnel, j'ai ainsi du corriger du code qui créait des variables globales sans les définir. J'ai donc du les définir au niveau global. Oui je suis un vilain et j'utilise plein de variables globales sur mon site.
L'avantage de 'use strict' est donc d'empêcher des comportements litigieux et, paraitrait-il, permettrait aux moteurs Javascript de meilleures optimisations.
Un brin de nostalgie
J'ai connu l'ancêtre des IDEs modernes avec l'éditeur de Basic du ZX Spectrum.L'auto-complétion: en éditant une ligne, selon où on se plaçait à l'intérieur, une touche de clavier pouvait afficher un mot clé (par exemple PRINT ou INPUT).
La vérification syntaxique: si on se trompait dans la syntaxe d'une ligne, on ne pouvait pas la sauvegarder et un '?' clignotant apparaissait à l'endroit suspect.
Tout ça en moins de 10000 lignes d'assembleur (16 Ko de ROM) à comparer aux millions de lignes nécessaires pour faire tourner nos machines.
Lip service
Le service des lèvres.Expression anglaise intéressante qui signifie de parler de quelque chose sans s'engager dans une quelconque action. On promet monts et merveilles puis on ne fait rien de concret.
Certains politiques, consultants ou managers sont vraiment des experts dans le domaine.😊😊😊
Après, un bon discours, ça peut toujours motiver ou informer les gens.
Peut-on se passer des frameworks Javascript sur le front?
En tout cas, c'est une possibilité réelle avec du Javascript moderne surtout pour un tout nouveau projet ne partant de rien.
Vous avez fetch pour faire de l'Ajax.
Les Web Components pour créer des composants réutilisables du type 'montant' ou 'adresse postale'.
Ce sera plus embêtant à faire qu'avec un framework; il faudra mieux connaître Javascript, HTML et CSS. Par contre vous n'aurez plus besoin d'utiliser d'obscures librairies ou des châssis 'boîte noire' qui évoluent tout le temps ou sont parfois abandonnés. Plus de peur du 'npm install' qui casse tout.
Vos pages Web mettront moins de temps à charger car il n'y aura plus la masse de code du framework ou des librairies à télécharger avec beaucoup de code mort.
Suis-je fier du code que j'écris en entreprise?
En fait, je reste humble car il ne m'appartient pas et il a de nombreuses contraintes qui font que je ne peux pas réaliser exactement ce que je veux.De plus, tout ceci est un travail d'équipe; je ne suis qu'un engrenage parmi d'autres dans la belle mécanique d'une société.
Par contre, il m'arrive d'être content d'un développement que je me plais à relire.
Plus que la gloriole du job effectué, la satisfaction essentielle est quand même la paye au bout du mois.😊😊😊
Résumé d'un excellent article d'Oracle sur les threads virtuelles en java 21
Déjà, elles sont censées exécuter une seule tâche et puis ensuite disparaître.Légères, elles peuvent être des millions et ne nécessitent pas de pool comme les threads natives.
Par contre dès qu'elles rentrent dans un bloc synchronized, elles s'attachent à leur 'vraie' thread: si on veut partager des objets, il vaut mieux qu'ils soient immutables.
Elles se marient mal avec les châssis asynchrones: il faut choisir l'une des deux technologies et s'y tenir.
Je ne suis pas amoureux de mes collègues
Surtout les barbus.😀😀😀Bon, comment vais-je écrire ce post sans insulter mes camarades de travail?
Je ne suis pas contre de voir leurs binettes au boulot. Ça me permet d'avoir des contacts sociaux et de ne pas croupir dans les solitudes glacées de mon appartement.
Et au repas de midi de toujours faire le même running gag sur qui va payer l'addition pour tout le monde; blague dont je ne me lasse pas... Hélas pour mes proches travailleurs. C'est ça les traditions millénaires.😀
« Le grand art du débogage »
Si j'avais un seul livre d'informatique à écrire, ce serait celui-ci.Le rédiger me permettrait de conscientiser mes processus mentaux personnels face à ces problèmes.
Le premier chapitre serait une typologie des bogues.
Le deuxième leur origine: there must be a scape-goat comme dirait Lucy dans Snoopy.😊😊😊
Le troisième leur correction.
Je me sens compétent pour produire ce bouquin. Il y a une telle charge négative autour du bogue que ça en devient un sujet intéressant à voir en long, en large et en travers.
Pour le code mort commenté
Ce n'est peut-être pas toujours mauvais car qui va vraiment aller à tous les coups chercher dans le gestionnaire de version le code disparu ? En général, je ne saurais même pas qu'il a existé.Donc j'ai un doute sur ce point.
Les méthodes statiques et publiques
Sont un peu de la junk food en Java.Si elles sont savoureuses à court terme, car faciles à invoquer (pas besoin d'une instance d'un objet), leur ingestion pollue le code.
Elles ne sont pas surchargeables.
Elles sont difficiles à mocker : il faut réaliser des choses impies avec Mockito ou PowerMock pour y parvenir.
Ou alors, il faut créer un objet de façade qui appelle la maudite routine.
Le pire, c'est quand, en plus, elles ont un état : rien de mieux pour galérer sur les tests unitaires.
Il y a aussi le fait qu'elles sont plus orientées procédural qu'objet. Mais je ne suis pas un inconditionnel de la POO.
Après, une fois de temps en temps, de la junk food, pourquoi pas ?
Un retournement de situation
Dans une autre vie professionnelle, j'avais hérité d'un manager qui n'appréciait pas ma façon de travailler.Pendant un an et demi, je n'ai donc pas été augmenté. Mais comme le travail m'intéressait, que j'ai la peau dure et que je ne faisais rien d'illégal, je n'ai pas démissionné, ni changé de comportement d'ailleurs.
Puis, un jour, un autre collègue m'a dit qu'il y avait parfois des retournements de situation. Effectivement, quelques semaines plus tard, mon manager a été licencié et j'ai reçu une prime exceptionnelle due à mon travail sur NodeJS pour une application migrée depuis Perl.
La morale de cette histoire est la suivante : si vous êtes manager et que vous ne vous entendez pas du tout avec un collaborateur, alors licenciez-le ou changez-le de service. Sinon, il ne vous aidera pas, et même il pourrait vous nuire.
Autre enseignement : comme en politique, il faut durer ; toute traversée du désert peut mener à une oasis.
Troisième leçon : contrairement au premier point, je n'ai pas fait de mal, sinon de ne pas soutenir mon chef. De toute façon, il s'était créé tout seul maints ennemis dans la boîte, probablement à cause de son côté trop critique. En tant que manager, il vaut mieux coopérer plutôt que de se mettre à dos les gens.
Quatrième point : les temps sont incertains, mais pas nécessairement toujours dans le négatif. On n'est jamais à l'abri d'une bonne nouvelle.
Cinquième conséquence : c'est en mettant au propre cette histoire sur LinkedIn que j'en ai tiré toutes les leçons.
Fausse prophétie du désastre sur le télétravail
Avec le télétravail les gens vont travailler 24h/24 ou 0h me disait un collègue de ma précédente société il y a 10 ans quand même.Pour ce que je vois, ceux qui ne bosseraient pas du tout se feraient vite remarquer dans ma société.
Certaines personnes peuvent effectivement travailler jusqu'à des onze heures du soir ou le week-end, mais cela reste exceptionnel.
Le désastre annoncé ne semble donc pas s'être produit, en tout cas pas dans ma société.
Je ne suis pas un grand refactoreur
Je m'adapte au code des autres et ne cherche qu'à en changer des parties. Je refactore ce qui est local et private.C'est peut-être un défaut, mais j'étais 'conservator' selon un jeu lors d'une rétrospective.
Refactorer le code d'un autre, c'est soit prendre le pouvoir, soit vouloir tout faire à sa convenance.
Le mieux est de se faire plaisir en refactorant et de laisser le soin de corriger les régressions aux gentils collègues.😀😀😀
Trêve de plaisanterie, je crois plus aux refactors faits par l'auteur initial du code, qui en aura vu les limites.
Au final, je ne suis pas contre les refactors, mais il faudrait le faire en concertation avec le reste de l'équipe.
Les grands principes spirituels des programmes
La vie, selon Neale Donald Walsch est un processus fonctionnel, adaptable et durable. Si on traduit ces grands principes pour le code qui n'est jamais qu'une simulation de la vie, on obtient:- fonctionnel: le code doit marcher;
- adaptable c'est-à-dire maintenable, il évolue en permanence pour rester fonctionnel, comme la vie. Dire qu'il est terminé, c'est comme dire que la pelouse est tondue;
- durable, c'est-à-dire pérenne. De nombreuses fois, je me suis dit que ce code était trop « sioux » et qu'il ne durerait pas, et effectivement, il était éliminé avant même d'être livré.
KISS
L'un des rares grands principes de développement auquel je crois est 'KISS': Keep It Simple, Stupid.Ce post sera donc basique.
Ne pas écrire de code compliqué ou trop fin car six mois plus tard, même vous aurez du mal à le comprendre.
Même un algorithme compliqué devrait être implémenté simplement.
De toute façon, dans toute ma carrière dans les applications de gestion, la méthode de calcul la plus complexe que j'ai jamais programmée était un tri topologique.
Faire simple, c'est compliqué.
Quelques poncifs sur les langages informatiques
Le C c'est de l'assembleur portable.Le java c'est pour les enfants et c'est verbeux. Le C++ c'est pour les vrais développeurs.
Le Python c'est pour l'intelligence artificielle et le big data.
Le javascript est le langage du Web.
Le SQL est dépassé car le NoSQL c'est l'avenir.
Le Perl c'est du 'write-only' tellement il est illisible.
Scala est lent à compiler et compliqué.
C# c'est vilain car c'est du Microsoft.
😊😊😊
Deux idées sur l'IA et le développement
Ma première idée est que l'IA générerait tout un programme à partir de spécifications. Pour maintenir le tout, il suffirait de changer les spécifications et elle recréerait l'application en calculant les deltas de base de données. Cependant, comme les IA ont parfois des hallucinations, cette méthode me semble périlleuse.Ma deuxième idée m'est venue en lisant « Code Complete » de Steve McConnel. Pour développer, il disait qu'il fallait écrire du pseudo-code en français qu'on améliorait et changeait plus facilement que du vrai code. Une fois qu'on était satisfait de ce pseudo-code, on le traduisait en un langage informatique quelconque. L'idée serait d'écrire ce pseudo-code et de laisser l'IA le traduire en un programme dans un certain langage informatique. Mais bon, c'est un vieux bouquin et je n'ai jamais vu quelqu'un écrire du pseudo-code.
Les 'prima dona de la technologie'
Elles font tout le pire relationnellement et sont ultra-bien payées! Mais personnellement, je n'en ai jamais rencontré; je me demande juste si c'est un délire de Scott Adams, auteur de Dilbert. Il a du en rencontrer je pense dans sa carrière, s'il en parle. Mais bon c'était les années 90...Un peu d'humour sur le recrutement
L'essentiel pour recruter quelqu'un c'est qu'il soit chanceux.Donc en entretien on lui fait lancer deux dés à six faces et s'il dépasse dix on l'embauche.
Le protocole peut être amélioré en faisant lancer un des deux dés par le recruteur, pour voir si ça apporte de la chance à la boîte aussi.
Un raffinement de cette méthode absurde est de regarder qui a tiré le plus grand chiffre. C'est celui qui bénéficiera le plus de cette collaboration.
Ce n'est pas pire que d'utiliser la numérologie après tout.😀😀😀
Petite plaisanterie corporate
Un patron à un collaborateur:
- va en enfer !
- monsieur, je suis confus, dois-je partir ou dois-je rester ?
Une grosse différence entre rebase et merge vis-à-vis des conflits dans Git
On suppose qu'on a dix commits à mettre sur une autre branche avec le commit 5 et le commit 7 qui font des conflits.Avec le rebase qui n'est jamais qu'une sorte de série de cherry-pick, vous allez avoir les conflits du commit 5 que vous allez corriger puis ceux du commit 7 à corriger aussi. À la fin, vous obtenez une 'ligne droite' pour vos commits et il n'y a pas de commit de merge. Les dix commits peuvent ne plus être comme avant le rebase.
Avec le merge vous allez avoir tous les conflits du commit 5 et du commit 7 en même temps à gérer. À la fin, vous obtenez une bifurcation dans les logs, avec un commit de merge et vos dix commits n'ont pas bougé...
Moi je préfère le merge au rebase, surtout s'il y a des conflits qui sont revertés. Et intervenir sur un commit intermédiaire me gêne dans le cas du rebase.
Un bogue intéressant qui m'a bien fait perdre une ou deux heures
Le contexte: un job de pipeline en Groovy sur Jenkins. On utilise de nouvelles machines avec Docker.Le bogue: des scripts de base de données n'arrivent pas à faire une insertion: ils disent que la colonne est trop grande.
Comme ces enregistrements contiennent des accents, je subodore immédiatement un problème d'encodage. À noter qu'avec Maven le bogue n'apparait pas. Le code:
sh "export NLS_LANG=AMERICAN_AMERICA.UTF8" sh "sqlplus ${USERNAME}/${PASSWORD}@${SERVER_URL} @db-init-oracle.sql"Cherchez l'erreur...
En fait on lance un shell à chaque fois qu'on fait un sh et donc le premier shell exécuté initialise bien NLS_LANG mais il se termine et cette variable disparait dans la tourmente: le deuxième shell ne la voit donc pas. Je suppose que les anciennes machines avaient déjà cette variable initialisée à une bonne valeur. Et en Maven, sqlplus est lancé avec cette variable correctement mise en place.
Correction:
sh """ export NLS_LANG=AMERICAN_AMERICA.UTF8 sqlplus ${USERNAME}/${PASSWORD}@${SERVER_URL} @db-init-oracle.sqlLà il n'y a qu'un seul script shell qui s'exécute et donc la valeur de NLS_LANG est correcte.
"""
Remarquez que je ne connaissais pas la syntaxe triple guillemet donc j'ai aussi appris qq chose.
Il faut courir pour rester sur place
Parfois, le monde de la technologie ressemble à celui d'Alice au pays des merveilles. En particulier, quand votre application de gestion est censée durer plus de dix ans et qu'il faut suivre les évolutions technologiques.En général, les langages, en progressant, maintiennent une compatibilité ascendante mais c'est moins sur avec les librairies et les châssis.
Quelques solutions.
Les frameworks maison sont peut-être vilains, mais c'est VOUS qui en gérez les évolutions.
Certains choisissent de rester avec de vieilles dépendances externes mais du point de vue de la sécurité, c'est pas ouf et pas très attractif pour vendre le poste à un développeur.
Ou alors, il faut prendre du temps de mise à jour des dépendances et parfois ré-usiner sans ajouter de nouvelle fonctionnalité métier: courir pour rester sur place donc.
Symbol en javascript
Les symboles initialisés par du code du type const s1 = Symbol("un") permettent de créer des valeurs uniques de type 'symbol'. Deux symboles créés par cette syntaxe sont garantis uniques et donc différents pour l'égalité.Ils peuvent ensuite servir de clé d'objet garantie sans collision, comme on pourrait en avoir avec des strings. De plus, les clés (= symboles) / valeurs n'apparaissent pas lorsque l'on parcourt un objet avec un « for in ». Ils permettent ainsi une sorte d'encapsulation faible en cachant les propriétés de clé d'un symbole.
Rédiger cette publication m'a permis d'apprendre la syntaxe suivante:
const obj = {['maProp'] : 25 };où 'maProp' peut être remplacée par une expression quelconque renvoyant une string ou un symbol.
À part ça, l'utilité des symboles me semble réduite et si je n'avais pas vu leur existence dans une publication de Rudy Onfroy, je ne m'en serais pas occupé. Je ne les ai jamais vus appliqués dans un projet quelconque et vous ?
Langage Haskell
C'est un langage de programmation fonctionnel fondé sur le lambda-calcul et la logique combinatoire avec évaluation paresseuse. Ouf!Il propose un typage fort, n'autorise pas facilement les effets de bord.
Il ressemble à Camel. Je me souviens dans mes cours à l'X que la compilation dans un tel langage était très difficile mais une fois qu'elle passait, le programme était correct et fonctionnait sans bogue. On ne peut pas en dire autant des langages standards du type java ou surtout javascript.
Je suis pour le typage le plus fort possible, et vous ?
Réflexions / commentaires
Ça m'a toujours gêné cette histoire du leader qui te fait progresser. Progresser ou non est mon affaire personnelle; ce n'est pas à quelqu'un en dehors de moi d'en décider.Si on est athée et matérialiste (ce que je ne suis pas), il n'y aucune raison que les machines ne puissent faire aussi bien ou mieux que nous dans le futur. Aujourd'hui, les IAs sont effectivement limitées. Les IAs génératives sont réputées être déjà créatives. Ce qui explique parfois leurs hallucinations... 😀
Je me demande, cependant, si la JVM optimise le traitement des exceptions; probablement que non car ça me parait difficile (vu qu'il faut conserver la pile des appels et que c'est ça qui est très couteux je pense) mais pas impossible: on pourrait imaginer qu'elle ne remplisse pas la pile des appels si on n'en a pas besoin. À creuser donc.
C'est ce que Scott Adams, l'auteur de Dilbert, appelle les 'Prima Dona de la technique' avec les managers qui surévaluent leur compétence technique.
À une exception près : pour du 2FA, on vous demande d'ajouter un logiciel ou d'utiliser les SMS sur votre smartphone personnel.
Vous en connaissez des 10x développeurs ? Moi pas. Des 2x ou 1,5x oui.
Plutôt que des Optional j'aurais préféré du chaînage optionnel à la Kotlin ou à la Javascript du type a?.b qui renvoie null si a est null et a.b sinon.
Je trouve que c'est moins lourd et ça ne crée pas d'objet assez inutile.
C'est ce que je ressens aussi: cette possibilité de paresse intellectuelle. Il faut se reprendre et ne pas y céder.
J'ai un site web personnel avec du Vanilla Javascript essentiellement mais comme je ne veux pas avoir de barrière à ma créativité, je considère qu'il ne me rapportera jamais rien. Sinon, il faudrait que je m'adapte aux gouts des gens ou au marché, et ça me briderait.
Et encore vous ne parlez pas d'espérance de vie en bonne santé et c'est encore pire.
Soyons terre à terre: y-a-t-il 75% de déductions d'impôts sur l'achat de ces cartes-cadeaux?
Je suis le principe YAGNI et compliquer le code pour le rendre réutilisable me semble superflu car il ne sera peut-être jamais réutilisé ailleurs.
Sinon du code clair, solide et maintenable me semblent suffisants.
Je vois un intrus, qui est différent de la masse.
Sauf, que d'expérience, les managers n'aiment pas qu'on leur réponde 'je ne sais pas'.
Il y a DeepL Write pour faire vérifier sa prose anglaise. Je me suis rendu compte en l'utilisant que mon anglais écrit était moins bon que je pensais.
Un prestataire partait, j'ai juste fait en deux jours sur un bon mois des 'ateliers de passation' pour avoir les grandes lignes de certaines parties du code que je connaissais mal. J'ai juste fait une petite page Wiki avec mes notes et je m'y réfère de temps en temps.
Un être humain car ils courent moins vite mais beaucoup plus longtemps que des animaux qui s'épuisent rapidement.
D'ailleurs je crois que c'était une technique de chasse de courser des antilopes jusqu'à ce qu'elles se fatiguent.
Je suis plus un marathonien qu'un sprinteur en fait.
Je ne vais pas rentrer dans les questions de spécisme (je n'y comprends rien d'ailleurs) mais l'être humain est un mammifère après tout et ta question ne l'excluait pas a priori.
Oui, c'est vrai, j'aime parfois prendre des raccourcis...
J'avais un problème lors des concours d'ingénieur en physique: il me fallait une heure pour comprendre et démarrer vraiment, je tournais en rond, et après j'avais quand même une bonne note car j'allais vite alors. 1/4h pour trouver des solutions, surtout les créatives, c'est très court pour moi.
Personnellement, j'ai masqué les messages d'Elon Musk dans X.
Je ne l'ai pas bloqué car je n'ai rien contre lui mais ses messages me gavaient.
Quel ego surdimensionné il faut avoir pour transmettre ses messages à l'ensemble des abonnés de X!
Moi j'ai vu une fonction C de 1000 lignes écrite par un Coboliste. Je ne sais pas si c'est normal ou non en Cobol, ne connaissant ce langage que de nom.
La victoire a 1000 pères; la défaite est orpheline.
Je ne sais pas si c'est basé sur un phénomène quantique précis mais rien, pour l'instant, dans les postulats de la mécanique quantique certifie qu'une mesure d'un état (du type le passage d'un photon dans un miroir semi-réfléchissant) est vraiment aléatoire, au sens mathématique le plus fort, c'est-à-dire celui des suites de Martin-Löf.
Je dirais surtout que le développeur n'a pas vraiment la main sur les évolutions de son métier.
Oui && peut même éviter un if bien que ce soit parfois moche. && est aussi beaucoup utilisé dans les scripts shell. Je laisse cet exceptionnel && sur un 0 sur mon site car ça m'amuse mais je pense que je ferai différemment en environnement professionnel.
Qualité ou défaut dépendent entièrement du contexte. J'avais exposé une fois une qualité en entretien qui était un défaut pour le poste. Ils m'ont recalé à cause de cela. Mais c'était aussi bien pour moi, car le poste n'aurait pas convenu à ma personnalité. Donc j'ai accepté le verdict, d'autant plus qu'ils s'étaient expliqués.
Je me demandais si j'allais faire du PWA sur mon site personnel mais je crois que cet article m'a refroidi. De toute façon, je l'aurais fait juste pour m'amuser. Bon je vais juste continuer d'utiliser le localStorage Javascript pour cacher des 'petits' paramètres. PWA ce sera pour le domaine professionnel, peut-être, un jour.
Se rapprochait-il du lambda calcul plutôt que des machines de Turing ?
En tout cas, je lis tes publications jusqu'au bout car elles sont généralement intéressantes et bien écrites. Je lis beaucoup sur LinkedIn en fait. Soit je lis complètement un post, soit quasiment pas.
Je ne connaissais pas ':root' et ChatGPT m'a bien renseigné sur ce point et m'a appris par ricochet l'existence des variables CSS que je ne connaissais pas.
L'oubli dans le développement
C'est un problème majeur. Parfois, je ne reconnais plus du code écrit par moi dans le passé.J'ai tendance à mieux me souvenir du technique que du fonctionnel; certains disent que j'ai une mémoire sélective mais pour moi c'est de l'oubli.
Une autre tendance est aussi de se dire que le code est conservé dans Git, donc on aurait moins besoin de s'en souvenir.
J'avais lu quelque part il y a longtemps qu'on perdait la moitié de nos souvenirs anciens tous les 7 ans.
J'ai oublié ce que je voulais dire à la fin de cette publication.😀
Loi de Goodhart
Elle stipule que lorsqu'une mesure devient un objectif, elle cesse d'être une bonne mesure.L'objectif n'est plus d'accomplir un travail de qualité, mais plutôt de maximiser la note.
Un exemple réel : en Grande-Bretagne, un KPI avait été établi pour réduire le temps d'hospitalisation, ce qui a conduit à des patients insuffisamment soignés à retourner aux urgences.
On passera également sur le côté infantilisant des notes qui nous ramènent à l'école. De toute façon, l'air du temps est à noter tout et n'importe quoi sur le Web : les livres, les restaurants, et même les médecins Ah, on peut bien reprocher le crédit social aux Chinois alors que nous faisons un peu la même chose...
Code des Grands Anciens à maintenir
Dans une ancienne vie professionnelle, un collègue me disait que la durée de vie d'une application de gestion était de 10-15 ans, le temps d'avoir 30 frameworks Javascript donc.😁Durant toute ma carrière, je suis toujours tombé sur des applications déjà existantes. Ah si, une fois j'ai participé à la création d'une application Web réécrite de Perl vers un backend NodeJS.
Je crois qu'il existera toujours du vieux code à maintenir et que pour l'instant, les IAs ne sont pas assez puissantes pour le faire. Écrire du nouveau code plus ou moins bogué, ça on peut compter sur elles mais prendre en compte les modifications d'une application déjà existante, ça j'y crois beaucoup moins.
Ma vie ressemble à la boucle d'événements de Javascript
Je reçois des idées venant des gens que je fréquente virtuellement ou non, dans le domaine professionnel, amical ou personnel et j'y réagis. Je marche sur un sol qui apparait au fur et à mesure de ma progression créative.Quelques lignes de Javascript de mon cerveau:
setInterval(publierSurLinkedIn, 7 * 86400 * 1000); restaurant.addEventListener( "OnAPresqueFiniDeManger", () => doRunningGag({victime: 'J2M', executer: payerPourToutLeMonde}));Hélas, payerPourToutLeMonde est dans une dépendance externe Node et elle crashe systématiquement quelle que soit la victime choisie. Et ça ne vient pas de doRunningGag une méthode que j'utilise tous les mardis et jeudis quand je suis sur site. Qui pourra m'aider à la faire fonctionner ?😀
Quelle est votre bonne résolution pour 2025 ?
2048x1920.Vieille blague un peu éculée d'informaticien.
Il y a 30 ans, je connaissais la résolution de mes ordinateurs : 256x192 pour mon ZX Spectrum et 640x480 pour le VGA d'un PC. Mais maintenant, je ne sais plus : je connais juste la capacité de RAM, de SSD et le nombre de processeurs de mes PC et de mon smartphone, mais la résolution non.
Les émojis dans un Wiki, c'est astucieux.
Il existe des milliers d'émojis depuis le burger 🍔 jusqu'au warning ⚠️ en passant par l'église ⛪.Ils sont faciles à trouver (une phrase le décrivant avec 'emoji' en plus dans votre moteur de recherche préféré), sont beaucoup moins lourds qu'une image et surtout sont textuels donc on peut les rechercher comme du texte.
Cependant, ils apparaissent au fur et à mesure des versions d'Unicode, donc je ne suis pas sûr qu'ils s'affichent correctement sur tous les ordinateurs.
Dires d'un ancien collègue
« Quand on est enfant, on veut jouer. Quand on est jeune adulte, on veut grandir et faire plus. Et puis quand on est plus vieux, on veut qu'on nous fiche la paix ! »Pour ma part, je continue à évoluer, mais je ne veux toujours pas faire de management. Le métier de chef existe depuis des millénaires. Développeur, c'est beaucoup plus neuf et intéressant, selon moi.
Tests unitaires Angular plus reproductibles
Quand on a des centaines de tests et que l'application évolue, les tests unitaires peuvent échouer à cause de leur ordre d'exécution. Or, par défaut, ils sont en ordre aléatoire et cela rend difficile la reproduction des bogues du test. En utilisant 'random: false' dans Jasmine, les tests sont toujours lancés dans le même ordre, ce qui fait que leurs échecs peuvent être mieux reproduits.On dit que les lancer toujours dans le même ordre est une mauvaise pratique et qu'il faudrait qu'ils soient exécutables quel que soit leur ordonnancement. Mais pour une grosse application, c'est parfois trop difficile: certains tests sont parfois mal codés et plantent dans certains cas. Rien de pire qu'un test qui échoue de temps en temps aléatoirement à cause de l'ordre.
Le développement peut parfois ressembler à du rafistolage.
Je me souviens ainsi d'une conférence au Devoxx où l'orateur disait que beaucoup de développeurs étaient des rafistoleurs devant intégrer divers composants Open Source plus ou moins compatibles entre eux. Le beau code se situerait alors du côté des librairies.Bon, je pense qu'il exagérait : le code métier peut être élégant et bien écrit.
Mais il dit vrai aussi quand on doit faire tourner des choses ensemble alors qu'elles étaient séparées, quand il faut corriger un bogue dans des milliers de lignes de code plus ou moins connues ou quand il faut comprendre un bogue de librairie obscur dû à la mise à jour de quelque chose dans le logiciel.
Le désir
Il différencie l'IA de l'être humain. Pour l'instant...Avec ChatGPT et ses copains, tout l'art n'est plus de répondre aux problèmes du monde, mais plutôt de créer la bonne question. Et de faire le tri dans la réponse: ChatGPT est très bavard par exemple et seule une petite partie de ce qu'il raconte m'intéresse en général. Les hallucinations sont moins à craindre en développement, car il est possible de vérifier le code généré et de le tester dans un environnement réel.
Les hommes mènent encore la danse, car c'est leurs propres désirs qui les amènent à interroger les IA.
Le jour où les IAs auront des désirs, alors on pourra dire qu'une nouvelle espèce consciente existe sur notre belle planète.
Défaut/qualité: tout dépend du contexte
Un camarade X qui connaissait bien le monde professionnel affirmait que selon le contexte, un défaut pouvait être une qualité et inversement.Une autre connaissance disait qu'on pouvait parler de caractéristiques d'une personne mais pas de ses qualités, ni de ses défauts. Tout dépendait, une fois de plus, du contexte.
En entretien, une fois, j'ai dit que j'étais tolérant, ce qui me semblait être une qualité relationnelle. Or, non, ils voulaient quelqu'un qui impose ses idées, ce qui ne correspondait pas à mon caractère. Ils ne m'ont donc pas recruté et tant mieux pour moi, car cela ne m'aurait pas correspondu.
Quelques citations sur les cimetières
« Être le plus riche au cimetière ». Vouloir trop de possessions matérielles pour pas grand-chose. À partir d'un certain niveau de revenu, l'argent n'a plus beaucoup d'impact positif ; on peut même avoir des problèmes de riche. L'argent est un bon serviteur, mais un mauvais maître. Après, c'est peut-être un reste de judéo-christianisme de ma part.« Les cimetières sont remplis de gens indispensables ». Tout le monde est remplaçable dans une entreprise bien gérée.
« Les cannibales n'ont pas de cimetière ».😊 Cela encourage à faire du zéro déchet.
« Coups de chaud »
Dans une ancienne vie professionnelle, un chef parlait d'un collaborateur en disant que celui-ci avait parfois des « coups de chaud », c'est-à-dire qu'il s'énervait pour pas grand chose.Cela arrive à tout le monde de ressentir une émotion de colère; nous sommes humains après tout. Mieux vaut le tolérer quand c'est relativement rare.
Je crois qu'il y a des techniques pour exprimer sa furie sans faire de dégâts. Par exemple, en réunion, respirer et serrer le poing discrètement.
anyMatch et allMatch pour une stream vide.
La première renvoie false et la deuxième true alors qu'à première vue, c'est plus difficile que tous les éléments d'un flux soient conditionnellement vrais plutôt qu'un seul le soit.Cependant, comme le disait mon prof de maths en spé, tout élément de l'ensemble vide a les yeux bleus.😀 Ça c'est pour allMatch. Il renvoie false si et seulement si un élément du flux ne vérifie pas le prédicat.
anyMatch réclame qu'au moins un élément vérifie le filtre et comme le flux est vide, cette condition est fausse.
Je ne parlerai pas pas de noneMatch qui ne pose pas de problème de compréhension.
La voie de l'apprentissage par la joie
Elle est peu usitée sur notre belle planète. C'est plutôt le chemin d'évolution par la douleur qui est pratiqué. Dommage.Pour ma part, je vais essayer le premier moyen pour cette belle année 2023: me diriger vers ce qui me fait du bien, plutôt que de fuir ou de lutter contre la souffrance. Bon c'est très rare de suivre sa résolution mais je vais du moins le tenter.
Faire des erreurs exprès
Mettre une erreur dans un document pour que le manager la voit puis faire semblant de résister à la suppression de cette faute; éventuellement demander une rallonge de budget pour ce faire. Tout ça pour donner l'impression au chef d'avoir participé. Plus tard, quand le projet est bien avancé vous pourrez même dire que c'était une très bonne suggestion.Inversement, vous voulez faire valider un document très important par un subordonné alors mettez-y quelques erreurs. Cela a vraiment été fait par un chef de mon passé. Son collaborateur, tout content de dire à son manager qu'il s'était trompé fut bien surpris d'apprendre que celui-ci l'avait fait exprès.
De toute façon, si l'employé remarque une erreur involontaire, le commanditaire peut toujours dire qu'il l'a faite en toute conscience pour contrôler que le travail était bien fait.
Une blague de Scott Adams
Le diable propose deux jobs à Dilbert en échange de son âme immortelle.Un travail où il gagne beaucoup d'argent, mais tout ce qu'il fait est systématiquement détruit tous les jours.
Un autre emploi, où il gagne très peu d'argent, mais ce qu'il fait est très utile aux gens et à l'humanité.
Dilbert répond qu'il pourrait prendre n'importe lequel de ces jobs qui sont tous les deux mieux que son emploi actuel.
Feedback des feedbacks
Revenons aux basiques du mot 'feedback', il signifierait 'retour nourrissant'.On analyse rarement le feedback lui-même. Pourtant il est intéressant de savoir si celui-ci est vrai, est dit de manière non agressive, est constructif, bienveillant et même tout simplement honnête.
C'est tout un art de critiquer. Or si on n'a pas de retours sur sa critique, il sera difficile de s'améliorer et de justement rendre ses feedbacks réellement nourrissants. On me dira que, quelques fois, il suffit juste de voir la tête du critiqué pour comprendre si les paroles ont atteint leur but. 😀
Subtile différence sur map/filter entre Javascript et Java
En Javascript ces deux méthodes prennent un tableau entier et renvoient un tableau. En java, elles sont sur une stream et elles sont vraiment activées lors d'un collect ou d'un findFirst par exemple. Et alors elles sont parcourues de bout en bout par chaque élément de la Stream.Pour illustrer, prenons l'exemple de 5 éléments qui passent dans map(f1).filter(f2) et supposons que sur le troisième élément f1 plante et renvoie une exception. En Javascript, alors f2 et même filter ne seront pas exécutées car le map du tableau échoue. En java, par contre, f2 aura été exécutée deux fois.
Si l'on cherche un seul élément et qu'on n'a pas besoin de tout le tableau, alors Javascript fera plus de travail que Java (qui est 'Lazy' et même dans certains cas plus économe en mémoire). Une bonne vieille boucle while serait plus performante en Javascript.
Rappelons ceci quand même: 'premature optimization is the root of all evil'. La plupart du temps, on est sur d'assez petits tableaux et le côté 'force brute' de Javascript suffit.
En conclusion, ce genre de code donne le même résultat que ce soit en Javascript ou en java, mais les calcule d'un façon complètement différente.
Un objet DAO devrait être 'stupide'
Il devrait suivre le principe KISS à fond.Ou, plutôt, toute son intelligence devrait être dans sa requête de base de données, qui, elle, peut être complexe.
Il ne devrait pas utiliser d'autres objets DAOs, ou pire encore, des services métiers.
Ses méthodes publiques ne devraient pas appeler beaucoup d'autres méthodes autres que celles nécessaires à l'accès de la base de données. Elles devraient ainsi être 'isolées'.
En faisant cela, les services métiers peuvent les utiliser comme bon leur semble, sans, par exemple, avoir de références circulaires.
Comment je m'auto-forme
Je vais sur Stack Overflow quand j'ai un problème et alors j'apprends qq chose de nouveau.😀😀😀Je vais voir les derniers features des derniers JDKs java.
Je lis des articles sur le Web sur un sujet que je ne connais que superficiellement.
Je lis des bouquins.
Sinon je m'inspire beaucoup du code et des idées des autres. Oui, je suis un peu suiveur...
Si vous avez d'autres idées pour se former, je suis preneur.
Flame-war
Des polémiques en matière de développement.Tabulation ou 4 espaces? Moi je préfère les tabulations, les fichiers sont un peu moins gros en particulier pour ceux qui passent sur le réseau telles les pages Web.
Mac, PC ou Linux? Moi je suis très habitué au PC et de toute façon avec GitBash, j'ai accès à toutes mes lignes de commande Unix préférées.
Monolithe ou micro-services? N'ayant jamais fait que du quasi-monolithe, là je ne sais pas. Mais je pressens que le débogage de plusieurs micro-services doit être plutôt compliqué.
Démission et documentation
Le développeur démissionnaire doit faire un minimum de documentation pour le reste de l'équipe en place. C'est rare (et peut-être dangereux) que le développeur soit vraiment seul sur son code.D'expérience, un prestataire était parti et je lui ai demandé de m'aider à faire un peu de documentation sur des parties du code assez obscures. Ça n'a pris que deux-trois jours en tout mais je m'y réfère actuellement.
Je me sers aussi de ma propre documentation pour me remémorer des choses. Et toutes ces documentations étant sur le Wiki, je les mets à jour régulièrement en fonction des évolutions.
Backgammon, créativité et vie professionnelle
Comprendre tout n'est pas toujours nécessaire pour agir.En matière de créativité, on ne sait pas à l'avance par où on va passer. Chaque pas effectué construit le chemin.
De mon propre point de vue, si je n'interfère pas en forçant le processus de la vie, alors celle-ci se déploie correctement selon son propre timing.
On dit que les grands joueurs de backgammon n'ont pas plus de chance que les autres, mais que chaque coup de dés semble s'inscrire dans leur stratégie. Soyons de grands joueurs de backgammon avec la vie!
Créativité, conception et livraison
En créativité, la conception est agréable, mais l'accouchement est difficile.Cela se voit en développement quand on conçoit quelque chose. C'est alors la phase la plus créative et celle où il est facile de revenir en arrière ou de changer telle ou telle chose.
Mais c'est une autre histoire quand il va falloir vraiment coder dans du legacy. Les choses sont alors nettement moins agréables et les retours en arrière plus onéreux. On rencontre alors la réalité du code qui peut parfois être assez différente de ce qu'on avait imaginé. Néanmoins, certaines fois, tout est fluide et ce qui avait été pensé était correct.
Cela fait partie des joies et des tristesses de la programmation.... Qui reste parfois incertaine.
Tests unitaires Maven en ordre
Finalement, je lance mes tests unitaires Maven dans l'ordre alphabétique et non dans l'ordre par défaut du système de fichiers.Il suffit de faire 'ls -U' sur une machine Linux pour voir que les fichiers y sont ordonnés 'naturellement' n'importe comment. Sur une machine Windows, la même commande affiche les fichiers dans l'ordre alphabétique. NTFS serait meilleur de ce point de vue que EXTFSx.
Et depuis un bon mois, je n'ai plus de TUs en carafe de temps en temps aléatoirement.
C'est sans doute une mauvaise pratique, les TUs, dans l'absolu, devraient se lancer dans n'importe quel ordre mais quand vous en avez des centaines, dont la plupart ont été faits il y a des années par des personnes ayant quitté le projet, c'est alors une mesure pragmatique pour rendre les suites de tests reproductibles sur Jenkins.
Humour noir sur les médisances
Comme disait une connaissance, il est bien rare qu'on se dise des mots doux au boulot. Dans la vie professionnelle on peut se critiquer beaucoup car on est obligé de se supporter: votre vilain collègue habituel sera toujours présent le lendemain.On peut critiquer n'importe quel collègue mais pas avec n'importe qui. C'est une marque de confiance envers celui qui écoute le ragot. Ainsi on espère qu'il ne colportera pas nos dires à la personne concernée.
Un célèbre dessinateur préconisait de médire de quelqu'un en parlant avec le secrétaire du patron. On était sur ainsi que le ragot soit dument rapporté au directeur tout en vous laissant blanc comme neige. C'est une vieille technique cependant car les assistant.e.s de direction se font rare de nos jours.
On pourrait encore faire le corbeau en envoyant une lettre anonyme, mais ce n'est pas très moderne non plus. Je ne sais pas si on peut envoyer un email ou un texto vraiment anonyme.
Pré-poisson d'avril bien entendu! Ce sont évidemment des comportements à éviter.
Une différence entre procédural et orienté objet
En procédural, il est facile d'ajouter une nouvelle fonction et difficile d'introduire une nouvelle structure de données.En orienté objet, il est compliqué d'ajouter une nouvelle fonction et simple de rajouter une nouvelle structure de données.
Je m'explique.
Si vous ajoutez une nouvelle procédure, vous pouvez l'écrire indépendamment du reste du code dans son propre fichier. Si vous ajoutez une nouvelle structure, vous allez devoir revoir toutes vos fonctions pour vous en accommoder.
Si vous ajoutez un nouvel objet, vous écrivez son code dans son coin sans avoir à refaire toute la hiérarchie d'objets. Si vous ajoutez une nouvelle fonction, vous allez devoir revoir tous vos objets.
Pragmatiquement: peu de structures de données et beaucoup de fonctions, choisissez le procédural.
À l'inverse, beaucoup de structures de données et peu de fonctions, choisissez l'orienté objet.
Les lutins
Aujourd'hui, c'est un jour férié, donc je ne publierai rien de sérieux.J'accusais les petits lutins quand j'avais un bug dans mon code. Mais en fait, c'était le Drac qui était derrière ces méfaits. Vous pouvez être sûrs que c'est lui, ce fils du dragon ou du démon, qui vous empêche de retrouver vos clés, vous cache votre badge d'entrée ou vous subtilise votre carte de tickets restaurant. On ne compte plus ses mauvaises actions, entreprises pour assouvir sa méchanceté.
D'autres superstitions affirment que seuls les lutins s'intéressent à l'informatique parmi le petit peuple.
Un développeur est-il créatif ?
Les boulangers sont-ils créatifs ? En fait, ils le sont, ils créent de nouveaux pains tous les jours.Comme le développeur ajoute du nouveau code tout le temps, on peut considérer que c'est de la créativité, même très contrainte: mieux vaut ne pas être trop original et écrire du code banal.
Le développeur peut aussi supprimer du code, mais la destruction n'est jamais qu'un prélude à la création d'autre chose.
Parfois, il devra créer quelque chose de vraiment nouveau, mais dans ce cas il devrait suivre les principes KISS et YAGNI pour ne pas en faire trop.
Code "qui marche"
J'écris parfois un code "qui marche" pour me rassurer puis je l'améliore, ce qui prend du temps. Je pourrais très bien le laisser dans son sale état car il est déjà fonctionnel!J'estime que cette réécriture prend environ 10 à 20% du temps passé à écrire le code moche. Alors autant le faire! Ça ne coute pas cher et ça rapporte gros en termes de maintenance.
J'ai presque fait du TDD aujourd'hui et j'ai trouvé ça bien. J'ai lu dans un livre qu'il valait mieux avoir des tests de propreté semblable au code de production.
return n && (n % 9 || 9);
J'utilise cette fonction de modulo 9 Javascript sur mon site personnel; n est un entier ni null, ni undefined. Je pense qu'elle est trop sioux pour un environnement professionnel.Il vaudrait mieux écrire:
if (n === 0) { return 0; } else { const mod9 = n % 9; return mod9 !== 0 ? mod9 : 9; }Je crois que c'est surtout le 'n &&' qui est très rarement utilisé de cette façon-là. En tout cas, je ne l'ai jamais vu en environnement professionnel.
Commenter, c'est radoter
Phrase humoristique certes, mais porteuse d'une grande vérité aussi. Un bon code n'a pas besoin d'être annoté; sa lecture doit en faciliter la compréhension. Il doit être clair et lisible, quitte à rallonger le nom des méthodes et des variables. Rien de pire qu'un vieux commentaire non mis à jour qui induit son lecteur en erreur.Et qui maintient des annotations? Personne. Commenter est le signe clair que le programme n'est pas bon. Bien sur, il y a des exceptions comme les javadocs pour une librairie utilisée par des personnes éloignées. Exemple: les documentations des JDKs. Commenter pour du bon code, c'est donc vraiment radoter car c'est faire de la paraphrase.
Lexique humoristique du politiquement correct
Paresseux → économe de moyens;colérique → affirmé;
peureux → prudent;
grande gueule → authentique;
intéressé → motivé;
orgueilleux → confiant en lui.
Il n'y a qu'un mot que je n'édulcorerai pas: 'vilain' qui est comique en lui-même.
Parler est un besoin, écouter est un art
Bien souvent nous écoutons, non pas pour comprendre l'autre, mais pour répondre à ce qu'il dit. Ce qui fait que nous l'interrompons pour placer notre merveilleuse idée et oublier ce qu'il nous racontait.Il faudrait se forcer à une pure écoute, sans vagabonder mentalement pendant ce temps là.
Certains conseillent de noter notre merveilleuse idée d'interruption pour ne pas l'oublier, mais ça me semble délicat et pas toujours possible de le faire. Peut-être faudrait-il perdre notre pensée et privilégier l'écoute.
Logique/intuition
C'est avec la logique que nous prouvons, c'est avec l'intuition que nous trouvons, une citation de Henri Poincaré.Il y avait un bon article dans Pour la Science sur l'intuition. Il affirmait qu'il y avait deux sortes de raisonnements: l'un analytique qui regarde les différentes options et l'autre, intuitif sous forme "d'eurêka". Les intuitions stimulent le circuit de récompense du cerveau et donc donnent de la joie. Mais pour que ces intuitions aient lieu, il faut être dans un état de paix relatif. Si on est stressé, on a plus tendance à utiliser la méthode analytique.
Cet article disait aussi que les gens utilisant majoritairement l'intuition étaient moins sujet à la désinformation, aux fake news et y croyaient moins.
J'ai remarqué aussi que mon cerveau parfois s'emballe sur un sujet et trouve après une longue rumination une idée "géniale" professionnelle ou non. Qui, après une bonne nuit de sommeil, s'avère idiote. J'ai appris à 'couper' mes réflexions quand elles tournent en rond.
Échéances en développement
C'est bien d'en avoir parce que ça force à choisir une solution et à ne pas procrastiner éternellement dans un but de perfection absolue.Sans date limite on peut reporter ad vitam eternam notre développement en se disant qu'on pourra toujours le faire dans le futur. Futur qui n'arrive pas.
Mais c'est quand même très rare de ne pas avoir d'échéances dans le domaine professionnel. Cette publication s'adresse plus à la création personnelle où il n'y a pas de date limite et où le perfectionnisme peut pousser à ne rien terminer.
La fameuse technique du canard en plastique
Quand vous êtes sur un bogue difficile, il est parfois bon d'expliquer à quelqu'un vos idées sur la correction ou l'origine de ce bogue. Ce peut être une oreille humaine ou bien un... Canard en plastique ou n'importe quel objet inanimé.En verbalisant vos idées, vous aurez peut-être l'illumination pour corriger ce bogue.
Pour ma part, j'écoute quand un autre développeur a un problème à solutionner, et, bien souvent, il découvre la solution par lui-même et me remercie quand même. Chut! Il ne faut rien dire, pour que je ne perde pas mon auréole.
Ode humoristique à LinkedIn
Aujourd'hui c'est férié dans ma société donc je fais juste de l'humour pour ce post.
Ô grand esprit algorithme de LinkedIn.
Apportez-moi vos mille likes, vos cent mille impressions.
Faites que la dopamine coule à flots dans mon humble cerveau.
Car je suis votre serviteur dévoué.
Permettez-moi de lire les publications sur les freelances comparés aux CDI et sur l'IA.
Abreuvez-moi de connaissances sur le développement.
Que tout cela soit votre volonté.
On ne sait jamais; sur un malentendu, ça pourrait fonctionner.
Précrastination
Oui, vous avez bien lu : « é » et non « o ».Elle consiste à reporter une tâche importante pour se consacrer à des activités insignifiantes mais faciles.
L'activité importante est source de stress, d'anxiété ou d'autres émotions négatives. Ce qui nous pousse à la repousser.
Parfois aussi, on se dit qu'on aura bien le temps de faire cette activité importante et que le risque est faible de se consacrer à d'autres tâches beaucoup plus faciles. On pèche ainsi par une sorte d'optimisme malvenu.
Bien sûr, tout cela mène à la procrastination.
Smart and Get Things Done
Cette maxime désigne un bon développeur.Smart, intelligent donc, la stupidité ne mène pas à du code de qualité et ne permet pas de bien résoudre les problèmes, si on les solutionne d'ailleurs...
Get Things Done: c'est-à-dire que l'on agit et on fait le taf. Un beau parleur très intelligent ne mènera pas les choses à bien.
Tout simplement!
Grands principes de développement
KISS
Keep It Simple, Stupid- Faire les choses le plus simplement possible.
- Un programme simple est plus facile à comprendre et à relire
- Mais faire simple est compliqué
- « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément » de Nicolas Boileau
- Ne pas confondre ‘facile’ et ‘simple’: quelque chose peut être simple comme l’addition binaire mais si vous ne savez pas le faire, ce n’est pas facile. Il peut aussi être plus facile d’écrire du code compliqué que du code simple.
- La simplicité renforce la maintenabilité dans un univers toujours changeant.
- Supprimez tout code inutile, tout code mort pour simplifier
- Principe YAGNI “You Aren’t Gonna Need It”: si le code ne sert pas MAINTENANT supprimez-le tout de suite
- Ajoutez juste la complexité vraiment utile aujourd’hui
DRY
Do not Repeat Yourself- Éviter de répéter le même code à plusieurs endroits dans un programme.
- Déplacer le code redondant dans une fonction.
- Un des buts de ce principe est de faciliter la maintenance du programme.
- On peut utiliser des générateurs de code pour avoir des redondances à un seul endroit
- Exemple de redondance: HBM Hibernate sur les noms de propriétés dans l’XML et le code
- Instabilité du développement
- Chaque élément de connaissance doit avoir une représentation UNIQUE, NON AMBIGUË, OFFICIELLE dans un système
- La question n'est pas de savoir si vous vous rappellerez d’une duplication, mais de savoir quand vous l’oublierez.
- Devinette : qu'est-ce qui est pire que l'absence de commentaires ? C'est la présence de commentaires obsolètes.
- Plutôt générer la documentation à partir du code.
YAGNI
You Aren't Gonna Need It. Un principe en développement qui sied bien à mon minimalisme. En français: vous n'en aurez pas besoin.Il vaut mieux éviter d'écrire du code pour un besoin futur qui n'existe pas à présent.
Pourquoi? Car vous allez perdre du temps à écrire ces lignes de programme et ensuite à les maintenir alors qu'elles n'auront peut-être aucune utilité ni maintenant, ni dans le futur.
Principe d'économie donc.
Principe de Demeter
Ne pas appeler directement un ami d’un amiToute méthode M d'un objet O peut simplement invoquer les méthodes de
- O lui-même
- les paramètres de M
- les objets que M crée/instancie
- les objets membres de O
Principe SOLID
- (Single responsibility principle): une classe, une fonction ou une méthode doit avoir une et une seule responsabilité
- (Open/closed principle) une entité applicative (classe, fonction, module ...) doit être fermée à la modification directe mais ouverte à l'extension
- (Liskov substitution principle) une instance de type T doit pouvoir être remplacée par une instance de type G, tel que G sous-type de T, sans que cela ne modifie la cohérence du programme
- (Interface segregation principle) préférer plusieurs interfaces spécifiques pour chaque client plutôt qu'une seule interface générale
- (Dependency inversion principle) il faut dépendre des abstractions, pas des implémentations
Principe BASE
Pour les bases de données NoSQL, le principe ACID pourrait être trop contraignant ou mal adapté.Signification de l'acronyme:
- BA=Basically Available: la BDD fournira de la disponibilité sur les données en faisant des réplications si nécessaire mais n'assurera pas une consistance de la BDD immédiate;
- S=Soft State pas de consistance immédiate sur les écritures, les noeuds d'un cluster peuvent ne pas être consistants les uns avec les autres, c'est au développeur d'assurer:
- E=Eventually Consistant la consistance de la BDD qui ne sera pas immédiate mais faite plus tard. Dans certains cas, la consistance sera effectuée au moment d'une lecture.
Anti-principe GIGO
Non il ne se mange pas; je ne désire pas me fâcher avec nos amis Vegans.😀 Ce n'est pas un principe positif, comme KISS, YAGNI ou DRY.C'est l'acronyme de Garbage In, Garbage out. En français: ordures en entrée, ordures en sortie.
Si vous rentrez des données de mauvaise qualité dans un logiciel, il ne faut pas s'attendre à ce que celui-ci les corrige pour vous. Il va faire des calculs erronés sur vos entrées et vous fournir un résultat d'aussi mauvaise qualité ou pire encore. C'est un peu moins vrai de nos jours, ce principe GIGO. Par exemple, les correcteurs orthographiques existent maintenant.