طراحی برای سایتی که نمیتوانید به آن سر بزنید
وقتی یک سفر خدماتی گرانتر از خود دستگاه تمام میشود، هر تصمیم طراحی عوض میشود. توان، ارتباط، حالتهای شکست و عیبیابی همگی با این فرض از نو استدلال میشوند که هیچکس نخواهد آمد.

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