10 moments eurêka de codage dans la communauté


  • FrançaisFrançais



  • Si vous avez écrit du code, vous savez qu’il faut de la pratique pour bien le maîtriser. Que cela prenne des mois ou des années, il y a inévitablement un moment d’épiphanie.

    Nous voulions entendre parler de cette époque, alors nous avons demandé à notre communauté de partager à propos de cette époque où ils se sont assis et ont écrit du code qui les a vraiment rendus fiers.


    L’un des miens autour du codage remonte à l’université dans les années 70. J’ai appris à analyser des expressions arithmétiques et à les mettre en notation polonaise inversée. Et puis, j’ai compris que, tout comme la multiplication est une addition répétée, la division est une soustraction répétée. Mais vous pouvez le rendre plus rapide en commençant avec une puissance appropriée de 10. Et avec cela, j’ai écrit un programme BASIC Plus sur un PDP 16 bits 11/45 exécutant RSTS pour faire de l’arithmétique multi-précision. Et puis, j’ai ajouté un tas de sous-routines pour divers calculs. Je l’ai testé en calculant PI à 45 chiffres. Il a fonctionné pendant une demi-heure mais a fonctionné. Je l’ai peut-être enregistré sur DECtape. — Greg Scott


    Au milieu des années 90, j’ai travaillé au sein d’une petite équipe de consultants (trois programmeurs) sur la planification et l’ordonnancement de la production pour une grande entreprise sidérurgique. L’application devait être livrée sur les postes de travail Hewlett-Packard (alors tout à fait la chose), et l’interface graphique devait être réalisée sous XWindows. À notre grand étonnement, c’est CommonLisp qui est sorti avec la première interface décente pour Motif, qui avait (pour l’époque) une très belle boîte à outils de widgets. En conséquence, l’intégralité de l’application a été réalisée dans CommonLisp et a fonctionné de manière acceptable sur les postes de travail. C’était très amusant de faire quelque chose de commercial en Lisp.

    Comme vous pouvez le deviner, la société a ensuite voulu transférer les postes de travail Hewlett-Packard vers quelque chose de bon marché, et donc, environ quatre ans plus tard, nous avons réécrit l’application en C avec l’amélioration attendue des performances. —Marty Kalin


    Ce sujet a ramené un vieux souvenir. Bien que j’aie eu de nombreux moments d’autosatisfaction de l’écriture du premier programme C pour imprimer un triangle à l’écriture d’un webhook d’admission de validation et des opérateurs pour Kubernetes à partir de zéro.

    Pendant longtemps, j’ai vu et joué à des jeux écrits dans différentes langues, et j’ai donc eu une envie irrésistible d’écrire quelques jeux possibles en utilisant le script shell bash.

    J’ai écrit le premier, tic-tac-toe et ensuite Minesweeper, mais ils n’ont été publiés qu’il y a quelques années, lorsque je les ai envoyés sur GitHub, et les gens ont commencé à les aimer.

    J’étais heureux d’avoir l’opportunité de publier l’article sur ce site. —Abhishek Tamrakar


    Bien qu’il y ait eu d’autres œuvres plus récentes, deux morceaux assez longs d’un doggerel sautent à l’esprit, principalement à cause du “Eureka!” moments où j’ai pu examiner la sortie et vérifier que j’avais bien compris les pierres de Rosetta avec lesquelles je travaillais suffisamment pour déchiffrer les données cryptiques :

    • UNPAL: Un désassembleur croisé écrit en langage assembleur MACRO-10 de DECsystem-10. Il faudrait les binaires PDP-11 et les reconvertir en langage assembleur PDP-11 MACRO-11. Beaucoup de félicitations aux personnes qui écrivaient la documentation à l’époque, en particulier les quelque 17 volumes du DEC-10, remplis d’excellentes informations et d’une bonne dose d’humour. UNPAL a fait son chemin dans le monde et est probablement le seul morceau de code qui a été utilisé par des personnes en dehors de mes écoles ou de mon lieu de travail. (D’un autre côté, certains de mes documents/tutoriels se sont répandus sur de nombreuses listes de diffusion et sites Web externes.)
    • MUNSTER: Écrit dans une langue que je n’avais pas encore apprise, pour un système d’exploitation que je n’avais jamais rencontré auparavant, sur un ordinateur dont j’avais seulement entendu parler, pour un synthétiseur dont je ne connaissais rien, en utilisant une documentation cryptique. Le langage était C, la machine, un Atari 1040-ST (? ST-1040?), le système d’exploitation, je ne m’en souviens pas, mais cela avait quelque chose à voir avec GEM ? Et le synthétiseur, un Korg M1 – d’où le nom “munster” (m1-ster). C’était toute une expérience d’apprentissage, en étudiant tous les composants simultanément. Le code viderait et restaurerait la mémoire de huit synthétiseurs dans le laboratoire de musique. Le manuel Korg n’a pas réussi (à mon humble avis) à vraiment expliquer le format des données. L’annexe était un labyrinthe de petits passages sinueux tous semblables, avec beaucoup de “Note 8 : Voir la note 14 dans le Tableau 5. Tableau 5, Note 14 : Voir les notes 3, 4 et 7 dans le Tableau 2.” Finalement, j’ai déchiffré à partir d’une image sans aucune explication réelle, que lors du vidage des données, chaque ensemble de sept octets de 8 bits était converti en huit octets de 7 bits, en supprimant le bit de poids fort de chacun des sept octets et en préfixant les sept bits de poids fort dans un octet supplémentaire précédant les sept octets supprimés. Cela a dû être compris à partir d’une petite illustration dans l’annexe (voir la capture d’écran ci-jointe du manuel):

    —Kevin Cole


    Pour moi, c’est définitivement la fonction de synchronisation de GSequencer AgsThread::clock().

    Travailler avec le parallélisme

    Au cours du développement de GSequencer, j’ai rencontré de nombreux obstacles. Lorsque j’ai commencé le projet, j’étais à peine familiarisé avec l’exécution de code multithread. j’étais au courant pthread_create(), pthread_mutex_lock(), et pthread_mutex_unlock().

    Mais ce dont j’avais besoin, c’était d’une fonctionnalité de synchronisation plus complexe. Il y a principalement trois choix disponibles : les verrous conditionnels, les barrières et les sémaphores. J’ai opté pour les verrous conditionnels car il est disponible à partir de l’API de thread GLib-2.0.

    Les verrous conditionnels ne poursuivent généralement pas le déroulement du programme jusqu’à ce qu’une condition dans une boucle devienne FAUX. Donc dans un fil, vous faites, par exemple:

    gboolean start_wait;
    gboolean start_done = FALSE;

    static GCond cond;
    static GMutex mutex;

    /* conditional lock */
    g_mutex_lock(&mutex);

    if(!start_done){
      start_wait = TRUE;

      while(start_wait &&
            !start_done){
          g_cond_wait(&cond,
                      &mutex);
      }
    }

    g_mutex_unlock(&mutex);

    Dans un autre thread, vous pouvez réveiller le verrou conditionnel, et si conditionnel est évalué à FALSE, le flux du programme se poursuit pour le thread en attente.

    /* signal conditional lock */
    g_mutex_lock(&mutex);

    start_done = TRUE;

    if(start_wait){
      g_cond_signal(&cond);
    }

    g_mutex_unlock(&mutex);

    Libags fournit un wrapper de thread construit au-dessus de l’API de threading de GLib. Les AgsThread l’objet synchronise l’arborescence des threads en AgsThread::clock() un événement. C’est une sorte de piège de parallélisme.

    Tous les threads de l’arborescence se synchronisent sur AgsThread:max-precision par seconde car tous les threads doivent avoir le même temps d’exécution en parallèle. Je parle de parallélisme basé sur les tics, avec une précision maximale de 1000 Hz, chaque thread se synchronise 1000 fois dans l’arbre, ce qui vous donne une sémantique solide pour calculer un résultat déterministe de manière multithread.

    Puisque nous voulons exécuter des tâches exclusivement sans aucune interférence de threads concurrents, un verrou mutex est impliqué juste après la synchronisation, puis invoque ags_task_launcher_sync_run(). Sachez que le verrou conditionnel peut être évalué comme vrai pour de nombreux threads.

    Après combien de tics le flux est répété dépend de la fréquence d’échantillonnage et de la taille de la mémoire tampon. Si vous avez un AgsThread avec max-precision 1000, le taux d’échantillonnage de 44100 commun pour les CD audio et une taille de mémoire tampon de 512 images, puis le délai jusqu’à ce qu’il soit répété se calcule comme suit :

    tic_delay = 1000.0 / 44100.0 * 512.0; // 11.609977324263039

    Comme il se peut que la pré-/post-synchronisation ait besoin de trois tics pour faire son travail, vous obtenez huit tics inutilisés.

    La pré-synchronisation est utilisée pour la lecture à partir d’une carte son ou d’un périphérique MIDI. Le tic intermédiaire effectue le traitement audio proprement dit. La post-synchronisation est utilisée en sortant vers la carte son ou en exportant vers un fichier audio.

    Pour que cela fonctionne, je suis passé par des hauteurs et des profondeurs. C’est surtout parce que vous ne pouvez pas entendre ou voir un fil. Le débogage par lots de GDB a beaucoup aidé. Avec le débogage par lots, vous pouvez récupérer une trace de pile d’un processus en cours d’exécution. —Joël Kräheman


    Je ne sais pas si j’ai écrit un code dont je puisse être particulièrement fier – le fait d’être un programmeur neurodivers peut signifier que mon cas est que je ne suis qu’un programmeur moyen avec des forces et des faiblesses spécifiques.

    Cependant, il y a de nombreuses années, j’ai fait du codage en C avec des exemples de base dans des machines virtuelles parallèles, ce dont j’étais très heureux quand je les ai fait fonctionner.

    Il y a plus de dix ans, j’ai suivi un cours de programmation où j’enseignais Java à des étudiants adultes, et je suis heureux d’avoir pu organiser ce cours.

    Je suis récemment heureux d’avoir réussi à aider des étudiants handicapés au code de test de bogue en tant que travail à temps partiel. —Rikard Grossman-Nielsen


    Comme d’autres, cela m’a fait réfléchir. Je ne me considère pas vraiment comme un développeur, mais j’en ai fait en cours de route. Ce qui m’a marqué, c’est le facteur d’épiphanie, ou « moment d’épiphanie », comme vous l’avez dit.

    Quand j’étais étudiant à l’UNCW, j’ai travaillé pour le groupe du réseau OIT gérant le réseau des dortoirs. Les étudiants ont tous reçu leurs enregistrements d’adresse IP à l’aide du protocole Bootstrap (BOOTP), le prédécesseur de DHCP. Le fichier de configuration était maintenu à la main au début alors que nous n’avions qu’une trentaine d’étudiants. C’était la toute première année que le campus proposait Internet aux étudiants ! L’année suivante, alors que de plus en plus de dortoirs étaient câblés, le nombre a augmenté et a rapidement atteint plus de 200. J’ai écrit un petit programme C pour maintenir le fichier de configuration. L’épiphanie et “tout simplement la vieille partie soignée” était que mon code pouvait toucher et manipuler quelque chose de “réel” en dehors de lui-même. Dans ce cas, un fichier sur le système. J’ai eu un sentiment similaire plus tard dans une classe Java lorsque j’ai appris à lire et à écrire sur un serveur SQL.

    Quoi qu’il en soit, il y avait quelque chose de cool à voir un résultat réel d’un programme. Une autre chose étonnante est que le binaire original, qui a été compilé sur un système Linux Red Hat 5.1, fonctionnera toujours sur mon bureau Linux Fedora 34 actuel !! —Alan Formy-Duval


    À l’âge de 18 ans, j’étais certainement fier d’avoir écrit une application Virtual Basic pour une petite entreprise afin d’automatiser l’impression de fichiers AutoCAD en masse. A cette époque, c’était la première application “complexe” que j’écrivais. De nombreuses interactions utilisateur ont été nécessaires pour configurer les paramètres de l’imprimante. De plus, l’application a été intégrée à AutoCAD à l’aide de Com ActiveX. C’était difficile. La société a continué à l’utiliser jusqu’à récemment. L’application a cessé de fonctionner à cause d’un problème d’incompatibilité avec Windows 10. Ils l’ont utilisé pendant 18 ans sans problème !

    J’ai été chargé de réécrire l’application en utilisant la technologie d’aujourd’hui. j’ai écrit le nouvelle version en Python. En repensant au code que j’ai écrit, c’était drôle. C’était tellement maladroit.

    Ci-joint une capture d’écran de la première version.

    —Patrik Dufresne


    Une fois, j’ai intégré GitHub à la plate-forme Open Humans, qui faisait partie de mon projet Outreachy en 2019. C’était mon aventure dans Django, et j’ai beaucoup appris sur les API et les limites de débit dans le processus.

    De plus, très récemment, j’ai commencé à travailler avec Quarkus et à créer des API REST et GraphQl avec. J’ai trouvé ça vraiment cool. —Manaswini Das


    Vers 1998, je me suis ennuyé et j’ai décidé d’écrire un jeu. Inspiré d’un vieux jeu Mac des années 1980, j’ai décidé de créer un jeu de “simulation” où l’utilisateur construisait un simple “programme” pour contrôler un robot virtuel puis explorer un labyrinthe. L’environnement était jonché de prix et de pastilles d’énergie pour alimenter votre robot, mais contenait également des ennemis qui pourraient endommager votre robot s’il les heurtait. J’ai ajouté un « coût » énergétique afin qu’à chaque fois que votre robot se déplace ou effectue une action, il utilise un peu de son énergie stockée. Vous deviez donc équilibrer « récupérer des prix » avec « trouver des pastilles d’énergie ». Le but était de ramasser autant de prix avant de manquer d’énergie.

    J’ai expérimenté l’utilisation de GNU Guile (un langage d’extension Scheme) comme “backend” de programmation, ce qui a bien fonctionné, même si je ne connais pas vraiment Scheme. J’ai trouvé assez de Scheme pour écrire des programmes de robot intéressants.

    Et c’est ainsi que j’ai écrit GNU Robots. C’était juste une chose rapide pour m’amuser, et c’était amusant de travailler et de jouer. Plus tard, d’autres développeurs l’ont récupéré et l’ont utilisé, apportant des améliorations majeures à mon code simple. C’était tellement cool de redécouvrir il y a quelques années que vous pouvez toujours compiler des robots GNU et jouer avec eux. Félicitations aux nouveaux mainteneurs pour l’avoir maintenu. —Jim Hall

    Source

    N'oubliez pas de voter pour cet article !
    1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
    Loading...

    La Rédaction

    L'équipe rédactionnnelle du site

    Pour contacter personnellement le taulier :

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée.