Architecture Decision Record

Active theme: Light

← Mifano ya rekodi za maamuzi

Lugha za programu

Yaliyomo:

Muhtasari

Suala

Tunahitaji kuchagua lugha za programu kwa programu yetu. Tuna mahitaji makuu mawili: lugha ya programu ya sehemu ya mbele inayofaa programu za wavuti, na lugha ya programu ya sehemu ya nyuma inayofaa programu za seva.

Uamuzi

Tunachagua TypeScript kwa sehemu ya mbele.

Tunachagua Rust kwa sehemu ya nyuma.

Hali

Imeamuliwa. Tuko wazi kwa njia mbadala mpya zitakapojitokeza.

Undani

Dhana

Programu za sehemu ya mbele ni za kawaida:

  • Watumiaji na mwingiliano wa kawaida

  • Vivinjari na mifumo ya kawaida

  • Uundaji na uwekaji wa kawaida

Programu za sehemu ya mbele zina uwezekano wa kubadilika haraka:

  • Tunataka kuhakikisha uundaji, uwekaji, marudio, n.k. ya haraka na rahisi.

  • Tunathamini uwezo wa kuthibitisha, kama usalama wa aina, na tuko tayari kufanya kazi kidogo zaidi kuufikia.

  • Hatuhitaji upatanifu wa zamani.

Programu za sehemu ya nyuma ni za juu kuliko kawaida:

  • Malengo ya juu kuliko kawaida ya ubora, hasa uwezo wa kuthibitisha, kuegemewa, usalama, n.k.

  • Malengo ya juu kuliko kawaida ya wakati-karibu-halisi, yaani hatutaki vituo kutokana na ukusanyaji wa taka wa mashine pepe.

  • Malengo ya juu kuliko kawaida ya upangaji wa kiutendaji, hasa kwa uendeshaji sambamba, usindikaji wa viini vingi, na usalama wa kumbukumbu.

Tunakubali kasi ndogo za wakati wa ukusanyaji kwa ajili ya usalama wa wakati wa ukusanyaji na kasi za wakati wa utekelezaji.

Vikwazo

Tuna kikwazo kikubwa kwa lugha zinazoweza kutumika na huduma za watoa huduma wakuu wa wingu kwa kazi, kama Amazon Lambda.

Misimamo

Tulizingatia lugha hizi:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

Hoja

Muhtasari kwa kila lugha:

  • C: imekataliwa kwa sababu ya usalama mdogo; Rust inaweza kufanya karibu kila kitu vizuri zaidi.

  • C++: imekataliwa kwa sababu ni fujo; Rust inaweza kufanya karibu kila kitu vizuri zaidi.

  • Clojure: uundaji bora wa modeli; kadirio bora la Lisp; mazingira bora ya utekelezaji kwenye JVM.

  • Elixir: mazingira bora ya utekelezaji ikiwa ni pamoja na urahisi wa kuweka na uendeshaji sambamba; uzoefu bora wa waundaji; mfumo ikolojia mdogo kiasi.

  • Erlang: mazingira bora ya utekelezaji ikiwa ni pamoja na urahisi wa kuweka na uendeshaji sambamba; uzoefu wenye changamoto wa waundaji; mfumo ikolojia mdogo kiasi.

  • Elm: inaonekana inatia matumaini sana; IBM inachapisha tafiti kuu za kesi zenye matokeo mazuri; mfumo ikolojia mdogo zaidi.

  • Flow: uboreshaji wa kuvutia juu ya JavaScript; hata hivyo; waundaji wanaondoka kwake.

  • Go: uzoefu bora wa waundaji; uendeshaji sambamba bora; lakini rekodi ya maamuzi mabaya yanayolemaza lugha.

  • Haskell: lugha bora ya kiutendaji; jamii ndogo ya waundaji; haijafikia mafanikio ya kutosha yaliyochapishwa ya uzalishaji.

  • Java: mazingira bora ya utekelezaji; mfumo ikolojia bora; uzoefu wa waundaji chini ya wastani.

  • JavaScript: lugha maarufu zaidi kuwahi kuwepo; mfumo ikolojia ulioenea zaidi.

  • Kotlin: inarekebisha mengi ya Java; usaidizi bora kutoka JetBrains; visa vizuri vilivyochapishwa vya kuhamisha kutoka Java kwenda Kotlin.

  • Python: lugha maarufu zaidi kwa usimamizi wa mifumo; zana bora za uchanganuzi; mifumo mizuri ya wavuti; lakini imeachwa na Google kwa ajili ya Go.

  • Ruby: uzoefu bora wa waundaji kuwahi kuwepo; mifumo bora ya wavuti; jamii nzuri zaidi; lakini polepole sana; ni vigumu kiasi kufungasha.

  • Rust: lugha mpya bora; msisitizo wa kutokuwa na uondoaji wa kina; msisitizo wa uendeshaji sambamba; hata hivyo mfumo ikolojia mdogo kiasi; na ina mipaka ya makusudi kwa baadhi ya aina za uharakishaji wa mkusanyaji mf. ufikiaji wa moja kwa moja wa kumbukumbu unahitaji kuwa si salama kwa uwazi.

  • TypeScript: inaongeza aina kwenye JavaScript; kibadilishaji bora; msisitizo unaokua wa waundaji kuhamisha kutoka JavaScript kwenda TypeScript; usaidizi imara kutoka Microsoft.

