کدنویسی با هوش مصنوعی: چی کار کنیم که گند نزنیم؟
خلاصهٔ کاملتر
یه مهندس ارشد یه ماژول احراز هویت تولیدشده توسط AI رو به پروداکشن میفرسته. همهی تستها پاس میشن. دو هفته بعد، همون ماژول علت اصلی یه قطعی بزرگ میشه — چون مدل از یه OAuth flow منسوخ استفاده کرده بود که از پستهای سهسالهی Stack Overflow یاد گرفته بود. کد از نظر سینتکس کامل بود، ولی اشتباه. این داستان خلاصهی یه مشکل جدیتره که خیلی کم دربارش حرف میزنیم.
نویسندهی این مقاله معتقده که اولین قدم قبل از باز کردن هر ابزار AIی، داشتن یه هدف مشخصه. اگه با یه هدف مبهم مثل «یه سیستم احراز هویت بساز» سراغ AI بری، اون ابزار همهی تصمیمهای حیاتی رو خودش میگیره — بدون اینکه بدونه معماری، محدودیتها و محیط پروداکشن تو چیه.
یه پرامپت خوب مثل اینه که بگی: «میخوام یه JWT middleware بیstate برای Express.js بسازم که توکنها رو با کلیدهای RS256 از JWKS endpoint اعتبارسنجی کنه، توکنهای منقضی رو با ۴۰۱ رد کنه و claim های decodeشده رو به req.user بچسبونه — بدون session، بدون cookie.» حالا AI یه چارچوب مشخص داره و تو مسیر رو هدایت میکنی.
ابزارهای کدنویسی مبتنی بر AI روی معماری Transformer ساخته شدن که ماهیتاً احتمالاتیه. مدل بعدیترین توکن محتمل رو بر اساس الگوهای آموزشی پیشبینی میکنه، نه اینکه صحت کد رو با یه spec رسمی تأیید کنه. یعنی ۹۸ بار از ۱۰۰ جواب درسته، ولی اون ۲ بار ممکنه یه باگ پروداکشن باشه. مدلهای جدیدتر با chain-of-thought و extended thinking بهتر شدن، ولی این فقط تعداد خطاها رو کم میکنه — نه دستهی خطاها رو حذف میکنه.
یه مشکل دیگه «ناسازگاری» خروجیهاست. همون درخواست رو با فرمولبندی کمی متفاوت در روزهای مختلف بدی، دو کد کاملاً متفاوت میگیری — یکی با repository pattern و connection pooling، یکی با SQL خام و inline connection string. هر دو کار میکنن. هیچکدوم با هم سازگار نیستن. این یعنی اگه کنترل نداشته باشی، داری یه کدبیس ناهمگون میسازی که شش ماه دیگه یکی باید با خوندل refactor کنه.
مشکل سوم «سطح انتزاع اشتباه» یا Abstraction mismatch هست. برای مسائل ساده، AI بیش از حد مهندسی میکنه — مثلاً برای خوندن یه فایل YAML ساده، یه abstract factory با چند interface برمیگردونه. برای مسائل پیچیده، برعکس — یه rate limiter که باید روی چند سرویس توزیعشده کار کنه رو با یه in-memory counter ساده پیاده میکنه. مدل نمیفهمه که چه سطحی از پیچیدگی برای context تو مناسبه؛ این وظیفهی توئه که صریحاً مشخص کنی.
راهحل کلی اینه که به جای اینکه راندهی خروجی AI باشی، مسیر رو هدایت کنی. پرامپتهای دقیق با محدودیتهای مشخص، اعلام صریح سطح انتزاع موردنظر، و اعتبارسنجی دقیق خروجی — اینا هستن که فاصلهی بین «کدی که اجرا میشه» و «کدی که لایق پروداکشنه» رو کم میکنن.
نکات کلیدی:
- قبل از هر پرامپتی هدف دقیق و محدودیتهای فنی رو مشخص کن
- مدلهای AI احتمالاتیان، نه قطعی — خروجیشون همیشه نیاز به بررسی داره
- extended thinking و chain-of-thought خطاها رو کم میکنه ولی حذف نمیکنه
- پرامپتهای مبهم → تصمیمهای پنهان مدل → باگهای پروداکشن
- AI برای مسائل ساده بیش از حد مهندسی میکنه، برای مسائل پیچیده سادهانگاری
- سطح انتزاع موردنظر رو در پرامپت صریح مشخص کن
- ناسازگاری بین خروجیهای مختلف میتونه کدبیس رو به هم بریزه




