منطق ایجنت‌ها › M6 — ساختن سیستم بدون کد
۶.۴ پایدار تدریسی ~۳۰ دقیقه

فایل قانون به‌عنوان «برنامه»

قبل از این فصل: فصل ۶.۱ · فصل ۳.۴

در یک نگاه

۶.۴.۱

قانون نوشتن به زبان طبیعی

سه جزء سیستم را گفتیم: جا (۶.۲)، حافظه (۶.۳)، و حالا قانون — که «برنامه»ی سیستم است. در فصل ۳.۴.۱ دیدی فایل قانون کجا می‌نشیند و چطور خوانده می‌شود؛ این فصل درباره‌ی نوشتنِ خوبِ آن است.

و اول یک ادعای جدی: قانونِ فارسی، واقعاً نقشِ کد را بازی می‌کند. نه به‌عنوان تشبیه. یک جمله‌ی «هر بار که X شد، Y را انجام بده» همان چیزی است که در برنامه‌نویسی یک شرط است — فقط مجری‌اش عوض شده: به‌جای پردازنده، تو و ایجنت.

ولی این شمشیر دو لبه دارد، و لبه‌ی دومش را باید بدانی:

به‌خاطر بسپار کد اگر مبهم باشد خطا می‌دهد؛ قانونِ مبهم بی‌صدا تفسیر می‌شود. این تفاوت اصلی است. مدل احتمال‌محور است (فصل ۱.۱.۱) — پس اگر جمله دو خوانش داشته باشد، یکی را انتخاب می‌کند و به تو نمی‌گوید که انتخاب کرد. ابهام در قانون، خطا تولید نمی‌کند؛ ناسازگاری تولید می‌کند.

۶.۴.۲

قانون خوب: مشخص، قابل‌اجرا، بی‌ابهام

سه معیار، و هر کدام یک آزمون ساده دارد:

و یک الگوی نوشتاری که هر سه معیار را یک‌جا برآورده می‌کند — شرط، بعد عمل، بعد استثنا:

«وقتی فایلی به آرشیو می‌رود، اسمش را با تاریخِ همان روز شروع کن — مگر قبلاً تاریخ داشته باشد، که آن‌وقت دست نخورد.»

آن «مگر» را دست‌کم نگیر. بیشترِ قانون‌شکنی‌ها در سیستم‌های واقعی، در استثناها اتفاق می‌افتند — چون قانون فقط حالت عادی را گفته بود و در حالت غیرعادی هرکس چیزی را حدس زد.

۶.۴.۳

لایه‌بندی قوانین: کلی و محلی

وقتی قوانین از چند تا بیشتر شدند، همه را در یک فایل ریختن جواب نمی‌دهد. راه درست لایه است:

و قاعده‌ی حل تعارض باید از قبل نوشته شده باشد، وگرنه اولین تعارض سیستم را زمین می‌زند. قاعده‌ی معمول و معقول: محلی بر کلی مقدم است، چون به کار نزدیک‌تر است — به‌جز قوانین محافظت، که هیچ لایه‌ی محلی‌ای نمی‌تواند لغوشان کند.

این استثنا مهم است و دلیلش را در M5 دیدی: قانونِ «اول نسخه بگیر» اگر قابل‌لغو باشد، دیر یا زود در جایی که عجله داشتی لغو می‌شود — و همان‌جا همان اتفاقی می‌افتد که قانون برای جلوگیری‌اش نوشته شده بود.

و یک قاعده‌ی حجم: فایل قانون باید کوتاه بماند. هر قانونی که اضافه می‌کنی، شانس خوانده‌شدنِ بقیه را کم می‌کند. اگر فایل قانونت دارد به سی بند می‌رسد، مشکل کمبود قانون نیست — نشانه‌ی این است که ساختار (۶.۲) کارش را درست انجام نمی‌دهد و داری با قانون، ضعفِ ساختار را وصله می‌کنی.

۶.۴.۴

وقتی قانون رعایت نمی‌شود

حالا مهم‌ترین بخش این فصل — و آن چیزی که تفاوت یک سیستم زنده با یک سیستم رهاشده است.

