Việc làm

11 giờ trước · Hồ Chí Minh · Tại văn phòng

Middle Unity Developer (C#, .NET, WebGL)

MiTek Vietnam · Desktop Application 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, JavaScript & TypeScript, SQL & Database). 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. 01Xử 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 →
  2. 02Bạ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 →
  3. 03Bạ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

    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.

    Ôn thêm câu hỏi C# & .NET →
  4. 04Core Web Vitals gồm những chỉ số nào? Bạn cải thiện hiệu năng tải trang ra sao?JavaScript & TypeScript · Senior

    Gợi ý trả lời

    Ba chỉ số chính đo trải nghiệm thật của người dùng:

    • LCP (Largest Contentful Paint): thời gian hiện phần tử lớn nhất. Cải thiện: tối ưu ảnh (định dạng hiện đại, đúng kích thước, ưu tiên tải ảnh hero), giảm thời gian phản hồi server, cache/CDN, render phía server.
    • INP (Interaction to Next Paint, thay FID từ 2024): độ trễ khi tương tác. Cải thiện: chia nhỏ tác vụ JS dài, giảm JS chạy trên main thread, tránh render lại quá nhiều.
    • CLS (Cumulative Layout Shift): độ xô lệch bố cục. Cải thiện: khai báo kích thước cho ảnh, video, quảng cáo; tránh chèn nội dung đẩy trang xuống; xử lý font.

    Ngoài ra: code splitting và lazy load theo route, bỏ thư viện nặng không cần, nén và cache tài nguyên tĩnh.

    Người phỏng vấn muốn nghe: bạn đo bằng dữ liệu người dùng thật (field data) lẫn Lighthouse, và biết điểm Lighthouse không phải là mục tiêu cuối.

    Ôn thêm câu hỏi JavaScript & TypeScript →
  5. 05Frontend cần chú ý gì về bảo mật: XSS, CSRF, CORS? Nên lưu access token ở đâu?JavaScript & TypeScript · Senior

    Gợi ý trả lời

    • XSS: kẻ tấn công chèn script chạy trên trang của bạn. Phòng: framework tự escape khi render; tránh innerHTML, v-html, dangerouslySetInnerHTML với dữ liệu người dùng (nếu bắt buộc thì sanitize); cấu hình Content-Security-Policy.
    • CSRF: trang lạ khiến trình duyệt gửi request kèm cookie của người dùng. Phòng: cookie SameSite=Lax hoặc Strict, CSRF token, kiểm tra Origin.
    • CORS: là cơ chế trình duyệt nới lỏng same-origin policy, do server cấu hình. Nó không phải lớp bảo vệ API khỏi người gọi ngoài trình duyệt.

    Lưu token:

    • localStorage tiện nhưng script XSS nào cũng đọc được.
    • Cookie HttpOnly + Secure + SameSite thì JS không đọc được, nhưng phải tính đến CSRF.

    Người phỏng vấn muốn nghe: không có chỗ lưu nào an toàn tuyệt đối; chặn XSS mới là việc quan trọng nhất, vì có XSS thì mọi cách lưu đều bị lợi dụng.

    Ôn thêm câu hỏi JavaScript & TypeScript →
  6. 06Làm sao migrate schema (thêm cột, đổi kiểu, thêm index) trên bảng lớn mà không downtime?SQL & Database · Senior

    Gợi ý trả lời

    Chia thay đổi thành nhiều bước tương thích ngược để phiên bản code cũ và mới chạy song song được (expand rồi contract).

    1. Expand: thêm cột mới cho phép NULL hoặc có default; tránh câu lệnh viết lại cả bảng.
    2. Code mới ghi vào cả cột cũ và mới.
    3. Backfill dữ liệu cũ theo từng lô nhỏ, có nghỉ giữa các lô để không gây lag replica.
    4. Chuyển code sang đọc cột mới, kiểm tra kỹ.
    5. Contract: bỏ cột cũ ở một lần deploy sau.

    Index trên bảng lớn: PostgreSQL dùng CREATE INDEX CONCURRENTLY; MySQL dùng online DDL hoặc công cụ như gh-ost, pt-online-schema-change.

    Người phỏng vấn muốn nghe: bạn biết DDL có thể giữ lock khiến mọi query xếp hàng, nên đặt lock_timeout và luôn có kế hoạch rollback.

    Ôn thêm câu hỏi SQL & Database →
  7. 07Phâ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

    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 đó.
    • struct khô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áo readonly struct.
    • Ép value type sang object hoặ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à 1
    

    Hay 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ớ.

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

    async/await giúp viết code bất đồng bộ như tuần tự: khi gặp await mộ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 .Result hoặ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 void ngoài event handler, exception sẽ không bắt được. Hãy trả về Task và "async all the way".

    Ôn thêm câu hỏi C# & .NET →
  9. 09Interface 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

    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. BaseHandler xử 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.

    Ôn thêm câu hỏi C# & .NET →
  10. 10Bạn thấy mình ở đâu sau 2–3 năm nữa?Câu hỏi hành vi & văn hoá

    Gợi ý trả lời

    Người phỏng vấn muốn biết mục tiêu của bạn có khớp với hướng phát triển ở công ty và bạn có định gắn bó không.

    • Nêu hướng phát triển cụ thể, thực tế: đi sâu chuyên môn (senior, chuyên gia một mảng) hay quản lý (lead, PM).
    • Kèm kế hoạch: kỹ năng cần học, trách nhiệm muốn nhận thêm.
    • Gắn với cơ hội ở vị trí đang ứng tuyển.

    Câu mẫu: "Trong 2–3 năm tới em muốn trở thành senior có thể tự thiết kế và chịu trách nhiệm một module lớn, đồng thời hướng dẫn được các bạn mới. Em đang học thêm về thiết kế hệ thống và thấy team bên mình có nhiều bài toán ở quy mô lớn, rất hợp để em phát triển theo hướng đó."

    Hay sai: "Em muốn mở công ty riêng" hoặc "em chưa nghĩ tới". Cũng đừng nói muốn ngồi vào chỗ của người đang phỏng vấn.

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

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