Architecture Decision Record

Active theme: Light

← Karar kaydı örnekleri

Programlama dilleri

İçindekiler:

Özet

Sorun

Yazılımlarımız için programlama dilleri seçmemiz gerekiyor. İki ana ihtiyacımız var: web uygulamaları için uygun bir ön uç programlama dili ve sunucu uygulamaları için uygun bir arka uç programlama dili.

Karar

Ön uç için TypeScript'i seçiyoruz.

Arka uç için Rust'ı seçiyoruz.

Durum

Karar verildi. Ortaya çıkan yeni alternatiflere açığız.

Ayrıntılar

Varsayımlar

Ön uç uygulamaları tipiktir:

  • Tipik kullanıcılar ve etkileşimler

  • Tipik tarayıcılar ve sistemler

  • Tipik geliştirmeler ve dağıtımlar

Ön uç uygulamalarının hızla gelişmesi muhtemeldir:

  • Hızlı ve kolay geliştirme, dağıtım, yineleme vb. sağlamak istiyoruz.

  • Tür güvenliği gibi kanıtlanabilirliğe değer veriyoruz ve bunu sağlamak için biraz daha fazla iş yapmaktan çekinmiyoruz.

  • Eski sürümlerle uyumluluğa ihtiyacımız yok.

Arka uç uygulamaları tipikten daha yüksek düzeydedir:

  • Kalite için, özellikle kanıtlanabilirlik, güvenilirlik, güvenlik vb. için tipikten daha yüksek hedefler.

  • Neredeyse gerçek zamanlılık için tipikten daha yüksek hedefler; yani sanal makine çöp toplamasından kaynaklanan duraklamalar istemiyoruz.

  • İşlevsel programlama için, özellikle paralelleştirme, çok çekirdekli işleme ve bellek güvenliği için tipikten daha yüksek hedefler.

Derleme zamanı güvenliği ve çalışma zamanı hızları lehine daha düşük derleme zamanı hızlarını kabul ediyoruz.

Kısıtlamalar

Amazon Lambda gibi büyük bulut sağlayıcılarının işlev hizmetleriyle kullanılabilen diller konusunda güçlü bir kısıtlamamız var.

Pozisyonlar

Şu dilleri değerlendirdik:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

Argüman

Dil başına özet:

  • C: düşük güvenlik nedeniyle reddedildi; Rust hemen hemen her şeyi daha iyi yapabilir.

  • C++: dağınık olduğu için reddedildi; Rust hemen hemen her şeyi daha iyi yapabilir.

  • Clojure: mükemmel modelleme; en iyi Lisp yaklaşımı; JVM üzerinde harika çalışma zamanı.

  • Elixir: dağıtılabilirlik ve eşzamanlılık dahil mükemmel çalışma zamanı; mükemmel geliştirici deneyimi; görece küçük ekosistem.

  • Erlang: dağıtılabilirlik ve eşzamanlılık dahil mükemmel çalışma zamanı; zorlu geliştirici deneyimi; görece küçük ekosistem.

  • Elm: çok umut verici görünüyor; IBM iyi sonuçlarla büyük vaka çalışmaları yayımlıyor; daha küçük ekosistem.

  • Flow: JavaScript'e göre ilginç bir iyileştirme; ancak geliştiriciler ondan uzaklaşıyor.

  • Go: mükemmel geliştirici deneyimi; mükemmel eşzamanlılık; ancak dili sakatlayan kötü kararlar geçmişi var.

  • Haskell: en iyi işlevsel dil; daha küçük geliştirici topluluğu; yeterli sayıda yayımlanmış üretim başarısına ulaşmadı.

  • Java: mükemmel çalışma zamanı; mükemmel ekosistem; vasatın altında geliştirici deneyimi.

  • JavaScript: gelmiş geçmiş en popüler dil; en yaygın ekosistem.

  • Kotlin: Java'nın pek çok sorununu giderir; JetBrains'in mükemmel desteği; Java'dan Kotlin'e geçişle ilgili yayımlanmış iyi örnekler.

  • Python: sistem yönetimi için en popüler dil; harika analitik araçları; iyi web çerçeveleri; ancak Google tarafından Go lehine terk edildi.

  • Ruby: gelmiş geçmiş en iyi geliştirici deneyimi; en iyi web çerçeveleri; en hoş topluluk; ancak çok yavaş; paketlemesi biraz zor.

  • Rust: en iyi yeni dil; sıfır soyutlama vurgusu; eşzamanlılık vurgusu; ancak görece küçük ekosistem; ve bazı derleyici hızlandırmaları üzerinde kasıtlı sınırlar var; örneğin doğrudan bellek erişiminin açıkça güvensiz (unsafe) olması gerekir.

  • TypeScript: JavaScript'e türler ekler; harika aktarıcı (transpiler); JavaScript'ten TypeScript'e geçişe artan geliştirici vurgusu; Microsoft'un güçlü desteği.

