ฉันควรเตรียมพบคำถามอะไรในการสัมภาษณ์ .NET?

โดย Aaron Cao · อัปเดตเมื่อ

ฉันควรเตรียมพบคำถามอะไรในการสัมภาษณ์ .NET?
เตรียมพบคำถามเกี่ยวกับรันไทม์ (CLR, การเก็บขยะ, ชนิดค่าเทียบกับชนิดอ้างอิง) ภาษา (async และ await, LINQ, generics, records) เฟรมเวิร์ก (มิดเดิลแวร์และ dependency injection ของ ASP.NET Core, EF Core) รวมถึงสถานการณ์ เช่น หน่วยความจำรั่วในบริการที่ทำงานต่อเนื่องเป็นเวลานาน หรือ API endpoint ที่ช้า ผู้สัมภาษณ์จะประเมินกระบวนการให้เหตุผล

เตรียมพบคำถามเกี่ยวกับรันไทม์ (CLR, การเก็บขยะ, ชนิดค่าเทียบกับชนิดอ้างอิง) ภาษา (async และ await, LINQ, generics, records) เฟรมเวิร์ก (มิดเดิลแวร์และ dependency injection ของ ASP.NET Core, EF Core) รวมถึงสถานการณ์ เช่น หน่วยความจำรั่วในบริการที่ทำงานต่อเนื่องเป็นเวลานาน หรือ API endpoint ที่ช้า ผู้สัมภาษณ์จะประเมินกระบวนการให้เหตุผล

คำถามด้านรันไทม์และภาษาใดมักเปิดการสัมภาษณ์ .NET?

ผู้สัมภาษณ์เริ่มจากจุดเดียวกับที่เฟรมเวิร์กเริ่ม นั่นคือรันไทม์ เตรียมอธิบายว่า Common Language Runtime ทำอะไรบ้าง (โหลดแอสเซมบลี คอมไพล์ภาษากลางแบบ just-in-time และจัดการหน่วยความจำ) จากนั้นจึงลงลึกอีกระดับเรื่องการเก็บขยะ ลำดับคำถามต่อยอดค่อนข้างคาดเดาได้ ได้แก่ เหตุใดตัวเก็บขยะจึงแบ่งเป็นเจเนอเรชัน อะไรทำให้ออบเจ็กต์อยู่รอดไปยังเจเนอเรชันถัดไป large object heap มีไว้ทำอะไร และเหตุใดจึงต้องมี IDisposable และ using ทั้งที่หน่วยความจำได้รับการจัดการอยู่แล้ว สำหรับข้อสุดท้าย ให้อธิบายเรื่องทรัพยากรที่ไม่ได้รับการจัดการ เช่น file handle และ connection ซึ่งตัวเก็บขยะไม่รู้วิธีปล่อยอย่างทันท่วงที

  • ชนิดค่าและชนิดอ้างอิง แต่ละชนิดอยู่ที่ใด การคัดลอกมีความหมายอย่างไร และ boxing มีต้นทุนอะไร
  • async และ await อธิบายว่า task ที่ถูก await จะปล่อยเธรดผู้เรียกให้ว่างแทนที่จะบล็อก เหตุใด async void จึงสงวนไว้สำหรับ event handler และ deadlock ที่ผู้คนหมายถึงเมื่อเตือนเรื่อง .Result คืออะไร
  • LINQ จุดดักคือ deferred execution: คิวรี IEnumerable จะทำงานเมื่อมีการ enumerate ไม่ใช่เมื่อเขียน และคิวรีกับผู้ให้บริการฐานข้อมูลจะแปลเป็น SQL ได้เฉพาะ expression ที่ผู้ให้บริการเข้าใจ
  • Generics, interfaces และ records ข้อจำกัด เหตุผลที่ใช้ interface แทน base class เพื่อให้ทดสอบได้ง่าย และประโยชน์ของการเทียบค่าแบบ value equality ใน record

ตอบแต่ละข้อด้วยกลไกและผลที่ตามมาอย่างหนึ่ง การบอกว่าการเก็บขยะในเจเนอเรชันศูนย์มีต้นทุนต่ำเพราะออบเจ็กต์ส่วนใหญ่อายุสั้น คือระดับคำตอบที่ผู้สัมภาษณ์ต้องการ การบอกเพียงชื่อเจเนอเรชันโดยไม่อธิบายเหตุผลยังไม่พอ

คำถาม ASP.NET Core และ EF Core มีลักษณะอย่างไร?

