نتایج نظرسنجی بالا رو دیدید؟ 👀
حالا بریم سراغ یکی از کابوسهای تاریخ برنامهنویسی تا ببینیم چرا جواب این نظرسنجی گاهی حیاتی میشه...
📅 مارس ۲۰۱۶ | دنیای JavaScript و npm
همه چیز روتین بود. تیمهای توسعه در سراسر دنیا مشغول Merge کردن تغییرات بودند تا نسخه جدید پروژههایشان را منتشر کنند.
دکمه Build زده شد... اما ناگهان:
❌ Build Failed
ارورها بیمعنی به نظر میرسیدند. کد پروژه هیچ مشکلی نداشت، اما یک وابستگی کوچک در لاگها به چشم میخورد که غیبش زده بود:
📦
left-pad
کل کدی که دنیای وب به آن وابسته بود، فقط همین ۱۱ خط بود:
JavaScript
module.exports = leftPad;
function leftPad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0) ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
تمام کارش این بود که چند کاراکتر (مثل صفر یا فاصله) به سمت چپ یک متن اضافه کند:
leftPad("42", 5, "0") ➔
"00042"نه هوش مصنوعی بود، نه الگوریتم پیچیده. اما همین ۱۱ خط کد ساده، به صورت ناخواسته و زنجیرهای (Indirect Dependency) توی دل ابزارهای غولی مثل React و Babel جا خوش کرده بود.
💣 ماجرا از کجا شروع شد؟
توسعهدهندهی پکیج (Azer Koçulu) سر اسم یک پکیج دیگر با یک شرکت به اختلاف حقوقی خورد. وقتی npm حق را به آن شرکت داد، او در اعتراض به این تصمیم، تمام ۲۵۰ پکیج خود را از npm پاک (Unpublish) کرد!
و ناگهان...
🚨 فاجعه رخ داد!
سیستمهای CI/CD، سرورهای بزرگ و پروژههای هزاران شرکت و تیم برنامهنویسی در سراسر جهان از کار افتادند. اصل داستان فقط کشیده شدن یک پکیج ۱۱ خطی از وسط زنجیرهی وابستگیها بود!
🤯 پایان عجیب داستان
ابعاد بحران آنقدر گسترده شد که تیم npm برای اولین بار در تاریخ، قوانین خودش را زیر پا گذاشت و پکیج حذفشده را به صورت دستی بازیابی کرد تا اینترنت دوباره به حالت عادی برگردد.
قابلیتی که هر برنامهنویس مبتدی میتوانست در چند خط بنویسد، کل دنیا را معطل کرده بود.
💬 حالا با دیدن این داستان، دوباره به نظرسنجی بالا نگاه کنید:
برای یک کار ۱۰ خطی و ساده، هنوز هم 📦 پکیج آماده رو ترجیح میدید یا 💻 خودتون مینویسید؟
نظرتون رو همراه با دلیل در کامنتها بنویسید 👇
📚 واژهنامه (برای درک بهتر اصطلاحات):
📦 npm (Node Package Manager):
مخزن آنلاین و ابزار مدیریت پکیجها برای زبان JavaScript که برنامهنویسان کدها و کتابخانههای آماده را در آن با هم به اشتراک میگذارند.
🔗 Dependency :
وقتی یک پروژه برای اجرا شدن به کدهای یک کتابخانه یا پکیج دیگر نیاز داشته باشد، میگویند به آن پکیج وابستگی دارد.
🔄 Indirect Dependency :
یعنی پروژهی شما مستقیماً یک پکیج را دانلود نکرده، اما یکی از کتابخانههایی که استفاده میکنید خودش به آن پکیج متکی است.
⚙️ CI/CD:
سیستمهای تست و انتشار خودکار کد؛ کارهایی مثل بررسی تستها و ساخت خروجی نهایی پروژه را بدون دخالت انسان انجام میدهند.
#TechTime
#TechTimeCodeAutopsy
💻انجمن علمی برنامهنویسی
🔗 @sru_cmp_dev

