سناریوهایی که هیچوقت اتفاق نمیافتن... تا وقتی که میافتن
خلاصهٔ کاملتر
نویسنده با یه تنش آشنا شروع میکنه: موقع طراحی مدل داده، آدمای «بیزنسی» فقط به مسیر خوشحال و اکثریت کاربرا فکر میکنن، ولی آدمای «فنی» نگران تکتک edge caseان. آخرش معمولاً تصمیم با رهبر تیمه و وقتی بودجه کمه، گروه اول میگه «این اتفاق نمیافته!».
مثال مقاله رزرو هتله. مدل داده یه تاریخ شروع و پایان، شناسهی مشتری و یه لیست از دستهبندیها (categories) داره:
type HotelBooking = {
startDate: Date;
endDate: Date;
customerId: string;
categories: HotelBookingCategories;
};دستهبندیها هم منشأهای مختلفی دارن: نوع اتاق، جای پارک، یا اینکه صبحونه و شام شامل میشه یا نه. تیم تصمیم گرفت اونا رو فقط یه لیست از شناسهها (string[]) نگه داره و حدود دو سال خوب کار کرد.
بعد یه نیاز جدید اومد: بعضی هتلها اسپا دارن که مهمون فقط یکیدو بار توی کل اقامتش میتونه ازش استفاده کنه، نه هر روز. برای همین یه فیلد جدید به اسم categoriesByDate اضافه کردن که دستهبندیهای مخصوص هر تاریخ رو نگه میداشت. این تغییر بکاورد-کامپتیبل بود و migration نمیخواست. برای راحتی، توی بعضی جاها مثل نمایش، API هم دستهبندیهای «سراسری» رو به هر روزِ رزرو اضافه میکرد.
دو ماه بعد یه تیکت عجیب اومد: برای یه هتل، منطق نمایش جدید بهشدت کند شده بود. علتش این بود که بعضی رزروها یه سال کامل طول میکشیدن — یعنی ۳۶۵ کپی از حدود ۱۵ پکیج. چندتا از این رزروها رو که ضرب کنی، میرسی به بیشتر از صد هزار پکیج برای پردازش. درست همون سؤالی که توی بحث edge case پرسیده شده بود («یه رزرو چقدر میتونه طولانی باشه؟») رو همه با تکیه بر تجربهی واقعی، «حداکثر یه ماه» فرض کرده بودن.
راهحل نهایی این بود که هر دو فیلد categories و categoriesByDate رو همهجا هندل کنن؛ کد کمی پیچیدهتر ولی خیلی پرفورمنستر شد و در کل حدود ۸۰ خط بهش اضافه شد. نتیجهی اخلاقی اینه که تیم دوباره با edge caseهای دیوونهواری که کاربرا ناخواسته میسازن، فروتن شد.
نکات کلیدی:
- فرض «این اتفاق نمیافته» دربارهی طول رزرو، بعداً به یه باگ پرفورمنس جدی تبدیل شد.
- اضافه کردن categoriesByDate و کپی کردن دستهبندیها برای هر روز، با یه رزرو یکساله انفجاری شد.
- یه رزرو ۳۶۵ روزه یعنی صدهزار پکیج برای پردازش که مرورگر رو فلج کرد.
- بررسی نکردن سقف یه مقدار (مثل حداکثر طول اقامت) میتونه دقیقاً همون edge case خطرناک باشه.




