שימוש חוזר בקוד לעומת תקשורת מקרית

אחד הבאגים המהמרים והביקורתיים-קונצנזוסיים (CVE-2018–17144) התגלה לאחרונה בתוכנת הביטקוין-Core, שלפני אותה נקודה הייתה היסטוריה כמעט ללא רבב. ג'ימי סונג כתב פירוט מצוין של הבאג הזה.

הסיכום הקצר של הבאג הוא שישנם 4 מקרים שתוכנת הביטקוין Core צריכה לבדוק אם יש להוציא כפול. כל ארבעת המקרים חלקו בתחילה את אותה זרימת ביצוע קוד. לאחר מספר איטרציות מעודנות של הקוד לאורך מספר שנים, דילג על אחד מארבעת המקרים ("יחיד-tx-double-spend-in-block"), מה שיאפשר לכורה לפתור כמה צמתים לקבל חסימה שמנפח את היצע הביטקוין.

אופיו של באג זה מזכיר לי את הקונפליקט המתמיד בין:

(א) הצורך בשימוש חוזר ואופטימיזציה של קוד

(ב) סכנת הנפילה בגלל מה שאני מכנה רשלנות מקרית: דברים שדומים לא מעצבים אלא במקרה

קושי מקרי מייצר קרקע פורייה לשבת מחדש של סיוטים ובאגים פוטנציאליים כמו CVE-2018–17144.

קושי מקרי

רקע כלשהו, ​​אם אינך מכיר הנדסת תוכנה:
 
בתוכנה קיים החזון המפואר הזה של רכיבי תוכנה להיות מודולריים לחלוטין - בדומה לעמיתיהם ההנדסיים הפיזיים. יש סיבה טובה שלא תצטרך לשאת מטען או חוט USB מסוג אחר לכל מקום שאתה הולך.

כך שתמיד הייתה דחיפה חזקה לשימוש חוזר בקודים. כתיבת קוד מיותר זועפת לעיתים קרובות. מדוע אותה עבודה פעמיים כשאפשר לעשות זאת פעם אחת?

יש גם היסטוריה ארוכה של להמציא מחדש את הגלגל בתוכנה המעניקה לשימוש חוזר בקוד אפילו עדיפות גבוהה יותר ברשימת העדיפות. שימוש חוזר בקוד נחשב לעתים קרובות לאחד מ"שיטות העבודה המומלצות "בענף. מפתח תוכנה זוטר שואף עשוי להיות נוטה לחשוב שיש אפס חסרונות לשימוש חוזר בקוד.

אבל יש סכנה נסתרת - ואני לא מאמין שהדברים האלה נלמדים כראוי בבתי ספר - של שימוש חוזר בקוד קיצוני.

שימוש חוזר בקוד קיצוני פירושו קריסת שני חלקי קוד דומים למראה לאחד, ללא קשר למקרי השימוש בהם וכוונתם המקורית.

שהרבה פעמים מסתיימים בקוד שיש בו קשר מקרי.

יתכן ולא ברור מדוע הקומוניקיות בשוגג היא גרועה, אך צריך רק לשמור על פרויקט תוכנה גדול מספיק לתקופה ארוכה כדי להבין מדוע.

זה גרוע מכיוון שדרישות המוצר משתנות והתוכנה היא מוצר מתפתח, שלעולם לא הושלם.

בעיה זו של יעד קבוע-נע היא משהו די ייחודי לתוכנה. אם אתה מהנדס מבנים לא צפוי לך להפוך בית לגובה בן 20 קומות, או מכונית לצלוחית מעופפת. ובכל זאת בתוכנה אנו עושים זאת ללא הרף.

כאשר דרישות המוצר ומקרי השימוש משתנים, ההנחות הבסיסיות לתוכנה נכתבו בתחילה עשויות כבר לא להיות רלוונטיות.

כך שאותה חתיכה גאה של קוד נפוץ שעשיתם מחדש (אך שכחתם לגמרי לחלוטין) כבר לא עובדת כפי שאתם חושבים שזה היה עושה.

איבדתי את הספירה של כמה פרויקטים של כריתת מחדש מחודשת או באגים מגעילים שראיתי שהם תוצאה ישירה של אופטימיזציה מוקדמת או של קשר מקרי - עד לנקודה בה אני נמנע כעת מדברים כמו ירושה כמו מגפה.

דברים שיש להם קשרי קשר בשוגג יגלו במהרה את ההבדלים שלהם כאשר הם יתפתחו מעבר למצבם הראשוני. כל נוקשות בקשירת קוד אזי תהיה נתיב מסיבי להיפטר ממנו.

ככל שיש יותר שכבות של קשרים מקריים בקוד, כך הוא שדה מוקשים יותר לנווט. CVE-2018–17144 הוא דוגמה מושלמת לכך.