מפתחים יכולים כעת להפעיל מספר סשנים של סוכני קוד בו-זמנית מבלי לחשוש מקבצי מצב (state files) שייכתבו מחדש או מהתנגשויות קבצים נסתרות. תבנית "share-nothing" מייעצת (advisory) מבודדת את סביבת העבודה של כל סוכן ומזהירה מפני קונפליקטים פוטנציאליים. הגישה מחליפה נעילות קשיחות (hard locks) ברישום (registry) קל משקל המסמן עבודה חופפת לפני שהיא מתרחשת, מה שמאפשר לתהליכי העבודה (pipelines) להמשיך להתקדם גם כאשר סשן קורס.
מדוע סוכנים מקבילים יוצרים בעיות
הרצת יותר מבונה תכנות אוטומטי אחד בתוך מאגר (repository) יחיד מאיצה את יצירת הקוד, הבדיקות או הריפקטורינג (refactoring). בפועל, שתי בעיות צצות מיד.
- שחיתות מצב (State corruption) – שני סוכנים כותבים לאותו קובץ מצב; הכתיבה המאוחרת יותר דורסת את הקוד הקודם, ומוחקת התקדמות.
- התנגשות קבצים (File collision) – שני סוכנים עורכים את אותו קובץ מקור מבלי להיות מודעים זה לזה. הקונפליקט מופיע מאוחר יותר, כאשר ה-diff מראה שינויים שונים.
שתי הבעיות הללו מבזבזות זמן מפתח ויכולות להוביל לבאגים שקשה מאוד לאתר.
כלל ה-"share nothing"
הרעיון המרכזי הוא פשוט: לכל סוכן יש שטח עבודה (scratchpad) פרטי משלו על הדיסק, והוא כותב רק לקבצים השייכים לאותו סשן. רק קובץ אחד משותף במכוון לכל ענף (branch) מותר, והוא פועל לפי כלל "הכותב האחרון מנצח" – הסוכן שכותב אחרון קובע את התוכן הסופי.
שכבת נוכחות (presence layer) עוקבת אחר כל סשן פעיל:
- שם הענף (Branch name)
- רשימת הקבצים שבהם נעשה שימוש
- חותמת זמן של הפעילות האחרונה
כאשר מתחיל סשן חדש, הוא בודק את הרישום (registry). אם סשן אחר כבר מטפל באחד מהקבצים הללו, המפתח מקבל אזהרה לפני תחילת העבודה.
נעילות מייעצות (Advisory) לעומת נעילות חוסמות (Blocking)
קבצי נעילה מסורתיים פועלים כמו דרך ללא מוצא: ברגע שנלקחה נעילה, כל תהליך אחר ממתין עד שהנעילה תשתחרר. אם הסשן המחזיק בנעילה קורס, הנעילה עלולה להישאר תקועה ללא הגבלת זמן, מה שמאלץ חיפוש ידני אחר קבצי נעילה ישנים.
המודל המייעץ (advisory) עדין יותר. הוא מנפיק אזהרה כאשר מזוהה קונפליקט פוטנציאלי אך אינו עוצר את הסשן החדש. אם רשומה ב-registry היא ישנה – כלומר, התהליך שיצר אותה כבר אינו קיים – המערכת עדיין רק מזהירה, ומאפשרת למפתח להחליט אם להמשיך.
איך ליישם את התבנית
- חלוקת המצב לפי כותב – הקצה לכל סוכן ספרייה (directory) משלו לקבצים זמניים ומצב (state). שמור קבצים משותפים עבור נתונים גלובליים באמת והחל את כלל "הכותב האחרון מנצח" רק שם.
- הזרקת מודעות בעת ההפעלה – לפני שסוכן מתחיל, קרא את רישום הנוכחות והשווה את רשימת הקבצים המבוקשת לרשומות הקיימות. בטל את הפעולה או הוצא אזהרה אם נמצאה חפיפה.
- אימות חיות (liveness) בזמן הקריאה – בעת בדיקת רשומה ב-registry, בדוק האם מזהה התהליך (process ID) המתועד עדיין רץ במערכת ההפעלה. מחק רשומות השייכות לתהליכים שנסגרו.
- העדפת מודל מייעץ על פני חוסם – אפשר למפתחים לשמור על שליטה. אזהרה מאפשרת להם להמשיך, להשהות או לבטל, ובכך למנוע מצב של קיפאון (deadlock).
- מעקב אחר מצבי המתנה – כאשר סוכנים רבים פעילים, הקשב של המפתח הופך לצוואר הבקבוק. הצג אילו סוכנים ממתינים לקלט אנושי כדי שניתן יהיה לתעדף מחדש את העבודה.
ניתן לבנות את כל זה באמצעות תיקייה פשוטה של קבצי JSON; אין צורך במסד נתונים חיצוני או ב-message bus. פורמט האחסון הפשוט הופך את המערכת לקלה לביקורת וניידת בין סביבות שונות.
סיכונים ונקודות למחשבה
חלק מהצוותים עשויים לטעון שנעילה קשיחה מבטיחה בטיחות: שני סוכנים לעולם לא יוכלו לכתוב לאותו קובץ. המחיר הוא פחות עמידות (resilience) – סשנים שקורסים מותירים נעילות יתומות שמעכבות את כל זרימת העבודה.
מה כדאי לשים לב אליו
אם אתם מנהלים במקביל מספר עוזרי קוד מבוססי AI, תבנית ה-"share nothing" המייעצת מציעה נתיב פרגמטי למנוע מהם להפריע זה לזה. על ידי בידוד המצב, חשיפת הכוונה בשלב מוקדם ומתן אפשרות לבני אדם להחליט מתי להמשיך, השיטה מאזנת בין בטיחות לבין הגמישות שנדרשת בתהליכי פיתוח מודרניים.
