54 points par GN⁺ 2025-03-11 | 9 commentaires | Partager sur WhatsApp
  • De nombreux ingénieurs logiciels travaillent sans véritable passion pour le logiciel
    • Ils travaillent simplement pour obtenir un bon salaire, mais sans passion, les performances finissent par baisser
    • Si l’on reste bloqué sur des technologies anciennes et des croyances erronées sans continuer à apprendre, on ne progresse pas
  • Les éléments nécessaires pour devenir un bon ingénieur
    • Il faut comprendre l’essence de l’ingénierie et construire des connaissances approfondies
    • Il faut apprendre continuellement de nouvelles technologies et les aborder avec esprit critique
    • Il faut prendre l’habitude d’appliquer et d’améliorer les connaissances acquises en pratique

# Qu’est-ce qui fait un bon ingénieur

  • Définition d’un ingénieur

    « Une personne qui applique des principes scientifiques pour analyser des problèmes, puis les résoudre par la conception, l’écriture de code, la fabrication, la création, et rendre ainsi le monde meilleur »

  • Les compétences attendues d’un ingénieur logiciel
    • Il faut comprendre les principes de fonctionnement d’un ordinateur
    • Une compréhension approfondie de la manière dont le matériel et le logiciel interagissent est nécessaire
    • Il faut apprendre à partir des bases, sans dépendre uniquement de langages ou de technologies abstraits

Compréhension approfondie du domaine

  • Une solide compréhension des principes fondamentaux est nécessaire
    • Ingénieur mécanique → connaissance des propriétés des matériaux et de leurs applications
    • Ingénieur logiciel → compréhension du fonctionnement de la mémoire et du CPU
  • Il faut apprendre à partir des principes fondamentaux
    • Une compréhension approfondie des concepts de base comme HTTP, la structure de la mémoire ou le fonctionnement des systèmes est indispensable
    • Il ne faut pas commencer par le haut niveau, mais construire ses connaissances depuis les bases

Apprentissage continu

  • Il faut continuer à apprendre les technologies les plus récentes et les tendances du développement
  • Il faut analyser de manière critique les avantages et les inconvénients des nouvelles technologies
  • Approfondir les nouveaux sujets découverts pendant l’apprentissage
    • Comme en mathématiques où un sujet mène à des thèmes plus détaillés, il faut élargir la profondeur de l’apprentissage

Comprendre les limites et les problèmes des technologies

  • Il faut comprendre clairement les forces et les faiblesses des outils et des langages
  • Il faut se méfier d’une attitude consistant à vouer un culte excessif à un langage ou à un outil particulier
  • Il est important de choisir l’outil le plus adapté au projet

Appliquer les connaissances en pratique

  • Connaître uniquement la théorie ne sert à rien
    • Il faut appliquer les connaissances acquises à de vrais projets
    • Il faut s’en servir pour résoudre des problèmes ou valider des concepts
  • Exemples d’application pratique
    • Construire un petit prototype
    • Résoudre des problèmes rencontrés au quotidien
    • Expliquer et enseigner ce que l’on a appris à d’autres personnes

# Comment devenir un meilleur ingénieur

Développer l’esprit critique

  • L’esprit critique est un élément central de l’ingénierie
    • Il est indispensable pour comprendre les concepts, leurs effets, et les remettre en question
    • Le manque d’esprit critique, ou le fait de le négliger, entraîne inefficacité et complexité
  • Renforcer sa capacité d’analyse critique
    • Lorsqu’on découvre un nouveau concept, il ne faut pas l’accepter aveuglément, mais examiner son efficacité et sa validité
    • Il faut analyser logiquement les avantages, les limites et les alternatives d’une approche donnée
  • Ressource pour apprendre l’esprit critique : voir Critical Thinking

Lire davantage de livres

  • La lecture est un moyen efficace d’acquérir des connaissances
    • Il existe de nombreux ouvrages sur des sujets variés liés au software engineering
    • Il ne faut pas simplement accepter le contenu d’un livre, mais l’aborder de manière critique
  • Exemples de questions pour une lecture critique
    • « Cette approche a-t-elle un problème ? »
    • « Existe-t-il une meilleure méthode ? »
    • « Si je faisais différemment, comment procéderais-je ? »
    • « Ce que ce livre explique est-il réellement correct ? »
  • Prendre l’habitude de rédiger des notes
    • Organiser et consigner ce que l’on apprend ainsi que ses réflexions
    • Lorsqu’un sujet inconnu est mentionné, faire des recherches complémentaires
    • Obsidian est recommandé comme outil de prise de notes (à choisir selon ses préférences)
  • Liste de lectures recommandées

