Đến nội dung chính
QK

Bài viết mới nhất

Tôi đã refactor toàn bộ backend NestJS như thế nào — và những bài học đắt giá

Sau 2 năm tích lũy tech debt, codebase NestJS của chúng tôi đã trở thành một mớ hỗn độn. Bài viết này ghi lại toàn bộ quá trình refactor, từ planning đến execution, và những gì tôi học được về dependency injection, module boundaries và testing strategy.

QK
Quang Khải·12 phút đọc
156 23 89

Next.js App Router sau 1 năm production: những điều không ai nói với bạn

RSC, Suspense, Server Actions — nghe có vẻ xịn nhưng khi đưa vào production thực tế thì không ít cạm bẫy. Tôi chia sẻ những vấn đề gặp phải với caching, hydration mismatch, và cách chúng tôi tổ chức data fetching pattern cho team 5 người.

QK
Quang Khải·9 phút đọc
231 41 134

Xây dựng RAG system với pgvector: từ prototype đến production

pgvector đủ tốt để thay thế Pinecone cho hầu hết các use case? Spoiler: có — nếu bạn biết cách tune index IVFFlat/HNSW đúng cách. Tôi sẽ walk through toàn bộ pipeline từ chunking, embedding đến retrieval và re-ranking.

QK
Quang Khải·15 phút đọc
187 29 112

Tailwind CSS v4: những thay đổi bạn cần biết trước khi migrate

Tailwind v4 bỏ `tailwind.config.js`, dùng CSS-native @theme, @import thay vì PostCSS plugin. Breaking changes khá nhiều nhưng DX tốt hơn đáng kể. Tôi đã migrate một dự án thực tế và ghi lại từng bước.

QK
Quang Khải·7 phút đọc
298 55 201

PostgreSQL query optimization thực chiến: từ 3s xuống 80ms

Một câu query đơn giản JOIN 4 bảng, 2 triệu rows, chạy 3 giây. Bài viết này ghi lại quá trình dùng EXPLAIN ANALYZE, partial index, materialized view và partition để đưa về 80ms. Không có magic, chỉ là hiểu đúng cách PG planner hoạt động.

QK
Quang Khải·11 phút đọc
342 47 223

Docker Compose cho production: setup đúng cách mà ít người làm

Dùng Docker Compose cho production không xấu — nếu bạn làm đúng. Tôi sẽ chia sẻ cách tôi setup multi-stage builds, health checks, secrets management, log rotation và rolling update strategy cho một app nhỏ-vừa mà không cần Kubernetes.

QK
Quang Khải·8 phút đọc
189 31 143

8 TypeScript patterns tôi dùng hàng ngày (và lý do tại sao)

Từ discriminated unions để handle async states, branded types cho type-safe IDs, đến satisfies operator để type-check mà không mất inference. Đây là những pattern thực tế tôi áp dụng trong mọi dự án TypeScript.

QK
Quang Khải·10 phút đọc
421 63 287

Redis patterns thực tế: caching, rate limiting, queue, và pub/sub trong một app

Redis không chỉ là một cache đơn giản. Tôi sẽ show cách dùng Redis cho 4 mục đích khác nhau trong cùng một ứng dụng: distributed cache với invalidation, sliding window rate limiter, job queue với BullMQ, và real-time event bus — không xung đột nhau.

QK
Quang Khải·14 phút đọc
276 38 178