Bỏ qua đến nội dung
KhaiziNam Blog KhaiziNam Blog
Quay lại
Read in English

Phỏng Vấn Junior Outsource: Từ AI Workflow, Dependency Injection Đến Bài Toán Redis Chặn Concurrent Edit

Bạn chuẩn bị phỏng vấn vị trí Junior tại công ty outsource nhưng không biết họ thực sự hỏi gì sau câu “em tự giới thiệu đi”? Nếu chỉ ôn thuần lý thuyết OOP hay cú pháp Laravel, bạn có thể bị bất ngờ hoàn toàn khi gặp các câu hỏi về AI workflow, Dependency Injection, Interface pattern hay bài toán chặn nhiều người edit cùng một form. Bài này tôi kể lại nguyên xi buổi phỏng vấn của mình — từng câu hỏi, từng lần ngập ngừng, và cả những lúc tôi không biết câu trả lời nhưng vẫn vượt qua được nhờ tư duy đúng hướng.

Phỏng Vấn Junior Outsource: Từ AI Workflow, Dependency Injection Đến Bài Toán Redis Chặn Concurrent Edit

Phỏng Vấn Junior Outsource: Từ AI Workflow, Dependency Injection Đến Bài Toán Redis Chặn Concurrent Edit

Mục Lục

1. Công ty outsource phỏng vấn Junior theo kiểu gì?

2. Câu hỏi về AI — Từ “No AI” đến Power User trong vài tháng

3. Dependency Injection và Interface — Câu tôi bị đứng hình

4. Bài toán chặn concurrent edit form — Redis, Queue và Unique Action Key

5. Diễn biến thực tế từng câu hỏi trong phòng phỏng vấn

6. Những sai lầm Junior thường mắc khi phỏng vấn outsource

7. FAQ — Câu hỏi thầm kín nhất trước buổi phỏng vấn


Công Ty Outsource Phỏng Vấn Junior Theo Kiểu Gì?

Khác với product company thường focus vào DSA (Data Structures & Algorithms) hay system design thuần lý thuyết, công ty outsource phỏng vấn theo hướng thực chiến. Họ không cần bạn giải được bài toán cây nhị phân trong 15 phút — họ cần biết bạn có thể bước vào một dự án đang chạy, hiểu yêu cầu từ client nước ngoài, và deliver code đúng convention của team hay không.

Cụ thể, buổi phỏng vấn của tôi theo mô hình Behavioral + Technical Hybrid: bắt đầu bằng câu hỏi về thói quen và quy trình làm việc, sau đó leo thang dần vào các khái niệm kỹ thuật ngày càng sâu hơn. Đây là mô hình phổ biến tại các công ty outsource làm dự án châu Âu hoặc Bắc Mỹ.

Những năng lực thực sự được đánh giá

Câu Hỏi Về AI — Từ “No AI” Đến Power User Trong Vài Tháng

Câu hỏi đầu tiên sau phần giới thiệu khiến tôi hơi bất ngờ: “Em có dùng AI trong lúc code không?”

Tôi thành thật: trước hè năm ngoái, tôi thuộc nhóm “No AI” — không phải vì không biết, mà vì tôi sợ phụ thuộc vào nó và mất khả năng tư duy độc lập. Nhưng sau một dự án deadline dồn dập, tôi buộc phải thử và nhận ra mình đã hiểu sai bản chất. AI không thay thế tư duy — nó khuếch đại tư duy. Người dùng AI kém sẽ nhận output kém. Người dùng AI đúng sẽ nhận output tốt hơn gấp nhiều lần.

Cách tôi tích hợp AI vào workflow thực tế

Interviewer hỏi tiếp: “Em dùng như thế nào cụ thể?” — và đây là phần tôi trả lời tự tin nhất trong buổi hôm đó:

Interviewer gật đầu, ghi chú lại. Đây không phải cách dùng AI của người mới học — đây là cách một engineer tư duy về toolchain và feedback loop. Bạn có thể tham khảo thêm về cách xây dựng AI workflow cho developer để hệ thống hóa quy trình này trong dự án thực tế.

Tại sao “AI tự sửa prompt” là tư duy khác biệt?

