ارباب حلقهها: پل خازاد-دووم
در قسمت قبل درباره بخشی از کاربردهای «انسان در میان حلقه» نوشتم. تمرکز مطلب بیشتر روی کارهای حساسی مثل دیپلوی روی production بود، اما اگر کمی zoom out کنیم، افراد بیشتری رو داخل حلقه میبینیم؛ افرادی که وقتی در تکتک مراحل workflow قرار میگیرن، خیلی زود گلوگاه و صفهای طولانی میسازن.
در زمانهای خیلی خیلی قدیم، منظورم یکی دو سال پیشه، توی پروسه توسعه نرمافزار درخواست کار وارد backlog یا برد Jira میشد و بخش زیادی از زمان در صف توسعه میموند. تحلیل و کدنویسی ظرفیت محدودی داشت و developer گلوگاه اصلی مسیر بود. حالا LLMها و coding agentها این بخش رو سریعتر کردن، اما سریعتر شدن یک قسمت از چرخه توسعه به معنی سریعتر شدن کل حلقه نیست.
این روزها بیشتر شکایتها از صف مربوط به PRهاست. وقتی ظرفیت تولید کد بیشتر میشه ولی روش review و merge همون روش قبلی باقی میمونه، صف فقط از یک نقطه به نقطه دیگه منتقل میشه. قبلا ticketها منتظر developer بودن و حالا PRها منتظر reviewer میمونن. ما گلوگاه رو برطرف نکردیم؛ فقط جاش رو عوض کردیم.
قبلا یکی از اولین چیزهایی که بعضی مدیرهای پروژه سعی میکردن دورش بزنن «تست» بود. جمله «فعلا نیاز نیست تست بنویسید» رو بارها شنیدم و خیلی از developerها هم از نوشتنش فراری بودن. اما با قدرتی که الان در اختیار داریم، کاری که قبلا ممکن بود ساعتها زمان ببره در بعضی موارد چند دقیقهای انجام میشه.
اما وقتی داریم تختهگاز جلو میریم و بهجای هفتهای پنج feature روزی ده تا اضافه میکنیم، ننوشتن تست مثل ساختن قایق با توری ماهیگیری هست. با این سرعت، تعداد باگها و خطرهای امنیتی هم بیشتر میشه. تست دیگه یک چیز لوکس نیست که باهاش به تیمهای دیگه پز بدیم، یکی از ابزارهاییه که باید قبل از رسیدن تغییر به صف review، بخش قابلتکرار بررسی رو انجام بده.
خود review و merge هم باید بخشی از حلقه agentic بشن تا بررسیهای تکراری با policy، test، static analysis و eval انجام بشن و تغییرهای کوچک و قابلrollback خودکار عبور کنن. تغییرهای حساس باید برای قضاوت انسان باقی بمونن؛ وگرنه یک bot که فقط زیر هر PR چند پاراگراف متن اضافه کنه ممکنه خودش به گلوگاه جدیدی تبدیل بشه.
ضمنا PR بدون تست یعنی کاری رو که agent میتونست قبل از ساختن PR انجام بده، دوباره به reviewer سپردیم و گلوگاه تازهای ساختیم.
اگر فقط تولید رو خودکار کنیم و بررسی خروجی رو با همون پروسه قدیمی ادامه بدیم، حلقه رو سریعتر نکردیم؛ فقط صف بعدی رو سریعتر پر کردیم.