Architecture Decision Record

Active theme: Light

← निर्णय नोंद उदाहरणे

प्रोग्रामिंग भाषा

सामग्री:

सारांश

समस्या

आम्हाला आमच्या सॉफ्टवेअरसाठी प्रोग्रामिंग भाषा निवडायच्या आहेत. आमच्या दोन प्रमुख गरजा आहेत: वेब अनुप्रयोगांसाठी योग्य अशी फ्रंट-एंड प्रोग्रामिंग भाषा, आणि सर्व्हर अनुप्रयोगांसाठी योग्य अशी बॅक-एंड प्रोग्रामिंग भाषा.

निर्णय

आम्ही फ्रंट-एंडसाठी TypeScript निवडत आहोत.

आम्ही बॅक-एंडसाठी Rust निवडत आहोत.

स्थिती

ठरले. नवीन पर्याय आल्यास आम्ही त्यांच्यासाठी खुले आहोत.

तपशील

गृहीतके

फ्रंट-एंड अनुप्रयोग सामान्य आहेत:

  • सामान्य वापरकर्ते आणि परस्परक्रिया

  • सामान्य ब्राउझर आणि प्रणाली

  • सामान्य विकास आणि डिप्लॉयमेंट

फ्रंट-एंड अनुप्रयोग वेगाने विकसित होण्याची शक्यता आहे:

  • आम्हाला जलद सोपे विकास, डिप्लॉयमेंट, पुनरावृत्ती इत्यादींची खात्री करायची आहे.

  • आम्ही प्रमाणिततेला, जसे की टाइप सुरक्षितता, महत्त्व देतो, आणि ती साध्य करण्यासाठी थोडे अधिक काम करण्यास आम्ही तयार आहोत.

  • आम्हाला जुन्या प्रणालींशी सुसंगततेची गरज नाही.

बॅक-एंड अनुप्रयोग सामान्यापेक्षा उच्च-दर्जाचे आहेत:

  • गुणवत्तेसाठी, विशेषतः प्रमाणितता, विश्वासार्हता, सुरक्षा इत्यादींसाठी सामान्यापेक्षा उच्च उद्दिष्टे.

  • जवळपास-रिअल-टाइमसाठी सामान्यापेक्षा उच्च उद्दिष्टे, म्हणजे व्हर्च्युअल मशीन गार्बेज कलेक्शनमुळे आम्हाला विराम नको आहेत.

  • फंक्शनल प्रोग्रामिंगसाठी, विशेषतः समांतरीकरण, मल्टी-कोअर प्रक्रिया आणि मेमरी सुरक्षिततेसाठी सामान्यापेक्षा उच्च उद्दिष्टे.

संकलन-वेळ सुरक्षितता आणि रनटाइम गतीच्या बदल्यात आम्ही कमी संकलन-वेळ गती स्वीकारतो.

मर्यादा

Amazon Lambda सारख्या फंक्शन्ससाठी प्रमुख क्लाउड पुरवठादारांच्या सेवांसह वापरता येणाऱ्या भाषांवर आमच्यावर तीव्र मर्यादा आहे.

मते

आम्ही या भाषांचा विचार केला:

  • C

  • C++

  • Clojure

  • Elixir

  • Erlang

  • Elm

  • Flow

  • Go

  • Haskell

  • Java

  • JavaScript

  • Kotlin

  • Python

  • Ruby

  • Rust

  • TypeScript

युक्तिवाद

प्रत्येक भाषेचा सारांश:

  • C: कमी सुरक्षिततेमुळे नाकारली; Rust जवळजवळ सर्व काही चांगले करू शकते.

  • C++: गोंधळ असल्यामुळे नाकारली; Rust जवळजवळ सर्व काही चांगले करू शकते.

  • Clojure: उत्कृष्ट मॉडेलिंग; सर्वोत्तम Lisp सदृश; JVM वर उत्तम रनटाइम.

  • Elixir: डिप्लॉयमेंटक्षमता आणि समवर्तिता यांसह उत्कृष्ट रनटाइम; उत्कृष्ट विकासक अनुभव; तुलनेने लहान परिसंस्था.

  • Erlang: डिप्लॉयमेंटक्षमता आणि समवर्तिता यांसह उत्कृष्ट रनटाइम; आव्हानात्मक विकासक अनुभव; तुलनेने लहान परिसंस्था.

  • Elm: खूप आशादायक दिसते; IBM चांगल्या निकालांसह मोठे केस स्टडी प्रकाशित करत आहे; लहान परिसंस्था.

  • Flow: JavaScript वर रोचक सुधारणा; तथापि; विकासक त्यापासून दूर जात आहेत.

  • Go: उत्कृष्ट विकासक अनुभव; उत्कृष्ट समवर्तिता; पण भाषा पंगू करणाऱ्या वाईट निर्णयांचा इतिहास.

  • Haskell: सर्वोत्तम फंक्शनल भाषा; लहान विकासक समुदाय; पुरेशी प्रकाशित उत्पादन यशे मिळवली नाहीत.

  • Java: उत्कृष्ट रनटाइम; उत्कृष्ट परिसंस्था; कमी दर्जाचा विकासक अनुभव.

  • JavaScript: आतापर्यंतची सर्वात लोकप्रिय भाषा; सर्वाधिक व्यापक परिसंस्था.

  • Kotlin: Java मधील बरेच काही दुरुस्त करते; JetBrains चा उत्कृष्ट पाठिंबा; Java वरून Kotlin वर पोर्टिंगची चांगली प्रकाशित उदाहरणे.

  • Python: सिस्टम प्रशासनासाठी सर्वात लोकप्रिय भाषा; उत्तम विश्लेषण साधने; चांगले वेब फ्रेमवर्क; पण Google ने Go च्या बाजूने सोडून दिली.

  • Ruby: आतापर्यंतचा सर्वोत्तम विकासक अनुभव; सर्वोत्तम वेब फ्रेमवर्क; सर्वात छान समुदाय; पण खूप संथ; पॅकेज करणे काहीसे कठीण.

  • Rust: सर्वोत्तम नवी भाषा; शून्य-अॅब्स्ट्रॅक्शनवर भर; समवर्तितेवर भर; तथापि तुलनेने लहान परिसंस्था; आणि काही प्रकारच्या कंपायलर गतीवाढींवर जाणीवपूर्वक मर्यादा आहेत उदा. थेट मेमरी प्रवेश स्पष्टपणे असुरक्षित (unsafe) असला पाहिजे.

  • TypeScript: JavaScript मध्ये टाइप जोडते; उत्कृष्ट ट्रान्सपायलर; JavaScript वरून TypeScript वर पोर्टिंगवर वाढता विकासक भर; Microsoft चा मजबूत पाठिंबा.