Appliquer les connaissances acquises à des projets

  • Relier la théorie à la pratique
    • Le véritable apprentissage se produit quand on applique ce que l’on a appris à de vrais projets
    • Mettre concrètement en œuvre des concepts permet d’en obtenir une compréhension plus profonde
    • Il est important de construire soi-même, même de petits projets ou prototypes
  • Les bénéfices de l’application en pratique
    • On se confronte à de vrais problèmes qui ne sont pas visibles dans la théorie
    • Le processus de résolution de problèmes permet de concrétiser et d’améliorer ses connaissances
    • Les capacités de résolution de problèmes et de raisonnement logique se renforcent
  • Comment appliquer ce que l’on a appris
  • Construire de petits prototypes
    • Après avoir appris un nouveau framework, un langage ou un concept, essayer un petit projet
    • Ex. : après avoir étudié l’indexation de base de données, implémenter un système de recherche simple et comparer les performances
    • Résoudre des problèmes réels
      • Essayer de résoudre de petits problèmes rencontrés dans le quotidien ou au travail
      • Ex. : automatiser des tâches répétitives manuelles, améliorer des problèmes de baisse de performances, etc.
    • Enseigner ce que l’on a appris
      • Expliquer ce que l’on a appris à d’autres personnes renforce la compréhension
      • Rédiger un blog, un thread Twitter, ou en discuter avec des collègues
      • Le fait d’enseigner peut faire émerger de nouvelles perspectives
  • Si l’on applique continuellement ses connaissances, la compréhension théorique se transforme en compétence pratique, ce qui permet de devenir un ingénieur plus compétent

Évaluer et améliorer son propre code

  • L’autocritique est une habitude essentielle des excellents ingénieurs
    • Beaucoup d’ingénieurs font l’erreur de penser que si le code fonctionne, alors c’est « suffisant »
    • Mais un véritable ingénieur reconnaît qu’il y a toujours une marge d’amélioration
  • L’objectif de l’autoévaluation
    • Il n’est pas nécessaire d’être excessivement sévère avec soi-même
    • L’essentiel est de chercher en continu des occasions de s’améliorer
    • Il ne faut pas se satisfaire d’un code simplement fonctionnel, mais chercher à améliorer les performances, la maintenabilité et la lisibilité
  • Les effets d’une autoévaluation continue
    • La qualité du code s’améliore progressivement
    • L’autocritique renforce la capacité à résoudre les problèmes
    • Elle permet de faire progresser sans cesse ses connaissances et ses compétences

# Liste de recommandations pour les ingénieurs logiciels

Livres recommandés

  • Designing Data-Intensive Applications – conception d’applications orientées données
  • Introduction to Algorithms – (même l’édition coréenne porte un titre en anglais)
  • Writing a C Compiler
  • Essential Maths for Data Science – mathématiques essentielles pour les développeurs
  • Elements of Information Theory

Projets recommandés

  • Compilateur - essayer d’écrire un compilateur pour le langage de son choix, en s’appuyant sur LLVM ou la JVM
  • Émulateur - écrire un émulateur pour un CPU simple (ex. : 8086)
  • Moteur de rendu / moteur de jeu - écrire un programme graphique avec OpenGL ou Vulkan
  • Créer un visualiseur et éditeur de mémoire - écrire un programme qui interagit avec la mémoire d’autres programmes
  • Écrire un serveur HTTP - écrire un serveur HTTP dans un langage bas niveau
  • Évitez les sites web ou les projets trop simples. Leur valeur d’apprentissage peut être limitée. Choisissez l’un des projets mentionnés ci-dessus, étudiez le sujet, puis implémentez-le vous-même

Conclusion

  • Devenir un bon ingénieur ne consiste pas à connaître beaucoup de langages de programmation
  • Compréhension approfondie des principes fondamentaux + esprit critique + mise en pratique sont les éléments clés
  • Il faut apprendre, appliquer et s’améliorer sans cesse
  • L’ingénierie est un voyage sans fin, et l’attitude de progression est essentielle

Conclusion

  • L’essence de ce que signifie devenir un bon ingénieur
    • Ce n’est pas connaître le plus grand nombre de langages de programmation, maîtriser les frameworks les plus récents ou courir après chaque nouvelle technologie
    • Le cœur du sujet est une compréhension profonde des principes fondamentaux de l’ingénierie
    • Il faut appliquer les connaissances acquises à de vrais projets, penser de manière critique et continuer à progresser
  • Les caractéristiques des meilleurs ingénieurs
    • Ils ne cessent jamais d’apprendre et d’acquérir de nouvelles connaissances
    • Ils remettent constamment en question leurs hypothèses et cherchent des pistes d’amélioration
    • Ils appliquent ce qu’ils apprennent à la résolution de problèmes réels, collaborent avec leurs collègues et progressent
  • L’ingénierie est un parcours de toute une vie
    • Il faut de la curiosité (curiosity), de la discipline (discipline) et une volonté de progresser
    • En mettant en pratique ces principes, on peut devenir non seulement un bon ingénieur, mais un grand ingénieur

