পাঠ ৫৬ · ৫৮-এর মধ্যে · মডিউল ১৩
Home / Courses / Full-Stack Web Frameworks / প্রজেক্টের জন্য সঠিক স্ট্যাক বাছাই করা

প্রজেক্টের জন্য সঠিক স্ট্যাক বাছাই করা

Choosing the right stack for a project
৮ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • স্ট্যাক বাছাইয়ের ছয়টি মূল সিদ্ধান্ত-নির্ধারক ফ্যাক্টর
  • ওজনযুক্ত সিদ্ধান্ত-ম্যাট্রিক্স কীভাবে কাজ করে — ওজন, স্কোর, ও ওজনযুক্ত যোগফল
  • Python দিয়ে একটি সত্যিকারের কার্যকর স্কোরার — একাধিক প্রার্থী স্ট্যাককে সংখ্যাভিত্তিকভাবে র‍্যাঙ্ক করা
  • কেন এই সিদ্ধান্ত সবসময় স্থায়ী নয় — সময়ের সাথে ফ্যাক্টরগুলো বদলে যেতে পারে

১ · স্ট্যাক বাছাইয়ের ছয়টি মূল ফ্যাক্টর

L55-এ আমরা দেখেছি বিভিন্ন ফুল-স্ট্যাক কম্বিনেশন কী কী উপাদান দিয়ে তৈরি। কিন্তু "কোনটা ভালো" এই প্রশ্নের কোনো সার্বজনীন উত্তর নেই — উত্তর নির্ভর করে নির্দিষ্ট প্রজেক্টের প্রেক্ষাপটের উপর।

টিমের পরিচিতি
টিম যে ভাষা/ফ্রেমওয়ার্কে ইতিমধ্যে দক্ষ, সেটাতে শেখার খরচ সবচেয়ে কম।
প্রজেক্টের স্কেল
একটি ছোট MVP-তে ভারী এন্টারপ্রাইজ ফ্রেমওয়ার্কের ওভারহেড অপ্রয়োজনীয় হতে পারে।
টাইম-টু-মার্কেট
ব্যাটারিজ-ইনক্লুডেড ফ্রেমওয়ার্ক প্রায়ই দ্রুত প্রথম ভার্সন বের করতে সাহায্য করে।
ইকোসিস্টেম/লাইব্রেরি উপলব্ধতা
প্রয়োজনীয় থার্ড-পার্টি প্যাকেজ/ইন্টিগ্রেশন সেই ফ্রেমওয়ার্কের ইকোসিস্টেমে সহজলভ্য কি না।
হায়ারিং পুল
ভবিষ্যতে টিম বড় করতে হলে সেই স্ট্যাকে দক্ষ ডেভেলপার বাজারে কতটা সহজলভ্য।
পারফরম্যান্স চাহিদা
উচ্চ-থ্রুপুট বা লো-লেটেন্সি প্রয়োজন হলে কিছু স্ট্যাক অন্যদের চেয়ে এগিয়ে থাকে।

২ · ওজনযুক্ত সিদ্ধান্ত-ম্যাট্রিক্স কীভাবে কাজ করে

সবগুলো ফ্যাক্টর সমান গুরুত্বপূর্ণ নয় — একটি স্টার্টআপের জন্য টাইম-টু-মার্কেট সবচেয়ে জরুরি হতে পারে, আবার একটি ব্যাংকিং সিস্টেমের জন্য পারফরম্যান্স ও নির্ভরযোগ্যতা। এই "গুরুত্বের তারতম্য" সংখ্যায় প্রকাশ করতে প্রতিটি ফ্যাক্টরকে একটি ওজন (weight) দেওয়া হয় — সবগুলো ওজনের যোগফল সবসময় ১.০ হতে হবে। প্রতিটি প্রার্থী স্ট্যাক প্রতিটি ফ্যাক্টরে ১-১০ স্কেলে একটি স্কোর পায়, তারপর

