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


