منطق ایجنت‌ها › M8 — ساختن، خودکارکردن، تحویل‌دادن
۸.۷ پایدار تدریسی ~۳۰ دقیقه

تست و پایداری

قبل از این فصل: فصل ۴.۴

در یک نگاه

۸.۷.۱

تست با ورودی جدید

اتوماسیونت روی داده‌ای که با آن ساختی‌اش کار می‌کند. این تقریباً هیچ‌چیز نمی‌گوید — چون ناخودآگاه آن را طوری ساخته‌ای که با همان داده جور دربیاید.

تستِ واقعی یعنی ورودی‌هایی که ندیده. شش تای همیشگی، که همه‌شان در کارِ واقعی پیش می‌آیند:

و بهترین خبرِ این فصل: لازم نیست خودت این ورودی‌ها را بسازی. از ایجنت بخواه — «شش ورودی بساز که این کار را بشکنند» — و او در ساختنِ حالت‌های لبه از تو بهتر است، چون سوگیریِ سازنده را ندارد.

۸.۷.۲

وقتی چیزی در دنیای بیرون عوض شود

تستِ بالا ورودی را می‌سنجد. ولی خیلی از شکست‌ها از ورودی نمی‌آیند — از تغییرِ چیزی می‌آیند که هیچ‌وقت به آن فکر نکرده‌ای:

وجه مشترکشان: هیچ‌کدام تقصیرِ تو نیستند، و هیچ‌کدام هم اطلاع نمی‌دهند. پس نمی‌شود جلویشان را گرفت — فقط می‌شود کاری کرد که وقتی اتفاق افتادند، بفهمی. که دو بخش بعد دقیقاً همین است.

۸.۷.۳

اعلان خطا: چطور بفهمی خراب شده

قاعده‌ی ساده: خطا باید به جایی برود که تو هستی — همان منطق مقصدِ فصل ۸.۵.۵، این بار برای خطاها.

سه سطح، و هر سه را لازم داری:

  1. ثبت رخداد. هر اجرا یک سطر بنویسد: کِی اجرا شد، چند ردیف پردازش شد، چقدر طول کشید، موفق بود یا نه. این ارزان‌ترین کارِ این فصل است و بیشترین کمک را می‌کند — چون تاریخچه می‌سازد.
  2. اعلان خطا. اگر شکست خورد، پیام بدهد — با اینکه کجا شکست خورد، نه فقط «خطا رخ داد».
  3. و ضربانِ زنده‌بودن. بخش بعد.

و یک نکته‌ی مهم درباره‌ی ثبت رخداد: «چند ردیف پردازش شد» را حتماً بنویس. این تنها عددی است که شکستِ نیمه را لو می‌دهد — کاری که «موفق» گزارش شده ولی به‌جای ۱۱ ردیف، ۳ ردیف را دیده. بدون این عدد، آن شکست هیچ‌وقت دیده نمی‌شود.

۸.۷.۴

شکست بی‌صدا، بدترین نوع شکست

و حالا جانِ فصل.

به‌خاطر بسپار خطایی که داد می‌زند، مشکلِ تو نیست — می‌بینی‌اش و درستش می‌کنی. مشکل آن چیزی است که همچنان «موفق» گزارش می‌دهد، در حالی که کارش را درست انجام نمی‌دهد.

چهار شکلِ رایجش، که همه‌شان بی‌صدا هستند:

و دفاع در برابر هر چهار، یک چیز است: ضربانِ زنده‌بودن.

یعنی اتوماسیون هر بار چیزی بفرستد — حتی وقتی خبری نیست. «امروز اجرا شد، ۱۱ ردیف، هیچ تغییری نبود.» آن‌وقت:

این ساده‌ترین و مؤثرترین محافظتِ کلِ این ماژول است، و اکثر اتوماسیون‌های خانگی ندارندش — چون در روزهای سالم، اضافی به نظر می‌رسد.

نکته‌ی طلایی یک بار در ماه، عمداً خرابش کن — کلید را عوض کن، یا فایل ورودی را جابه‌جا کن — و ببین آیا واقعاً خبردار می‌شوی. اعلانی که تست نشده، اعلان نیست؛ فقط کدی است که فرض می‌کنی کار می‌کند. و این دقیقاً همان فرضی است که در بدترین لحظه غلط از آب درمی‌آید.
ضدالگو خاموش‌کردن اعلان‌ها چون «زیاد شده‌اند». اگر اعلان‌ها آزاردهنده شده‌اند، یعنی یا زیادی حساس‌اند یا واقعاً چیزی خراب است — و در هر دو حالت خاموش‌کردن جواب نیست. اعلانی که همیشه می‌آید، همان‌قدر بی‌فایده است که اعلانی که هیچ‌وقت نمی‌آید؛ فقط باید آستانهاش را درست کنی.

تمرین (ساختنی + توضیحی)

یک ورودی عجیب بده به اتوماسیونت — از شش تای بخش ۸.۷.۱ انتخاب کن، یا از ایجنت بخواه بسازد. بعد بنویس:

  1. چطور شکست؟ خطا داد، یا بی‌صدا چیزِ غلطی ساخت؟
  2. چطور فهمیدی؟ — و اگر خودت دستی چک نمی‌کردی، می‌فهمیدی؟
  3. چه چیزی اضافه کردی که دفعه‌ی بعد خودش بگوید؟
پاسخنامه — دو شکست، و اینکه چرا دومی خطرناک‌تر است

شکست ۱ — فایل با یک ستون کم. خطا داد و متوقف شد. پرصدا. فهمیدنش راحت بود چون هیچ خروجی‌ای نیامد و پیام خطا واضح بود. این شکستِ خوب است — نیم ساعت وقت گرفت و تمام شد.

شکست ۲ — فایل خالی. خطا نداد. گزارش ساخت، با جمعِ صفر، و به تلگرام فرستاد: «فروش امروز: ۰». بی‌صدا.

و چرا این خطرناک‌تر است: چون «۰» یک عددِ کاملاً معتبر است. اگر روزِ تعطیل باشد، درست هم هست. من فقط به این دلیل فهمیدم که می‌دانستم آن روز سفارش داشتیم. اگر روزِ شلوغی نبود، ماه‌ها می‌توانست ادامه پیدا کند و من فکر می‌کردم فروش افت کرده.

چه چیزی اضافه شد: دو چیز، و هر دو کوچک‌اند. اول شمارش ردیف در خروجی: «۰ سفارش از ۰ ردیف خوانده‌شده» فوراً با «۰ سفارش از ۱۱ ردیف» فرق دارد و می‌گوید مشکل کجاست. دوم یک بررسی معقول‌بودن: اگر تعداد ردیف‌های ورودی صفر بود، به‌جای گزارش، هشدار بده.

و جوابِ صادقانه به سؤال ۲ همان چیزی است که این تمرین دنبالش بود: نه، بدون چک دستی نمی‌فهمیدم. اگر جواب تو هم همین است، تمرین را درست انجام داده‌ای — و حالا می‌دانی چرا بخش ۸.۷.۴ اسمِ «بدترین نوع شکست» را رویش گذاشت.

ذخیره شد