Việc làm

22/09 · Hồ Chí Minh · Tại văn phòng

Full-stack Engineer (Golang/ReactJS)-Competitive Salary

Buymed · 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 (ReactJS, SQL & Database, Golang). 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. 01React render và cập nhật DOM thế nào? Vì sao list cần key và không nên dùng index làm key?ReactJS · Junior

    Gợi ý trả lời

    Mỗi lần state hoặc props đổi, React gọi lại component để tạo cây element mới, so sánh với cây cũ (reconciliation), rồi chỉ cập nhật phần DOM thật sự thay đổi.

    • Với list, key cho React biết phần tử nào là phần tử nào giữa hai lần render. Key phải ổn định và duy nhất trong list, thường là id từ dữ liệu.
    • Dùng index làm key chỉ ổn khi list không bao giờ chèn, xoá hay đổi thứ tự.

    Hay sai: dùng index cho list có thể xoá hoặc sắp xếp. React ghép nhầm state của item cũ sang item mới: ô input giữ nội dung của dòng đã bị xoá, checkbox tick sai dòng.

    Mẹo hay được hỏi thêm: đổi key của một component là cách chủ động reset toàn bộ state của nó.

    Ôn thêm câu hỏi ReactJS →
  2. 02Props 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 →
  3. 03useEffect dùng để làm gì? Dependency array và hàm cleanup hoạt động ra sao?ReactJS · Junior

    Gợi ý trả lời

    useEffect dùng để đồng bộ component với hệ thống bên ngoài: subscribe sự kiện, kết nối WebSocket, gọi thư viện không phải React, gọi API.

    • Không có dependency array: chạy sau mỗi lần render.
    • []: chạy sau lần mount đầu tiên.
    • [a, b]: chạy lại khi a hoặc b đổi.
    • Hàm return là cleanup, chạy trước lần effect kế tiếp và khi unmount.
    useEffect(() => {
      const id = setInterval(tick, 1000);
      return () => clearInterval(id);
    }, []);
    

    Ở development, Strict Mode cố ý chạy effect hai lần để bạn phát hiện thiếu cleanup.

    Hay sai: dùng effect để tính dữ liệu dẫn xuất từ state/props (setFullName(first + last)). Hãy tính thẳng trong lúc render; effect thừa gây render hai lần và dễ lệch dữ liệu.

    Ôn thêm câu hỏi ReactJS →
  4. 04WHERE và HAVING khác nhau thế nào? Thứ tự thực thi logic của một câu SELECT ra sao?SQL & Database · Junior

    Gợi ý trả lời

    WHERE lọc từng dòng trước khi gom nhóm; HAVING lọc sau GROUP BY, nên dùng được hàm tổng hợp như COUNT, SUM.

    Thứ tự logic: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET.

    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    WHERE status = 'active'
    GROUP BY department_id
    HAVING AVG(salary) > 20000000;
    
    • Vì SELECT chạy sau WHERE, bạn không dùng được alias của SELECT trong WHERE (đa số DB).
    • Điều kiện không cần hàm tổng hợp thì nên để ở WHERE để giảm số dòng phải gom nhóm.

    Người phỏng vấn muốn nghe: bạn hiểu thứ tự logic, từ đó giải thích được vì sao alias hoặc aggregate dùng sai chỗ bị lỗi.

    Ôn thêm câu hỏi SQL & Database →
  5. 05Index là gì, hoạt động thế nào? Có nên đánh index cho mọi cột không?SQL & Database · Junior

    Gợi ý trả lời

    Index là cấu trúc dữ liệu phụ (thường là B-Tree) giúp tìm dòng theo giá trị cột mà không phải quét cả bảng, đổi lại tốn dung lượng và làm chậm thao tác ghi.

    • B-Tree hợp với so sánh =, <, >, BETWEEN, ORDER BY, LIKE 'abc%'.
    • Mỗi INSERT/UPDATE/DELETE phải cập nhật thêm mọi index liên quan.
    • Cột có độ chọn lọc thấp (vd. gender, is_deleted) đánh index riêng thường ít tác dụng.

    Không nên đánh index tràn lan: chỉ thêm cho cột hay xuất hiện trong WHERE, JOIN, ORDER BY của các query quan trọng, rồi kiểm tra bằng EXPLAIN.

    Hay sai: bọc cột trong hàm, vd. WHERE YEAR(created_at) = 2026 hoặc LOWER(email) = ..., khiến index thường trên cột đó không được dùng. Hãy viết lại thành khoảng thời gian hoặc dùng index trên biểu thức.

    Ôn thêm câu hỏi SQL & Database →
  6. 06Go xử lý lỗi như thế nào? Khi nào dùng panic? errors.Is và errors.As để làm gì?Golang · Junior

    Gợi ý trả lời

    Lỗi trong Go là giá trị kiểu error, được trả về như kết quả thông thường và phải kiểm tra tường minh. panic chỉ dành cho tình huống không thể tiếp tục hoặc lỗi lập trình (ví dụ cấu hình bắt buộc bị thiếu lúc khởi động), không dùng cho lỗi nghiệp vụ.

    Bọc lỗi để giữ ngữ cảnh mà không mất lỗi gốc:

    if err != nil {
        return fmt.Errorf("load user %d: %w", id, err)
    }
    // Ở tầng trên:
    if errors.Is(err, sql.ErrNoRows) { /* trả 404 */ }
    
    • errors.Is: so với một lỗi cụ thể trong chuỗi bọc.
    • errors.As: lấy ra lỗi thuộc một kiểu cụ thể để đọc field của nó.
    • recover trong defer dùng ở biên (middleware HTTP) để một request panic không làm sập cả server.

    Hay sai: dùng %v thay %w khi bọc, làm errors.Is không tìm thấy lỗi gốc.

    Ôn thêm câu hỏi Golang →
  7. 07Controlled component và uncontrolled component khác nhau thế nào? Khi nào dùng loại nào?ReactJS · Junior

    Gợi ý trả lời

    Controlled: giá trị input nằm trong state React, mọi thay đổi đi qua onChange. Uncontrolled: DOM tự giữ giá trị, bạn đọc khi cần qua ref hoặc khi form submit.

    <input value={name} onChange={e => setName(e.target.value)} />
    <input defaultValue="An" name="name" />
    
    • Controlled hợp khi cần validate ngay khi gõ, định dạng giá trị, hoặc ô này phụ thuộc ô kia.
    • Uncontrolled đơn giản hơn, ít render hơn; hợp với form lớn hoặc khi dùng thư viện như React Hook Form. React 19 còn hỗ trợ truyền hàm vào <form action> và đọc dữ liệu bằng FormData.

    Hay sai: chuyển một input từ value={undefined} sang có giá trị, khiến React cảnh báo đổi từ uncontrolled sang controlled. Khởi tạo state bằng "" thay vì undefined.

    Ôn thêm câu hỏi ReactJS →
  8. 08Khi nào nên dùng useMemo, useCallback và React.memo? Dùng tràn lan có sao không?ReactJS

    Gợi ý trả lời

    Cả ba dùng để tránh tính toán hoặc render lại không cần thiết:

    • useMemo: nhớ kết quả của phép tính tốn kém.
    • useCallback: nhớ hàm, để tham chiếu không đổi giữa các lần render.
    • React.memo: bỏ qua render component con nếu props không đổi (so sánh nông).

    Chúng thường phải đi cùng nhau: truyền hàm mới mỗi lần render vào component đã memo thì memo vô tác dụng.

    Dùng tràn lan làm code khó đọc, tốn công so sánh dependency, và dễ sai khi thiếu dependency. Chỉ nên dùng khi đã đo bằng React DevTools Profiler và thấy chậm, hoặc khi giá trị đó là dependency của effect.

    React Compiler có thể tự thêm memo khi build, giảm nhu cầu viết tay.

    Người phỏng vấn muốn nghe: trước khi memo, hãy thử đưa state xuống thấp hơn hoặc truyền component qua children để giảm phạm vi render lại.

    Ôn thêm câu hỏi ReactJS →
  9. 09Custom hook là gì? Các quy tắc của hooks là gì và vì sao có chúng?ReactJS

    Gợi ý trả lời

    Custom hook là hàm bắt đầu bằng use, dùng các hook khác bên trong, để tái sử dụng logic có state giữa nhiều component (không chia sẻ state, mỗi component có bản riêng).

    function useDebounce(value, ms) {
      const [debounced, setDebounced] = useState(value);
      useEffect(() => {
        const id = setTimeout(() => setDebounced(value), ms);
        return () => clearTimeout(id);
      }, [value, ms]);
      return debounced;
    }
    

    Quy tắc: chỉ gọi hook ở cấp cao nhất của component hoặc custom hook; không gọi trong if, vòng lặp hay sau return sớm. Lý do: React nhận diện từng hook theo thứ tự gọi, đổi thứ tự là state bị ghép nhầm.

    Ngoại lệ: hook use() của React 19 được gọi trong điều kiện.

    Người phỏng vấn muốn nghe: bạn bật ESLint plugin react-hooks để bắt các lỗi này tự động.

    Ôn thêm câu hỏi ReactJS →
  10. 10Kể về một thất bại hoặc sai lầm của bạn và bài học rút ra.Câu hỏi hành vi & văn hoá

    Gợi ý trả lời

    Chọn sai lầm thật, có hậu quả vừa phải, nhận trách nhiệm rõ ràng, và nhấn mạnh việc bạn đã thay đổi sau đó.

    Cấu trúc: chuyện gì xảy ra, phần lỗi của bạn, bạn khắc phục ngay thế nào, bài học và thay đổi lâu dài.

    Câu mẫu: "Có lần em deploy một thay đổi cấu hình lên production vào chiều thứ Sáu mà không kiểm tra kỹ trên staging, làm một tính năng lỗi khoảng một giờ. Em báo ngay cho lead, rollback và viết báo cáo sự cố. Sau đó em đề xuất checklist trước deploy và quy ước hạn chế deploy cuối tuần; team áp dụng tới giờ."

    Hay sai: kể một "thất bại" thực ra là khoe, đổ lỗi cho người khác, hoặc nói mình chưa từng thất bại.

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

Bạn đã phỏng vấn ở Buymed?

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