אפיון · מלאכת הפיתוח

שתי כוסות ליד המיטה

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

יולי 2026·7 דקות קריאה

כל בדיחה יש בה חלק מהבדיחה

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

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

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

אני מדבר על משהו אחר. על מה שקורה ברגע שאנחנו יושבים מול הלקוח.

הבקשה שתמיד מגיעה באמצע

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

רגע. עצור. חשבת מה יקרה באמצע הפיתוח?

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

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

"רק שאילתה אחת, משהו פשוט"

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

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

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

היא, מצדה, הדגישה כל הזמן: "לא, מה פתאום, ממש לא, משהו פשוט ומהיר".

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

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

התא שהיה אמור להכיל תנאי אחד

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

ואז הסתכלתי על סוג הנתונים שעמדו לרשותי. זה לא היה משתנה דיכוטומי כמו גבר/אישה, אלא משהו בסגנון "משכורת גבוהה מ-N".

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

=IF(salary>x1, action1,
   IF(salary>x2, action2,
      IF(salary>x3, action3, action4)))

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

"ואם ישתנה — שהלקוח ישלם"

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

אפשרי. אבל יש לי ארבעה טיעונים נגד.

הטיעון הערכי

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

הטיעון העצלן

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

הטיעון האנוכי

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

הטיעון הפרקטי

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

לסיכום

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

חזרה לכל המאמרים