بازبینی کد با هوش مصنوعی: چه می‌بیند و چه نمی‌بیند

کد ریویو خودکار در پیدا کردن غفلت‌های کوچک عالی است و در فهمیدن اینکه این کد اصلاً باید نوشته می‌شد یا نه، کور. تفکیک این دو، همه‌ی ماجراست.

🍊 تیم نارنگی ⏱ 5 دقیقه مطالعه
مرور تفاوت‌های یک پول ریکوئست روی صفحه با کمک دستیار هوشمند

یک پول ریکوئست چهارصدخطی در صف مانده و کسی حوصله‌ی بازکردنش را ندارد. سه روز بعد با یک «به‌نظر خوبه» تأیید می‌شود. این اتفاق در بیشتر تیم‌های کوچک می‌افتد و همان‌جاست که باگ‌های گران وارد کد می‌شوند.

ابزار هوشمند این مشکل را کامل حل نمی‌کند، ولی یک لایه‌ی اول ارزان اضافه می‌کند: چیزهایی که هیچ آدمی نباید وقتش را صرفشان کند، قبل از رسیدن به چشم انسان گرفته می‌شوند. شرطش این است که بدانید چه انتظاری از آن داشته باشید.

چه چیزهایی را خوب می‌بیند

دسته‌ی اول، غفلت‌های مکانیکی است. مقداری که بررسی نشده و ممکن است null باشد، خطایی که گرفته شده ولی نادیده رد شده، حلقه‌ای که داخلش کوئری می‌زند، متغیری که ساخته شده و استفاده نشده. این‌ها ایرادهایی هستند که آدم خسته در ساعت شش عصر رد می‌شود.

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

دسته‌ی سوم، الگوهای امنیتی شناخته‌شده. رشته‌ی کوئری که با چسباندن ورودی ساخته شده، خروجی بدون فرار دادن، کلید داخل سورس. برای این دسته، چسباندن فهرست ده ریسک برتر OWASP به پرامپت، دقت را محسوس بالا می‌برد.

چه چیزهایی را نمی‌بیند

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

  • تصمیم معماری. اینکه این منطق باید در این لایه باشد یا نه، به قرارداد تیم برمی‌گردد، نه به کد.
  • نقص دسترسی. کدی که کاربر الف را به داده‌ی کاربر ب می‌رساند، از نظر نحوی بی‌عیب است.
  • هزینه‌ی واقعی اجرا. کوئری‌ای که روی هزار رکورد سریع است و روی ده میلیون رکورد سرور را می‌خواباند.
  • الزام کسب‌وکار. اینکه محاسبه‌ی مالیات یا تخفیف طبق قاعده‌ی واقعی شرکت شماست یا نه.
⚠️ سکوت، تأیید نیست

اگر خروجی بازبینی چیزی نگفت، معنی‌اش این نیست که کد سالم است. یعنی در آنچه دیده، الگوی مشکوکی نبوده. برای کد حساس — پرداخت، احراز هویت، دسترسی — بازبینی انسانی همچنان لازم است، بی‌هیچ استثنایی.

پرامپتی که خروجی قابل استفاده می‌دهد

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

این تغییر را مرور کن. زمینه: [نقش این ماژول در سیستم].

خروجی را در سه سطح بده:
🔴 باگ یا ریسک امنیتی — با سناریویی که خراب می‌شود
🟡 مشکل احتمالی — با دلیل و شرط وقوع
🔵 پیشنهاد اختیاری

قواعد:
- سلیقه‌ی نام‌گذاری و قالب‌بندی را کاری نداشته باش
- برای هر مورد شماره‌ی خط بده
- اگر برای قضاوت زمینه‌ی کافی نداری، بپرس؛ حدس نزن
- اگر چیزی پیدا نکردی، بنویس «موردی نیست»

--- تغییرات:
[diff]

بند «حدس نزن» بیشترین اثر را دارد. بدون آن، مدل درباره‌ی تابعی که نمی‌بیند فرض می‌سازد و شما را دنبال ایراد ناموجود می‌فرستد.

کدام ایراد، چه دقتی

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

