Comment les donjons multi-utilisateurs m'ont appris à programmer

«Maman, qu'est-ce que tu veux que j'écrive? Dites-le-moi et j'écrirai un programme pour vous. C'était moi à 9 ans, tirant de toute urgence sur la jambe de pantalon de ma mère.

Je ne me souviens pas de ce que j'ai fini par écrire en BASIC sur notre ordinateur Timex Sinclair, mais je me souviens avoir voulu être pris au sérieux - vouloir faire quelque chose qui serait utile à quelqu'un. Je pense que mon père a acheté cet ordinateur sur un coup de tête dans un catalogue de vente par correspondance, ce qui était surprenant car il n'est pas vraiment un gars de gadgets. Nous l'avons raccordé à un vieux téléviseur portable noir et blanc de 8 pouces que nous avions. Ma mère a écrit un programme qui imprimait mon nom sur l'écran en une boucle infinie.

L'ordinateur m'appelait. Mon frère et moi avons écrit des choses en BASIC sur cet ordinateur, et nous avons même pu charger et sauvegarder nos programmes à l'aide d'un lecteur de cassette connecté à la prise audio de l'ordinateur. Nous avons essayé de lire la cassette du logiciel sur un lecteur de bande ordinaire et cela ressemblait à des cigales hurlantes.

Ce n'est que plus tard, à 14 ans, que j'ai vraiment été enthousiasmé par la programmation. Je suis devenu accro à un jeu d'aventure en ligne - un donjon multi-utilisateurs (MUD) gratuit appelé HexOnyx. Hex était un monde virtuel populaire avec au moins une centaine de personnes jouant à tout moment. Bien que les MMPORG d'aujourd'hui hébergent des millions de personnes à la fois, à l'époque, quelques centaines de personnes dans un même espace virtuel semblaient beaucoup. Je me suis fait de grands amis là-bas, et chaque nuit, nous combattions des wargs et des démons de décomposition vicieux dans les donjons et les bois sombres. Le jeu était entièrement basé sur du texte, donc l'imagination était obligatoire. Près de 20 ans plus tard, j'ai encore des photos dans ma tête de certains des anciens terrains de jeu du jeu.

Chaque jour après l'école était une nouvelle aventure dans la boue, jusqu'à ce que la cloche du dîner familial me ramène dans le monde physique. "Je serai là!" Je criais, pour me faufiler dans la salle à manger beaucoup plus tard, à mi-chemin du repas. Il n'y a jamais de point d'arrêt facile lorsque vous faites face à une bête lamia à quatre pattes qui veut votre tête pour son prochain repas.

Pendant des mois, mes amis en ligne et moi avons combattu ces créatures générées par ordinateur de manière obsessionnelle. J'ai finalement fait progresser mon personnage jusqu'au point d'immortalité, qui est le point final efficace du jeu. * Les immortels ne peuvent plus se battre - leur rôle a été utile aux nouveaux joueurs, à résoudre les différends, à signaler les bogues, etc.

En me liant d'amitié avec les administrateurs et les développeurs de Hex, j'ai commencé à examiner la conception du MUD, en essayant de comprendre comment il était capable de déclencher une expérience aussi profondément immersive et en me demandant comment nous pourrions l'améliorer encore.

Il y avait des centaines de MUDS à l'époque, et chacun essayait de se différencier. Pour différencier Hex, les développeurs avaient créé un constructeur de monde personnalisé dans le jeu. Là où d'autres MUD devaient éditer un fichier texte plat avec un format propriétaire déroutant, le constructeur du jeu a rendu les mondes d'écriture agréables et a permis aux joueurs de s'impliquer facilement. Yaz, le gardien de Hex, avait ceci à dire:

«Le but du jeu de notre point de vue à l'époque était de créer un environnement qui pourrait être maintenu de l'intérieur du monde. c'est-à-dire: personne n'aurait vraiment besoin de lancer le jeu de l'extérieur. Nous nous sommes rapprochés du constructeur du monde. »

