Việc làm

3 ngày trước · Hồ Chí Minh · Tại văn phòng

Senior C++ Developer (C++11, Algorithms, Linux)

ITviec Recruitment Consulting · Fullstack 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/C++ & Embedded, Python, Network & System Admin). 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. 01RAII là gì? So sánh unique_ptr, shared_ptr và weak_ptr.C/C++ & Embedded

    Gợi ý trả lời

    RAII (Resource Acquisition Is Initialization): gắn tài nguyên vào vòng đời một object; constructor lấy tài nguyên, destructor tự giải phóng. Nhờ vậy không rò rỉ kể cả khi có exception hoặc return sớm.

    • unique_ptr: sở hữu duy nhất, chỉ move được, không tốn thêm chi phí so với con trỏ thường. Nên là lựa chọn mặc định.
    • shared_ptr: sở hữu chung bằng bộ đếm tham chiếu (cập nhật atomic), giải phóng khi bộ đếm về 0.
    • weak_ptr: quan sát một shared_ptr mà không tăng bộ đếm, dùng phá vòng tham chiếu (vd. con trỏ ngược từ con về cha).
    auto dev = std::make_unique<Device>("/dev/i2c-1");
    

    Hay sai: dùng shared_ptr khắp nơi "cho an toàn", làm mờ quyền sở hữu và tốn chi phí atomic.

    Ôn thêm câu hỏi C/C++ & Embedded →
  2. 02Move semantics và rvalue reference giải quyết vấn đề gì? Rule of 3/5/0 là gì?C/C++ & Embedded

    Gợi ý trả lời

    Move semantics cho phép chuyển tài nguyên (buffer, handle) từ một object tạm hoặc sắp bị bỏ đi sang object khác thay vì sao chép sâu. Rvalue reference T&& nhận các object như vậy; std::move chỉ là phép ép kiểu để cho phép move.

    std::vector<int> a(1'000'000);
    std::vector<int> b = std::move(a);  // chuyển con trỏ, không chép 1 triệu phần tử
    
    • Rule of 3: nếu tự viết destructor, copy constructor hoặc copy assignment thì gần như phải viết đủ cả ba.
    • Rule of 5: thêm move constructor và move assignment.
    • Rule of 0: tốt nhất là không tự viết hàm nào, để các thành viên RAII (vector, unique_ptr) lo.

    Hay sai: dùng lại object sau khi đã move. Object vẫn hợp lệ nhưng ở trạng thái không xác định.

    Ôn thêm câu hỏi C/C++ & Embedded →
  3. 03Viết hàm phục vụ ngắt (ISR) cần lưu ý những gì?C/C++ & Embedded

    Gợi ý trả lời

    ISR phải ngắn và nhanh: ghi nhận sự kiện, lấy dữ liệu tối thiểu, rồi để phần xử lý nặng cho task hoặc vòng lặp chính.

    • Không gọi hàm có thể block (delay, chờ mutex), không printf, tránh cấp phát động.
    • Biến dùng chung với code chính khai báo volatile và truy cập atomic, hoặc tắt ngắt ngắn khi đọc dữ liệu nhiều byte.
    • Xoá cờ ngắt đúng cách để không bị gọi lại liên tục.
    • Với RTOS, chỉ dùng API dành cho ngắt (vd. hàm có hậu tố FromISR trong FreeRTOS) để báo task qua semaphore, queue hoặc task notification.
    • Dùng ring buffer cho dữ liệu đến liên tục như UART.

    Người phỏng vấn muốn nghe: bạn biết về độ ưu tiên ngắt, ngắt lồng nhau, và cách đo thời gian chạy ISR bằng cách bật tắt một chân GPIO rồi xem trên oscilloscope.

    Ôn thêm câu hỏi C/C++ & Embedded →
  4. 04GIL là gì? Vậy khi nào dùng threading, multiprocessing hay asyncio?Python

    Gợi ý trả lời

    GIL (Global Interpreter Lock) trong CPython chỉ cho một thread chạy bytecode Python tại một thời điểm. Vì vậy threading không tăng tốc tác vụ nặng CPU, nhưng vẫn hữu ích cho I/O vì GIL được nhả ra khi chờ mạng, đĩa.

    • I/O, số lượng vừa phải, thư viện blocking: threading hoặc ThreadPoolExecutor.
    • I/O rất nhiều kết nối đồng thời: asyncio với thư viện async (httpx, asyncpg).
    • Nặng CPU: multiprocessing hoặc ProcessPoolExecutor, hoặc dùng thư viện viết bằng C như NumPy (nhả GIL khi tính toán).

    Từ Python 3.13 có bản build free-threaded (không GIL) tuỳ chọn, nhưng chưa phải mặc định và còn phụ thuộc thư viện hỗ trợ.

    Người phỏng vấn muốn nghe: bạn phân biệt được bài toán I/O-bound và CPU-bound trước khi chọn công cụ.

    Ôn thêm câu hỏi Python →
  5. 05Trong Django ORM, lỗi N+1 query là gì? Phân biệt select_related và prefetch_related.Python

    Gợi ý trả lời

    N+1 là khi lấy danh sách bằng 1 query, rồi mỗi phần tử truy cập quan hệ lại sinh thêm 1 query. Ví dụ duyệt 50 bài viết và in post.author.name sẽ thành 51 query.

    • select_related: dùng SQL JOIN, cho quan hệ trỏ tới một object (ForeignKey, OneToOne).
    • prefetch_related: chạy query riêng rồi ghép trong Python, cho quan hệ nhiều (ManyToMany, reverse ForeignKey).
    posts = (Post.objects
             .select_related("author")
             .prefetch_related("tags"))
    

    Phát hiện bằng Django Debug Toolbar, hoặc assertNumQueries trong test.

    Hay sai: gọi .filter() trên quan hệ đã prefetch bên trong vòng lặp. Lệnh đó tạo query mới và bỏ qua dữ liệu prefetch; dùng Prefetch(..., queryset=...) để lọc ngay từ đầu.

    Ôn thêm câu hỏi Python →
  6. 06DNS hoạt động thế nào? Kể các loại record hay dùng và lỗi DNS thường gặp.Network & System Admin

    Gợi ý trả lời

    Máy hỏi resolver; resolver hỏi lần lượt root, máy chủ TLD (.com, .vn), rồi máy chủ authoritative của tên miền, sau đó cache kết quả theo TTL.

    Record hay dùng:

    • A/AAAA: tên sang IPv4/IPv6.
    • CNAME: bí danh trỏ sang tên khác.
    • MX: máy chủ nhận mail; TXT: SPF, DKIM, xác minh tên miền.
    • PTR: tra ngược IP sang tên.

    Lỗi hay gặp:

    • Đổi record nhưng cache cũ còn hiệu lực do TTL dài; nên hạ TTL trước khi chuyển đổi.
    • Đặt CNAME ở tên miền gốc (apex), không hợp lệ theo chuẩn.

    Kiểm tra bằng dig hoặc nslookup.

    Ôn thêm câu hỏi Network & System Admin →
  7. 07RTOS khác vòng lặp super-loop thế nào? Mutex khác semaphore ra sao?C/C++ & Embedded

    Gợi ý trả lời

    Super-loop chạy tuần tự các việc trong một vòng while(1), đơn giản nhưng một việc chậm sẽ làm trễ mọi việc khác. RTOS có scheduler preemptive theo độ ưu tiên, giúp các việc cần thời gian thực được đáp ứng đúng hạn.

    • Mutex: khoá loại trừ cho tài nguyên dùng chung, có khái niệm sở hữu (ai khoá thì người đó mở) và thường có priority inheritance để giảm đảo ưu tiên.
    • Binary semaphore: dùng để báo hiệu giữa ISR và task hoặc giữa các task, không có sở hữu.
    • Counting semaphore: quản lý N tài nguyên giống nhau.

    Hay sai: dùng semaphore thay mutex để bảo vệ tài nguyên, gặp priority inversion: task ưu tiên cao chờ task thấp đang giữ khoá, trong khi task trung bình chiếm CPU.

    Người phỏng vấn muốn nghe: bạn biết đặt độ ưu tiên task và kích thước stack hợp lý, và từng phát hiện stack overflow.

    Ôn thêm câu hỏi C/C++ & Embedded →
  8. 08Undefined behavior trong C/C++ là gì? Cho ví dụ và cách phát hiện.C/C++ & Embedded · Senior

    Gợi ý trả lời

    Undefined behavior (UB) là những thao tác mà chuẩn ngôn ngữ không quy định kết quả. Compiler được phép giả định UB không bao giờ xảy ra và tối ưu theo giả định đó, nên lỗi có thể chỉ lộ ra ở bản build -O2 hoặc trên một compiler khác.

    Ví dụ hay gặp:

    • Tràn số nguyên có dấu (tràn số không dấu thì được định nghĩa là quay vòng).
    • Truy cập mảng ngoài phạm vi, dereference con trỏ null hoặc dangling.
    • Đọc biến chưa khởi tạo, data race giữa các thread.
    • Vi phạm strict aliasing, vd. ép float* sang int* rồi đọc (nên dùng memcpy hoặc std::bit_cast từ C++20).

    Phát hiện: bật cảnh báo -Wall -Wextra, chạy test với -fsanitize=address,undefined, dùng static analysis (clang-tidy, cppcheck, MISRA checker).

    Người phỏng vấn muốn nghe: "chạy đúng trên máy tôi" không chứng minh code không có UB.

    Ôn thêm câu hỏi C/C++ & Embedded →
  9. 09Do you have any questions for us?Phỏng vấn tiếng Anh

    Gợi ý trả lời

    "Yes, I have a couple of questions. First, could you tell me what a typical week looks like for this role? And second, what are the biggest challenges the team is facing right now? I'd also like to know how you measure success for someone in this position during the first three months."

    Mẹo: chuẩn bị sẵn 2–3 câu, dùng mẫu lịch sự "Could you tell me…?", "I'd like to know…". Đừng trả lời "No, I don't". Câu hỏi về chế độ, phúc lợi nên để dành cho buổi nói chuyện với HR.

    Ô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 ở ITviec Recruitment Consulting?

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