مقدمه
در دنیای پرشتاب توسعه نرمافزار، ابزارهای مبتنی بر هوش مصنوعی (AI) نقشی کلیدی در افزایش بهرهوری و سادهسازی فرآیندهای کدنویسی ایفا میکنند. یکی از این ابزارها، GitHub Copilot است که به عنوان یک دستیار برنامهنویسی هوشمند، با پیشنهاد کدها و خودکارسازی وظایف تکراری، به توسعهدهندگان کمک میکند. این ابزار، بهویژه در محیط Visual Studio Code، با بهرهگیری از مدلهای زبانی بزرگ (Large Language Models یا LLMs) امکان تولید کدهای دقیق و متناسب با نیازهای پروژه را فراهم میآورد. اما برای بهرهمندی کامل از قابلیتهای این ابزار، تسلط بر مهندسی درخواستها (Prompt Engineering) ضروری است. مهندسی درخواستها به معنای طراحی دستورات یا درخواستهای دقیق و هدفمند برای هدایت هوش مصنوعی به سمت تولید خروجیهای مطلوب است.
مهندسی درخواستها چیست و چرا اهمیت دارد؟
مهندسی درخواستها فرآیند طراحی و بهینهسازی ورودیهایی است که به مدلهای زبانی مانند GitHub Copilot ارائه میشوند تا پاسخهای دقیق و کاربردی تولید کنند. در توسعه نرمافزار، این تکنیک به توسعهدهندگان امکان میدهد تا با ارائه دستورات مشخص، کدهایی تولید کنند که نهتنها به نیازهای پروژه پاسخ میدهند، بلکه با استانداردهای کدنویسی و بهترین شیوهها (Best Practices) نیز همراستا هستند. برای توسعهدهندگان .NET، این موضوع بهویژه در پروژههای بزرگ که نیازمند حفظ یکپارچگی و خوانایی کد هستند، اهمیت دوچندانی دارد.
به عنوان مثال، فرض کنید در حال توسعه یک برنامه .NET هستید که نیاز به پیادهسازی عملیات CRUD (Create, Read, Update, Delete) برای یک موجودیت مشخص دارد. به جای نوشتن دستی کدهای تکراری، میتوانید از GitHub Copilot بخواهید این کدها را با رعایت الگوهای طراحی (Design Patterns) مانند Repository Pattern تولید کند. اما بدون یک درخواست مهندسیشده، خروجی ممکن است ناکارآمد یا غیراستاندارد باشد.
استفاده از درخواستهای قابلاستفاده مجدد در Visual Studio Code
یکی از ویژگیهای برجسته GitHub Copilot در Visual Studio Code، پشتیبانی از فایلهای درخواست قابلاستفاده مجدد است. این فایلها به توسعهدهندگان امکان میدهند دستورات خاصی را برای وظایف تکراری تعریف کنند و در پروژههای مختلف از آنها استفاده کنند. این رویکرد نهتنها زمان کدنویسی را کاهش میدهد، بلکه به حفظ استانداردهای کدنویسی در تیم کمک میکند.
برای مثال، فرض کنید میخواهید GitHub Copilot را برای تولید کدهای .NET با رعایت اصول برنامهنویسی تابعی (Functional Programming) هدایت کنید. میتوانید یک فایل درخواست با ساختار زیر در پوشه .vscode پروژه خود ایجاد کنید:
---
description: دستورالعملهایی برای تولید کدهای C# با الگوهای تابعی
---
# نقش
- متخصص زبان C#
- معمار نرمافزار
## دستورالعملهای کلی
- از الگوهای تابعی و دادههای غیرقابلتغییر (Immutable) استفاده کنید.
- از پیچیدگی غیرضروری اجتناب کنید.
- کد باید خوانا و قابلنگهداری باشد.
این فایل به GitHub Copilot کمک میکند تا پیشنهادات کدی را با رعایت این اصول تولید کند. برای مثال، اگر بخواهید یک متد برای فیلتر کردن لیستی از اشیاء بنویسید، میتوانید از درخواست زیر استفاده کنید:
// فیلتر کردن لیست کاربران بر اساس سن با استفاده از الگوهای تابعی
GitHub Copilot ممکن است کدی مشابه زیر تولید کند:
public IEnumerable<User> FilterUsersByAge(IEnumerable<User> users, int minAge)
{
return users.Where(u => u.Age >= minAge).ToList();
}این کد نهتنها مختصر و خوانا است، بلکه با اصول تابعی و استفاده از LINQ همراستا است.
تکنیکهای پیشرفته مهندسی درخواستها
درخواست دانش تولیدشده (Generated Knowledge Prompting):
به جای ارائه تمام جزئیات در درخواست اولیه، میتوانید از GitHub Copilot بخواهید سؤالات تکمیلی برای روشن شدن نیازهای شما بپرسد. این روش بهویژه در پروژههای پیچیده .NET که نیاز به تصمیمگیریهای متعدد دارند، مفید است. برای مثال:
---
description: جلسه پرسوجو
---
# تعریف
یک سری سؤالات بله/خیر بپرسید تا نیازهای من را بهتر درک کنید و پیشنهاد دقیقتری ارائه دهید.
## محدودیتها
- سؤالات باید مرتبط با موضوع باشند.
- حداکثر 5 سؤال در یک دسته بپرسید.
این درخواست به GitHub Copilot اجازه میدهد تا با پرسیدن سؤالاتی مانند «آیا نیاز به استفاده از Entity Framework دارید؟» یا «آیا متد باید همزمان (Asynchronous) باشد؟»، زمینه مناسب را برای تولید کد فراهم کند.
تولید ساختارهای کد تکرارشونده:
در پروژههای .NET، بسیاری از کدها مانند متدهای CRUD یا کنترلرهای ASP.NET Core ساختارهای تکراری دارند. با تعریف الگوهای مشخص در فایلهای درخواست، میتوانید اطمینان حاصل کنید که GitHub Copilot کدهایی با ساختار یکسان تولید میکند. برای مثال، برای تولید یک کنترلر REST API، میتوانید از درخواست زیر استفاده کنید:
// تولید یک کنترلر ASP.NET Core برای مدیریت موجودیت Product با عملیات CRUD
GitHub Copilot ممکن است کدی مشابه زیر تولید کند:
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private readonly IProductRepository _repository;
public ProductsController(IProductRepository repository)
{
_repository = repository;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<Product>>> GetProducts()
{
var products = await _repository.GetAllAsync();
return Ok(products);
}
// سایر متدهای CRUD
}این کد با الگوی Repository Pattern و استانداردهای ASP.NET Core سازگار است.
مزایا و چالشهای استفاده از GitHub Copilot
استفاده از GitHub Copilot مزایای متعددی دارد، از جمله:
- افزایش بهرهوری: خودکارسازی وظایف تکراری مانند نوشتن تستهای واحد (Unit Tests) یا مستندات.
- بهبود همکاری تیمی: استفاده از درخواستهای مشترک در تیم، یکپارچگی کد را تضمین میکند.
- یادگیری سریعتر: توسعهدهندگان تازهکار میتوانند از پیشنهادات GitHub Copilot برای یادگیری الگوهای کدنویسی استفاده کنند.
با این حال، چالشهایی نیز وجود دارد. به عنوان مثال، GitHub Copilot ممکن است گاهی کدهایی تولید کند که با استانداردهای تعریفشده مطابقت ندارند یا حتی نادرست باشند. بنابراین، بازبینی دقیق کدها و ارائه بازخورد به ابزار ضروری است. همچنین، تعریف تعداد زیادی قانون در فایلهای درخواست ممکن است باعث کاهش کیفیت خروجی یا تولید کدهای غیرمرتبط شود.
مهندسی درخواستها با GitHub Copilot تنها یکی از جنبههای استفاده از هوش مصنوعی در توسعه نرمافزار است. این تکنیک را میتوان با سایر ابزارهای هوش مصنوعی مانند Copilot for Docs (برای تولید مستندات) یا Copilot for Pull Requests (برای بهبود توضیحات درخواستهای کشش) ترکیب کرد تا گردش کار توسعه را جامعتر کرد. علاوه بر این، مفاهیم مهندسی درخواستها در سایر حوزههای هوش مصنوعی، مانند تولید محتوا یا تحلیل دادهها، نیز کاربرد دارند و توسعهدهندگان .NET میتوانند از این دانش در پروژههای چندرشتهای بهره ببرند.
نتیجهگیری
مهندسی درخواستها با GitHub Copilot در Visual Studio Code ابزاری قدرتمند برای توسعهدهندگان .NET است که میتواند بهرهوری، کیفیت کد، و همکاری تیمی را به طور قابلتوجهی بهبود بخشد. با استفاده از درخواستهای قابلاستفاده مجدد و تکنیکهای پیشرفته مانند Generated Knowledge Prompting، توسعهدهندگان میتوانند کدهایی تولید کنند که نهتنها نیازهای پروژه را برآورده میکنند، بلکه با بهترین شیوههای کدنویسی نیز همراستا هستند. با این حال، موفقیت در استفاده از این ابزار نیازمند بازبینی دقیق کدها و طراحی درخواستهای متعادل است.