কোড পুনরায় ব্যবহারযোগ্যতা বনাম দুর্ঘটনা সাধারণতা

নিকটতম, sensকমত্য-সমালোচনামূলক বাগগুলির মধ্যে একটি (সিভিই-2018–17144) সম্প্রতি বিটকয়েন কোর সফ্টওয়্যারটিতে আবিষ্কৃত হয়েছে, যে বিন্দুটির আগে প্রায় এক অনবদ্য ইতিহাস ছিল। জিমি গান এই বাগের একটি দুর্দান্ত ভাঙ্গন রচনা করেছে।

বাগের সংক্ষিপ্তসারটি হ'ল এমন 4 টি মামলা রয়েছে যেখানে বিটকয়েন কোর সফ্টওয়্যারটির দ্বিগুণ ব্যয়ের জন্য পরীক্ষা করা দরকার। সমস্ত 4 টি ক্ষেত্রে প্রাথমিকভাবে একই কোড প্রয়োগের প্রবাহ ভাগ করে নেওয়া হয়েছিল। কোডটি বেশ কয়েক বছর ধরে কিছু সূক্ষ্ম পুনরাবৃত্তির পরে, 4 টির একটির ক্ষেত্রে ("সিঙ্গেল-টিএক্স-ডাবল-ব্যয়-ইন-এ-ব্লক") এড়িয়ে যায়, যা কোনও খনি শ্রমিককে কিছু নোড সম্ভাব্যরূপে কোনও ব্লক গ্রহণে চালিত করতে দেয়? যা বিটকয়েন সরবরাহ সরবরাহ করে।

এই বাগের প্রকৃতি আমাকে মধ্যে ক্রমাগত দ্বন্দ্বের কথা মনে করিয়ে দেয়:

(ক) কোড পুনরায় ব্যবহারযোগ্যতা এবং অপ্টিমাইজেশনের প্রয়োজন

(খ) আমি যা দুর্ঘটনাজনিত সাধারণতা বলেছি তার পতনের ঝুঁকি: জিনিসগুলি যা নকশার দ্বারা নয়, দুর্ঘটনার দ্বারা অনুরূপ

দুর্ঘটনাজনিত সাধারণতা সিভিই-2018–17144 এর মতো দুঃস্বপ্ন এবং সম্ভাব্য বাগগুলি সংশোধন করার জন্য একটি উর্বর স্থল তৈরি করে।

দুর্ঘটনাজনিত সাধারণতা

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

সুতরাং কোড পুনর্ব্যবহারযোগ্যতার জন্য সর্বদা একটি শক্তিশালী চাপ আছে। রিডানড্যান্ট কোড লেখা প্রায়শই ভ্রূণ্য হয়। একবারে একবার করতে পারলে একই কাজ কেন?

সফ্টওয়্যারটিতে পুনর্নবীকরণের চাকাটির দীর্ঘ ইতিহাস রয়েছে যা কোড পুনর্ব্যবহারযোগ্যতাটিকেও অগ্রাধিকার তালিকার উচ্চতর অগ্রাধিকার দেয়। কোড পুনঃব্যবহারযোগ্যতা প্রায়শই শিল্পের অন্যতম "সেরা অনুশীলন" হিসাবে বিবেচিত হয়। একটি উচ্চাকাঙ্ক্ষী জুনিয়র সফ্টওয়্যার বিকাশকারী মনে করতে ঝোঁক হতে পারে যে কোড পুনরায় ব্যবহারযোগ্যতার শূন্যতম নেতিবাচক দিক রয়েছে।

তবে একটি গোপনীয় বিপদ রয়েছে - এবং আমি বিশ্বাস করি না যে এই জিনিসগুলি স্কুলে সর্বদা সঠিকভাবে শেখানো হয় - চরম কোড পুনরায় ব্যবহারযোগ্যতার।

চরম কোডের পুনঃব্যবহারযোগ্যতা মানে ব্যবহারের ক্ষেত্রে এবং আসল উদ্দেশ্য নির্বিশেষে কোনও দুটি অনুরূপ দেখতে কোডের টুকরোগুলিকে একটিতে ভাঙ্গা ভাঙা।

যা অনেক সময় কোড সহ শেষ হয় যা দুর্ঘটনাজনিত সাধারণতা রয়েছে।

দুর্ঘটনাজনিত সাধারণতা কেন খারাপ তা এটি স্পষ্ট নাও হতে পারে তবে কেন এটি বুঝতে দীর্ঘ সময়ের জন্য পর্যাপ্ত পরিমাণে একটি বৃহত সফ্টওয়্যার প্রকল্প বজায় রাখতে হবে।

এটি খারাপ কারণ পণ্যের প্রয়োজনীয়তা পরিবর্তন হয় এবং সফ্টওয়্যারটি একটি চির-বিকশিত, কখনও-সম্পূর্ণ-সমাপ্ত পণ্য নয়।

এই ধ্রুবক-চলমান-লক্ষ্য সমস্যাটি সফ্টওয়্যারটির পক্ষে বেশ অনন্য। আপনি যদি স্ট্রাকচারাল ইঞ্জিনিয়ার হন তবে আপনার কোনও ঘর 20-তলা উচ্চ-বৃদ্ধি বা একটি গাড়িকে একটি উড়ন্ত তুষিতে পরিণত করার প্রত্যাশা করা হয় না। তবুও সফ্টওয়্যারটিতে আমরা প্রতিনিয়ত এটি করি।

যখন পণ্যের প্রয়োজনীয়তা এবং ব্যবহারের কেসগুলি পরিবর্তিত হয়, তখন সফ্টওয়্যারটি প্রাথমিকভাবে রচিত হয়েছিল এমন অন্তর্নিহিত অনুমানগুলি আর কার্যকর হয় না।

সুতরাং সেই গর্বিত টুকরোটি সাধারণ কোড যা আপনি রিফ্যাক্ট করেছেন (তবে এখন সম্পূর্ণরূপে ভুলে গেছেন) আপনার মনে হয় সেইভাবে আর কাজ করে না।

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

দুর্ঘটনাক্রমে সাধারণ জিনিসগুলি যখন তাদের প্রাথমিক অবস্থার বাইরে চলে যায় তখন দ্রুত তাদের পার্থক্য প্রকাশ করে। কোডের সাধারণতার যে কোনও অনড়তা তা থেকে মুক্তি পাওয়ার পক্ষে এক বিশাল নিষেধাজ্ঞা।

কোডে দুর্ঘটনাজনিত সাধারণতার যত স্তর রয়েছে, তত বেশি একটি মাইনফিল্ড নেভিগেট করা। CVE-2018–17144 এর একটি নিখুঁত উদাহরণ।