فاز 14 · درس 44

ساخت برنامه اجرایی مبتنی بر شواهد برای ایجنت‌ها

نوع
مفهومی و ساختنی
زمان
حدود 65 دقیقه
زبان‌ها
Python (stdlib)
یک ساختار نموداری متصل شامل گره‌های شیشه‌ای که با خطوط نوری به هم مرتبط شده‌اند و ترتیب اولویت وظایف را نمایش می‌دهند
فهرست مطالب
  1. اهداف یادگیری
  2. چرا برنامه‌های ایجنت‌ها شکست می‌خورند
  3. پیش از پیاده‌سازی، قرارداد را مشخص کنید
  4. شواهد، مسیر برنامه را تغییر می‌دهند
  5. طراحی برای وقفه
  6. اعتبارسنجی برنامه
  7. ساخت آن
  8. استفاده از آن با ایجنت کدنویسی
  9. تمرین‌ها
  10. مطالعه‌ی بیشتر
  11. دستاورد شما

یکی از رایج‌ترین مشکلات هنگام کار با ایجنت‌های کدنویسی، تکیه بر فهرست‌های ساده و خطی برای انجام کارهاست؛ برنامه‌هایی که صرفاً درخواست اولیه را با جملاتی کلی مثل «API را تغییر بده» تکرار می‌کنند. این رویکرد معمولاً به دوباره‌کاری، تغییرات پیش‌بینی‌نشده در قراردادهای برنامه و اتلاف زمان منجر می‌شود، زیرا هیچ ارجاعی به واقعیت‌های درون مخزن کد ندارد.

در این درس یاد می‌گیرید که چگونه یک برنامه را به‌جای فهرست متنی، به شکل یک گراف وابستگی مبتنی بر شواهد (Evidence-backed execution plan) مدل‌سازی کنید. با این روش، هر گام دلیل مشخصی در کد دارد، پیش‌نیازهای دقیق آن تعیین می‌شود و تا زمانی که اثباتِ پایان کار ارائه نشود، گام‌های وابسته اجرا نخواهند شد.

این رویکرد ساختاریافته کمک می‌کند تا وظایف موازی به‌درستی تفکیک شوند و در صورت قطع غیرمنتظره‌ی نشست کاری ایجنت، بتوان بدون گم‌کردن وضعیت پیشرفت، پروژه را دقیقاً از نقطه‌ی امن بعدی ادامه داد.

برنامه یک فهرست کارهای قشنگ‌تر نیست؛ یک گراف وابستگی است که در آن هر تغییر دلیلی دارد و هر گره پایانی اثباتی.

اهداف یادگیری

  • تبدیل چارچوب مسئله به وظایف کاری همراه با شواهد (Evidence) و اثبات.
  • مدل‌سازی اولویت اجرا به شکل وابستگی‌ها، به‌جای توالی متنی ساده.
  • شناسایی واقعیت‌های نامشخص، وابستگی‌های ناشناخته و چرخه‌ها پیش از ویرایش فایل‌ها.
  • تفکیک گام‌هایی که می‌توانند هم‌زمان اجرا شوند از گام‌هایی که حتماً باید منتظر بمانند.

چرا برنامه‌های ایجنت‌ها شکست می‌خورند

برنامه‌های ضعیف صرفاً درخواست اولیه را در زمان آینده تکرار می‌کنند:

  1. API را به‌روزرسانی کن.
  2. تست‌ها را اضافه کن.
  3. مستندات را به‌روزرسانی کن.

در این فهرست هیچ‌چیز نمی‌گوید چه چیزهایی در مخزن پیدا شده، چرا دقیقاً همین فایل‌ها درست هستند، کدام قرارداد اول تغییر می‌کند یا چه کارهایی می‌توانند هم‌زمان انجام شوند. ایجنت (Agent) می‌تواند تک‌تک این گام‌ها را اجرا کند و با این حال کار دوباره روی دستتان بگذارد.

یک برنامه‌ی قوی، برای هر وظیفه‌ی کاری 5 تعهد مشخص ایجاد می‌کند:

تعهد هدف
شناسه مرجع یکتا و ثابت برای وابستگی‌ها و تحویل کار
تغییر کوچک‌ترین تغییر ممکن در رفتار یا قرارداد
شواهد واقعیت‌های کشف‌شده در مخزن که تغییر را توجیه می‌کنند
وابستگی‌ها کارهایی که حتماً باید اول محقق شده باشند
اثبات اعتبارسنجی دقیقی که باعث بسته شدن کار می‌شود

پیش از پیاده‌سازی، قرارداد را مشخص کنید

وقتی چند بخشِ مختلف به یک رفتار معین وابسته‌اند، اول همان رفتار را تعریف کنید. با این کار، تست‌ها، پیاده‌سازی، مستندات و تست‌های یکپارچه‌سازی می‌توانند از یک قرارداد واحد استفاده کنند، نه اینکه هرکدام نسخه‌ی ساختگی خودش را بسازد.

قراردادپیاده‌سازیمستنداتدروازه یکپارچه‌سازی

این گراف، امکان اجرای هم‌زمانِ امن را نشان می‌دهد. بعد از تثبیت قرارداد، پیاده‌سازی و مستندسازی می‌توانند دوشادوش هم پیش بروند. بخش یکپارچه‌سازی منتظر هر دوی آن‌ها می‌ماند.

شواهد، مسیر برنامه را تغییر می‌دهند

شواهد مخزن صرفاً جنبه‌ی تزئینی ندارند؛ باید بتوانند دامنه‌ی کار را تغییر دهند:

  • وجود یک تابع کمکی آماده، نیاز به ساخت یک ساختار انتزاعی جدید را حذف می‌کند.
  • نتیجه‌ی یک تست سازگاری، یک گام مهاجرت (Migration) تحمیل می‌کند.
  • محدودیت‌های استقرار (Deployment)، تغییرِ اسکیما را به کار دیگری منتقل می‌کند.
  • شکل تایپ پاسخ عمومی، ترتیب پیاده‌سازی و مستندسازی را عوض می‌کند.

اگر شواهد نتوانند برنامه را تغییر دهند، احتمالاً اصلاً شواهدی مرتبط با آن تصمیم نبوده‌اند.

طراحی برای وقفه

جلسات ایجنت‌های کدنویسی بدون هشدار قبلی قطع می‌شوند. برنامه‌ای که قابلیت ادامه‌یافتن بعد از وقفه (Interrupt) را دارد، وظایف کاری را آن‌قدر ریز خرد می‌کند که یک نشست دیگر بتواند موارد زیر را مشخص کند:

  • کدام وظیفه تمام شده است؛
  • کدام اثبات اجرا شده است؛
  • کدام دست‌سازه‌ها (Artifacts) تغییر کرده‌اند؛
  • کدام وابستگی‌ها اکنون آزاد شده‌اند؛
  • کار امن بعدی چیست.

وضعیت پیشرفت را فقط داخل چک‌باکس‌های محیط چت نگه ندارید. برنامه را کنار خودِ کار ذخیره کنید.

اعتبارسنجی برنامه

پیش از شروع اجرا، اگر هرکدام از این شرایط برقرار بود برنامه را رد کنید:

  • شناسه‌ای تکراری باشد؛
  • وظیفه‌ای هیچ شواهدی نداشته باشد؛
  • وظیفه‌ای هیچ اثباتی نداشته باشد؛
  • در بخش وابستگی‌ها، نام وظیفه‌ای ناشناخته آمده باشد؛
  • گراف دارای چرخه باشد؛
  • اولین اقدام بازگشت‌ناپذیر پیش از رفع ابهام مربوطه رخ دهد.

5 مورد اول مکانیکی هستند. مورد آخر نیازمند قضاوت است و باید صراحتاً بیان شود.

ساخت آن

فایل code/main.py وظایف کاری را مدل‌سازی می‌کند، مدارک اثبات آن‌ها را اعتبارسنجی می‌کند، با مرتب‌سازی توپولوژیک (Topological Sort) امواج اجرا را به‌دست می‌آورد و خروجی را در outputs/evidence-plan.json می‌نویسد.