Hầu hết developer dùng AI theo vòng lặp: hỏi → nhận output → sửa output thủ công. Đây là vòng lặp ngắn, không scale. Tư duy đúng là: hỏi → nhận output sai → phân tích tại sao sai → update instruction để AI không sai nữa. Đây là vòng lặp dài hơn nhưng tích lũy — sau 2 tuần, prompt của bạn đã cover được 90% edge case phổ biến mà không cần can thiệp thủ công.

Dependency Injection Và Interface — Câu Tôi Bị Đứng Hình

Câu tiếp theo làm tôi dừng lại vài giây: “Em có biết Dependency Injection không?”

Thành thật: tôi biết khái niệm, tôi dùng hằng ngày trong Laravel, nhưng khi nghe tên thuật ngữ được hỏi trực tiếp, tôi ngập ngừng. Lý do: tôi quen gọi nó là “inject service vào constructor” hoặc “resolve qua container” — không dùng đúng tên học thuật. Bài học đầu tiên rút ra: biết thuật ngữ chuẩn quan trọng không kém biết làm.

Dependency Injection là gì — Giải thích không phải lý thuyết

Dependency Injection (DI) là design pattern trong đó một class không tự tạo ra các dependency của nó, mà nhận chúng từ bên ngoài — qua constructor, method hoặc property. Đây là hiện thực hóa nguyên lý Inversion of Control (IoC): thay vì class A kiểm soát việc tạo class B, một “bên thứ ba” (Service Container) sẽ quyết định và inject B vào A.

Trong Laravel, Service Container là trung tâm của toàn bộ framework. Khi bạn type-hint một class vào constructor của Controller, Container tự resolve và inject instance đúng:

// Laravel tự inject UserRepository và MailService // Bạn không cần new UserRepository() thủ công public function __construct( protected UserRepository $userRepository, protected MailService $mailService ) {}

Lợi ích cốt lõi của DI: loose coupling — class của bạn không biết và không quan tâm implementation cụ thể được inject là gì. Điều này làm cho code dễ test (mock dependency), dễ swap implementation, và dễ maintain.

Interface đóng vai trò gì trong DI?

Interviewer hỏi tiếp: “Em có tạo Interface cho service không?” — câu này tôi trả lời tốt hơn. Interface đóng vai trò contract: định nghĩa những method nào một service phải implement, không quan tâm implementation cụ thể là gì.

// Contract — chỉ định nghĩa “cần làm gì” interface PaymentGatewayInterface { public function charge(float $amount, string $currency): PaymentResult; public function refund(string $transactionId): bool; }

// Implementation A class StripeGateway implements PaymentGatewayInterface { public function charge(float $amount, string $currency): PaymentResult { … } public function refund(string $transactionId): bool { … } }

// Implementation B — swap dễ dàng, không sửa code phụ thuộc class PaypalGateway implements PaymentGatewayInterface { public function charge(float $amount, string $currency): PaymentResult { … } public function refund(string $transactionId): bool { … } }

Sau đó bind interface với implementation trong AppServiceProvider:

// app/Providers/AppServiceProvider.php public function register(): void { $this->app->bind( PaymentGatewayInterface::class, StripeGateway::class ); }

Khi cần đổi từ Stripe sang Paypal, bạn chỉ thay đổi một dòng trong ServiceProvider — toàn bộ code còn lại không cần sửa. Đây là sức mạnh thực sự của Interface + DI.

Custom lại Illuminate Request — Câu hỏi cuối của phần này

Câu cuối trong phần này: “Em hay custom lại Illuminate Request như thế nào?” Đây là kỹ thuật tạo Form Request riêng để tách validation logic ra khỏi Controller, đồng thời có thể override các behavior mặc định của Request class:

// Tạo Form Request riêng // php artisan make:request StoreUserRequest

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest {

// Custom authorization logic
public function authorize(): bool {
    return $this->user()->can('create-user');
}

// Validation rules tách khỏi Controller
public function rules(): array {
    return \[
        'email'    => \['required', 'email', 'unique:users'\],
        'name'     => \['required', 'string', 'max:255'\],
        'password' => \['required', 'min:8', 'confirmed'\],
    \];
}

// Custom error messages
public function messages(): array {
    return \[
        'email.unique' => 'Email này đã được sử dụng.',
    \];
}

// Override prepareForValidation để transform data trước khi validate
protected function prepareForValidation(): void {
    $this->merge(\[
        'name' => trim($this->name),
        'email' => strtolower($this->email),
    \]);
}

}

