প্রথম দিনেই Seam তৈরি করুন

উচ্চ-ভলিউমের ডেটার জন্য একটি প্ল্যাটফর্ম তৈরি করতে গেলে আপনাকে একটি সিদ্ধান্ত নিতে হবে।

দীর্ঘমেয়াদী স্টোরেজের জন্য আপনার একটি দ্রুত ডেটাবেস প্রয়োজন। কিন্তু প্রথম দিনেই একটি জটিল সিস্টেম সেটআপ করা কঠিন। আপনি হয়তো আপনার ডেটার প্যাটার্ন সম্পর্কে এখনও জানেন না। সেক্ষেত্রে নিরাপদ পছন্দ হলো একটি স্ট্যান্ডার্ড রিলেশনাল ডেটাবেস যা আপনি ইতিমধ্যে ব্যবহার করছেন।

ভুলটি হলো আপনার কোডকে সরাসরি সেই প্রথম ডেটাবেসের সাথে যুক্ত করে ফেলা। যদি আপনার অ্যাপের প্রতিটি অংশ সরাসরি ডেটাবেস কল করে, তবে আপনি একটি ফাঁদ তৈরি করছেন। পরবর্তীতে একটি উন্নত ডেটাবেসে পরিবর্তন করতে হলে আপনাকে বিশাল একটি রিফ্যাক্টর (refactor) করতে হবে।

সঠিক পদক্ষেপ হলো একটি seam তৈরি করা।

একটি seam হলো একটি contract। এটি সিস্টেমটি কী কাজ করে তা সংজ্ঞায়িত করে, কিন্তু কীভাবে করে তা বলে না।

  • কাজের জন্য একটি interface তৈরি করুন।
  • আপনার বর্তমান ডেটাবেস ব্যবহার করে একটি বেসিক driver লিখুন।
  • সেই driver-টিকে interface-এর সাথে যুক্ত করুন।

আপনার অ্যাপের অন্য প্রতিটি অংশ শুধুমাত্র interface-এর সাথে কথা বলে। ব্যাকগ্রাউন্ডে কোন ডেটাবেস চলছে তা কেউ জানে না।

যখন আপনার ডেটা বৃদ্ধি পাবে এবং আপনার একটি দ্রুত সিস্টেমের প্রয়োজন হবে, তখন কাজটি হবে সহজ। আপনি একটি নতুন driver লিখবেন, কোডের মাত্র একটি লাইন পরিবর্তন করবেন এবং সেটি শিপ (ship) করবেন। কোনো ড্যাশবোর্ড ভেঙে পড়বে না। কোনো পাইপলাইন থেমে যাবে না।

কেউ কেউ একে premature abstraction বলেন। তারা বলেন যে আপনার এটি এখনই প্রয়োজন নেই।

আমি দ্বিমত পোষণ করি। একটি interface-এর জন্য আপনার অতিরিক্ত মাত্র একটি ফাইল প্রয়োজন হয়। এটি এড়িয়ে যাওয়া মানে কেবল খরচটিকে ভবিষ্যতের জন্য জমিয়ে রাখা। যখন আপনার শেষ পর্যন্ত পরিবর্তনের প্রয়োজন হবে, তখন চাপের মুখে আপনাকে শত শত ফাইল ঠিক করতে হবে। একটি interface হলো একটি সস্তা বিমা (insurance)।

আপনার seam-গুলোকে আরও শক্তিশালী করতে এই তিনটি অভ্যাস অনুসরণ করুন:

  • Dual identifiers ব্যবহার করুন। ইন্টারনাল ডেটাবেস joins-এর জন্য দ্রুত integers ব্যবহার করুন। সিস্টেমের বাইরে যা কিছু যায় তার জন্য UUID ব্যবহার করুন। এটি আপনার ডেটাকে সুরক্ষিত রাখে এবং joins দ্রুত করে।

  • Shared vocabulary হিসেবে Enums ব্যবহার করুন। স্ট্যাটাস বা severities-এর জন্য এলোমেলো strings ব্যবহার করবেন না। একটি মাত্র Enum ব্যবহার করুন যাতে আপনার অ্যাপের প্রতিটি অংশ একই ভাষায় কথা বলে।

  • ডেটার জন্য versioned envelopes ব্যবহার করুন। যদি আপনার সিস্টেম অনেক উৎস থেকে ডেটা গ্রহণ করে, তবে একটি কঠোর schema ব্যবহার করুন। শুধুমাত্র নতুন fields যোগ করুন। নতুন version ছাড়া কখনোই সেগুলো মুছে ফেলবেন না বা নাম পরিবর্তন করবেন না। এটি সিস্টেম উন্নত করার সময় পুরনো clients-দের সচল রাখতে সাহায্য করে।

সীমানাটি খুঁজে বের করুন। একটি contract দিয়ে এর নাম দিন। একটি সহজ implementation দিয়ে এটি পূর্ণ করুন।

Contract হলো আপনার প্রতিশ্রুতি। Driver হলো আজ সেই প্রতিশ্রুতি রক্ষা করার একটি উপায় মাত্র।

Source: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b