Hvordan multi-user fangehuller lærte mig at programmere

”Mor, hvad vil du have, at jeg skriver? Bare fortæl mig, så skriver jeg et program til dig. ” Det var mig kl. 9, der hurtigt trak i min mors bukseben.

Jeg kan ikke huske, hvad jeg endte med at skrive i BASIC på vores Timex Sinclair-computer, men jeg kan huske, at jeg ville blive taget alvorligt - ville lave noget, der ville være nyttigt for nogen. Jeg tror, ​​min far købte den computer på et indfald fra et postordrekatalog, hvilket var overraskende, da han ikke er meget af en gadget fyr. Vi tilsluttede det til et gammelt 8 "sort-hvidt bærbart tv, vi havde. Min mor skrev et program, der udskrev mit navn over skærmen i en uendelig løkke.

Computeren kaldte på mig. Min bror og jeg skrev nogle ting i BASIC på denne computer, og vi var endda i stand til at indlæse og gemme vores programmer ved hjælp af en kassetteafspiller, der var fastgjort til computerens lydstik. Vi forsøgte at afspille softwarekassetten på en almindelig båndafspiller, og det lød som skrigende cikader.

Først senere, kl. 14, blev jeg virkelig begejstret for programmering. Jeg blev afhængig af et online eventyrspil - et gratis Multi-User Dungeon (MUD) kaldet HexOnyx. Hex var en populær virtuel verden med mindst hundrede mennesker, der spillede til enhver tid. Selvom nutidens MMPORG'er er vært for millioner ad gangen, virkede dengang et par hundrede mennesker i et virtuelt rum meget. Jeg fik gode venner der, og hver aften kæmpede vi med onde snurrende kriger og forfaldsdæmoner sammen i fangehullerne og mørke skove. Spillet var helt tekstbaseret, så fantasi var obligatorisk. Næsten 20 år senere har jeg stadig billeder i mit hoved af nogle af de gamle stampende grunde i spillet.

Hver dag efter skole var et nyt eventyr i MUD, indtil familiens middagsklokke trak mig tilbage i den fysiske verden. "Jeg er der lige om lidt!" Jeg råbte kun for at glide ind i spisestuen meget senere midt i måltidet. Der er aldrig et let stoppested, når du står over for et firbenet lamia-dyr, der vil have dit hoved til sit næste måltid.

I flere måneder kæmpede jeg og mine online venner obsessivt med disse computergenererede væsner. Til sidst avancerede jeg min karakter til udødelighed, hvilket er det effektive slutpunkt i spillet. * Udødelige kan ikke længere kæmpe - deres rolle var til hjælp for nye spillere, løse tvister, arkivfejl osv.

Da jeg blev venner med Hexs administratorer og udviklere, begyndte jeg at kigge på MUD's design og forsøge at forstå, hvordan det var i stand til at udløse en så dybt fordybende oplevelse og undrede mig over, hvordan vi kunne gøre det endnu bedre.

Der var hundreder af MUDS på det tidspunkt, og hver enkelt forsøgte at differentiere sig. For at skelne mellem Hex havde udviklerne oprettet en brugerdefineret, verdensbilledbygger i spillet. Hvor andre MUD'er skulle redigere en flad tekstfil med et forvirrende proprietært format, gjorde bygherren i spillet skriveverdener behagelige, og det gjorde det muligt for spillerne at blive involveret let. Yaz, Hex's vicevært, havde dette at sige:

”Formålet med spillet fra vores POV på det tidspunkt var at skabe et miljø, der kunne opretholdes inde fra verden. dvs. ingen vil virkelig have brug for at køre spillet udefra. Vi kom tæt på verdensbyggeren. ”

Med verdensbyggeren kunne du skrive en ny dør og et nyt rum i spillet og derefter gå gennem døren ind i rummet og se, hvordan det føltes. Dette udløste et udviklingsboom med mange nye verdener under opførelse, der ventede på at være færdige og forbundet med hovedkortet i spillet. Disse ufærdige verdener var uhyggelige steder, der kun var tilgængelige for admins og fyldt med blodtørstige monstre, der vandrede rundt alene dag og nat.

Jeg havde ingen interesse i at opbygge verdener; selv med verdensbyggeren virkede det som for meget arbejde. I stedet for ville jeg forstå mekanikken i softwaren og foretage strukturelle ændringer.

I modsætning til moderne MMPORG'er var de fleste MUD'er, inklusive HexOnyx, effektivt open source. Jeg downloadede HexOnyxs forfader CircleMUD, skrevet af Jeremy Elson, og kørte den på min hjemmecomputer. Jeg havde programmeret et par ting i BASIC før, men CircleMUD blev skrevet i C - en helt ny verden for mig. Bare det at få det til at kompilere var et projekt. Men efterhånden fandt jeg ud af, hvordan man foretog små ændringer, og det var spændende for makeMUD og se virkningen af ​​mine ændringer lokalt.

