Architecture Decision Record

Active theme: Light

← Erabaki-erregistroen adibideak

Programazio-lengoaiak

Edukia:

Laburpena

Arazoa

Programazio-lengoaiak aukeratu behar ditugu gure softwarerako. Bi behar nagusi ditugu: web aplikazioetarako egokia den front-end programazio-lengoaia bat, eta zerbitzari-aplikazioetarako egokia den back-end programazio-lengoaia bat.

Erabakia

TypeScript aukeratzen ari gara front-end-erako.

Rust aukeratzen ari gara back-end-erako.

Egoera

Erabakia. Alternatiba berrietara irekiak gaude sortzen diren heinean.

Xehetasunak

Hipotesiak

Front-end aplikazioak tipikoak dira:

  • Erabiltzaile eta interakzio tipikoak

  • Nabigatzaile eta sistema tipikoak

  • Garapen eta hedapen tipikoak

Front-end aplikazioak azkar eboluzionatzeko aukera handia dago:

  • Garapen, hedapen, iterazio eta abar azkar eta errazak ziurtatu nahi ditugu.

  • Frogagarritasuna, hala nola tipo-segurtasuna, baloratzen dugu, eta lan pixka bat gehiago egitearekin ados gaude hori lortzeko.

  • Ez dugu atzerako bateragarritasunik behar.

Back-end aplikazioak ohikoa baino altuagoak dira:

  • Kalitaterako ohikoa baino helburu altuagoak, bereziki frogagarritasuna, fidagarritasuna, segurtasuna eta abar.

  • Ia denbora errealerako ohikoa baino helburu altuagoak, hau da, ez ditugu nahi makina birtualaren zabor-bilketa dela eta etenak.

  • Programazio funtzionalerako ohikoa baino helburu altuagoak, bereziki paralelizaziorako, nukleo anitzeko prozesamendurako eta memoria-segurtasunerako.

Konpilazio-denborako abiadura txikiagoak onartzen ditugu konpilazio-denborako segurtasunaren eta exekuzio-denborako abiaduraren alde.

Murriztapenak

Murriztapen sendoa dugu hodei-hornitzaile nagusien funtzioetarako zerbitzuekin erabilgarriak diren lengoaiei dagokienez, hala nola Amazon Lambda.

Jarrerak

Lengoaia hauek aztertu ditugu:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

Arrazoibidea

Lengoaia bakoitzaren laburpena:

  • C: baztertua segurtasun txikiagatik; Rust-ek ia dena hobeto egin dezake.

  • C++: baztertua nahaspila delako; Rust-ek ia dena hobeto egin dezake.

  • Clojure: modelatze bikaina; Lisp hurbilketa onena; exekuzio-denbora bikaina JVM-an.

  • Elixir: exekuzio-denbora bikaina, hedagarritasuna eta konkurrentzia barne; garatzaile-esperientzia bikaina; ekosistema nahiko txikia.

  • Erlang: exekuzio-denbora bikaina, hedagarritasuna eta konkurrentzia barne; garatzaile-esperientzia erronkatsua; ekosistema nahiko txikia.

  • Elm: oso itxaropentsua dirudi; IBM kasu-azterketa garrantzitsuak argitaratzen ari da emaitza onekin; ekosistema txikiagoa.

  • Flow: JavaScript-en hobekuntza interesgarria; hala ere, garatzaileak urruntzen ari dira.

  • Go: garatzaile-esperientzia bikaina; konkurrentzia bikaina; baina lengoaia mugatzen duten erabaki txarren ibilbidea.

  • Haskell: lengoaia funtzional onena; garatzaile-komunitate txikiagoa; ez du nahikoa produkzio-arrakasta argitaratu lortu.

  • Java: exekuzio-denbora bikaina; ekosistema bikaina; garatzaile-esperientzia kaskarra.

  • JavaScript: inoizko lengoaia ezagunena; ekosistema hedatuena.

  • Kotlin: Javaren asko konpontzen du; JetBrains-en euskarri bikaina; Javatik Kotlinera eramateko argitaratutako kasu onak.

  • Python: sistemen administraziorako lengoaia ezagunena; analisirako tresna bikainak; web esparru onak; baina Google-k Go-ren alde utzi zuen.

  • Ruby: inoizko garatzaile-esperientzia onena; web esparru onenak; komunitate atseginena; baina oso motela; paketatzeko nahiko zaila.

  • Rust: lengoaia berri onena; zero-abstrakzioaren azpimarra; konkurrentziaren azpimarra; hala ere ekosistema nahiko txikia; eta konpilatzaile-azelerazio mota batzuei buruzko muga nahita ditu, adib. memoriarako sarbide zuzenak esplizituki unsafe izan behar du.

  • TypeScript: tipoak gehitzen dizkio JavaScript-i; transpiler bikaina; garatzaileen arreta hazkorra JavaScript-etik TypeScript-era eramatean; Microsoft-en euskarri sendoa.