Cách dùng trong Controller cực kỳ gọn — Laravel tự inject và validate trước khi method được gọi:

public function store(StoreUserRequest $request): JsonResponse { // Đến đây data đã validated, sạch và transform xong $user = $this->userService->create($request->validated()); return response()->json($user, 201); }

Bài Toán Chặn Concurrent Edit Form — Redis, Queue Và Unique Action Key

Đây là câu hỏi hay nhất và cũng khó nhất trong buổi phỏng vấn: “Nếu admin panel có nhiều người cùng edit một form, em sẽ xử lý thế nào để tránh conflict?”

Interviewer cho biết đây là bài toán thực tế họ gặp trong dự án. Không có một đáp án duy nhất đúng — họ muốn xem tư duy phân tích và khả năng leo thang giải pháp từ đơn giản đến phức tạp theo yêu cầu thực tế.

Phân tích bài toán — Trước khi code, phải hiểu đúng vấn đề

Bài toán có hai dimension cần phân biệt rõ:

Yêu cầu của bài toán này là Pessimistic Locking — chặn hoàn toàn, không cho nhiều người edit cùng lúc. Kết quả mong muốn: dùng unique key theo action + form ID, tự động xóa khi phiên làm việc kết thúc.

Giải pháp 1 — Redis SET NX (Not Exists)

Đây là giải pháp tôi đề xuất đầu tiên. Redis cung cấp lệnh SET key value NX EX seconds — atomic operation đảm bảo chỉ một client tạo được lock thành công:

// FormLockService.php class FormLockService {

private Redis $redis;
private int $lockTtl = 1800; // 30 phút

public function \_\_construct(Redis $redis) {
    $this->redis = $redis;
}

// Tạo unique key theo action + resource
private function buildKey(string $action, string $resourceId): string {
    return "form\_lock:{$action}:{$resourceId}";
}

// Thử acquire lock — trả về true nếu thành công
public function acquire(string $action, string $resourceId, int $userId): bool {
    $key   = $this->buildKey($action, $resourceId);
    $value = json\_encode(\[
        'user\_id'    => $userId,
        'locked\_at'  => now()->toISOString(),
    \]);

    // SET key value NX EX ttl — atomic, chỉ set nếu key chưa tồn tại
    return (bool) $this->redis->set($key, $value, \['NX', 'EX' => $this->lockTtl\]);
}

// Kiểm tra ai đang giữ lock
public function getHolder(string $action, string $resourceId): ?array {
    $key  = $this->buildKey($action, $resourceId);
    $data = $this->redis->get($key);
    return $data ? json\_decode($data, true) : null;
}

// Release lock — chỉ cho phép chính user đang giữ lock release
public function release(string $action, string $resourceId, int $userId): bool {
    $holder = $this->getHolder($action, $resourceId);

    if (!$holder || $holder\['user\_id'\] !== $userId) {
        return false; // Không phải chủ sở hữu lock
    }

    $key = $this->buildKey($action, $resourceId);
    return (bool) $this->redis->del($key);
}

// Gia hạn lock khi user vẫn đang active (heartbeat)
public function refresh(string $action, string $resourceId, int $userId): bool {
    $holder = $this->getHolder($action, $resourceId);

    if (!$holder || $holder\['user\_id'\] !== $userId) {
        return false;
    }

    $key = $this->buildKey($action, $resourceId);
    return (bool) $this->redis->expire($key, $this->lockTtl);
}

}

Tích hợp vào Controller

class AdminFormController extends Controller {

public function \_\_construct(private FormLockService $lockService) {}

// Khi user mở form để edit
public function edit(string $resourceId, Request $request): JsonResponse {
    $userId = $request->user()->id;
    $action = 'edit\_order'; // Unique action name

    $acquired = $this->lockService->acquire($action, $resourceId, $userId);

    if (!$acquired) {
        $holder = $this->lockService->getHolder($action, $resourceId);
        return response()->json(\[
            'locked'     => true,
            'locked\_by'  => $holder\['user\_id'\],
            'message'    => 'Form đang được chỉnh sửa bởi người khác.',
        \], 423); // 423 Locked
    }

    // Trả về form data
    $data = Order::findOrFail($resourceId);
    return response()->json(\['data' => $data, 'locked' => false\]);
}

// Khi user save hoặc đóng form
public function unlock(string $resourceId, Request $request): JsonResponse {
    $this->lockService->release('edit\_order', $resourceId, $request->user()->id);
    return response()->json(\['released' => true\]);
}

}

