7 points par GN⁺ 2023-12-27 | 1 commentaires | Partager sur WhatsApp

Éditeur de texte

  • On utilise un éditeur de texte tous les jours, mais savez-vous vraiment comment il fonctionne ? Commencez par implémenter les fonctionnalités de base.
  • Le plus grand défi consiste à déterminer comment stocker un document texte en mémoire. Utiliser un tableau pose des problèmes de performance ; il faut donc étudier différentes structures de données pour y remédier.
  • Apprenez comment fonctionne le curseur de texte, puis, après avoir implémenté un éditeur de base, attaquez-vous à l’undo/redo et au retour automatique à la ligne par mot.

Jeu 2D - Space Invaders

  • Même un jeu simple nécessite des structures de données particulières et des design patterns. L’objectif est moins de se concentrer sur le game design et l’art que sur l’implémentation globale du jeu.
  • Apprentissage du rendu à l’écran, de la boucle de jeu, de la gestion des entrées utilisateur, de la création et de la gestion d’objets dynamiques, ainsi que de l’application de la logique du jeu.
  • Une fois le jeu de base implémenté, il est possible de l’étendre avec un menu d’écran titre, un écran de game over, une vitesse identique sur différentes machines, l’ajout d’IA, etc.

Compilateur - Tiny BASIC

  • Implémenter un compilateur est un projet qui demande une compréhension approfondie de la programmation. Commencez par écrire un compilateur pour un langage simple comme Tiny BASIC.
  • Apprenez les étapes de tokenisation du code (analyse lexicale), de parsing (vérification de la structure et génération d’un arbre), d’analyse sémantique et de génération de code.
  • Après une implémentation de base, on peut l’étendre en ajoutant une bibliothèque standard, une phase d’optimisation ou de meilleurs messages d’erreur.

Mini système d’exploitation

  • Les concepts fondamentaux d’un système d’exploitation peuvent s’appliquer à de nombreux domaines. Implémenter un système d’exploitation permet aussi de mieux comprendre le matériel.
  • La courbe d’apprentissage dépend fortement du matériel, mais en suivant un livre ou un tutoriel, il est possible de créer un OS bootable.

Tableur

  • Une application de tableur combine les défis de l’éditeur de texte et du compilateur. On y apprend à représenter le contenu des cellules en mémoire et à implémenter un interpréteur pour le langage des formules.

Émulateur de console de jeux vidéo

  • Écrire un émulateur combine en un seul projet les défis du compilateur, du système d’exploitation et de l’écriture de compilateurs. Jouer à de vrais jeux sur son propre émulateur est une expérience gratifiante.
  • Émuler une véritable console de jeux vidéo signifie écrire une machine virtuelle qui se comporte comme le CPU et les autres composants matériels de cette console.

L’avis de GN⁺

  • Pour consolider les bases de la programmation, implémenter un éditeur de texte ou un jeu simple aide réellement à comprendre le fonctionnement interne des logiciels que l’on utilise au quotidien.
  • Des projets complexes comme un compilateur ou un système d’exploitation exigent une compréhension approfondie des langages de programmation et de l’architecture des ordinateurs, ce qui est essentiel pour développer des compétences avancées en ingénierie logicielle.
  • Ces projets offrent aux programmeurs une expérience à la fois stimulante et enrichissante, que ce soit pour apprendre un nouveau langage ou framework, ou pour approfondir leurs connaissances existantes.

