پنل آوند در زمان اجرا سه وابستگی دارد
کلاینت S3، WebDAV و ZIP را خودمان نوشتیم. توضیح اینکه چرا در یک محصول چندمستأجری، هر وابستگی اضافه یک تعطیلی آخر هفتهٔ از دست رفته است.
رابط کاربری پنل آوند در زمان اجرا سه وابستگی دارد: react، react-dom و مسیریاب. همین. نه کتابخانهٔ انیمیشن، نه کتابخانهٔ فرم، نه کیت رابط کاربری، نه کلاینت آمادهٔ S3.
این تصمیم را چند بار زیر سؤال بردیم و هر بار به همان جواب رسیدیم.
حساب سادهای که کردیم
یک وابستگی معمولی در npm، خودش ده تا سی وابستگی دیگر میآورد. هر کدام:
- یک نقطهٔ ورود بالقوه برای آسیبپذیری است،
- یک منبع تغییر ناخواسته در بروزرسانی بعدی است،
- و در یک محصول چندمستأجری، ضربدر تعداد نصبها میشود.
وقتی یک آسیبپذیری در وابستگیای که هرگز عمداً انتخابش نکردهاید منتشر میشود، شما یک آخر هفته را صرف بروزرسانی و آزمایش مجدد همهٔ نصبها میکنید. ما ترجیح دادیم آن آخر هفتهها را از قبل بخریم.
چه چیزهایی را خودمان نوشتیم
کلاینت S3 با امضای SigV4. الگوریتم امضا مستند و ثابت است؛ پیادهسازیاش حدود سیصد خط است. کتابخانهٔ رسمی، برای همان کار، چند مگابایت و دهها وابستگی میآورد که ۹۵ درصدشان مربوط به سرویسهایی است که ما هرگز صدا نمیزنیم.
کلاینت WebDAV. چند فعل HTTP و کمی XML. نوشتنش کمتر از خواندن مستندات سه کتابخانهٔ موجود طول کشید.
خواندن و ساختن ZIP. فقط برای پشتیبانگیری و خروجی گرفتن لازمش داریم و همان زیرمجموعهٔ کوچک از فرمت را پیاده کردهایم.
این کار همیشه درست نیست
بگذارید صادق باشیم، چون این استدلال بهراحتی به افراط میرسد.
رمزنگاری را خودمان ننوشتیم و نخواهیم نوشت. تجزیهٔ فرمتهای پیچیده و بیقاعده را هم نه. قاعدهای که استفاده میکنیم این است:
اگر مشخصات فرمت پایدار و مستند است، و ما فقط به بخش کوچکی از آن نیاز داریم، و اشتباه در آن با آزمون قابل تشخیص است — مینویسیم. در غیر این صورت، از کتابخانهٔ جاافتاده استفاده میکنیم.
نتیجهٔ قابل اندازهگیری
- ممیزی وابستگیها روی همهٔ بستههای پروژه: صفر آسیبپذیری.
- بستهٔ نهایی رابط کاربری کوچکتر از حدی است که روی اینترنت موبایل داخل کشور آزاردهنده باشد.
- بروزرسانی امنیتی، بهجای یک زنجیرهٔ ناشناخته، فقط سه اسم است که باید دنبال کنیم.
همین سایتی هم که الان میخوانید با همان قاعده ساخته شده: هیچ کتابخانهٔ انیمیشنی ندارد. هر حرکتی که میبینید یا انیمیشن CSS متصل به اسکرول است، یا چهل خط جاوااسکریپت دستنویس.