Giải pháp 2 — Bảng đăng ký action (Database approach)

Khi cần audit trail (biết ai lock khi nào, bao lâu), Redis key đơn giản không đủ. Interviewer gợi ý thêm về bảng đăng ký action — kết hợp database và Redis:

— Migration: form_action_registry CREATE TABLE form_action_registry ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, action VARCHAR(100) NOT NULL, resource_id VARCHAR(100) NOT NULL, user_id BIGINT UNSIGNED NOT NULL, session_id VARCHAR(255) NOT NULL, expires_at TIMESTAMP NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

-- Unique constraint đảm bảo chỉ 1 lock mỗi action+resource
UNIQUE KEY uq\_action\_resource (action, resource\_id)

);

Logic kết hợp: Database làm nguồn truth (dễ query, audit), Redis làm cache TTL (performance). Khi session kết thúc (logout, timeout, đóng tab), một scheduled job hoặc session event listener sẽ xóa lock tương ứng.

Giải pháp 3 — Queue để xử lý lock cleanup bất đồng bộ

Vấn đề thực tế: user đóng tab đột ngột mà không gọi unlock API. Lock sẽ tồn tại đến hết TTL. Để xử lý gracefully, kết hợp với Laravel Queue:

Kết quả cuối cùng: Unique key = action + resource_id, TTL tự động giải phóng khi phiên kết thúc, không cần can thiệp thủ công. Đây là pattern đủ production-ready cho hầu hết admin panel thực tế. Bạn có thể đọc thêm về Redis locking patterns trong Laravel để nắm sâu hơn về các edge case.

Diễn Biến Thực Tế Từng Câu Hỏi Trong Phòng Phỏng Vấn

Kể thật 100% để bạn có hình dung đúng — không phải tất cả đều diễn ra suôn sẻ.

Phần giới thiệu bản thân: Tôi chuẩn bị sẵn một đoạn ngắn khoảng 2 phút: background, stack quen dùng, dự án nổi bật nhất. Interviewer lắng nghe, ghi chú vài điểm rồi bắt đầu hỏi.

Câu AI: Bất ngờ nhưng xử lý được. Tôi thành thật về việc đổi quan điểm và giải thích workflow cụ thể. Interviewer hỏi thêm về “AI phân bổ task” — tôi mô tả cách dùng prompt để phân rã requirement. Họ tỏ ra khá ấn tượng vì đây không phải câu trả lời thông thường.

Câu Dependency Injection: Tôi ngập ngừng khoảng 3 giây, sau đó giải thích đúng bản chất. Interviewer hỏi thêm về Interface — tôi trả lời tốt. Câu về custom Illuminate Request tôi trả lời được nhưng không mượt lắm vì ít dùng prepareForValidation trong thực tế.

Câu concurrent edit form: Đây là lúc tôi tự tin nhất. Tôi không biết thuật ngữ “Pessimistic vs Optimistic Locking” một cách tường minh, nhưng tôi đã từng tự giải quyết bài toán tương tự trong một dự án thực tế nên giải thích được flow. Interviewer guide thêm về Queue và bảng đăng ký action — tôi tiếp thu và phản hồi được.

Kết quả: Passed. Feedback là tôi có tư duy thực chiến tốt dù còn thiếu một số thuật ngữ chuẩn.

Những Sai Lầm Junior Thường Mắc Khi Phỏng Vấn Outsource

FAQ — Những Câu Hỏi Thầm Kín Nhất Trước Buổi Phỏng Vấn

Hỏi: Junior outsource cần biết Redis không hay chỉ cần biết MySQL là đủ?

Đáp: Redis đã trở thành kiến thức baseline tại hầu hết công ty outsource làm dự án trung bình trở lên. Bạn không cần biết Redis chuyên sâu ở level Junior, nhưng cần hiểu Redis là gì, dùng khi nào (caching, session, lock, queue), và cách set/get key cơ bản. Biết thêm về TTL và atomic operation như SET NX sẽ là điểm cộng rõ rệt.

Hỏi: Nếu không biết câu hỏi kỹ thuật, có nên thành thật không?