Sanal makinelerin şu anda ihtiyaç duymadığımız bir dizi ödünleşimi olduğuna karar verdik; örneğin çalışma zamanı yetenekleri sağlayan ek karmaşıklık.

Temel kararımızın iki kesişen kaygıdan kaynaklandığına inanıyoruz:

  • En hızlı çalışma zamanı hızı ve en sıkı sistem erişimi için JavaScript ve C'yi seçerdik.

  • En hızlıya yakın çalışma zamanı hızı ve en sıkıya yakın sistem erişimi için TypeScript ve Rust'ı seçiyoruz.

Bir sanal makine dili isteseydik seçeceğimiz sanal makine dilleri ve web çerçeveleri için övgüye değer anmalar:

  • Clojure ve Luminus

  • Java ve Spring

  • Elixir ve Phoenix

Etkiler

Ön uç geliştiricilerinin TypeScript öğrenmesi gerekecek. Geliştiricinin temel deneyimi JavaScript kullanmaksa, bu muhtemelen kolay bir öğrenme eğrisidir.

Arka uç geliştiricilerinin Rust öğrenmesi gerekecek. Geliştiricinin temel deneyimi C/C++ kullanmaksa bu muhtemelen orta düzeyde, Java, Python, Ruby veya benzeri bellek yönetimli dilleri kullanmaksa zor bir öğrenme eğrisidir.

TypeScript ve Rust ikisi de görece yenidir. Bu, birçok aracın bu diller için henüz belgelerinin olmadığı anlamına gelir. Örneğin devops hattının bu diller için kurulması gerekecek ve şu ana kadar değerlendirdiğimiz devops araçlarının hiçbirinde bu diller için varsayılan örnekler yok.

TypeScript ve Rust için derleme süreleri oldukça yavaştır. Bunun bir kısmı dillerin yeni olmasından kaynaklanıyor olabilir. İsteğe bağlı derleme, eşzamanlı derleme vb. yoluyla yavaş derleme sürelerini nasıl hafifletebileceğimize bakmak isteyebiliriz.

Bu diller için IDE desteği henüz her yerde mevcut değil ve henüz birinci sınıf değil. Örneğin JetBrains, Python için birinci sınıf destek sunan PyCharm IDE'sini satıyor, ancak Rust için birinci sınıf destek sunan bir IDE satmıyor; bunun yerine JetBrains, Python dil desteğine kıyasla Rust dil desteğinin belki %80'ini sağlayan bir Rust eklentisi kullanabilir.

Bağlantılı

Bağlantılı kararlar

Bu dillerle uyumlu ekosistem seçimlerine yöneleceğiz.

Örneğin bu diller için iyi yeteneklere sahip bir IDE seçmek istiyoruz.

Örneğin ön uç web çerçevemiz için, düz JavaScript'e yönelen bir çerçeve (örn. React) yerine TypeScript'e yönelen bir çerçeveye (örn. Vue) karar verme olasılığımız daha yüksektir.

Bağlantılı gereksinimler

Tüm araç zincirimizin bu dilleri desteklemesi gerekir.

Bağlantılı eserler

Bazı gizli bilgileri ortam değişkenlerine aktarabileceğimizi bekliyoruz.

Bağlantılı ilkeler

İki kez ölç, bir kez inşa et. Bir miktar hıza karşı bir miktar güvenliği önceliklendiriyoruz.

Çalışma zamanı, derleme zamanından daha değerlidir. Müşteri kullanımını geliştirici kullanımına tercih ediyoruz.

Notlar

Notlar buraya.