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

پوشه و فایل به‌عنوان معماری

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

در یک نگاه

۶.۲.۱

نام‌گذاری به‌عنوان تصمیم طراحی

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

چرا؟ چون نام، قاعده را در خودش حمل می‌کند. مقایسه کن:

این تفاوت کوچکی نیست. نام دوم یک سیستم است؛ نام اول یک انبار.

سه قاعده‌ی عملی برای نام‌گذاری:

۶.۲.۲

سلسله‌مراتب: چه چیزی داخل چه چیزی

یک ساختار واقعی این شکل است — و به هر شاخه نگاه کن که چه نقشی دارد، نه چه اسمی:

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

دو تصمیم در این ساختار هست که ارزش دیدن دارند:

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

۶.۲.۳

قرارداد به‌جای قاعده‌ی سخت

دو راه برای برقرارکردن نظم هست:

در سیستم بدون کد، تقریباً همه‌چیز قرارداد است — و این ضعف نیست، انتخاب است. قرارداد ارزان است، فوری عوض می‌شود، و برای سیستمی که خودت (و یک ایجنت) رعایتش می‌کنید کافی است.

ولی یک شرط دارد: قرارداد باید نوشته شده باشد. قراردادی که فقط در سرِ توست، تا اولین هفته‌ی شلوغ زنده می‌ماند. جایش _قانون.md است — و فصل ۶.۴ تمامش درباره‌ی نوشتنِ همین است.

و کجا قرارداد کافی نیست؟ آن‌جا که اشتباهش گران است. اگر رعایت‌نکردنِ یک قرارداد می‌تواند داده را از بین ببرد، آن‌جا دیگر قرارداد نمی‌خواهی — محافظت می‌خواهی (فصل ۵.۱).

۶.۲.۴

ساختاری که ایجنت هم بفهمد

این بخش همان چیزی است که این فصل را از یک درسِ نظم‌وترتیب جدا می‌کند.

ایجنت پوشه‌ی کارت را می‌بیند و نام فایل‌ها را می‌خواند (فصل ۳.۲.۱). پس نام‌گذاری خوب، برای او هم راهنماست — و نام‌گذاری بد، او را هم گم می‌کند. چهار چیز که تفاوت واقعی می‌سازند:

آن مورد آخر ارزان‌ترین آزمونِ طراحی است که در کل این ماژول داری، و قبل از ساختن جواب می‌دهد نه بعدش.

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

تمرین (فکری)

ساختار پوشه‌ی سیستمی که در فصل ۶.۱ انتخاب کردی را روی کاغذ بکش — واقعاً روی کاغذ، نه در ذهن. بعد:

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

کار: پیگیری درخواست‌های مشتری.

نسخه‌ی موضوعیمشتری-الف/، مشتری-ب/، مشتری-ج/. خیلی طبیعی به نظر می‌رسد و تقریباً همه اول این را می‌کشند. مشکلش: برای فهمیدن اینکه چه کاری مانده، باید هر سه پوشه را باز کنی. سیستم به تو نمی‌گوید قدم بعدی چیست؛ فقط بایگانی می‌کند.

نسخه‌ی مرحله‌ای۰۱-تازه/، ۰۲-در-انتظار-من/، ۰۳-در-انتظار-مشتری/، ۰۴-بسته/؛ و در هر کدام، یک فایل برای هر درخواست با نام مشتری-موضوع.md.

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

و تفکیک در-انتظار-من از در-انتظار-مشتری عمدی است: این دو حالتِ کاملاً متفاوت‌اند و قاطی‌کردنشان همان چیزی است که باعث می‌شود کارها فراموش شوند.

ذخیره شد