সরাসরি পর্বে যান
পর্ব ০১ · ৭০-এর মধ্যে · মডিউল ১

Software engineering কী — কোড লেখা থেকে টেকসই software বানানো

What Is Software Engineering? From Writing Code to Building Software That Lasts

Taught in Bangla, this lesson contrasts programming with software engineering, explains Brooks's reasons software is inherently hard, maps the six-stage software lifecycle onto the course modules, and uses runnable JS simulations for the cost of late bugs, lifetime maintenance cost and the n(n-1)/2 communication paths in growing teams. It also covers team roles, where Git fits, the SWEBOK knowledge areas and software engineering in the AI era.

এই পর্বে যা শিখবেন

  • Programming আর software engineering-এর পার্থক্য — সময়, মানুষ আর বদলের দিক থেকে
  • Software কেন স্বভাবগতভাবে কঠিন, আর কোন কঠিনতা টুল দিয়ে কমে, কোনটি কমে না
  • Software lifecycle-এর ছয়টি ধাপ আর এই কোর্সের ১১টি মডিউল কোন ধাপে বসে
  • দেরিতে ধরা ভুল, maintenance আর দলের আকার নিয়ে সহজ হিসাব — কোড চালিয়ে নিজে যাচাই করে
  • দলের ভূমিকাগুলো, একটি পরিবর্তনের অনুরোধ দলের ভেতর দিয়ে কীভাবে যায়, আর Git কোথায় বসে

১ · কোড লেখা বনাম software engineering

দুটি দৃশ্য ভাবুন। প্রথম দৃশ্যে রাফি এক রাতে বসে একটি ছোট প্রোগ্রাম লিখল — বন্ধুদের ক্রিকেট টুর্নামেন্টের পয়েন্ট টেবিল বানানোর জন্য। প্রোগ্রাম চলল, টুর্নামেন্ট শেষ, প্রোগ্রামটির কাজও শেষ। আর কেউ সেটি খুলবে না।

দ্বিতীয় দৃশ্যে একটি কাল্পনিক বিশ্ববিদ্যালয়ের ফলাফল পোর্টাল। এটি চলবে দশ বছর বা তারও বেশি। প্রতি বছর নতুন নিয়ম আসবে — নতুন grading পদ্ধতি, নতুন বিভাগ, নতুন ফোন, নতুন browser. যাঁরা প্রথম কোড লিখেছিলেন, তাঁদের অনেকে তিন বছর পর অন্য চাকরিতে চলে যাবেন। নতুনরা এসে এমন কোড বদলাবেন, যা তাঁরা নিজে লেখেননি। আর একটি ভুল মানে হাজার শিক্ষার্থীর ভুল ফলাফল।

দুটি দৃশ্যেই কোড লেখা হচ্ছে। কিন্তু দ্বিতীয়টিতে প্রশ্নগুলো আলাদা: ছয় মাস পরে এটি বদলাতে পারব তো? অন্য কেউ বুঝবেন তো? বদলাতে গিয়ে পুরোনো কিছু ভেঙে যাবে না তো? দশজন একসাথে কাজ করলে একে অপরের কাজ মুছে ফেলবেন না তো? এই প্রশ্নগুলোর উত্তর খোঁজার বিদ্যাই software engineering.

একজন দক্ষ রাজমিস্ত্রি সুন্দর করে একটি দেয়াল গাঁথতে পারেন — এটি programming-এর মতো। কিন্তু দশতলা একটি বাড়ি বানাতে লাগে নকশা, মাটি পরীক্ষা, ভার হিসাব, বিদ্যুৎ-পানির লাইনের পরিকল্পনা, কাজের ক্রম, অনেক মিস্ত্রির সমন্বয়, আর পরে বছরের পর বছর মেরামত — সেটি engineering. ভালো দেয়াল গাঁথা দরকার, কিন্তু শুধু তা দিয়ে বাড়ি দাঁড়ায় না। আবার software-এর বাড়িটি অদ্ভুত: বাসিন্দারা উঠে যাওয়ার পরেও প্রতি মাসে নতুন ঘর যোগ করার অনুরোধ আসে।

“সময়ের সাথে যোগ করা programming”

২০২০ সালে প্রকাশিত Software Engineering at Google বইয়ে (Titus Winters, Tom Manshreck ও Hyrum Wright সম্পাদিত) একটি সংক্ষিপ্ত সংজ্ঞা জনপ্রিয় হয়েছে — মোটামুটি এরকম: software engineering হলো সময়ের সাথে যোগ করা programming (“programming integrated over time”). অর্থাৎ একটি মুহূর্তে কোড কাজ করছে কি না, শুধু সেটি নয়; কোডটি তার পুরো জীবনকাল ধরে কতটা সহজে বদলানো যায়, সেটিই আসল মাপ। বইটি তিনটি দিকের কথা বলে: সময় (কোড কত দিন বাঁচবে), মাপ (কতজন মানুষ, কত কোড) আর trade-off (কোন সিদ্ধান্তের দাম কী)।

Programming

একজন বা অল্প কয়েকজন; সমস্যা মোটামুটি স্থির; লক্ষ্য: “এখন চলছে কি না”। কোডের আয়ু কয়েক দিন থেকে কয়েক মাস।

স্ক্রিপ্ট, অনুশীলনের সমস্যা, hackathon

Software engineering

অনেক মানুষ, বহু বছর; চাহিদা ক্রমাগত বদলায়; লক্ষ্য: “নিরাপদে বদলানো যায় কি না”। নকশা, test, review, version control আর প্রক্রিয়া লাগে।

ব্যাংকিং অ্যাপ, ফলাফল পোর্টাল, OS

আনুষ্ঠানিক সংজ্ঞা

IEEE-র পুরোনো মান IEEE Std 610.12 (১৯৯০) আর পরে software engineering-এর শব্দকোষ হিসেবে প্রকাশিত ISO/IEC/IEEE 24765-এ যে সংজ্ঞা দেওয়া আছে, তার সারকথা: software-এর development, operation আর maintenance-এ একটি নিয়মতান্ত্রিক (systematic), শৃঙ্খলাবদ্ধ (disciplined) ও মাপা যায় এমন (quantifiable) পদ্ধতির প্রয়োগ — অর্থাৎ software-এ engineering-এর প্রয়োগ। (শব্দের হুবহু রূপ সংস্করণভেদে সামান্য আলাদা হতে পারে; মূল ভাবটি এটাই।)

মূল ধারণা

সংজ্ঞার তিনটি বিশেষণ মনে রাখুন। Systematic — কাজ এলোমেলো নয়, একটি পরিকল্পিত ধারায়। Disciplined — দলের সবাই কিছু নিয়ম মানেন, তাড়ার সময়েও। Quantifiable — মান, খরচ, সময় মাপা হয়, যাতে অনুমানের বদলে তথ্য দিয়ে সিদ্ধান্ত নেওয়া যায়। আর খেয়াল করুন, সংজ্ঞায় শুধু development নয়, operation আর maintenance-ও আছে — software চালু হওয়ার পরের জীবনও engineering-এর অংশ।

“Software engineering” কথাটি ব্যাপকভাবে ছড়ায় ১৯৬৮ সালে জার্মানির Garmisch-এ NATO-র উদ্যোগে হওয়া একটি সম্মেলন থেকে। তখন বড় বড় software project সময়মতো শেষ হচ্ছিল না, বাজেট ছাড়িয়ে যাচ্ছিল, ভুলে ভরা থাকছিল — যাকে বলা হলো “software crisis”. আয়োজকেরা ইচ্ছা করেই একটু উসকে দেওয়ার মতো নাম বেছে নেন, যাতে software বানানোকেও সেতু বা বিদ্যুৎকেন্দ্র বানানোর মতো প্রকৌশল হিসেবে দেখা হয়। সেই ইতিহাসের বিস্তারিত পাবেন পর্ব ০২ · Software crisis আর software engineering-এর ইতিহাস-এ।

২ · Software কেন স্বভাবগতভাবে কঠিন

সেতু বানাতেও তো জটিলতা আছে। তাহলে software-এর বিশেষত্ব কী? ১৯৮৬ সালে The Mythical Man-Month-এর লেখক Fred Brooks একটি বিখ্যাত প্রবন্ধ লেখেন — “No Silver Bullet: Essence and Accident in Software Engineering”. সেখানে তিনি কঠিনতাকে দুই ভাগে ভাগ করেন:

  • Essential complexity (মৌলিক জটিলতা) — সমস্যার নিজের ভেতরের জটিলতা। ব্যাংকের সুদের নিয়মে ৪০টি ব্যতিক্রম থাকলে কোডেও সেই ৪০টি থাকবে, যে ভাষাতেই লিখুন।
  • Accidental complexity (আনুষঙ্গিক জটিলতা) — আমাদের টুল ও পদ্ধতির কারণে আসা জটিলতা। Assembly-তে লিখলে memory-র হিসাব নিজে রাখতে হয়; উচ্চস্তরের ভাষা সেটি সরিয়ে দেয়।

Brooks-এর যুক্তি ছিল, ভালো ভাষা, ভালো টুল আর দ্রুত কম্পিউটার accidental অংশ অনেক কমিয়েছে; কিন্তু essential অংশ থেকে যায়, তাই কোনো একক আবিষ্কার একাই দশ গুণ উন্নতি এনে দেবে — এমন “silver bullet” আশা করা ঠিক নয়। তিনি essential কঠিনতার চারটি বৈশিষ্ট্য বলেন:

বৈশিষ্ট্যমানেফলাফল পোর্টালের উদাহরণ
Complexity (জটিলতা)প্রায় কোনো দুটি অংশ হুবহু এক নয়; অবস্থার সংখ্যা বিশাল, অংশগুলো একে অপরের ওপর নির্ভরশীলবিভাগ, কোর্স, retake, বিশেষ পরীক্ষা, GPA-র নিয়ম — সব মিলে অগণিত সমন্বয়
Conformity (মানিয়ে চলা)Software-কে মানুষের বানানো নিয়ম, আইন আর অন্য সিস্টেমের সাথে মিলতে হয় — সেই নিয়ম প্রায়ই খামখেয়ালিবিশ্ববিদ্যালয়ের অধ্যাদেশ, ব্যাংকের ফি-সিস্টেমের ফরম্যাট, পুরোনো database-এর অদ্ভুত কলাম
Changeability (বদলযোগ্যতা)Software বদলানো “সহজ মনে হয়”, তাই বদলের চাপ সবসময় থাকেপ্রতি বছর grading নিয়ম, নতুন রিপোর্ট, মোবাইল অ্যাপের দাবি
Invisibility (অদৃশ্যতা)Software-এর কোনো ভৌত আকার নেই; একটি ছবিতে পুরো গঠন দেখানো যায় নাডেটার প্রবাহ, নিয়ন্ত্রণের প্রবাহ, নির্ভরতা — প্রত্যেকটির আলাদা ছবি লাগে

দর্জির কথা ভাবুন। একজনের মাপে জামা বানানো কঠিন নয়। কিন্তু ধরুন এমন একটি জামা বানাতে হবে, যা একসাথে হাজার মানুষের গায়ে লাগবে (complexity), স্কুলের ইউনিফর্মের নিয়মও মানবে (conformity), প্রতি মাসে মানুষ মোটা-চিকন হলে জামাটিও নিজে বদলাবে (changeability), আর জামাটি কেউ চোখে দেখতে পাবে না — শুধু মাপের খাতা দেখে বুঝতে হবে (invisibility). Software বানানো অনেকটা এমনই।