Đáp: Thành thật là tốt, nhưng thành thật đúng cách còn tốt hơn. Thay vì “em không biết” và im lặng, hãy nói “em chưa làm bài toán này nhưng em nghĩ có thể tiếp cận theo hướng…” rồi tư duy to lên. Interviewer đánh giá cao ứng viên biết mình không biết nhưng vẫn có framework để phân tích vấn đề.

Hỏi: Phỏng vấn outsource có hỏi tiếng Anh không?

Đáp: Tùy công ty. Outsource làm cho client châu Âu, Mỹ, hay Úc thường yêu cầu ít nhất đọc hiểu tài liệu tiếng Anh và viết email cơ bản. Một số công ty có vòng phỏng vấn tiếng Anh riêng. Chuẩn bị sẵn một đoạn giới thiệu bản thân bằng tiếng Anh khoảng 90 giây — nếu họ không hỏi thì thôi, nếu hỏi thì bạn không bị bất ngờ.

Hỏi: Có nên nói là mình dùng AI khi phỏng vấn không?

Đáp: Có — nhưng phải kèm theo cách dùng cụ thể. “Em có dùng AI” mà không giải thích được dùng như thế nào thì không ấn tượng. “Em dùng AI theo workflow X, Y, Z với custom rules theo từng project” thì hoàn toàn khác. Nói thật kèm ví dụ cụ thể luôn tốt hơn nói chung chung.

Hỏi: Junior cần biết bao nhiêu design pattern để đủ tự tin phỏng vấn outsource?

Đáp: Không cần biết hết. Tập trung hiểu sâu 3 pattern phổ biến nhất trong web backend: Repository Pattern (tách data access logic), Service Layer (tách business logic), và Dependency Injection (manage dependencies). Hiểu sâu 3 cái này và có thể dùng thành thạo trong framework bạn đang dùng là đủ để vượt hầu hết vòng kỹ thuật Junior outsource.

Tổng Kết — Điều Quan Trọng Nhất Sau Buổi Phỏng Vấn Đó

Nhìn lại, điều tôi rút ra không phải là “cần học thêm Redis” hay “cần nhớ thuật ngữ DI”. Điều quan trọng hơn là: interviewer giỏi không tìm người biết tất cả — họ tìm người có tư duy đúng và trung thực về giới hạn của mình.

Khi tôi nói “em không biết Dependency Injection theo tên chính xác nhưng em hiểu cơ chế và dùng nó hằng ngày” — đó là câu trả lời trung thực và có chiều sâu hơn là cố nhớ thuộc lòng một định nghĩa. Khi tôi đề xuất giải pháp Redis cho bài toán concurrent edit từ kinh nghiệm thực tế chứ không phải từ sách — đó là thứ interviewer thực sự muốn thấy.

Nếu bạn đang chuẩn bị phỏng vấn Junior outsource: hãy ôn kỹ những gì bạn đã làm trong thực tế, học cách giải thích nó bằng thuật ngữ đúng, và đừng sợ nói “em chưa biết nhưng em nghĩ…” — câu đó thường mở ra cuộc đối thoại thú vị hơn bất kỳ câu trả lời thuộc lòng nào.

Bắt đầu ngay hôm nay: Chọn một tính năng bạn đã build trong 3 tháng qua, viết lại luồng xử lý của nó bằng văn xuôi kỹ thuật như thể đang giải thích cho interviewer. Nếu bạn không viết được, đó là khoảng trống cần lấp đầy trước buổi phỏng vấn tiếp theo.


Chia sẻ bài viết:

Bài viết liên quan

Mức lương fresher junior IT 2026 - PHP, NodeJS, React, Flutter thực tế

Bảng lương thực tế của fresher và junior IT Việt Nam năm 2026 theo từng stack - PHP/Laravel, Node.js, ReactJS, Flutter - kèm cách đọc con số để biết bạn đang ở đâu trên thị trường, dù bạn chưa đi làm hay đã đi làm 1-2 năm.

Portfolio cho dev junior - cần có gì để được chú ý

Portfolio developer junior là tập hợp các project thực tế, kỹ năng và thông tin nghề nghiệp mà bạn trình bày để nhà tuyển dụng đánh giá năng lực - thay thế cho phần kinh nghiệm làm việc còn trống trên CV. Với fresher và junior developer, portfolio không phải thứ "có thì tốt" - đó là bằng chứng duy nhất bạn có thể đưa ra để chứng minh bạn thực sự biết làm việc, không chỉ biết lý thuyết.

