বছরের পর বছর ফর্ম পূরণ আর অপেক্ষা করার পর, অবশেষে আপনি আপনার ব্যাংকিং লাইসেন্স পেয়ে গেছেন। এর মানে হলো, এখন আপনি আনুষ্ঠানিকভাবে নিজের একটি ব্যাংক খোলার যোগ্যতা পেয়ে গেছেন, বাহ!
আপনার প্রথম কাজ হলো IT সিস্টেমগুলো চালু করা। একদিনের কঠোর পরিশ্রমের পর আপনি ইতিমধ্যেই অ্যাকাউন্ট খুলতে ও বন্ধ করতে পারছেন, আর উইথড্র ও ডিপোজিটও সামলাতে পারছেন।
টেস্ট লিখতে আপনার আলসেমি লাগছিল বলে, সিস্টেমটি টেস্ট করতে সাহায্যের জন্য আপনি কিছু বন্ধুকে ডেকে আনলেন। কিন্তু মাত্র পাঁচ মিনিটের মধ্যেই আপনার একজন বন্ধু দাবি করল যে তার টাকা হারিয়ে গেছে! আপনার কোডে কোনো বাগ নেই বলে আপনি নিশ্চিত, তবুও তদন্ত করতে আপনি লগগুলো দেখা শুরু করলেন।
আহা, ঠিক যেমনটা আপনি সন্দেহ করেছিলেন, দোষটা আপনার বন্ধুরই! সে তার টেস্ট ক্রেডেনশিয়াল আরেক বন্ধুর সাথে শেয়ার করেছিল, আর দুজনে মিলে ষড়যন্ত্র করে একই অ্যাকাউন্টে প্যারালালে ডিপোজিট ও উইথড্র করতে শুরু করেছিল। এমন কাজ কে-ই বা করে?
কারও পক্ষে প্যারালালে নিজের অ্যাকাউন্টে ঢোকা শারীরিকভাবে অসম্ভব বলে আপনি যখন তর্ক করছেন, তখনই আপনার বন্ধু আত্মতুষ্ট ভঙ্গিতে আপনাকে জানাল যে ব্যাংকের নিয়ম এটিকে সমর্থন করা আপনার জন্য বাধ্যতামূলক করে দিয়েছে। তাই প্যারালাল ব্যাংকিং সাপোর্ট নেই মানে গো-লাইভের সিগন্যালও নেই। দীর্ঘশ্বাস ফেলে আপনি মনে মনে টুকে নিলেন, কাল এটা নিয়ে কাজ করতে হবে। এতে আপনার লঞ্চের তারিখ অন্তত আরও একদিন পিছিয়ে যাবে, কিন্তু, যা হোক...
আপনার কাজ হলো এমন ব্যাংক অ্যাকাউন্ট তৈরি করা যেগুলোতে অ্যাকাউন্ট খোলা/বন্ধ করা, টাকা জমা এবং টাকা উত্তোলনের সুবিধা থাকবে।
যেহেতু ব্যাংক অ্যাকাউন্টে নানা রকমভাবে (ইন্টারনেট, মোবাইল ফোন, স্বয়ংক্রিয় চার্জ) ঢোকা যায়, তাই আপনার ব্যাংক সফটওয়্যারকে অবশ্যই একাধিক থ্রেড/প্রসেস থেকে (পরিভাষাটি আপনার প্রোগ্রামিং ভাষার উপর নির্ভর করে) সমান্তরালভাবে অ্যাকাউন্টে নিরাপদে ঢোকার সুবিধা দিতে হবে। উদাহরণস্বরূপ, একসাথে অনেক জমা ও উত্তোলন ঘটতে পারে; অ্যাকাউন্টের ব্যালেন্স পড়ার এবং নতুন ব্যালেন্স সেট করার মধ্যে যেন কোনো রেস কন্ডিশন না থাকে, তা আপনাকে নিশ্চিত করতে হবে।
একটি অ্যাকাউন্ট বন্ধ করা সম্ভব হওয়া উচিত; বন্ধ অ্যাকাউন্টে করা যেকোনো কাজ ব্যর্থ হতে হবে।
Python, Global Interpreter Lock-এর কারণে "প্রকৃত" কনকারেন্সি সাপোর্ট করে না। Python-এ free-threading সমর্থন তৈরির কাজ চলছে, তবে এটি এখনও পরীক্ষামূলক। বর্তমান স্ট্যান্ডার্ড লাইব্রেরির সমাধান, যেমন multiprocessing আর threading, বর্তমান ট্র্যাক টুলিং দিয়ে বাস্তবায়ন করা কঠিন।
ফলে, এই অনুশীলনীর জন্য কনকারেন্সির প্রয়োজনীয়তাটি আপাতত সরিয়ে রাখা হয়েছে। অ্যাকাউন্টের কাজকর্ম একটি একক থ্রেডে ক্রমান্বয়ে চলে, এবং কোনো কনকারেন্সি বা "রেস কন্ডিশন" টেস্ট চালানো হয় না।
আপনি যদি free-threading বা কনকারেন্সি টেস্ট নিয়ে পরীক্ষানিরীক্ষা করতে চান, তাহলে অনুরোধ করি সেটি স্থানীয়ভাবে করুন। স্থানীয়ভাবে অনুশীলনী ডাউনলোড করে তা নিয়ে কাজ করার সাহায্যের জন্য আমরা Exercism CLI ব্যবহারের পরামর্শ দিই।
কখনও কখনও এক্সেপশন রেইজ করা প্রয়োজন হয়। এটি করার সময়, এররের উৎস কী তা বোঝাতে সর্বদা একটি অর্থবহ এরর মেসেজ যোগ করা উচিত। এতে আপনার কোড আরও পাঠযোগ্য হয় এবং debugging-এ অনেক সাহায্য করে। যেসব ক্ষেত্রে আপনি জানেন যে এররের উৎস নির্দিষ্ট কোনো টাইপ হবে, সেখানে আপনি বিল্ট-ইন এরর টাইপগুলোর যেকোনো একটি রেইজ করা বেছে নিতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যোগ করা উচিত।
এই নির্দিষ্ট অনুশীলনীতে চাওয়া হয়েছে, অ্যাকাউন্ট খোলা থাকলে বা না থাকলে, কিংবা উত্তোলন/জমার পরিমাণ ভুল হলে, আপনি raise স্টেটমেন্ট দিয়ে একটি ValueError "থ্রো" করবেন। টেস্ট পাস হবে কেবল তখনই, যদি আপনি exception raise করেন এবং তার সঙ্গে একটি মেসেজও যোগ করেন।
একটি মেসেজসহ ValueError রেইজ করতে, মেসেজটি exception টাইপের আর্গুমেন্ট হিসেবে লিখুন:
# account is not open
raise ValueError('account not open')
# account is already open
raise ValueError('account already open')
# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')
# withdrawal is too big
raise ValueError('amount must be less than balance')
Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।