คุณมั่นใจในการเขียน controller แต่กังวลว่าคำถามจะเกี่ยวกับกลไกเบื้องหลังที่แทบไม่เคยแตะ ความกังวลนี้มีเหตุผล เพราะคำถามเรื่องเฟรมเวิร์กอยู่ตรงนี้ ต่อไปนี้คือกลไกเบื้องหลังตามลำดับที่มักถูกถาม พร้อมคำถามต่อยอดของแต่ละหัวข้อ

  • Request pipeline มิดเดิลแวร์ทำงานตามลำดับที่ลงทะเบียน โดยแต่ละคอมโพเนนต์เลือกว่าจะเรียกตัวถัดไปหรือไม่ คำถามต่อยอด: authentication อยู่ตรงไหนเมื่อเทียบกับ authorization และจะเกิดอะไรขึ้นหากลงทะเบียนสลับลำดับ?
  • อายุของ dependency injection Singleton อยู่ตลอดอายุแอปพลิเคชัน scoped อยู่ตลอดหนึ่ง request และ transient ถูกสร้างใหม่ทุกครั้งที่ resolve จุดดักคลาสสิกคือการฉีดบริการแบบ scoped เช่น database context เข้าไปใน singleton จงเตรียมอธิบายว่าเหตุใดจึงเป็นบั๊ก
  • Configuration และ options แหล่งข้อมูลแบบซ้อนชั้น การ override ตาม environment และรูปแบบ options สำหรับการตั้งค่าแบบมีชนิด
  • EF Core Change tracking และเวลาใดควรปิดสำหรับคิวรีแบบอ่านอย่างเดียว ปัญหา N+1 และวิธีที่ eager loading หรือ projection ช่วยหลีกเลี่ยง migrations รวมถึงจุดที่ควรยอมรับอย่างตรงไปตรงมาว่าคิวรีที่เขียนเองดีกว่า LINQ
  • การทดสอบ interface และ DI container ทำให้บริการทดสอบได้อย่างไร และผู้ให้บริการแบบ in-memory พิสูจน์หรือไม่พิสูจน์อะไรเกี่ยวกับฐานข้อมูลจริง

ผู้สมัครที่แข็งแกร่งที่สุดจะเชื่อมโยงประเด็นเหล่านี้เข้าด้วยกัน: context แบบ scoped ที่ถูก resolve ภายใน singleton background service ไม่ใช่คำถามเกร็ดความรู้ แต่เป็นบั๊กด้านหน่วยความจำและความถูกต้องที่ผู้สัมภาษณ์เคยปล่อยขึ้นระบบจริง และพวกเขาต้องการได้ยินว่าคุณจะสร้าง scope อย่างชัดเจน

คำถามสถานการณ์ดำเนินไปอย่างไร?

รอบสัมภาษณ์ระดับอาวุโสจะให้ดูอาการและสังเกตวิธีทำงานของคุณ ตัวอย่างที่พบได้คือ วิศวกร backend ที่สัมภาษณ์ตำแหน่งอาวุโสในบริษัทโลจิสติกส์ได้รับแจ้งว่าหน่วยความจำของ ASP.NET Core API เพิ่มขึ้นต่อเนื่องหลายวันจน container เริ่มทำงานใหม่ คำตอบที่ดีจะไม่เดาสุ่ม แต่จะถามว่ามีอะไรเปลี่ยนไป ตรวจหาออบเจ็กต์ที่ถูก static cache หรือ event subscription อายุยาวยึดไว้ มองหาบริการแบบ scoped ที่ singleton ถือครอง ตรวจสอบการเติบโตของ large object heap และใช้ memory snapshot ก่อนเสนอวิธีแก้ ผู้สัมภาษณ์กำลังประเมินลำดับการตรวจสอบ

สถานการณ์อื่นที่พบบ่อย ได้แก่ endpoint ที่ช้าเฉพาะเมื่อมีโหลดสูง ซึ่งคำตอบควรไล่จากการเรียกฐานข้อมูลแบบ synchronous ไปยัง async ภาวะ connection pool หมด และ caching; race condition ใน collection ที่ใช้ร่วมกัน พร้อมต้นทุนของ concurrent collection และตัวเลือกการล็อก; request ที่ต้องเรียกบริการปลายทางสามแห่ง พร้อมวิธีจัดการ timeout การ retry และความล้มเหลวบางส่วน; รวมถึง migration ที่ต้องเพิ่มคอลัมน์โดยไม่มี downtime ในแต่ละกรณี ให้ระบุข้อจำกัด เลือกกลไก และอธิบายสิ่งที่ต้องแลกอย่างชัดเจน

สถานการณ์เหล่านี้จะง่ายขึ้นมากเมื่อคุณฝึกตอบออกเสียงพร้อมคำถามต่อยอด ซึ่งเป็นจุดประสงค์ของโหมด สัมภาษณ์จำลอง; ส่วนคลังคำถามสำหรับภาษาและบทบาทอื่นรวบรวมไว้ที่ คำถามสัมภาษณ์ตามบทบาทและหัวข้อ

ผู้ช่วยสัมภาษณ์ AI ช่วยตอบคำถาม .NET ได้หรือไม่?

