روز پنجم، دو مشتری پیامک «سفارشتان آماده است» را نگرفتند. اتصال خطایی نداد، چیزی قرمز نشد و کسی هم زنگ نزد. فقط ستونی که برای همین روز ساخته شده بود نوشت: اعتبار پنل پیامک تمام شده. اگر آن ستون نبود، آن دو نفر بیخبر میماندند و هیچکس هم نمیفهمید.
این ماجرا در یک کسبوکار کوچک فرضی اتفاق میافتد که سفارشهایش را در یک صفحهگستردهی ابری نگه میدارد. پیش از اتصال، صاحب کار هر بار اکسل را باز میکرد، شماره را کپی میکرد، در پنل پیامک میگذاشت و میفرستاد؛ سه دقیقه، ماهی نود بار. این نوشته ساختن ارسال پیامک خودکار برای همین کار را از نقشه تا یک ماه بعد دنبال میکند، و بیشتر از خود ساختن، دربارهی چیزهایی است که پس از ساختن خراب میشوند.
چهار تکه، که سومی و چهارمیشان جا میافتند
هر اتصالی، از سادهترین تا گرانترین، از چهار تکه ساخته شده است:
- ماشه: چه اتفاقی کار را راه میاندازد.
- داده: دقیقا چه چیزهایی جابهجا میشوند، فیلد به فیلد.
- مقصد: کجا و به چه شکلی مینشیند؛ سطر تازه، پیام، یا بهروزرسانی یک سطر موجود.
- خطا: اگر کار نکرد چه میشود و چه کسی خبردار میشود.
سه تکهی اول را همه مینویسند، چون بدونشان چیزی ساخته نمیشود. تکهی چهارم را کسی نمینویسد، چون بدونش هم اتصال کار میکند، تا روزی که نکند. کار دستی وقتی انجام نشود خودت میبینی، چون تو باید انجامش میدادی. اتصال خودکار وقتی انجام نشود هیچکس نمیبیند، و چون خودکار است، در مقیاس بزرگتری خراب میشود.
«آماده شد» یک حالت است، ماشه باید یک اتفاق باشد
جواب اول به پرسش ماشه این بود: «وقتی سفارش آماده شد.» ولی سیستم از کجا بفهمد؟ ماشهی واقعی این شد: وقتی مقدار ستون «وضعیت» به «آماده» تغییر کرد. یعنی ستون وضعیتی باید وجود داشته باشد و واقعا پر شود؛ پیشنیازی که تا پیش از نوشتن نقشه دیده نشده بود.
پرسش بعدی این بود که این اتفاق میتواند دو بار بیفتد؟ بله. کسی وضعیت را «آماده» میکند، اشتباها برمیگرداند، دوباره «آماده» میکند، و مشتری دو پیامک میگیرد و هزینهی پیامک هم دو برابر میشود. راه حل یک ستون است به اسم «پیامک رفت؟». اتصال فقط وقتی میفرستد که این ستون خالی باشد و بعد از فرستادن پرش میکند. پس این اتصال دو مقصد دارد: پنل پیامک، و برگشت به خود اکسل. همین برگشت است که تکرار را میبندد.
اگر مقصد تو «سطر تازه اضافه کن» است، همین خطر را دارد. درگاههای پرداخت گاهی تاییدیه را دو بار میفرستند، مشتری دکمه را دو بار میزند، یا خود اتصال پس از یک خطای موقت دوباره تلاش میکند. جلوی دو بار افتادن را معمولا نمیشود گرفت، ولی میشود مقصد را مقاوم کرد: با یک شناسهی یکتا، مثل شمارهی تراکنش، بهجای «اضافه کن» بگو «سطر این شناسه را بهروز کن و اگر نبود بساز».
هر فیلد اجباری یک «اگر خالی بود» لازم دارد
سه فیلد در این اتصال جابهجا میشود. شمارهی موبایل اجباری است؛ اگر خالی بود، نفرست و خبر بده. نام مشتری اختیاری است؛ اگر خالی بود، متن بدون نام برود. شمارهی سفارش اجباری است؛ اگر خالی بود، نفرست و خبر بده. ستون «اگر خالی بود» همان چیزی است که معمولا نوشته نمیشود. اتصالی که به آن فکر نکرده با شمارهی خالی هم تلاش میکند، خطا میگیرد و ساکت میماند، و آن سفارش برای همیشه بیپیامک میماند.
نقشهی نهایی، پیش از هر ابزاری
- ماشه: ستون وضعیت به «آماده» تغییر کرد و ستون «پیامک رفت؟» خالی است.
- داده: شمارهی موبایل و شمارهی سفارش اجباری، نام اختیاری.
- مقصد اول: یک پیامک با متن ثابت.
- مقصد دوم: ستون «پیامک رفت؟» با تاریخ پر شود.
- خطا: اگر فیلد اجباری خالی بود یا ارسال شکست خورد، در ستون «خطا» بنویس و نفرست.
- چک دورهای: هفتهای یک بار، تعداد سفارشهای «آماده» در برابر تعداد «پیامک رفت».
- پیشنیاز: سه ستون وضعیت، «پیامک رفت؟» و خطا باید در اکسل ساخته شوند.
سه ستون تازه، حدود پانزده دقیقه کار، که بدونشان اتصال اصلا ساختنی نبود. وقتی صاحب کار رفت این ستونها را اضافه کند، چیز دیگری هم دید: از نود سفارش ماه قبل، دوازدهتا شمارهی موبایل نداشتند. یعنی حتی پیش از ساختن اتصال معلوم شد بخشی از سفارشها اصلا پیامکشدنی نیستند؛ یافتهای که هیچ ربطی به اتوماسیون نداشت.
ابزار را با سه قابلیتش انتخاب کن، نه با اسمش
ابزارها عوض میشوند، قیمتشان عوض میشود و بعضی از دسترس خارج میشوند. چیزی که ثابت میماند سه قابلیت است: مبدا باید بتواند وقتی اتفاقی افتاد به بیرون خبر بدهد؛ در تنظیمات معمولا زیر کلمههایی مثل «وبهوک»، «اعلان»، «API» یا «اتصال» پیدا میشود. مقصد باید بتواند خبر بگیرد. و یکی از این دو، یا یک ابزار واسط، باید بتواند شرط بگذارد و خطا را ثبت کند.
صفحهگستردهی این مثال وقتی سطری عوض میشد به بیرون خبر نمیداد. دو راه بود: مبدا را عوض کند، یا بهجای منتظر خبر ماندن، هر ده دقیقه یک بار از مبدا بپرسد چیز تازهای هست یا نه. راه دوم را انتخاب کرد. برای پیامک «سفارشتان آماده است» فرق «فوری» و «تا ده دقیقه بعد» برای مشتری محسوس نیست. پیش از شروع هم یک کپی از فایل گرفت؛ اولین اتصالها معمولا یکی دو بار دادهی عجیب مینویسند و با نسخهی پشتیبان، هر کدام آزمایشی بیضرر است.
سه سفارش «تست» کافی نیست؛ خرابش کن
سادهترین نسخه ساخته شد: یک ماشه، یک پیامک، یک بهروزرسانی، بدون هیچ شرطی. سه سفارش آزمایشی با نام «تست» وضعیت «آماده» گرفتند، هر سه پیامک رفت، هر سه ستون پر شد و بعد پاک شدند. بیشتر آدمها همینجا کار را تمام شده میدانند. همهی اتصالها در حالت درست کار میکنند؛ چیزی که باید آزموده شود رفتارشان در حالت نادرست است:
| آزمون خرابی | انتظار | آنچه واقعا شد |
|---|---|---|
| شمارهی خالی | نفرستد و در ستون خطا بنویسد | تلاش کرد، شکست خورد، ساکت ماند |
| شمارهی بیمعنی مثل «۱۲۳» | نفرستد | فرستاد، پنل خطا داد، ولی ستون «پیامک رفت؟» پر شد |
| وضعیت را برگرداند و دوباره «آماده» کرد | نفرستد | درست رفتار کرد، چون ستون «پیامک رفت؟» پر بود |
دو خرابی از سه آزمون. دومی از همه بدتر بود: ستون میگفت پیامک رفته در حالی که نرفته بود، پس چک هفتگی شمارش هم فریبش را میخورد، چون عددها با هم میخواندند. اصلاح دو تغییر کوچک بود. پیش از ارسال بررسی شود شماره با ۰۹ شروع میشود و یازده رقم دارد. و ستون «پیامک رفت؟» فقط وقتی پر شود که پنل موفقیت را تایید کرده باشد، نه بعد از تلاش. فرق «فرستادم» و «رسید» ظریفترین درس این مرحله است. آزمون چهارمی هم ارزش دارد: عمدا اعتبار پنل را تمام کن یا دسترسی را موقتا ببند و ببین اتصال چه میکند.
یک هفته هر دو را با هم نگه دار
کار دستی بلافاصله قطع نشد. یک هفته هر دو موازی ماندند و هر روز دو عدد نوشته شد:
| روز | سفارش آماده | پیامک رفت | اختلاف |
|---|---|---|---|
| یکم تا چهارم | ۱۴ | ۱۴ | ۰ |
| پنجم | ۵ | ۳ | ۲ |
| ششم و هفتم | ۸ | ۸ | ۰ |
روز پنجم همان روزی است که اول این نوشته آمد. علتش در ستون خطا بود، و همین ستون است که خاموشی بیصدا را دیدنی کرد. سه حالت خرابی را باید از هم جدا کرد: شمارهی خالی یا نادرست، که اتصال ثبتش میکند؛ در دسترس نبودن پنل، که اتصال ثبت میکند و دوباره تلاش میکند؛ و خاموش شدن خود اتصال، که هیچ ستونی ثبتش نمیکند، چون اتصال خاموش چیزی نمینویسد. سومی را فقط چک هفتگی دو عددی میگیرد: تعداد «آماده» در برابر تعداد «پیامک رفت». پنج دقیقه وقت میبرد. بهترین کار این است که آن را به کاری بچسبانی که بههرحال هر هفته انجام میدهی، مثلا همان وقتی که فروش هفته را نگاه میکنی.
دلیلهایی که هیچکدام فنی نیستند
اتصالهای کوچک معمولا خراب نمیشوند؛ بیصدا خاموش میشوند. رمز یک سرویس عوض میشود و اتصال دیگر اجازهی دسترسی ندارد. اعتبار پنل تمام میشود. کسی ستونی را جابهجا میکند یا اسمش را عوض میکند. ابزار واسط بهروزرسانی میشود یا شرایطش تغییر میکند. قاعدهی عملی: هر بار رمزی را عوض کردی یا ساختار فایلی را دست زدی، همان روز چک را اجرا کن، نه هفتهی بعد.
اگر قدم آخر خودکار نشد، نیمهخودکارش کن
اگر به بنبست فنی خوردی و نتوانستی پیامک را خودکار بفرستی، کل کار را رها نکن. بگذار اتصال فهرست آماده بسازد، با متن کامل و شمارهها، و خودت با یک کلیک بفرست. در همین مثال، از سه دقیقهی هر پیامک حدود دو دقیقه و نیمش صرف باز کردن اکسل، پیدا کردن سطر و کپی کردن شماره میشد. کار گران پیدا کردن و کپی کردن بود، نه زدن دکمهی آخر. مزیت دیگرش این است که خطای نامرئی نمیسازد: اگر فهرست خالی باشد خودت میبینی. اولین نسخهی هر اتصالی بهتر است نیمهخودکار باشد؛ یک ماه که کار کرد و به خروجیاش اعتماد کردی، قدم آخر را هم خودکار کن.
یک ماه بعد: تخمین در برابر واقعیت
در یک ماه، ۸۸ سفارش «آماده» شدند و ۸۱ پیامک موفق رفت. هفت مورد در ستون خطا نشستند: پنجتا شمارهی نامعتبر داشتند و دوتا در همان روز تمام شدن اعتبار بودند. این هفتتا گم نشدهاند؛ ثبت شدهاند. آن پنج شمارهی نامعتبر پیش از اتصال هم وجود داشتند، فقط بیصدا شکست میخوردند.
صرفهجویی وقت تخمین زده شده بود چهار و نیم ساعت در ماه؛ واقعیت حدود سه و نیم ساعت شد، چون یک ساعت صرف رسیدگی به همان خطاها میشود. در چک پنجاهتایی روی سطرهای بعد از اتصال، هیچ شمارهای اشتباه کپی نشده بود. ولی خطای تازهای پیدا شد: دو سفارش پیامک تکراری گرفته بودند، چون کسی وضعیت را دستی عوض کرده و ستون «پیامک رفت؟» را هم پاک کرده بود. خطای تازهای که دیده میشود از خطای قدیمی نامرئی بهتر است، حتی اگر تعدادشان یکی باشد.
ساختن اتصال هم سه ساعت تخمین زده شده بود و پنج ساعت طول کشید. همین نسبت، حدود یک و هفت دهم، ضریب خوشبینی صاحب کار است و حالا روی تخمین اتصالهای بعدی اعمال میشود. یک جدول ساده هم باز شد به اسم دفتر اتصالها: نام و کار هر اتصال، مبدا و مقصد، چک دورهای و تاریخ آخرین بار، وابستگیها یعنی کدام رمز و کدام سرویس، و جای نقشهاش. روزی که رمزی عوض میشود، ستون وابستگیها تنها چیزی است که میگوید کدام اتصال الان شکسته است. و اگر روزی کار را به کسی بسپاری، بی این دفتر هر اتصال برای او جعبهای سیاه است که جرئت نمیکند به آن دست بزند.
این نوشته ابزار خاصی آموزش نمیدهد. اتصالهای چندشرطی و چندسیستمی با حجم بالا کار کسی است که این را حرفهاش کرده؛ ولی حتی آنجا، نقشهی چهارتکه و دفتر اتصالها همان چیزی است که باید به او بدهی. تمرین کامل نقشه، آزمونها و هفتهی موازی در مینیدورهی رایگان «جزیرههای جدا» آمده است. اگر بهجای یک اتصال، یک جای مرکزی برای دایرکت، تلفن و ثبت حضوری لازم داری، جزئیات این خدمت را ببین.