بررسی GitHub Copilot در توسعه ASP.NET
بررسی GitHub Copilot در توسعه ASP.NET

گیت‌هاب کوپایلوت (هوش مصنوعی مولد) مفید است، اما راه‌حل جادویی نیست

در اینجا نظرات من پس از استفاده از GitHub Copilot Pro در توسعه واقعی ASP.NET 8 طی سه ماه گذشته آمده است. از آنجایی که فناوری به سرعت تکامل می‌یابد، شایان ذکر است که این برداشت‌ها بر اساس تجربه من تا مارس ۲۰۲۵ است.

۱. دوره آزمایشی رایگان مرا به اشتراک GitHub Copilot Pro ترغیب کرد

قبلاً درباره مولدهای کد هوش مصنوعی خوانده بودم و چند ویدیوی نمایشی دیده بودم، اما متقاعد نشده بودم که واقعاً برای استفاده در محیط تولید (production-ready) آماده باشند.

بدون دلیل خاصی، ۳ ماه پیش، به دلیل فعال شدن خودکار یک حساب رایگان GitHub Copilot در Visual Studio 2022 من در پروژه ASP.NET 8، پیشنهادات کد به اصطلاح «متن شبح» (ghost text) شروع به ظاهر شدن کردند. شوکه شدم، در لحظاتی پیش‌بینی‌های درخشانی از آنچه می‌خواستم بنویسم/کدنویسی کنم ارائه می‌داد.

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

در عرض چند روز، تصمیم گرفتم اشتراک کامل GitHub Copilot PRO را تهیه کنم تا این ابزار را بررسی کنم.

۲. آماده‌سازی برای استفاده از GitHub Copilot - هوش مصنوعی

۲.۱ آموزش

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

حدود ۱۰ ساعت ویدیو در مورد GitHub Copilot با موضوعاتی مانند «مهندسی پرامپت» (prompt engineering)، «کانتکست (بافتار) چیست» و غیره تماشا کردم. «برگه تقلب» (cheat sheet) خودم را از دستورات پرامپت و کلیدهای میانبر تهیه کردم. پس از ۱۰ ساعت آموزش، آماده بودم تا آن را در کدنویسی حرفه‌ای واقعی خود در محیط ASP.NET 8/C#/Bootstrap/EF8/JS امتحان کنم.

۲.۲ مهندسی پرامپت به طور کلی

به نظر من، «مهندسی پرامپت» شکستی برای هوش مصنوعی است. یکی از اولین تعاریفی که ۲۰ سال پیش از سیستم‌های هوش مصنوعی شنیدم این بود که هوش مصنوعی زمانی محقق می‌شود که بتوانیم با سیستم‌های کامپیوتری به زبان طبیعی صحبت کنیم.

حالا به شما می‌گویند که GHC یک سیستم هوش مصنوعی است، اما شما واقعاً نمی‌توانید با آن به «زبان طبیعی» صحبت کنید؛ باید از «مهندسی پرامپت» استفاده کنید، که در واقع یک زیرمجموعه از زبان طبیعی است و از نمادهایی مانند /، # و @ استفاده می‌کند. این به نظر من ترکیبی از زبان طبیعی و زبان برنامه‌نویسی می‌آید. آن‌ها می‌خواهند سیستم‌های هوش مصنوعی‌ای را که اکنون دارند به شما بفروشند، و احتمالاً ۵ سال دیگر به شما خواهند گفت «حالا ما هوش مصنوعی واقعی داریم، دیگر نیازی به مهندسی پرامپت نیست».

