بدترین باگ‌های تاریخ کامپیوتر: از دست رفتن ۴۶۰ میلیون دلار در ۴۵ دقیقه

بدترین خطاهای تاریخ کامپیوتر، مجموعه‌ای دنباله‌دار از داستان معروف‌ترین و تاثیرگذارترین خطاهای برنامه‌نویسی است. بیش‌تر برنامه‌نویسان و مهندسان نرم‌افزار به ندرت پیش می‌آید که با چیزی شبیه به این داستان‌ها روبه‌رو شوند، اما با خواندن آن‌ها می‌توانند دید خوبی در زمینهٔ توسعه و استقرار نرم‌افزار به دست آورند. این خطاهای کامپیوتری تاثیر قابل توجهی بر روی افرادی گذاشته‌اند که آن‌ها را تجربه کرده‌اند؛ ما هم می‌توانیم درس‌‌های ارزشمندی را که از این اشتباهات آموخته‌‌اند، در کارها و پروژه‌های خود به کار بگیریم. دیگر خطاهای کامپیوتری این مجموعه: موشک آریان ۵، مدارگرد اقلیمی مریخ (به‌زودی) و تراک ۲۵ (به‌زودی)

گروه سرمایه‌گذاری نایت Knight

در یکم آگوست ۲۰۱۲ سرمایه‌گذاری نایت، به‌روزرسانی نرم‌افزاری تازه‌ای را بر روی سرورهای عملیاتی خود دیپلوی کرد. حوالی ساعت ۸:۰۱ صبح کارکنان شرکت، تعداد ۹۷ ایمیل هشدار دریافت نمودند که حاکی از آن بود که Power Peg (یک سیستم داخلی منسوخ شده که آخرین بار در سال ۲۰۰۳ از آن استفاده شده بود) به شکلی نادرست پیکربندی شده است.

این نخستین علامت هشداردهنده بود.

خسارت

ساعت ۹ صبح بورس اوراق بهادار نیویورک برای داد و ستد باز شد و نخستین سرمایه‌گذار جزئی آن روز، سرمایه‌گذاری نایت، دستورالعمل خرید و فروش سهام و دارایی‌های خود را اعلام کرد.

تنها ۴۵ دقیقه بعد، سرورهای سرمایه‌گذاری نایت ۴ میلیون معامله را اجرا کردند، ۴۶۰ میلیون دلار هزینه کردند و شرکت را در آستانهٔ ورشکستگی قرار دادند. برخی از سهم‌‌های بورس اوراق بهادار نیویورک، به دلیل سوءاستفاده ٔ الگوریتم‌های معاملات شرکت‌های دیگر از این ایراد، جهشی بیش از ۳۰۰ درصد داشتند.

در نهایت سرمایه‌گذاری نایت با توجه به نقض موارد مختلفی از آیین‌نامه‌های مدیریت ریسک مالی، ۱۲ میلیون دلار هم توسط کمیسیون بورس اوراق بهادار جریمه شد.

چه چیزی اشتباه پیش رفت؟

بورس سهام ۱۰۱

بورس اوراق بهادار با جفت کردن خریدار و فروشنده سهام به یکدیگر کار می‌کند. فروشندگان کم‌ترین قیمت (ask price) را بیان می‌کنند؛ یعنی بهایی که با دریافت آن حاضر به فروش هستند و خریداران قیمت پیشنهادی (bid price) را اعلام می‌کنند؛ یعنی برای خرید آن سهام تا چه اندازه‌ای حاضر به پرداخت هستند. تفاوت بین این دو مقدار به عنوان نسبت قیمت پیشنهادی به کم‌ترین قیمت فروش (bid/ask) شناخته می‌شود که معمولا در حدود چند سنت شناور است.

دانش مالی متعارف می‌گوید که یک نفر می‌بایست هنگامی سهام بخرد که قیمت پایین است و هنگامی بفروشد که قیمت بالاست.

متاسفانه یک الگوریتم مستقر در یکی از سرورهای عملیاتی نایت طوری برنامه‌ریزی شده بود که با سرعت هرچه تمام‌تر، دقیقا برعکس آن را انجام دهد. برنامهٔ Power Peg با هدف خرید سهام با قیمت ارائه شده برای فروش و سپس فروش بلافاصلهٔ آن با هر قیمت پیشنهادی طراحی شده بود که نتیجهٔ آن از دست دادن مبلغی به اندازهٔ اختلاف بین کم‌ترین قیمت فروش و قیمت پیشنهادی بود. این تفاوت قیمت به ارزش پخش (Value of the spread) نیز معروف است.