Cover Letter Fresher IT: Cách Viết Để Được Gọi Phỏng Vấn

Cách viết cover letter cho fresher IT khi chưa có kinh nghiệm, kèm mẫu thực tế, cấu trúc chuẩn và mẹo tăng tỷ lệ vượt qua vòng lọc CV.

Ngôn ngữ cơ thể trong phỏng vấn — những điều vô tình mất điểm

Ngôn ngữ cơ thể phỏng vấn IT là tập hợp những tín hiệu phi ngôn ngữ — tư thế, ánh mắt, cử chỉ tay, giọng điệu — mà nhà tuyển dụng quan sát song song với câu trả lời kỹ thuật của bạn. Hiểu và kiểm soát tốt những tín hiệu này giúp bạn tạo ấn tượng chuyên nghiệp ngay từ những giây đầu tiên bước vào phòng phỏng vấn.

Cách đặt câu hỏi ngược khi phỏng vấn IT — đừng chỉ hỏi lương

Hướng dẫn cách đặt câu hỏi ngược khi phỏng vấn IT dành cho fresher và junior developer — tại sao phần "bạn có câu hỏi gì không" quan trọng hơn bạn nghĩ, 20+ câu hỏi thực tế phân loại theo mục đích, những câu tuyệt đối không nên hỏi, và cách chọn đúng câu hỏi theo từng vòng phỏng vấn.

Vì sao bạn chọn ngành IT — câu trả lời tạo ấn tượng với HR khi phỏng vấn

Hướng dẫn cách trả lời câu hỏi "vì sao bạn chọn ngành IT" trong phỏng vấn — phân tích điều HR thực sự muốn nghe, framework xây dựng câu trả lời theo từng hoàn cảnh, script mẫu cho fresher và career changer, cùng các lỗi phổ biến khiến câu trả lời nghe sáo rỗng và không đáng tin.

Điểm yếu lớn nhất của bạn là gì — cách trả lời không bị loại ngay khi phỏng vấn IT

Hướng dẫn cách trả lời câu hỏi "điểm yếu lớn nhất của bạn là gì" trong phỏng vấn IT — phân tích tại sao câu này là bẫy, framework trả lời 3 bước, script mẫu cho fresher và junior developer, cùng danh sách lỗi hay gặp khiến ứng viên bị loại ngay lập tức.

Câu Hỏi Phỏng Vấn ReactJS Junior: 30+ Câu Thực Tế Kèm Đáp Án Chuẩn 2026

Tổng hợp 30+ câu hỏi phỏng vấn ReactJS junior hay gặp nhất năm 2026 — từ Virtual DOM, hooks, state management đến performance optimization — kèm đáp án chi tiết và ví dụ code giúp bạn tự tin vượt qua mọi vòng technical interview.Bạn đã học React được vài tháng, build được project, nhưng mỗi lần vào phỏng vấn lại bị hỏi những thứ không có trong tutorial nào bạn từng đọc? "useEffect cleanup function

Refresh Token Node.js và Laravel: Hướng Dẫn Implement Chuẩn Production 2026

Hướng dẫn implement Refresh Token hoàn chỉnh cho cả Node.js (Express) và Laravel PHP — từ thiết kế database, viết API endpoint, xử lý rotation, đến các lỗi thường gặp — giúp developer xây hệ thống JWT authentication chuẩn production trong năm 2026.

Session vs JWT: Developer Nên Chọn Cái Nào? So Sánh Thực Tế 2026

Phân tích chi tiết Session và JWT theo 6 tiêu chí kỹ thuật thực tế - kiến trúc, revocation, scaling, hiệu năng, bảo mật và độ phức tạp — giúp developer đưa ra quyết định đúng cho từng loại dự án trong năm 2026.


Bài trước
Session vs JWT: Toàn Bộ Lý Thuyết Và Câu Hỏi Phỏng Vấn Hay Gặp Nhất Mà Junior Cần Nắm Chắc
Bài tiếp theo
Kể Chuyện Phỏng Vấn Junior Intern Backend Node.js TypeScript - Họ Hỏi Gì, Mình Trả Lời Ra Sao?