URL: https://linuxfr.org/news/moi-expert-c-j-abandonne-le-c Title: Moi, expert C++, jâabandonne le C++ Authors: Oliver Ysabeau đ§¶, Davy Defaud, ZeroHeure, palm123, Nicolas Casanova, Pierre Jarillon et BenoĂźt Sibaud Date: 2019ćčŽ06æ03æ„T19:30:34+02:00 License: CC By-SA Tags: c++ et c++17 Score: 54 Ma carriĂšre professionnelle de dĂ©veloppeur C a dĂ©butĂ© en 1994 et jâai naturellement adoptĂ© avec enthousiasme le C++ en 1999. JâĂ©tais un dĂ©veloppeur C++ heureux et jâavais considĂ©rĂ© la nouvelle version du standard C++11 juste comme une Ă©volution tant attendue. En 2015, je rĂ©alise enfin Ă quel point, il a rĂ©volutionnĂ© lâĂ©cosystĂšme C++ et ses bouleversements dans lâĂ©tat dâesprit de la communautĂ©. Je me passionne alors pour C++11, C++14, puis C++17, je mâimplique beaucoup, je deviens un rĂ©fĂ©rent pour mes collĂšgues, je donne des confĂ©rences sur ce langage, jâorganise des _meetâups_ Ă Paris, je publie de nombreux articles C++ sur _LinuxFr.org_... En 2018, une expĂ©rience change radicalement ma façon dâapprĂ©hender le dĂ©veloppement logiciel. ---- [Journal Ă lâorigine de la dĂ©pĂȘche](https://linuxfr.org/users/oliver_h/journaux/moi-expert-c-j-abandonne-le-cxx) ---- Mieux dĂ©velopper pour les utilisateurs finaux =============================== Comprendre le client et dĂ©velopper vite --------------------------------------- En 2018, une expĂ©rience change radicalement ma façon dâapprĂ©hender le dĂ©veloppement logiciel. Ă cette Ă©poque, une Ă©quipe C++ se retrouve surchargĂ©e et ne peut implĂ©menter toutes les fonctionnalitĂ©s attendues. On rĂ©flĂ©chit Ă une solution de secours, et me voilĂ chargĂ© de dĂ©velopper une application en Python en intĂ©grant des briques sous licence libre. Je travaille alors en Ă©troite collaboration avec les utilisateurs finaux et on sort lâapplication en quelques mois. Ma nouvelle vision : > Il y a plus important que la technologie, câest de se mettre dans la peau du client final et de comprendre ses frustrations au quotidien. Et on y arrive mieux en intĂ©grant lâutilisateur final dans son Ă©quipe de dĂ©veloppement. Lâapplication *bricolĂ©e* en Python donne entiĂšrement satisfaction. Les utilisateurs sont contents dâavoir eu trĂšs tĂŽt leur outil, et cela a coĂ»tĂ© moins cher par rapport Ă toute une Ă©quipe C++ dans sa « tour dâivoire ». IntĂ©grer lâutilisateur final dans son Ă©quipe -------------------------------------------- Attention, je ne dĂ©nigre pas le C++, celuiâci peut ĂȘtre une bonne solution face Ă de nombreuses problĂ©matiques. Mais avant de courir tĂȘte baissĂ©e, sâassurer que la technologie choisie rĂ©pondra bien aux attentes *non exprimĂ©es* de lâutilisateur final. JâĂ©cris « attentes *non exprimĂ©es* » car bien souvent le dĂ©veloppeur se base sur sa propre interprĂ©tation dâun document prĂ©sentĂ© comme LA spĂ©cification qui a en plus Ă©tĂ© rĂ©digĂ©e par un intermĂ©diaire (MOA, MOE, Business Analyste, Product Owner, Architecte...). Nous lâavons peutâĂȘtre dĂ©jĂ tous constatĂ©, lâutilisateur final ne sait pas vraiment ce quâil veut, et a beaucoup de difficultĂ© Ă exprimer clairement par Ă©crit ses attentes. Un intermĂ©diaire (MOA, MOE, BA, PO, Archi) est nĂ©cessaire pour lui permettre de prendre du recul et pour traduire une demande fonctionnelle en exigence technique. Mais lâintermĂ©diaire rajoute une couche intermĂ©diaire ! Câest humain, lâintermĂ©diaire aura tendance Ă se rendre indispensable. Et sans le faire exprĂšs, lâintermĂ©diaire Ă©vitera que dĂ©veloppeurs et utilisateurs Ă©changent en direct. Le top est dâavoir lâutilisateur final dans son Ă©quipe de dĂ©veloppement, mĂȘme si ce nâest pas dans le mĂȘme bureau. Avec les habitudes de travail Ă distance, dĂ©veloppeurs et utilisateur peuvent clavarder (*chat*) rĂ©guliĂšrement. Faire des sprints dâune journĂ©e ------------------------------- La durĂ©e idĂ©ale dâun sprint câest la journĂ©e. Le matin on Ă©change rapidement avec le client de ce que lâon pourrait faire, on sâattelle Ă la tĂąche, on livre, lâutilisateur peut tester, on reâlivre... Et, en fin de journĂ©e, on dĂ©briefe trĂšs rapidement. LâintĂ©rĂȘt du Python (par rapport au C++) dans ce mode de fonctionnement câest la livraison : on peut se permettre de livrer directement le code source et hop lâutilisateur exĂ©cute lâapplication ! Ainsi, dans mon cas, quand lâutilisateur lançait le dĂ©marrage de lâapplication, la branche master du dĂ©pĂŽt Git Ă©tait automatiquement mise Ă jour. Jâessayais quand mĂȘme de le prĂ©venir quand une nouvelle version Ă©tait sur la branche _master_. La joie de livrer souvent, rapidement, et dâavoir du _feedâback_ dans la foulĂ©e. :-) Le choix du langage : une comparaison ===================== Le C++ ne serait donc pas la panacĂ©e ? -------------------------------------- Nous pourrions caricaturer : * en C++, le dĂ©veloppement est lent, mais lâapplication est trĂšs rapide ; * en Python, le dĂ©veloppement est rapide, mais lâapplication est trĂšs lente[^1]. Bien souvent, le client final a besoin rapidement dâune fonctionnalitĂ©, mĂȘme si lâexĂ©cution nâest pas super optimisĂ©e. En livrant rapidement cette fonctionnalitĂ©, le client gagne en maturitĂ© et a de nouvelles idĂ©es, de nouvelles façons pour optimiser son travail... et ainsi de suite avec des itĂ©rations courtes. WebSocket en Python ------------------- Pour une application existante, nous avons besoin de fournir une interface WebSocket basique afin que nos clients puissent accĂ©der Ă un service de Souscription/Publication. Je dĂ©veloppe la fonctionnalitĂ© en utilisant Python et Socket.io. Les tests JavaScript sont concluants. Cependant, nous nous apercevons que Socket.io rajoute son protocole par dessus le protocole WebSocket. Nous allons donc forcer les clients Ă devoir utiliser Socket.io ce qui nâest pas acceptable. Nous voulons offrir une simple WebSocket afin que le client ne soit pas enfermĂ© dans une technologie et soit libre dâimplĂ©menter son logiciel comme il le souhaite. Je mâoriente alors vers [WAMP](https://wamp-proto.org/) avec Autobahn... Mais, rebelote, le **P** dans WAMP signifie **P**rotocol. Pour ne pas rĂ©inventer la roue, je cherche alors une solution qui implĂ©mente dĂ©jĂ la fonctionnalitĂ© Souscription/Publication et idĂ©alement avec des coroutines ([`async` et `await`](https://docs.python.org/fr/3.5/library/asyncio-task.html)). WebSocket en C++ ---------------- Câest alors que je dĂ©couvre uWebSockets (ÎŒWS), une implĂ©mentation C++17 Ă couper le souffle qui intĂšgre la fonctionnalitĂ© Souscription/Publication tout en conservant le protocole WebSocket de base. \o/ Mon Ă©quipe est enthousiaste. Je clone le projet, jâadapte un exemple C++ Ă nos besoins et je prĂ©sente un rĂ©sultat convainquant. Câest agrĂ©able de compiler un projet C++ qui ne tire pas des dizaines de dĂ©pendances. :-) Je prĂ©cise que pour ce nouveau projet, je viens de rejoindre une autre organisation, et jâai Ă©tĂ© embauchĂ©, en partie, pour mes connaissances pointues en C++17.  La compilation C++ est archaĂŻque -------------------------------- En Python, Node.js, Ruby, Go, Rust on a `pip`, `npm`, `gem`, `go-get`, `cargo` qui simplifie le tĂ©lĂ©chargement des dĂ©pendances, et lâintĂ©gration au projet avec un `import xxxx`. De plus, certains IDE prennent en charge cette gestion des dĂ©pendances. En C++, la gestion des dĂ©pendances et leur compilation ne sont pas standardisĂ©es. En fait, cela nâa pas beaucoup Ă©voluĂ© depuis les origines : le C++ a quarante ans et se compile toujours dans le mĂȘme esprit que le C qui a lui soixante ans. Pour cela, nous avons le choix du compilateur, dont voici une sĂ©lection avec leurs dates de naissance : * [GCC](https://fr.wikipedia.org/wiki/GNU_Compiler_Collection) et son `g++` (GNU, libre, 1987-2019) ; * [LLVM](https://fr.wikipedia.org/wiki/Clang) et son `clang++` (Apple, libre, 2007-2019) ; * [AOCC](https://en.wikipedia.org/wiki/AMD_Optimizing_C/C%2B%2B_Compiler) et son `clang++` (AMD, libre, 2017-2018) ; * [ICC](https://fr.wikipedia.org/wiki/Intel_C%2B%2B_Compiler) et son `icc` (Intel, non libre, ????-2018) ; * [MSVC](https://fr.wikipedia.org/wiki/Visual_C++) et son `cl` (Microsoft, non libre, 1993-2019) ; * [C++Builder](https://fr.wikipedia.org/wiki/C++Builder) et son `bcc64` (Embarcadero, non libre, 1997-2019). Construction logicielle C++ =========================== Pour la construction logicielle (*build*), nous avons une dizaine dâoutils pour nous abstraire du compilateur, en voici une petite sĂ©lection sous licence libre : * [`make`](https://fr.wikipedia.org/wiki/Make) et son `Makefile` ; * [Ninja](https://en.wikipedia.org/wiki/Ninja_(build_system)) et son `build.ninja` ; * [Jam](https://www.perforce.com/documentation/jam-documentation) remplacĂ© par [Boost.build](https://github.com/boostorg/build) et leur `Jamfile` ; * [SCons](https://fr.wikipedia.org/wiki/SCons) et sa configuration en Python ; * [Waf](https://fr.wikipedia.org/wiki/Waf_(logiciel)) qui ambitionne de remplacer SCons. GĂ©nĂ©rateurs de configuration pour la construction logicielle C++ ---------------------------------------------------------------- Et pour nous abstraire de ces outils de construction logicielle, nous utilisons des gĂ©nĂ©rateurs de configuration de *build*, dont voici des projets toujours actifs : * [Autotools](https://fr.wikipedia.org/wiki/Autotools) gĂ©nĂšre du `Makefile` ; * [CMake](https://fr.wikipedia.org/wiki/CMake) gĂ©nĂšre `Makefile`, `build.ninja` et les fichiers projet pour de nombreux [IDE](https://fr.wikipedia.org/wiki/Environnement_de_dĂ©veloppement#Environnements_de_dĂ©veloppement_intĂ©grĂ©) ; * [Premake](https://fr.wikipedia.org/wiki/Premake) en cours de réécriture active depuis une dizaine dâannĂ©es ; * [xmake](https://en.wikipedia.org/wiki/Xmake) gĂ©nĂšre `Makefile` et les fichiers projet pour quelques IDE ; * [Meson](https://linuxfr.org/tags/meson/public) gĂ©nĂšre `build.ninja` et est compatible avec quelques IDE. Autres outils de construction logicielle C++ -------------------------------------------- Avec les outils ciâdessus, le *build* et les tests de non rĂ©gression dâune importante application C++ peut parfois prendre une demiâjournĂ©e. Câest beaucoup trop pour attendre si ce que lâon a implĂ©mentĂ© est correct ! Dâautres outils de construction logicielle ont donc Ă©tĂ© dĂ©veloppĂ©es dans le but de construire et tester en un minimum de temps : * [Bazel](https://fr.wikipedia.org/wiki/Bazel_(logiciel)) codĂ© en Java et gĂ©rĂ©/financĂ© par Google ; * [Buck](https://en.wikipedia.org/wiki/Buck_(software)) codĂ© en Java et gĂ©rĂ©/financĂ© par Facebook ; * [Pants](https://github.com/pantsbuild/pants) codĂ© en Python et gĂ©rĂ© par une communautĂ© ; * [Please](https://github.com/thought-machine/please) codĂ© en Go et gĂ©rĂ©/financĂ© par Thought Machine. Ces projets ne rĂ©utilisent pas les outils de *build* citĂ©s plus haut, et ne gĂ©nĂšrent pas les fichiers projet des IDE. En revanche, ces outils analysent finement le graphe de dĂ©pendance, gĂšrent de gros dĂ©pĂŽts de code source, parallĂ©lisent la construction logicielle sur tous les cĆurs (CPU) de nombreuses machines (cloud). Les Ă©tapes du *build* sont [mĂ©moĂŻsĂ©es](https://fr.wikipedia.org/wiki/MĂ©moĂŻsation) pour Ă©viter de refaire la mĂȘme opĂ©ration N fois (par exemple, pour Ă©viter de compiler un fichier non modifiĂ©, ou de lier une bibliothĂšque inchangĂ©e). Sans avoir Ă recourir Ă ces outils, on peut amĂ©liorer les temps de compilation C++ et dâĂ©dition de liens *(link)* avec ces deux bons vieux outils : * [`ccache`](https://fr.wikipedia.org/wiki/Ccache) pour Ă©viter de recompiler (ou lier) un fichier inchangĂ© ; * [`distcc`](https://fr.wikipedia.org/wiki/Distcc) pour distribuer le *build* sur plusieurs machines (voir aussi [icecream](https://github.com/icecc/icecream)). Ces outils `ccache` et `distcc` sont pris en charge par CMake, SCons, ... Les dĂ©pendances : gestion, essais, Ă©checs et solution finale ====================== Gestion de dĂ©pendances en C++ ----------------------------- Mais au fait, comment gĂ©rer les dĂ©pendances C++ ? Quel est le [gestionnaire de paquets](https://fr.wikipedia.org/wiki/Gestionnaire_de_paquets) C++ officiel (*package manager*) ? Quel est lâĂ©quivalent C++ pour les commandes `pip`, `npm`, `gem`, `go-get` et `cargo` ? Eh bien... disons que nous avons des initiatives encourageantes : * le groupe de travail **SG15** (du comitĂ© de standardisation du C++) rĂ©flĂ©chit Ă une nouvelle approche pour compiler le C++ (voir leurs propositions [P1482](http://wg21.link/P1482) et [P1484](http://wg21.link/P1484) en anglais) ; * le projet [**build2**](https://build2.org/build2-toolchain/doc/build2-toolchain-intro.xhtml#tldr) est trĂšs bien pensĂ© et dont son auteur avait proposĂ© de standardiser arborescence des projets C++ avec [P1204](http://wg21.link/P1204) ; * le projet [**conan**](https://conan.io/) utilise une configuration en Python et propose dĂ©jĂ 600 paquets C++ disponibles sur les deux dĂ©pĂŽts publics principaux ([conan-central](https://bintray.com/conan/conan-center) et [bincrafters](https://bintray.com/bincrafters/public-conan)) ; * le projet [**vcpkg**](https://github.com/microsoft/vcpkg/tree/master/ports) se base sur CMake et propose 1000 paquets C++ dont une bonne partie sont compatibles Windows, GNU/Linux et macOS ; * le projet [**Hunter**](https://docs.hunter.sh/en/latest/packages/all.html) se base Ă©galement sur CMake et propose environ 300 paquets C++. Attention Ă ne pas confondre lâexĂ©cutable `b` du projet **build2** avec lâexĂ©cutable `b2` du projet [**Boost.build**](https://github.com/boostorg/build) citĂ© plus haut. Copier les dĂ©pendances dans son code source ------------------------------------------- Une autre façon de gĂ©rer trĂšs simplement ses dĂ©pendances C++ est de carrĂ©ment copier le code source de cellesâci (et aussi le code source des dĂ©pendances des dĂ©pendances) avec le code source de lâapplication. Ăa compile toujours. Mais ce nâest pas une bonne pratique pour, au moins, deux raisons : 1. respecter les licences libres, câest avant tout Ă©viter de mĂ©langer des codes sources de licences et dâauteurs diffĂ©rents ; 1. mixer les codes source complique leur mise Ă jour (par exemple, comment intĂ©grer la correction dâune faille de sĂ©curitĂ© ?). Microsoft me fait perdre deux jours ----------------------------------- Je teste diffĂ©rents moyens pour obtenir le paquet uWebSocket : le *package manager* de ma distribution, Conan, Hunter... et finalement, le paquet uWebSocket a fraĂźchement Ă©tĂ© [intĂ©grĂ© au dĂ©pĂŽt **vcpkg**](https://github.com/microsoft/vcpkg/tree/master/ports/uwebsockets). Je teste, et, ĂŽ miracle, cela tĂ©lĂ©charge le code source et me lâinstalle sur ma distribution GNU/Linux ! Lâoutil **vcpkg** fonctionne avec CMake, donc ce sera CMake qui gĂ©rera la construction logicielle. Le temps de se documenter et bien prendre en main **vcpkg**, de tenter une intĂ©gration dans mon `CMakeLists.txt`, dâĂ©chouer, de recommencer... Pourtant lâ[exemple avec SQLite3](https://github.com/microsoft/vcpkg/blob/master/docs/examples/installing-and-using-packages.md#cmake) fonctionne chez moi... Arg... En fait, câest mal empaquetĂ©, le `find_package()` ne pourra jamais trouver la bibliothĂšque uWebSocket fournie par **vcpkg**. Jâessaye de le faire moiâmĂȘme. Puis, je me rends compte au second jour que **vcpkg** est un outil amateur, Ă ne surtout pas utiliser pour aller en production : pas de version des dĂ©pendances, impossible de dĂ©cider des options de compilation des dĂ©pendances... Allez, on empaquette soiâmĂȘme cette bibliothĂšque ------------------------------------------------ Bon, je connais bien C++, alors empaqueter proprement une bibliothĂšque qui ne dĂ©pend de rien ne devrait pas poser problĂšme. Je retrousse mes manches et je commence Ă chercher si quelquâun a dĂ©jĂ empaquetĂ© uWebSockets... Je trouve surtout que le mainteneur principal a supprimĂ© les fichiers `CMakeLists.txt` et `meson.build` en [2017](https://github.com/uNetworking/uWebSockets/commit/c28ac971953a11569a5b1c2437abea5dbcd6f6ed). Et celuiâci semble envoyer bouler les [contributeurs proposant la compatibilitĂ© avec CMake](https://github.com/uNetworking/uWebSockets/pull/769), supprime le titre des *pull requests* et on trouve mĂȘme des commentaires [supprimĂ©s](https://github.com/uNetworking/uWebSockets/pull/221). On trouve une explication dans la [FAQ](https://github.com/uNetworking/uWebSockets/blob/master/misc/FAQ.md) : > _I donât accept any specific build systems because I know from experience that doing so opens up hell. People simply cannot agree on which build system to use, or even how to use one particular build system._>> _Thatâs why I no longer accept any such PRs. Iâve had too many CMake PRs dragging in completely different directions to know this is the only solution._>> _Youâll have to clone the repo and create a new project in whatever build system you want to use._ En gros, le mainteneur principal refuse tout systĂšme de construction logicielle, car les dĂ©veloppeurs veulent utiliser diffĂ©rents outils et que pour un mĂȘme outil, les dĂ©veloppeurs ne se mettent pas dâaccord sur la bonne façon de faire. Un _commit_ trĂšs Ă©tonnant est le « [*Not my problem*](https://github.com/uNetworking/uWebSockets/commit/614d02e4620d5af5e4cdc654d9ac59cde86eb51f) » qui change la licence et remplace dans tous les fichiers la ligne : `Copyright 2018 Alex Hultman and contributors.` par : `Authored by Alex Hultman, 2018-2019.` `Intellectual property of third-party.` CMake gagne, Meson rentre Ă la maison ------------------------------------- Mon IDE prĂ©fĂ©rĂ© pour le C++ est QtCreator, mais celuiâci ne prend pas [encore](https://bugreports.qt.io/browse/QTCREATORBUG-18117) en charge Meson. Et je nâai plus beaucoup de temps pour prendre en main GNOME Builder. Et jâobtiens un joli `CMakeLists.txt` qui fonctionne sur deux diffĂ©rentes distributions GNU/Linux et aussi sur GitLab. Je me rends aussi compte que GCC 8 ne compile pas cette bibliothĂšque, et que nous devons utiliser seulement Clang. Mais, mon plus gros problĂšme est que je nâarrive plus Ă faire compiler cette bibliothĂšque par QtCreator, alors quâavec la ligne de commande cela fonctionne parfaitement... Argh... Jâinvestis encore du temps... Ăchec C++ --------- Mes collĂšgues ne comprennent pas pourquoi je mets autant de temps pour faire lâĂ©quivalent dâun `pip install` en C++. De plus, je vais devoir refaire ce mĂȘme travail dĂšs que jâintĂ©grerai les autres bibliothĂšques : base de donnĂ©es, [file dâattente de messages](https://fr.wikipedia.org/wiki/File_d%27attente_de_message), [journalisation](https://fr.wikipedia.org/wiki/Historique_(informatique))... Nous dĂ©cidons ensemble dâarrĂȘter de sâobstiner, de relever la tĂȘte, et de lister les possibilitĂ©s : * continuer lâintĂ©gration de uWebSockets avec CMake ; * utiliser seulement les paquets Conan ou Hunter comme `boost::beast` pour la websocket (câest mĂȘme disponible avec `apt install`) ; * revenir sur le Python et implĂ©menter la Souscription/Publication ; * passer sur Node.js et intĂ©grer la bibliothĂšque C++ uWebSockets avec la simplicitĂ© de `npm` ([uWebSockets.js](https://github.com/uNetworking/uWebSockets.js)) ; * prendre le virage Rust, seul rival au C++ avec la simplicitĂ© de `cargo` ; * *Go to the* langage Go qui est simple comme Python et est une des technos les plus performantes. WebSocket en Node.js -------------------- Jâai plusieurs collĂšgues trĂšs compĂ©tents en Node.js, alors câest parti. Effectivement, lâinstallation de la dĂ©pendance est trĂšs simple et on implĂ©mente rapidement lâapplication. Le grand avantage de Node.js (et de JavaScript en gĂ©nĂ©ral) est la taille de la communautĂ© et lâesprit de partage et dâinnovation incroyables. Alors quâune dĂ©cennie est nĂ©cessaire en C++ pour se dĂ©cider, la communautĂ© JavaScript dĂ©cide en quelques mois. Les projets, les concepts de programmation, les mĂ©thodes de travailler ne cessent dâĂ©voluer. Jâentre dans un vaisseau qui se dĂ©place Ă la vitesse de la lumiĂšre. En C++, la durĂ©e de vie dâun projet peut ĂȘtre dâune dizaine dâannĂ©es. En Node.js, câest plutĂŽt dix mois. Câest aussi lâinconvĂ©nient, il faut sâadapter vite. Mais, nous nous apercevons que le projet uWebSockets.js ne prend pas en charge la Souscription/Publication de la bibliothĂšque sousâjacente uWebSockets. Ăa ne marche pas. Stop, nous venons de gagner en maturitĂ©, voyons voir les possibilitĂ©s : * Node.js (implĂ©menter la Souscription/Publication en JavaScript...) ; * Rust ; * Go. Les principaux enseignements ==================================================== WebSocket en Go --------------- Nous prenons conscience que la partie WebSocket risque dâĂȘtre un point sensible au niveau performance. Finalement, nous mettons entre parenthĂšses notre tentative Node.js. Le Rust est encore trop jeune (peu de dĂ©veloppeurs maĂźtrisant Rust sur le marchĂ©). Et nous avons un collĂšgue devops fan du Go. Notre collĂšgue maĂźtrisant Go nâĂ©tant pas trĂšs disponible, on apprend se dĂ©brouille seul. Finalement, le principal du langage Go sâacquiert en quelques heures de programmation. Le test WebSocket est un succĂšs et nous implĂ©mentons une premiĂšre version basique de la publication/souscription en Go. Nous mettrons en place des tests de performance reproductibles, et seulement aprĂšs nous pourrons dĂ©cider quelles sont les parties qui nĂ©cessitent dâĂȘtre optimisĂ©es. Valoriser lâĂ©chec ----------------- * Câest grĂące Ă nos Ă©checs successifs que nous avons pu trouver notre solution pour les WebSockets ; * nous aurions pu dĂ©cider quâil fallait Ă©viter les Ă©checs ; * mais nous avons plutĂŽt cherchĂ© Ă nous planter car lâĂ©chec est un trĂšs bon moyen dâapprendre (de ses erreurs) ; * se planter plus rapidement/souvent permet donc dâapprendre plus vite ou souvent ; * donc, essayons dâaugmenter nos Ă©checs (car câest augmenter notre apprentissage) ; * pour encourager Ă tester une idĂ©e, nous devons valoriser lâĂ©chec ; * tester simplement/rapidement une idĂ©e permet de gagner en maturitĂ©. Enseignements sur les langages ------------------------------ * Ce nâest pas une bonne idĂ©e de coder dans son langage de programmation (C++) ; quand on est le seul dĂ©v. de lâorganisation qui connaisse ce langage ; * JavaScript et Node.js ça dĂ©coiffe ; * Go câest vraiment simple (car câest limitĂ©). Louanges sur la simplicitĂ© ------------------------- * La simplicitĂ© permet de se concentrer sur lâessentiel ; * faire simple est souvent compliquĂ© ; * avoir une IT simple permet dâintĂ©grer de nouvelles contraintes et idĂ©es plus facilement ; * dans un monde de plus en plus concurrentiel et qui sâaccĂ©lĂšre, la simplicitĂ© Ă©vite de se perdre dans le brouillard. Je continue dâaimer le C++ ========================== Mais, non, je nâabandonne pas le C++ ! JâapprĂ©cie dâacquĂ©rir de nouvelles cordes Ă mon arc, de mâouvrir lâesprit sur de nouvelles pratiques. Certaines technologies sont plus adaptĂ©es Ă certains contextes. Nâayons pas de dogme, choisissons la bonne technologie selon la situation. Cependant, je ne sais pas quand je coderai Ă nouveau en C++... PeutâĂȘtre quand on aura un *C++ package manager* standardisĂ©... :-) On embauche =========== Un peu de publicitĂ©... Tu apprĂ©cies cet Ă©tat dâesprit et que tu aimes coder en Python, Node.js, JavaScript/TypeScript/Angular ou Go ? NâhĂ©site pas Ă me contacter sur `oli (Ă ) Lmap (point) org`. Nous avons des postes Ă Paris et Ă Metz. On peut sâarranger pour le tĂ©lĂ©travail. Pour le moment, on ne publie rien sous licence libre. Mais je pousse pour libĂ©rer quelques briques intĂ©ressantes... [^1]: Utiliser [Pythran](https://linuxfr.org/tags/pythran/public), [PyPy](https://fr.wikipedia.org/wiki/PyPy), [Cython](https://fr.wikipedia.org/wiki/Cython), [Numba](https://en.wikipedia.org/wiki/Numba), etc. accĂ©lĂšre lâexĂ©cution, mais cela ralentit le dĂ©veloppement : compilation plus lente, dĂ©veloppement plus complexe, bogue difficile Ă investiguer...