تست با ورودی جدید
اتوماسیونت روی دادهای که با آن ساختیاش کار میکند. این تقریباً هیچچیز نمیگوید — چون ناخودآگاه آن را طوری ساختهای که با همان داده جور دربیاید.
تستِ واقعی یعنی ورودیهایی که ندیده. شش تای همیشگی، که همهشان در کارِ واقعی پیش میآیند:
- خالی. فایلی بدون هیچ ردیف. آیا خطا میدهد یا گزارشِ صفر میسازد؟ هر دو قابل قبول است — بیصدا هیچکاری نکردن نیست.
- خیلی بزرگ. ده برابرِ حالت عادی.
- با یک ستون کم یا اضافه.
- با کاراکترهای عجیب — ی و ک عربی، نیمفاصله، ارقام فارسی (فصل ۴.۲.۱).
- با مقدارِ منفی یا صفر جایی که انتظارش را نداری. یادت باشد فصل ۸.۲: صفر یک مقدار است، نه نبودِ مقدار.
- و دو بار پشت سر هم (فصل ۸.۶.۲).
و بهترین خبرِ این فصل: لازم نیست خودت این ورودیها را بسازی. از ایجنت بخواه — «شش ورودی بساز که این کار را بشکنند» — و او در ساختنِ حالتهای لبه از تو بهتر است، چون سوگیریِ سازنده را ندارد.
وقتی چیزی در دنیای بیرون عوض شود
تستِ بالا ورودی را میسنجد. ولی خیلی از شکستها از ورودی نمیآیند — از تغییرِ چیزی میآیند که هیچوقت به آن فکر نکردهای:
- منبع بیرونی عوض شد (فصل ۸.۴.۵).
- کلید منقضی شد (فصل ۷.۵).
- مسیر فایلی عوض شد، یا پوشهای جابهجا شد.
- ابزاری بهروز شد و رفتارش کمی فرق کرد.
- یا سالِ شمسی عوض شد — و کدی که فرض کرده بود همهی تاریخها با ۱۴۰۵ شروع میشوند، ناگهان چیزی پیدا نمیکند.
وجه مشترکشان: هیچکدام تقصیرِ تو نیستند، و هیچکدام هم اطلاع نمیدهند. پس نمیشود جلویشان را گرفت — فقط میشود کاری کرد که وقتی اتفاق افتادند، بفهمی. که دو بخش بعد دقیقاً همین است.
اعلان خطا: چطور بفهمی خراب شده
قاعدهی ساده: خطا باید به جایی برود که تو هستی — همان منطق مقصدِ فصل ۸.۵.۵، این بار برای خطاها.
سه سطح، و هر سه را لازم داری:
- ثبت رخداد. هر اجرا یک سطر بنویسد: کِی اجرا شد، چند ردیف پردازش شد، چقدر طول کشید، موفق بود یا نه. این ارزانترین کارِ این فصل است و بیشترین کمک را میکند — چون تاریخچه میسازد.
- اعلان خطا. اگر شکست خورد، پیام بدهد — با اینکه کجا شکست خورد، نه فقط «خطا رخ داد».
- و ضربانِ زندهبودن. بخش بعد.
و یک نکتهی مهم دربارهی ثبت رخداد: «چند ردیف پردازش شد» را حتماً بنویس. این تنها عددی است که شکستِ نیمه را لو میدهد — کاری که «موفق» گزارش شده ولی بهجای ۱۱ ردیف، ۳ ردیف را دیده. بدون این عدد، آن شکست هیچوقت دیده نمیشود.
شکست بیصدا، بدترین نوع شکست
و حالا جانِ فصل.
بهخاطر بسپار خطایی که داد میزند، مشکلِ تو نیست — میبینیاش و درستش میکنی. مشکل آن چیزی است که همچنان «موفق» گزارش میدهد، در حالی که کارش را درست انجام نمیدهد.
چهار شکلِ رایجش، که همهشان بیصدا هستند:
- خروجیِ خالی که خطا نیست. فیلتری چیزی پیدا نکرد و گزارشِ خالی ساخته شد. «صفر سفارش امروز» ممکن است درست باشد یا ممکن است یعنی فیلتر شکسته — و از روی خروجی نمیشود فهمید کدام.
- اجرا نشدن. ماشین خاموش بود. هیچ خطایی نیست، چون هیچچیز اجرا نشد (فصل ۸.۶.۴).
- دادهی کهنه. منبع بهروز نشده ولی برنامه همان قبلی را برداشته و گزارشِ تازه ساخته.
- و پردازشِ ناقص. نصف ردیفها به دلیلی رد شدند و گزارش روی نصف ساخته شد — همان چیزی که بخش قبل گفت فقط با شمردنِ ردیفها دیده میشود.
و دفاع در برابر هر چهار، یک چیز است: ضربانِ زندهبودن.
یعنی اتوماسیون هر بار چیزی بفرستد — حتی وقتی خبری نیست. «امروز اجرا شد، ۱۱ ردیف، هیچ تغییری نبود.» آنوقت:
- نبودِ پیام، خودش خبر است. اگر صبح پیامی نیامد، میفهمی چیزی خراب است — بدون اینکه لازم باشد کسی خطا را تشخیص داده باشد.
- و آن عددِ «۱۱ ردیف» شکستِ ناقص را هم لو میدهد.
این سادهترین و مؤثرترین محافظتِ کلِ این ماژول است، و اکثر اتوماسیونهای خانگی ندارندش — چون در روزهای سالم، اضافی به نظر میرسد.
تمرین (ساختنی + توضیحی)
یک ورودی عجیب بده به اتوماسیونت — از شش تای بخش ۸.۷.۱ انتخاب کن، یا از ایجنت بخواه بسازد. بعد بنویس:
- چطور شکست؟ خطا داد، یا بیصدا چیزِ غلطی ساخت؟
- چطور فهمیدی؟ — و اگر خودت دستی چک نمیکردی، میفهمیدی؟
- چه چیزی اضافه کردی که دفعهی بعد خودش بگوید؟
پاسخنامه — دو شکست، و اینکه چرا دومی خطرناکتر است
شکست ۱ — فایل با یک ستون کم. خطا داد و متوقف شد. پرصدا. فهمیدنش راحت بود چون هیچ خروجیای نیامد و پیام خطا واضح بود. این شکستِ خوب است — نیم ساعت وقت گرفت و تمام شد.
شکست ۲ — فایل خالی. خطا نداد. گزارش ساخت، با جمعِ صفر، و به تلگرام فرستاد: «فروش امروز: ۰». بیصدا.
و چرا این خطرناکتر است: چون «۰» یک عددِ کاملاً معتبر است. اگر روزِ تعطیل باشد، درست هم هست. من فقط به این دلیل فهمیدم که میدانستم آن روز سفارش داشتیم. اگر روزِ شلوغی نبود، ماهها میتوانست ادامه پیدا کند و من فکر میکردم فروش افت کرده.
چه چیزی اضافه شد: دو چیز، و هر دو کوچکاند. اول شمارش ردیف در خروجی: «۰ سفارش از ۰ ردیف خواندهشده» فوراً با «۰ سفارش از ۱۱ ردیف» فرق دارد و میگوید مشکل کجاست. دوم یک بررسی معقولبودن: اگر تعداد ردیفهای ورودی صفر بود، بهجای گزارش، هشدار بده.
و جوابِ صادقانه به سؤال ۲ همان چیزی است که این تمرین دنبالش بود: نه، بدون چک دستی نمیفهمیدم. اگر جواب تو هم همین است، تمرین را درست انجام دادهای — و حالا میدانی چرا بخش ۸.۷.۴ اسمِ «بدترین نوع شکست» را رویش گذاشت.