Norske studenter bak JavaScript-nyhet: «Helt utrolig mulighet!»
Studenter ved Universitetet i Bergen har jobbet tett med utviklere fra Google og Mozilla om ny funksjonalitet i ECMAScript/JavaScript.
– Det har vært en helt utrolig mulighet å få være med på, og endte med å være så mye mer enn jeg forventet da jeg startet prosjektet, forteller Jonas Haukenes, masterstudent ved UiB, til kode24.
Sammen med flere andre studenter har han vært involvert i design og implementering av helt ny funksjonalitet som snart kommer i JavaScript: Map.prototype.getOrInsert (tidligere kalt upsert).
Prosjektet har vært en del av "Project in Informatics"-kurset ved UiB, og studentene har hatt mentorer fra Google og Mozilla med underveis.
- Kort oppsummert så skal getOrInsert gjøre det enklere å håndtere det å oppdatere verdier i en Map eller WeakMap når du ikke er sikker på om en bestemt nøkkel (key) eksisterer fra før i Map-en.
- Dette kan i dag håndteres ved å først sjekke om nøkkelen eksisterer, og deretter legge til eller oppdatere avhengig av resultatet.
- Den nye getOrInsert-metoden vil gjøre dette enklere ved å returnere verdien assosisert med en nøkkel hvis nøkkelen allerede eksisterer. Hvis ikke vil den legge den til, som i dette eksempelet:
I tillegg til getOrInsert-prosjektet har en annen gruppe studenter ved UiB jobbet sammen med en Google-utvikler hvor de implementerte deler av TC39s Temporal-forslag i Boa, en JavaScript-motor skrevet i Rust.
– Selv om dette kanskje ikke er godt kjent, så er det viktige her at Boas implementasjon av Temporal vil bli gjenbrukt i Google Chromes V8-motor. Shane Carr fra Google har gjort en veldig god jobb med mentoring av studentene, og kom til og med til Bergen for å gi et krasjkurs i Rust, som er språket Boa er skrevet i, sier Mihail Barash, førsteamanuensis ved UiB, til kode24.
Blir en del av JavaScript
Upsert-forslaget er nå på trinn 3 i TC39, som betyr at designet er ferdig og at det anbefales å legge det til i nettleserne.
Snart vil altså funksjonalitet Haukenes og hans medstudenter har laget kunne bli brukt av millioner av webutviklere verden over:
– Det har gitt meg utrolig lyst til å fortsette å bidra til JavaScript og webmotorer, sier Haukenes, og legger til at prosjektet har gitt han et unikt innblikk i prosessen bak JavaScript – og mulighet til å møte de som jobber med JavaScript til daglig.
Ville gi ekte utfordringer
Mihail Barash har vært veileder for studentene på Upsert-prosjektet, i tillegg til at han sitter i TC39-komiteen som jobber med standardisering av ECMAScript – standarden JavaScript bygger på.
– Vi har hatt et samarbeid med JavaScript-komitéen i flere år allerede. Flere TC39-delegater har besøkt UiB og gitt gjesteforelesninger, sier Barash.
Ett av målene med prosjektet har vært å gi studenter mer erfaring med ekte åpen kildekodeprosjekter.
– En av de tingene som er svært vanskelig å gi studenter i et universitetsmiljø, er eksempler fra virkeligheten. Forelesninger dekker som regel ganske enkle eksempler, og selv store gruppeprosjekter kan i beste fall være “realistiske”, men ikke “industrielt ekte”. Jeg ønsket å se om studentene kunne bidra til et ekte prosjekt fra næringslivet, sier Barash.
– Jeg er veldig glad for hvor vellykket det ble.
En av de tingene som er svært vanskelig å gi studenter i et universitetsmiljø, er eksempler fra virkeligheten.
To forslag, tre studier
Barash forteller at det ble gjennomført to case-studier for upsert-forslaget:
- SpiderMonkey med mentorstøtte
- V8 uten mentorstøtte
SpiderMonkey er Mozillas JavaScript- og WebAssembly-motor som brukes i blant annet Firefox, mens V8 er Googles åpen kildekodemotor som brukes i Chromium-baserte nettlesere og i Node.js.
– Vi snakker om store og komplekse kodebaser. Hvor vanskelig er det for mindre erfarne utviklere å navigere i disse?
– Når man implementerer en JavaScript-funksjon, går mesteparten av arbeidet faktisk ut på å lese og forstå spesifikasjonsteksten grundig. Den er skrevet i et slags pseudo-kode-aktig engelsk, omtrent 15–20 kodelinjer per metode, sier Barash.
Han forteller at en av grunnene til at dette ikke er en triviell oppgave, er at ECMAScript-spesifikasjonen er skrevet med en spesiell notasjon som tar tid å mestre, spesielt for nykommere. I tillegg hender det overraskende ofte at faktiske implementasjoner skiller seg fra spesifikasjonen, siden spesifikasjonen legger vekt på korrekthet, mens implementasjoner også optimaliseres for ytelse.
– En annen utfordring er at det er vanskelig å lære seg å navigere i en kodebase så stor som Firefox. Men her har Firefox noen glimrende verktøy som er til hjelp. Ett av disse verktøyene heter Searchfox, som er spesielt laget for å søke gjennom hele Firefox-kodebasen, sier Barash
Morsomt og lærerikt
Før Jonas Haukenes ble involvert i upsert-prosjektet, hadde han i hovedsak programmert i forbindelse med studentprosjekter eller konkurranseprogrammering på universitetet.
– Så dette var noe jeg ikke hadde så mye erfaring med fra før, i hvert fall ikke på dette nivået, sier Haukenes.
– Hvordan jobbet dere med prosjektet?
– Vi jobbet hovedsakelig alene med prosjektet, og så hadde vi ukentlige møter med en veileder fra Mozilla hvor vi snakket om fremdriften, mulige endringer på forslaget, og om vi hadde møtt på noen utfordringer vi ikke klarte å løse på egen hånd.
Siden målet med prosjektet var å skrive en guide som man kan følge uten nødvendigvis å ha en veileder fra Mozilla, så var det viktig for studentene å få frem mange av problemene de møtte på og hvordan de løste disse på egen hånd. Derfor har studentene også publisert en guide til hvordan upsert/getOrInsert fungerer her: bldl.github.io/upsert-tutorial
Det morsomste jeg føler jeg har lært er hvordan språk som C++ brukes på et industrielt nivå, hvor sikkerhet og ytelse er helt avgjørende.
– Hva har du lært?
– Jeg har lært alt fra hvordan man setter seg inn i og finner frem i gigantiske kodebaser, til hvordan man bruker Git på et prosjekt hvor det kommer inn titals patcher hver dag. Men det morsomste jeg føler jeg har lært er hvordan språk som C++ brukes på et industrielt nivå hvor sikkerhet og ytelse er helt avgjørende.
Det vanskeligste var å skrive implementasjonen til Google Chromes V8.
– Her hadde jeg mye mindre tilgang til veiledning enn med SpiderMonkey. Og siden V8 tar i bruk flere DSL-er (Domain Specific Language) så krevde det en del innsats for å finne ut hvordan man skal bruke alle disse sammen, sier Haukenes.
Må overbevise erfarne utviklere
Mikhail Barash forteller at studentene har laget en første implementering av upsert-forslaget, og deretter samarbeidet med Mozilla-utvikleren Daniel Minor om å redesigne deler av det.
Denne oppgaven innebærer langt mer ansvar, ettersom forslagsstillerne – altså studentene i dette tilfellet – må begrunne designvalgene sine.
– Dette må gi mening for de andre medlemmene av komiteen – hvor de fleste er svært erfarne utviklere og eksperter på design av programmeringsspråk. Etter at redesignet fikk positiv tilbakemelding fra komiteen, implementerte de forslaget på nytt.
Og så måtte de reimplementere alt sammen nok en gang – denne gangen for å optimalisere ytelsen.
– Dette er så nært industripraksis man kan komme – og vi klarte å skape denne erfaringen i en universitetskurs.
Imponert over studentene
– Hvordan synes du studentene klarte seg?
– Vi ved UiB er svært begeistret for resultatene studentene våre har vist i løpet av prosjektet. Det er virkelig flott å se studenter bidra til en så stor og viktig kodebase.
Han vil også berømme Haukenes for den krevende V8-implementeringen:
– Han laget en implementering av funksjonen i Google Chromes V8-motor. Jonas fikk ingen veiledning fra Google-ingeniører, og Google var heller ikke involvert på noen måte, så Jonas måtte selv sette seg inn i de tekniske detaljene i V8-motoren.
Nå ønsker Barash å dele erfaringene sine med andre universiteter over hele verden, og er glad for at det ser ut til å være vilje til å involvere studenter og til å skaffe mentorer for studenter.
– Web-plattformen trenger fremtidige vedlikeholdere og folk som kan implementere løsninger, og dette er en perfekt måte å forbererede den neste generasjonen på, avslutter han.
I juni fortalte Mikhail Barash og studentene om prosjektet i en presentasjon på Web Engines Hackfest, som du kan se under.
Der får du også detaljene om hvordan ny funksjonalitet legges inn i JavaScript i praksis – samt mer informasjon om norske studenters bidrag til Temporal: