কেন একটি বিল্ড সিস্টেম?

এই পৃষ্ঠাটি আলোচনা করে যে বিল্ড সিস্টেমগুলি কী, সেগুলি কী করে, কেন আপনার একটি বিল্ড সিস্টেম ব্যবহার করা উচিত এবং কেন কম্পাইলার এবং বিল্ড স্ক্রিপ্টগুলি আপনার সংস্থার স্কেল শুরু হওয়ার সাথে সাথে সেরা পছন্দ নয়৷ এটি এমন ডেভেলপারদের জন্য যাদের বিল্ড সিস্টেমের সাথে খুব বেশি অভিজ্ঞতা নেই।

একটি বিল্ড সিস্টেম কি?

মৌলিকভাবে, সমস্ত বিল্ড সিস্টেমের একটি সোজা উদ্দেশ্য রয়েছে: তারা ইঞ্জিনিয়ারদের দ্বারা লিখিত উত্স কোডকে এক্সিকিউটেবল বাইনারিগুলিতে রূপান্তরিত করে যা মেশিনগুলি পড়তে পারে। বিল্ড সিস্টেম শুধুমাত্র মানব-রচিত কোডের জন্য নয়; তারা মেশিনগুলিকে স্বয়ংক্রিয়ভাবে বিল্ড তৈরি করার অনুমতি দেয়, তা পরীক্ষার জন্য হোক বা উৎপাদনে প্রকাশের জন্য। হাজার হাজার প্রকৌশলী সহ একটি সংস্থায়, এটি সাধারণ যে বেশিরভাগ বিল্ডগুলি সরাসরি প্রকৌশলীদের দ্বারা না হয়ে স্বয়ংক্রিয়ভাবে ট্রিগার হয়।

আমি শুধু একটি কম্পাইলার ব্যবহার করতে পারি না?

একটি বিল্ড সিস্টেমের প্রয়োজন অবিলম্বে সুস্পষ্ট নাও হতে পারে। বেশিরভাগ প্রকৌশলী কোড শেখার সময় একটি বিল্ড সিস্টেম ব্যবহার করেন না: বেশিরভাগই কমান্ড লাইন থেকে সরাসরি gcc বা javac এর মতো টুল ব্যবহার করে, অথবা সমন্বিত উন্নয়ন পরিবেশে (IDE) সমতুল্য। যতক্ষণ না সমস্ত সোর্স কোড একই ডিরেক্টরিতে থাকে, এইরকম একটি কমান্ড সূক্ষ্ম কাজ করে:

javac *.java

এটি জাভা কম্পাইলারকে বর্তমান ডিরেক্টরির প্রতিটি জাভা সোর্স ফাইল নিতে এবং এটিকে একটি বাইনারি ক্লাস ফাইলে পরিণত করার নির্দেশ দেয়। সহজ ক্ষেত্রে, এটি আপনার প্রয়োজন।

যাইহোক, কোড প্রসারিত হওয়ার সাথে সাথে জটিলতা শুরু হয়। javac ইম্পোর্ট করার জন্য কোড খুঁজে পেতে বর্তমান ডিরেক্টরির সাবডিরেক্টরিগুলি দেখতে যথেষ্ট স্মার্ট। কিন্তু এটি ফাইল সিস্টেমের অন্যান্য অংশে সংরক্ষিত কোড খুঁজে পাওয়ার কোন উপায় নেই (সম্ভবত একটি লাইব্রেরি বেশ কয়েকটি প্রকল্প দ্বারা ভাগ করা হয়েছে)। এটি কেবল জাভা কোড কীভাবে তৈরি করতে হয় তাও জানে। বৃহৎ সিস্টেমে প্রায়ই বিভিন্ন ধরনের প্রোগ্রামিং ভাষায় লিখিত বিভিন্ন টুকরো জড়িত থাকে এবং সেই টুকরোগুলির মধ্যে নির্ভরশীলতার জাল থাকে, যার অর্থ একটি একক ভাষার জন্য কোনও কম্পাইলার সম্ভবত পুরো সিস্টেমটি তৈরি করতে পারে না।