بنابراین، عبارت «مهندسی پرامپت» از دوره‌ای می‌آید که تنها راه تعامل با یک سیستم هوش مصنوعی از طریق خط فرمان (command prompt) بود. سپس، نوعی «هنر» یا «علم» (من آن را «شبه‌علم» می‌نامم) در ایجاد دستورات به شما کمک می‌کرد تا آن سیستم‌های هوش مصنوعی بهتر کار کنند. من چندین مقاله از این دست خوانده‌ام که همگی «عقل سلیم» هستند، اما از آنجایی که سیستم هوش مصنوعی هدف همیشه یک «جعبه سیاه» است، هیچ معیار واقعی برای نشان دادن اینکه آیا توصیه‌های یک نویسنده بهتر از فهرست قوانین شخص دیگری است، وجود ندارد. همچنین، سیستم‌ها در طول زمان تکامل یافته و تغییر کرده‌اند، بنابراین به طور دقیق، آن نویسندگان باید توصیه‌های خود را دوباره در برابر نسل جدید سیستم‌ها آزمایش کنند. معمولاً این کار را نمی‌کنند، بلکه استدلال «عقل سلیم» ارائه می‌دهند که مبتنی بر درک هوش مصنوعی به عنوان یک هوش انسانی دیگر است. و آنچه برای انسان‌ها «عقل سلیم» است، ممکن است برای سیستم‌های هوش مصنوعی یکسان نباشد. بنابراین، من کمی تردید دارم و تمام توصیه‌های مربوط به «مهندسی پرامپت» را که در دسترس هستند، کاملاً باور ندارم زیرا هیچ معیار و آزمایش واقعی در برابر نسل‌های مختلف سیستم‌های هوش مصنوعی وجود ندارد. آن‌ها فقط «عقل سلیم» و شواهد حکایتی از چند اجرای دستور را ارائه می‌دهند.

۲.۳. مهندسی پرامپت در GitHub Copilot

بنابراین، وقتی صحبت از «مهندسی پرامپت» در چارچوب سیستم GitHub Copilot (GHC) می‌شود، این شامل نه تنها رابط خط فرمان، بلکه برخی تعاملات از طریق رابط کاربری گرافیکی (GUI) ویژوال استودیو نیز می‌شود. این اساساً «رابط کاربری GitHub Copilot» است.

اگر کسی قصد دارد به طور کارآمد از GitHub Copilot استفاده کند، باید با رابط کاربری GitHub Copilot آشنا شود. بنابراین، من این کار را کردم، تمام دستورات مانند /fix، /optimize، #file1.cs، Alt+/ (فراخوانی GitHub Copilot) و غیره را یاد گرفتم.

۲.۴ قلمرو گفتگو (Universe of the conversation)

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

۲.۵ «کانتکست» (Context) در دنیای هوش مصنوعی چیست؟

شرکت‌های فناوری فعال در حوزه هوش مصنوعی اصطلاح «کانتکست» را ابداع کردند که معنای مشابهی با اصطلاح فلسفی ذکر شده در بالا دارد. من ترجیح می‌دهم این اصطلاحات را جدا نگه دارم، زیرا شرکت‌های فناوری دوست دارند تعاریف خود را از اینکه دنیا چگونه باید باشد، در تلاش برای فروش محصولات و سهام خود، تحمیل کنند. همچنین، احتمالاً با توسعه فناوری، تعریفی از AI-Context-2025 و تعریف جدیدی از AI-Context-2026 و غیره وجود خواهد داشت. در حالی که اصطلاحات فلسفی ثابت می‌مانند.

بنابراین، تعریف فعلی کانتکست تا مارس ۲۰۲۵ (می‌توانید آن را AI-Context-2025 بنامید) این خواهد بود: اطلاعات اضافی که کاربر باید به سیستم هوش مصنوعی ارائه دهد تا بفهمد چه کاری باید انجام دهد.

۲.۶ «کانتکست» در GitHub Copilot چیست؟

در ویدیوهای آموزشی GitHub Copilot، تأکید زیادی بر ارائه «کانتکست» مناسب برای درخواست‌های شما شده است. به نظر من، این به معنای درخواست شمارش صریح فایل‌هایی است که حاوی کد مرتبط هستند. من فرض می‌کردم که «کانتکست ضمنی» پروژه/راهکار (solution) ویژوال استودیو شما خواهد بود، اما در حال حاضر، حداقل اینطور نیست.

