توسعهدهندگان اکنون میتوانند چندین نشست عامل کدنویسی (coding-agent sessions) را بهطور همزمان راهاندازی کنند، بدون اینکه نگران بازنویسی فایلهای وضعیت یا تداخل فایلهای پنهان باشند. یک الگوی مشاورهای «اشتراکگذارینشده» (share-nothing) فضای کاری هر عامل را ایزوله کرده و درباره تداخلهای احتمالی هشدار میدهد. این رویکرد، قفلهای سخت (hard locks) را با یک رجیستری سبک جایگزین میکند که پیش از وقوع همپوشانی در کارها، آنها را علامتگذاری میکند و باعث میشود خط لولهها (pipelines) حتی در صورت کرش کردن یک نشست، به حرکت خود ادامه دهند.
چرا عوامل موازی دچار مشکل میشوند
اجرای بیش از یک دستیار کدنویسی خودکار در یک مخزن (repository) واحد، سرعت تولید کد، تست یا بازنویسی (refactoring) را افزایش میدهد. در عمل، دو مشکل بلافاصله ظاهر میشوند:
- فساد وضعیت (State corruption) – دو عامل در یک فایل وضعیت مینویسند؛ نوشتهی دوم جایگزین نوشتهی اول شده و پیشرفت کار را پاک میکند.
- برخورد فایلها (File collision) – دو عامل بدون اطلاع از یکدیگر، یک فایل منبع را ویرایش میکنند. این تداخل زمانی مشخص میشود که یک diff تغییرات متفاوت را نشان دهد.
هر دو مسئله باعث اتلاف وقت توسعهدهنده شده و میتوانند باگهای سختی برای ردیابی ایجاد کنند.
قانون «اشتراکگذارینشده»
ایده اصلی ساده است: هر عامل فضای موقت (scratchpad) اختصاصی خود را روی دیسک دارد و فقط در فایلهای متعلق به همان نشست مینویسد. تنها اجازه داشتن یک فایل مشترکِ عمدی در هر شاخه (branch) وجود دارد که از قانون «آخرین نویسنده برنده است» (last-writer-wins) پیروی میکند؛ یعنی هر عاملی که آخرین بار بنویسد، محتوای نهایی را تعیین میکند.
یک لایه حضور (presence layer) هر نشست فعال را ردیابی میکند:
- نام شاخه (Branch name)
- لیست فایلهای در حال تغییر
- زمان آخرین فعالیت
هنگام شروع یک نشست جدید، سیستم با رجیستری مشورت میکند. اگر نشست دیگری از قبل در حال کار روی هر یک از همان فایلها باشد، پیش از شروع هرگونه کاری، به توسعهدهنده هشدار داده میشود.
قفلهای مشاورهای در مقابل مسدودکننده
فایلهای قفل سنتی مانند یک جاده بنبست عمل میکنند: وقتی قفلی اعمال شود، هر فرآیند دیگری تا زمان آزاد شدن قفل منتظر میماند. اگر نشستِ مالک قفل کرش کند، قفل میتواند برای مدت نامعلومی باقی بماند و جستجوی دستی برای یافتن فایلهای قفل قدیمی را اجباری کند.
مدل مشاورهای ملایمتر است. این مدل هنگام تشخیص تداخل احتمالی، هشدار صادر میکند اما نشست جدید را متوقف نمیکند. اگر یک ورودی در رجیستری قدیمی باشد — به این معنی که فرآیند ایجادکننده آن دیگر وجود ندارد — سیستم همچنان فقط هشدار میدهد و اجازه میدهد توسعهدهنده تصمیم بگیرد که آیا ادامه دهد یا خیر.
نحوه پیادهسازی این الگو
- تقسیمبندی وضعیت بر اساس نویسنده – به هر عامل دایرکتوری اختصاصی برای فایلهای موقت و وضعیت بدهید. فایلهای مشترک را فقط برای دادههای واقعاً جهانی رزرو کنید و قانون آخرین نویسنده برنده است را فقط در آنجا اعمال کنید.
- تزریق آگاهی در هنگام اجرا – قبل از شروع کار یک عامل، رجیستری حضور را بخوانید و لیست فایلهای درخواستی را با ورودیهای موجود مقایسه کنید. در صورت مشاهده همپوشانی، عملیات را متوقف یا هشدار دهید.
- تأیید زنده بودن در زمان خواندن – هنگام بررسی یک ورودی رجیستری، بررسی کنید که آیا شناسه فرآیند (process ID) ثبتشده هنوز در سیستمعامل در حال اجرا است یا خیر. ورودیهای مربوط به فرآیندهای متوقفشده را حذف کنید.
- اولویت دادن به حالت مشاورهای نسبت به مسدودکننده – اجازه دهید کنترل در دست توسعهدهندگان باقی بماند. یک هشدار به آنها اجازه میدهد ادامه دهند، مکث کنند یا لغو کنند و از بنبست (deadlock) جلوگیری شود.
- ردیابی وضعیتهای انتظار – وقتی عوامل زیادی فعال هستند، توجه توسعهدهنده به گلوگاه تبدیل میشود. نمایش دهید که کدام عوامل منتظر ورودی انسان هستند تا بتوان اولویتبندی کارها را تغییر داد.
همه اینها را میتوان با یک دایرکتوری ساده از فایلهای JSON ساخت؛ نیازی به پایگاه داده خارجی یا message bus نیست. فرمت ذخیرهسازی ساده، بازرسی سیستم را آسان و انتقال آن را بین محیطهای مختلف امکانپذیر میکند.
ریسکها و نکات متقابل
برخی تیمها ممکن است استدلال کنند که یک قفل سخت امنیت را تضمین میکند: هیچ دو عاملی نمیتوانند هرگز در یک فایل بنویسند. معامله (trade-off) این کار، کاهش تابآوری است؛ نشستهای کرششده قفلهای یتیمی (orphaned locks) به جا میگذارند که کل جریان کار را متوقف میکند.
چه چیزهایی را باید زیر نظر داشت
اگر با چندین دستیار کدنویسی مبتنی بر هوش مصنوعی سر و کله میزنید، الگوی مشاورهای «اشتراکگذارینشده» مسیری عملگرایانه برای جلوگیری از تداخل آنها با یکدیگر ارائه میدهد. با ایزوله کردن وضعیت، آشکارسازی زودهنگام قصد کار و اجازه دادن به انسانها برای تصمیمگیری در مورد ادامه کار، این روش بین امنیت و انعطافپذیری مورد نیاز خط لولههای توسعه مدرن تعادل برقرار میکند.
