کار کردن با AI؛ یه مثال واقعی از رفع باگ
خلاصهٔ کاملتر
نویسنده از همون اول موضعش رو روشن میکنه: نسبت به هوش مصنوعی دوسوگراست. قبول داره که تو یه سال اخیر به ابزار قدرتمندی برای توسعه تبدیل شده، ولی خطرهاش رو هم میبینه — از کند شدن تدریجی ذهن خودمون تا نگرانیهای محیطزیستی. تو مطلب قبلیش «کد ارزونتر شده» دربارهٔ مسئلهٔ شاگرد جادوگر هشدار داده بود: توسعهدهندهای که وابسته به AI میشه و دیگه نمیتونه مشکلات سیستمی که میسازه رو بفهمه و درست حلشون کنه. این پست روایت دقیق یه مورده که خودش میگه بهزور از اون دام فرار کرده.
زمینه: hyperscript یه زبان اسکریپتی تفسیری برای وبه که — با کمی طنز — کاملاً با جاوااسکریپت نوشته شده. نویسنده اعتراف میکنه موقع نوشتنش عمداً خیلی از قواعد پارس کردن رو زیر پا گذاشته تا ببینه چی میشه: منطق پارس روی خود المانهای پارس نشسته، گرامر بهصورت داینامیک تعریف میشه و پارسر افزونهپذیره. میگه این رویکرد رو برای اکثر زبانها توصیه نمیکنه، ولی برای این پروژه جواب داده.
ماجرا با یه گزارش باگ شروع میشه: بعد از آپدیت به نسخهٔ 0.9.91، یه عبارت از کار افتاده بود. اونجا as JSON خیلی سفت بایند میشد؛ یعنی پارسر سعی میکرد رشتهٔ آدرس رو قبل از تحویل به fetch به JSON تبدیل کنه، بهجای اینکه آدرس رو fetch کنه و نتیجه رو JSON در نظر بگیره. این تعارض بایندینگ یه مشکل کلاسیک تو پارسه و تو زبونی مثل hyperscript که ابهامهای زبان انگلیسی رو به ارث برده، بدتر هم میشه.
اینجا اولین نقطهٔ قوت AI خودش رو نشون میده. به گفتهٔ نویسنده، Claude تو چند دقیقه ریشه رو پیدا کرد — خیلی سریعتر از چیزی که خودش میتونست. علت این بود که تو ریفکتور نسخهٔ جدید، برای اشتراک منطق بین دستورهای go و fetch یه متد مشترک به اسم parseURLOrExpression() استخراج شده بود و همین ناخواسته گرامر بعد از fetch رو به یه expression عمومی گسترش داده بود. چون as تو عبارتها معنی «تبدیل نوع» داره (مثل تبدیل یه رشته به Int)، پارسر اون رو میبلعید و دیگه بهعنوان modifier به fetch نمیرسید.
ولی تو حل کردن، AI خیلی ضعیفتر ظاهر شد. پیشنهاد اول یه هک بود: اول یه برگ «شبهرشته» پارس کن و اگه نشد برگرد سراغ expression کامل. این دقیقاً همون باگ گزارششده رو درست میکرد ولی حالت کلی رو نه — مثلاً fetch $url as JSON باز میشکست. پیشنهاد دوم بهتر بود: یه فلگ noConversions روی پارسر بذار و موقع پارس آدرس فعالش کن. نویسنده میگه این پیشنهاد پارسر رو حساسبهبافت میکنه و خیلی از مهندسهای پارسر رو میترسونه — ولی مشکل اصلیش این بود که زیرساختش از قبل وجود داشت و Claude ندیده بودش.
اون زیرساخت مفهومی به اسم «follows» ه: یه المان پارس (معمولاً یه دستور) میتونه یه کلیدواژه رو برای خودش «ادعا» کنه تا عبارتها موقع پارس با اون مچ نشن. وقتی نویسنده این رو به Claude گفت، مدل با ذوق تأییدش کرد و همین تکنیک رو تو parseURLOrExpression() پیاده کرد. ظاهراً تموم — ولی موقع بازبینی معلوم شد فیکس بیشازحد کلیه: go هم از همون متد استفاده میکنه، در حالی که فقط fetch از as بهعنوان modifier استفاده میکنه؛ پس این تغییر جلوی استفادهٔ کاملاً درست از تبدیل نوع تو go رو هم میگرفت. برای همین نویسنده فیکس نهایی رو خودش و فقط داخل FetchCommand#parse() نوشت:
parser.pushFollow("as");
try {
var url = parser.parseURLOrExpression();
} finally {
parser.popFollow();
}یه نقطهٔ قوت دیگهٔ AI هم تو همین ماجرا دیده شد: تستها. به گفتهٔ نویسنده، Claude تستهای کوچیک و متمرکزی نوشت که هم مشکل رو نشون میدادن و هم درستی فیکس رو — و صادقانه میگه احتمالاً خودش حوصلهٔ نوشتن این حجم تست رو نداشت.
نتیجهگیریش اینه: AI تو تحقیق و ساخت تست خوب بود و تو رسیدن به یه راهحل تمیز ضعیف. اگه نویسنده با پارسر و زیرساختش آشنا نبود، همین باگ راحت میتونست یه گوشهٔ هکی دیگه و یه تیکه state اضافه روی پارسر به پروژه اضافه کنه — یعنی بدهی فنی، که به باور اون نمایی رشد میکنه. حرف آخر اینه که آدمِ بلد تو حلقه، نقش «جادوگر» رو داره نه «شاگرد جادوگر»: راهحل درست رو مطالبه میکنه بهجای اینکه کورکورانه اولین یا دومین پیشنهاد AI رو قبول کنه.
تو یه بخش پایانی هم به سن اشاره میکنه: امسال ۵۰ ساله شده و میگه با بالا رفتن سن، حافظه و توان کار طولانی کم میشه. AI دقیقاً همین دو تا رو جبران میکنه — سریع دوباره یه کدبیس رو میفهمه و میتونه تستهای مفصلتری داشته باشه. ولی نگرانه که همین اتکا، افت کلی توان ذهنیش رو تسریع کنه، و اعتراف میکنه از اینکه چقدر طول کشید تا خودش دست به کد شه، کمی خجالتزدهست.
نکات کلیدی:
- باگ از یه ریفکتور اومد که گرامر بعد از fetch رو ناخواسته گسترش داد و as رو به عبارت تبدیل نوع سپرد.
- AI ریشهٔ باگ رو تو چند دقیقه پیدا کرد؛ نقطهٔ قوت اصلیش همینه.
- سه راهحل پیشنهادی AI بهترتیب هکی، پیچیدهٔ غیرلازم، و بیشازحد کلی بودن.
- فیکس نهایی رو خودِ نویسنده با محدود کردن pushFollow("as") به دستور fetch نوشت.
- تستهای تولیدشده توسط AI کوچیک، متمرکز و مفید بودن.
- بدون آدمِ آشنا با کدبیس، همین باگ به بدهی فنی تبدیل میشد.