এই কোর্সের প্রায় প্রতিটি হাতিয়ার এই চারটির কোনো একটির জবাব। Modularity আর design principle জটিলতা ভাগ করে (মডিউল ৫); requirement engineering conformity সামলায় (মডিউল ৪); test আর version control বদলকে নিরাপদ করে (মডিউল ৮ আর ২); UML আর architecture diagram অদৃশ্যকে দৃশ্যমান করে (পর্ব ২৯–৩০, ৩৮)।

৩ · Software lifecycle এক নজরে — আর এই কোর্সের মানচিত্র

প্রতিটি software, ছোট হোক বা বড়, মোটামুটি একই ধাপগুলো পার হয়। একে বলে software development life cycle বা SDLC. ধাপগুলোর নাম বই ও প্রতিষ্ঠানভেদে কিছুটা আলাদা, কিন্তু মূল কাঠামো এরকম:

  1. Requirement — কী বানাতে হবে, কার জন্য, কেন। এখানে stakeholder-দের কথা শোনা হয়।
  2. Design — কীভাবে বানাব: কোন অংশ, কোন ডেটা, কোন interface.
  3. Construction — কোড লেখা, unit test, code review.
  4. Testing — সবকিছু একসাথে ঠিকমতো কাজ করছে কি না যাচাই।
  5. Deployment — ব্যবহারকারীদের জন্য production-এ চালু করা।
  6. Maintenance — চালু software-এ ভুল সারানো, মানিয়ে নেওয়া, নতুন চাহিদা যোগ করা — যা থেকে আবার নতুন requirement জন্ম নেয়।

লক্ষ করুন, এটি একটি সরলরেখা নয়, একটি চক্র। এই ধাপগুলো কোন ক্রমে, একবারে না বারবার, বড় টুকরোয় না ছোট টুকরোয় করা হবে — সেটিই process model-এর প্রশ্ন: waterfall-এ একবারে একেকটি ধাপ, Scrum-এ প্রতি দুই-চার সপ্তাহে পুরো চক্রের একটি ছোট ঘূর্ণি। বিস্তারিত পর্ব ০৪ · SDLC আর process model, পর্ব ০৫ · Agile আর Scrum আর পর্ব ০৬ · Kanban আর lean-এ।

Software lifecycle-এর চক্র আর এই কোর্সের মডিউল

The software lifecycle loop, with the modules of this course mapped onto it

Software lifecycle-এর চক্রে কোর্সের মডিউল ঘড়ির কাঁটার দিকে ছয়টি ধাপ: ওপরে Requirement (মডিউল ৪), তারপর Design (মডিউল ৫, ৬, ৭), Construction (মডিউল ৭, ২, ৩), নিচে Testing (মডিউল ৮), তারপর Deployment (মডিউল ৯, ১০), Maintenance (পর্ব ৪৩, মডিউল ৯), আবার Requirement-এ ফেরা। মাঝখানে লেখা: process model মডিউল ১, আর Git প্রতিটি ধাপে — মডিউল ২, ৩, ৯। Requirement Design Construction Testing Deployment Maintenance মডিউল ৪ মডিউল ৫, ৬, ৭ মডিউল ৭, ২, ৩ মডিউল ৮ মডিউল ৯, ১০ পর্ব ৪৩, মডিউল ৯ Process model: মডিউল ১ Git: প্রতিটি ধাপে মডিউল ২, ৩, ৯
ছবি ১.১ — ছয়টি ধাপ ঘড়ির কাঁটার দিকে ঘোরে; maintenance থেকে নতুন requirement আসে, চক্র আবার শুরু হয়। প্রতিটি বাক্সের নিচে লেখা আছে এই কোর্সের কোন মডিউল সেই ধাপের হাতিয়ার শেখায়। মাঝখানের বাক্স মনে করিয়ে দেয়: চক্রটি কীভাবে চালানো হবে, তা process model ঠিক করে, আর Git চক্রের প্রতিটি ধাপে কাজের ইতিহাস ধরে রাখে।

এবার একটি ছোট feature-কে ধারণা থেকে production পর্যন্ত অনুসরণ করা যাক। কাল্পনিক ফলাফল পোর্টালে শিক্ষার্থীরা চাইছেন: “নিজের ফলাফল PDF আকারে নামাতে চাই।” “পরে” চাপুন, অথবা “চালান” চাপলে নিজে থেকেই এগোবে।

  1. Requirementকী আর কেন
  2. Designকীভাবে
  3. Constructionকোড
  4. Testingযাচাই
  5. Deploymentচালু
  6. Maintenanceটিকিয়ে রাখা
এই ধাপে
প্রশ্ন
যা তৈরি হলো
মূল ভূমিকা
কোর্সে কোথায়
  1. ধাপ ১ — requirement. “PDF চাই” শুনতে সহজ, কিন্তু প্রশ্ন অনেক: সব বর্ষের ফল, না শুধু শেষটির? PDF-এ সই বা QR কোড লাগবে? কে নামাতে পারবেন — শুধু শিক্ষার্থী নিজে? Product owner এসব শিক্ষার্থী আর পরীক্ষা নিয়ন্ত্রক দপ্তরের সাথে কথা বলে একটি user story আর তার acceptance criteria লেখেন। এখানে ভুল হলে পরের সব ধাপ ভুল জিনিস বানাবে।
  2. ধাপ ২ — design. Tech lead আর developer ঠিক করেন: PDF তৈরি হবে server-এ, একটি আলাদা ছোট অংশে; ফলাফলের ডেটা আসবে বিদ্যমান result service থেকে; একই অনুরোধ বারবার এলে আবার বানানোর দরকার নেই। এক পাতার একটি design note যথেষ্ট — বড় নথি সব সময় লাগে না, কিন্তু সিদ্ধান্তগুলো লেখা থাকা দরকার।
  3. ধাপ ৩ — construction. Developer Git-এ একটি নতুন branch খুলে কোড আর unit test লেখেন, তারপর একটি pull request খোলেন। একজন reviewer কোড পড়ে বলেন: “শিক্ষার্থীর ID URL থেকে সরাসরি নিলে অন্যের ফল দেখা যাবে — লগইন করা ব্যবহারকারীর ID নিন।” Review-এ ধরা এই একটি মন্তব্য একটি গুরুতর নিরাপত্তা-ত্রুটি আটকে দিল।
  4. ধাপ ৪ — testing. QA বিভিন্ন ক্ষেত্রে চালিয়ে দেখেন: যাঁর কোনো ফল নেই, যাঁর retake আছে, যাঁর নাম অনেক লম্বা। দুটি bug পাওয়া গেল, developer ঠিক করলেন। Test স্বয়ংক্রিয় হলে প্রতিটি পরিবর্তনে এগুলো আবার চলবে — সেটিই continuous integration-এর ভাবনা।
  5. ধাপ ৫ — deployment. নতুন সংস্করণ v2.4.0 নামে release হলো। প্রথমে অল্প কিছু ব্যবহারকারীর জন্য চালু করে দেখা হলো সার্ভারের ভার ঠিক আছে কি না, তারপর সবার জন্য। ভুল হলে আগের সংস্করণে ফেরার পথ আগেই তৈরি রাখা ছিল।
  6. ধাপ ৬ — maintenance. এক সপ্তাহ পরে অভিযোগ এলো: কিছু শিক্ষার্থীর বাংলা নাম PDF-এ ভেঙে যাচ্ছে (font-এর সমস্যা)। নতুন issue খোলা হলো — আর চক্র আবার ধাপ ১ থেকে শুরু। খেয়াল করুন, প্রথম “চালু” হওয়া মানে কাজ শেষ নয়; বরং তখনই আসল জীবন শুরু।

৪ · দেরিতে ধরা ভুলের দাম

পরীক্ষার খাতার কথা ভাবুন। খসড়া পাতায় একটি অঙ্কের ভুল ধরা পড়লে কেটে আবার লেখা — এক মিনিট। ফেয়ার কপিতে লিখে ফেলার পরে ধরা পড়লে পুরো পাতা আবার লিখতে হয়। আর খাতা জমা দেওয়ার পরে ধরা পড়লে আর কিছুই করার থাকে না, নম্বর কাটা যায়।

Software-এও একই ধারণা বহুল প্রচলিত: একটি defect যত পরের ধাপে ধরা পড়ে, তা ঠিক করতে সাধারণত তত বেশি rework লাগে। কারণগুলো সহজ: ভুল requirement-এর ওপর নকশা, নকশার ওপর কোড, কোডের ওপর test আর documentation দাঁড়িয়ে যায় — ভিত ভুল হলে ওপরের সব কিছু ভাঙতে হয়। আর production-এ ধরা পড়লে যোগ হয় ব্যবহারকারীর ক্ষতি, জরুরি release, ডেটা ঠিক করা আর আস্থা হারানো।

সংখ্যা নিয়ে সাবধান। এই cost of change-এর ধারণাটি প্রায়ই Barry Boehm-এর Software Engineering Economics (১৯৮১) বইয়ের একটি বক্ররেখার সূত্রে উদ্ধৃত হয়, আর তার সাথে “১০ গুণ” বা “১০০ গুণ”-এর মতো সংখ্যা ঘুরে বেড়ায়। কিন্তু সেই পুরোনো তথ্য কোন ধরনের project থেকে, কীভাবে মাপা — তা নিয়ে পরে অনেকে প্রশ্ন তুলেছেন (যেমন Laurent Bossavit-এর ২০১২ সালের বই The Leprechauns of Software Engineering). আবার Kent Beck-এর মতো Agile-পন্থীরা বলেছেন, ছোট ধাপ, স্বয়ংক্রিয় test আর ঘনঘন release দিয়ে বক্ররেখাটিকে অনেকটা চ্যাপ্টা করা যায়। তাই এই পর্বে আমরা কোনো “সার্বজনীন গুণক” দেব না; নিচের হিসাবে সব সংখ্যাই স্পষ্টভাবে ধরা যাক।

নিচের প্রোগ্রামটি ১,০০০টি কাল্পনিক bug নিয়ে খেলা করে। প্রতিটি bug requirement ধাপে জন্মায়, তারপর প্রতিটি ধাপে কিছু সম্ভাবনায় ধরা পড়ে, না পড়লে পরের ধাপে গড়িয়ে যায়; production-এ গেলে সেখানে তো ধরা পড়বেই — ব্যবহারকারী ধরিয়ে দেবেন। প্রতিটি ধাপে ঠিক করার খরচ (১, ২, ৪, ৮, ৩০ একক) আর ধরার সম্ভাবনা দুটোই অনুমান। দুটি দল তুলনা করা হয়েছে: একটি দল প্রায় শুধু শেষে test করে, আরেকটি requirement আর design ধাপেও review করে। এলোমেলো সংখ্যা আসে নির্দিষ্ট seed-এর mulberry32 থেকে, তাই প্রতিবার একই ফল।