आम्ही ठरवले की VM मध्ये तडजोडींचा असा संच असतो जो आम्हाला सध्या नको आहे, जसे की रनटाइम क्षमता पुरवणारी अतिरिक्त गुंतागुंत.

आमचा मुख्य निर्णय दोन आडव्या छेदणाऱ्या चिंतांमुळे प्रेरित आहे असा आमचा विश्वास आहे:

  • सर्वाधिक रनटाइम गती आणि सर्वात घट्ट प्रणाली प्रवेशासाठी, आम्ही JavaScript आणि C निवडू.

  • जवळपास-सर्वाधिक रनटाइम गती आणि जवळपास-सर्वात घट्ट प्रणाली प्रवेशासाठी, आम्ही TypeScript आणि Rust निवडतो.

आम्हाला VM भाषा हवी असल्यास आम्ही निवडू अशा VM भाषा आणि वेब फ्रेमवर्कना सन्माननीय उल्लेख:

  • Clojure आणि Luminus

  • Java आणि Spring

  • Elixir आणि Phoenix

परिणाम

फ्रंट-एंड विकासकांना TypeScript शिकावे लागेल. विकासकाचा प्राथमिक अनुभव JavaScript वापरण्याचा असल्यास ही शक्यतो सोपी शिकण्याची चढण असेल.

बॅक-एंड विकासकांना Rust शिकावे लागेल. विकासकाचा प्राथमिक अनुभव C/C++ वापरण्याचा असल्यास ही शक्यतो मध्यम शिकण्याची चढण आहे, आणि विकासकाचा प्राथमिक अनुभव Java, Python, Ruby किंवा तत्सम मेमरी-व्यवस्थापित भाषा वापरण्याचा असल्यास कठीण शिकण्याची चढण आहे.

TypeScript आणि Rust दोन्ही तुलनेने नवीन आहेत. याचा अर्थ अनेक साधनांकडे अद्याप या भाषांसाठी दस्तऐवजीकरण नाही. उदाहरणार्थ, या भाषांसाठी devops पाइपलाइन सेट करावी लागेल, आणि आतापर्यंत, आम्ही मूल्यमापन करत असलेल्या कोणत्याही devops साधनाकडे या भाषांसाठी डीफॉल्ट उदाहरणे नाहीत.

TypeScript आणि Rust साठी संकलन वेळ खूप संथ आहे. यातील काही भाषांच्या नवेपणामुळे असू शकते. मागणीनुसार संकलन, संकलन-समवर्तिता इत्यादी मार्गांनी संथ संकलन वेळा कशा कमी करता येतील हे आम्ही पाहू इच्छितो.

या भाषांसाठी IDE समर्थन अद्याप सर्वत्र नाही आणि अद्याप प्रथम श्रेणीचे नाही. उदाहरणार्थ, JetBrains Python साठी प्रथम श्रेणी समर्थनासह PyCharm IDE विकते, पण Rust साठी प्रथम श्रेणी समर्थन असलेले IDE विकत नाही; त्याऐवजी, JetBrains एक Rust प्लग-इन वापरू शकते जे Python भाषा समर्थनाच्या तुलनेत कदाचित ८०% Rust भाषा समर्थन पुरवते.

संबंधित

संबंधित निर्णय

आम्ही या भाषांशी जुळणाऱ्या परिसंस्था निवडींकडे वाटचाल करू.

उदाहरणार्थ, आम्हाला या भाषांसाठी चांगल्या क्षमता असलेले IDE निवडायचे आहे.

उदाहरणार्थ, आमच्या फ्रंट-एंड वेब फ्रेमवर्कसाठी, आम्ही साध्या JavaScript कडे झुकणाऱ्या फ्रेमवर्कपेक्षा (उदा. React) TypeScript कडे झुकणाऱ्या फ्रेमवर्कवर (उदा. Vue) निर्णय घेण्याची अधिक शक्यता आहे.

संबंधित आवश्यकता

आमच्या संपूर्ण टूलचेनने या भाषांना समर्थन दिले पाहिजे.

संबंधित आर्टिफॅक्ट्स

आम्ही काही गुपिते पर्यावरण चलांमध्ये निर्यात करू अशी अपेक्षा आहे.

संबंधित तत्त्वे

दोनदा मोजा, एकदा बांधा. आम्ही काही गतीपेक्षा काही सुरक्षिततेला प्राधान्य देत आहोत.

रनटाइम हा संकलन वेळेपेक्षा अधिक मौल्यवान आहे. आम्ही विकासकाच्या वापरापेक्षा ग्राहकाच्या वापराला प्राधान्य देत आहोत.

टिपा

येथे कोणत्याही टिपा.