"חוב טכני" הוא לא חוב אמיתי

alt-image

מאת אריאל ליברמן

מרץ 31, 2022

בעולמות הפיתוח, המושג "חוב טכני" מבטא את הרעיון שהחלטות מסוימות בכתיבת הקוד יובילו לתוצאות שידרשו התמודדות עתידית. כשהמפתח חוסך זמן עכשיו, הוא יוצר מצב שבו יצטרך להשקיע זמן בעתיד. במילים אחרות, הוא "לווה" מהעתיד. אולם למרות שהדימוי הזה עוזר בהרבה מצבים, ישנם הבדלים מהותיים בין חוב טכני לחוב כספי שחשוב לעמוד עליהם.
 
עבור אלה שלא מכירים את המושג "חוב טכני" נתחיל בדוגמה קצרה. נניח שאני צריך לסיים פרויקט בשבוע הבא, אבל האורך הכולל של המשימות שיש לי הוא יותר משבוע. אחת מהמשימות הללו היא מערכת ה-logging. אמנם בעייתי לספק אפליקציה עם כיסוי logging חלקי, אבל לצורך הדיון נניח שהחלטתי שמועד האספקה חשוב יותר מפיתוח מלא של ה-logging.
 
כיסוי טוב של logging הוא תכונה חיונית שחובה לפתח. בלעדיה יהיה בלתי אפשרי לחקור באופן מספק בעיות קוד (באגים), בעיות של הלקוח, או איומי אבטחה. לפיכך החלטתי לספק את הפרויקט בתוך שבוע, ולספק את המערכת עם ה-logging המלא בשבוע שלאחריו. בעיקרון, מה שעשיתי הוא ליצור חוב טכני בתוכנה. הקוד של הפרויקט דלוור באופן לא מלא, ואני בחרתי לספק את התכונה החסרה מאוחר יותר. רק מכיוון שהחוסר בקוד לא מנע ממני מלשחרר את הפרויקט לא אומר שהשינויים לא צריכים לקרות: אני פשוט יצרתי חוב טכני בכך שבחרתי לבצע אותם מאוחר יותר. המשמעות הזו של חוב טכני יעילה מאוד כדי לספק הסבר לעובדה שאתם עדיין עובדים על מערכת או על תכונה שכבר סופקה. בהקשר הזה, הביטוי "חוב טכני" מתרגם אינטואיציות והחלטות מסובכות של המפתח לשפה שלמנהלים קל יותר להבין. 
 
אולם בדרך כלל, חוב טכני מורכב יותר מאשר בדוגמה שלעיל. על פי רוב, חוב טכני צץ בגלל שחלקים בקוד צריכים להיכתב מחדש על מנת לתמוך בצורה "נקייה" יותר בתכונות חדשות. נניח שכדי לקודד תכונה חדשה במערכת שלנו נדרשים יומיים. אבל יידרש רק יום אחד לקודד את התכונה הזו (ואולי תכונות דומות נוספות) אם נקודד את החלק כולו בצורה חדשה ושונה, דבר שידרוש חמישה ימי פיתוח. עבור תכונה מסוימת אחת השקעה של שני ימי פיתוח תהיה מהירה יותר. אולם לטווח הארוך, במצטבר, הקידוד מחדש של החלק כולו יהיה כנראה מהיר יותר. הבחירה שלא לקודד את החלק כולו מחדש יוצרת "חוב טכני" בשתי דרכים: לא רק שאינך מקודד את הקוד מחדש כדי לחסוך זמן פיתוח עבור כל תכונה חדשה, אלא שעם כל תכונה חדשה שאתה מוסיף אתה מגדיל את היקף הקוד שתצטרך לכתוב מחדש שכן גם התכונה החדשה תצטרך להיכתב שוב כאשר כל החלק הזה בתוכנה יקודד, בסופו של דבר, מחדש.
 
לאחר שביססנו את המשמעות של "חוב טכני" ואת האופן שבו הוא מתנהג, אני מבקש להביא כמה דוגמאות המדגימות את ההבדלים בין "חוב טכני" לחוב כספי. אני סבור שהשימוש במושג הזה גורם לאנשים לייחס בצורה מוגזמת את המנגנונים של חוב כספי למה שבאמת קורה בחוב טכני באופן שעלול לגרום לטעויות טכניות אסטרטגיות.
 