ওজনযুক্ত স্কোর = Σ (ফ্যাক্টরের স্কোর × সেই ফ্যাক্টরের ওজন)

যে স্ট্যাকের ওজনযুক্ত স্কোর সবচেয়ে বেশি, সেটাই এই নির্দিষ্ট প্রজেক্টের অগ্রাধিকার অনুযায়ী সবচেয়ে উপযুক্ত সুপারিশ — তবে এটি একটি সিদ্ধান্ত-সহায়ক টুল, চূড়ান্ত রায় নয়।

৩ · কোড দিয়ে — একটি ওজনযুক্ত স্ট্যাক-স্কোরার

ধরা যাক একটি স্টার্টআপ MVP তৈরি করছে যেখানে টিম মূলত জাভাস্ক্রিপ্ট-এ দক্ষ, দ্রুত লঞ্চ করা জরুরি, আর হায়ারিং পুল ও ইকোসিস্টেম মাঝারি গুরুত্বপূর্ণ, পারফরম্যান্স তুলনামূলক কম অগ্রাধিকার পায়। তিনটি প্রার্থী স্ট্যাক — MERN, Django+React, ও Laravel — এই অগ্রাধিকার অনুযায়ী স্কোর করা হয়েছে।

Python
# প্রজেক্টের অগ্রাধিকার অনুযায়ী প্রতিটি ফ্যাক্টরের ওজন -- যোগফল অবশ্যই ১.০ হতে হবে
CRITERIA_WEIGHTS = {
    "team_familiarity": 0.30,
    "time_to_market":   0.25,
    "ecosystem":         0.15,
    "hiring_pool":       0.15,
    "performance":       0.15,
}

# ভাসমান-বিন্দু (floating point) যোগফলে সামান্য ত্রুটি থাকতে পারে, তাই সহনশীলতা (tolerance) দিয়ে যাচাই
assert abs(sum(CRITERIA_WEIGHTS.values()) - 1.0) < 1e-9, "ওজনগুলোর সমষ্টি অবশ্যই ১.০ হতে হবে"

# প্রতিটি প্রার্থী স্ট্যাক প্রতিটি ফ্যাক্টরে ১-১০ স্কেলে স্কোর (টিমের প্রেক্ষাপট অনুযায়ী নির্ধারিত)
CANDIDATE_STACKS = {
    "MERN (React + Express + MongoDB)": {
        "team_familiarity": 9,   # টিম আগে থেকেই জাভাস্ক্রিপ্টে অভিজ্ঞ
        "time_to_market":   8,
        "ecosystem":        9,
        "hiring_pool":      8,
        "performance":      6,
    },
    "Django + React": {
        "team_familiarity": 5,
        "time_to_market":   7,
        "ecosystem":        8,
        "hiring_pool":      6,
        "performance":      7,
    },
    "Laravel (batteries-included)": {
        "team_familiarity": 4,
        "time_to_market":   9,
        "ecosystem":        6,
        "hiring_pool":      5,
        "performance":      6,
    },
}


def weighted_score(scores, weights):
    return sum(scores[criterion] * weight for criterion, weight in weights.items())


print(f"{'স্ট্যাক':38s} | ওয়েটেড স্কোর")
print("-" * 58)
results = []
for stack_name, scores in CANDIDATE_STACKS.items():
    total = weighted_score(scores, CRITERIA_WEIGHTS)
    results.append((stack_name, total))
    print(f"{stack_name:38s} | {total:.2f}")

results.sort(key=lambda pair: pair[1], reverse=True)

print("\nসুপারিশকৃত ক্রম (সর্বোচ্চ স্কোর প্রথমে):")
for rank, (stack_name, total) in enumerate(results, start=1):
    print(f"{rank}. {stack_name} -- {total:.2f}")

    
