محیطها و پیکربندی: چرا «روی آزمون کار میکرد»

«روی محیط آزمون کار میکرد» جملهای است که هر تیمی گفته، و تقریباً همیشه راست است. کد همان کد بوده. چیزی که فرق داشته، محیط بوده.
و این دسته از باگها ویژگی آزاردهندهای دارند: هیچ تستی نمیگیردشان، چون تست هم در همان محیطی اجرا شده که با تولید فرق دارد. تنها راه کم کردنشان این است که اختلاف محیطها را عمداً و آگاهانه مدیریت کنید.
چند محیط لازم است
جواب متعارف چهار تاست، ولی هر چهار تا برای هر پروژه لازم نیست.
توسعه — روی ماشین برنامهنویس. هدفش سرعت است، نه شباهت به تولید.
آزمون خودکار — جایی که خط لوله تستها را اجرا میکند. با هر اجرا از نو ساخته و پاک میشود. کسی دستی به آن دست نمیزند.
پیشتولید — نزدیکترین به تولید، برای تست پذیرش و تمرین انتشار. این همان محیطی است که بیشتر از همه لازم است و بیشتر از همه حذف میشود.
تولید.
برای یک سامانهٔ داخلی کوچک، سهتا کافی است. برای سامانهای که پول جابهجا میکند یا مهاجرت داده در پیش دارد، پیشتولید قابل حذف نیست — چون تنها جایی است که میشود مهاجرت را با حجم واقعی تمرین کرد.
چه چیزی باید شبیه تولید باشد
منابع سختافزاری یکسان معمولاً نه لازم است نه شدنی. آنچه واقعاً اهمیت دارد، به ترتیب:
۱. نسخهٔ همهچیز. پایگاه داده، زمان اجرا، سیستمعامل. اختلاف نسخهٔ جزئی پایگاه داده، رفتار پرسوجو را عوض میکند.
۲. حجم و شکل داده. پرسوجویی که روی پنج هزار رکورد سریع است، روی دو میلیون رکورد سامانه را میخواباند. این تنها اختلافی است که مستقیم به یک دسته باگ ختم میشود — کارایی پایگاه داده.
۳. توپولوژی. یک نمونهٔ سرویس در آزمون و چهار نمونه در تولید یعنی مسائل همزمانی و وضعیت مشترک فقط در تولید دیده میشوند. اگر تولید چند نمونه دارد، آزمون هم باید دستکم دو تا داشته باشد.
۴. سرویسهای بیرونی. درگاه پرداخت، پیامک، سامانهٔ مالیاتی. اگر محیط آزمایشی دارند، از آن استفاده کنید؛ اگر ندارند، شبیهساز بنویسید — ولی شبیهسازی باید حالت خطا و تأخیر را هم داشته باشد، وگرنه فقط مسیر خوشبینانه را تست کردهاید. این نکته در مدیریت خطا هم مطرح است.
۵. تنظیمات امنیتی. محیط آزمونی که احراز هویتش خاموش است، رفتار متفاوتی دارد و باگهای دسترسی را پنهان میکند.
آنچه معمولاً لازم نیست یکسان باشد: قدرت پردازش، تعداد هسته، پهنای باند.
یک خروجی، چند پیکربندی
قاعدهٔ مرکزی: خروجی بیلد یک بار ساخته میشود و در همهٔ محیطها همان است. آنچه عوض میشود پیکربندی است.
اگر برای تولید دوباره بیلد میکنید، چیزی که تست شده آن چیزی نیست که منتشر میشود — و همهٔ زحمت تست، یک درجه اعتبارش را از دست میدهد.
پس پیکربندی از بیرون میآید: متغیر محیطی یا سرویس پیکربندی، نه فایلی که در خروجی بیلد جاسازی شده.
سه چیزی که در پیکربندی میآیند: آدرسها و اتصالها، اعتبارنامهها، و پرچمهای قابلیت — که راهبرد استقرار دربارهٔ آنهاست.
رازها، که پیکربندی معمولی نیستند
رمز پایگاه داده و کلید درگاه پرداخت، پیکربندیاند ولی با بقیه یک رفتار ندارند. سه قاعده:
هیچوقت در مخزن. حتی در شاخهٔ خصوصی، حتی «موقتاً». پاک کردن راز از تاریخچهٔ مخزن، کار جداگانهای است و معمولاً ناقص انجام میشود.
اسکن خودکار در خط لوله. چند ثانیه هزینه، و جلوی گرانترین اشتباه را میگیرد.
راز هر محیط جداست. استفاده از کلید تولید در محیط آزمون، متداولتر از چیزی است که فکر میکنید — و یعنی هر کسی که به آزمون دسترسی دارد، عملاً به تولید هم دارد.
مفصلتر در مدیریت رازها.
اعتبارسنجی پیکربندی در زمان شروع
الگویی که ارزان است و مکرراً از قلم میافتد: برنامه در لحظهٔ بالا آمدن، همهٔ تنظیمات لازم را بررسی کند و اگر چیزی نبود یا بدشکل بود، بالا نیاید.
بدون این، تنظیم غلط بهصورت یک خطای عجیب در ساعت سه بعدازظهر خودش را نشان میدهد — وقتی اولین کاربر به آن مسیر میرسد. با این، در ثانیهٔ اول استقرار معلوم میشود، با پیامی که دقیقاً میگوید کدام تنظیم.
اختلافهایی که مخفی میمانند
سه چیزی که در فهرستهای متعارف نیستند و در عمل باگ میسازند:
منطقهٔ زمانی. سروری با UTC و سروری با وقت محلی، دو رفتار متفاوت در گزارشهای روزانه و کارهای زمانبندیشده میدهند. تصمیم را یک بار بگیرید و همهجا اعمالش کنید — و در سامانههای فارسی، تبدیل تاریخ شمسی را هم به همان تصمیم گره بزنید.
کدگذاری و ترتیب مقایسه. تنظیمات متفاوت مقایسهٔ رشته در پایگاه داده یعنی جستوجوی فارسی در آزمون و تولید نتیجهٔ متفاوت میدهد. ریشههای این مسئله در وب فارسی و چالشهای پردازش زبان فارسی توضیح داده شده.
کارهای زمانبندیشده. محیط آزمونی که همان کارهای دورهای تولید را اجرا میکند، ممکن است ایمیل واقعی بفرستد یا با سامانهٔ بیرونی واقعی حرف بزند. تفکیکش را صریح بنویسید — کارهای پسزمینه.
و مستند کردن اختلافها
هیچ سازمانی محیطهای کاملاً یکسان ندارد. آنچه سازمان بالغ را متمایز میکند این است که میداند اختلافها کجاست.
یک جدول کوتاه، در همان جایی که زیرساخت مستند میشود: برای هر محیط، چه چیزی مثل تولید است و چه چیزی نیست، و چرا.
این جدول در دو لحظه کار میکند. اول، وقتی باگی فقط در تولید رخ میدهد — فهرست مظنونها از قبل نوشته شده. دوم، وقتی کسی میپرسد «آیا این را واقعاً تست کردهایم؟» و جواب دقیقی لازم است.