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

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

עם הכנסות של 1,200,000 והוצאות של 870,000, הרווח לפני בונוס הוא 330,000. בונוס של עשרה אחוזים מהרווח שאחריו יוצא 30,000, והרווח אחרי הבונוס הוא 300,000. הבדיקה מיידית: עשרה אחוזים מ-300,000 הם בדיוק 30,000.
אותו מבנה בדיוק פותר גם עמלה שמחושבת כאחוז מההכנסה נטו אחרי העמלה, וגם ריבית שנצברת על יתרה שהיא עצמה משנה. השם משתנה, האלגברה לא.

וההבדל שחשוב יותר מהמספרים: בגרסה הזו אין בקובץ אף הפניה מעגלית. אין תיבת סימון שמישהו צריך לזכור להשאיר דלוקה, ואין תלות בהגדרה שנשמרת בקובץ ונוסעת איתו למחשב אחר.
הכלל
הפניה מעגלית שהושתקה אינה נעלמת. היא הופכת למספר שנראה תקין.
וכלל שני, שקשה יותר לקבל. חישוב איטרטיבי אינו פתרון אלא ויתור מודע על פתרון סגור, ולכן הוא צריך להירשם בקובץ כמו כל הנחה אחרת: מי הדליק, מתי, ולמה לא נפתחה הלולאה. קובץ שאין בו את שלוש התשובות האלה מייצר מספר שאיש אינו יודע להסביר, בדיוק ברבעון שבו אין זמן לחפש.
והשאלה שנשארה פתוחה
נניח שהלולאה נפתחה, שהמודל מסתדר, ושהאזהרה כבר לא קופצת. עדיין נשארת השאלה שהמאמר הזה אינו עונה עליה: כמה קבצים אחרים במחלקה עובדים עכשיו עם חישוב איטרטיבי דלוק שאיש אינו זוכר שהדליק.
בכל ארגון שנכנסתי אליו השנה היה לפחות קובץ אחד כזה. שאלתי מי הדליק. התשובה הקבועה הייתה שזה היה לפני כמה שנים, לפני דוח דחוף, ומאז הקובץ עובד.
את הדיון הזה אני מנהל בתוך מועדון The UNIQUE Way, ושם נמצאת גם ערכת ההפניה המעגלית המלאה: בדיקת הדקה שמאתרת את הלולאה, שלוש הלולאות שחוזרות במחלקות כספים והפתרון האלגברי לכל אחת, טבלת ההחלטה מתי מותר להדליק חישוב איטרטיבי, ורשימת הבדיקה לפני שהקובץ יוצא מהמחלקה. ההצטרפות חינם.