// Where is a bug caught, and what does fixing it cost? A toy simulation.
// Stage costs and catch chances are ASSUMPTIONS for illustration, not measured facts.
let seed = 2026;
function rand() {                         // mulberry32: small seeded PRNG
  seed = (seed + 0x6D2B79F5) | 0; let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
  t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t; return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
}
const STAGES = ["requirements", "design", "coding", "testing", "production"];
const COST   = [1, 2, 4, 8, 30];          // assumption: units of rework if the bug is caught here

function simulate(catchChance, bugs) {    // catchChance[i] = chance a stage catches a bug still alive
  const caught = [0, 0, 0, 0, 0]; let cost = 0;
  for (let b = 0; b < bugs; b++) {
    let s = 0;
    while (s < 4 && rand() >= catchChance[s]) s++;   // slips to the next stage
    caught[s]++; cost += COST[s];                     // production (s = 4) always "catches" it
  }
  return { caught, avg: cost / bugs };
}
const testOnly  = simulate([0.0, 0.0, 0.2, 0.6], 1000);  // assumption: almost no early review
const withReview = simulate([0.3, 0.3, 0.4, 0.6], 1000); // assumption: reviews in early stages

for (const [name, r] of [["test only  ", testOnly], ["with review", withReview]]) {
  console.log(name + "  caught per stage " + r.caught.join(" / ") + "   avg cost " + r.avg.toFixed(2));
}
console.log("stages: " + STAGES.join(" / "));

আউটপুট:

test only    caught per stage 0 / 0 / 213 / 455 / 332   avg cost 14.45
with review  caught per stage 287 / 213 / 201 / 179 / 120   avg cost 6.55
stages: requirements / design / coding / testing / production

শুধু-test দলে ১,০০০টির মধ্যে ৩৩২টি bug production পর্যন্ত পৌঁছেছে, গড় খরচ ১৪.৪৫ একক। Review-ওয়ালা দলে requirement আর design ধাপেই ধরা পড়েছে ২৮৭ + ২১৩ = ৫০০টি, production-এ গেছে ১২০টি, গড় খরচ ৬.৫৫ — অর্ধেকেরও কম। তবে এবার COST-এর লাইনে [1, 1.5, 2, 3, 5] বসিয়ে চালান (যেখানে দেরিতে ধরা অনেক কম দামি): একই seed-এ ধরা পড়ার সংখ্যা হুবহু এক থাকে, গড় খরচ আসে ৩.৪৫ বনাম ২.১৫. পার্থক্য কমে গেল, কিন্তু দিক একই রইল। শিক্ষা: ফলাফলের আকার পুরোপুরি অনুমানের ওপর নির্ভর করে; দিকটি (আগে ধরলে কম কাজ) অনেক বেশি অনুমানেই টেকে। নিজের দলের আসল তথ্য মাপলেই কেবল আসল সংখ্যা জানা যায়।

“আগে ধরা” মানে “শুরুতে সব কিছু নিখুঁত করে লিখে রাখা” নয়। আধুনিক চর্চা উল্টো পথেও একই লক্ষ্যে যায়: খুব ছোট ছোট পরিবর্তন, প্রতিটির সাথে স্বয়ংক্রিয় test, দ্রুত review আর ঘনঘন release — যাতে প্রতিটি ভুল জন্মের কয়েক ঘণ্টার মধ্যেই ধরা পড়ে। এই চিন্তা থেকেই আসে TDD (পর্ব ৪৮), continuous integration (পর্ব ৫৮) আর continuous delivery (পর্ব ৫৯)।

৫ · Maintenance — জীবনকালের সবচেয়ে বড় খরচ

নতুনরা প্রায়ই ভাবেন, software বানানোর আসল কাজ প্রথম সংস্করণ লেখা, আর পরেরটা “ছোটখাটো ঠিকঠাক”। বাস্তব প্রায় উল্টো। বিভিন্ন বই ও জরিপে software-এর জীবনকালের মোট খরচের মধ্যে maintenance-এর ভাগ সাধারণত বড় করে দেখানো হয় — Robert Glass তাঁর Facts and Fallacies of Software Engineering (২০০২) বইয়ে ৪০% থেকে ৮০% পরিসরের কথা বলেছেন। সঠিক অনুপাত project, সময়কাল আর “maintenance” কাকে বলা হচ্ছে তার ওপর অনেক বদলায়, তাই কোনো একটি সংখ্যা মুখস্থ না করে পরিসর আর কারণটি বুঝুন।

আরেকটি গুরুত্বপূর্ণ পর্যবেক্ষণ: maintenance-এর বড় অংশ ভুল সারানো নয়। Lientz আর Swanson-এর ১৯৮০ সালের পরিচিত গবেষণা থেকে শুরু করে maintenance-কে সাধারণত কয়েক ভাগে দেখা হয় — corrective (ভুল সারানো), adaptive (নতুন OS, নতুন আইন, নতুন পরিবেশে মানিয়ে নেওয়া), perfective (নতুন feature, দ্রুততর করা), আর পরে ISO/IEC 14764-এ যোগ হওয়া preventive (ভবিষ্যতের সমস্যা ঠেকাতে কোড গুছানো)। বহু জরিপে দেখা গেছে, নতুন চাহিদা মেটানোর কাজই বড় ভাগ নেয়। অর্থাৎ maintenance মানে আসলে software-এর বেড়ে ওঠা।

কেন খরচ সময়ের সাথে বাড়ে? প্রতিটি তাড়াহুড়োর সমাধান একটু করে technical debt জমায় — ঋণের মতো, যার সুদ প্রতিটি পরের পরিবর্তনে দিতে হয়। Meir Lehman ১৯৭০-এর দশক থেকে software বিবর্তনের কয়েকটি “সূত্র” দিয়েছিলেন, যার একটির সারকথা: ব্যবহৃত software-কে ক্রমাগত বদলাতে হয়, আর আলাদা করে চেষ্টা না করলে বদলের সাথে তার জটিলতা বাড়ে। বিস্তারিত পর্ব ৪৩-এ।

নিচের খেলনা-মডেলে সব সংখ্যা ধরা যাক: প্রথম সংস্করণ বানাতে ১০০ একক; প্রথম বছরের maintenance তার ১৫%; প্রতি বছর কোড ৫% বেশি কঠিন হয়, তাই maintenance-ও ৫% করে বাড়ে; software চলে ১০ বছর।

// A toy lifetime-cost model. ALL numbers below are assumptions ("dhora jak"), not facts.
const DEV = 100;        // assumption: building version 1 costs 100 units
const YEARS = 10;       // assumption: the software is used for 10 years
const MAINT0 = 0.15;    // assumption: year-1 maintenance = 15% of DEV (fixes, small changes)
const GROWTH = 0.05;    // assumption: each year the code is 5% harder to change

function lifetime(years, maint0, growth) {
  let maint = 0;
  for (let y = 1; y <= years; y++) maint += DEV * maint0 * Math.pow(1 + growth, y - 1);
  return { maint, total: DEV + maint, share: maint / (DEV + maint) };
}

const base = lifetime(YEARS, MAINT0, GROWTH);
console.log("base case: dev " + DEV + ", maintenance " + base.maint.toFixed(1) +
  ", total " + base.total.toFixed(1) + ", maintenance share " + (100 * base.share).toFixed(1) + "%");

console.log("years  share(growth 0%)  share(growth 5%)  share(growth 10%)");
for (const y of [1, 3, 5, 10, 15]) {
  const row = [0, 0.05, 0.10].map((g) => (100 * lifetime(y, MAINT0, g).share).toFixed(1) + "%");
  console.log(String(y).padStart(5) + row.map((s) => s.padStart(18)).join(""));
}
// What if a cleaner design costs 20% more up front but grows only 2% a year?
let m2 = 0;
for (let y = 1; y <= YEARS; y++) m2 += DEV * MAINT0 * Math.pow(1.02, y - 1);
console.log("cleaner design: total " + (DEV * 1.2 + m2).toFixed(1) + " vs base " + base.total.toFixed(1));

আউটপুট:

base case: dev 100, maintenance 188.7, total 288.7, maintenance share 65.4%
years  share(growth 0%)  share(growth 5%)  share(growth 10%)
    1             13.0%             13.0%             13.0%
    3             31.0%             32.1%             33.2%
    5             42.9%             45.3%             47.8%
   10             60.0%             65.4%             70.5%
   15             69.2%             76.4%             82.7%
cleaner design: total 284.2 vs base 288.7

মূল অনুমানে ১০ বছরে maintenance ১৮৮.৭ একক, অর্থাৎ মোট ২৮৮.৭-এর ৬৫.৪%. টেবিলটি দেখায় অনুপাত কীসের ওপর নির্ভর করে: software যত বেশি দিন বাঁচে আর কোড যত দ্রুত কঠিন হয়, maintenance-এর ভাগ তত বড় — ১ বছরে মাত্র ১৩%, ১৫ বছরে ৬৯% থেকে ৮৩%. বৃদ্ধি শূন্য ধরলেও ১০ বছরে ৬০%. শেষ লাইনটি একটি trade-off: ধরা যাক পরিষ্কার নকশায় শুরুতে ২০% বেশি খরচ (১২০), কিন্তু কোড কঠিন হয় বছরে মাত্র ২%; তাহলে ১০ বছরে মোট ২৮৪.২, মূল ২৮৮.৭-এর চেয়ে সামান্য কম। Software ৩ বছর বাঁচলে এই বিনিয়োগ লাভজনক হতো না — তাই “ভালো নকশা সবসময় লাভ” নয়, বরং “দীর্ঘজীবী software-এ লাভের সম্ভাবনা বেশি”।

মূল ধারণা

প্রথম দিনে কোড লেখার সময় আপনি আসলে লিখছেন ভবিষ্যতের পাঠকের জন্য — যিনি হয়তো ছয় মাস পরের আপনি নিজেই। Software engineering-এর অনেক নিয়ম (পরিষ্কার নাম, test, ছোট function, ভালো commit message) প্রথম দিনে সময় নেয়, কিন্তু maintenance-এর বছরগুলোতে সুদসহ ফেরত দেয়।

৬ · দল বড় হলে কী ভাঙে — n(n−1)/2

একা কাজ করলে সব তথ্য আপনার মাথায়। দুজন হলে একটি যোগাযোগ লাগে। তিনজনে তিনটি, চারজনে ছয়টি। প্রতিটি নতুন মানুষ বাকি সবার সাথে কথা বলতে পারেন, তাই n জনের দলে সম্ভাব্য communication path-এর সংখ্যা

পথের সংখ্যা = n(n−1)/2
৫ জনে ১০, ১০ জনে ৪৫, ৫০ জনে ১,২২৫

কারণ: প্রত্যেকে বাকি (n−1) জনের সাথে যুক্ত, তাতে n(n−1); কিন্তু “ক-খ” আর “খ-ক” একই পথ, তাই ২ দিয়ে ভাগ। কাজ মানুষের সংখ্যার সমানুপাতে বাড়ে, কিন্তু যোগাযোগ বাড়ে প্রায় বর্গের হারে। Fred Brooks ১৯৭৫ সালে The Mythical Man-Month বইয়ে এই হিসাব দিয়েই ব্যাখ্যা করেন কেন “মাস × মানুষ” দিয়ে কাজ মাপা বিভ্রান্তিকর। নিচের ডায়াগ্রামে দল ১ জন থেকে ৮ জনে বাড়ছে — প্রতিটি নীল রেখা একটি যোগাযোগের পথ।

