תנועת 0deps: תלויות מקומיות וחוזים בלתי משתנים
מפתחי תוכנה מתקינים לעיתים קרובות מאות ספריות חיצוניות. פריימוורקים מודרניים מסתמכים על אלפי תלויות עקיפות (transitive dependencies). המשמעות היא שהאפליקציה שלכם מריצה קוד של זרים.
זה יוצר סיכון בשרשרת האספקה של התוכנה.
כל תלות מגדילה את שטח התקיפה שלכם. היא עלולה:
- להכניס פרצות אבטחה.
- להפוך למטרה להתקפות שרשרת אספקה.
- להינטש על ידי המפתחים (maintainers).
- לשנות את ה-API הציבורי שלה.
- לשבור תאימות לאחור.
תנועת ה-0deps שואלת שאלה פשוטה: מה אם האפליקציה שלכם תסתמך רק על קוד שאתם שולטים בו?
במודל ה-0deps, אתם מטמיעים את התלויות הדרושות ישירות בתוך מאגר הפרויקט (repository) שלכם. אתם מפסיקים להוריד אותן באופן דינמי במהלך תהליכי הבנייה (builds). כל מה שדרוש להרצת האפליקציה נשאר במאגר מההתחלה.
גישה זו מספקת:
- בנייה ניתנת לשחזור (reproducible builds).
- פחות תלות ברישומים (registries) חיצוניים.
- ביקורות אבטחה מרכזיות.
- יכולת חיזוי גבוהה יותר.
עיקרון הליבה אינו לשמור על הקוד סטטי. מימושים ואלגוריתמים חייבים להתפתח כדי לתקן באגים ולשפר את האבטחה. מה שנשאר יציב הוא החוזה הציבורי (public contract).
כל ספרייה חושפת ממשק (interface) שתוכנן בקפידה. דוגמאות כוללות:
authenticate()createSession()verifyPasskey()
הפונקציות הללו מגדירות חוזה. החוזה לעולם אינו משתנה. אתם יכולים לכתוב מחדש את הקוד שמאחוריו או להחליף את הספרייה כולה. שאר האפליקציה שלכם לא תבחין בשינוי.
כאשר מופיעה פגיעות (vulnerability), אתם בדרך כלל מתמודדים עם שתי בעיות:
- תיקון הפרצה.
- בדיקה האם העדכון שובר את האפליקציה שלכם.
בארכיטקטורת 0deps, הבעיה השנייה נעלמת. אתם מעדכנים את המימוש הפנימי בזמן שה-API הציבורי נשאר זהה. האפליקציה שלכם ממשיכה לעבוד ללא שינויי קוד.
אתם מבודדים אינטגרציות חיצוניות באמצעות מתאם (adapter) פנימי: Application -> Public Interface -> Adapter -> Implementation
אם ספרייה תיעלם מחר, תצטרכו לשנות רק את המתאם. שום חלק אחר באפליקציה שלכם לא יישבר.
0deps לא הופך את התוכנה למושלמת. הוא מפחית סיכוני שרשרת אספקה. הוא מונע בעיות כמו חבילות זדוניות, פריצות לרישומים (registries) ובלבול תלויות (dependency confusion).
פרויקטים נמשכים עשורים. ספריות ופריימוורקים משתנים. עם 0deps, האפליקציה שלכם ממשיכה להשתמש באותם חוזים יציבים, ללא קשר לאופן שבו האקוסיסטם מתפתח.
