Thư Viện Câu Hỏi Phỏng Vấn

Tổng hợp các câu hỏi tuyển dụng thực tế theo nhiều cấp độ từ Entry đến Expert để bạn tự tin chinh phục nhà tuyển dụng.

2281

Làm thế nào để phát hiện và tối ưu hóa lỗi truy vấn N+1 (N+1 query problem) trong Eloquent ORM của Laravel?

Senior

Lỗi N+1 xảy ra khi bạn truy vấn danh sách bản ghi và với mỗi bản ghi, bạn lại thực hiện thêm một truy vấn con để lấy quan hệ liên kết.

  • Phát hiện: Sử dụng các công cụ như Laravel Debugbar hoặc Telescope để theo dõi số lượng câu lệnh SQL được thực thi.
  • Khắc phục: Sử dụng phương pháp Eager Loading bằng cách gọi phương thức with('relation') khi truy vấn. Ví dụ: Book::with('author')->get(). Điều này sẽ gộp truy vấn con lại thành một câu lệnh SQL duy nhất sử dụng IN (...), giảm số lượng truy vấn từ N+1 xuống còn đúng 2 truy vấn.
2282

Sự khác biệt giữa Repository Pattern và Service Layer trong kiến trúc dự án Laravel?

Senior
  • Repository Pattern: Đóng vai trò làm lớp trung gian giữa Business Logic và Data Access. Nó giúp trừu tượng hóa các câu lệnh truy vấn dữ liệu (như Eloquent, raw SQL) ra khỏi Controller/Service, giúp dễ dàng viết Unit Test (mocking) và thay đổi cơ sở dữ liệu về sau.
  • Service Layer: Nơi chứa logic nghiệp vụ (business logic) của hệ thống. Nó điều phối các Repositories, gửi Email, gọi API bên thứ ba, xử lý các phép tính nghiệp vụ phức tạp. Việc phân tách này giúp giữ cho Controllers mỏng (skinny controllers) và mã nguồn dễ bảo trì.
  • 2283

    Làm thế nào để xử lý các tác vụ nặng (như gửi email hàng loạt, xử lý video) bất đồng bộ trong Laravel?

    Senior

    Sử dụng hệ thống Queues & Job Workers của Laravel:

    1. Cấu hình Queue Connection: Thiết lập driver (như Redis, Database, SQS) trong file .env (khuyên dùng redis cho môi trường production).
    2. Tạo Job Class: Sử dụng lệnh php artisan make:job ProcessPodcast. Trong phương thức handle(), viết logic xử lý nặng.
    3. Dispatch Job: Gọi ProcessPodcast::dispatch($data) từ Controller để đẩy tác vụ vào hàng đợi và phản hồi ngay lập tức cho client.
    4. Chạy Worker: Chạy lệnh php artisan queue:work trên server (thường quản lý bởi Supervisor) để liên tục lấy các jobs ra khỏi hàng đợi và xử lý bất đồng bộ.
    2284

    Cơ chế Route Caching và Config Caching trong Laravel hoạt động như thế nào và tại sao cần lưu ý khi deploy?

    Senior
  • Route Caching (route:cache): Biên dịch tất cả các khai báo route trong file routes/*.php thành một mảng phẳng duy nhất được lưu trong bộ nhớ đệm của framework, giúp tăng tốc độ điều hướng đáng kể.
  • Config Caching (config:cache): Gộp toàn bộ các file cấu hình trong thư mục config/*.php thành một file duy nhất.
  • Lưu ý khi deploy: Khi đã bật Config Cache, hàm env() sẽ luôn trả về null bên ngoài các file config. Do đó, Best Practice là chỉ gọi env() trong các file ở thư mục config, còn trong Controller/Service bắt buộc phải gọi thông qua config('key').
  • 2285

    React Server Components (RSC) là gì và khác gì so với Server-Side Rendering (SSR) truyền thống?

    Senior
  • Server-Side Rendering (SSR): Là cơ chế render toàn bộ component của trang web thành HTML tĩnh trên Server và gửi về Client. Sau đó, Client sẽ chạy quá trình Hydration (tải JS và gắn các event listeners) để trang web tương tác được.
  • React Server Components (RSC): Là các components chỉ chạy và render trên Server. Mã nguồn Javascript của RSC không bị bundle gửi về Client, giúp giảm dung lượng bundle size đáng kể. RSC có thể truy cập trực tiếp vào database hay file system của server mà không cần qua API Gateway.
  • 2286

    State Management: So sánh Redux Toolkit và Zustand? Khi nào nên chọn cái nào?

    Senior
  • Redux Toolkit: Là thư viện quản lý state toàn cục lâu đời, tuân theo luồng dữ liệu một chiều chặt chẽ (Action -> Reducer -> Store). Cung cấp DevTools mạnh mẽ nhưng có nhiều boilerplate code.
  • Zustand: Là thư viện quản lý state hiện đại, tối giản và cực kỳ nhẹ (chỉ khoảng 1KB). Cú pháp định nghĩa store rất trực quan, không cần Context Provider bao quanh ứng dụng.
  • Lựa chọn: Chọn Zustand cho các dự án vừa và nhỏ hoặc khi cần sự nhanh gọn, tối giản. Chọn Redux cho hệ thống lớn Enterprise có luồng dữ liệu cực kỳ phức tạp và cần kiểm soát chặt chẽ trạng thái biến đổi.
  • 2287

    Sự khác biệt giữa Worker Threads và Cluster Module trong Node.js? Khi nào dùng cái nào?

    Senior
  • Cluster Module: Nhân bản tiến trình Node.js hiện tại thành nhiều tiến trình con (Child Processes) chia sẻ chung cổng mạng (port) thông qua Load Balancer (Round-Robin). Mỗi tiến trình con có bộ nhớ và instance V8 riêng biệt. Thích hợp cho các tác vụ I/O-bound để tận dụng hết số nhân CPU của server.
  • Worker Threads: Cho phép chạy nhiều luồng (threads) thực thi mã Javascript song song bên trong cùng một tiến trình Node.js. Các luồng này chia sẻ chung vùng nhớ (SharedArrayBuffer). Thích hợp cho các tác vụ nặng về CPU (CPU-bound) như xử lý ảnh, mã hóa dữ liệu.
  • 2288

    Cơ chế hoạt động của Stream API trong Node.js? Tại sao nó giúp tối ưu hóa bộ nhớ RAM?

    Senior

    Stream là cơ chế đọc/ghi dữ liệu theo từng phần nhỏ (chunks) liên tục, thay vì tải toàn bộ file vào RAM một lần duy nhất.

    • Ví dụ: Khi đọc một file dung lượng 4GB trên server có RAM 2GB, nếu đọc bình thường bằng fs.readFile, server sẽ bị crash do tràn RAM (Out of Memory). Nhưng nếu dùng fs.createReadStream, dữ liệu được chia nhỏ thành các buffer chunk khoảng vài chục KB và truyền đi liên tục (pipe) sang writable stream, giúp lượng RAM tiêu thụ luôn ở mức rất thấp và ổn định.
    2289

    Làm thế nào để phát hiện và xử lý hiện tượng rò rỉ bộ nhớ (Memory Leak) trong ứng dụng Node.js chạy production?

    Senior
  • Phát hiện: Sử dụng các công cụ giám sát APM (như Prometheus, New Relic) để theo dõi biểu đồ tiêu thụ RAM. Nếu RAM tăng liên tục theo dạng bậc thang mà không giảm sau khi chạy GC, hệ thống đang bị rò rỉ bộ nhớ.
  • Phân tích: Chụp Heap Snapshot tại các thời điểm khác nhau bằng cách sử dụng module v8 hoặc cắm --inspect để dùng Chrome DevTools so sánh sự khác biệt (đặc biệt tìm các đối tượng tăng đột biến không bị giải phóng).
  • Nguyên nhân phổ biến: Biến toàn cục (global variables) không được dọn dẹp, closure giữ tham chiếu cũ, hoặc các sự kiện (Event Emitters) quên chưa gọi removeListener.
  • 2290

    Spring Boot Starter là gì và cơ chế Auto-Configuration hoạt động như thế nào?

    Senior
  • Spring Boot Starters: Là các gói dependencies gộp sẵn giúp lập trình viên không phải khai báo thủ công hàng loạt thư viện liên quan (ví dụ: spring-boot-starter-web bao gồm cả Spring MVC, Tomcat, Jackson...).
  • Auto-Configuration: Hoạt động dựa trên chú thích @EnableAutoConfiguration (nằm trong @SpringBootApplication). Lúc khởi động, Spring Boot sẽ quét classpath, nếu phát hiện sự hiện diện của một thư viện nhất định (ví dụ H2 Database), nó sẽ tự động cấu hình các Beans mặc định cho thư viện đó mà không cần viết cấu hình thủ công, trừ khi lập trình viên tự ghi đè cấu hình.
  • 2291

    Làm thế nào để xử lý các giao dịch (Transactions) đồng thời trong Spring Boot bằng @Transactional?

    Senior

    Chú thích @Transactional của Spring được dùng để tự động hóa việc quản lý transaction (commit nếu thành công, rollback nếu có runtime exception):

    • Cơ chế: Spring sử dụng AOP (Aspect-Oriented Programming) tạo ra một proxy bao quanh class/method đó để mở và đóng kết nối transaction.
    • Lưu ý quan trọng: Lời gọi tự thân (Self-invocation - gọi phương thức @Transactional từ một phương thức khác bên trong cùng một class) sẽ không kích hoạt transaction vì proxy bị bỏ qua. Để khắc phục, cần tách phương thức đó sang một bean khác hoặc inject chính bean đó thông qua Spring Context.
    2292

    Tại sao Lambda Expressions syntax lại đóng vai trò quan trọng khi phát triển ứng dụng LINQ chịu tải cao?

    Senior

    Trong phát triển dự án với LINQ, việc tối ưu hóa và quản lý tốt Lambda Expressions syntax là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Lambda Expressions syntax dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    2293

    Tại sao Assemblies structures lại đóng vai trò quan trọng khi phát triển ứng dụng .Net chịu tải cao?

    Senior

    Trong phát triển dự án với .Net, việc tối ưu hóa và quản lý tốt Assemblies structures là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Assemblies structures dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    2294

    Tại sao Ionic UI Components library lại đóng vai trò quan trọng khi phát triển ứng dụng Ionic chịu tải cao?

    Senior

    Trong phát triển dự án với Ionic, việc tối ưu hóa và quản lý tốt Ionic UI Components library là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của Ionic UI Components library dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.
    2295

    Tại sao StyleSheet styling lại đóng vai trò quan trọng khi phát triển ứng dụng React Native chịu tải cao?

    Senior

    Trong phát triển dự án với React Native, việc tối ưu hóa và quản lý tốt StyleSheet styling là vô cùng quan trọng để đảm bảo tính ổn định và hiệu năng của hệ thống. Dưới đây là các khía cạnh kỹ thuật cốt lõi:

    1. Cơ chế hoạt động: Nắm vững vòng đời và cách thức hoạt động của StyleSheet styling dưới runtime để tránh các lỗi logic phổ biến.
    2. Best Practices: Áp dụng các mẫu thiết kế chuẩn, hạn chế tối đa tài nguyên dư thừa và sử dụng các thư viện hỗ trợ tối ưu.
    3. Khắc phục lỗi: Sử dụng công cụ giám sát (APM, Profiling, Logs) để theo dõi hành vi, phát hiện kịp thời các hiện tượng như rò rỉ bộ nhớ hoặc nghẽn luồng.
    4. Tối ưu hóa: Cấu hình các tham số hệ thống phù hợp với quy mô tải thực tế của ứng dụng.

    vừa nâng cấp PRO khóa 1 phút trước   Tìm hiểu khóa học