দলের সদস্য আর তাঁদের মধ্যে যোগাযোগের পথ একটি বৃত্তের ওপর ১ থেকে ৮ নম্বর আটজন সদস্য; প্রতিটি ধাপে একজন নতুন সদস্য যোগ হন আর তাঁর সাথে আগের সবার নতুন নীল রেখা যুক্ত হয়। ৮ জনে মোট ২৮টি রেখা। ১ ২ ৩ ৪ ৫ ৬ ৭ ৮
এই ধাপে
সদস্য n
পথ n(n−1)/2
নতুন পথ
কী ভাঙে
যা লাগে
  1. ১ জন — কোনো যোগাযোগ লাগে না। রাফি একা লিখছে, সব সিদ্ধান্ত তার মাথায়। পথ ০টি। কোনো প্রক্রিয়া ছাড়াই চলে — এজন্যই একা কাজ করা মানুষেরা প্রায়ই ভাবেন software engineering-এর নিয়মগুলো বাড়াবাড়ি।
  2. ২ জন — প্রথম পথ, প্রথম সংঘর্ষ। পথ ১টি। দুজন একই ফাইল বদলে কেউ একজন অন্যজনের কাজ ওপরে লিখে ফেলেন। এখান থেকেই version control-এর দরকার শুরু — দুজনের পরিবর্তন আলাদা রেখে পরে মেলানো।
  3. ৩ জন — পথ ৩টি (+২)। কে কোন কাজ করছেন, মুখে বললে আর মনে থাকে না। একটি issue tracker বা অন্তত একটি তালিকা লাগে।
  4. ৪ জন — পথ ৬টি (+৩)। একই bug দুজন আলাদা করে ঠিক করছেন, কেউ জানেন না। কাজের বোর্ডে “কে কোনটি নিয়েছেন” দেখা গেলে এই অপচয় থামে — Kanban বোর্ডের ভাবনা।
  5. ৫ জন — পথ ১০টি (+৪)। প্রত্যেকের কম্পিউটারে আলাদা version-এর library, তাই “আমার কম্পিউটারে তো চলে” শোনা যায়। সবার কোড একই নিয়মে স্বয়ংক্রিয়ভাবে build আর test হওয়া দরকার — continuous integration.
  6. ৬ জন — পথ ১৫টি (+৫)। সবাইকে সব জানাতে গেলে দিনের বড় অংশ মিটিং-এ যায়। ছোট, নির্দিষ্ট সময়ের stand-up আর লিখে রাখা সিদ্ধান্ত বারবার একই কথা বলার খরচ কমায়।
  7. ৭ জন — পথ ২১টি (+৬)। নতুন সদস্য যোগ দিলেন; কে কী জানেন, কোথায় কী আছে — শিখতে সপ্তাহ লাগে, আর শেখাতে গিয়ে পুরোনোদের সময়ও যায়। ভালো documentation আর onboarding এই খরচ কমায়।
  8. ৮ জন — পথ ২৮টি (+৭)। আর কেউ পুরো সিস্টেম একা বোঝেন না। সমাধান সাধারণত দলকে ৪–৫ জনের ছোট দলে ভাগ করা, প্রতিটির স্পষ্ট দায়িত্ব আর অংশগুলোর মাঝে স্পষ্ট interface. মজার ব্যাপার, ৮ জনকে ৪ + ৪ দুই দলে ভাগ করে দুই দলের প্রধানের মধ্যে একটি সংযোগ রাখলে পথ ২৮ থেকে নেমে ১৩.

শেষ ক্যাপশনের হিসাবটি বড় দলে কেমন দাঁড়ায়? নিচের প্রোগ্রাম দুটি মডেল তুলনা করে: সবাই সবার সাথে, আর ৭ জনের বেশি নয় এমন ছোট দল — প্রতিটি দলের ভেতরে সবাই সবার সাথে, আর দলগুলোর প্রধানেরা (team lead) একে অপরের সাথে একটি করে সংযোগে। এটি একটি সরল মডেল: বাস্তবে দলের বাইরেও কিছু কথা হয়, আর প্রধানদের ওপর চাপ বাড়ে।

// Communication paths in a team: everyone-with-everyone vs small teams + leads.
const paths = (n) => n * (n - 1) / 2;          // every pair of people = one path

function splitTeams(n, maxSize) {              // fewest teams of size <= maxSize, sizes as equal as possible
  const k = Math.ceil(n / maxSize);
  const sizes = [];
  for (let i = 0; i < k; i++) sizes.push(Math.floor(n / k) + (i < n % k ? 1 : 0));
  return sizes;
}
function teamPaths(n, maxSize) {
  const sizes = splitTeams(n, maxSize);
  const inside = sizes.reduce((s, x) => s + paths(x), 0);  // paths inside each team
  const leads = paths(sizes.length);                       // one link between each pair of team leads
  return { sizes, inside, leads, total: inside + leads };
}

console.log(" n  all-pairs  teams(max 7)        inside  leads  total");
for (const n of [2, 3, 5, 7, 8, 10, 15, 20, 30, 50]) {
  const t = teamPaths(n, 7);
  console.log(String(n).padStart(2) + String(paths(n)).padStart(11) + "  " +
    t.sizes.join("+").padEnd(18) + String(t.inside).padStart(7) +
    String(t.leads).padStart(7) + String(t.total).padStart(7));
}
const a = paths(50), b = teamPaths(50, 7).total;
console.log("50 people: " + a + " -> " + b + " paths (" + (100 * b / a).toFixed(1) + "% of all-pairs)");
console.log("adding the 11th person to 10 adds " + (paths(11) - paths(10)) + " new paths");

আউটপুট:

 n  all-pairs  teams(max 7)        inside  leads  total
 2          1  2                       1      0      1
 3          3  3                       3      0      3
 5         10  5                      10      0     10
 7         21  7                      21      0     21
 8         28  4+4                    12      1     13
10         45  5+5                    20      1     21
15        105  5+5+5                  30      3     33
20        190  7+7+6                  57      3     60
30        435  6+6+6+6+6              75     10     85
50       1225  7+7+6+6+6+6+6+6       132     28    160
50 people: 1225 -> 160 paths (13.1% of all-pairs)
adding the 11th person to 10 adds 10 new paths

৭ জন পর্যন্ত একটিই দল, তাই দুই কলাম সমান। ৮ জনে দুটি দল (৪ + ৪): ভেতরে ৬ + ৬ = ১২, প্রধানদের মধ্যে ১, মোট ১৩ — ২৮-এর অর্ধেকের কম। ৫০ জনে সবাই-সবার-সাথে ১,২২৫টি পথ; ৮টি ছোট দলে ভাগ করলে ভেতরে ১৩২ আর প্রধানদের মধ্যে ৮×৭/২ = ২৮, মোট ১৬০ — মাত্র ১৩.১%. শেষ লাইনটি দেখায় কেন দেরিতে লোক যোগ করা কঠিন: ১০ জনের দলে ১১তম মানুষ একাই ১০টি নতুন পথ আনেন, আর প্রথম কয়েক সপ্তাহ তিনি কাজ দেওয়ার চেয়ে বেশি নেন — পুরোনোদের সময় নিয়ে শেখেন। ছোট দল আর স্পষ্ট interface-এর পক্ষে যুক্তি এখানেই; একই কারণে বড় সিস্টেমকে অংশে ভাগ করার নকশা (পর্ব ২৫, ৩৮) আসলে দলকে ভাগ করার নকশাও।

Brooks ১৯৬০-এর দশকে IBM-এ OS/360 project পরিচালনার অভিজ্ঞতা থেকে লেখেন The Mythical Man-Month (১৯৭৫)। সেখানে বিখ্যাত পর্যবেক্ষণ — Brooks's law: “দেরিতে চলা software project-এ নতুন লোক যোগ করলে project আরও দেরি হয়।” কারণ তিনটি: নতুনদের শেখাতে পুরোনোদের সময় যায়, কাজ ভাগ করাতেও কাজ লাগে, আর যোগাযোগের পথ বাড়ে। Brooks নিজেই সূত্রটি দেওয়ার সময় একে “চরম অতিসরলীকরণ” বলেছিলেন — শুরুতে বা ভালোভাবে ভাগ করা যায় এমন কাজে লোক বাড়ালে লাভ হতে পারে। বিস্তারিত পর্ব ০২-এ।

৭ · দলের ভূমিকা আর Git কোথায় বসে

বিয়েবাড়ির আয়োজনে বাবুর্চি, ডেকোরেটর, হিসাবরক্ষক, অতিথি আপ্যায়নকারী — প্রত্যেকের কাজ আলাদা, কিন্তু একটি তালিকা আর একজন সমন্বয়কারী ছাড়া সব গুলিয়ে যায়। Software দলেও কয়েকটি সাধারণ ভূমিকা থাকে। নাম আর ভাগ প্রতিষ্ঠানভেদে অনেক আলাদা; ছোট দলে একজন মানুষ একাধিক ভূমিকা পালন করেন।

ভূমিকামূল প্রশ্নপ্রতিদিনের কাজ
Product owner / managerকী বানাব, কোনটি আগে?ব্যবহারকারীর চাহিদা বোঝা, কাজের তালিকা সাজানো, acceptance criteria ঠিক করা
Designer (UX/UI)ব্যবহারকারী কীভাবে কাজটি করবেন?screen-এর নকশা, prototype, ব্যবহারকারীর সাথে পরীক্ষা
Developer / software engineerকীভাবে বানাব, যাতে টেকে?নকশা, কোড, unit test, code review
Tester / QAকোথায় ভাঙতে পারে?test পরিকল্পনা, স্বয়ংক্রিয় ও হাতে test, মানের মাপ
DevOps / SREনিরাপদে চালু হবে, চালু থাকবে তো?CI/CD pipeline, server, monitoring, incident সামলানো
Tech leadপ্রযুক্তিগত দিকটা ঠিক পথে তো?বড় নকশার সিদ্ধান্ত, review-এর মান, দলকে প্রযুক্তিগত দিকনির্দেশ

এতগুলো মানুষের কাজ এক জায়গায় মেলে কোথায়? উত্তর: version control-এ — আজকের দিনে প্রায় সব জায়গায় Git. Git প্রতিটি পরিবর্তনের ইতিহাস রাখে (কে, কখন, কেন), প্রত্যেককে আলাদা branch-এ নিরাপদে কাজ করতে দেয়, আর পরে সবার কাজ মেলায়। এর ওপর দাঁড়িয়ে থাকে code review, স্বয়ংক্রিয় test আর release. মুদি দোকানের হিসাবের খাতার মতো — প্রতিটি লেনদেন তারিখ আর নামসহ লেখা, তাই মাস শেষে হিসাব না মিললে খুঁজে বের করা যায় কোন দিনের কোন লেখায় গোলমাল।

নিচের ডায়াগ্রামে একটি পরিবর্তনের অনুরোধ দলের ভেতর দিয়ে কীভাবে যায়, তা দেখুন। উদাহরণ: ফলাফল পোর্টালে কোনো শিক্ষার্থীর একটিও নম্বর না থাকলে গড় হিসাবের function crash করছে।

  1. Issue#42অনুরোধ লেখা
  2. Branchfix/42আলাদা জায়গা
  3. Commit46acbc9পরিবর্তন সংরক্ষণ
  4. ReviewPRঅন্যের চোখ
  5. CI testpassস্বয়ংক্রিয় যাচাই
  6. Releasev2.4.1ব্যবহারকারীর হাতে