ได้ในรอบสนทนา ภายใต้ข้อจำกัดที่ระบุไว้ แอปเดสก์ท็อปแบบเนทีฟสำหรับ macOS และ Windows ของ SubcueAI จะรับเสียงระบบและไมโครโฟนของคุณ แล้วแสดงคำแนะนำคำตอบสั้นๆ ใน overlay ภายในเครื่อง ดังนั้นเมื่อผู้สัมภาษณ์ถามว่าเหตุใด scoped context ภายใน singleton จึงเป็นบั๊ก กลไกจะปรากฏบนหน้าจอขณะที่คุณอธิบายด้วยคำพูดของตนเอง ส่วนส่วนขยายเบราว์เซอร์รองรับการโทรผ่านแท็บเบราว์เซอร์บน Chrome และ Edge โดยรับเฉพาะเสียงจากแท็บการประชุม ไม่มีบอตเข้าร่วมสายและไม่มีสิ่งใดถูกแทรกเข้าไปในหน้าการประชุม ดูวิธีตั้งค่าได้ในหน้า บทแนะนำ

ข้อจำกัดคือ ไม่รองรับการประเมินแบบคุมเข้ม การบันทึกหน้าจอ แล็ปท็อปที่บริษัทจัดการ หรือแบบฝึกเขียนโค้ดสดที่คุณต้องพิมพ์ C# ภายใต้การสังเกต และผู้ช่วยจะอ่อนที่สุดในส่วนที่การสัมภาษณ์กำหนดให้คุณเขียนโค้ด จุดแข็งที่สุดคือคำถามด้านรันไทม์ เฟรมเวิร์ก และสิ่งที่ต้องแลกตามที่กล่าวไปข้างต้น ป้อนเรซูเม่ของคุณก่อนเพื่อให้คำแนะนำสะท้อนระบบที่คุณสร้างจริง โดยโปรไฟล์นี้อยู่ใน เครื่องมือสร้างเรซูเม่

คำถามที่พบบ่อย

เหตุใดตัวเก็บขยะของ .NET จึงมีหลายเจเนอเรชัน?

ออบเจ็กต์ส่วนใหญ่อายุสั้น ดังนั้นการเก็บเจเนอเรชันใหม่ล่าสุดบ่อยครั้งด้วยต้นทุนต่ำจึงเรียกคืนหน่วยความจำส่วนใหญ่ได้โดยไม่ต้องสแกน heap ทั้งหมด ออบเจ็กต์ที่อยู่รอดจะถูกเลื่อนไปยังเจเนอเรชันถัดไปและถูกรวบรวมน้อยลง ซึ่งช่วยให้ช่วงหยุดสั้นสำหรับรูปแบบการจัดสรรทั่วไป

singleton, scoped และ transient ใน ASP.NET Core ต่างกันอย่างไร?

Singleton ถูกสร้างครั้งเดียวสำหรับแอปพลิเคชัน scoped ถูกสร้างครั้งเดียวต่อ request และ transient ถูกสร้างทุกครั้งที่ resolve การฉีดบริการแบบ scoped เข้าไปใน singleton จะทำให้บริการนั้นถูกยึดไว้ตลอดอายุแอปพลิเคชัน ซึ่งเป็นบั๊กที่พบบ่อยกับ database context

await ทำอะไรจริงๆ?

มันลงทะเบียนส่วนที่เหลือของเมธอดเป็น continuation และคืนการควบคุมให้ผู้เรียก เธรดจึงว่างระหว่างรอให้งานที่ await เสร็จสิ้น แต่การบล็อก task ด้วย .Result หรือ .Wait อาจทำให้เกิด deadlock ใน context ที่ต้องการเธรดนั้นกลับมา

ปัญหา N+1 ใน EF Core คืออะไร?

คือการโหลดรายการ parent แล้วเรียกคิวรีแยกต่อ parent แต่ละรายการเพื่อโหลด child การใช้ eager loading ด้วย Include หรือ projection เฉพาะฟิลด์ที่ต้องการ จะเปลี่ยนให้เหลือหนึ่งหรือสองคิวรี

SubcueAI ช่วยระหว่างการทดสอบเขียนโค้ด .NET แบบคุมเข้มได้หรือไม่?

ไม่ได้ การประเมินแบบคุมเข้มและแบบบันทึกอยู่นอกขอบเขต และการเขียนโค้ดสดภายใต้การสังเกตต้องเป็นผลงานของคุณเอง เครื่องมือนี้มีไว้สำหรับรอบสนทนา ส่วนโหมดสัมภาษณ์จำลองมีไว้สำหรับฝึกซ้อมล่วงหน้า

คำถามที่เกี่ยวข้อง

← เพิ่มเติมเกี่ยวกับ คำถามสัมภาษณ์ตามตำแหน่งและหัวข้อ