Việc làm

06/10 · Hồ Chí Minh · Hà Nội · Hybrid

Senior Golang Developer (Backend, AWS, MySQL)

ANDPAD VietNam Co., Ltd · Backend 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 (Golang, Cloud (AWS, Azure, GCP), AI / Machine Learning). 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. 01Map trong Go có an toàn khi dùng đồng thời không? Bạn phát hiện và xử lý race condition thế nào?Golang

    Gợi ý trả lời

    Không. Đọc và ghi map đồng thời có thể làm runtime dừng chương trình với lỗi "concurrent map read and map write". Các biến dùng chung khác cũng có data race nhưng thường im lặng cho kết quả sai.

    Phát hiện bằng race detector: go test -race ./... hoặc go run -race. Nên bật trong CI.

    Cách xử lý:

    • sync.Mutex bọc map, hoặc sync.RWMutex khi đọc nhiều hơn ghi rất nhiều.
    • sync.Map hợp với vài trường hợp đặc thù (key ghi một lần đọc nhiều lần, hoặc mỗi goroutine dùng tập key riêng); không phải thay thế mặc định.
    • Bộ đếm đơn giản: atomic.Int64.
    • Hoặc tránh chia sẻ: để một goroutine sở hữu dữ liệu, các goroutine khác gửi yêu cầu qua channel.

    Hay sai: copy struct có chứa sync.Mutex (truyền theo giá trị), khiến mỗi bản có một khoá riêng. go vet cảnh báo được lỗi này.

    Ôn thêm câu hỏi Golang →
  2. 02context.Context dùng để làm gì? Có những quy ước nào khi dùng context?Golang

    Gợi ý trả lời

    Context mang tín hiệu huỷ, deadline và một ít giá trị gắn với request, truyền xuyên suốt chuỗi gọi hàm. Khi client ngắt kết nối hoặc hết thời gian, mọi thao tác bên dưới (truy vấn DB, gọi HTTP) đều có thể dừng sớm.

    ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
    defer cancel()
    row := db.QueryRowContext(ctx, query, id)
    

    Quy ước:

    • Context là tham số đầu tiên, tên ctx; không lưu context trong struct.
    • Luôn defer cancel() để giải phóng tài nguyên.
    • Goroutine chạy lâu phải kiểm tra ctx.Done().
    • WithValue chỉ dùng cho dữ liệu theo request (request ID, thông tin trace), không dùng để truyền tham số tuỳ chọn.

    Hay sai: dùng context của request cho việc chạy nền sau khi đã trả response. Request xong là context bị huỷ; hãy dùng context.WithoutCancel hoặc context riêng.

    Ôn thêm câu hỏi Golang →
  3. 03defer hoạt động thế nào? Vòng lặp for kết hợp goroutine và closure có thay đổi gì từ Go 1.22?Golang

    Gợi ý trả lời

    defer hoãn lời gọi hàm đến khi hàm bao ngoài kết thúc (kể cả khi panic), chạy theo thứ tự LIFO. Tham số của lời gọi được tính ngay lúc gặp defer, không phải lúc chạy.

    for i := 0; i < 3; i++ {
        defer fmt.Println(i) // in 2, 1, 0
    }
    
    • Đừng defer f.Close() trong vòng lặp mở hàng nghìn file: chúng chỉ đóng khi hàm kết thúc. Tách thân vòng lặp thành hàm riêng.

    Về vòng lặp: trước Go 1.22, biến vòng lặp dùng chung cho mọi lần lặp nên goroutine hay closure thường thấy giá trị cuối cùng. Từ Go 1.22, mỗi lần lặp có biến riêng (khi go.mod khai báo 1.22 trở lên), nên lỗi này không còn.

    Người phỏng vấn muốn nghe: bạn biết thay đổi này phụ thuộc phiên bản trong go.mod.

    Ôn thêm câu hỏi Golang →
  4. 04Load balancer tầng 4 và tầng 7 khác nhau thế nào? Khi nào dùng loại nào?Cloud (AWS, Azure, GCP)

    Gợi ý trả lời

    Load balancer tầng 4 phân phối theo IP/port (TCP/UDP), không đọc nội dung; tầng 7 hiểu HTTP nên định tuyến được theo path, host, header.

    • L7 (ALB, Application Gateway, HTTP(S) LB): định tuyến /api và /web tới các nhóm khác nhau, kết thúc TLS, gắn WAF, hợp web/API.
    • L4 (NLB, Azure Load Balancer): độ trễ thấp, thông lượng cao, giao thức không phải HTTP (game, MQTT, DB proxy), cần IP tĩnh.
    • Cả hai đều có health check để loại máy hỏng.

    Hay sai: health check trỏ vào trang nặng hoặc phụ thuộc DB, khiến LB loại hết máy khi DB chậm.

    Ôn thêm câu hỏi Cloud (AWS, Azure, GCP) →
  5. 05Hoá đơn cloud tháng này tăng gấp đôi. Bạn tìm nguyên nhân và tối ưu chi phí thế nào?Cloud (AWS, Azure, GCP)

    Gợi ý trả lời

    Bắt đầu từ dữ liệu chi phí, không đoán: xem Cost Explorer/Cost Management theo dịch vụ, region, tag và theo ngày để tìm điểm tăng.

    Thủ phạm hay gặp:

    • Tài nguyên quên tắt: máy dev, ổ đĩa, snapshot, IP tĩnh không gắn máy.
    • Data transfer: traffic ra Internet, qua NAT Gateway, giữa AZ/region.
    • Log và metric ghi quá nhiều, giữ quá lâu.
    • Auto scaling không co lại.

    Tối ưu: right-sizing, Savings Plans/Reserved cho tải nền ổn định, spot cho việc chịu ngắt quãng, lifecycle policy chuyển dữ liệu cũ sang lớp lưu trữ rẻ.

    Người phỏng vấn muốn nghe: gắn tag bắt buộc và đặt budget alert để phát hiện sớm.

    Ôn thêm câu hỏi Cloud (AWS, Azure, GCP) →
  6. 06Bạn triển khai một mô hình ML lên production và theo dõi nó thế nào?AI / Machine Learning

    Gợi ý trả lời

    Mô hình lên production là một phần mềm cần đóng gói, phiên bản hoá, giám sát và cập nhật như mọi dịch vụ khác.

    • Đóng gói: lưu mô hình kèm phiên bản dữ liệu, code, siêu tham số (model registry).
    • Phục vụ: API online hoặc chạy batch tuỳ yêu cầu độ trễ; dùng chung code tính đặc trưng giữa train và serve để tránh lệch.
    • Triển khai an toàn: shadow hoặc canary, so sánh với mô hình cũ.
    • Giám sát: độ trễ, lỗi; data drift (phân phối đầu vào thay đổi); chất lượng dự đoán khi có nhãn thật.
    • Cập nhật: train lại định kỳ hoặc khi drift vượt ngưỡng, có rollback.

    Hay sai: training-serving skew, xử lý đặc trưng ở hai nơi bằng hai đoạn code khác nhau.

    Ôn thêm câu hỏi AI / Machine Learning →
  7. 07Goroutine leak là gì? Làm sao phát hiện và phòng tránh?Golang · Senior

    Gợi ý trả lời

    Goroutine leak là goroutine bị chặn mãi mãi và không bao giờ kết thúc, giữ theo bộ nhớ và tài nguyên nó tham chiếu. Số goroutine tăng dần theo thời gian là dấu hiệu rõ nhất.

    Nguyên nhân hay gặp:

    • Gửi vào channel mà bên nhận đã bỏ đi (ví dụ đã trả về vì timeout).
    • Nhận từ channel không bao giờ được gửi hoặc đóng.
    • Vòng lặp chạy nền không kiểm tra ctx.Done().
    • HTTP response không đóng Body.
    ch := make(chan Result, 1) // buffer 1: goroutine gửi xong vẫn thoát được
    go func() { ch <- slowCall() }()
    select {
    case r := <-ch: return r, nil
    case <-ctx.Done(): return Result{}, ctx.Err()
    }
    

    Phát hiện: theo dõi runtime.NumGoroutine(), xem profile goroutine qua net/http/pprof, dùng thư viện goleak trong test.

    Người phỏng vấn muốn nghe: mỗi goroutine bạn tạo phải có câu trả lời rõ ràng cho câu hỏi "nó kết thúc khi nào?".

    Ôn thêm câu hỏi Golang →
  8. 08Generics trong Go dùng thế nào? Khi nào nên dùng generics thay vì interface?Golang · Senior

    Gợi ý trả lời

    Từ Go 1.18, hàm và kiểu có thể nhận type parameter với ràng buộc (constraint):

    func Map[T, U any](in []T, f func(T) U) []U {
        out := make([]U, 0, len(in))
        for _, v := range in {
            out = append(out, f(v))
        }
        return out
    }
    
    • Constraint có thể là any, comparable, cmp.Ordered, hoặc interface tự định nghĩa chứa tập kiểu (~int | ~float64).
    • Thư viện chuẩn đã có các package generic như slices và maps.

    Khi nào dùng:

    • Generics: cấu trúc dữ liệu và hàm tiện ích làm việc giống hệt nhau với nhiều kiểu (cache, set, hàm lọc, phân trang).
    • Interface: khi cần hành vi khác nhau cho từng kiểu (lưu vào DB hay vào file, nhiều cổng thanh toán).

    Hay sai: generic hoá mọi thứ ngay từ đầu. Code Go chuộng đơn giản; hãy viết cụ thể trước, khi có hai ba chỗ lặp lại thật sự thì mới trích generic.

    Ôn thêm câu hỏi Golang →
  9. 09Could you describe the project you're currently working on?Phỏng vấn tiếng Anh

    Gợi ý trả lời

    "I'm working on an e-commerce platform that handles orders for several retail brands. The system is built with microservices on Node.js, using PostgreSQL and Redis, deployed on AWS. My team has six people and we work in two-week sprints. I'm mainly in charge of the order and payment services. Recently, I led the integration with a new payment gateway, from reading the API docs to handling edge cases like timeouts and duplicate callbacks."

    Mẹo: đi từ tổng quan (sản phẩm làm gì, cho ai) tới vai trò của riêng bạn. Nói "my team" và "I" rõ ràng để người nghe biết phần nào bạn làm. Không cần kể tên khách hàng nếu bị ràng buộc bảo mật.

    Ôn thêm câu hỏi Phỏng vấn tiếng Anh →
  10. 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

    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ì.

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

Bạn đã phỏng vấn ở ANDPAD VietNam Co., Ltd?

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