9 commentaires

 
gurugio 2025-03-11

J’ai aussi contribué à la partie gestion mémoire du noyau Linux, et je pense avoir une certaine compréhension du fonctionnement bas niveau. Mais quand je vois qu’au final je fais malgré moi un travail assez éloigné du développement, je me dis qu’il faut peut-être agir à l’inverse de cet article pour devenir un ingénieur qui réussit.

  • Suivre rapidement les nouvelles technologies
  • Penser au marché plutôt qu’à sa curiosité personnelle
  • Mieux savoir se mettre en valeur que s’autocritiquer
  • Se concentrer sur les tests de code plutôt que sur les principes ou la progression
    En rentrant au pays, je me suis rendu compte que le marché coréen est trop petit et la concurrence trop forte, donc il y a peu d’entreprises ou de postes où l’on peut se concentrer sur le développement. Et comme tout le monde se bat pour obtenir ces rares places, on a finalement l’impression qu’il faut se concentrer sur ce qui attire le plus l’attention pour pouvoir faire le développement qu’on veut vraiment faire.
 
malcomjj 2025-03-15

Je suis d’accord aussi ! Et j’ai l’impression que l’interprétation de ce qu’est un « bon » ingénieur, au sens évoqué ici, varie énormément d’une personne à l’autre. C’est peut-être un point de vue extrême, mais même si l’on reconnaît l’importance des connaissances fondamentales, ça amène à se demander si un ingénieur qui n’a aucune valeur sur le marché est vraiment un bon ingénieur.

 
takesixnotfive 2025-03-12

Je m’y reconnais vraiment…
C’est dommage que ce ne soit pas un jeu où l’on gagne selon notre capacité à bien comprendre et maîtriser l’essentiel,
mais plutôt un jeu où l’on gagne selon notre aptitude à bien utiliser un langage et des technologies spécifiques en suivant les tendances…

 
ethanhur 2025-03-11

Je pense qu’il y a aussi beaucoup de bons ingénieurs en Corée, mais je ressens moi aussi souvent une certaine frustration à cause de la taille du marché.

J’aurais aimé qu’un acteur comme FuriosaAI réussisse vraiment.

 
roxie 2025-03-16

FuriosaAI a fait faillite… ?

 
yoonda5898 2025-03-11

Je m’y reconnais un peu aussi... haha
Est-ce que c’est propre au marché coréen seulement...

 
tsboard 2025-03-11

Il n’y a pas si longtemps, j’ai animé au bureau un séminaire dans le cadre d’une étude du langage Kotlin, et je me souviens que la réaction avait été bonne parce que j’avais choisi de l’expliquer en le comparant au langage C++, principalement utilisé dans l’équipe. En réalité, je n’utilise presque jamais le C++, et les membres de l’équipe découvraient Kotlin pour la première fois, mais j’ai eu l’impression que, à bien des égards, cela avait aidé tout le monde à progresser.

 
GN⁺ 2025-03-11
Avis sur Hacker News
  • J’apprécie beaucoup l’avis sur la lecture de livres. Je vois souvent beaucoup d’ingénieurs passer à côté de nombreuses choses en préférant les vidéos et les publications superficielles à la documentation et aux livres

    • Je suis aussi surpris de voir à quelle fréquence les gens posent des questions sur des détails insignifiants au lieu de lire la documentation ou au moins de faire une recherche Google
    • La capacité à rechercher de l’information est une compétence très importante
  • Je suis d’accord avec beaucoup de points mentionnés dans cet article. En revanche, je ne suis pas certain de voir en quoi une compréhension approfondie des bases comme le CPU, la mémoire ou HTTP aide à devenir un meilleur ingénieur

    • La plupart des ingénieurs travaillent à un niveau d’abstraction très élevé, et les langages et frameworks utilisés à ce niveau ne permettent pas d’accès bas niveau à la mémoire, par exemple
    • Il ne faut pas être ignorant de ces notions de base, mais je ne vois pas leur application concrète au quotidien en dehors du cadre académique
 
sankalpa 2025-03-27

Je ne connais peut-être pas les fondamentaux jusqu’au plus profond, mais j’ai vu que ne pas les connaître produit des résultats vraiment aberrants et totalement inimaginables.
Par exemple, implémenter une recherche en chargeant tous les enregistrements de la base de données en mémoire, puis en recherchant en mémoire.
Quand il y a peu d’enregistrements, ça fonctionne bien, mais quand ils deviennent nombreux, la mémoire explose.
Ils codent ainsi parce qu’ils ne comprennent absolument pas la différence entre la mémoire et une base de données.
Ce n’est qu’un exemple, et à chaque fois ils implémentent dans des directions vraiment inimaginables.
Un programmeur « ordinaire » ne peut vraiment pas l’imaginer.