10 câu hỏi có thể gặp khi phỏng vấn
Chọn theo kỹ năng và cấp của tin (C# & .NET). Gợi ý trả lời do Drama Công Ty biên soạn để bạn ôn nhanh, không phải đề của công ty.
01Bạn tối ưu hiệu năng một Web API .NET chịu tải cao thế nào?C# & .NET · Senior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →Bắt đầu bằng đo đạc (load test, APM, profiler), sau đó xử lý các điểm nghẽn phổ biến theo thứ tự tác động.
- I/O: async xuyên suốt, không sync-over-async; dùng connection pool đúng cách.
- Database: projection,
AsNoTracking, index đúng, tránh N+1; với bulk update dùngExecuteUpdateAsync. - Cache:
IMemoryCache, distributed cache (Redis),HybridCachetừ .NET 9, output caching cho response công khai. - Cấp phát bộ nhớ: giảm object tạm trong hot path, dùng
Span<T>,ArrayPool,System.Text.Jsonvới source generator. - Hạ tầng: response compression, rate limiting middleware, scale ngang khi stateless.
Luôn so sánh số liệu trước và sau (p95 latency, throughput, CPU, GC). Micro-optimize nên đo bằng BenchmarkDotNet.
Hay sai: tối ưu code C# trong khi 90% thời gian nằm ở query DB.
02Bạn tổ chức một dự án .NET lớn thế nào? Clean Architecture có luôn cần thiết?C# & .NET · Senior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →Mục tiêu là tách nghiệp vụ khỏi chi tiết hạ tầng để dễ test và dễ thay đổi; mức độ tách nên tương xứng với độ phức tạp của dự án.
Clean Architecture điển hình có các project: Domain (entity, rule), Application (use case, interface), Infrastructure (EF Core, gửi mail, gọi API ngoài), Api (controller hoặc minimal API). Phụ thuộc chỉ hướng vào trong.
- Dịch vụ CRUD nhỏ thì cách tổ chức theo vertical slice (mỗi tính năng một thư mục) thường gọn hơn và ít boilerplate.
- Tránh bọc thêm repository chung chung lên EF Core nếu nó chỉ chuyển tiếp lời gọi.
- MediatR hay CQRS là công cụ, không phải yêu cầu bắt buộc.
Người phỏng vấn muốn nghe: bạn hiểu trade-off giữa số lớp trừu tượng và tốc độ phát triển, và nêu được lý do cho lựa chọn trong dự án gần nhất.
03Phân biệt value type và reference type trong C#. struct khác class thế nào?C# & .NET · Junior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →Value type (
int,bool,struct,enum) chứa trực tiếp dữ liệu, gán là sao chép giá trị. Reference type (class,string, mảng,delegate) chứa tham chiếu tới object trên heap, gán là sao chép tham chiếu.- Biến cục bộ value type thường nằm trên stack, nhưng nếu là field của class thì nằm trên heap cùng object đó.
structkhông kế thừa được, hợp với dữ liệu nhỏ, bất biến (toạ độ, tiền tệ). Nên khai báoreadonly struct.- Ép value type sang
objecthoặc interface gây boxing, tốn cấp phát.
var a = new Point(1, 2); // struct var b = a; b.X = 9; // a.X vẫn là 1Hay sai: nói "value type luôn nằm trên stack". Hãy nói về ngữ nghĩa sao chép thay vì vị trí bộ nhớ.
04async/await hoạt động thế nào? Vì sao không nên dùng .Result hay .Wait()?C# & .NET · Junior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →async/awaitgiúp viết code bất đồng bộ như tuần tự: khi gặpawaitmột tác vụ chưa xong, method trả quyền điều khiển, thread được giải phóng, phần còn lại chạy tiếp khi tác vụ hoàn thành. Trình biên dịch biến method thành một state machine.- Async giúp không chặn thread khi chờ I/O (DB, HTTP), nhờ vậy server phục vụ được nhiều request hơn; nó không tự làm code chạy nhanh hơn.
- Việc nặng về CPU mới cần
Task.Run.
Gọi
.Resulthoặc.Wait()chặn thread đang chờ. Ở môi trường có SynchronizationContext (WinForms, WPF, ASP.NET cũ) dễ gây deadlock; ở ASP.NET Core gây cạn thread pool khi tải cao.Hay sai: dùng
async voidngoài event handler, exception sẽ không bắt được. Hãy trả vềTaskvà "async all the way".05Interface và abstract class khác nhau thế nào? Khi nào dùng cái nào?C# & .NET · Junior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →Interface mô tả khả năng (hợp đồng) mà nhiều kiểu không liên quan có thể cùng thực hiện; abstract class là lớp cha dùng chung code và trạng thái cho một họ lớp gần nhau.
- Một class implement nhiều interface nhưng chỉ kế thừa một class.
- Abstract class có field, constructor, method có sẵn thân.
- Từ C# 8 interface có default implementation, nhưng vẫn không có field trạng thái.
Dùng interface cho các phụ thuộc cần thay thế hoặc mock trong test (
IEmailSender,IOrderRepository). Dùng abstract class khi các lớp con thật sự chia sẻ logic, vd.BaseHandlerxử lý log và retry chung.Người phỏng vấn muốn nghe: bạn ưu tiên composition và interface, chỉ dùng kế thừa khi có quan hệ "là một" rõ ràng.
06IEnumerable và IQueryable khác nhau thế nào khi dùng LINQ với Entity Framework?C# & .NET · Junior
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →IQueryablegiữ biểu thức truy vấn (expression tree) để provider như EF Core dịch thành SQL chạy trên DB.IEnumerablechạy LINQ trong bộ nhớ trên dữ liệu đã tải về.// Lọc trong SQL: chỉ tải đơn đã thanh toán var paid = db.Orders.Where(o => o.Status == Status.Paid).ToList(); // Tải cả bảng rồi mới lọc trong RAM IEnumerable<Order> all = db.Orders; var paid2 = all.Where(o => o.Status == Status.Paid).ToList();- Cả hai đều deferred execution: chỉ chạy khi duyệt hoặc gọi
ToList(),Count(),First()... - Duyệt cùng một
IEnumerablelazy nhiều lần có thể chạy truy vấn nhiều lần.
Hay sai: gọi
ToList()hoặcAsEnumerable()quá sớm rồi mới lọc, phân trang, khiến tải cả bảng về.- Cả hai đều deferred execution: chỉ chạy khi duyệt hoặc gọi
07Dependency Injection trong ASP.NET Core: phân biệt Transient, Scoped và Singleton.C# & .NET
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →ASP.NET Core có DI container sẵn; lifetime quyết định khi nào tạo instance mới.
- Transient: mỗi lần resolve tạo mới. Hợp với service nhẹ, không trạng thái.
- Scoped: một instance cho mỗi request (mỗi scope).
DbContextmặc định là scoped. - Singleton: một instance cho cả vòng đời ứng dụng. Phải thread-safe.
builder.Services.AddScoped<IOrderService, OrderService>(); builder.Services.AddSingleton<IClock, SystemClock>();Hay sai: inject service scoped (như
DbContext) vào singleton, gọi là captive dependency: DbContext bị giữ mãi và dùng chung giữa nhiều thread. Môi trường Development sẽ báo lỗi khi validate scope. Nếu singleton cần dữ liệu scoped, hãy injectIServiceScopeFactoryvà tự tạo scope.08Middleware trong ASP.NET Core là gì? Thứ tự đăng ký có quan trọng không?C# & .NET
Gợi ý trả lời
Ôn thêm câu hỏi C# & .NET →Middleware là các bước nối thành pipeline xử lý request: mỗi bước có thể xử lý, gọi bước kế tiếp, rồi xử lý tiếp response trên đường về. Thứ tự rất quan trọng vì request đi qua đúng theo thứ tự đăng ký.
app.UseExceptionHandler("/error"); app.UseHttpsRedirection(); app.UseRouting(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers();- Exception handler phải đứng đầu để bắt lỗi của mọi bước sau.
UseAuthenticationphải trướcUseAuthorization, nếu không user luôn là ẩn danh.- Middleware có thể "short-circuit", vd. trả cache hoặc 401 mà không gọi
next.
Người phỏng vấn muốn nghe: bạn từng viết middleware riêng, vd. gắn correlation id hoặc log thời gian xử lý, và phân biệt được middleware với filter của MVC.
09Where do you see yourself in three to five years?Phỏng vấn tiếng Anh
Gợi ý trả lời
Ôn thêm câu hỏi Phỏng vấn tiếng Anh →"In three to five years, I see myself as a senior engineer who can design and own a major part of the system. I'd also like to mentor junior developers, because I enjoyed doing that in my current team. To get there, I'm studying system design and taking on more responsibility in technical discussions. I hope to grow in that direction with a company like yours."
Mẹo: dùng "I see myself…", "I'd like to…", "I hope to…". Mục tiêu nên thực tế và liên quan tới công việc đang ứng tuyển. Người Việt hay nói "I want to become a leader" quá chung chung; nên nói rõ leader làm việc gì.
10Vì sao bạn chọn ứng tuyển vào công ty chúng tôi?Câu hỏi hành vi & văn hoá
Gợi ý trả lời
Ôn thêm câu hỏi Câu hỏi hành vi & văn hoá →Câu này kiểm tra bạn có tìm hiểu không hay chỉ rải CV. Nối ba thứ: công ty, vị trí, và bạn.
- Tìm hiểu trước: sản phẩm, khách hàng, công nghệ, tin tức gần đây, đánh giá của nhân viên cũ và hiện tại.
- Chọn một hai điểm cụ thể bạn thật sự quan tâm: sản phẩm bạn từng dùng, bài toán kỹ thuật, quy mô người dùng, văn hoá làm việc.
- Nối với kinh nghiệm hoặc mục tiêu của bạn.
Câu mẫu: "Em có dùng ứng dụng của bên mình và thấy phần thanh toán rất mượt. Trong JD có nói team đang mở rộng hệ thống xử lý giao dịch, đúng mảng em đã làm hai năm. Em nghĩ mình đóng góp được ngay và cũng học được nhiều ở quy mô lớn hơn."
Hay sai: "Vì công ty lớn, lương tốt" hoặc khen chung chung áp vào công ty nào cũng được.
Bạn đã phỏng vấn ở Topicus Vietnam?
Kể lại các vòng và câu hỏi đã gặp (ẩn danh) để người sau ôn đúng trọng tâm.
Chia sẻ kinh nghiệm phỏng vấn