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) বেছে নেওয়ার সম্ভাবনা বেশি।

সম্পর্কিত প্রয়োজনীয়তা

আমাদের পুরো টুলচেইনকে এই ভাষাগুলো সমর্থন করতে হবে।

সম্পর্কিত উপকরণ

আমরা প্রত্যাশা করি আমরা কিছু গোপন তথ্য এনভায়রনমেন্ট ভেরিয়েবলে রপ্তানি করতে পারি।

সম্পর্কিত নীতি

দুবার মাপুন, একবার বানান। আমরা কিছু গতির চেয়ে কিছু নিরাপত্তাকে অগ্রাধিকার দিচ্ছি।

রানটাইম কম্পাইল সময়ের চেয়ে বেশি মূল্যবান। আমরা ডেভেলপারদের ব্যবহারের চেয়ে গ্রাহকদের ব্যবহারকে অগ্রাধিকার দিচ্ছি।

টীকা

এখানে যেকোনো টীকা।