عنوان:

‫تبدیل کدهای روزمره به منبع یادگیری و آزمون فنی با GitHub Copilot


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۳:۰۶
آدرس: www.dntips.ir
یکی از خلاقانه‌ترین روش‌های تعمیق دانش فنی و تثبیت تصمیم‌های مهندسی، تبدیل کدهایی که روزانه می‌نویسید به یک «جلسه مصاحبه تخصصی» است. به‌جای حفظ کردن تصادفی سوالات عمومی مصاحبه، کالبدشکافی کدهای واقعی پروژه‌تان به شما کمک می‌کند لایه‌های زیرین فریم‌ورک، رفتارهای زمان اجرا و فلسفه پشت هر تصمیم معماری را به شکل ملموس درک کنید.

این تکنیک Copilot را از یک ابزار کمکی ساده به یک مصاحبه‌کننده ارشد .NET (Senior .NET Interviewer) تبدیل می‌کند که شما را در قبال تک‌تک کلمات کلیدی، تایپ‌ها و متدهایی که استفاده کرده‌اید به چالش می‌کشد.

بررسی یک قطعه کد نمونه در #C

متد واکشی سفارشات زیر را در نظر بگیرید:
public async Task<IReadOnlyList<Order>> GetOrdersAsync(
    CancellationToken cancellationToken)
{
    return await _db.Orders
        .AsNoTracking()
        .Where(x => x.Status == OrderStatus.Pending)
        .ToListAsync(cancellationToken);
}

ساختار پرامپت مهندسی برای شبیه‌سازی مصاحبه فنی

در نقش یک مصاحبه‌کننده ارشد و معمار نرم‌افزار .NET عمل کن.
بر اساس این متد، مجموعه‌ای از پرسش‌های فنی سطح بالا (Senior-level) به همراه پاسخ‌های ایده‌آل و جامع استخراج کن.
محورهای ارزیابی:
۱. رفتارهای داخلی EF Core: مکانیزم و اثرات استفاده از .AsNoTracking() بر مصرف حافظه، Garbage Collection و تفاوت آن با NoTrackingWithIdentityResolution.
۲. مفاهیم Async/Await و مدیریت رشته‌ها: تحلیل ماشین وضعیت (State Machine)، سربار تخصیص Task در مقایسه با ValueTask و چرخه حیات نخ‌ها در ThreadPool.
۳. لغو عملیات (Cancellation): نحوه انتشار CancellationToken از سطح وب به درایور پایگاه داده و رفتار درایورهای دیتابیس در زمان دریافت سیگنال Cancel.
۴. پایگاه داده و ایندکس‌گذاری: چه ساختار ایندکسی (مانند B-Tree Filtered Index) برای ستون Status روی جدول سفارشات بهترین بازدهی را دارد؟
۵. طراحی معماری و قراردادها: چرا بازگرداندن مستقیم Order (موجودیت دامنه) به جای DTO یا رکوردهای اختصاصی یک ضدالگو در لایه API محسوب می‌شود؟
۶. تایپ بازگشتی: تفاوت‌های رفتاری و عملکردی میان IReadOnlyList، IEnumerable و List.

نمونه‌ای از پرسش‌ها و پاسخ‌های فنی استخراج‌شده

پرسش ۱: چرا استفاده از .AsNoTracking() در این سناریو حیاتی است و چه اثری در سطح ران‌تایم دارد؟
پاسخ ایده‌آل: هنگامی که کوئری بدون AsNoTracking اجرا می‌شود، EF Core برای تک‌تک موجودیت‌های واکشی‌شده یک نمونه EntityEntry داخل ChangeTracker می‌سازد و کپی از مقادیر اولیه (Snapshot) را در حافظه نگه می‌دارد تا تغییرات را ردیابی کند. در سناریوهای صرفاً خواندنی (Read-only)، AsNoTracking با حذف این فرآیند، مصرف حافظه و بار Garbage Collector را به شدت کاهش داده و سرعت اجرای کوئری را افزایش می‌دهد.

پرسش ۲: ایندکس ایده‌آل در دیتابیس برای بهینه‌سازی این کوئری چیست؟
پاسخ ایده‌آل: از آنجا که ستون Status یک فیلد با گوناگونی پایین (Low Cardinality) است و ما فقط به دنبال وضعیت Pending هستیم، ساخت یک Filtered Index در دیتابیس‌هایی مثل SQL Server یا PostgreSQL بسیار بهینه‌تر از یک ایندکس استاندارد روی کل جدول است:
CREATE NONCLUSTERED INDEX IX_Orders_PendingStatus 
ON Orders(Id) 
WHERE Status = 0; -- Pending
این کار حجم ایندکس روی دیسک و حافظه RAM دیتابیس را به حداقل ممکن می‌رساند.

پرسش ۳: اگر کلاینت درخواست HTTP را متوقف کند، cancellationToken چگونه جلوی هدررفت منابع دیتابیس را می‌گیرد؟
پاسخ ایده‌آل: توکن لغو از طریق لایه‌های فریم‌ورک به درایور ADO.NET (مانند Microsoft.Data.SqlClient) پاس داده می‌شود. درایور پس از فعال شدن توکن، یک سیگنال وقفه اضطراری (مانند بسته ATTN در پروتکل TDS برای SQL Server) به سرور پایگاه داده می‌فرستد تا اجرای کوئری در همان نقطه توسط دیتابیس لغو شده و منابع پردازشی سرور آزاد شوند.

مزایای آموزشی این رویکرد

  • کشف نقاط کور (Blind Spots): متوجه می‌شوید کدام بخش از کدی که هر روز می‌نویسید بر پایه عادت بوده و فلسفه دقیق پشت آن را مرور نکرده‌اید.
  • آمادگی دائمی برای گفتگوهای معماری و مصاحبه‌ها: تسلط به اصطلاحات، رفتار زیرساختی و Trade-offها باعث می‌شود در جلسات فنی و دفاع از کدهای خود در Code Review با استدلال قوی صحبت کنید.
  • ارتقای کدهای روزمره: با بررسی پاسخ‌های استخراج‌شده، انگیزه‌ای عملی برای اعمال بهینه‌سازی‌ها (مانند استفاده از ایندکس‌های فیلترشده یا DTOها) پیدا خواهید کرد.

قاعده کلیدی: کدی که خودتان نوشته‌اید بهترین کتاب درسی است؛ با هدایت Copilot برای پرسشگری عمیق از سورس‌کد، عادت چرایی‌سنجی تصمیم‌های مهندسی را در خود تقویت کنید.