লক্ষ্য করুন MERN সবচেয়ে বেশি ওজনযুক্ত স্কোর পায় — মূলত team_familiarity (সর্বোচ্চ ওজন ০.৩০) ফ্যাক্টরে এর স্কোর সবচেয়ে বেশি হওয়ার কারণে। যদি এই প্রজেক্টের টিম জাভাস্ক্রিপ্টে দক্ষ না হয়ে Python-এ দক্ষ হতো, team_familiarity স্কোরগুলো বদলে যেত এবং সম্ভবত ফলাফলও ভিন্ন হতো — এটাই দেখায় সিদ্ধান্ত-ম্যাট্রিক্সের ফলাফল প্রেক্ষাপট-নির্ভর, সার্বজনীন নয়।
মূল কথা · Key takeaway

সঠিক স্ট্যাক বাছাই একটি বহু-ফ্যাক্টর সিদ্ধান্ত — টিমের পরিচিতি, প্রজেক্টের স্কেল, টাইম-টু-মার্কেট, ইকোসিস্টেম, হায়ারিং পুল, ও পারফরম্যান্স সবগুলো একসাথে বিবেচনা করতে হয়। একটি ওজনযুক্ত সিদ্ধান্ত-ম্যাট্রিক্স এই বিষয়গুলোকে সংখ্যায় রূপান্তর করে তুলনাকে স্বচ্ছ ও পুনরাবৃত্তিযোগ্য করে তোলে — তবে ওজন ও স্কোরগুলো নিজেরাই মানুষের বিচার-বিবেচনার ফল, তাই টুলটি সিদ্ধান্ত নেয় না, সিদ্ধান্তে সহায়তা করে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ কেন প্রতিটি ফ্যাক্টরের ওজনের যোগফল অবশ্যই ১.০ হতে হবে, আর কোডে কেন এটি assert দিয়ে যাচাই করা হয়েছে?

ওজনের যোগফল ১.০ না হলে "ওজনযুক্ত গড়" ব্যাখ্যাটি ভেঙে যায় — উদাহরণস্বরূপ যোগফল ২.০ হলে সব স্কোর দ্বিগুণ হয়ে যাবে, যা তুলনাকে অর্থহীন করে দেয় (যদিও আপেক্ষিক র‍্যাঙ্কিং একই থাকতে পারে, পরম স্কোরের অর্থ হারিয়ে যায়)। assert ব্যবহার করা হয়েছে যাতে কেউ ভুলবশত ওজন পরিবর্তন করলে এবং যোগফল ১.০ থেকে সরে গেলে কোডটি সাথে সাথে একটি স্পষ্ট এরর দেয়, নীরবে ভুল ফলাফল না দেখায়।

প্র ০২ যদি performance-এর ওজন সবচেয়ে বেশি করে দেওয়া হতো (উদাহরণ ০.৫০), র‍্যাঙ্কিং কীভাবে বদলে যেতে পারত?

কোডের স্কোর অনুযায়ী Django+React-এর performance স্কোর (৭) MERN বা Laravel-এর চেয়ে (উভয়ই ৬) বেশি — তাই performance-এর ওজন যথেষ্ট বাড়ালে Django+React-এর মোট ওজনযুক্ত স্কোর বাড়তে পারে এবং র‍্যাঙ্কিং-এ MERN-কে ছাড়িয়ে যেতে পারে, যদিও অন্য ওজনগুলো কমিয়ে যোগফল ১.০ বজায় রাখতে হবে।

প্র ০৩ "টিমের পরিচিতি" ফ্যাক্টরটি কেন এমন যে এক সময়ে সঠিক সিদ্ধান্ত সময়ের সাথে ভুল প্রমাণিত হতে পারে?

টিমের পরিচিতি স্থির নয় — নতুন সদস্য যোগ দিলে, পুরনো সদস্য চলে গেলে, বা টিম নতুন প্রযুক্তি শিখলে team_familiarity স্কোর বদলে যায়। যে সিদ্ধান্ত আজকের টিমের জন্য সর্বোচ্চ ওজনযুক্ত স্কোর দেয়, ভবিষ্যতে টিম বদলে গেলে সেই একই স্কোরিং আর সঠিক প্রতিফলন নাও হতে পারে — তাই এই ধরনের সিদ্ধান্ত মাঝেমধ্যে পুনর্বিবেচনা করা প্রয়োজন হতে পারে, বিশেষ করে দীর্ঘমেয়াদি প্রজেক্টে।

