আমরা প্রকল্পগুলি করছি, তবে আমরা প্রকল্পগুলির মধ্যে প্রচুর কোড পুনরায় ব্যবহার করি এবং আমাদের প্রচলিত কোড রয়েছে এমন প্রচুর লাইব্রেরি রয়েছে। আমরা নতুন প্রকল্পগুলি বাস্তবায়ন করার সাথে সাথে আমরা সাধারণ কোড তৈরি করার এবং লাইব্রেরিতে রাখার আরও উপায় খুঁজে পাই। গ্রন্থাগারগুলি একে অপরের উপর নির্ভর করে এবং প্রকল্পগুলি লাইব্রেরিতে নির্ভর করে। প্রতিটি প্রকল্প এবং এই প্রকল্পে ব্যবহৃত সমস্ত গ্রন্থাগারগুলিতে তারা উল্লেখ করা সমস্ত লাইব্রেরির একই সংস্করণ ব্যবহার করা দরকার। আমরা যদি কোনও সফ্টওয়্যার প্রকাশ করি তবে আমাদের বাগগুলি ঠিক করতে হবে এবং অনেক বছর কয়েক বছর ধরে কয়েক দশক ধরে নতুন বৈশিষ্ট্য যুক্ত করতে হবে। আমাদের প্রায় এক ডজন লাইব্রেরি রয়েছে, প্রায়শই দুটিরও বেশি জুড়ে পরিবর্তনগুলি কাটা হয় এবং বেশ কয়েকটি দল সমান্তরালে কয়েকটি প্রকল্পে কাজ করে, এই সমস্ত লাইব্রেরিতে একযোগে পরিবর্তন করে।
আমরা সম্প্রতি প্রতিটি গ্রন্থাগার এবং প্রতিটি প্রকল্পের জন্য গিট পরিবর্তন করেছি এবং সংগ্রহস্থলগুলি সেট আপ করেছি। আমরা স্ট্যাশকে একটি সাধারণ সংগ্রহস্থল হিসাবে ব্যবহার করি, বৈশিষ্ট্য শাখায় নতুন স্টাফ করি, তারপরে অনুরোধগুলি তৈরি করি এবং পর্যালোচনা করার পরে কেবল সেগুলি মার্জ করে।
প্রকল্পগুলির ক্ষেত্রে আমাদের যে সমস্যাগুলি মোকাবেলা করতে হবে তার অনেকগুলি আমাদের বিভিন্ন লাইব্রেরি এবং প্রকল্পের নির্দিষ্ট কোড জুড়ে পরিবর্তন করা প্রয়োজন। এর মধ্যে প্রায়শই লাইব্রেরি ইন্টারফেসের পরিবর্তনগুলি অন্তর্ভুক্ত থাকে যার মধ্যে কিছুটা বেমানান। (যদি আপনি ভাবেন যে এটিকে মশালার মতো মনে হয়: আমরা হার্ডওয়্যারটির সাথে ইন্টারফেস করি এবং জেনেরিক ইন্টারফেসের পিছনে নির্দিষ্ট হার্ডওয়্যারটি আড়াল করি Al প্রায় প্রতিটি সময়ই আমরা অন্য কোনও বিক্রেতার হার্ডওয়্যারকে সংহত করি আমরা আমাদের বর্তমান ইন্টারফেসগুলি প্রত্যাশা না করে এমন ক্ষেত্রে চালিত করি এবং তাই সেগুলি পরিমার্জন করতে হবে For) উদাহরণস্বরূপ, একটি প্রকল্প কল্পনা P1
লাইব্রেরি ব্যবহার L1
, L2
এবং L3
। L1
এছাড়াও ব্যবহার করে L2
এবং L3
, এবং পাশাপাশি L2
ব্যবহার করে L3
। নির্ভরতা গ্রাফটি এমন দেখাচ্ছে:
<-------L1<--+
P1 <----+ ^ |
<-+ | | |
| +--L2 |
| ^ |
| | |
+-----L3---+
এখন কল্পনা করুন যে এই প্রকল্পের জন্য কোনও বৈশিষ্ট্যটির পরিবর্তন প্রয়োজন P1
এবং L3
এর ইন্টারফেসটি পরিবর্তিত হয় L3
। এখন প্রকল্পগুলি P2
এবং P3
মিক্সটিতে যুক্ত করুন, যা এই লাইব্রেরিগুলিকেও উল্লেখ করে। আমরা তাদের সকলকে নতুন ইন্টারফেসে স্যুইচ করতে, সমস্ত পরীক্ষা চালাতে এবং নতুন সফ্টওয়্যার মোতায়েনের সামর্থ রাখতে পারি না। তাহলে বিকল্প কি?
- নতুন ইন্টারফেস বাস্তবায়ন
L3
- জন্য একটি টান অনুরোধ করুন
L3
এবং পর্যালোচনা জন্য অপেক্ষা করুন - পরিবর্তনটি মার্জ করুন
- একটি নতুন রিলিজ তৈরি করুন
L3
- বৈশিষ্ট্যটিতে
P1
এটিরL3
নতুন প্রকাশের কথা উল্লেখ করে কাজ শুরু করুন , তারপরেP1
বৈশিষ্ট্যটির শাখায় বৈশিষ্ট্যটি প্রয়োগ করুন - একটি টান অনুরোধ করুন, এটি পর্যালোচনা করুন, এবং মার্জ করুন
(আমি শুধু লক্ষ্য করেছি যে, আমি সুইচ করতে ভুলে গেছি L1
এবং L2
নতুন রিলিজ করা হয়। এবং আমি এমনকি কারণ এটি পাশাপাশি এটি করা প্রয়োজন হবে, যেখানে এই বিদ্ধ জানি না P1
...)
এই বৈশিষ্ট্যটি বাস্তবায়নের জন্য এটি একটি ক্লান্তিকর, ত্রুটি-প্রবণ এবং খুব দীর্ঘ প্রক্রিয়া, এটির জন্য স্বতন্ত্র পর্যালোচনাগুলি (যা পর্যালোচনা করা এটি আরও কঠিন করে তোলে) দরকার হয়, মোটেও স্কেল করে না এবং আমাদের ব্যবসায়ের বাইরে রাখার সম্ভাবনা রয়েছে কারণ আমরা প্রক্রিয়াতে এতটা জটলা হয়ে পড়ে আমরা কখনই কিছু করতে পারি না।
তবে কীভাবে আমরা এমন একটি প্রক্রিয়া তৈরি করতে যাতে শাখা প্রশাখা এবং ট্যাগিং নিযুক্ত করি যা আমাদের অত্যধিক ওভারহেড ছাড়াই নতুন প্রকল্পগুলিতে নতুন বৈশিষ্ট্যগুলি প্রয়োগ করতে দেয়?