من حلقه ها را می نویسم، نه درخواست ها – این چیزی است که یاد گرفتم

خطی از بوریس چرنی، رئیس کلود کد وجود دارد که در هفته گذشته بسیار در ذهن من بوده است. به عبارت دیگر: دیگر هوش مصنوعی را پیشنهاد نمی کند. حلقه ها را می نویسد و حلقه ها دستورات را اجرا می کنند. کار او نوشتن چرخه هاست.
هنگامی که شخصی که عامل رمزگذاری را ایجاد کرده است استفاده از آن را به روشی که بقیه ما انجام می دهیم متوقف می کند، ارزش چند چرخه مغزی را دارد. پس با او نشستم.
سپس من کمترین جذابیت ممکن را با این ایده انجام دادم و دقیقاً به همین دلیل است که آن را می نویسم.
چرخه واقعا چیست
آدی عثمانی، مهندس گوگل که روابط نزدیکی با هوش مصنوعی جمینی دارد، بهترین تعریف را دارد: حلقه یک هدف بازگشتی است. شما یک هدف را تعریف می کنید و هوش مصنوعی تا زمانی که کامل شود تکرار می شود. شما دیگر کسی نیستید که عامل را ترغیب می کند و تبدیل به فردی می شوید که سیستمی را طراحی می کند که این درخواست را برای شما انجام می دهد.
برای حدود دو سال، کار با یک عامل کد نویسی به معنای یک چیز بود: شما یک پیام خوب نوشتید، به اندازه کافی زمینه را به اشتراک گذاشتید، آنچه را که برگشته بود بخوانید، چیز بعدی را بنویسید. مامور یک ابزار بود و تمام مدت او را نگه داشتی، چرخشی پس از دیگری. همانطور که مجسمه ساز از اسکنه استفاده می کند.
یک حلقه این نگهداری را به یک سیستم کوچک منتقل میکند که کار را پیدا میکند، آن را توزیع میکند، بررسی میکند، آنچه انجام شده را ثبت میکند و چیز بعدی را تصمیم میگیرد – و اجازه میدهد که نماینده را برای شما به صدا درآورد. گویی اکنون کار شما خلق مجسمه ساز است – یا به عبارت دقیق تر، ارتش کوچکی از مجسمه سازان.
پیدا کردن یک مورد استفاده آزمایشی
من 9 برنامه را در 4 ماه گذشته ارسال کرده ام تا مجموع خود را به اپ استور به 10 برساند. آنها یکدیگر را تبلیغ می کنند، به این معنی که هر کدام باید یک برگه “از همان توسعه دهنده” در تنظیمات داشته باشند که به دیگران پیوند می دهد. این گزینه مناسب برای یک حلقه است، یک مشکل کوچک که چندین پایگاه کد را در بر می گیرد.
برای اینکه همه چیز کمی جالبتر شود، تصمیم گرفتم چیزی را در بالا اضافه کنم: یک همایش. هر برنامه یک رشته نسخه را در تنظیمات نمایش می دهد که می خواند 1.4.2 (28) – نسخه معنایی، سپس شماره ساخت داخل پرانتز. وقتی هر روز با 6 تا 7 برنامه دستکاری میکنید، متوجه نمیشوید که کدام بیلد چه کاری را انجام میدهد، بنابراین میخواستم مطمئن شوم که همه برنامهها دقیقاً آن را نشان میدهند.
بنابراین، با این 2 چیز ساده تصمیم گرفتم اولین سیکلم را بنویسم.
چیزی که من ساختم
در کل حلقه ای که برای حل این 2 مشکل ایجاد کردم پنجاه خط پایتون است. این فقط یک اسکریپت پایتون وانیلی است که پوشههای برنامه من را میخواند، فایلهای لازم (به معنای Settings.swift یا SettingsView.swift) را میگیرد، سپس آنها را به مدلی با دو قانون ساده انگلیسی من (اعلان) میفرستد و برای هر برنامه یک حکم قبولی/شکست چاپ میکند.
مهمترین بخش این است (ساده شده):
for app in APPS:
state = collect_state(app) # read the files that matter
result = audit(app, state) # ask the model to judge them
print("✅" if result["ready"] else "❌", app)
خیلی پیچیده نیست: نقشهای از پوشهها وجود دارد که میتوانم برنامههای بیشتری را به آن اضافه کنم، عبارتهایم به زبان انگلیسی ساده (بخش «از همان توسعهدهنده» را داشته باشید و مطمئن شوید که نسخه با فرمت خاص وجود دارد)، و یک حلقه کوچک که هر برنامه را به مدل تغذیه میکند و آنچه را که برگردانده میشود چاپ میکند.
پنج بلوک ساختمانی یک چرخه (و جایی که معدن من نشسته است)
اما یک چرخه واقعی بسیار بیشتر از آن وجود دارد. تعاریف زیادی وجود دارد زیرا قطعات متحرک زیادی دارد، اما به عبارت بسیار ساده، چیزی شبیه به این است:
- اتوماسیون – چیزی در یک برنامه زمانی فعال میشود و تشخیص را برای شما انجام میدهد، بنابراین شما به دنبال بررسی نیستید. این ضربان قلب است. این چیزی است که یک حلقه را به جای اجرای یک بار یک حلقه واقعی تبدیل می کند.
- درختان کار – بررسیها را جدا کنید تا دو عاملی که به صورت موازی کار میکنند فایلهای یکدیگر را بازنویسی نکنند. لحظه ای که بیش از یک نماینده را اداره می کنید، این چیزی است که مانع از تبدیل موازی به هرج و مرج می شود. در مورد من این مورد نیاز نبود، حلقه من صرفاً گزارش بود، هیچ کدی نوشته نشده بود.
- مهارت ها – دانش شما از پروژه، یک بار ثبت شده است (الف
SKILL.mdfile) بنابراین عامل به جای حدس زدن، آن را در هر اجرا می خواند. بدون آن، حلقه کل پروژه شما را از ابتدا در هر حلقه استخراج می کند. - اتصال دهنده ها – حلقه ای که به ابزار واقعی شما می رسد: ردیاب مسئله، پایگاه داده، Slack، App Store Connect API. تفاوت بین نماینده ای که می گوید “راه حل اینجاست” و حلقه ای که خود روابط عمومی را باز می کند.
- عوامل فرعی – یک نماینده این ایده را دارد متفاوت است یکی آن را بررسی می کند مدل هایی که کار یکدیگر را بررسی می کنند معمولا کارآمدتر است.
و مورد ششم: حافظه مدل همه چیز را بین اجراها فراموش می کند، بنابراین حافظه باید روی دیسک باشد.
حلقه حسابرسی من دقیقا استفاده می کند یک و نیم از این پنج تا این اتوماسیون دستی است (بلوک 1، منهای گرافیک) با شرایط من جایگزین مهارت (بلوک 3، به سختی). بدون درخت کاری، بدون اتصال دهنده، بدون عامل فرعی، بدون حافظه پایدار.
اما این یک تجربه یادگیری بسیار خوب بود.
چی گرفتی؟
من اسکریپت را در همه برنامه هایم اجرا کردم و بیشتر آنها پاک شدند. یافتههای واقعی کوچک و دقیقاً از آنهایی بودند که هرگز به آنها توجه نمیکردم.
یکی از قدیمی ترین برنامه های من – طولانی ترین Task Manager – صفحه تنظیمات خود را فقط با نسخه بازاریابی ارسال می کند. بدون شماره ساخت خوانده می شود 1.4.2 جایی که هر برنامه دیگری می خواند 1.4.2 (28). یک شکاف یک خطی که چه کسی میداند چند نسخه وجود دارد، زیرا من مدتها پیش دیگر به آن صفحه نگاه نکردم.
یک صید مفید واقعی همچنین کمترین اکتشاف قابل تصور، دقیقاً به همین دلیل است که یک حلقه آن را پیدا کرد و من پیدا نکردم.
چه چیزی اشتباه شد و چرا درس واقعی است
بیشتر “من یک چرخه هوش مصنوعی ساختم!” پستها آن بخش را از دست دادهاند، بنابراین این بخشی است که میخواهم به آن بپردازم. دام چندین بار به من دروغ گفت و هر دروغ چیزی به من آموخت.
از گم شدن اطلاعاتی که هرگز ارسال نکردم شکایت کردم. برنامه گزارش داد “صفحه تنظیمات وجود ندارد، نمی توان چیزی را بررسی کرد”. صفحه تنظیمات وجود داشت. اما به جمعآورنده فایل من به مسیر اشتباه اشاره شد و بیصدا چیزی را برگرداند و مدل با وظیفهشناسی چیزی دریافتی را گزارش کرد. یک حلقه درست به اندازه حالتی است که شما آن را وارد می کنید، و اسکریپتی که فایل های صفر را می خواند شکست می خورد. بی سر و صدا – بدون خطا، فقط یک پاسخ اشتباه مطمئن در پایین دست. رفع مشکل اعلان هوشمندانه تری نبود. اندازه چیزی را که میخواستم بفرستم چاپ میکرد تا بتوانم ببینم چه زمانی فقط هوای خالی آن را تغذیه میکنم.
کد خوب را به عنوان شکسته علامت گذاری می کند. چند برنامه هشدار «کامپایل نمیشود، این ویژگی بدنه ندارد» دریافت کردند. هیچ کدام از اینها درست نبود. من هر فایل را کوتاه کردم تا توکن ها را ذخیره کنم، و کد نسخه ای که به آن علاقه داشتم در آن زندگی می کرد زیر – بنابراین من دقیقاً چیزی را که در موردش میپرسیدم جدا کردم، سپس مشاهده کردم که مدل به درستی گزارش میدهد که قطعه کامپایل نشده است. درس: شی ممیزی به طور کامل خوانده می شود. شما شواهد پشتیبان را نادیده می گیرید، نه چیزی را که قضاوت می کنید.
از جمله بندی پشتیبانی می کند. یکی از برنامهها بخش تبلیغات متقابل خود را بهجای «از همان توسعهدهنده» «از سازنده…» میگذارد. چرخه شکست خورد. بخش خوب بود – من قانونم را خیلی تحت اللفظی نوشته بودم و الگو به معنای واقعی کلمه رعایت می شد. تصحیح: به او بگویید در مورد قصد قضاوت کند، نه عبارت.
هیچکدام مدل خنگی نبودند. هر کدام از آنها ورودیها یا دستورالعملهای بدی را به آن میدادم و مدل دقیقاً آنچه را که به آن میدادم گزارش میکرد. همین مهارت مهندسی حلقه است و سریع نیست. ورودیهایی را ایجاد میکند که میتوانید به آنها اعتماد کنید، و دانستن اینکه حلقه در کجا به اشتباه میرود.
به هر حال، غریزه برای توسعه دهندگان ارشد غریزه درستی است. سی و پنج سال نرم افزار حمل و نقل به من آموخت که به باگ ها و بازتاب های خاموشی که می گویند اعتماد نکنم “این فقط یک است for حلقه با یک تماس API در آن درست است. این ویژگی است، نه ناامیدی. بخش جالب هرگز چرخه نبود – تصمیم گیری بود که چه چیزی را بررسی کنید و یاد بگیرید که در کجا به پاسخ اعتماد نکنید.
سه کاری که چرخه شما هنوز برای شما انجام نمی دهد
عثمانی بهتر از من آنها را نام می برد و آنها می گیرند تیزتر همانطور که حلقه بهتر می شود، نه آسان تر:
چک هنوز به عهده شماست. یک حلقه بدون مراقبت نیز یک حلقه خطای بدون مراقبت است. «انجام شد» یک بیانیه است، نه دلیل. دلیل اصلی جدا کردن عامل فرعی تأیید از سازنده این است که حلقه «انجام شد» را معنیدار کنید – و حتی پس از آن، وظیفه شما ارسال کدی است که کار را تأیید کردهاید.
اگر اجازه دهید درک شما از بین می رود. هرچه حلقه سریعتر کدی را که شما ننوشته اید ارسال کند، شکاف بین آنچه که وجود دارد و آنچه واقعا درک می کنید بیشتر می شود. چرخه صاف فقط این شکاف را سریعتر افزایش می دهد مگر اینکه بخوانید چه کاری انجام داده است.
موقعیت راحت موقعیت خطرناک است. وقتی چرخه به خودی خود روشن می شود، وسوسه انگیز است که از داشتن نظر دست بردارید و هر آنچه را که می دهد پس بگیرید. طراحی حلقه درمان زمانی است که آن را با قضاوت انجام می دهید و هنگامی که آن را برای اجتناب از فکر کردن انجام می دهید، شتاب دهنده است. عمل مشابه، نتیجه معکوس. چرخه تفاوت را نمی داند. شما آن را انجام دهید.
دقیقاً به همین دلیل است که من عمداً فقط خواندنی است. او گزارش می دهد؛ فایلی را لمس نمی کند. بدترین کاری که می تواند انجام دهد این است که در کنسول من نظر اشتباهی داشته باشد. لحظه ای که به آن اجازه می دهم کد را ویرایش کند، هر یک از موارد مثبت کاذب بالا به صفحه تنظیمات شکسته تبدیل می شود.
بعدش چی
گام بعدی آشکار، که من عمداً در برابر آن مقاومت می کنم: اجازه دهید حلقه اصلاح را پیشنهاد کند، نه اینکه فقط شکاف را گزارش کند. اینجاست که تأییدکننده به یک عامل تبدیل میشود – و این جایی است که بلوکهای چهار و پنج (اتصال کننده اقدام، عامل فرعی تأیید) در نهایت وارد میشوند. من به آنجا خواهم رسید، اما فقط پشت یک دروازه تأیید سخت، زیرا موارد مثبت کاذب بالا فهرست کاملی از مواردی است که بدون مراقبت اشتباه می شود.
بنابراین IDE خود را حذف نمی کنم. من ده نماینده را به طور موازی در هنگام خواب اداره نمی کنم. من یک کار تکراری انجام دادم، آن را در کوچکترین حلقه ممکن پیچیدم و یک نفر را در انتهای آن گذاشتم. این همان پلهای است که من در آن هستم، و میتوانم بگویم این پله مناسب برای اکثر توسعهدهندگانی است که در حال حاضر کار میکنند – نه به این دلیل که پلههای بالاتر واقعی نیستند، بلکه به این دلیل که رشتهای که در اینجا ایجاد میکنید چیزی است که آنها را بعداً ایمن میکند.
فقط کوچک شروع کنید، مفاهیم را درک کنید و تکرار کنید. ابتدا یک مجسمه ساز بسازید و از او بخواهید یک مجسمه بزرگ کنده کاری کند. سپس می توانید به فکر ساختن یک ارتش کامل از مجسمه سازان باشید.