اجرا کنید:

python3 code/main.py
python3 -m unittest discover code/tests -v

این مثال سه موج تولید می‌کند. تعریف قرارداد اول اجرا می‌شود. پیاده‌سازی و مستندسازی با هم پیش می‌روند. گیت یکپارچه‌سازی در آخر کار اجرا می‌شود.

استفاده از آن با ایجنت کدنویسی

پیش از آنکه ایجنت فایل‌ها را تغییر دهد، از او بخواهید برنامه را آماده کند. برنامه را با بررسی این سه معیار بازبینی کنید:

  1. هر مسیر و هر ادعای رفتاری، مدرکی در مخزن داشته باشد.
  2. هر وظیفه یک روش اثباتِ پایان مشخص و شفاف داشته باشد.
  3. گراف، کارهای پرهزینه یا بازگشت‌ناپذیر را تا زمان رفع ابهامی که به آن وابسته‌اند به تعویق بیندازد.

برنامه را تایید کنید، نه وعده‌ی مبهمِ «حواسم هست» را.

تمرین‌ها

  1. یک کار مهاجرت اضافه کنید که نیازمند تایید صریح انسان باشد.
  2. یک چرخه بسازید و اختلاف‌نظر محصولی پنهان پشت آن را توضیح دهید.
  3. وظیفه‌ای را که دو دستور اثبات دارد به دو وظیفه خرد کنید.
  4. یک وظیفه‌ی کاری اضافه کنید که بتواند در موج دوم اجرا شود، بدون اینکه به هیچ‌کدام از branchهای موجود دست بزند.
  5. خروجی برنامه را در قالب Markdown رندر کنید، درحالی‌که ساختار JSON همچنان منبع اصلی حقیقت بماند.

مطالعه‌ی بیشتر

دستاورد شما

فایل outputs/evidence-plan.json را نگه دارید. این فایل در درس بعدی قرارداد واگذاری کار خواهد بود.

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچه چیزی یک برنامه اجرایی را از یک فهرست کارها (to-do list) متمایز می‌کند؟
  2. حین درسچرا باید یک قرارداد مشترک را قبل از پیاده‌سازی‌های آن تعریف کرد؟
  3. حین درسیک چرخه وابستگی (dependency cycle) معمولاً چه چیزی را آشکار می‌کند؟
  4. حین درسچه زمانی دو آیتم کاری می‌توانند در یک موج اجرایی مشترک قرار گیرند؟
  5. پس از درسچرا به هر آیتم کاری شواهد ضمیمه می‌شود؟
  6. پس از درسچه چیزی یک برنامه را قابل ازسرگیری می‌کند؟

سؤالات متداول

چرا فهرست کارهای ساده برای هدایت ایجنت‌های کدنویسی کافی نیست؟

چون فهرست‌های ساده مشخص نمی‌کنند چه واقعیتی در مخزن پیدا شده، کدام فایل‌ها یا قراردادها اول باید تغییر کنند و چه کارهایی امکان اجرای هم‌زمان دارند؛ بنابراین ایجنت ممکن است مراحل را طی کند اما خروجی ناقص یا نادرست تحویل دهد.

هر وظیفه کاری در یک برنامه اجرایی قوی شامل چه مواردی است؟

شامل 5 تعهد مشخص: شناسه، کوچک‌ترین تغییر در رفتار، شواهد کشف‌شده در مخزن کد، وابستگی‌ها و اثبات مشخصی که پایان کار را تأیید می‌کند.

برنامه اجرایی مبتنی بر شواهد در چه شرایطی پیش از اجرا رد می‌شود؟

اگر شناسه‌ی تکراری، وظیفه‌ی بدون شواهد یا بدون اثبات، وابستگی به کار نامشخص یا چرخه‌ای در گراف وجود داشته باشد، یا قبل از رفع ابهام‌ها کاری بازگشت‌ناپذیر شروع شود.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.