Việc làm

05/10 · Hồ Chí Minh · Hybrid

3 C# / .NET Sr Developers - up to $3000

RANGSTRUP IT Vietnam · Backend Developer

Xem mô tả & ứng tuyển trên ITviecMô tả công việc, lương và ứng tuyển nằm ở ITviec.

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, SQL & Database, Cloud (AWS, Azure, GCP)). 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.

  1. 01Lỗi N+1 query trong Entity Framework Core là gì và xử lý thế nào?C# & .NET

    Gợi ý trả lời

    N+1 là khi lấy danh sách N bản ghi bằng 1 query, rồi mỗi bản ghi lại phát sinh thêm 1 query để lấy dữ liệu liên quan, thường do lazy loading hoặc truy vấn trong vòng lặp.

    Cách xử lý:

    • Eager loading: .Include(o => o.Items).
    • Tốt hơn nữa là projection chỉ lấy cột cần: .Select(o => new OrderDto(o.Id, o.Items.Count)).
    • Include nhiều collection gây "cartesian explosion" thì dùng .AsSplitQuery().
    • Màn hình chỉ đọc thì thêm .AsNoTracking() để giảm chi phí change tracking.

    Để phát hiện, bật log SQL của EF Core khi phát triển, hoặc dùng công cụ APM xem số query mỗi request.

    Người phỏng vấn muốn nghe: bạn kiểm tra SQL thực sự được sinh ra thay vì tin LINQ trông gọn là chạy nhanh.

    Ôn thêm câu hỏi C# & .NET →
  2. 02Garbage Collector của .NET hoạt động thế nào? Khi nào cần IDisposable?C# & .NET

    Gợi ý trả lời

    GC quản lý heap theo thế hệ: object mới ở Gen 0, sống sót qua lần thu gom thì lên Gen 1, Gen 2. Phần lớn object chết trẻ nên thu gom Gen 0 rất rẻ. Object lớn (khoảng từ 85 KB) vào Large Object Heap và chỉ được thu cùng Gen 2.

    GC chỉ thu hồi bộ nhớ managed. Tài nguyên khác như file, socket, kết nối DB cần giải phóng chủ động qua IDisposable:

    await using var conn = new NpgsqlConnection(cs);
    using var stream = File.OpenRead(path);
    
    • Finalizer chỉ là lưới an toàn, chạy không xác định thời điểm và tốn chi phí.

    Hay sai: tạo mới HttpClient cho mỗi request rồi dispose, dễ cạn socket. Hãy dùng IHttpClientFactory hoặc một instance dùng chung.

    Ôn thêm câu hỏi C# & .NET →
  3. 03Ứng dụng ASP.NET Core bị memory leak hoặc CPU cao trên production. Bạn điều tra thế nào?C# & .NET · Senior

    Gợi ý trả lời

    Thu thập số liệu trước, đoán sau: xem metrics, chụp dump hoặc trace, rồi phân tích.

    1. Theo dõi bằng dotnet-counters: heap size, số lần GC từng gen, thread pool queue length, exception rate.
    2. Leak bộ nhớ: chụp hai lần dotnet-gcdump hoặc dotnet-dump cách nhau một khoảng, so sánh loại object tăng và tìm ai đang giữ tham chiếu.
    3. CPU cao hoặc treo: dotnet-trace để xem hot path; thread pool queue tăng thường do sync-over-async.

    Nguyên nhân hay gặp: event handler không gỡ đăng ký, cache static không giới hạn kích thước, giữ DbContext quá lâu, regex hoặc serialize lặp lại trong vòng lặp nóng.

    Người phỏng vấn muốn nghe: một ca thực tế bạn từng xử lý, công cụ đã dùng và kết quả trước/sau.

    Ôn thêm câu hỏi C# & .NET →
  4. 04Chuẩn hoá (normalization) là gì? Khi nào nên denormalize?SQL & Database

    Gợi ý trả lời

    Chuẩn hoá là tách dữ liệu để mỗi thông tin chỉ lưu ở một chỗ, tránh dư thừa và sai lệch khi cập nhật.

    • 1NF: mỗi ô một giá trị nguyên tử, không lưu danh sách trong một cột.
    • 2NF: cột không khoá phụ thuộc vào toàn bộ khoá chính, không chỉ một phần.
    • 3NF: cột không khoá không phụ thuộc bắc cầu qua cột không khoá khác.

    Denormalize khi đọc nhiều hơn ghi rất nhiều và JOIN trở thành điểm nghẽn: lưu sẵn comment_count trong bảng bài viết, chép customer_name vào đơn hàng để giữ đúng tên tại thời điểm đặt, hoặc dựng bảng báo cáo riêng.

    Hay sai: denormalize mà không có cơ chế đồng bộ (trigger, job, event) nên số liệu lệch dần. Hãy nói rõ cái giá phải trả là logic ghi phức tạp hơn.

    Ôn thêm câu hỏi SQL & Database →
  5. 05Deadlock trong database xảy ra thế nào và xử lý ra sao?SQL & Database · Senior

    Gợi ý trả lời

    Deadlock là khi hai transaction giữ khoá mà bên kia cần và chờ nhau mãi. DB tự phát hiện, chọn một transaction làm nạn nhân và rollback nó.

    Ví dụ: T1 khoá dòng A rồi muốn B, cùng lúc T2 khoá B rồi muốn A.

    Cách giảm deadlock:

    • Luôn khoá tài nguyên theo cùng một thứ tự (vd. sắp xếp theo id trước khi update nhiều dòng).
    • Giữ transaction ngắn, không chờ I/O bên ngoài khi đang giữ khoá.
    • Có index phù hợp để câu UPDATE/DELETE không khoá quá nhiều dòng.
    • Ứng dụng bắt lỗi deadlock và retry có giới hạn.

    Khi điều tra: MySQL dùng SHOW ENGINE INNODB STATUS, PostgreSQL xem log (deadlock được ghi kèm câu lệnh) và pg_locks.

    Người phỏng vấn muốn nghe: bạn coi retry là bình thường nhưng vẫn tìm gốc rễ ở thứ tự khoá.

    Ôn thêm câu hỏi SQL & Database →
  6. 06Thiết kế hạ tầng cho một web app cần chịu tải cao và sẵn sàng 99.9% trên cloud.Cloud (AWS, Azure, GCP) · Senior

    Gợi ý trả lời

    Trình bày theo luồng request và nói rõ điểm lỗi đơn được loại bỏ ở đâu.

    • Biên: DNS, CDN cho nội dung tĩnh, WAF.
    • Ứng dụng: load balancer L7 trước nhóm container/VM stateless trải nhiều AZ, auto scaling theo CPU hoặc số request.
    • Dữ liệu: DB quản lý sẵn Multi-AZ, read replica cho đọc nhiều, Redis làm cache và session.
    • Bất đồng bộ: queue cho việc nặng (gửi mail, xử lý ảnh).
    • Vận hành: IaC, backup tự động có thử khôi phục, giám sát và alert theo SLO.

    Người phỏng vấn muốn nghe: đánh đổi chi phí. 99.9% thường đủ với một region nhiều AZ; multi-region đắt và phức tạp hơn nhiều.

    Ôn thêm câu hỏi Cloud (AWS, Azure, GCP) →
  7. 07Xử lý concurrency khi nhiều request cùng cập nhật một bản ghi trong EF Core thế nào?C# & .NET · Senior

    Gợi ý trả lời

    Hai hướng chính: optimistic concurrency (phát hiện xung đột khi lưu) và pessimistic (khoá trước khi sửa).

    Optimistic với EF Core: đánh dấu một cột làm concurrency token, EF thêm điều kiện so sánh vào UPDATE và ném DbUpdateConcurrencyException nếu không có dòng nào bị cập nhật.

    public class Product {
        public int Stock { get; set; }
        [Timestamp] public byte[] RowVersion { get; set; } = [];
    }
    
    • Bắt exception, tải lại dữ liệu, rồi retry hoặc báo người dùng.
    • PostgreSQL thường dùng cột hệ thống xmin làm token.
    • Trường hợp đơn giản như trừ tồn kho có thể dùng một câu ExecuteUpdateAsync atomic kèm điều kiện Stock >= qty.

    Người phỏng vấn muốn nghe: bạn cân nhắc mức độ tranh chấp: thấp thì optimistic, cao và nghiệp vụ quan trọng thì khoá hoặc đưa vào hàng đợi.

    Ôn thêm câu hỏi C# & .NET →
  8. 08Bạ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

    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ùng ExecuteUpdateAsync.
    • Cache: IMemoryCache, distributed cache (Redis), HybridCache từ .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.Json vớ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.

    Ôn thêm câu hỏi C# & .NET →
  9. 09Why are you interested in this role?Phỏng vấn tiếng Anh

    Gợi ý trả lời

    "I've been working on payment systems for three years, and I'm really interested in building products at a larger scale. From the job description, your team is redesigning the transaction platform, which matches my experience and what I want to learn next. I also like that you have a strong engineering culture with code reviews and technical sharing. I believe I can contribute quickly and keep growing here."

    Mẹo: nối ba ý: kinh nghiệm của bạn, điều công ty đang làm, điều bạn muốn học. Dùng chi tiết từ JD để cho thấy bạn đã tìm hiểu. Tránh mở đầu bằng lương hay "because your company is big".

    Ôn thêm câu hỏi Phỏng vấn tiếng Anh →
  10. 10Bạn có câu hỏi gì cho chúng tôi không?Câu hỏi hành vi & văn hoá

    Gợi ý trả lời

    Luôn có câu hỏi. Đây là cơ hội thể hiện sự quan tâm và cũng là lúc bạn đánh giá công ty.

    Câu hỏi nên chuẩn bị (chọn 2–3 câu hợp với người đang phỏng vấn):

    • "Một ngày làm việc của vị trí này thường như thế nào? Team có bao nhiêu người, gồm những vai trò gì?"
    • "Ba tháng đầu, anh/chị kỳ vọng người vào vị trí này làm được gì?"
    • "Team đang gặp thách thức kỹ thuật hoặc quy trình nào lớn nhất?"
    • "Quy trình release và code review của team ra sao?"
    • "Công ty đánh giá hiệu suất và review lương theo chu kỳ nào?"
    • "Vì sao vị trí này đang tuyển: mở rộng team hay thay người?"

    Hay sai: "Dạ không ạ", hoặc chỉ hỏi về nghỉ phép, lương thưởng ngay ở vòng kỹ thuật. Chuyện chế độ nên hỏi kỹ với HR.

    Ôn thêm câu hỏi Câu hỏi hành vi & văn hoá →

Bạn đã phỏng vấn ở RANGSTRUP IT 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