Back home

পুরানো সিস্টেমের আধুনিকীকরণ প্রথমে সামঞ্জস্যের মই লাগে

Copilot এর সত্যিই দরকারী অংশ হল পরিবেশ, প্রবেশদ্বার, পরীক্ষা এবং সীমানা স্তর স্তর দ্বারা টেনে আনা।

প্রথমে পুরানো সিস্টেমকে আধুনিক করুন এবং সামঞ্জস্যের মই তৈরি করুন

বিশ বছর আগে প্রথমবার যখন আমি একটি জাভা প্রজেক্ট খুলেছিলাম, প্রথম জিনিসটি দেখেছিলাম কোড গন্ধ নয়, বয়সের গন্ধ। build.xml এখনও আছে, কিন্তু pom.xml সেখানে নেই; ডিরেক্টরির কাঠামোটি পুরানো ধাঁচের, পরীক্ষার প্রবেশদ্বারটিও পুরানো ধাঁচের, এবং এমনকি “এটি একটি চলমান পণ্য পুনর্নির্মাণ করতে পারে কিনা” তা পুনরায় নিশ্চিত করা দরকার। এই পর্যায়ে সবচেয়ে সাধারণ ভুল হল ক্লাস এবং পদ্ধতির উপর ফোকাস করা এবং উপেক্ষা করা যে আসলেই আধুনিকীকরণকে বাধা দেয় পরিবেশ এবং প্রবেশদ্বার।

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

এরপর সেতু বেছে নেওয়ার পালা। সেতুর লক্ষ্য খুবই সুনির্দিষ্ট: একটি প্রান্ত পুরানো সোর্স কোডের সাথে সংযুক্ত, এবং অন্য প্রান্তটি নতুন মেশিনের সাথে সংযুক্ত। এই প্রজেক্টটি অবশেষে Java 8 এবং Gradle 7.6-এ পড়ে, যা শুধুমাত্র উভয় প্রান্তের সীমাবদ্ধতার উপর আটকে আছে: Java 17 আর Java 1.5 এর সোর্স কোড কম্পাইল করতে ইচ্ছুক নয়, এবং Java 6 ARM64 এর নেটিভ পরিবেশে চলতে পারে না। সেতুটি ভুল হলে আধুনিকায়ন আটকে যাবে টুল চেইনে; সেতুটি সঠিক হলে, পরবর্তী স্থানান্তরগুলি ধাপে ধাপে এগিয়ে যেতে সক্ষম হবে।

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

java {
    sourceCompatibility = JavaVersion.VERSION_1_5
    targetCompatibility = JavaVersion.VERSION_1_5
}
sourceSets {
    main {
        java {
            srcDirs = ['java']
        }
    }
}
tasks.register('runLegacyTest', JavaExec) {
    mainClass.set(project.findProperty('mainClass'))
    classpath = sourceSets.main.runtimeClasspath
}

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

বিচারের সময় আউটসোর্স করা যাবে না। Gradle 8 আরও নতুন দেখায়, Java 17 আরও আধুনিক দেখায়, এবং সরাসরি লাফানোও পরিষ্কার দেখায়, কিন্তু এই বিকল্পগুলি একই সময়ে পুরানো সোর্স কোড এবং পুরানো পরীক্ষার সীমাবদ্ধতাগুলি পূরণ করতে পারে না। আধুনিকীকরণের সবচেয়ে বড় ভয় হল টুল আপগ্রেডকে অগ্রগতি এবং চলমান কমান্ডগুলিকে সিস্টেম বোঝা হিসাবে বিবেচনা করা। যতক্ষণ পর্যন্ত একটি প্রকল্প অপারেশনাল বেসলাইনে পেরেক না করে, ততক্ষণ সবুজ পরীক্ষাকে বিজয় হিসাবে বিবেচনা করা হয় না, এটি শুধুমাত্র আপাতত উন্মুক্ত পৃষ্ঠে আঘাত না করা হিসাবে বিবেচনা করা যেতে পারে।

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

পুরানো সিস্টেমের আধুনিকীকরণের সবচেয়ে মূল্যবান ফলাফল হল “কাজ করা উচিত” এমন একটি গুচ্ছ জিনিসকে “যে জিনিসগুলি আসলে কাজ করে এবং আমরা জানি যে তারা কেন কাজ করে।” একবার এই সামঞ্জস্যের মইটি প্রতিষ্ঠিত হলে, পরবর্তী ভাঙনের একটি ছন্দ থাকবে এবং পরিবর্তনের সীমানা থাকবে। কপাইলট এই সময়ে সামনের সারিতে একজন সহকারীর মতো, বয়স, প্রবেশপথ এবং নির্ভরতা দেখার জন্য একটি ফ্ল্যাশলাইট ধরে। যা প্রকৃতপক্ষে দিকনির্দেশনা নির্ধারণ করে তা হল পুরানো ব্যবস্থার ইতিহাসের বিচার।

FAQ

What to read next

Related

Continue reading

后端 · 2 tags

এজেন্ট ইঞ্জিনিয়ারিং প্রথমে প্রসঙ্গ এবং সেন্সরকে শক্ত করে

ফ্র্যাগমেন্টস থেকে: 13 জুলাই, আমরা যা দেখি তা নতুন মডেলের ক্ষমতা নয়, তবে প্রথমে প্রতিদিনের ইঞ্জিনিয়ারিংয়ে প্রবেশ করা।