একবার আপনি একাধিক ভাষা বা একাধিক সংকলন ইউনিট থেকে কোড নিয়ে কাজ করলে, বিল্ডিং কোড আর এক-ধাপে প্রক্রিয়া নয়। এখন আপনাকে অবশ্যই মূল্যায়ন করতে হবে যে আপনার কোড কিসের উপর নির্ভর করে এবং সেই টুকরোগুলিকে যথাযথ ক্রমে তৈরি করতে হবে, সম্ভবত প্রতিটি টুকরার জন্য আলাদা আলাদা টুল ব্যবহার করে। যদি কোনো নির্ভরতা পরিবর্তিত হয়, তাহলে আপনাকে বাসি বাইনারিগুলির উপর নির্ভর করা এড়াতে এই প্রক্রিয়াটি পুনরাবৃত্তি করতে হবে। এমনকি মাঝারি আকারের কোডবেসের জন্য, এই প্রক্রিয়াটি দ্রুত ক্লান্তিকর এবং ত্রুটি-প্রবণ হয়ে ওঠে।

জাভাতে তৃতীয় পক্ষের JAR ফাইলগুলির মতো বহিরাগত নির্ভরতাগুলি কীভাবে পরিচালনা করতে হয় সে সম্পর্কেও কম্পাইলার কিছুই জানে না। একটি বিল্ড সিস্টেম ছাড়া, আপনি ইন্টারনেট থেকে নির্ভরতা ডাউনলোড করে, হার্ড ড্রাইভে একটি lib ফোল্ডারে আটকে এবং সেই ডিরেক্টরি থেকে লাইব্রেরি পড়ার জন্য কম্পাইলার কনফিগার করে এটি পরিচালনা করতে পারেন। সময়ের সাথে সাথে, এই বাহ্যিক নির্ভরতাগুলির আপডেট, সংস্করণ এবং উত্স বজায় রাখা কঠিন।

শেল স্ক্রিপ্ট সম্পর্কে কি?