1 commentaires

 
GN⁺ 2023-12-27
Avis Hacker News
  • Réaliser des projets comme un éditeur de texte, un compilateur, un système d’exploitation ou un ray tracer peut améliorer les compétences en programmation, mais pas forcément les compétences en ingénierie logicielle. En réalité, ce type de projet peut même être contre-productif pour l’ingénierie logicielle, car il véhicule le principe désastreux du « Not Invented Here ».

    • La capacité à décider s’il faut utiliser une bibliothèque existante ou écrire soi-même
    • La capacité à identifier des bibliothèques et frameworks de qualité adaptés aux exigences du projet
    • La capacité à déterminer où l’optimisation a de la valeur et où elle n’en a pas
    • La capacité à écrire du code qui reste lisible plusieurs années plus tard
    • La capacité à considérer un projet comme un système complexe à grande échelle, en prenant en compte les dépendances logicielles et non logicielles
    • Comme défi alternatif, il est proposé de créer un moteur de recherche web. Puisque des éléments comme les algorithmes de recherche de chaînes ont déjà été résolus par d’autres, l’objectif est de construire un moteur de recherche réellement fonctionnel, avec son crawler.
  • Pour des projets orientés UI/web, les recommandations sont les suivantes :

    • Un petit jeu vidéo avec Unity ou Unreal (comme le 30-60 fps est important dans les jeux, cela aide aussi à concevoir des interfaces performantes ailleurs)
    • Un framework JavaScript simple de type React (utile pour comprendre les flux de données et la gestion des événements)
    • Un wrapper de bibliothèque HTTP autour de XMLHTTPRequest (fetch existe, mais comprendre comment envoyer et lire des requêtes HTTP depuis zéro aide à déboguer les problèmes de CORS, les requêtes OPTIONS, etc.)
  • Avis favorable sur les mini systèmes d’exploitation. En tant que développeur d’applications, on dépend de fonctionnalités du système d’exploitation comme la gestion mémoire ou le système de fichiers, et il est naturel de vouloir comprendre comment tout cela fonctionne en coulisses. Utiliser xv6 pour apprendre et implémenter différents algorithmes d’ordonnancement des processus pendant son temps libre est une expérience très utile et amusante.

  • L’envie de mettre les mains dans quelque chose de physique, par exemple un robot, un drone avec pilote automatique, ou une simulation précise de la dynamique de vol d’un vaisseau spatial avec des paramètres GNC programmables. La personne possède le livre "Fundamentals of Astrodynamics" et souhaite l’exploiter pendant les vacances. Elle aimerait trouver de bonnes ressources sur le GNC (guidage, navigation et contrôle).

  • Cela dépend des goûts et de la situation de chacun, mais si l’on cherche des idées, cette liste peut être un bon point de départ. Quelqu’un raconte avoir créé sur Sinclair ZX Spectrum un éditeur de portée musicale, un tracker et des jeux 2D comme Space Invaders. Sur son premier ordinateur (un 386), il a développé un compresseur Huffman, un index B-Tree, un générateur de formulaires orienté objet, un vérificateur d’e-mails pour connexion dial-up, ainsi que des parseurs manuels.

  • Discussion sur les éditeurs de texte : le plus grand défi est la manière de stocker un document texte en mémoire. Utiliser un tableau semblait être la première idée, mais les performances deviennent très mauvaises dès qu’on insère du texte ailleurs qu’à la fin du document. Pourtant, avec des chaînes JavaScript, il n’y a eu aucun problème de performance après plus de deux ans d’utilisation de l’éditeur. Bien sûr, beaucoup d’autres problèmes sont apparus ; par exemple, le rendu de longues lignes horizontales s’est révélé problématique parce que l’approche d’optimisation supposait qu’afficher une seule ligne serait peu coûteux.

  • Essayer un petit ray tracer jouet est aussi une bonne idée. Construire un ray tracer qui gère des sphères en bitmap, ainsi que la réflexion diffuse et spéculaire, peut rester un projet relativement limité tant qu’on n’essaie pas de le rendre trop complexe.

  • Si vous pensez qu’il faut un « factory pattern » pour écrire Space Invaders, c’est qu’il y a probablement un problème. Rien ne permet de penser que ce genre de concept de design était utilisé dans le jeu d’origine.

  • Avis sur les éditeurs de texte qui utilisent des tableaux comme structure de données. Pendant la frappe, il faut surtout de la rapidité, et une seule ligne est modifiée à la fois. Lorsqu’on saisit une nouvelle ligne, le délai supplémentaire nécessaire pour réorganiser le tableau après avoir appuyé sur Entrée n’est pas perceptible, même sur des millions de lignes. La partie la plus difficile d’un éditeur de texte est plutôt de s’assurer qu’on ne rend à l’écran que ce que l’utilisateur voit.