অনুশীলন

  1. চিন্তা করুন: যদি hiring_pool-এর ওজন বাড়িয়ে ০.৩০ করা হয় (এবং time_to_market কমিয়ে ০.১০ করা হয়, যাতে যোগফল ১.০ থাকে), MERN-এর ওজনযুক্ত স্কোরে কী প্রভাব পড়বে বলে মনে হয় — বাড়বে না কমবে?

    MERN-এর hiring_pool স্কোর (৮) ইতিমধ্যে তুলনামূলক বেশি এবং time_to_market স্কোরও বেশি (৮) — তাই ঠিক কতটা বদলাবে তা নির্ভর করবে অন্য স্ট্যাকগুলোর একই দুই ফ্যাক্টরের স্কোরের সাথে তুলনায়। যেহেতু Laravel-এর hiring_pool সবচেয়ে কম (৫) কিন্তু time_to_market সবচেয়ে বেশি (৯), এই পরিবর্তনে Laravel-এর স্কোর তুলনামূলকভাবে কমতে পারে, MERN-এর সুবিধা আরও বাড়তে পারে — নিশ্চিত হতে কোড সেলে ওজন বদলে সরাসরি চালিয়ে দেখাই সবচেয়ে নির্ভরযোগ্য উপায়।

  2. পরীক্ষা করুন: উপরের কোড সেলে CRITERIA_WEIGHTS-এ performance-এর ওজন ০.৩০-এ বাড়িয়ে দিন এবং team_familiarity ০.১৫-এ কমিয়ে দিন (বাকিগুলো একই রেখে যোগফল ১.০ বজায় রাখুন), তারপর Run চেপে দেখুন র‍্যাঙ্কিং-এ কোনো বদল আসে কি না।

    এই বদলে assert লাইনটি প্রথমে যোগফল সত্যিই ১.০ কি না যাচাই করবে (০.১৫+০.২৫+০.১৫+০.১৫+০.৩০ = ১.০ ঠিক আছে)। এরপর performance-এ Django+React-এর সুবিধা (স্কোর ৭, অন্য দুটির ৬) বেশি গুরুত্ব পাবে এবং team_familiarity-তে MERN-এর সুবিধা কম গুরুত্ব পাবে — ফলে MERN ও Django+React-এর মধ্যে ব্যবধান কমে আসতে পারে, যদিও চূড়ান্ত র‍্যাঙ্কিং সরাসরি Run করেই নিশ্চিত করা উচিত।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • পরবর্তী পাঠ L57 কেস স্টাডি: একটি ফুল-স্ট্যাক অ্যাপ্লিকেশন স্কেল করা — বাস্তব সংখ্যা দিয়ে।
  • আগের পাঠ L55 জনপ্রিয় ফুল-স্ট্যাক কম্বিনেশনগুলোর তুলনা — এই পাঠের প্রার্থী স্ট্যাকগুলোর প্রেক্ষাপট।
  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৮টি পাঠ আর্কিটেকচার প্যাটার্ন, ফ্রন্ট-এন্ড/ব্যাক-এন্ড ফ্রেমওয়ার্ক ফান্ডামেন্টাল, স্টেট ম্যানেজমেন্ট, REST API, ORM, অথেন্টিকেশন, রেন্ডারিং স্ট্র্যাটেজি ও ডিপ্লয়মেন্ট।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics ও Full-Stack Web Frameworks — সব এক জায়গায়।
আগের পাঠ
জনপ্রিয় ফুল-স্ট্যাক কম্বিনেশন (MERN, MEVN, Django+React, Rails, Laravel, Spring)