Typisk undervises CS-koncepter i nogle konstruerede, kedelige forretningsscenarier: Kunder, ordrer, produkter, lærere, kurser osv. Men CircleMUD var et ægte, fungerende og ret komplekst stykke software, der levede i sammenhæng med en stor mytisk verden. Jeg lærte det grundlæggende inden for datalogi med et eksempel og finjusterede funktioner som denne:

/* * 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);}

I en kort funktion har vi looping, conditionals, pegepinde, en sammenkædet liste, en array, preprocessormakroer og structs. Og vi har Peter, kaptajnen på Royal Guard.

Efter nutidens standarder vil dele af Circles kode blive bedømt som ildelugtende og uelegante. Det havde ingen tests, da forebyggelsesorienteret softwaretest endnu ikke var fanget. Men for mig var Circle ret smuk. Det var et eksempel på noget større, end jeg nogensinde havde skrevet eller endda tænkt på at skrive før. Selv en gaffel af MUD-projektet DikuMUD, skrevet i 1990 af nogle få mennesker ved Københavns Universitet, Circle havde den robuste appel af et stort C-program: Det beskæftigede sig tæt med operativsystemets systemopkald, det var meget optimeret og begivenhedsdrevet , og det gjorde en masse tunge løft, der i dag er skjult væk i biblioteker. Det styrede sine egne TCP-sockets og I / O-buffere fra bunden, definerede sine egne spilfilformater og så videre.

Hvad der ville blive betragtet som bare metal i dag, var dengang toppen af ​​stakken. Circles skabere beklagede ikke manglen på dynamisk typning eller anden luksus på højere niveau - de glædede sig over bekvemmelighederne ved at flyve over samlesprog og at læne sig ind i operativsystemet til alle mulige vigtige opgaver.

Som et resultat er Circle en arbejdshest, og i produktion kunne Hex køre problemfrit med 200+ samtidige brugere på under 20 MB RAM på en 486. Spillet kører i en stor 100ms hændelsessløjfe, som aldrig blokerer; det servicerer bare alle de nuværende tilsluttede brugere, træder verden frem med et kryds og sover derefter resten af ​​cyklussen. Jeg husker, at jeg lavede en langvarig ting inde i denne løkke og lærte på den hårde måde, at det stopper spillet for alle. En tidlig lektion i optimering.

Efter uges poring af koden og efter meget prøving og fejl var jeg glad for at sende en lille patch ind, der ændrede stilen på kommandoprompten i spillet. I en pull-anmodning i midten af ​​90'erne stilede jeg en e-mail til Hex-administratorerne med min patch og ventede ivrigt på et svar.

De accepterede min plaster. De anvendte det. Og det var magisk at se min lille ændring indarbejdet i et spil, som så mange mennesker spillede hver dag. Udviklerne - for det meste college science-studerende - gav mig feedback på min patch, ligesom spillerne gjorde.

Jeg fortsatte med at arbejde, og jeg sendte flere små patches ind. Til sidst blev Yaz træt af at spille mellemmand og sagde: "Hvorfor foretog du ikke bare redigeringer direkte i vores kode." og han oprettede en konto på serveren for mig.

Implementatorstatus på Hex var langt det mest personlige ansvar, jeg nogensinde har følt. Jeg begyndte at frigive nye ændringer næsten hver aften og modtog øjeblikkelig feedback fra andre spillere. Ikke alene designede jeg og byggede funktioner, som jeg som veteran-spiller ønskede at se i spillet - endnu vigtigere, jeg gentog mig inde i en tæt feedback-loop med andre brugere.

Feedbacksløjfen kørte mit arbejde. Det fik mig til at gå igennem bugs, der virkede unfixable, og problemer, der virkede umulige. Der var ingen tidsplan - bare uendelige små skridt hver dag mod et bedre spil. Jeg var hooked på den dybe tilfredshed, der fulgte med at forbedre noget, folk elskede at bruge, og jeg havde nået en utrolig strømningstilstand.

Jeg synes, det er en fantastisk måde at lære programmering på: I stedet for at sige "Jeg vil lære at programmere", start med et ønske om at forbedre noget, der allerede findes. Noget folk bruger. Forvent at du vil ramme vejspærringer og udfordringer, og lad feedback fra brugere og samarbejdspartnere være din opmuntring til at fortsætte gennem disse. Masser af open source-projekter gør denne mulighed tilgængelig, men jeg tror, ​​der er noget specielt ved spilmiljøet.

I løbet af de følgende måneder lærte jeg om datastrukturer og hukommelsesallokering. Jeg lærte om fornuftige måder at strukturere proceduremæssig software på. Jeg lærte om stikkontakter, dataserialisering (før JSON eller endda XML eksisterede), timere og afbrydelser. Jeg kendte ikke ordforrådet for disse ting ud over hvad jeg var i stand til at læse i kodens kommentarer og på manuelle sider til systemopkald. Men jeg var hooked. Kodning til MUD var alt hvad jeg tænkte på i skolen hver dag, og alt hvad jeg gjorde derhjemme hver aften.

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.

Hvis du har nået det så langt, skal du deltage i min mailingliste om teknologi og menneskehed.