এই ধাপে
Issue-এর অবস্থা
main branch-এ
কে কাজ করছেন
কোর্সে কোথায়
  1. ধাপ ১ — issue. QA একটি issue tracker-এ #৪২ নম্বর issue খোলেন: কী করলে সমস্যা হয়, কী হওয়ার কথা ছিল, কী হলো। Product owner অগ্রাধিকার ঠিক করেন — ফল প্রকাশের সপ্তাহ, তাই জরুরি। মুখে বলা অভিযোগ হারিয়ে যায়; নম্বরওয়ালা issue হারায় না।
  2. ধাপ ২ — branch. Developer fix/42-empty-marks নামে একটি নতুন branch খোলেন। main branch-এর কোড এতে একটুও বদলায় না — অন্যরা নিশ্চিন্তে নিজেদের কাজ চালিয়ে যান।
  3. ধাপ ৩ — commit. কোড ঠিক করে একটি commit করা হলো, বার্তায় issue নম্বরসহ: fix: handle an empty marks list (#42). এখন ইতিহাসে চিরকাল লেখা থাকবে কোন পরিবর্তন কোন সমস্যার জন্য। main এখনো পুরোনো d34ac42-তেই আছে।
  4. ধাপ ৪ — review. Developer একটি pull request খোলেন। Reviewer প্রশ্ন করেন: “নম্বর না থাকলে ০ দেখানো কি ঠিক, নাকি ‘ফল এখনো আসেনি’ লেখা উচিত?” প্রশ্নটি product owner-এর কাছে যায় — ভালো review শুধু কোড নয়, requirement-এর ফাঁকও ধরে।
  5. ধাপ ৫ — CI test. Pull request খোলার সাথে সাথে continuous integration server সব test চালায়, এই নতুন ক্ষেত্রের test-সহ। সব সবুজ হলে তবেই merge-এর অনুমতি — এই নিয়ম অনেক দলে platform-এর সেটিং দিয়ে বাধ্যতামূলক করা থাকে।
  6. ধাপ ৬ — release. পরিবর্তন main-এ merge হলো, issue #৪২ বন্ধ হলো, আর ছোট সংশোধন হিসেবে v2.4.1 নামে release হলো। পুরো পথটি লেখা আছে: issue → branch → commit → review → test → release. ছয় মাস পরে কেউ জানতে চাইলে “এই লাইন কেন?”, Git আর issue tracker উত্তর দেবে।

ধাপ ২ আর ৩-এর Git কমান্ডগুলো কেমন দেখায়? নিচের transcript এই মেশিনে Git ২.৫৩-এ চালিয়ে পাওয়া (লেখকের নাম ও সময় নির্দিষ্ট রাখা হয়েছে, তাই commit-এর hash একই আসে)। এখন শুধু চোখ বুলিয়ে নিন — প্রতিটি কমান্ড মডিউল ২-এ ধাপে ধাপে শিখবেন।

$ git switch -c fix/42-empty-marks
Switched to a new branch 'fix/42-empty-marks'
$ git commit -am "fix: handle an empty marks list (#42)"
[fix/42-empty-marks 46acbc9] fix: handle an empty marks list (#42)
 1 file changed, 2 insertions(+)
$ git log --oneline --decorate --all
46acbc9 (HEAD -> fix/42-empty-marks) fix: handle an empty marks list (#42)
d34ac42 (main) feat: add average marks

শেষ দুই লাইন পড়ুন: নতুন commit 46acbc9 আছে শুধু fix/42-empty-marks branch-এ (HEAD মানে আপনি এখন এখানে), আর main এখনো আগের d34ac42-তে। ঠিক স্টেপারের ধাপ ৩-এর অবস্থা। (git switch এসেছে Git ২.২৩-এ; পুরোনো টিউটোরিয়ালে একই কাজ git checkout -b দিয়ে দেখবেন।) Version control কেন আর কীভাবে — শুরু মডিউল ২-এর পর্ব ০৭ থেকে; দলের কাজের ধারা, pull request আর branching strategy মডিউল ৩-এ (পর্ব ১৪–১৯)।

৮ · Software engineering-এর জ্ঞানের মানচিত্র — SWEBOK আর এই কোর্স

Software engineering-এ কী কী জানতে হয়, তার একটি স্বীকৃত তালিকা আছে: IEEE Computer Society-র SWEBOK (Guide to the Software Engineering Body of Knowledge). এর সংস্করণ ৪ প্রকাশিত হয় ২০২৪ সালে। আমাদের জানামতে এতে ১৮টি knowledge area আছে — requirements, architecture, design, construction, testing, operations, maintenance, configuration management, engineering management, process, models and methods, quality, security, professional practice, economics আর তিনটি foundation (computing, mathematical, engineering). আগের সংস্করণের (২০১৪) তুলনায় architecture, operations আর security আলাদা ক্ষেত্র হিসেবে এসেছে বলে জানা যায়; হুবহু তালিকার জন্য SWEBOK-এর সরকারি নথিই দেখুন।

এই কোর্স SWEBOK-এর বেশিরভাগ ক্ষেত্র ছোঁয়, আর configuration management-এর কেন্দ্রে থাকা Git-কে খুব গভীরে নিয়ে যায়। ৭০টি পর্ব ১১টি মডিউলে সাজানো:

কোর্সের মানচিত্র — ১১টি মডিউল, ৭০টি পর্ব

মডিউলবিষয়পর্বযা পাবেন
১Software engineering-এর ভিত্তি০১–০৬ইতিহাস, software quality, process model, Agile-Scrum, Kanban-lean
২Git-এর মৌলিক০৭–১৩প্রথম repository, history, .gitignore, ভুল শোধরানো, branch, merge আর conflict
৩Git দিয়ে দলগত কাজ১৪–১৯remote, rebase, pull request, branching strategy, SemVer, monorepo
৪Requirement engineering২০–২৪elicitation, SRS, user story, modeling, traceability আর scope creep
৫Design-এর নীতি আর UML২৫–৩১coupling-cohesion, DRY-KISS-YAGNI, SOLID, UML class ও behaviour diagram, contract
৬Design pattern৩২–৩৭Gang of Four-এর creational, structural, behavioral pattern, dependency injection
৭Architecture, clean code আর maintenance৩৮–৪৪architecture style, MVC-MVVM, clean architecture, refactoring, technical debt, code review
৮Testing আর code quality৪৫–৫১unit test, test design, TDD-BDD, test double, coverage-complexity, test pyramid
৯উন্নত Git আর automation৫২–৫৮Git-এর ভেতরের গঠন, উদ্ধার, bisect, hook, নিরাপত্তা, continuous integration
১০Delivery, project management আর পেশাদারি৫৯–৬৫DevOps ও DORA, estimation ও COCOMO II, CPM-PERT, risk, open source, নৈতিকতা, ক্যাপস্টোন
১১পরীক্ষা ও ইন্টারভিউ প্রস্তুতি৬৬–৭০numerical, MCQ, লিখিত-ভাইভা, Git আর SE ইন্টারভিউ

কোর্সটি কাদের জন্য

🌱 নতুন শিক্ষার্থী

কিছুটা কোড লিখেছেন, এবার পেশাদারের মতো কাজ করতে চান, আর Git-কে ভয় না পেয়ে ব্যবহার করতে চান।

🎓 CSE/EEE/ICT শিক্ষার্থী

Software Engineering, Project Management, OOAD বা Software Testing কোর্স পড়ছেন, numerical আর তত্ত্ব দুটোই চান।

💼 চাকরিপ্রার্থী

Developer ইন্টারভিউ (Git, SOLID, pattern, testing, আচরণগত প্রশ্ন) বা software engineering অংশসহ লিখিত পরীক্ষার প্রস্তুতি নিচ্ছেন।

🛠️ কর্মরত developer

পরিষ্কার কোড, ভালো দলগত কাজ আর নিরাপদ Git চর্চা চান; সাথে Git-এর ভেতরের গঠন বুঝতে চান।

কোর্স শেষে আপনি যা পারবেন

  • একটি অস্পষ্ট চাহিদা থেকে মাপা যায় এমন requirement আর user story লিখতে
  • coupling, cohesion, SOLID আর design pattern দিয়ে নকশা যাচাই ও সমালোচনা করতে, আর সঠিক নিয়মে UML আঁকতে
  • অর্থবহ test লিখতে, coverage আর complexity হিসাব করতে
  • Git দিয়ে branch, merge, rebase, ভুল শোধরানো আর হারানো commit উদ্ধার করতে — কোন কমান্ড কী বদলায় জেনে
  • COCOMO II, function point, CPM-PERT-এর মতো numerical সমাধান করতে, আর একটি পুরো project requirement থেকে release পর্যন্ত নিয়ে যেতে (পর্ব ৬৫)

পেশা আর পরীক্ষা নিয়ে: বাংলাদেশে software-এর কাজ ছড়িয়ে আছে software প্রতিষ্ঠান, বিদেশি ক্লায়েন্টের জন্য কাজ করা দল, ব্যাংক-টেলিকম-সরকারি প্রতিষ্ঠানের IT বিভাগ আর freelancing-এ। পদের নাম, ইন্টারভিউর ধরন আর লিখিত পরীক্ষার সিলেবাস প্রতিষ্ঠানভেদে অনেক আলাদা; কোথাও SDLC, testing বা Git নিয়ে সরাসরি প্রশ্ন আসে, কোথাও শুধু coding. তাই নির্দিষ্ট পরীক্ষার জন্য সেই প্রতিষ্ঠানের সর্বশেষ বিজ্ঞপ্তি আর সিলেবাস দেখুন; এই কোর্সের মডিউল ১১ ধারণাভিত্তিক সাধারণ প্রস্তুতি দেয় — বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষা, সবার জন্য।

আরও গভীরে: SWEBOK V4.0 (IEEE Computer Society, ২০২৪) বিনা মূল্যে পড়া যায় এবং প্রতিটি knowledge area-র শেষে মূল বই ও মানের তালিকা দেয়। Software engineering-এর শব্দের আনুষ্ঠানিক অর্থের জন্য ISO/IEC/IEEE 24765 (systems and software engineering vocabulary) দেখা হয়, আর lifecycle-এর প্রক্রিয়াগুলোর আন্তর্জাতিক মান ISO/IEC/IEEE 12207. ক্লাসিক পাঠ্য হিসেবে Brooks-এর The Mythical Man-Month (১৯৭৫; ২০তম বার্ষিকী সংস্করণ ১৯৯৫, যাতে “No Silver Bullet”-ও আছে) আর Winters ও সহযোগীদের Software Engineering at Google (২০২০) পাশাপাশি পড়লে ৪৫ বছরের ব্যবধানে কোন সমস্যা বদলায়নি, তা চোখে পড়ে।

পরীক্ষা ও ইন্টারভিউতে:

  • Software engineering-এর IEEE সংজ্ঞা দিন। — software-এর development, operation ও maintenance-এ systematic, disciplined, quantifiable পদ্ধতির প্রয়োগ।
  • Programming আর software engineering-এর পার্থক্য? — software engineering সময়, মানুষ আর বদলকে হিসাবে আনে; programming তার একটি অংশ।
  • Brooks-এর essential difficulty কী কী? — complexity, conformity, changeability, invisibility.
  • ১২ জনের দলে communication path কতটি? — ১২ × ১১ / ২ = ৬৬টি।
  • Brooks's law কী? — দেরিতে চলা project-এ লোক বাড়ালে আরও দেরি হয়, কারণ শেখানো, কাজ ভাগ করা আর যোগাযোগের খরচ।

৯ · AI-এর যুগে software engineering

AI এখন কয়েক সেকেন্ডে কোড, test, commit message, এমনকি UML লিখে দেয়। তাহলে কি software engineering-এর দরকার কমল? উল্টো — কোড লেখা যত সস্তা হচ্ছে, কোন কোড রাখব, কোনটি বিশ্বাস করব, কীভাবে বছরের পর বছর বদলাব — এই সিদ্ধান্তগুলোর গুরুত্ব তত বাড়ছে। Brooks-এর ভাষায়, AI বিশেষভাবে accidental জটিলতা কমায়; requirement-এর অস্পষ্টতা, conformity আর বদলের চাপ — essential অংশ — আপনার দায়িত্বেই থাকে।

AI লেখে দ্রুত, আপনি যাচাই করেন নিশ্চিতভাবে।
যে কোড আপনি ব্যাখ্যা করতে পারেন না, তা আপনার দলে merge হওয়া উচিত নয়।

Software engineering-এ AI সাধারণত যেসব ভুল করে

AI-এর ভুলঝুঁকিকীভাবে যাচাই করবেন
git reset --hard বা git push --force সতর্কতা ছাড়াই বলে দেয়নিজের বা দলের কাজ মুছে যেতে পারেআগে একটি throwaway clone-এ চালান; git help reset পড়ুন
অস্তিত্বহীন command flag বা option বানিয়ে ফেলেকমান্ড ব্যর্থ, বা আরও খারাপ — অন্য কিছু করেঅফিশিয়াল documentation আর git help <command>
এমন test লেখে যা কিছুই যাচাই করে না, বা implementation-এর হুবহু নকলসবুজ test, অথচ bug রয়ে যায়কোডে ইচ্ছা করে ভুল ঢুকিয়ে দেখুন test ব্যর্থ হয় কি না (mutation testing, পর্ব ৫০)
ছোট সমস্যায় অকারণে বড় design pattern চাপায়অপ্রয়োজনীয় জটিলতা, maintenance-এর খরচপ্রশ্ন করুন: সবচেয়ে সরল সমাধান কী? (পর্ব ২৬, ৩২)
দেখতে বিশ্বাসযোগ্য কিন্তু ভুল UML বা ভুল standard/version-এর উল্লেখভুল ধারণা পরীক্ষা বা নথিতে ঢুকে যায়মূল standard বা বই মিলিয়ে দেখুন
অন্য project থেকে license-এর শর্তসহ কোড প্রায় হুবহু দেয়আইনি ঝুঁকিউৎস আর license যাচাই (পর্ব ৬৩)
Prompt-এ আপনি নিজেই password, API key বা গ্রাহকের ডেটা পেস্ট করেনগোপন তথ্য বাইরে চলে যায়Prompt-এর আগে secret সরান; প্রতিষ্ঠানের নীতি মানুন (পর্ব ৫৭)

AI-কে কোড লিখতে না বলে বরং নকশার সমালোচক হিসেবে ব্যবহার করুন — আর তার উত্তর যাচাইযোগ্য রাখতে বলুন:

আমি একটি বিশ্ববিদ্যালয়ের ফলাফল পোর্টালে "ফলাফল PDF ডাউনলোড" feature যোগ করছি (কাল্পনিক project). নিচে আমার requirement আর ছোট design note দিলাম। [এখানে requirement আর design note পেস্ট করুন — কোনো password, key বা আসল শিক্ষার্থীর তথ্য নয়] ১. requirement-এ কোন কোন অস্পষ্টতা বা বাদ পড়া ক্ষেত্র আছে, তালিকা দাও। ২. design-এ নিরাপত্তা আর maintenance-এর ঝুঁকি কোথায়? ৩. কোন ৫টি test case অবশ্যই লেখা উচিত, প্রত্যেকটির প্রত্যাশিত ফলসহ বলো। ৪. যেখানে তুমি নিশ্চিত নও, সেখানে স্পষ্ট করে "নিশ্চিত নই" লেখো; কোনো standard বা টুলের নাম বললে version আর উৎস দাও। ৫. কোনো Git কমান্ড প্রস্তাব করলে সেটি কী মুছে ফেলতে পারে, আগে সেটা বলো।

AI-এর পরামর্শ হাতে পেলে — যাচাইয়ের চেকলিস্ট

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

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

প্র ০১“Software engineering হলো সময়ের সাথে যোগ করা programming” — সময় কেন এত বড় ব্যাপার? একটি কোড আজ ঠিক চললে সমস্যা কোথায়?

Software Engineering at Google (২০২০) বইয়ের লেখকেরা একটি প্রশ্ন দিয়ে শুরু করেন: আপনার কোডের প্রত্যাশিত আয়ু কত? কয়েক মিনিট চলে মুছে ফেলা একটি স্ক্রিপ্ট আর কয়েক দশক টিকে থাকা একটি সিস্টেমের মধ্যে পার্থক্য শুধু আকারে নয়, ধরনে। যে কোড কয়েক ঘণ্টা বাঁচে, তার জন্য “এখন চলছে” যথেষ্ট। যে কোড দশ বছর বাঁচবে, তাকে টিকে থাকতে হবে নতুন OS, নতুন library version, নতুন নিরাপত্তা-ত্রুটি, নতুন আইন আর নতুন মানুষের হাতে।

বইটি এখানে একটি শব্দ ব্যবহার করে — sustainable: কোড টেকসই, যদি জীবনকাল জুড়ে যেকোনো প্রয়োজনীয় পরিবর্তন আপনি নিরাপদে করতে পারেন। পরিবর্তন করতে হবে কি না সেটি আসল প্রশ্ন নয়, প্রয়োজন হলে করতে পারবেন কি না সেটিই প্রশ্ন। একটি বাস্তব উদাহরণ ভাবুন: একটি library-তে নিরাপত্তা-ত্রুটি ধরা পড়ল, আজই নতুন version বসাতে হবে। যদি আপনার project-এ স্বয়ংক্রিয় test না থাকে, কেউ নিশ্চিত হয়ে বলতে পারবেন না নতুন version কিছু ভাঙল কি না। ফলে দল ভয়ে আপগ্রেড পিছিয়ে দেয় — আর পুরোনো, অরক্ষিত version নিয়ে মাসের পর মাস চলে।

একই বইয়ে উদ্ধৃত একটি পর্যবেক্ষণ, যা এর এক সম্পাদকের নামে Hyrum's law নামে পরিচিত: কোনো API-র ব্যবহারকারী যথেষ্ট বেশি হলে, আপনি documentation-এ যা-ই প্রতিশ্রুতি দিন, তার প্রতিটি দেখা যায় এমন আচরণের ওপর কেউ না কেউ নির্ভর করবেন। যেমন, ফলাফলের তালিকা আপনি কখনো সাজানো অবস্থায় দেওয়ার কথা বলেননি, কিন্তু কাকতালীয়ভাবে সাজানো আসছিল; পাঁচ বছর পরে আপনি কোড বদলালেন, আর অন্য একটি দলের রিপোর্ট ভেঙে গেল। সময় যত গড়ায়, এমন লুকানো নির্ভরতা তত জমে।

তাই সময়কে হিসাবে আনলে প্রশ্ন বদলে যায়: “কোড কি কাজ করে?” থেকে “কোড কি বদলানো যায়, আর বদলালে আমরা কি জানব কী ভাঙল?” Test, version control, code review, পরিষ্কার interface আর documentation — এগুলোর প্রায় সব কিছুর আসল মূল্য দেখা যায় সময়ের মাত্রায়।

মূল উপলব্ধি: কোড লেখার সময় তার আয়ু অনুমান করুন। স্বল্পায়ু কোডে কম প্রক্রিয়াই ঠিক; দীর্ঘায়ু কোডে বদলের ক্ষমতাই সবচেয়ে বড় গুণ।

প্র ০২Software engineering কি সত্যিই সিভিল বা ইলেকট্রিক্যালের মতো “engineering”? নাকি নামটি শুধু একটি আকাঙ্ক্ষা?

এই বিতর্ক নামটির জন্ম থেকেই। ১৯৬৮ সালের NATO সম্মেলনের প্রতিবেদনেই বলা হয়েছিল, নামটি বেছে নেওয়া হয়েছে কিছুটা উসকানির জন্য — software বানানোকে প্রতিষ্ঠিত প্রকৌশলের তাত্ত্বিক ভিত আর ব্যবহারিক শৃঙ্খলার ওপর দাঁড় করানোর প্রয়োজন বোঝাতে। অর্থাৎ শুরুতে এটি ছিল অনেকটা লক্ষ্য, বাস্তবতা নয়।

“না”-এর পক্ষে যুক্তি: সিভিল প্রকৌশলে উপাদানের ধর্ম (ইস্পাতের শক্তি, কংক্রিটের ভার) পদার্থবিদ্যা দিয়ে নির্দিষ্ট, আর ভার হিসাবের সূত্র শতাব্দী ধরে যাচাই করা। Software-এ উপাদান হলো মানুষের চিন্তা; একই সমস্যার হাজার সমাধান, আর কোনটি “সঠিক” তা প্রায়ই মাপা কঠিন। অনেক দেশে সেতুর নকশায় সই করতে লাইসেন্সধারী প্রকৌশলী লাগে; software-এ এমন বাধ্যবাধকতা সাধারণত নেই, অন্তত বেশিরভাগ ক্ষেত্রে। Estimation-এ বড় ভুল আজও সাধারণ ঘটনা।

“হ্যাঁ”-এর পক্ষে যুক্তি: engineering-এর মূল কথা হলো সীমিত সম্পদে, ঝুঁকি মেপে, প্রমাণিত পদ্ধতিতে নির্ভরযোগ্য কিছু বানানো আর trade-off নিয়ে জবাবদিহি করা। বিমান, চিকিৎসাযন্ত্র, রেলের signalling — এসব নিরাপত্তা-সংকটপূর্ণ ক্ষেত্রে software আজ কঠোর মান, আনুষ্ঠানিক যাচাই আর স্বাধীন audit-এর মধ্য দিয়ে যায়। Therac-25 (১৯৮০-এর দশক) বা Ariane 5 Flight 501 (১৯৯৬)-এর মতো দুর্ঘটনার বিশ্লেষণ থেকে যে শিক্ষা এসেছে, সেটিই এই ক্ষেত্রকে প্রকৌশলী শৃঙ্খলার দিকে ঠেলেছে। SWEBOK আর ACM/IEEE-এর Software Engineering Code of Ethics (১৯৯৯) পেশাটির জ্ঞান আর দায়িত্বের একটি কাঠামোও দিয়েছে।

বাস্তবে উত্তরটি একটি পরিসর। একটি ব্যক্তিগত ব্লগের ওয়েবসাইট আর একটি পেসমেকারের firmware একই “engineering” নয়। ঝুঁকি যত বেশি, প্রক্রিয়া, যাচাই আর জবাবদিহি তত কঠোর হওয়া উচিত। ভালো software engineer এই মাত্রাজ্ঞানটিই রাখেন — সব জায়গায় সর্বোচ্চ আনুষ্ঠানিকতা নয়, ঝুঁকির সমানুপাতিক শৃঙ্খলা।

মূল উপলব্ধি: নামটি একসময় আকাঙ্ক্ষা ছিল, এখন অনেক ক্ষেত্রে বাস্তবতা; কতটা engineering লাগবে, তা ঠিক করে ব্যর্থতার দাম।

প্র ০৩Brooks ১৯৮৬ সালে বলেছিলেন কোনো “silver bullet” নেই। AI coding assistant কি শেষ পর্যন্ত সেই silver bullet?

Brooks-এর দাবিটি খুব নির্দিষ্ট ছিল: আগামী এক দশকে কোনো একক প্রযুক্তি বা পদ্ধতি একাই productivity, reliability বা simplicity-তে দশ গুণ উন্নতি আনবে না। যুক্তিটি ছিল essential আর accidental-এর ভাগ। High-level ভাষা, time-sharing, ভালো programming environment — এগুলো accidental জটিলতা অনেক কমিয়েছে। যদি বাকি কাজের বেশিরভাগই essential হয়, তাহলে accidental অংশ শূন্যে নামিয়েও দশ গুণ লাভ সম্ভব নয়।

AI-কে এই কাঠামোয় বসালে ছবিটি পরিষ্কার হয়। AI খুব ভালো করে boilerplate কোড, পরিচিত ধাঁচের function, test-এর খসড়া, documentation আর error-এর ব্যাখ্যা — এগুলো মূলত accidental কাজ। কিছু কাজে এটি নাটকীয়ভাবে সময় বাঁচায়, এ নিয়ে সন্দেহ কম। কিন্তু essential অংশ: ব্যবহারকারী আসলে কী চান, অধ্যাদেশের কোন ব্যতিক্রম আছে, কোন trade-off গ্রহণযোগ্য, দশজনের দলে কোন interface কার দায়িত্ব — এগুলো AI প্রায়ই জানে না, কারণ এই তথ্য আপনার প্রতিষ্ঠানের ভেতরে, মানুষের মাথায় থাকে।

আরও একটি সূক্ষ্ম দিক আছে। কোড লেখা সস্তা হলে কোডের পরিমাণ বাড়ে, আর maintenance-এর খরচ কোডের পরিমাণের সাথে বাড়ে। যে কোড কেউ পুরোপুরি বোঝেন না, তা পরে বদলানো আরও কঠিন। তাই AI দ্রুত লেখার সমস্যা অনেকটা মেটালেও “নিরাপদে বদলানো”-র সমস্যা — software engineering-এর মূল সমস্যা — নতুন রূপে ফিরে আসে: review-এর চাপ, test-এর মান, আর বোঝাপড়ার দায়।

AI ব্যবহারে productivity-র প্রকৃত লাভ কত, তা নিয়ে গবেষণা চলছে এবং ফল কাজের ধরন ও অভিজ্ঞতাভেদে আলাদা আসছে; তাই কোনো একক সংখ্যা বিশ্বাস করার আগে সাবধান থাকা ভালো। Brooks মূল প্রবন্ধেই বলেছিলেন, অনেক আশাজাগানো ছোট ছোট উদ্ভাবন ধারাবাহিকভাবে কাজে লাগালে সব মিলিয়ে বড় উন্নতি সম্ভব — একটি গুলিতে নয়।

মূল উপলব্ধি: AI accidental জটিলতার শক্তিশালী হাতিয়ার; essential জটিলতা — চাহিদা, নকশা, দায়িত্ব — এখনো মানুষের বিচারবুদ্ধির কাজ।

প্র ০৪“দেরিতে ধরা bug ১০০ গুণ দামি” — বহুল প্রচলিত এই কথাটি কতটা বিশ্বাসযোগ্য? তাহলে কি শুরুতে সব কিছু নিখুঁতভাবে ঠিক করাই সমাধান?

কথাটির উৎস হিসেবে সাধারণত ১৯৭০-৮০-র দশকের কিছু গবেষণা আর Barry Boehm-এর Software Engineering Economics (১৯৮১)-এর বক্ররেখা উদ্ধৃত হয়, যেখানে দেখানো হয়েছিল requirement-এ ধরা ভুলের চেয়ে চালু হওয়ার পরে ধরা ভুল ঠিক করতে বহুগুণ খরচ। পরের দশকগুলোতে বই, স্লাইড আর প্রশিক্ষণে সংখ্যাগুলো বারবার নকল হয়েছে, প্রায়ই মূল প্রেক্ষাপট ছাড়া।

সমালোচকেরা কয়েকটি প্রশ্ন তুলেছেন। মূল তথ্য এসেছিল বড়, waterfall-ধাঁচের, প্রায়ই সামরিক বা সরকারি project থেকে — যেখানে একটি পরিবর্তন মানে নথি, অনুমোদন আর পুনরায় প্রকাশের দীর্ঘ চক্র। Laurent Bossavit তাঁর The Leprechauns of Software Engineering (২০১২) বইয়ে দেখিয়েছেন, এই ধরনের কিছু বহুল উদ্ধৃত সংখ্যার উৎস খুঁজতে গেলে প্রমাণ অস্পষ্ট বা পরোক্ষ পাওয়া যায়। আবার “খরচ” মানে কী — শুধু কোড ঠিক করার ঘণ্টা, নাকি ব্যবহারকারীর ক্ষতিও — তাও সংজ্ঞাভেদে বদলায়।

অন্যদিকে, Kent Beck Extreme Programming Explained (১৯৯৯)-এ যুক্তি দেন যে ছোট release, স্বয়ংক্রিয় test, refactoring আর ঘনিষ্ঠ সহযোগিতা দিয়ে পরিবর্তনের খরচের বক্ররেখা অনেকটা চ্যাপ্টা করা যায়। অর্থাৎ বক্ররেখা প্রকৃতির নিয়ম নয়, প্রক্রিয়ার ফল।

তবে মূল অন্তর্দৃষ্টি টিকে থাকে: যে ভুলের ওপর অনেক কিছু দাঁড়িয়ে গেছে, তা সরাতে বেশি কাজ লাগে; আর production-এ পৌঁছানো ভুলে যোগ হয় এমন খরচ যা কোডে দেখা যায় না — ভুল ফলাফলে শিক্ষার্থীর ক্ষতি, ডেটা মেরামত, আস্থা হারানো। সমাধান কিন্তু “শুরুতে সব নিখুঁত” নয় — সেটি প্রায় অসম্ভব, কারণ ব্যবহারকারীরা প্রায়ই software হাতে পেয়েই বোঝেন আসলে কী চান। সমাধান হলো feedback loop ছোট করা: ভুলের জন্ম আর ধরা পড়ার মাঝের সময় কমানো।

মূল উপলব্ধি: নির্দিষ্ট গুণকের ওপর ভরসা করবেন না, নিজের দলের তথ্য মাপুন; কিন্তু দ্রুত feedback-এর নীতিটি প্রায় সব প্রেক্ষাপটেই কাজের।

প্র ০৫দলের কাঠামো আর software-এর নকশার মধ্যে কি কোনো সম্পর্ক আছে? ৫০ জনের একটি দল কীভাবে সাজানো উচিত?

১৯৬৮ সালে Melvin Conway একটি প্রবন্ধে পর্যবেক্ষণ দেন, যা পরে Conway's law নামে পরিচিত হয়: একটি প্রতিষ্ঠান যে সিস্টেমের নকশা করে, তা সেই প্রতিষ্ঠানের যোগাযোগ-কাঠামোর প্রতিচ্ছবি হয়ে দাঁড়ায়। একটি প্রচলিত রসিকতা আছে: চারটি দল মিলে একটি compiler বানালে সেটি চার-ধাপের (four-pass) compiler হয়। কারণ সহজ: দুটি অংশের মাঝের interface আসলে দুটি দলের মাঝের চুক্তি; যেখানে দুই দল কম কথা বলে, সেখানে অংশ দুটিও আলগাভাবে জোড়া থাকে।

এর সাথে Brooks-এর n(n−1)/2 মেলালে একটি নকশা-নীতি বেরিয়ে আসে। ৫০ জন সবাই সবার সাথে কথা বললে ১,২২৫টি পথ — কাজ নয়, যোগাযোগেই দিন যাবে। তাই বড় প্রতিষ্ঠানগুলো সাধারণত ছোট, প্রায় স্বাধীন দল বানায় — অনেক Agile নির্দেশিকায় মোটামুটি দশ জনের কম; Scrum Guide (২০২০) একটি Scrum Team-কে সাধারণত ১০ জন বা তার কম রাখার কথা বলে। প্রতিটি দল একটি স্পষ্ট অংশের মালিক, আর অংশগুলোর মাঝে স্পষ্ট, লিখিত interface (API).

অনেকে একে উল্টো দিক থেকেও ব্যবহার করেন, যাকে কখনো “inverse Conway maneuver” বলা হয়: আগে ঠিক করুন সিস্টেমটি কোন কোন অংশে ভাগ হওয়া উচিত, তারপর সেই অনুযায়ী দল সাজান। Microservices-এর আলোচনায় এই চিন্তা প্রায়ই আসে (System Design কোর্সের Microservices পর্ব দেখুন)। তবে বিপদও আছে: দল বেশি ভাগ করলে অংশগুলোর মাঝের সমন্বয়ের খরচ বাড়ে, আর কোনো একটি পরিবর্তন যদি চারটি দলকে ছুঁয়ে যায়, তাহলে চারটি দলের সময়সূচি মেলাতে হয়।

৫০ জনের জন্য একটি যুক্তিসংগত শুরু: ব্যবসার ক্ষেত্র ধরে ৬–৮ জনের ৭–৮টি দল (ভর্তি, ফলাফল, ফি, পরিচয় ও লগইন …), প্রতিটির নিজের কোড, test আর deployment-এর দায়িত্ব; একটি ছোট platform দল যারা CI/CD আর অবকাঠামো দেয়; আর দলগুলোর tech lead-দের নিয়মিত সমন্বয়। এই পর্বের হিসাবেই দেখেছেন, এমন কাঠামোয় পথ ১,২২৫ থেকে প্রায় ১৬০-এ নামে।

মূল উপলব্ধি: Software-এর architecture আর দলের architecture আলাদা সিদ্ধান্ত নয়; একটি বদলালে অন্যটি বদলায়। ভালো নকশা যোগাযোগের পথ কমায়।

অনুশীলন

খাতা-কলম নিয়ে বসুন; প্রথম দুটিতে হিসাব, তৃতীয়টিতে কোডের ফল অনুমান, চতুর্থটিতে সমালোচনা।

  1. যোগাযোগের হিসাব (numerical): একটি কাল্পনিক অনলাইন বাজার অ্যাপের দলে ১২ জন। (ক) সবাই সবার সাথে কথা বললে communication path কতটি? (খ) দলটিকে ৪ জনের ৩টি দলে ভাগ করে প্রতিটির একজন প্রধান রাখা হলো, প্রধানেরা একে অপরের সাথে যুক্ত। এখন মোট পথ কতটি? (গ) মূল ১২ জনের দলে ১৩তম একজন যোগ দিলে কতটি নতুন পথ তৈরি হয়?

    (ক) n(n−1)/2 = ১২ × ১১ / ২ = ৬৬টি।

    (খ) প্রতিটি ৪ জনের দলের ভেতরে ৪ × ৩ / ২ = ৬টি, তিন দলে ৩ × ৬ = ১৮টি। তিনজন প্রধানের মধ্যে ৩ × ২ / ২ = ৩টি। মোট ১৮ + ৩ = ২১টি — আগের ৬৬-এর এক-তৃতীয়াংশেরও কম।

    (গ) নতুন মানুষ আগের ১২ জনের প্রত্যেকের সাথে যুক্ত হতে পারেন, তাই ১২টি নতুন পথ। মিলিয়ে দেখুন: ১৩ × ১২ / ২ = ৭৮, আর ৭৮ − ৬৬ = ১২. সাধারণ সূত্র: n জনের দলে একজন যোগ হলে নতুন পথ n টি।

  2. Maintenance-এর ভাগ হাতে হিসাব (numerical): ধরা যাক একটি software বানাতে ১০০ একক খরচ, আর এটি ১০ বছর চলে। প্রতি বছর maintenance-এ খরচ হয় ঠিক ১৫ একক (কোনো বৃদ্ধি নেই)। জীবনকালের মোট খরচের কত শতাংশ maintenance? এবার ধরা যাক software মাত্র ৪ বছর চলে — শতাংশ কত হয়? এই দুই উত্তর থেকে কী বোঝা যায়?

    ১০ বছরে maintenance = ১০ × ১৫ = ১৫০ একক; মোট = ১০০ + ১৫০ = ২৫০; ভাগ = ১৫০ / ২৫০ = ৬০%. (পর্বের lifetime_cost.js-এর টেবিলে “growth 0%” কলামে ১০ বছরে ঠিক 60.0% এসেছে — মিলে গেল।)

    ৪ বছরে maintenance = ৪ × ১৫ = ৬০; মোট = ১৬০; ভাগ = ৬০ / ১৬০ = ৩৭.৫%.

    শিক্ষা: “maintenance-এর ভাগ X%” কোনো প্রাকৃতিক ধ্রুবক নয় — software কত দিন বাঁচে, তার ওপর ভীষণভাবে নির্ভর করে। দীর্ঘজীবী সিস্টেমে maintenance স্বাভাবিকভাবেই বড় ভাগ নেয়; তাই যত দীর্ঘ আয়ু, বদলযোগ্য নকশায় বিনিয়োগ তত যুক্তিসংগত।

  3. আউটপুট অনুমান করুন (predict the output): চালানোর আগে খাতায় লিখুন নিচের JavaScript কোড ঠিক কী ছাপবে। তারপর পর্বের যেকোনো চালানো-যায় এমন কোড-ঘরে পেস্ট করে মিলিয়ে নিন।
    const p = (n) => n * (n - 1) / 2;
    console.log(p(6), p(9) - p(8));
    console.log([3, 3].reduce((s, x) => s + p(x), 0) + p(2));
    15 8
    7

    প্রথম লাইন: p(6) = ৬ × ৫ / ২ = ১৫. p(9) − p(8) = ৩৬ − ২৮ = ৮ — অর্থাৎ ৮ জনের দলে ৯ম জন ৮টি নতুন পথ আনেন। console.log একাধিক মান একটি space দিয়ে আলাদা করে ছাপে।

    দ্বিতীয় লাইন: ৩ জনের দুটি দল — ভেতরে p(3) + p(3) = ৩ + ৩ = ৬, আর দুই প্রধানের মধ্যে p(2) = ১; মোট ৭. একই ৬ জন এক দলে থাকলে ছিল ১৫ — ভাগ করায় পথ প্রায় অর্ধেক।

  4. পরিকল্পনার সমালোচনা (design / critique): একটি কাল্পনিক ফলাফল পোর্টালের project দুই মাস পিছিয়ে আছে, ফল প্রকাশ চার সপ্তাহ পরে। ব্যবস্থাপক প্রস্তাব দিলেন: “এই সপ্তাহে ৬ জন নতুন developer নেব, সবাই সরাসরি main branch-এ কাজ করবেন যাতে merge-এর ঝামেলা না থাকে, আর সময় বাঁচাতে testing বাদ দিয়ে শেষ দিনে একবারে production-এ দেব।” এই পরিকল্পনার অন্তত চারটি সমস্যা চিহ্নিত করুন এবং একটি বিকল্প প্রস্তাব দিন।
    • দেরিতে লোক বাড়ানো (Brooks's law): নতুন ৬ জনকে শেখাতে পুরোনোদের সময় যাবে; প্রথম কয়েক সপ্তাহ তাঁরা উৎপাদনের চেয়ে বেশি সময় নেবেন। ধরা যাক আগে দল ছিল ৪ জন: পথ ৬ থেকে লাফিয়ে ১০ জনে ৪৫.
    • সবাই সরাসরি main-এ: একে অপরের অসমাপ্ত কাজ main-কে বারবার ভাঙবে, কে কী ভেঙেছে খুঁজে পাওয়া কঠিন হবে। (Trunk-based development-এ সবাই main-এ ঘনঘন মেলান ঠিকই, কিন্তু ছোট পরিবর্তন, স্বয়ংক্রিয় test আর review-এর শর্তে — পর্ব ১৭।)
    • Testing বাদ: ভুল ধরা পড়বে production-এ, অর্থাৎ শিক্ষার্থীর ভুল ফলাফলে — সবচেয়ে দামি জায়গায়।
    • শেষ দিনে একবারে release: চার সপ্তাহের সব পরিবর্তন একসাথে গেলে কোনটি সমস্যা করল বোঝা কঠিন, আর আগের অবস্থায় ফেরার পরিকল্পনাও নেই।

    বিকল্প: scope কমান — ফল প্রকাশের জন্য অপরিহার্য feature-গুলো আলাদা করে বাকিগুলো পরের release-এ নিন; বর্তমান দলকে রেখে বড়জোর এক-দুজন অভিজ্ঞ মানুষকে ভালোভাবে আলাদা করা যায় এমন কাজে (যেমন test স্বয়ংক্রিয় করা) যোগ করুন; ছোট branch, review আর CI বজায় রাখুন; প্রতি সপ্তাহে ছোট release দিয়ে ঝুঁকি ভাগ করুন, আর rollback-এর পরিকল্পনা রাখুন।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি নতুন feature-এর জন্য software lifecycle-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. 📝 Requirement — কী আর কেন বানাতে হবে
  2. 📐 Design — অংশ, ডেটা আর interface-এর নকশা
  3. ⌨️ Construction — কোড, unit test আর review
  4. 🧪 Testing — পুরো সিস্টেম যাচাই
  5. 🚀 Deployment — production-এ চালু
  6. 🔧 Maintenance — ভুল সারানো, মানিয়ে নেওয়া, নতুন চাহিদা

১০ জনের একটি software দলে সবাই সবার সাথে কথা বলতে পারলে মোট কতটি communication path আছে?

  • ১০
  • ৯০
  • ৪৫
  • ১০০

Fred Brooks-এর “No Silver Bullet” (১৯৮৬) প্রবন্ধে software-এর essential difficulty হিসেবে কোনটি তালিকায় নেই?

  • Invisibility
  • ধীর compiler ও হার্ডওয়্যার
  • Conformity
  • Changeability

ISO/IEC/IEEE 24765-এ দেওয়া software engineering-এর সংজ্ঞার সারকথা কোনটি?

  • যত দ্রুত সম্ভব কোড লেখার কৌশল
  • শুধু নতুন software তৈরির প্রক্রিয়া
  • Programming language-এর ব্যাকরণ শেখা
  • Development, operation ও maintenance-এ systematic, disciplined, quantifiable পদ্ধতির প্রয়োগ

একটি software project নির্ধারিত সময়ের চেয়ে অনেক পিছিয়ে আছে। Brooks's law অনুযায়ী এখন হঠাৎ অনেক নতুন developer যোগ করলে সাধারণত কী হয়?

  • Project আরও দেরি হয়
  • Developer দ্বিগুণ হলে সময় অর্ধেক হয়
  • কোনো প্রভাব পড়ে না, সময় একই থাকে
  • শুধু code-এর গুণমান বাড়ে, সময়ে কিছু হয় না

Software-এর জীবনকালের খরচে maintenance-এর ভাগ নিয়ে কোন বক্তব্যটি সবচেয়ে সঠিক?

  • Maintenance সাধারণত মোট খরচের ১০%-এর কম
  • সব software-এ maintenance ঠিক ৭০%
  • প্রায়ই বড় ভাগ (উৎসভেদে মোটামুটি ৪০–৮০%), যার বড় অংশ নতুন চাহিদা ও মানিয়ে নেওয়া
  • Maintenance মানে শুধু bug সারানো

একটি দলে issue #৪২ ঠিক করার জন্য developer নতুন branch খুলে একটি commit করলেন, কিন্তু এখনো merge করেননি। এই অবস্থায় main branch সম্পর্কে কোনটি সত্য?

  • main-এ পরিবর্তনটি স্বয়ংক্রিয়ভাবে চলে গেছে
  • main আগের commit-এই আছে, অপরিবর্তিত
  • main branch মুছে গেছে
  • main-এ আর কেউ commit করতে পারবেন না

AI একটি সমস্যার সমাধানে বলল: “git reset --hard চালান।” পেশাদার পদ্ধতি কোনটি?

  • AI বলেছে, তাই সরাসরি নিজের আসল repository-তে চালানো
  • AI-কে জিজ্ঞেস করা “নিরাপদ তো?” — হ্যাঁ বললে চালানো
  • Git বাদ দিয়ে ফাইল হাতে কপি করে রাখা
  • git help reset পড়ে বোঝা কী মুছবে, তারপর একটি throwaway clone-এ আগে চালিয়ে দেখা

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Software engineering = সময়ের সাথে যোগ করা programming: কোড আজ চলছে কি না নয়, বছরের পর বছর নিরাপদে বদলানো যায় কি না।
  2. IEEE/ISO সংজ্ঞা: development, operation ও maintenance-এ systematic, disciplined, quantifiable পদ্ধতি।
  3. Brooks-এর চার মৌলিক কঠিনতা: complexity, conformity, changeability, invisibility — টুল accidental জটিলতা কমায়, essential নয়।
  4. Lifecycle একটি চক্র; দেরিতে ধরা ভুল সাধারণত বেশি rework আনে, আর জীবনকালের খরচের বড় ভাগ maintenance — সংখ্যা উৎসভেদে আলাদা, নিজের তথ্য মাপুন।
  5. যোগাযোগের পথ n(n−1)/2; ছোট দল, স্পষ্ট interface আর Git-কেন্দ্রিক কাজের ধারা (issue → branch → review → test → release) দলকে বড় হতে দেয়।

পরের পর্বে: ১৯৬০-এর দশকের software crisis, ১৯৬৮-র NATO সম্মেলন, OS/360-এর শিক্ষা আর বিখ্যাত ব্যর্থতাগুলো — software engineering কোন সমস্যার জবাবে জন্মেছিল, আর সেই সমস্যাগুলো আজ কোথায় দাঁড়িয়ে।

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান