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, Mobile (Android, iOS, Flutter), 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.
01Bạn thiết kế firmware thế nào để dễ test, dễ port sang vi điều khiển khác và áp dụng SOLID?C/C++ & Embedded · Senior
Gợi ý trả lời
Ôn thêm câu hỏi C/C++ & Embedded →Tách phần phụ thuộc phần cứng ra sau một lớp trừu tượng, để logic nghiệp vụ chạy và test được trên máy tính.
- Phân lớp: driver thanh ghi / HAL → BSP → service (giao thức, lưu trữ) → application.
- Dependency inversion: application phụ thuộc interface (
structchứa con trỏ hàm trong C, abstract class hoặc template trong C++), không gọi thẳng thanh ghi. - Single responsibility: mỗi module một việc, như đọc cảm biến, lọc tín hiệu, gửi dữ liệu.
- Unit test trên host với Unity, CppUTest hoặc GoogleTest bằng driver giả; test trên phần cứng (HIL) cho phần còn lại.
- Máy trạng thái (state machine) rõ ràng cho logic phức tạp.
- CI build nhiều target, chạy static analysis và kiểm tra theo chuẩn code (vd. MISRA).
Người phỏng vấn muốn nghe: bạn cân đối được giữa trừu tượng hoá và giới hạn RAM, flash, thời gian thực.
02RAII là gì? So sánh unique_ptr, shared_ptr và weak_ptr.C/C++ & Embedded
Gợi ý trả lời
Ôn thêm câu hỏi C/C++ & Embedded →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ộtshared_ptrmà 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_ptrkhắp nơi "cho an toàn", làm mờ quyền sở hữu và tốn chi phí atomic.03Move 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
Ôn thêm câu hỏi C/C++ & Embedded →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::movechỉ 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.
04Kotlin coroutines: suspend function, scope, dispatcher và structured concurrency là gì?Mobile (Android, iOS, Flutter)
Gợi ý trả lời
Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →Coroutine là tác vụ nhẹ có thể tạm dừng (suspend) mà không chặn thread.
suspend funchỉ gọi được từ coroutine hoặc từ suspend function khác.- Scope quyết định vòng đời:
viewModelScope,lifecycleScopetự huỷ coroutine khi ViewModel hoặc màn hình bị huỷ. - Dispatcher quyết định chạy ở đâu:
Main,IO,Default. - Structured concurrency: coroutine con gắn với cha; cha huỷ thì con huỷ, con lỗi thì lan lên cha (trừ khi dùng
SupervisorJob).
viewModelScope.launch { val user = withContext(Dispatchers.IO) { repo.fetchUser() } _state.value = UiState.Success(user) }Hay sai: dùng
GlobalScopegây rò rỉ; bắtCancellationExceptiontrongcatch (e: Exception)mà không ném lại, làm hỏng cơ chế huỷ.- Scope quyết định vòng đời:
05Swift concurrency: async/await, Task, actor và @MainActor hoạt động thế nào?Mobile (Android, iOS, Flutter)
Gợi ý trả lời
Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →Swift concurrency đưa bất đồng bộ vào ngôn ngữ, cùng với kiểm tra data race lúc biên dịch (chặt hơn từ Swift 6).
async/await: viết code bất đồng bộ tuần tự, thay cho completion handler lồng nhau.Task { }tạo tác vụ mới;async letvàTaskGroupchạy song song có cấu trúc. Task hỗ trợ huỷ hợp tác quaTask.checkCancellation().actor: kiểu tham chiếu mà trạng thái bên trong chỉ được truy cập tuần tự, tránh data race. Gọi từ ngoài phảiawait.@MainActor: đảm bảo code chạy trên main thread, dùng cho ViewModel và UI.Sendable: đánh dấu kiểu an toàn khi chuyển giữa các vùng concurrency.
@MainActor final class ProfileViewModel: ObservableObject { @Published var user: User? func load() async { user = try? await api.fetchUser() } }Hay sai: actor reentrancy: sau mỗi
await, trạng thái của actor có thể đã bị thay đổi.06Server Linux chạy chậm. Bạn dùng những lệnh nào để tìm nguyên nhân?Network & System Admin
Gợi ý trả lời
Ôn thêm câu hỏi Network & System Admin →Xác định tài nguyên nào đang nghẽn: CPU, RAM, ổ đĩa hay mạng.
uptime; top # load average, process ngốn CPU/RAM free -h # còn RAM không, có dùng swap nhiều? df -h; df -i # đầy dung lượng hoặc hết inode iostat -x 1 # ổ đĩa có quá tải (%util, await)? ss -tunap # kết nối mạng journalctl -p err -b # lỗi từ lần boot này- Load cao nhưng CPU rảnh: thường là chờ I/O (
wacao trongtop). dmesgcó OOM killer: thiếu RAM.
Hay sai: xoá file log đang được process mở; dung lượng không giải phóng cho tới khi restart process (xem
lsof +L1).- Load cao nhưng CPU rảnh: thường là chờ I/O (
07Viết hàm phục vụ ngắt (ISR) cần lưu ý những gì?C/C++ & Embedded
Gợi ý trả lời
Ôn thêm câu hỏi C/C++ & Embedded →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
volatilevà 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ố
FromISRtrong 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.
- Không gọi hàm có thể block (delay, chờ mutex), không
08RTOS 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
Ôn thêm câu hỏi C/C++ & Embedded →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.
09Tell me about a difficult problem you solved.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 →"Our report page became very slow as the data grew, sometimes taking more than a minute. I checked the query plans and found that a few queries were scanning entire tables. I added the right indexes, rewrote one query to avoid unnecessary joins, and cached the daily summary. The page then loaded in a few seconds, and the support team stopped receiving complaints about it."
Mẹo: dùng STAR và thì quá khứ đơn cho cả câu chuyện ("I found", "I added", không phải "I find", "I add"). Đây là lỗi rất hay gặp khi nói nhanh. Kết bằng kết quả cụ thể, đo được nếu có.
10Điểm mạnh lớn nhất của bạn là gì?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á →Chọn một hai điểm mạnh liên quan tới vị trí, và chứng minh bằng ví dụ thật, không liệt kê tính từ.
Cấu trúc: điểm mạnh, ví dụ ngắn, kết quả, liên hệ với công việc mới.
Câu mẫu: "Điểm mạnh của em là chủ động tìm nguyên nhân gốc. Ở dự án trước, hệ thống thỉnh thoảng bị timeout mà không ai tái hiện được. Em tự đọc log, thêm theo dõi ở các điểm nghi ngờ và tìm ra một truy vấn bị khoá bảng vào giờ cao điểm. Sau khi sửa, lỗi đó không còn xuất hiện. Em nghĩ điều này hữu ích với vị trí bên mình vì hệ thống có lượng truy cập lớn."
Hay sai: "Em chăm chỉ, ham học hỏi, chịu được áp lực" mà không có ví dụ. Ai cũng nói vậy nên không đọng lại gì.
Bạn đã phỏng vấn ở Bosch Global Software Technologies?
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