در واقع، یک چک‌باکس کوچک در رابط کاربری GitHub Copilot در VS2022 وجود دارد که با کلیک بر روی آن تأیید می‌کنید که می‌خواهید سند باز فعلی در «کانتکست» هر درخواست شما گنجانده شود. (ضمناً، آن‌ها این را «مهندسی پرامپت» می‌نامند و شما در حال کلیک کردن روی چک‌باکس‌های رابط کاربری گرافیکی هستید... شاید «مهندسی رابط کاربری گرافیکی» نام بهتری باشد؟). همچنین از شما خواسته می‌شود فایل‌های مرتبط را با استفاده از پیشوند #، مانند #file1.cs، شمارش کنید.

بنابراین، اگر می‌خواهید به طور کارآمد از GitHub Copilot استفاده کنید، روش خاصی برای استفاده از آن و یک رابط خط فرمان/رابط کاربری گرافیکی توصیه شده برای آن وجود دارد. بسیار خوب. من تمام دستورالعمل‌ها را خواندم/یاد گرفتم و می‌خواستم ببینم این هوش مصنوعی چگونه کد خوبی برای پروژه VS2022 من تولید می‌کند.

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

۳. برداشت‌ها پس از هفته اول

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

«چت کردن با آن» اتلاف وقت است، سریع‌تر است که به گوگل بروید و خودتان برای حل یک مشکل اصلی مطالعه کنید.

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

همچنین تمایل دارد کد «آشغال» زیادی تولید کند، بنابراین یک انسان باید آنچه تولید می‌شود را فیلتر کند، اما استفاده از دکمه «حذف» و نگه داشتن فقط «قطعه‌های خوب» دشوار نیست.

بیایید بگوییم، بر اساس آنچه تاکنون دیده‌ام، انتظار دارم بتواند ۵٪ از زمان تایپ من را صرفه‌جویی کند.

۴. برداشت‌ها پس از ۱.۵ ماه

GitHub-Copilot (هوش مصنوعی مولد) مفید است، اما عالی نیست. گاهی اوقات مفید است، اما فقط برای مشکلات با دامنه محلی (local scope)، نمی‌تواند تصویر بزرگتر را ببیند.

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

در مشکلات جدی بی‌فایده است؛ بهتر است خودم یک مقاله StackOverflow را بخوانم و آن را بفهمم. اما گاهی اوقات، عالی عمل می‌کند و کد بسیار خوبی برای کارهای تکراری تولید می‌کند.

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

۵. برداشت‌ها پس از ۳ ماه

