2.0 পর্ব ২-এর ভূমিকা: সফটওয়্যার প্রোগ্রামিং
পর্ব ২ হলো এমন সফটওয়্যার লেখার দৈনন্দিন শিল্প নিয়ে, যা বহু মানুষ পড়তে, বদলাতে এবং দীর্ঘ জীবন ধরে বিশ্বাস করতে পারে। পর্ব ১ দলগুলো কীভাবে সংগঠিত হয় ও সিদ্ধান্ত নেয় তার ভিত্তি স্থাপন করেছে। এই পর্ব ফিরে আসে কোডের দিকে: আপনি যেসব রীতি অনুসরণ করেন, নকশা ও ইন্টারফেস যেভাবে গড়েন, কাজ কীভাবে পরীক্ষা ও পর্যালোচনা করেন, সোর্সের ইতিহাস কীভাবে পরিচালনা করেন, এবং কীভাবে জিনিস লিখে রাখেন। এই চর্চাগুলোই এমন কোডবেস, যা সরবরাহ দ্রুত করে, আর যে কোডবেস প্রতিটি পরিবর্তনের সঙ্গে লড়ে, তাদের আলাদা করে।
বড় দলে শিল্পনৈপুণ্য ব্যক্তিগত রুচির ব্যাপার নয়। এটাই সমন্বয়ের উপায়। শত শত বা হাজারো ইঞ্জিনিয়ার, ঠিকাদার ও উত্তরসূরি যখন একই সিস্টেম ছোঁয়, তখন ভাগ করা রীতি ও স্পষ্ট চুক্তিই সবাইকে নিরন্তর সংঘর্ষ ছাড়াই সমান্তরালে কাজ করতে দেয়। মনে রাখুন, কোড লেখার চেয়ে অনেক বেশি পড়া হয়, আর সেই পড়ার বড় অংশ ঘটে বছর পরে, এমন মানুষদের দ্বারা যাঁদের সঙ্গে আপনার কখনো দেখা হবে না।
এন্টারপ্রাইজ ও সরকারি পরিবেশে ঝুঁকি আরও বাড়ে। সিস্টেম নিয়মিত তার রচয়িতাদের এক দশক বা তার বেশি ছাড়িয়ে টেকে। নিয়ন্ত্রণ ও নিরীক্ষা নিয়ন্ত্রণের নথিবদ্ধ প্রমাণ দাবি করে। জ্ঞানকে কর্মী বদল ও চুক্তির সীমানা পেরিয়ে স্থানান্তরিত হতে হয়। তাই এখানকার অধ্যায়গুলো গুণমানকে বীরত্ব হিসেবে নয়, পুরো দল কীভাবে কাজ করে তার একটি প্রকৌশলে-গড়া, বহুলাংশে স্বয়ংক্রিয় বৈশিষ্ট্য হিসেবে দেখে।
এই পর্বের অধ্যায়সমূহ
2.1 কোডিং মান ও শৈলী: নামকরণ, ফরম্যাটিং ও বাগধারার ভাগ করা, স্বয়ংক্রিয়ভাবে-প্রয়োগকৃত রীতি, যা বহু রচয়িতাকে এমনভাবে লিখতে দেয় যেন একজন সতর্ক রচয়িতা লিখেছেন, যাতে পর্যালোচকেরা শৈলীর বদলে নকশায় মনোযোগ দিতে পারেন।
2.2 সফটওয়্যার নকশার নীতি: SOLID (পাঁচটি অবজেক্ট-ওরিয়েন্টেড নকশা নীতি), DRY (নিজেকে পুনরাবৃত্তি করবেন না), সংযুক্তি ও সংসক্তি এবং ডোমেইন-ড্রিভেন ডিজাইন (ব্যবসায়িক ডোমেইনের ভাষায় সফটওয়্যার মডেল করা)-এর মতো হিউরিস্টিক, যেগুলোকে মান্য করার আইন নয়, প্রযোজ্যতার ক্ষেত্র ও পরিচিত ব্যর্থতার ধরনসহ হাতিয়ার হিসেবে দেখা হয়।
2.3 API ও ইন্টারফেস নকশা: যে চুক্তির মাধ্যমে সিস্টেম ও দল মিলিত হয় তা নকশা করা, যাতে স্বাধীন দলগুলো গ্রাহকদের না ভেঙে বা লকস্টেপ ডিপ্লয়মেন্ট বাধ্য না করে তাদের অভ্যন্তর বদলাতে পারে।
2.4 টেস্টিং কৌশল: কী পরীক্ষা করবেন, কোন স্তরে, এবং কত আস্থায়, সে সম্পর্কে সুচিন্তিত পছন্দ, একটি দ্রুত ও বিশ্বাসযোগ্য নিরাপত্তা-জাল গড়ে, যা একটি বড় প্রতিষ্ঠানকে ঘন ঘন ও নিরাপদে ডিপ্লয় করতে দেয়।
2.5 কোড রিভিউ ও সহযোগিতা: ত্রুটি ধরতে, জ্ঞান ছড়াতে, মান প্রয়োগ করতে এবং বিধি-মান্যতার নিয়ন্ত্রণ পূরণ করতে মার্জের আগে পরিবর্তন পরীক্ষা, রিভিউকে আনুষ্ঠানিকতার বদলে দ্রুত ও গঠনমূলক রেখে।
2.6 ভার্সন কন্ট্রোল ও সোর্স ব্যবস্থাপনা: প্রতিটি পরিবর্তনের নথি-ব্যবস্থা, এবং সেই ব্রাঞ্চিং, রিপজিটরি ও কমিটের শৃঙ্খলা, যা মূল ধারাকে রিলিজযোগ্য, ইতিহাসকে পাঠযোগ্য এবং অডিট ট্রেইল অক্ষুণ্ণ রাখে।
2.7 ডকুমেন্টেশন: শুরু করার নির্দেশিকা থেকে রানবুক (ধাপে ধাপে পরিচালনাগত পদ্ধতি) ও সিদ্ধান্ত লগ পর্যন্ত লিখিত জ্ঞান, যা মূল-ব্যক্তি ঝুঁকির বিরুদ্ধে রক্ষা করে, অনবোর্ডিং ত্বরান্বিত করে এবং বছর ও চুক্তির সীমানা পেরিয়ে বোঝাপড়া স্থানান্তর করে।
2.8 সফটওয়্যার প্রয়োজনীয়তা: সফটওয়্যারকে কী করতে হবে এবং কতটা ভালোভাবে, তা সংগ্রহ, নির্দিষ্টকরণ, যাচাই ও পরিচালনা, নিয়ন্ত্রিত ও সরকারি কাজের দাবি করা অনুসরণযোগ্যতাসহ।
2.9 সফটওয়্যার নির্মাণ: কার্যকর সফটওয়্যার গড়ার শিল্প: জটিলতা ন্যূনতম করা, যাচাই ও পরিবর্তনের জন্য নির্মাণ, প্রতিরক্ষামূলক প্রোগ্রামিং এবং শৃঙ্খলাবদ্ধ পুনর্ব্যবহার।
2.10 সফটওয়্যার কনফিগারেশন ব্যবস্থাপনা: প্রতিটি কনফিগারেশন আইটেম (যেকোনো সামগ্রী, যার সংস্করণ অনুসরণ ও নিয়ন্ত্রণ করতে হয়) ও পরিবর্তন শনাক্ত, নিয়ন্ত্রণ ও নিরীক্ষণ করা, যাতে রিলিজ পুনরুৎপাদনযোগ্য ও অডিট ট্রেইল অক্ষুণ্ণ থাকে।
2.11 সফটওয়্যারের গুণমান: টেস্টিংয়ের চেয়ে বিস্তৃত পরিচালিত বৈশিষ্ট্য হিসেবে গুণমান: গুণমানের মডেল, নিশ্চয়তা বনাম নিয়ন্ত্রণ, পরিমাপ, ত্রুটি ব্যবস্থাপনা এবং গুণমানের খরচ।
2.12 সফটওয়্যার মডেল ও পদ্ধতি: কখন ও কীভাবে মডেল করবেন, কাঠামোগত ও আচরণগত মডেল, ফর্মাল মেথড (গাণিতিকভাবে-ভিত্তিক নির্দিষ্টকরণ ও যাচাই), প্রোটোটাইপিং এবং এজাইল পদ্ধতি আচ্ছাদনসহ, আর কখন মডেলিং অপচয়।
2.13 কম্পিউটিং, গণিত ও প্রকৌশলের ভিত্তি: চর্চার নিচের স্থায়ী মৌলিক বিষয়: অ্যালগরিদম ও ডেটা স্ট্রাকচার, যুক্তি ও সম্ভাবনা, এবং অভিজ্ঞতাভিত্তিক প্রকৌশল পদ্ধতি।
2.14 প্রকল্প ও রিপজিটরির কাঠামো: একটি সমাধান ও তার রিপজিটরি সাজানোর সামঞ্জস্যপূর্ণ রীতি, প্রমিত ফোল্ডার, একটি README প্রবেশ-বিন্দু ও ভাগ করা কনফিগারেশনসহ, যাতে যেকোনো ইঞ্জিনিয়ার যেকোনো কোডবেসে নেভিগেট করতে পারেন।
2.15 ডিবাগিং ও সমস্যা নিরসন: ত্রুটি খোঁজা ও সারানোকে অনুমান ও এলোপাতাড়ি পরিবর্তনের বদলে পুনরুৎপাদন, বাইনারি অনুসন্ধানে বিচ্ছিন্ন করা, অনুমান গঠন ও পরীক্ষা, এবং প্রতিটি সমাধানকে রিগ্রেশন টেস্ট হিসেবে ধরে রাখার শৃঙ্খলাবদ্ধ, শেখানো-যায় এমন চর্চা হিসেবে দেখা।
2.16 পারফরম্যান্স প্রকৌশল: পারফরম্যান্স বাজেট ঠিক করে, অপ্টিমাইজের আগে মেপে ও প্রোফাইল করে, অ্যালগরিদমিক খরচ ও লেজের লেটেন্সি বুঝে এবং রিগ্রেশন থেকে রক্ষা করে, সবকিছু কোড ও উপাদানের স্তরে, সফটওয়্যারকে ইচ্ছাকৃতভাবে যথেষ্ট দ্রুত করা।
2.17 কনকারেন্সি ও প্যারালেলিজম: অপরিবর্তনীয়তা ও বার্তা-আদানপ্রদানকে ডিফল্ট করে, রেস, ডেডলক ও মেমরি দৃশ্যমানতা বুঝে, সঠিক সিঙ্ক্রোনাইজেশন ও উচ্চতর-স্তরের মডেল বেছে এবং অনির্ধারিত আচরণ সুচিন্তিতভাবে পরীক্ষা করে সঠিক কনকারেন্ট কোড লেখা।
2.18 নির্ভরতা ও সাপ্লাই-চেইন ব্যবস্থাপনা: ভার্সন শৃঙ্খলা ও লকফাইল, স্থির হালনাগাদ ছন্দ, ন্যূনতম ও যাচাই-করা নির্ভরতার পদচিহ্ন, এবং বিশ্বস্ত সাপ্লাই চেইনের জন্য উৎস ও সফটওয়্যার বিল অফ ম্যাটেরিয়ালসের মাধ্যমে আধুনিক সিস্টেমের বেশিরভাগ গঠনকারী তৃতীয়-পক্ষের কোড পরিচালনা।
2.19 রিফ্যাক্টরিং ও প্রযুক্তিগত ঋণ: বিশ্বস্ত টেস্ট স্যুটের পেছনে কার্যকর কোডের অভ্যন্তরীণ নকশা উন্নত করা, কোড স্মেল চেনা ও ছোট নামকরা রিফ্যাক্টরিং প্রয়োগ, বড় পরিবর্তনের জন্য স্ট্র্যাংলার ফিগ ব্যবহার, এবং প্রযুক্তিগত ঋণকে নৈতিক ব্যর্থতার বদলে দৃশ্যমান, অর্থায়িত পোর্টফোলিও হিসেবে পরিচালনা।
2.20 ত্রুটি সামলানো ও স্থিতিস্থাপকতার প্যাটার্ন: স্পষ্ট ত্রুটি-চুক্তি, দ্রুত-ব্যর্থ বনাম নিরাপদে-ব্যর্থ পছন্দ, ব্যাকঅফ ও আইডেম্পোটেন্সিসহ রিট্রাই, সার্কিট ব্রেকার ও সুষ্ঠু অবনতির মাধ্যমে কোড কীভাবে ব্যর্থ হয় ও সেরে ওঠে তা সুচিন্তিতভাবে ঠিক করা, এবং কখনো নিঃশব্দে কোনো ত্রুটি গিলে না ফেলা।
2.21 টাইপ সিস্টেম ও স্ট্যাটিক বিশ্লেষণ: কোড চলার আগেই পুরো শ্রেণির ত্রুটি ধরা, অবৈধ অবস্থাকে অপ্রকাশযোগ্য করা স্ট্যাটিক ও ক্রমিক টাইপিংয়ের মাধ্যমে, এবং এডিটর ও পাইপলাইনে জুড়ে দেওয়া লিন্টার, টাইপ চেকার ও বিশ্লেষকের মাধ্যমে।
এই অধ্যায়গুলো কীভাবে পরস্পর যুক্ত
পর্ব ২-এর সূত্র হলো বড় পরিসরে পরিবর্তনযোগ্যতা। এখানকার প্রতিটি চর্চা আছে বহু মানুষকে আত্মবিশ্বাসের সঙ্গে একটি ভাগ করা, দীর্ঘজীবী সিস্টেম বদলাতে দেওয়ার জন্য। কোডিং মান (2.1) ও নকশা নীতি (2.2) কোডকে এমনভাবে আকার দেয় যাতে আপনি তা বুঝতে ও বদলাতে পারেন। ইন্টারফেস নকশা (2.3) সেই সীমানা আঁকে যা দলগুলোকে স্বাধীনভাবে তাদের অভ্যন্তর বদলাতে দেয়। টেস্টিং (2.4) সেই নিরাপত্তা-জাল দেয় যা পরিবর্তনকে নিরাপদ করে। কোড রিভিউ (2.5) সেই জায়গা যেখানে ব্যক্তিগত কাজ যৌথ মালিকানার সঙ্গে মেলে, এবং যেখানে মান আসলে প্রয়োগ হয়। ভার্সন কন্ট্রোল (2.6) সেই ভিত্তি, যার ওপর রিভিউ, ইন্টিগ্রেশন ও অডিট সবই দাঁড়িয়ে। আর ডকুমেন্টেশন (2.7) এই সবকিছুর পেছনের অভিপ্রায় পরবর্তীদের জন্য সংরক্ষণ করে।
এই অধ্যায়গুলো গাইডবুকের বাকি অংশকেও জোগান দেয়। এখানকার ইন্টারফেস ও নকশা নীতি পর্ব ৩-এর সিস্টেমের বিল্ডিং ব্লক হয়, বিশেষত স্থাপত্যের মূলনীতি (অধ্যায় 3.1)। টেস্টিং কৌশল (2.4) ও ভার্সন কন্ট্রোল (2.6) অধ্যায় 8.1-এর স্বয়ংক্রিয় সরবরাহ পাইপলাইনের কাঁচামাল। ডকুমেন্টেশন চর্চা (2.7) সরাসরি পরিচালনার রানবুক ও অবজার্ভেবিলিটির সঙ্গে যুক্ত, যেমন অধ্যায় 9.2। এবং পুরো পর্ব দাঁড়িয়ে পর্ব ১-এ স্থাপিত মূল্যবোধ ও সিদ্ধান্ত গ্রহণের ভিত্তির ওপর, ভাগ করা নীতিকে সুনির্দিষ্ট দৈনন্দিন শিল্পনৈপুণ্যে রূপ দিয়ে।