Avec le constructeur du monde, vous pouvez écrire une nouvelle porte et une nouvelle pièce dans le jeu, puis franchir la porte de la pièce et voir ce que vous ressentez. Cela a déclenché un boom de développement, avec de nombreux nouveaux mondes en construction, attendant d'être terminés et connectés à la carte principale du jeu. Ces mondes inachevés étaient des lieux étranges accessibles uniquement aux administrateurs et remplis de monstres assoiffés de sang qui erraient seuls jour et nuit.

Je n'avais aucun intérêt à construire des mondes; même avec le constructeur du monde, cela semblait être trop de travail. Au lieu de cela, je voulais comprendre la mécanique du logiciel et apporter des changements structurels.

Contrairement aux MMPORG modernes, la plupart des MUD, y compris HexOnyx, étaient effectivement open source. J'ai téléchargé CircleMUD, l'ancêtre d'HexOnyx, écrit par Jeremy Elson, et l'ai exécuté sur mon ordinateur personnel. J'avais déjà programmé quelques choses en BASIC, mais CircleMUD a été écrit en C - un tout nouveau monde pour moi. Le simple fait de le compiler était un projet. Mais petit à petit, j'ai compris comment faire de petits changements, et c'était passionnant pour makele MUD et voir l'impact de mes changements localement.

Généralement, les concepts de CS sont enseignés dans un scénario d'entreprise artificiel et ennuyeux: clients, commandes, produits, enseignants, cours, etc. Mais CircleMUD était un logiciel réel, fonctionnel et assez complexe qui vivait dans le contexte d'un grand monde mythique. J'apprenais les bases de l'informatique par exemple, en peaufinant des fonctions comme celle-ci:

/* * Function: find_guard * * Returns the pointer to a guard on duty. * Used by Peter, the Captain of the Royal Guard */struct char_data *find_guard(struct char_data *chAtChar){ struct char_data *ch; for (ch = world[IN_ROOM(chAtChar)].people; ch; ch = ch->next_in_room) if (!FIGHTING(ch) && member_of_royal_guard(ch)) return (ch); return (NULL);}

Dans une fonction courte, nous avons des boucles, des conditions, des pointeurs, une liste chaînée, un tableau, des macros de préprocesseur et des structures. Et nous avons Peter, le capitaine de la garde royale.

Selon les normes actuelles, certaines parties du code de Circle seraient jugées malodorantes et inélégantes. Il n'y avait pas de tests, car les tests de logiciels axés sur la prévention n'avaient pas encore fait leur chemin. Mais pour moi, Circle était assez beau. C'était un exemple de quelque chose de plus grand que ce que j'avais jamais écrit ou même conçu d'écrire auparavant. Lui-même une fourchette du projet MUD DikuMUD, écrit en 1990 par quelques personnes de l'Université de Copenhague, Circle avait l'attrait robuste d'un grand programme C: il était intimement lié aux appels système du système d'exploitation, il était hautement optimisé et axé sur les événements. , et il a fait beaucoup de travail lourd qui est aujourd'hui caché dans les bibliothèques. Il a géré ses propres sockets TCP et tampons d'E / S à partir de zéro, a défini ses propres formats de fichiers de jeu, et ainsi de suite.

Ce qui serait considéré aujourd'hui comme du métal nu était, à l'époque, le sommet de la pile. Les créateurs de Circle n'ont pas déploré le manque de frappe dynamique ou d'autres luxes de plus haut niveau - ils se sont délectés des commodités de voler au-dessus du langage d'assemblage et de se pencher sur le système d'exploitation pour toutes sortes de tâches importantes.

En conséquence, Circle est un bourreau de travail, et en production, Hex pourrait fonctionner sans problème avec plus de 200 utilisateurs simultanés dans moins de 20 Mo de RAM sur un 486. Le jeu fonctionne dans une grande boucle d'événements de 100 ms qui ne se bloque jamais; il dessert uniquement tous les utilisateurs actuellement connectés, fait avancer le monde d'un tick, puis dort pour le reste du cycle. Je me souviens d'avoir fait quelque chose de long dans cette boucle et d'avoir appris à la dure que cela arrête le jeu pour tout le monde. Une première leçon d'optimisation.