GitHub Copilot (GHC) یک ابزار هوش مصنوعی مولد (Gen-AI) است که در وظایف با دامنه محدود بسیار مفید است.

  • GHC گاهی اوقات درخشان است. بله، گاهی اوقات GHC در پیش‌بینی آنچه می‌خواهید کدنویسی کنید، درخشان عمل می‌کند و با «متن شبح» به شما پیشنهاد می‌دهد که فقط باید آن را در کد خود بپذیرید.

  • GHC سریع یاد می‌گیرد. GHC خیلی سریع سبک برنامه‌نویسی شما را (نحوه مدیریت و ثبت خطاها توسط من) بهتر از هر همکار دیگری یاد می‌گیرد و سبک شما را در ارائه کد پیش‌بینی شده «متن شبح» دنبال می‌کند. من این را خیلی دوست دارم، هر فردی تمایل دارد سبک خاص خود را در ایجاد لاگ‌ها و غیره داشته باشد.

  • GHC به طرز خطرناکی سبک خودش را اضافه می‌کند. GHC خطرناک است زیرا فکر می‌کند از شما باهوش‌تر است و چیزها را کمی به روش خودش تغییر می‌دهد، بدون اینکه متوجه شوید. در بازیابی پایگاه داده، در صورت بروز خطا، من null برمی‌گرداندم. GHC در حین کدنویسی با «متن شبح» به من پیشنهاد داد تا متدم را تمام کنم، و من فقط نگاهی کوتاه انداختم و آن را پذیرفتم. این یک باگ ایجاد کرد؛ به جای null در هنگام خطا، یک شیء خالی برمی‌گرداند و کد من در جای دیگری دچار مشکل می‌شد. درس اخلاقی: پیشنهادات کدی را که به شما ارائه می‌دهد قبل از پذیرش به دقت بخوانید.

  • GHC می‌تواند «کد تولید کند» اما «کد نمی‌نویسد». توضیحش سخت است، اما به سادگی، GHC سینتکس C# را خوب نمی‌فهمد. قطعه‌های درخشانی از C# ایجاد می‌کند، اما با خطاهای سینتکسی کوچک. شما باید بررسی سینتکس جداگانه‌ای روی کدی که از GHC دریافت می‌کنید انجام دهید. این قطعاً چیزی نیست که ما عادت داریم از دستیاران کد ماشینی/خودکار دریافت کنیم.

  • GHC سینتکس C# را خوب نمی‌فهمد. اول از همه، در مورد nullability مانند string در مقابل string? شکست می‌خورد. شما باید آن را با کامپایلر بررسی کنید و خودتان آن را اصلاح کنید. دشوار نیست، اما انتظار دارید دقیقاً این نوع کار را به دستیاران کد ماشینی/خودکار واگذار کنید. فقط می‌توانم حدس بزنم که شاید قطعه کدهای C#-.NET-Framework را با قطعه کدهای C#-.NET-Core مخلوط می‌کند.

  • GHC سینتکس C# را خوب نمی‌فهمد. قطعه کدها را در پروژه کد VS2022 شما درج می‌کند، اما با آکولادهای باز/بسته بلوک‌های کد مشکل ایجاد می‌کند. شما باید خودتان آن‌ها را بشمارید و آنچه لازم است را اضافه/حذف کنید. وقت شما را تلف می‌کند و گاهی اوقات آشفتگی زیادی ایجاد می‌کند. اینکه کد تولید شده بلافاصله آماده کامپایل نیست، بسیار ناامید کننده است.

  • GHC متدها/ویژگی‌های (properties) C# را خوب نمی‌فهمد. کدی به من پیشنهاد می‌دهد که خوب به نظر می‌رسد و من آن را می‌پذیرم. اما شیء کلاس C# اصلاً آن متد را ندارد. نزدیک بود، شیء والد آن آن متد را دارد، بنابراین خودم آن را فهمیدم. خوب، نزدیک بود و مرا در مسیر درست قرار داد. اما این همان کاری است که قرار است ماشین‌ها انجام دهند. هیچ انسانی نمی‌تواند تمام متدهای شاید ۱۰,۰۰۰ کلاس C# که API .NET 8 هستند و من در کدنویسی‌ام استفاده می‌کنم را به خاطر بسپارد. من انتظار دارم ماشین در این مورد به من کمک کند. اما نه، حتی GHC هم مطمئن نیست که کدام متد در کدام کلاس است. به شما یک تکلیف کوچک می‌دهد که خودتان آن را به صورت دستی بررسی کنید. کدی که به شما می‌دهد کامپایل نمی‌شود، اما «نزدیک» است. به نظر می‌رسد GHC توهم می‌زند که کلاس C# متد خاصی دارد، اما ندارد.

  • GHC متدها/ویژگی‌های C# را خوب نمی‌فهمد. من از EF8 در پروژه VS2022 خود استفاده می‌کنم و کلاسی به نام Customer دارم. شروع به نوشتن یک متد دسترسی به جدول پایگاه داده Customer کردم و GHC در «متن شبح» پیش‌بینی متد GetCustomer را به من پیشنهاد داد. مفهوم درست است، و بله، آن جدول پایگاه داده یک کلید اصلی دارد، اما نام آن CustomerId نیست. به نظر می‌رسد GHC به سادگی توهم می‌زند که چنین ویژگی کلاسی با آن نام باید وجود داشته باشد، اما وجود ندارد. کد پیش‌بینی شده کامپایل نخواهد شد، و من باید به کلاس Customer بروم و بررسی کنم که نام دقیق کلید اصلی چیست. اینکه یک دستیار کد ماشینی/خودکار، GHC، نمی‌تواند نام‌های صحیح ویژگی/متد را خودش بررسی کند، بسیار ناامید کننده است. این فقط یک کلاس دیگر در پروژه VS2022 است. بنابراین، قطعه کد از نظر مفهومی نزدیک است، اما من باید خطاهای سینتکسی را به صورت دستی خودم اصلاح کنم. و من بیش از ۱۰۰ بار چنین وضعیتی داشته‌ام.

  • GHC متدها/ویژگی‌های C# را خوب نمی‌فهمد. برداشت این است که GHC سطحی است، خیلی بیشتر از چند صفحه کد نمی‌بیند، و سعی می‌کند «حدس بزند» بقیه پروژه VS2022 چگونه به نظر می‌رسد.

  • چت‌های GHC تمایل به اتلاف وقت شما دارند. با حدس‌هایش وقت شما را تلف می‌کند. من وقت ندارم بیش از ۲ پیشنهاد کد تولید شده را بخوانم. باید کارم را انجام دهم. بعد از ۱-۲ حدس اشتباه، GHC وقت شما را تلف می‌کند. بهترین استفاده‌ای که از ویژگی چت GHC پیدا کردم زمانی بود که نیاز داشتم قطعه کد JS برای محاسبه تفاوت تاریخ‌ها را بدانم. GHC یک قطعه کد خوب به من داد، و فقط باید آن را در گوگل جستجو می‌کردم تا صحت آن را تأیید کنم. این یک استفاده خوب بود. تمام تلاش‌های دیگر برای استفاده از چت GHC اتلاف وقت من بود، زیرا GHC توضیحات طولانی برای پاسخ‌های اشتباه به من می‌داد.

  • GHC کل پروژه ویژوال استودیو را درک نمی‌کند. شاید درک کند، اما آن را نشان نمی‌دهد. امیدوار بودم که بتواند کل پایگاه کد را بخواند و بفهمد و بر اساس آن پیشنهاداتی ارائه دهد، اما نه. به نظر می‌رسد به شاید چند هزار خط کد در فایل فعلی + فایل‌هایی که به صراحت در پرامپت با استفاده از سینتکس #file.cs لیست می‌کنید، محدود است. این یک محدودیت جدی است. شاید این فقط یک محدودیت موقتی GHC-2025 باشد. شاید GHC-2026 بهتر باشد. اما در حال حاضر، در سال ۲۰۲۵، GHC در آنچه می‌تواند از پروژه ویژوال استودیو شما ببیند/درک کند بسیار محدود است.

  • اشتراک GHC Pro. من برای GHC Pro هزینه پرداخت کردم که قرار است پاسخ‌های بهتری ارائه دهد. شاید نسخه غیر Pro حتی بدتر باشد. اما پس از ۳ ماه، اشتراک را تمدید نخواهم کرد. می‌توانم بدون آن زندگی کنم.

  • این هوش مصنوعی مولد است. این یک هوش مصنوعی مولد (Generative AI) است. این یک هوش مصنوعی «هوشمند» نیست. فقط یک ابزار تکمیل متن/کد تقویت شده است. میلیون‌ها خط کد را به خاطر سپرده است و سعی می‌کند به صورت آماری حدس بزند که می‌خواهید در ادامه چه کاری انجام دهید. همین. هیچ هوش واقعی پشت آن نیست.

خلاصه

پس از ۳ ماه استفاده از GHC Pro در یک پروژه تولیدی واقعی ASP.NET 8، می‌توانم بگویم که این ابزار برای وظایف با دامنه محلی مفید است. اما راه‌حل جادویی نیست. نیاز به یک توسعه‌دهنده انسانی برای درک کل پروژه و تصمیم‌گیری‌های طراحی را از بین نمی‌برد. می‌تواند مقداری از زمان تایپ را صرفه‌جویی کند، اما وظایف جدیدی مانند بررسی کد تولید شده از نظر صحت و خطاهای سینتکسی را نیز معرفی می‌کند. به طور کلی، تخمین می‌زنم که شاید ۵٪ از زمان کدنویسی من را صرفه‌جویی می‌کند. بد نیست، اما انقلابی هم نیست. می‌توانم بدون آن زندگی کنم.