Erabaki dugu VM-ek orain behar ez dugun konpentsazio-multzo bat dutela, hala nola exekuzio-gaitasunak ematen dituen konplexutasun gehigarria.

Uste dugu gure oinarrizko erabakia zeharkako bi kezkak gidatzen dutela:

  • Exekuzio-abiadura azkarrenerako eta sistemarako sarbide estuenerako, JavaScript eta C aukeratuko genituzke.

  • Ia exekuzio-abiadura azkarrenerako eta ia sistemarako sarbide estuenerako, TypeScript eta Rust aukeratzen ditugu.

Aipamen berezia VM lengoaiei eta web esparruei, VM lengoaia bat nahi bagenu aukeratuko genituzkeenak:

  • Clojure eta Luminus

  • Java eta Spring

  • Elixir eta Phoenix

Ondorioak

Front-end garatzaileek TypeScript ikasi beharko dute. Hau ziurrenik ikaskuntza-kurba erraza da garatzailearen lehen esperientzia JavaScript erabiltzea bada.

Back-end garatzaileek Rust ikasi beharko dute. Hau ziurrenik ikaskuntza-kurba ertaina da garatzailearen lehen esperientzia C/C++ erabiltzea bada, eta ikaskuntza-kurba zaila Java, Python, Ruby edo antzeko memoria kudeatuko lengoaiak erabiltzea bada.

TypeScript eta Rust biak nahiko berriak dira. Horrek esan nahi du tresna askok oraindik ez dutela lengoaia hauetarako dokumentaziorik. Adibidez, devops hodia lengoaia hauetarako konfiguratu beharko da, eta orain arte, ebaluatzen ari garen devops tresnetako batek ere ez du lengoaia hauetarako adibide lehenetsirik.

TypeScript eta Rust-en konpilazio-denborak nahiko motelak dira. Honen zati bat lengoaien berritasunagatik izan daiteke. Konpilazio-denbora motelak arintzeko moduak aztertu nahi izan ditzakegu, hala nola eskaeraren araberako konpilazioa, konpilazio-konkurrentzia eta abar.

Lengoaia hauetarako IDE euskarria ez dago oraindik nonahi eta ez da oraindik lehen mailakoa. Adibidez, JetBrains-ek PyCharm IDE saltzen du Python-erako lehen mailako euskarriarekin, baina ez du Rust-erako lehen mailako euskarria duen IDE-rik saltzen; horren ordez, JetBrains-ek Rust plug-in bat erabil dezake, Python lengoaiaren euskarriarekin alderatuta Rust lengoaiaren euskarriaren %80 inguru ematen duena.

Erlazionatuta

Erlazionatutako erabakiak

Lengoaia hauekin bat datozen ekosistema-aukeretara zuzenduko gara.

Adibidez, lengoaia hauetarako gaitasun onak dituen IDE bat aukeratu nahi dugu.

Adibidez, gure front-end web esparrurako, TypeScript-era zuzentzen den esparru bat (adib. Vue) erabakitzeko aukera handiagoa dugu JavaScript hutsera zuzentzen den esparru bat (adib. React) baino.

Erlazionatutako eskakizunak

Gure tresna-kate osoak lengoaia hauek onartu behar ditu.

Erlazionatutako artefaktuak

Espero dugu sekretu batzuk ingurune-aldagaietara esportatu behar izatea.

Erlazionatutako printzipioak

Bi aldiz neurtu, behin eraiki. Segurtasun pixka bat abiadura pixka baten aurretik lehenesten ari gara.

Exekuzio-denbora konpilazio-denbora baino baliotsuagoa da. Bezeroen erabilera garatzaileen erabileraren aurretik lehenesten ari gara.

Oharrak

Edozein ohar hemen.