Tuliamua kwamba mashine pepe zina seti ya mabadilishano ambayo hatuyahitaji sasa hivi, kama utata wa ziada unaotoa uwezo wa wakati wa utekelezaji.

Tunaamini kwamba uamuzi wetu mkuu unaendeshwa na masuala mawili mtambuka:

  • Kwa kasi ya juu zaidi ya wakati wa utekelezaji na ufikiaji mkali zaidi wa mfumo, tungechagua JavaScript na C.

  • Kwa kasi karibu na ya juu zaidi ya wakati wa utekelezaji na ufikiaji karibu na mkali zaidi wa mfumo, tunachagua TypeScript na Rust.

Kutajwa kwa heshima kunaenda kwa lugha za mashine pepe na mifumo ya wavuti ambayo tungechagua tukitaka lugha ya mashine pepe:

  • Clojure na Luminus

  • Java na Spring

  • Elixir na Phoenix

Athari

Waundaji wa sehemu ya mbele watahitaji kujifunza TypeScript. Huu huenda ukawa mkondo rahisi wa kujifunza ikiwa uzoefu mkuu wa mwundaji ni kutumia JavaScript.

Waundaji wa sehemu ya nyuma watahitaji kujifunza Rust. Huu huenda ukawa mkondo wa kati wa kujifunza ikiwa uzoefu mkuu wa mwundaji ni kutumia C/C++, na mkondo mgumu wa kujifunza ikiwa uzoefu mkuu wa mwundaji ni kutumia Java, Python, Ruby, au lugha zinazofanana zenye usimamizi wa kumbukumbu.

TypeScript na Rust zote ni mpya kiasi. Hii inamaanisha kwamba zana nyingi bado hazina nyaraka za lugha hizi. Kwa mfano, mfereji wa devops utahitaji kuwekwa kwa lugha hizi, na hadi sasa, hakuna zana za devops tunazotathmini zilizo na mifano chaguomsingi ya lugha hizi.

Muda wa ukusanyaji kwa TypeScript na Rust ni polepole kabisa. Baadhi ya hili linaweza kuwa kutokana na uchanga wa lugha. Tunaweza kutaka kuangalia jinsi ya kupunguza muda wa polepole wa ukusanyaji, kama kwa ukusanyaji-unapohitajika, uendeshaji-sambamba-wa-ukusanyaji, n.k.

Usaidizi wa IDE kwa lugha hizi bado haujaenea kila mahali na bado si wa daraja la kwanza. Kwa mfano, JetBrains huuza IDE ya PyCharm kwa usaidizi wa daraja la kwanza wa Python, lakini haiuzi IDE yenye usaidizi wa daraja la kwanza wa Rust; badala yake, JetBrains inaweza kutumia programu-jalizi ya Rust inayotoa labda 80% ya usaidizi wa lugha ya Rust ikilinganishwa na usaidizi wa lugha ya Python.

Yanayohusiana

Maamuzi yanayohusiana

Tutalenga chaguo za mfumo ikolojia zinazoendana na lugha hizi.

Kwa mfano, tunataka kuchagua IDE yenye uwezo mzuri kwa lugha hizi.

Kwa mfano, kwa mfumo wetu wa wavuti wa sehemu ya mbele, kuna uwezekano zaidi wa kuamua juu ya mfumo unaoelekea TypeScript (mf. Vue) kuliko mfumo unaoelekea JavaScript tupu (mf. React).

Mahitaji yanayohusiana

Mnyororo wetu mzima wa zana lazima uunge mkono lugha hizi.

Vielelezo vinavyohusiana

Tunatarajia tunaweza kusafirisha baadhi ya siri kwenye vigeu vya mazingira.

Kanuni zinazohusiana

Pima mara mbili, jenga mara moja. Tunaweka kipaumbele kwa usalama fulani kuliko kasi fulani.

Wakati wa utekelezaji una thamani zaidi kuliko wakati wa ukusanyaji. Tunaweka kipaumbele kwa matumizi ya wateja kuliko matumizi ya waundaji.

Maelezo ya ziada

Maelezo yoyote hapa.