گران خریدن، ارزان فروختن

در یک محیط آزمایشی، Power Peg قیمت سهام را بالا می‌برد تا سیستم تضمین کیفیت (QA) بتواند کارکرد درست سایر ویژگی‌های نرم‌افزار را بررسی کند.

اما نتیجهٔ اجرای Power Peg در یک محیط عملیاتی این بود که کارمندان ارشد شرکت برای پوشاندن سیاه‌چالهٔ چند میلیون دلاری که به ناگهان در بودجه پدیدار شد، تعطیلات آخر هفتهٔ خود را دیوانه‌وار در جست‌وجوی سرمایه‌گذاران وال استریت باشند.

دلیل شکست

این شکست دلایل زیادی داشت. یکی از مهم‌ترین آن‌ها، به‌کارگیری دوبارهٔ یک پرچم (Flag) در عمل‌کردی تازه بود؛ در حالی که قبل از آن در جای دیگری برای فعال سازی Power Peg مورد استفاده قرار گرفته بود. یعنی برنامه فکر می‌کرد در محیط آزمایشی قرار دارد و معاملات را بدون توجه به از دست دادن ارزش پخش و با بیش‌ترین سرعت ممکن انجام می‌داد.

دوم این‌که تیم dev-ops در دیپلوی ویرایش به روزرسانی‌شدهٔ برنامه بر روی یکی از هشت سرور عملیاتی ناموفق بود. این سرور ویرایشی قدیمی از نرم‌افزار را در اختیار داشت که در آن پرچمی (Flag) بود که مشخص می‌کرد Power Peg باید فعال باشد.

در نهایت Power Peg که از سال ۲۰۰۳ منسوخ شده بود حدود هشت سال پس از آن هم هنوز در پایگاه کد باقی مانده بود. در سال ۲۰۰۵ تغییراتی در کد Power Peg ایجاد شده بود که کنترل‌‌های ایمنی را که می‌توانستند از چنین سناریویی جلوگیری کنند، سهوا غیرفعال کرده بود. با این حال در همان زمان، این به‌روزرسانی بدون هیچ‌گونه تلاشی برای تایید فعال بودن عمل‌کرد Power Peg، بر روی یک سیستم عملیاتی دیپلوی شد.

کد مرده

در گزارش کمیسیون تبادل امنیت، بسیاری از عوامل دیگر نیز مهم عنوان شده‌اند. مخرب‌ترین آن‌ها نبود هیچ‌گونه بازنگری رسمی کد یا فرآیند تضمین کیفیت (Quality Assurance) و همچنین فرآیندهایی برای بررسی درستی دیپلوی نرم‌افزار است. به علاوه این‌که آستانه‌هایی از پیش تعریف شده وجود نداشته‌اند که داد و ستد خودکار را پس از رسیدن به میزان مشخصی از ضرر و زیان متوقف کنند.

این مطلب قسمتی از مجموعه دنباله‌دار معروف‌ترین و تاثیرگذارترین خطاهای برنامه‌نویسی است که در کوئرامگ منتشر شده است. . هفتاد سال پیش، گریس هوپر (Grace Hopper) نخستین خطای کامپیوتری را کشف کرد؛ یک پروانه بین رله‌های کامپیوتر Harvard Mark II که با آن کار می‌کرد گیر افتاده بود. پیش از آن ایده باگ‌ها (Bugs) در زمینه‌های دیگر تعریف شده بود، اما با کشف آن پروانه، برای نخستین بار از اصطلاح اشکال‌زدایی (Debugging) در زمینهٔ کامپیوترها استفاده شد.

ترجمه و تلخیص از:

"The Worst Computer Bugs in History: Losing $460m in 45 minutes", by Jamie Lynch

کوئرامگ مجله‌ای تخصصی برای توسعه‌دهندگان است که هر هفته با مطلب‌هایی در زمینه تکنولوژی، رشد فردی و آینده برنامه‌نویسی به‌روزرسانی می‌شود. برای اطلاع از آخرین مطلب‌های ما، می‌توانید توئیتر یا کانال تلگرام کوئرا را دنبال کنید.