قانونی نوشتی و رعایت نشد. واکنش طبیعی این است که تأکید کنی: بزرگش کنی، بگویی «مهم!»، تکرارش کنی. تقریباً همیشه جواب نمی‌دهد، چون مسئله کم‌بودنِ تأکید نیست. چهار علتِ واقعی، به ترتیبِ فراوانی:

  1. مبهم بود. رعایت شد — ولی به شکلی که تو منظورت نبود. این شایع‌ترین حالت است، و از بیرون شبیه بی‌اعتنایی به نظر می‌رسد.
  2. حالتی پیش آمد که قانون درباره‌اش حرفی نداشت. همان بحث استثناها.
  3. با قانون دیگری تعارض داشت و آن یکی برنده شد.
  4. خیلی دور از لحظه‌ی عمل بود. قانونی که در فایلی است که آن لحظه خوانده نمی‌شود، عملاً وجود ندارد.

و روشِ عیب‌یابی‌اش دقیقاً همان روشِ M4 است — از خودِ ایجنت بپرس، ولی سؤال درست را: نه «چرا رعایت نکردی؟» (که جواب معذرت‌خواهانه می‌گیرد و بی‌فایده است) بلکه «این قانون را چطور فهمیدی؟ کجایش می‌تواند دو معنا داشته باشد؟» این سؤال، ابهام را بیرون می‌کشد.

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

به‌خاطر بسپار قانونی که مکرراً رعایت نمی‌شود، یا مبهم است یا باید به بررسی تبدیل شود. تأکید بیشتر، سومین گزینه نیست.

نکته‌ی طلایی قانون تازه‌ای که نوشتی را قبل از اعتماد کردن، تست کن: به ایجنت بده و بگو «سه حالت بگو که این قانون در آن‌ها مبهم است یا جواب نمی‌دهد.» این ارزان‌ترین راه پیدا کردن ابهام است — و از قصد از او می‌پرسی، چون او همان کسی است که باید اجرایش کند.
ضدالگو قانونی که آرزو است، نه قاعده. «کیفیت کار باید بالا باشد»، «حرفه‌ای عمل کن»، «دقت کن». این‌ها هیچ رفتاری تولید نمی‌کنند و فقط فایل قانون را طولانی می‌کنند — که به‌نوبه‌ی خود شانس خوانده‌شدنِ قوانین واقعی را کم می‌کند. اگر نمی‌توانی بگویی «رعایت‌نشدنش چه شکلی است»، آن جمله قانون نیست.

تمرین (ساختنی + توضیحی)

  1. قانون سیستمت را بنویس — سه تا پنج بند، در فایل _قانون.md، با الگوی «وقتی … ، … — مگر …».
  2. تستش کن: از ایجنت بخواه برای هر بند سه حالتِ مبهم بگوید. قوانین را بر اساس جوابش اصلاح کن.
  3. به کارش بینداز روی یک ورودی واقعی.
  4. بنویس کدام قانون کار نکرد و چرا — و علتش را به یکی از آن چهار علتِ بخش ۶.۴.۴ نسبت بده.
پاسخنامه — یک قانون از بد تا خوب، در سه مرحله

نسخه‌ی ۱ (آرزو): «پرونده‌ها را مرتب نگه دار.» هیچ رفتاری تولید نمی‌کند و رعایت‌نشدنش هم قابل تشخیص نیست.

نسخه‌ی ۲ (مشخص‌تر، ولی هنوز مبهم): «پرونده‌های تمام‌شده را به آرشیو منتقل کن.» بهتر است، ولی دو ابهام دارد: «تمام‌شده» یعنی چه؟ و کِی منتقل شود؟ ایجنت یکی از خوانش‌ها را انتخاب می‌کند و به تو نمی‌گوید کدام را.

نسخه‌ی ۳ (قابل‌اجرا): «وقتی پرونده‌ای بسته شد — یعنی فاکتورش پرداخت و در فایل ثبت شد — همان روز به ۰۳-آرشیو/ منتقل شود و نامش با تاریخِ بسته‌شدن شروع شود. مگر مورد حقوقیِ باز داشته باشد، که آن‌وقت در ۰۲-درجریان/ می‌ماند و علتش در _وضعیت.md نوشته می‌شود.»

چه چیزی اضافه شد: تعریفِ «تمام‌شده» (شرطِ قابل بررسی)، زمان («همان روز»)، مقصد مشخص، قاعده‌ی نام‌گذاری، و یک استثنا با محلِ ثبتش. آن استثنا همان جایی است که نسخه‌ی ۲ در عمل می‌شکست.

و توجه کن که نسخه‌ی ۳ بلندتر است. قانون خوب لزوماً کوتاه نیست — فایل قانون است که باید کوتاه بماند. پنج بندِ دقیق بهتر از بیست بندِ آرزویی است.

ذخیره شد