جای درستش در فرایند تیم

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

یک عادت که در تیم‌های کوچک خوب جواب داده: خروجی مرور را در کامنت پول ریکوئست نچسبانید. فقط آنچه را واقعاً اصلاح کرده‌اید بنویسید. چسباندن فهرست خام، نویز می‌سازد و بعد از دو هفته کسی نمی‌خواندش.

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

مرور به‌علاوه‌ی تست

مؤثرترین ترکیب این است که به‌جای «این کد را مرور کن»، بخواهید تستی بنویسد که کد را بشکند. مدل مجبور می‌شود سناریوی مشخص بسازد و همان‌جا معلوم می‌شود ایرادش واقعی است یا نه. تستی که پاس شود، ایراد را رد می‌کند؛ تستی که رد شود، باگ را ثابت می‌کند. روش کامل‌ترش در هوش مصنوعی برای تست نرم‌افزار آمده.

جمع‌بندی

بازبینی خودکار جایگزین مرور انسانی نیست؛ کف کیفیت را بالا می‌برد. ایرادهای مکانیکی را می‌گیرد تا آدم‌ها به سؤال‌های مهم‌تر برسند: این تغییر لازم بود؟ در جای درستی نشسته؟ شش ماه دیگر کسی می‌فهمدش؟

قاعده‌ی نهایی همان قاعده‌ی همیشگی است: هر ایرادی که دلیلش را نفهمیدید، نپذیرید و اصلاحش نکنید. راهنمای مرور کد گوگل برای ساختن معیار تیمی منبع خوبی است، و مبانی کار با کد در هوش مصنوعی برای برنامه‌نویسی جمع شده. برای امتحان روی یک تغییر واقعی، نارنگی کافی است.

مطالب مرتبط:

پرسش‌های پرتکرار

می‌شود بازبینی انسانی را کامل حذف کرد؟ +
نه. مدل نمی‌داند این تغییر با تصمیم‌های قبلی تیم جور است یا نه، و نمی‌داند کدام بخش سیستم حساس‌تر است. جای درستش قبل از بازبینی انسانی است، تا مرورگر انسانی وقتش را صرف مسائل معماری کند نه ایرادهای ریز.
چقدر کد را یک‌جا بدهم؟ +
یک پول ریکوئست کوچک یا یک فایل. اگر هزار خط تغییر را یک‌جا بدهید، خروجی سطحی می‌شود و ایرادهای مهم زیر انبوه نکته‌های سلیقه‌ای گم می‌شوند. تغییر بزرگ را قبل از مرور، به تکه‌های منطقی بشکنید.
آیا آسیب‌پذیری امنیتی را پیدا می‌کند؟ +
الگوهای کلاسیک مثل تزریق SQL، خروجی بدون فرار دادن و رمز هاردکدشده را معمولاً می‌بیند. ولی نقص‌های منطق دسترسی — اینکه کاربر الف به داده‌ی کاربر ب برسد — را نمی‌بیند، چون مدل سیاست دسترسی سیستم شما را نمی‌داند.
فرستادن کد شرکت به یک سرویس بیرونی اشکالی ندارد؟ +
بستگی به قرارداد و سیاست شرکت دارد. حداقل کاری که باید بکنید حذف کلیدها، توکن‌ها و رشته‌های اتصال است. برای کد تحت قرارداد محرمانگی، قبل از هر کاری تکلیف را با کارفرما روشن کنید.
چرا گاهی ایراد بی‌ربط می‌گیرد؟ +
چون فقط همان تکه کد را می‌بیند. اگر اعتبارسنجی ورودی یک لایه بالاتر انجام شده باشد، مدل نبودش را ایراد می‌گیرد. زمینه‌ی اطراف را در پرامپت توضیح دهید تا این نوع هشدارهای کاذب کم شود.
#کد ریویو #مرور کد #کیفیت کد #باگ یابی #پول ریکوئست
به‌دردِ کسی می‌خورد؟ تلگرام واتساپ
🍊

خواندنش خوب بود — حالا امتحانش کن

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

بدونِ نصب هم کار می‌کند — ولی در اپ سریع‌تر است