৪.১ কোড জটিলতা মেট্রিক
সারসংক্ষেপ এবং প্রেরণা
সাইক্লোম্যাটিক জটিলতা, ১৯৭৬ সালে থমাস জে. ম্যাককেবি দ্বারা প্রবর্তিত, একটি কোডের টুকরার নিয়ন্ত্রণ প্রবাহের মধ্য দিয়ে স্বাধীন পথের সংখ্যা গণনা করে: প্রতিটি if, লুপ, এবং শাখা গণনায় যোগ করে। প্রায় পঞ্চাশ বছর পরেও এটি সবচেয়ে ব্যাপকভাবে ব্যবহৃত কোড জটিলতা মেট্রিক থেকে যায়, জ্ঞানীয় জটিলতার (যা ম্যাককেবির মূল রৈখিক গণনার চেয়ে নেস্টেড ও অনুসরণ-করা-কঠিন নিয়ন্ত্রণ প্রবাহকে বেশি ভারযুক্ত করে) ও নেস্টিং গভীরতার মতো আত্মীয়সহ। এই মেট্রিকগুলো একটি প্রকৃত, বৈধকৃত অন্তর্দৃষ্টি ভাগ করে: এর মধ্য দিয়ে আরও স্বাধীন পথসহ কোড সম্পূর্ণভাবে পরীক্ষা করা কঠিনতর, যুক্তিসঙ্গত করা কঠিনতর, এবং, দশকের অভিজ্ঞতাভিত্তিক গবেষণায়, পরিমাপযোগ্যভাবে ত্রুটি ধারণ করার সম্ভাবনা বেশি।
এই বিষয় সেই অন্তর্দৃষ্টিকে প্রকৃত সম্মানের সাথে বিবেচনা করে একই সাথে এর সীমাকে সমান গুরুত্বের সাথে বিবেচনা করে। জটিলতা মেট্রিক কোডের একটি নির্দিষ্ট বৈশিষ্ট্য পরিমাপ করে, এবং একটি কোডবেস প্রতিটি জটিলতা মেট্রিক দ্বারা সরল হতে পারে যখনও খারাপভাবে নকশাকৃত, খারাপভাবে নামকরণ করা, বা এমনভাবে ধারণাগতভাবে অসংলগ্ন যা কোনো শাখা-গণনা অ্যালগরিদম সনাক্ত করতে পারে না। বিপরীতে, কিছু অহ্রাসযোগ্যভাবে জটিল সমস্যার সঠিকভাবে সমাধান করতে প্রকৃতপক্ষে জটিল কোড প্রয়োজন, এবং একটি জটিলতা স্কোর কমাতে চাপযুক্ত একটি দল এমন কোড উৎপাদন করতে পারে যা ভালো স্কোর করে যখন প্রকৃতপক্ষে বোঝা কঠিনতর, অপরিহার্য জটিলতাকে কমানোর বদলে আরও ফাইল ও পরোক্ষতার স্তর জুড়ে ছড়িয়ে দেয়।
বড় দলের জন্য, জটিলতা মেট্রিক একটি ট্রিয়াজ টুল হিসেবে তাদের মূল্য অর্জন করে: হাজার হাজার ফাইলের মধ্যে ছোট উপসেট খুঁজে পাওয়ার একটি উপায় যা একটি ঘনিষ্ঠ দৃষ্টি পুরস্কৃত করার সবচেয়ে সম্ভাবনাময়, কোড গুণমানের একটি স্বতন্ত্র রায় হিসেবে নয়। কোনো একক ব্যক্তির সম্পূর্ণভাবে পড়ার জন্য খুব বড় কোডবেস রক্ষণাবেক্ষণকারী এন্টারপ্রাইজ ও সরকারি প্রতিষ্ঠান এই ট্রিয়াজ কার্যক্রমের উপর নির্ভর করে দুষ্প্রাপ্য পুনর্গঠন ও পর্যালোচনা প্রচেষ্টাকে সেখানে নির্দেশ করতে যেখানে এটি সবচেয়ে বেশি উপকার করবে।
মূল নীতিসমূহ
- জটিলতা মেট্রিক পরীক্ষা ও ত্রুটির কঠিনতা ভবিষ্যদ্বাণী করে; এগুলো সরাসরি গুণমান পরিমাপ করে না। এগুলোকে একটি ইনপুট হিসেবে বিবেচনা করুন, একটি রায় নয়।
- একটি জটিলতা স্কোর অস্পষ্টকরণের মাধ্যমে কারচুপির প্রতি প্রকাশিত, শুধু প্রকৃত সরলীকরণ নয়। আরও ফাইল জুড়ে জটিলতা বিভক্ত করা কোডটি প্রকৃতপক্ষে বোঝা সহজ না করেই স্কোর কমাতে পারে।
- কিছু জটিলতা অপরিহার্য, দুর্ঘটনাজনিত নয়। একটি প্রকৃতপক্ষে কঠিন সমস্যায় প্রকৃতপক্ষে জটিল কোড প্রয়োজন হতে পারে; লক্ষ্য হলো দুর্ঘটনাজনিত জটিলতা কমানো, নির্বিচারে সব জটিলতা নির্মূল করা নয়।
- ট্রিয়াজের জন্য জটিলতা মেট্রিক ব্যবহার করুন, একটি ব্যক্তিগত বা দলের স্কোরকার্ড হিসেবে নয়। এগুলো কোথায় দেখতে হবে তা নির্দেশ করে, কাকে দোষ দিতে হবে তা নয়।
- প্রবণতা ও আউটলায়ার যে কোনো পরম প্রান্তিকের চেয়ে বেশি গুরুত্বপূর্ণ। একটি বেড়ে যাওয়া প্রবণতা বা একটি চরম আউটলায়ার একটি একক দল-ব্যাপী গড়ের চেয়ে আরও কার্যকরী।
সুপারিশসমূহ
পর্যালোচনা ও পুনর্গঠন প্রচেষ্টা ট্রিয়াজ করতে জটিলতা মেট্রিক ব্যবহার করুন
কোডবেস জুড়ে জটিলতা বিশ্লেষণ চালান এবং ফলাফল ব্যবহার করুন কোথায় একটি ঘনিষ্ঠ মানুষের পর্যালোচনা বা একটি পুনর্গঠন বিনিয়োগ সবচেয়ে বেশি পরিশোধ করবে তা অগ্রাধিকার দিতে: কোডবেসের নিজস্ব সাধারণ পরিসরের অনেক উপরে স্কোর করা ফাংশন বা ফাইল প্রথমে দেখার সবচেয়ে উচ্চ-মূল্যের স্থান। এই ট্রিয়াজ ব্যবহার, কোথায় দেখতে হবে তা খুঁজে বের করা, জটিলতা মেট্রিকের সবচেয়ে রক্ষণযোগ্য ও মূল্যবান প্রয়োগ, একটি পরম পাস/ফেল গেট হিসেবে ব্যবহার করার চেয়ে অনেক বেশি।
একটি সার্বজনীন সংখ্যার বদলে আপনার নিজের কোডবেসের সাপেক্ষে প্রান্তিক নির্ধারণ করুন
শিল্প প্রথা থেকে অসমালোচকভাবে ধার করা পরম জটিলতা প্রান্তিক (দশের একটি জটিলতা স্কোর একটি সাধারণত উদ্ধৃত অভিজ্ঞতাভিত্তিক নিয়ম) আপনার ডোমেইনের উপর নির্ভর করে খুব শিথিল বা খুব কঠোর হতে পারে: একটি পার্সার বা একটি নিয়ম ইঞ্জিনের একটি সাধারণ CRUD পরিষেবার চেয়ে বৈধভাবে উচ্চতর বেসলাইন জটিলতা থাকতে পারে। আপনার কোডবেসের প্রকৃত বিতরণের বিরুদ্ধে আপনার নিজের প্রান্তিক ক্যালিব্রেট করুন, এবং একটি প্রান্তিক লঙ্ঘনকে একটি স্বয়ংক্রিয় বিল্ড ব্যর্থতা নয় বরং ঘনিষ্ঠভাবে দেখার জন্য একটি প্রম্পট হিসেবে বিবেচনা করুন, যদি না আপনার দল সম্পূর্ণ সচেতনতার সাথে সেই কঠোরতর নীতি ইচ্ছাকৃতভাবে বেছে না নিয়ে থাকে এর বিনিময়ের সাথে।
প্রকৃত সরলীকরণ ছাড়া বিভাজনের মাধ্যমে কারচুপির জন্য দেখুন
জটিলতা স্কোর কারচুপি হওয়ার সবচেয়ে সাধারণ উপায় এই নির্দিষ্ট মেট্রিকে প্রয়োগ করা বিষয় ১.২-এর প্রতিস্থাপন প্যাটার্ন: একটি প্রকৃতপক্ষে জটিল ফাংশনকে বেশ কয়েকটি ছোট ফাংশনে বিভক্ত করা যা পৃথকভাবে ভালো স্কোর করে, যখন সামগ্রিক সিস্টেম ঠিক ততটাই বোঝা কঠিন থাকে, বা কখনও কখনও কঠিনতর হয়ে ওঠে, কারণ যুক্তিটি এখন আরও ফাইল জুড়ে ছড়িয়ে আছে তাদের মধ্যে আরও পরোক্ষতাসহ। বিভাজন প্রকৃতপক্ষে কোড স্পষ্ট করেছে কিনা, বা এটি শুধু জটিলতাকে এমন কোথাও সরিয়েছে যেখানে মেট্রিক আর দেখতে পারে না তার একটি গুণগত পর্যালোচনার সাথে জটিলতা মেট্রিক জোড়া দিন।
প্রতিক্রিয়া জানানোর আগে অপরিহার্য জটিলতাকে দুর্ঘটনাজনিত জটিলতা থেকে পৃথক করুন
একটি উচ্চ জটিলতা স্কোরকে ঠিক করার একটি সমস্যা হিসেবে বিবেচনা করার আগে, জিজ্ঞাসা করুন অন্তর্নিহিত সমস্যার প্রকৃতপক্ষে এত স্বাধীন পথ প্রয়োজন কিনা, উদাহরণস্বরূপ কর কোড গণনা যুক্তির বৈধভাবে অনেক শাখা আছে, বা জটিলতাটি এড়ানো যায় এমন কারণ থেকে আসে কিনা: গভীরভাবে নেস্টেড শর্তসাপেক্ষ যা সমতল করা যেত, নকল যুক্তি যা একত্রিত করা যেত, বা অস্পষ্ট দায়িত্ব সীমানা যা পুনরায় আঁকা যেত। শুধুমাত্র দ্বিতীয় শ্রেণীটি একটি প্রকৃত গুণমান সমস্যা যা এই মেট্রিকের আপনাকে ঠিক করতে চালিত করা উচিত।
শুধু একটি স্ন্যাপশট গড় নয়, প্রবণতা ও আউটলায়ার ট্র্যাক করুন
একটি কোডবেস-ব্যাপী গড় জটিলতা স্কোর সামান্য নড়াচড়া করা নিজে থেকে খুব কমই কার্যকরী; বেশ কয়েকটি পরিবর্তন জুড়ে একটি নির্দিষ্ট ফাইলের জটিলতা তীব্রভাবে বাড়া, বা অন্যথায় একটি ভালো-আচরণকারী কোডবেসে অল্প সংখ্যক চরম আউটলায়ার, অনেক বেশি দরকারী সংকেত। সময়ের সাথে প্রবণতা ও আউটলায়ার লেজ উভয়ই ট্র্যাক করুন, এবং একটি বিস্তৃত, অফোকাসকৃত জটিলতা-হ্রাস উদ্যোগের বদলে একটি নির্দিষ্ট, লক্ষ্যযুক্ত তদন্ত ট্রিগার করতে এগুলো ব্যবহার করুন।
মূল্যবিচার: ভালো ও মন্দ দিক
| পদ্ধতি | ভালো দিক | মন্দ দিক |
|---|---|---|
| পরম সার্বজনীন প্রান্তিক | সরল, সামঞ্জস্যপূর্ণ, স্বয়ংক্রিয় করা সহজ | বৈধ ডোমেইন পার্থক্য উপেক্ষা করে; বিভাজন দ্বারা কারচুপি করা যায় |
| কোডবেস-আপেক্ষিক প্রান্তিক | প্রকৃত প্রেক্ষাপটের সাথে আরও ভালো ক্যালিব্রেট করা | আরও সেটআপ ও পর্যায়ক্রমিক পুনঃক্যালিব্রেশন প্রয়োজন |
| একটি স্বয়ংক্রিয় বিল্ড গেট হিসেবে জটিলতা | মানুষের পর্যালোচনা ওভারহেড ছাড়াই সামঞ্জস্য প্রয়োগ করে | বৈধভাবে জটিল কিন্তু ভালোভাবে নকশাকৃত কোড ব্লক করতে পারে, বা অস্পষ্টকৃত বিভাজনকে পুরস্কৃত করতে পারে |
| মানুষের পর্যালোচনার জন্য একটি ট্রিয়াজ সংকেত হিসেবে জটিলতা | প্রকৃত গুণমান সমস্যা ধরে যা শুধু বিভাজন মিস করবে | একটি সম্পূর্ণ স্বয়ংক্রিয় গেটের চেয়ে বেশি মানুষের পর্যালোচনা সময় প্রয়োজন |
কেন্দ্রীয় টানাপোড়েন হলো স্বয়ংক্রিয়করণ বনাম বিচার। একটি সম্পূর্ণ স্বয়ংক্রিয় জটিলতা গেট প্রয়োগ করা সস্তা ও সামঞ্জস্যপূর্ণ, কিন্তু এটি উভয়ই বৈধভাবে জটিল, ভালোভাবে নকশাকৃত কোড ব্লক করতে পারে এবং ভাসাভাসা বিভাজনকে পুরস্কৃত করতে পারে যা প্রকৃতপক্ষে কিছু সরল না করেই স্কোর কারচুপি করে। পর্যালোচনার জন্য প্রার্থী প্রকাশ করতে স্বয়ংক্রিয় জটিলতা বিশ্লেষণ ব্যবহার করে এবং প্রকৃত বিচার সংরক্ষণ করে টানাপোড়েন সমাধান করুন, এই জটিলতা কি অপরিহার্য নাকি দুর্ঘটনাজনিত, এই পুনর্গঠন কি প্রকৃতপক্ষে স্পষ্ট করেছে নাকি শুধু জটিলতা স্থানান্তরিত করেছে, একজন মানুষের পর্যালোচকের জন্য একা একটি কঠোর স্বয়ংক্রিয় গেটের বদলে।
আপনার দলের সাথে আলোচনার প্রশ্ন
১. আমাদের জটিলতা প্রান্তিক কি আমাদের নিজস্ব কোডবেসের প্রকৃত বিতরণের সাথে ক্যালিব্রেট করা, নাকি একটি সাধারণ শিল্প প্রথা থেকে অসমালোচকভাবে ধার করা? আপনার কোডবেসের প্রকৃত জটিলতা বিতরণ টানুন এবং পরীক্ষা করুন আপনার বর্তমান প্রান্তিক এর বিরুদ্ধে অর্থবহ কিনা, একটি সাধারণত উদ্ধৃত সংখ্যা আপনার ডোমেইনে সার্বজনীনভাবে প্রযোজ্য ধরে নেওয়ার বদলে।
২. আমরা কি কখনও একটি ফাংশনকে বেশ কয়েকটি ছোটতে বিভক্ত হতে দেখেছি ফলস্বরূপ কোডটি প্রকৃতপক্ষে বোঝা সহজ না হয়ে? এটি এই বিষয় সতর্ক করে এমন বিভাজন-কারচুপি প্যাটার্নের সবচেয়ে স্পষ্ট চিহ্ন। একটি সাম্প্রতিক পুনর্গঠনের দিকে তাকান যা প্রধানত একটি জটিলতা স্কোর দ্বারা প্রেরিত এবং সততার সাথে মূল্যায়ন করুন এটি প্রকৃত বোধগম্যতা উন্নত করেছে কিনা।
৩. আমাদের কোডবেসে কোথায় জটিলতা সমস্যার জন্য অপরিহার্য, এবং কোথায় এটি দুর্ঘটনাজনিত ও ঠিক করার যোগ্য? আপনার সর্বোচ্চ-জটিলতা আউটলায়ারের মধ্য দিয়ে হাঁটুন এবং তাদের স্পষ্টভাবে এই দুটি শ্রেণীতে বাছাই করুন, যেহেতু শুধুমাত্র দ্বিতীয় শ্রেণীটি একটি প্রকৃত, কার্যকরী গুণমান সমস্যা প্রতিনিধিত্ব করে।
৪. আমরা কি পর্যালোচনা প্রচেষ্টা ট্রিয়াজ করতে জটিলতা মেট্রিক ব্যবহার করি, নাকি কোনো মানুষের বিচার জড়িত ছাড়া একটি কঠোর স্বয়ংক্রিয় গেট হিসেবে? আলোচনা করুন আপনার বর্তমান প্রয়োগ পদ্ধতি এই বিষয়ের সুপারিশকৃত অপরিহার্য-বনাম-দুর্ঘটনাজনিত পার্থক্যের জন্য জায়গা রাখে, নাকি এটি প্রেক্ষাপট নির্বিশেষে প্রতিটি লঙ্ঘনকে অভিন্নভাবে বিবেচনা করে।
৫. একটি জটিলতা স্কোর কি কখনও, এমনকি অনানুষ্ঠানিকভাবেও, একজন প্রকৌশলীর কাজের গুণমান বিচার করতে ব্যবহৃত হয়েছে? এটি কার্যকলাপ মেট্রিকের জন্য বিষয় ৩.৪ যে একই ব্যক্তিগত-মূল্যায়ন ফাঁদের বিরুদ্ধে সতর্ক করে তার ঝুঁকি নেয়, এখানে কোড মেট্রিকে প্রয়োগ করা, এবং এটি একই কারচুপি প্রতিক্রিয়া আমন্ত্রণ জানায়।
৬. আমাদের সবচেয়ে সমালোচনামূলক, সবচেয়ে ঘন ঘন পরিবর্তিত ফাইলের জন্য গত বছরে আমাদের জটিলতা প্রবণতা কেমন দেখায়? বিষয় ৪.৩ থেকে churn ও হটস্পট বিশ্লেষণের সাথে এটি একত্রিত করুন, যেহেতু একটি ফাইল যা উভয়ই অত্যন্ত জটিল ও ঘন ঘন পরিবর্তিত সেই একটির চেয়ে অনেক আগে মনোযোগের যোগ্য যা জটিল কিন্তু কদাচিৎ স্পৃষ্ট।
ক্ষেত্র লেন্স
স্টার্টআপ। এই মাত্রায় জটিলতা মেট্রিক সাধারণত কম জরুরি; কোডবেসের আকার যথেষ্ট ছোট যে অনানুষ্ঠানিক পরিচিতি প্রায়ই আনুষ্ঠানিক পরিমাপের বিকল্প হয়। প্রাথমিকভাবে গ্রহণের যোগ্য অভ্যাস হলো শুধু মাঝেমধ্যে একটি জটিলতা স্ক্যান চালানো একটি নির্দিষ্ট ফাইল দল অনানুষ্ঠানিকভাবে লক্ষ্য করার জন্য খুব বড় হয়ে যাওয়ার আগে নীরবে অব্যবস্থাপনাযোগ্য হয়ে উঠতে ধরতে।
ছোট ব্যবসা। বেশিরভাগ আধুনিক স্ট্যাটিক-বিশ্লেষণ টুল একটি বিস্তৃত, বিনামূল্যে বা কম-খরচের লিন্টিং সেটআপের অংশ হিসেবে জটিলতা মেট্রিক প্রতিবেদন করে; নিবেদিত টুলিংয়ে বিনিয়োগ করার বদলে আউটপুট একটি পর্যায়ক্রমিক ট্রিয়াজ সংকেত হিসেবে ব্যবহার করুন। প্রথমে আপনার সবচেয়ে ঘন ঘন পরিবর্তিত ফাইলে মনোযোগ ফোকাস করুন।
এন্টারপ্রাইজ। মাত্রায় জটিলতা মেট্রিক সবচেয়ে মূল্যবান churn উপাত্তের (বিষয় ৪.৩) সাথে একত্রিত হয়ে কোনো একজন ব্যক্তির ম্যানুয়ালি জরিপ করার জন্য খুব বড় একটি কোডবেস জুড়ে পুনর্গঠন বিনিয়োগ অগ্রাধিকার দিতে। একটি প্রতিষ্ঠান-ব্যাপী সংখ্যা প্রয়োগ করার বদলে প্রতি পরিষেবা বা ডোমেইন প্রান্তিক ক্যালিব্রেট করুন, যেহেতু বৈধ জটিলতা বিভিন্ন ধরনের সিস্টেম জুড়ে উল্লেখযোগ্যভাবে পরিবর্তিত হয়।
সরকার। দীর্ঘজীবী সরকারি সিস্টেম প্রায়ই ক্রমবর্ধমান প্রয়োজনীয়তা পরিবর্তনের বছর বা দশক ধরে ধীরে ধীরে জটিলতা সঞ্চয় করে, এবং একটি জটিলতা নিরীক্ষা অংশীদারদের কাছে আধুনিকীকরণ বা পুনর্গঠন বিনিয়োগ ন্যায্যতা দেওয়ার একটি প্ররোচনামূলক, সুনির্দিষ্ট টুল হতে পারে যারা অন্যথায় সিস্টেমটিকে শুধু “কাজ করছে” হিসেবে দেখতে পারেন এবং তাই বিনিয়োগের যোগ্য নয়।
উদাহরণ
এন্টারপ্রাইজ। একটি পেমেন্ট প্রক্রিয়াকরণ কোম্পানি প্রথমবার একটি কোডবেস-ব্যাপী জটিলতা নিরীক্ষা চালিয়েছিল এবং একটি একক লেনদেন-বৈধকরণ ফাংশন পেয়েছিল একটি সাইক্লোম্যাটিক জটিলতা স্কোরসহ কোডবেসের নিজস্ব মধ্যকের চেয়ে দশগুণেরও বেশি। তদন্ত পেয়েছিল জটিলতা প্রায় সম্পূর্ণভাবে দুর্ঘটনাজনিত ছিল: নির্দিষ্ট পেমেন্ট প্রদানকারীদের জন্য বছরের ক্রমবর্ধমানভাবে যোগ করা বিশেষ-ক্ষেত্র হ্যান্ডলিং গভীরভাবে নেস্টেড শর্তসাপেক্ষে সঞ্চিত হয়েছিল যা প্রদানকারী-নির্দিষ্ট যুক্তি পৃথককারী একটি পরিষ্কার কৌশল প্যাটার্নে পুনর্গঠন করা যেত। পুনর্গঠন, সরাসরি অগ্রাধিকারপ্রাপ্ত কারণ জটিলতা নিরীক্ষা এটিকে কোডবেসের একক সর্বোচ্চ-মূল্যের লক্ষ্য হিসেবে চিহ্নিত করেছিল, ফাংশনটির জটিলতা স্কোর ৮০%-এরও বেশি কমিয়েছিল এবং, আরও গুরুত্বপূর্ণভাবে, পরবর্তী দুই ত্রৈমাসিক জুড়ে সেই নির্দিষ্ট কোড পথে ত্রুটির হার পরিমাপযোগ্যভাবে কমিয়েছিল।
সরকার। একটি কর কর্তৃপক্ষের দশক-পুরনো সুবিধা-গণনা ইঞ্জিন প্রায় প্রতিটি ফাংশন জুড়ে জটিলতা মেট্রিকে অত্যন্ত উচ্চ স্কোর করেছিল, একটি প্রাথমিক অনুমানের জন্ম দিয়ে যে পুরো সিস্টেমের একটি ভিত্তি-থেকে পুনর্লিখন প্রয়োজন। অপরিহার্য থেকে দুর্ঘটনাজনিত জটিলতা পৃথককারী একটি ঘনিষ্ঠ, ফাংশন-অনুযায়ী পর্যালোচনা পেয়েছিল যে বেশিরভাগ জটিলতা প্রকৃতপক্ষে অন্তর্নিহিত আইনি নিয়ম প্রতিফলিত করেছিল, যার প্রকৃতপক্ষেই সংবিধি দ্বারা বাধ্যতামূলক অনেক বৈধ শাখা ও বিশেষ ক্ষেত্র ছিল, যখন একটি ছোট উপসেট অনুরূপ গণনা পথ জুড়ে এড়ানো যায় এমন নকল থেকে এসেছিল। দলটি পুনর্গঠনের জন্য শুধুমাত্র দুর্ঘটনাজনিত-জটিলতা উপসেটকে লক্ষ্য করেছিল, একটি ব্যয়বহুল, ঝুঁকিপূর্ণ সম্পূর্ণ পুনর্লিখন এড়িয়ে সিস্টেমের সবচেয়ে প্রকৃতপক্ষে সমস্যাযুক্ত ক্ষেত্র অর্থপূর্ণভাবে উন্নত করার সময়।
ব্যবসায়িক যুক্তি: প্রেরণা, ROI, এবং TCO
জটিলতা মেট্রিক ভালোভাবে ব্যবহারের রিটার্ন হলো লক্ষ্যযুক্ত, উচ্চ-মূল্যের পুনর্গঠন বিনিয়োগ: উপরের পেমেন্ট কোম্পানি উদাহরণ একটি একক, ভালোভাবে লক্ষ্যযুক্ত সমাধান দেখায়, জটিলতা বিশ্লেষণের মাধ্যমে চিহ্নিত, যা একটি বিস্তৃত, অলক্ষ্যযুক্ত পুনর্গঠন উদ্যোগ প্রয়োজন হতো তার একটি ভগ্নাংশ খরচে ঠিক সর্বোচ্চ-ঝুঁকির কোড পথে পরিমাপযোগ্যভাবে ত্রুটি কমিয়েছিল।
মোট মালিকানা খরচ কম: বেশিরভাগ আধুনিক উন্নয়ন টুলচেইন স্ট্যাটিক বিশ্লেষণের (বিষয় ৪.৪) অংশ হিসেবে স্বয়ংক্রিয়ভাবে জটিলতা মেট্রিক গণনা করে, এবং প্রকৃত বিনিয়োগ হলো ফলাফল সঠিকভাবে ব্যাখ্যা করার মানুষের বিচার সময়, অপরিহার্য থেকে দুর্ঘটনাজনিত জটিলতা পৃথক করা ও বিভাজন কারচুপি ধরা, যে কোনো উল্লেখযোগ্য নতুন টুলিং খরচের বদলে।
বিরোধী প্যাটার্ন এবং ফাঁদ
- একটি জটিলতা স্কোরকে একটি সরাসরি গুণমান রায় হিসেবে বিবেচনা করা: এটি একটি নির্দিষ্ট বৈশিষ্ট্য পরিমাপ করে, সামগ্রিক কোড গুণমান নয়।
- প্রকৃত সরলীকরণ ছাড়া স্কোর কারচুপি করতে একটি ফাংশন বিভক্ত করা: এই বিষয় নির্দিষ্টভাবে নাম দেয় এমন বিভাজন-কারচুপি প্যাটার্ন।
- আপনার নিজের কোডবেসের সাথে ক্যালিব্রেট না করে একটি সার্বজনীন প্রান্তিক প্রয়োগ করা: ডোমেইনের উপর নির্ভর করে খুব-শিথিল বা খুব-কঠোর প্রয়োগ উৎপাদন করে।
- প্রকৌশলীদের ব্যক্তিগতভাবে মূল্যায়ন করতে জটিলতা মেট্রিক ব্যবহার করা: কারচুপি আমন্ত্রণ জানায় এবং ট্রিয়াজের জন্য অভিপ্রেত একটি মেট্রিক ভুল প্রয়োগ করে, বিচার নয়।
- সব জটিলতাকে সমানভাবে ঠিক করার যোগ্য হিসেবে বিবেচনা করা: একটি প্রকৃতপক্ষে কঠিন সমস্যা থেকে অপরিহার্য জটিলতা নির্মূল করার একটি ত্রুটি নয়।
- একটি সমতল, কোডবেস-ব্যাপী গড়ের পক্ষে প্রবণতা ও আউটলায়ার উপেক্ষা করা: এই মেট্রিক পরিবার প্রদান করা সবচেয়ে কার্যকরী সংকেত মিস করে।
পরিপক্বতা মডেল
- স্তর ১, শুরু: জটিলতা পরিমাপ করা হয় না, বা অসমালোচকভাবে প্রয়োগ করা একটি অপরীক্ষিত, সাধারণ সার্বজনীন প্রান্তিকসহ পরিমাপ করা হয়।
- স্তর ২, উন্নয়ন: জটিলতা মেট্রিক সংগৃহীত হয় কিন্তু খুব কমই এর উপর কাজ করা হয়, এবং অপরিহার্য ও দুর্ঘটনাজনিত জটিলতার মধ্যে কোনো পার্থক্য করা হয় না।
- স্তর ৩, মানসম্মতকরণ: প্রান্তিক কোডবেসের নিজস্ব বিতরণের সাথে ক্যালিব্রেট করা হয়, এবং জটিলতা মেট্রিক সামঞ্জস্যপূর্ণভাবে প্রতিষ্ঠান-ব্যাপী পর্যালোচনা ও পুনর্গঠন ট্রিয়াজ চালায়।
- স্তর ৪, ব্যবস্থাপনা: জটিলতা প্রবণতা ও আউটলায়ার সক্রিয়ভাবে পর্যবেক্ষণ করা হয় এবং পুনর্গঠন বিনিয়োগ অগ্রাধিকার দিতে churn উপাত্তের (বিষয় ৪.৩) সাথে একত্রিত করা হয়; বিভাজন কারচুপির জন্য সক্রিয়ভাবে দেখা হয়।
- স্তর ৫, সমন্বয়: প্রতিষ্ঠান নির্দিষ্ট, পরিমাপযোগ্য ত্রুটি-হার উন্নতি নির্দেশ করতে পারে সরাসরি জটিলতা-অবহিত পুনর্গঠন বিনিয়োগে ফিরে খুঁজে পাওয়া, এবং জটিলতা উপাত্ত প্রকৌশল বিনিয়োগ সিদ্ধান্তের একটি রুটিন, বিশ্বস্ত ইনপুট।
আলোচনার জন্য ধারণা
১. আমাদের একক সবচেয়ে জটিল ফাংশন বা ফাইল কী, এবং এর জটিলতা অপরিহার্য নাকি দুর্ঘটনাজনিত? ২. আমরা কি কখনও প্রকৃত সরলীকরণ ছাড়া বিভাজনের মাধ্যমে একটি জটিলতা স্কোর কারচুপি করেছি? ৩. আমাদের প্রান্তিক কি আমাদের নিজস্ব কোডবেসের সাথে ক্যালিব্রেট করা, নাকি অসমালোচকভাবে ধার করা? ৪. আমাদের কোডবেসে এখন উচ্চ জটিলতা উচ্চ churn-এর সাথে কোথায় ওভারল্যাপ করে? ৫. জটিলতা উপাত্ত কি কখনও একটি পুনর্গঠন বিনিয়োগ সিদ্ধান্ত অবহিত করেছে, নাকি এটি অব্যবহৃত বসে থাকে?
মূল বিষয়সমূহ
- সাইক্লোম্যাটিক জটিলতার মতো জটিলতা মেট্রিক পরীক্ষা ও ত্রুটির কঠিনতা ভবিষ্যদ্বাণী করে; এগুলো সরাসরি সামগ্রিক কোড গুণমান পরিমাপ করে না।
- একটি উচ্চ স্কোরে প্রতিক্রিয়া জানানোর আগে অপরিহার্য জটিলতা (একটি প্রকৃতপক্ষে কঠিন সমস্যা থেকে) কে দুর্ঘটনাজনিত জটিলতা (ভালো নকশার মাধ্যমে এড়ানো যায়) থেকে পৃথক করুন।
- বিভাজন কারচুপির জন্য দেখুন: কোনো কিছু প্রকৃতপক্ষে সরল না করেই একটি স্কোর কমাতে কোড বিভক্ত করা।
- মানুষের পর্যালোচনা ও পুনর্গঠন প্রচেষ্টা পরিচালনা করতে ট্রিয়াজের জন্য জটিলতা মেট্রিক ব্যবহার করুন, একটি ব্যক্তিগত স্কোরকার্ড বা একটি কঠোর স্বয়ংক্রিয় গেট হিসেবে নয়।
- আপনার নিজের কোডবেসের বিতরণে প্রান্তিক ক্যালিব্রেট করুন, এবং শুধু একটি সমতল গড় নয়, প্রবণতা ও আউটলায়ার ট্র্যাক করুন।
তথ্যসূত্র এবং অতিরিক্ত পাঠ
- McCabe, Thomas J. “A Complexity Measure.” IEEE Transactions on Software Engineering, 1976.
- McConnell, Steve. Code Complete: A Practical Handbook of Software Construction. Microsoft Press, 2004.
- Feathers, Michael. Working Effectively with Legacy Code. Prentice Hall, 2004.
- Campbell, G. Ann. “Cognitive Complexity: A New Way of Measuring Understandability.” SonarSource, 2018.