در دهه ۱۹۴۰، پل تاکوما ناروز در ایالت واشنگتن به دلیل طراحی نادرست آیرودینامیکی و عدم درک صحیح از ارتعاشات ناشی از باد فرو ریخت. این پل که به «Galloping Gertie» معروف بود، تنها چهار ماه پس از افتتاح، بر اثر بادهایی نهچندان شدید، بهطور کامل تخریب شد. شکست این پروژه باعث شد تا جامعه مهندسی به اهمیت تأثیر نیروهای دینامیکی در طراحی سازهها توجه کند و استانداردهای جدیدی برای طراحی پلها و سازههای مشابه ایجاد شود. این حادثه نشان داد که شکستها میتوانند بستری برای یادگیری عمیق و پیشرفت باشند.
در زندگی شخصی: شکست ممکن است شامل تصمیمات اشتباه، نرسیدن به هدفی مشخص یا روبرو شدن با موانع غیرمنتظره باشد. در مهندسی نرمافزار: شکست میتواند به معنای از دست رفتن دادهها، خرابی یک سرویس، یا کاهش تجربه کاربری باشد.
در طول جنگ جهانی دوم، یکی از مسائل حیاتی ارتشها این بود که چگونه دوام و ایمنی هواپیماها را در میدان نبرد افزایش دهند. مهندسان نظامی هواپیماهایی که از مأموریت بازمیگشتند را بررسی میکردند و نقاطی که آسیب دیده بودند را شناسایی میکردند. در نگاه اول، آنها تصمیم گرفتند روی نقاطی که بهطور مکرر گلوله خورده بودند (مانند بالها یا دم هواپیما) زرهگذاری کنند.
اما در این تحلیل، یک اشتباه مهم رخ داده بود: آنها تنها روی هواپیماهایی تمرکز کرده بودند که از میدان نبرد بازگشته بودند و هواپیماهایی که سقوط کرده و هرگز برنگشته بودند، از تحلیل حذف شده بودند. آبراهام والد، یک تحلیلگر ریاضی، این خطا را متوجه شد و پیشنهاد کرد که باید به نقاطی که آسیب ندیدهاند توجه کرد. چرا؟ چون این نقاط اگر مورد اصابت قرار میگرفتند، احتمالاً باعث سقوط هواپیما و بازنگشتن آن میشدند.
این تحلیل انقلابی بود. بهجای زرهگذاری روی نقاط آسیبدیده، زرهها را روی نقاطی قرار دادند که در ظاهر سالم به نظر میرسیدند اما در صورت آسیب، بحرانی بودند. این رویکرد توانست به بهبود طراحی هواپیماها و کاهش تلفات کمک کند.
این داستان نمونهای از یک خطای شناختی به نام سوگیری بازماندگی (Survivorship Bias) است.
در دنیای مهندسی نرمافزار، سوگیری بازماندگی (Survivorship Bias) بهشدت قابل مشاهده است. بسیاری از افراد و تیمها به جای تحلیل شکستها، تنها بر موفقیتها تمرکز میکنند و این موضوع میتواند منجر به درک ناقص از دلایل واقعی موفقیت یا شکست شود.
در مهندسی نرمافزار، منابع زیادی برای معرفی الگوهای موفق وجود دارد که اغلب به عنوان راهنمای طراحی و اجرا استفاده میشوند.
این منابع ارزشمند هستند، اما یک محدودیت دارند:
آنها معمولاً فقط موفقیتها را مستند میکنند.
در نتیجه، چالشها و شکستهای واقعی که به این موفقیتها منجر شدهاند، در تحلیلها گم میشوند.
در مقابل، برخی از شرکتهای بزرگ فناوری مانند گوگل و نتفلیکس، فرهنگ مستندسازی شکستها و یادگیری از آنها را به شدت جدی گرفتهاند. این رویکرد، پستمرتمها (Postmortems) نامیده میشود.
شکست، بخشی جداییناپذیر از پیشرفت است. در این بخش به این سؤال پاسخ میدهیم که چرا شکستها نهتنها طبیعی بلکه ضروریاند و چگونه میتوانند به یادگیری و بهبود منجر شوند.
شکست در زندگی فردی میتواند فرصتی برای رشد و تابآوری باشد:
مثال:
دانشآموزی که بارها در آزمون ورودی شکست میخورد، با شناسایی نقاط ضعف خود و کار کردن روی آنها میتواند در نهایت موفق شود.
در دنیای نرمافزار، شکستها ابزار مهمی برای شناسایی نقاط ضعف سیستمها هستند:
این چرخه، مفهومی کلیدی در تحلیل شکستهاست و به ما کمک میکند تا بفهمیم چرا یک سیستم از کار میافتد.
این چرخه نشان میدهد که چگونه یک عیب کوچک میتواند به فاجعهای بزرگ تبدیل شود.
شکست اگر تحلیل نشود، تنها منجر به تکرار اشتباهات خواهد شد.
شکستها نقاط ضعف سیستم را آشکار میکنند.
شکستها میتوانند به طراحی سیستمهایی منجر شوند که مقاومتر (Resilient) هستند.
این سیستمها نهتنها خرابیها را تحمل میکنند، بلکه قادر به بازیابی سریع هستند.
نتفلیکس پیشگام استفاده از مهندسی آشوب است. آنها با طراحی ابزار Chaos Monkey توانستند سیستمهای خود را مقاومتر کنند.
پیادهسازی مهندسی آشوب (Chaos Engineering) و استفاده از ایدههای Chaos Monkey به ابزارهای پیشرفته نیاز ندارد و میتواند در سادهترین شکل خود نیز پیادهسازی شود. با این حال، انتخاب ابزارها و روشها بستگی به پیچیدگی سیستم شما دارد. در ادامه، توضیح میدهم که چگونه میتوانید به صورت ساده شروع کنید و سپس به ابزارهای پیشرفتهتر بپردازم.
برای شروع، نیازی به ابزار خاصی ندارید. میتوانید بهصورت دستی یا با نوشتن اسکریپتهای ساده، آزمایشهای مهندسی آشوب را اجرا کنید:
یکی از عناصر کلیدی در یادگیری از شکستها، مستندسازی دقیق و شفاف دلایل و پیامدهای آنهاست. پستمورتِمها (Postmortems) به تیمها اجازه میدهند تا شکستها را تحلیل کنند و از تکرار آنها جلوگیری کنند.
پستمورتِم گزارشی است که پس از وقوع یک شکست یا حادثه تهیه میشود و شامل موارد زیر است:
متدولوژی DERP در فیسبوک
DERP یک روش چهار مرحلهای است که فیسبوک برای تحلیل و رفع مشکلات از آن استفاده میکند:
فیسبوک از پستمورتِمها بهطور گسترده برای یادگیری از مشکلات استفاده میکند:
در مهندسی نرمافزار، شکستها نباید به صفر برسند. یک نرخ بسیار کم شکست میتواند نشاندهنده عدم ریسکپذیری و نوآوری باشد.
در آوریل 2011، یکی از بزرگترین اختلالات در تاریخ زیرساختهای ابری رخ داد؛ اختلالی که تأثیر عمیقی بر معماری و فرآیندهای AWS گذاشت و درسهای مهمی را به همراه داشت. این حادثه که به اختلال در Amazon EC2 و Amazon RDS در منطقه شرقی ایالات متحده شناخته میشود، داستانی پر از پیچیدگیهای فنی، چالشهای بحرانی، و اصلاحات گسترده است.
همه چیز از یک تغییر معمولی در پیکربندی شبکه آغاز شد. در ساعت 12:47 بامداد روز 21 آوریل، تیم AWS تغییراتی را برای ارتقاء ظرفیت شبکه اصلی در یکی از زونهای دسترسی (Availability Zone) در منطقه شرقی ایالات متحده اعمال کرد. این تغییر به اشتباه باعث شد که ترافیک شبکه به یک شبکه پشتیبان با ظرفیت کمتر منتقل شود.
در سیستم EBS، هنگامی که یک نود اتصال به نود دیگر را از دست میدهد، باید به سرعت نود جدیدی برای کپی دادهها پیدا کند. اما در این حادثه، تعداد نودهایی که نیاز به بازنویسی داشتند، بسیار زیاد بود و ظرفیت آزاد موجود در سیستم به سرعت تمام شد. این مسئله باعث شد:
تیم AWS تلاش کرد تا سیستم را به حالت پایدار بازگرداند:
تا 24 آوریل، بیشتر حجمهای ذخیرهسازی بازیابی شدند. با این حال، 0.07٪ از حجمها به دلیل خرابیهای سختافزاری قابل بازیابی نبودند.
AWS این حادثه را به عنوان فرصتی برای بهبود زیرساختهای خود در نظر گرفت. در گزارش پستمورتِم، این شرکت اقدامات زیر را اعلام کرد:
چرا گاهی اوقات تیمها از پستمورتِم اجتناب میکنند؟
در این بخش، به روشها و الگوهای مدیریت شکستها میپردازیم. این موضوع شامل پیشگیری از شکستها، مدیریت خرابیهای غیرمنتظره، و کشف خطاهاست.
پیشگیری از شکستها به معنای طراحی سیستمهایی است که از ابتدا برای مدیریت و کاهش تأثیر خرابیها ساخته شدهاند. در این بخش، الگوهایی مطرح میشوند که برای جلوگیری از گسترش یا تأثیر خرابیهای پیشبینیشده طراحی شدهاند.
در سیستمهای پیچیده و سرویسهای تحت فشار، مدیریت مؤثر صفهای درخواست نقش مهمی در پیشگیری از شکستها و کاهش تأخیر ایفا میکند. دو الگوریتم CoDel (Controlled Delay) و Adaptive LIFO (Last-In-First-Out) از ابزارهای پیشرفتهای هستند که برای این هدف استفاده میشوند.
CoDel یک الگوریتم مدیریت صف است که برای کنترل تأخیر در سیستمهای با صفهای طولانی طراحی شده است. این الگوریتم درخواستهایی که زمان زیادی در صف باقی ماندهاند را بهطور خودکار حذف میکند تا از انباشته شدن درخواستهای بیفایده جلوگیری شود.
Adaptive LIFO الگوریتمی است که در شرایط عادی صفها را به صورت FIFO (First-In-First-Out) مدیریت میکند، اما هنگام شلوغی و افزایش فشار، به حالت LIFO تغییر میکند. در این حالت، درخواستهای جدیدتر اول پردازش میشوند.
این دو الگوریتم میتوانند با هم ترکیب شوند تا بهترین نتایج را در مدیریت صفها ایجاد کنند:
استفاده از این الگوریتمها نیازمند درک عمیق از نیازهای سیستم و تنظیم دقیق پارامترهاست تا تعادل مناسبی بین کارایی و تجربه کاربر ایجاد شود.
مدیریت خرابیهای غیرمنتظره به مجموعهای از ابزارها و تکنیکها اشاره دارد که برای واکنش سریع به شرایط پیشبینینشده طراحی شدهاند. در این بخش، روشهایی ارائه میشوند که در زمان وقوع خرابیهای غیرمنتظره، سیستم بتواند به کار خود ادامه دهد.
در ابتدا، باید تفاوت این دو مفهوم را توضیح دهیم:
تصور کنید یک فروشگاه آنلاین دارید:
در سال 2008، نتفلیکس با یک خرابی گسترده دیتاسنتر مواجه شد. این خرابی باعث شد:
نتفلیکس پس از این حادثه تصمیم گرفت زیرساخت خود را بازطراحی کند و به جای High Availability، Resilience را در اولویت قرار دهد. این تصمیم شامل چندین تغییر کلیدی بود:
حرکت نتفلیکس از High Availability به Resilience یک نمونه عالی از چگونگی طراحی سیستمهایی است که نه تنها در برابر خرابی مقاوم هستند، بلکه از خرابیها یاد میگیرند و قویتر میشوند.
الگوهایی برای شناسایی سریع خطاهای سیستم طراحی شدهاند تا تیمها بتوانند قبل از تبدیلشدن خطا به یک خرابی بزرگ، واکنش نشان دهند.
Watchdog مستقیماً وظیفه بازیابی سرویس را بر عهده دارد.
Heartbeat فقط به یک مانیتور مرکزی اطلاع میدهد که سرویس مشکل دارد، و سیستم دیگری باید وارد عمل شود (مثلاً یک load balancer که نود معیوب را از کلاستر خارج کند).
"موفقیت محصول پذیرش شکست و تبدیل آن به یک درس سازنده است. بهجای فرار از شکست، آن را در آغوش بگیرید."