ההבדל הראשון הוא שכל החובות הכספיים חייבים להיפרע, אבל הדבר אינו נכון עבור כל החובות הטכניים. אם אני לווה כסף מהבנק עבור פרויקט והפרויקט נכשל, אני עדיין חייב לבנק את הכסף. מצד שני, אם צברתי חוב טכני בפרויקט שנכשל, אני לא חייב חוב טכני בכלל. כלומר, אם בסופו של יום לא משתמשים בתוכנה, אז הזמן (כסף) "ששילמתי" בלסגור את החוב הטכני בעצם היה בזבוז. זו הסיבה לכך שבפרויקטים חדשים שהצלחתם אינה מובטחת צבירה של חוב טכני היא בעצם "רווחית", שכן העבודה תיצטרך להתבצע רק לאחר הוכחת ההצלחה של הפרויקט כולו. אם הפרויקט יסתיים בכישלון, או שהחברה פונה לכיוון אחר, החוב הטכני בעצם מתבטל והופך לכסף שנחסך. (ראו סטארט-אפ.)
 
ההבדל השני בין חוב טכני לחוב כספי נעוץ בכך שלפעמים לחוב טכני יש עמלת פירעון מוקדם. מתכנתים אוהבים לשכתב (refactor) את הקוד שלהם כך שיעבוד טוב עם התכונות שבהן עליו לתמוך. באופן אידיאלי, קוד אמור להיות בנוי באופן שיאפשר לקודד בו בקלות את כל התכונות העתידיות כך שהן יעבדו בצורה טובה עם הארכיטקטורה. אולם אף אחד לא באמת יודע מה יהיו הדרישות העתידיות. כולנו היינו מעורבים בפרויקטים שהנחות יסודיות שלהם הופרכו תוך שבועות ספורים מרגע ההשקה. אם את משכתבת את הקוד מוקדם מידי, יש סיכון שתוך זמן קצר תצטרכי לשכתב אותו שוב בגלל שההנחות השתנו. למרות שאינך יכולה כמובן לנבא את העתיד, כדאי לתת את הדעת לכך שיכולות להיות יתרונות להמתנה עם שכתוב הקוד.
 
ההבדל השלישי בין חוב טכני לחוב כספי קשור לעובדה שלעתים, חוב טכני קָטֵן ככל שהוא מצטבר. התנהגות זו של החוב הטכני נובעת מכך שככל שהמפתחים מוסיפים לעבוד על המערכת הם מבינים טוב יותר מה הם עושים. ככל שהם מותחים את גבולות המערכת, ברור להם יותר כיצד היא צריכה לעבוד הלכה למעשה. ככל שהם משלבים מערכות אחרות לתוך המערכת הם מבינים טוב יותר היכן נמצאות נקודות הממשק האידיאליות. ההתמצאות הטובה יותר במערכת ובתכונותיה תגרום לניקוי החוב הטכני להיות מהיר וקל יותר.
 
השורה התחתונה היא שהמפתח לניהול חוב טכני הוא לא רק המעקב אחריו, אלא גם התנהלות חכמה בשאלה מתי כדאי "לפרוע" אותו. אם לעולם אינך יוצר חוב טכני, או שאתה תמיד מנסה לסלק את החוב הטכני שלך במהירות האפשרית, אתה עלול לעשות טעויות אסטרטגיות לגבי ניצול אופטימלי של משאבי הפיתוח שלך.

אריאל ליברמן

ארכיטקט תוכנה

Avatar

אריאל ליברמן מפתח תוכנה מאז שנת 1987, ובחמש השנים האחרונות הוא ארכיטקט תוכנה באפלייד מטיריאלס. לפני זה עבד בתפקידי ניהול מו"פ בשורה של חברות טכנולוגיה, ובכלל זה ורינט, נוקיה סימנס, וקומברס. ליברמן אוהב ללמוד טכנולוגיות חדשות מחד, ומאידך לצאת לטרקים מאתגרים בעולם: הוא עשה בין היתר את המסלולים של טור דה מון בלאן (160 ק"מ) ואלטה ויסטה (150 ק"מ).

 

נשים למען נשים בהייטק: על פורום הנשים של אפלייד

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

 

 

 

קרא/י עוד

"אנחנו לא רק כותבים קוד — אנחנו פותרים בעיות"

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

 

 

קרא/י עוד

והמנצח הוא...

60 צוותים השתתפו השנה בהאקתון של חטיבת התוכנה באפלייד מטיריאלס. אחרי 1,100 שעות של למידה משותפת ויומיים רצופים של כתיבת קוד שלושה פרויקטים הגיעו למקומות הראשונים, וייושמו בקרוב במחשבי החברה.

 

 

קרא/י עוד