Việc làm

10/09 · Đà Nẵng · Tại văn phòng

Mobile Engineer (React Native)

Glory Software Vietnam · Mobile 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 (Mobile (Android, iOS, Flutter), Node.js, ReactJS). 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. 01Chọn native (Kotlin/Swift) hay cross-platform (Flutter, React Native) cho một dự án mới? Bạn cân nhắc gì?Mobile (Android, iOS, Flutter) · Senior

    Gợi ý trả lời

    Không có đáp án chung; quyết định dựa trên yêu cầu sản phẩm, đội ngũ và chi phí dài hạn.

    • Cross-platform (Flutter, React Native, hoặc Kotlin Multiplatform để chia sẻ logic): một codebase cho hai nền tảng, ra mắt nhanh, hợp với app nghiệp vụ, thương mại điện tử, nội bộ.
    • Native: cần tích hợp sâu với hệ điều hành (widget, camera hoặc Bluetooth phức tạp, xử lý nền), hiệu năng đồ hoạ cao, hoặc muốn dùng tính năng mới của OS ngay khi ra mắt.

    Các yếu tố cần cân nhắc:

    • Kỹ năng hiện có của team và khả năng tuyển người.
    • Mức độ tuỳ biến UI theo từng nền tảng.
    • Chi phí viết plugin native khi thư viện không có sẵn.
    • Kích thước app và thời gian khởi động.

    Người phỏng vấn muốn nghe: bạn đưa ra lập luận gắn với bối cảnh cụ thể và nhắc tới phương án lai, vd. thêm màn hình Flutter vào app native.

    Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →
  2. 02Trình bày vòng đời (lifecycle) của Activity trên Android hoặc của app/view trên iOS.Mobile (Android, iOS, Flutter) · Junior

    Gợi ý trả lời

    Vòng đời cho biết khi nào hệ điều hành tạo, hiển thị, tạm dừng và huỷ màn hình, để bạn khởi tạo và giải phóng tài nguyên đúng lúc.

    • Android Activity: onCreate → onStart → onResume (đang tương tác) → onPause → onStop → onDestroy. Xoay màn hình mặc định sẽ huỷ và tạo lại Activity.
    • iOS UIKit: viewDidLoad (một lần) → viewWillAppear → viewDidAppear → viewWillDisappear → viewDidDisappear. Trạng thái app: active, inactive, background.
    • SwiftUI / Compose: nghĩ theo state và các hook như .task, onAppear, LaunchedEffect, DisposableEffect.

    Hay sai: đăng ký listener hoặc sensor trong onResume mà quên huỷ ở onPause, gây rò rỉ và hao pin. Trên Android nên thu thập Flow bằng repeatOnLifecycle.

    Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →
  3. 03Làm sao giữ dữ liệu khi xoay màn hình hoặc khi app bị hệ điều hành kill ở background?Mobile (Android, iOS, Flutter) · Junior

    Gợi ý trả lời

    Có hai tình huống khác nhau: thay đổi cấu hình (xoay màn hình, đổi ngôn ngữ) và process death (hệ điều hành kill app để lấy RAM).

    Android:

    • ViewModel sống qua thay đổi cấu hình nhưng không sống qua process death.
    • SavedStateHandle (trong ViewModel) hoặc rememberSaveable (Compose) lưu trạng thái nhỏ như id, nội dung form, vị trí cuộn.
    • Dữ liệu lớn hoặc quan trọng lưu bền vững bằng Room hoặc DataStore.

    iOS: SwiftUI có @SceneStorage cho trạng thái UI nhỏ; UIKit có state restoration; dữ liệu thật lưu bằng SwiftData, Core Data hoặc file.

    Người phỏng vấn muốn nghe: bạn biết cách kiểm thử process death, vd. bật "Don't keep activities" hoặc dùng adb shell am kill khi app ở background.

    Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →
  4. 04Node.js chạy đơn luồng thì làm sao xử lý được nhiều request cùng lúc? Node hợp với loại ứng dụng nào?Node.js · Junior

    Gợi ý trả lời

    Code JavaScript của bạn chạy trên một thread, nhưng I/O (mạng, file, DB) là non-blocking: Node giao việc cho hệ điều hành hoặc thread pool của libuv, rồi tiếp tục xử lý request khác. Khi I/O xong, callback được đưa lại vào event loop.

    • Hợp với: API, BFF, real-time (WebSocket, chat), proxy, ứng dụng nhiều I/O và ít tính toán.
    • Không hợp nếu chỉ dùng thread chính cho tác vụ nặng CPU: mã hoá video, xử lý ảnh lớn, tính toán dài.
    // Chặn cả server: mọi request khác phải chờ
    app.get("/hash", (req, res) => {
      res.send(crypto.pbkdf2Sync(pw, salt, 1e6, 64, "sha512"));
    });
    

    Người phỏng vấn muốn nghe: "đơn luồng" chỉ đúng với phần code JS; Node vẫn dùng thread pool cho file system, DNS, một số hàm crypto và zlib.

    Ôn thêm câu hỏi Node.js →
  5. 05CommonJS và ES Modules khác nhau thế nào? Dự án mới nên dùng loại nào?Node.js · Junior

    Gợi ý trả lời

    CommonJS dùng require/module.exports, nạp đồng bộ lúc chạy. ES Modules dùng import/export, là chuẩn của ngôn ngữ, được phân tích tĩnh nên hỗ trợ tree-shaking và top-level await.

    • Bật ESM bằng "type": "module" trong package.json hoặc đuôi .mjs.
    • Trong ESM không có sẵn __dirname; dùng import.meta.dirname (Node mới) hoặc tính từ import.meta.url.
    • ESM import được CommonJS. Chiều ngược lại trước đây phải dùng import() động; các bản Node gần đây đã cho require() module ESM đồng bộ (trừ module có top-level await).

    Dự án mới nên dùng ESM, vì cả hệ sinh thái đang chuyển dần sang đó.

    Hay sai: khi viết ESM thuần, quên ghi đuôi file trong đường dẫn import tương đối (./utils.js), dẫn đến lỗi không tìm thấy module.

    Ôn thêm câu hỏi Node.js →
  6. 06Props và state khác nhau thế nào? Vì sao không được sửa trực tiếp state?ReactJS · Junior

    Gợi ý trả lời

    Props là dữ liệu cha truyền xuống, component con chỉ đọc. State là dữ liệu component tự quản lý; đổi state sẽ khiến component render lại.

    • React so sánh state cũ và mới bằng tham chiếu (Object.is). Sửa trực tiếp state.items.push(x) thì tham chiếu không đổi, React có thể không render lại, và các tối ưu như memo cũng hỏng.
    • Luôn tạo object hoặc array mới:
    setItems(prev => [...prev, newItem]);
    setUser(prev => ({ ...prev, name: "An" }));
    
    • setState không cập nhật biến ngay trong lần render hiện tại. React gom nhiều lần set lại (batching) rồi mới render.

    Hay sai: gọi setCount(count + 1) ba lần liên tiếp và mong tăng 3. Kết quả chỉ tăng 1; muốn tăng 3 phải dùng dạng hàm setCount(c => c + 1).

    Ôn thêm câu hỏi ReactJS →
  7. 07Trong Flutter, StatelessWidget và StatefulWidget khác nhau thế nào? setState hoạt động ra sao?Mobile (Android, iOS, Flutter) · Junior

    Gợi ý trả lời

    StatelessWidget chỉ phụ thuộc tham số đầu vào; StatefulWidget có một object State riêng, tồn tại qua các lần build, để giữ dữ liệu thay đổi theo thời gian.

    • setState đánh dấu widget "dirty"; ở frame kế tiếp Flutter gọi lại build cho widget đó và cây con.
    • Widget là cấu hình nhẹ, tạo lại liên tục; Element và RenderObject mới là phần được tái sử dụng.
    • Dọn dẹp controller, stream subscription trong dispose.
    void _increment() => setState(() => _count++);
    

    Hay sai: gọi setState sau khi widget đã bị huỷ (sau một await); hãy kiểm tra mounted. Đặt setState ở widget quá cao làm build lại cả màn hình, nên tách nhỏ widget và dùng const constructor.

    Khi state dùng chung nhiều màn hình, chuyển sang Provider, Riverpod hoặc Bloc.

    Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →
  8. 08Vì sao không được làm việc nặng trên main thread (UI thread)? Bạn xử lý thế nào?Mobile (Android, iOS, Flutter) · Junior

    Gợi ý trả lời

    Main thread vẽ UI và nhận thao tác người dùng. Mỗi frame chỉ có khoảng 16 ms (60 Hz) hoặc ít hơn với màn 120 Hz, nên việc nặng sẽ gây giật, lag; Android chặn quá lâu sẽ báo ANR.

    Cách xử lý theo nền tảng:

    • Android: coroutines với Dispatchers.IO cho I/O, Dispatchers.Default cho tính toán, sau đó cập nhật state trên Main.
    • iOS: async/await với Swift concurrency; code UI đánh dấu @MainActor.
    • Flutter: Dart chạy một isolate; I/O bất đồng bộ không chặn, nhưng tính toán nặng (parse JSON lớn, xử lý ảnh) nên đẩy sang isolate khác bằng Isolate.run hoặc compute.

    Hay sai: nghĩ async là đủ. Hàm async trong Dart vẫn chạy trên cùng isolate, nên vòng lặp tính toán nặng vẫn làm đơ UI.

    Ôn thêm câu hỏi Mobile (Android, iOS, Flutter) →
  9. 09When would you be available to start? Do you have a notice period?Phỏng vấn tiếng Anh

    Gợi ý trả lời

    "My current contract requires a 30-day notice period, so I could start about a month after accepting an offer. I'd like to make sure I hand over my work properly to my team. If you need someone sooner, I can discuss with my manager whether an earlier date is possible, but I can't promise that yet."

    Mẹo: nói đúng thời gian báo trước theo hợp đồng của bạn, đừng hứa đi làm ngay để lấy điểm. Dùng "notice period", "hand over", "start date". Tránh nói "I can go to work immediately" khi bạn vẫn còn hợp đồng.

    Ôn thêm câu hỏi Phỏng vấn tiếng Anh →
  10. 10Mức lương mong muốn của bạn là bao nhiêu?Câu hỏi hành vi & văn hoá

    Gợi ý trả lời

    Tìm hiểu trước mặt bằng lương cho vị trí và số năm kinh nghiệm (dữ liệu lương trên Drama Công Ty, bạn bè cùng ngành), rồi đưa ra một khoảng có căn cứ.

    • Nói rõ gross hay net. Gross là lương trước khi trừ bảo hiểm bắt buộc và thuế thu nhập cá nhân; net là số thực nhận.
    • Hỏi tổng thu nhập: lương tháng 13 (không bắt buộc theo luật), thưởng, chu kỳ review lương, bảo hiểm sức khoẻ.
    • Lương thử việc theo luật tối thiểu bằng 85% lương chính thức; nhiều công ty trả 100%, cứ hỏi rõ.

    Câu mẫu: "Dựa trên kinh nghiệm và mặt bằng thị trường, em mong muốn khoảng X đến Y triệu gross. Em cũng muốn hiểu thêm về thưởng và review lương bên mình."

    Hay sai: nói "tuỳ công ty" (dễ bị trả thấp), hoặc khai khống lương hiện tại.

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

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