Après des semaines de fouille sur le code, et après de nombreux essais et erreurs, j'ai été ravi d'envoyer un petit patch qui a changé le style de l'invite de commande dans le jeu. Dans une pull request de style milieu des années 90, j'ai envoyé un e-mail aux administrateurs Hex avec mon patch et j'ai attendu avec impatience une réponse.

Ils ont accepté mon patch. Ils l'ont appliqué. Et c'était magique de voir mon petit changement incorporé dans un jeu auquel tant de gens jouaient chaque jour. Les développeurs - pour la plupart des étudiants en informatique d'âge universitaire - m'ont fait part de leurs commentaires sur mon patch, tout comme les joueurs.

J'ai continué à travailler et j'ai envoyé plus de petits patchs. Finalement, Yaz en a eu assez de jouer les intermédiaires et a dit: «Pourquoi ne pas simplement apporter des modifications directement à notre code.» et il a créé un compte sur le serveur pour moi.

Le statut de réalisateur sur Hex était de loin la responsabilité la plus personnelle que j'aie jamais ressentie. J'ai commencé à publier de nouveaux changements presque tous les soirs, recevant immédiatement les commentaires des autres joueurs. Non seulement je concevais et construisais des fonctionnalités que, en tant que joueur expérimenté, je voulais voir dans le jeu - plus important encore, je répétais dans une boucle de rétroaction étroite avec d'autres utilisateurs.

La boucle de rétroaction a guidé mon travail. Cela m'a permis de continuer, à travers des bugs qui semblaient irréparables et des problèmes qui semblaient insolubles. Il n'y avait pas de calendrier - juste des petits pas sans fin chaque jour vers un meilleur jeu. J'étais accro à la profonde satisfaction qui découlait de l'amélioration de quelque chose que les gens aimaient utiliser, et j'avais atteint un état de flux incroyable.

Je pense que c'est une excellente façon d'apprendre la programmation: plutôt que de dire «je veux apprendre à programmer», commencez par le désir d'améliorer quelque chose qui existe déjà. Quelque chose que les gens utilisent. Attendez-vous à ce que vous rencontriez des obstacles et des défis, et laissez les commentaires des utilisateurs et des collaborateurs vous encourager à persévérer à travers ceux-ci. De nombreux projets open source rendent cette opportunité disponible, mais je pense qu'il y a quelque chose de spécial dans l'environnement de jeu.

Over the following months, I learned about data structures and memory allocation. I learned about sane ways to structure procedural software. I learned about sockets, data serialization (before JSON or even XML existed), timers and interrupts. I didn’t know the vocabulary for these things beyond what I was able to read in code’s comments and in manual pages for system calls. But I was hooked. Coding for the MUD was all I thought about at school each day, and all I did at home each night.

I added a host of new features over the next year or two. I expanded the MUDs internal economy, building a housing system (virtual storage lockers, really) and a real estate market for them. I introduced scarcity of goods into the game’s economy, writing an algorithm that limited the rate at which the best equipment would be introduced into the world. I acted as an invisible hand, making the game more fun and challenging for people, and it was a blast.

The fun of being a developer pushed me to learn more and strive to build more things that people wanted. I’m an engineer today because of that experience. I’m grateful that CircleMUD was malleable open source code, and that Yaz took a leap of faith in handing the keys over to me at just 14 years old.

I love a medium where you can approach as a consumer and smoothly transition into a producer. Today, Minecraft allows for some modifications in a simple, constrained environment and could be a good gateway for budding programmers. But the art of programming still has a long ways to go before it can be universally accessible. The most popular multiplayer games of today are largely immutable to players. Because popular games like WoW are not open source, it seems harder to get into the role of core contributor on a real, living, breathing system.

I’d love for the next generation of programmers to have as much fun learning to program as I did. Changing the game is a lot more interesting than playing it.

Originally published on my personal website. Thanks to Siobhán K Cronin for proofreading.

If you made it this far, you should join my mailing list about technology and humanity.