ধরুন যে আপনার শখের প্রকল্পটি যথেষ্ট সহজভাবে শুরু হয়েছে যে আপনি কেবল একটি কম্পাইলার ব্যবহার করে এটি তৈরি করতে পারেন, তবে আপনি আগে বর্ণিত কিছু সমস্যায় পড়তে শুরু করেন। হয়তো আপনি এখনও মনে করেন না যে আপনার একটি বিল্ড সিস্টেম দরকার এবং কিছু সাধারণ শেল স্ক্রিপ্ট ব্যবহার করে ক্লান্তিকর অংশগুলিকে স্বয়ংক্রিয়ভাবে সরিয়ে দিতে পারে যা সঠিক ক্রমে জিনিসগুলি তৈরি করার যত্ন নেয়। এটি কিছু সময়ের জন্য সাহায্য করে, কিন্তু খুব শীঘ্রই আপনি আরও সমস্যায় পড়তে শুরু করেন:

  • এটি ক্লান্তিকর হয়ে ওঠে। আপনার সিস্টেমটি আরও জটিল হওয়ার সাথে সাথে আপনি আপনার বিল্ড স্ক্রিপ্টগুলিতে বাস্তব কোডের মতো প্রায় ততটা সময় ব্যয় করতে শুরু করেন। শেল স্ক্রিপ্টগুলি ডিবাগ করা বেদনাদায়ক, আরও বেশি হ্যাকগুলি একে অপরের উপরে স্তরযুক্ত।

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

  • সুসংবাদ: এটি একটি মুক্তির জন্য সময়! আপনার চূড়ান্ত বিল্ড করার জন্য আপনাকে জার কমান্ডে পাস করতে হবে এমন সমস্ত আর্গুমেন্ট খুঁজে বের করুন। এবং মনে রাখবেন কিভাবে এটি আপলোড করতে হয় এবং এটিকে কেন্দ্রীয় সংগ্রহস্থলে ধাক্কা দিতে হয়। এবং ডকুমেন্টেশন আপডেটগুলি তৈরি করুন এবং পুশ করুন এবং ব্যবহারকারীদের কাছে একটি বিজ্ঞপ্তি পাঠান। হুম, সম্ভবত এটি অন্য স্ক্রিপ্টের জন্য কল করছে...

  • বিপর্যয়! আপনার হার্ড ড্রাইভ ক্র্যাশ হয়েছে, এবং এখন আপনাকে আপনার পুরো সিস্টেমটি পুনরায় তৈরি করতে হবে। আপনি আপনার সমস্ত সোর্স ফাইলগুলিকে সংস্করণ নিয়ন্ত্রণে রাখার জন্য যথেষ্ট স্মার্ট ছিলেন, কিন্তু আপনি যে লাইব্রেরিগুলি ডাউনলোড করেছেন সেগুলির কী হবে? আপনি কি সেগুলিকে আবার খুঁজে পেতে পারেন এবং নিশ্চিত করতে পারেন যে সেগুলি একই সংস্করণ ছিল যখন আপনি প্রথম ডাউনলোড করেছিলেন? আপনার স্ক্রিপ্টগুলি সম্ভবত নির্দিষ্ট জায়গায় ইনস্টল করা নির্দিষ্ট সরঞ্জামগুলির উপর নির্ভর করে- আপনি কি সেই একই পরিবেশ পুনরুদ্ধার করতে পারেন যাতে স্ক্রিপ্টগুলি আবার কাজ করে? কম্পাইলার ঠিক ঠিক কাজ করার জন্য আপনি অনেক দিন আগে সেট করা সমস্ত পরিবেশের ভেরিয়েবল সম্পর্কে কী এবং তারপর ভুলে গেছেন?

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

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

  • প্রকল্পের বৃদ্ধির সাথে সাথে বিল্ডগুলি ধীর এবং ধীর হয়ে যায়। একদিন, একটি নির্মাণ সম্পূর্ণ হওয়ার জন্য অপেক্ষা করার সময়, আপনি আপনার সহকর্মীর নিষ্ক্রিয় ডেস্কটপের দিকে শোকের সাথে তাকান, যিনি ছুটিতে আছেন এবং চান যে সমস্ত নষ্ট গণনা শক্তির সদ্ব্যবহার করার একটি উপায় ছিল।

আপনি স্কেলের একটি ক্লাসিক সমস্যায় পড়েছেন। একজন একক বিকাশকারীর জন্য সর্বাধিক এক বা দুই সপ্তাহের জন্য কোডের কয়েকশ লাইনে কাজ করে (যা এখন পর্যন্ত একজন জুনিয়র বিকাশকারীর পুরো অভিজ্ঞতা হতে পারে যিনি সবেমাত্র বিশ্ববিদ্যালয়ে স্নাতক করেছেন), আপনার যা দরকার তা হল একটি কম্পাইলার। স্ক্রিপ্ট হয়তো আপনাকে একটু দূরে নিয়ে যেতে পারে। কিন্তু যত তাড়াতাড়ি আপনাকে একাধিক ডেভেলপার এবং তাদের মেশিনগুলির মধ্যে সমন্বয় করতে হবে, এমনকি একটি নিখুঁত বিল্ড স্ক্রিপ্টও যথেষ্ট নয় কারণ সেই মেশিনগুলির ছোটখাটো পার্থক্যগুলির জন্য অ্যাকাউন্ট করা খুব কঠিন হয়ে পড়ে। এই মুহুর্তে, এই সহজ পদ্ধতিটি ভেঙে যায় এবং এটি একটি বাস্তব বিল্ড সিস্টেমে বিনিয়োগ করার সময়।