Đi tới nội dung

Khám phá

Toàn bộ bài viết, ghi chép và hướng dẫn — tìm kiếm, lọc theo chủ đề và cấp độ, hoặc duyệt theo năm.

Hoặc đọc theo chuỗi

Phân tích bundle và tree shaking: trong bundle có gì, vì sao nó ở đó

Cách đọc bundle analyzer năm 2026 (next analyze, rollup-plugin-visualizer, source-map-explorer), tree shaking thật sự hoạt động thế nào với ESM, sideEffects, barrel file và CommonJS, những cái bẫy quen thuộc như moment và lodash, dependency trùng lặp, polyfill, và đặt ngân sách bundle trong CI với size-limit.

Công cụ & quy trình9 phút

CORS và cross-origin isolation chuyên sâu: origin và site, preflight, credentials, CORP, COEP, COOP và Fetch Metadata

Mô hình cross-origin của trình duyệt từ gốc: Same-Origin Policy chặn gì, CORS nới lỏng gì và không bao giờ bảo vệ gì, preflight và credentials, bug cache vì thiếu Vary: Origin, allowlist nguy hiểm, rồi CORP, COEP, COOP, Fetch Metadata và SameSite — kèm cấu hình NestJS và Next.js làm cho đúng.

Frontend & giao diện20 phút

Threat modeling cho team sản phẩm: STRIDE, sơ đồ luồng dữ liệu và ranh giới tin cậy, từ buổi họp 60 phút tới ticket

Cách mình chạy threat modeling thực tế cho một team sản phẩm: bốn câu hỏi, vẽ DFD với trust boundary, đi STRIDE từng phần tử trên một hệ thống thật có SPA, API, Postgres, S3, webhook thanh toán và admin panel, chấm rủi ro đơn giản, biến threat thành ticket và giữ threat model sống trong repo.

Hệ thống & kiến trúc26 phút

Model Context Protocol thực chiến: xây MCP server production bằng TypeScript

MCP không phải phép màu, chỉ là một giao thức JSON-RPC được thiết kế tốt. Bài này giải thích host, client, server, các primitive và transport theo spec 2026-07-28, rồi dựng một server TypeScript chỉ đọc cho dữ liệu đơn hàng: thiết kế tool, phân trang, test bằng Inspector, OAuth cho remote server và những lỗ hổng bảo mật cần chặn.

Công cụ & quy trình20 phút

Viết PRD mà dev ước lượng được, QA test được: cấu trúc, requirement kiểm thử được và NFR đo được

Một PRD tốt không dài, nó rõ. Bài này đi qua cấu trúc PRD, cách viết requirement kiểm thử được, NFR đo được theo ISO 25010 (hiệu năng p95, SLO, bảo mật, Nghị định 13 và luật dữ liệu cá nhân, WCAG 2.2 AA), truy vết từ mục tiêu đến test, kèm một PRD mẫu hoàn chỉnh.

Học hỏi & sự nghiệp30 phút

Event Storming thực chiến: từ bức tường sticky note đến bounded context, aggregate và code NestJS

Event Storming là cầu nối giữa phân tích nghiệp vụ và thiết kế phần mềm. Bài này đi qua ba cấp độ workshop, ngữ pháp sticky note, cách điều phối, một ví dụ đặt lịch khám thật, cách tìm bounded context, context mapping và biến kết quả thành aggregate, command, event trong NestJS.

Hệ thống & kiến trúc27 phút

Mô hình hoá quy trình với BPMN 2.0: từ bản vẽ as-is tới phần mềm chạy được

BPMN không phải để vẽ cho đẹp hồ sơ dự án mà để tìm ra chỗ quy trình đang lãng phí: handoff, vòng làm lại, thời gian chờ. Bài này đi qua tập con ký hiệu đủ dùng, các lỗi mô hình hoá hay gặp, một ví dụ as-is/to-be về phê duyệt mua hàng có số đo, và cách đi từ mô hình tới state machine, workflow engine và user story.

Học hỏi & sự nghiệp29 phút

User story và acceptance criteria: viết sao cho dev làm được, tester kiểm được

Một user story tốt không nằm ở câu chữ “As a… I want… so that…” mà ở cuộc trò chuyện và các ví dụ đi kèm. Bài này đi qua 3C, INVEST với ví dụ xấu và tốt, story mapping, các pattern chia nhỏ story, acceptance criteria dạng rule và example, Gherkin viết đúng cách, Example Mapping và cách biến AC thành test tự động.

Học hỏi & sự nghiệp28 phút

Khai thác yêu cầu cho kỹ sư: hộp đồ nghề của business analyst, từ phỏng vấn tới assumption log

Yêu cầu được nói ra hiếm khi là nhu cầu thật. Bài này đi qua bộ công cụ của business analyst dành cho kỹ sư: bản đồ stakeholder, kỹ thuật phỏng vấn, shadowing, Jobs-to-be-Done, prototype, assumption log, phân loại yêu cầu kiểu BABOK, và một case study duyệt hoá đơn B2B ở công ty Việt Nam.

Học hỏi & sự nghiệp30 phút

Micro-frontends nói thật: khi nào đáng làm, Module Federation 2.0 chạy ra sao và cái giá phải trả

Micro-frontends giải quyết bài toán tổ chức — nhiều team deploy độc lập — chứ không phải bài toán kỹ thuật. Bài này so sánh năm cách ghép frontend, đi sâu vào Module Federation 2.0 (shared singleton, version skew, manifest, type, fallback) và chỉ ra khi nào một monorepo Turborepo là câu trả lời tốt hơn.

Hệ thống & kiến trúc22 phút

Đưa việc nặng ra khỏi main thread: Web Worker, transferable, SharedArrayBuffer và worker pool

Web Worker không phải phép màu cho mọi trang chậm. Bài này đi qua khi nào đáng chuyển việc sang worker, cái giá của structured clone, transferable, SharedArrayBuffer và COOP/COEP, tự viết RPC kiểu Comlink, cấu hình bundler, worker pool, huỷ việc bằng AbortSignal, ví dụ thật và các lựa chọn thay thế như scheduler.yield.

Hiệu năng19 phút

TypeScript ở tầng type cho API contract không thể dùng sai

Conditional type và infer, key remapping, template literal type biến "/users/:id/posts/:postId" thành params có type, một fetch client suy ra từ route map, lỗi có type, branded ID, satisfies và const type parameter, cầu nối Zod để type không nói dối — và khi nào nên dừng.

Công cụ & quy trình18 phút

Server state là cache, không phải state: TanStack Query v5 chuyên sâu

Dữ liệu từ server không thuộc về bạn — bạn chỉ giữ một bản sao có hạn dùng. Bài này đi sâu TanStack Query v5 theo góc nhìn cache: thiết kế query key, staleTime và gcTime, invalidation, optimistic update có rollback, Suspense, hydration với Next.js App Router, infinite query và khi nào không nên dùng nó.

Frontend & giao diện19 phút

Chi phí và độ trễ của LLM trên production: đếm token, caching, routing và fallback

Chuyện gì xảy ra với một tính năng LLM khi traffic thật đổ về: độ trễ thật sự đến từ đâu, bộ đếm token và chi phí theo từng tính năng kèm ngân sách theo tenant, cấu trúc prompt để tận dụng prompt caching của provider, exact và semantic caching, routing model, cắt gọt context, batch API, gọi song song, retry có fallback và circuit breaker, và dashboard mình theo dõi.

Hệ thống & kiến trúc9 phút

Mô hình tư duy đúng cho React Server Components: hai module graph, một ranh giới

"use client" không đánh dấu loại component mà đánh dấu điểm bắt đầu của client graph. Bài này dựng lại mô hình tư duy cho RSC trong Next.js 16: thứ gì đi qua ranh giới, data fetching đặt ở đâu, waterfall, streaming và những lỗi khiến bundle phình hoặc lộ dữ liệu.

Frontend & giao diện19 phút

Streaming SSR và Suspense: chuyện gì thực sự xảy ra trên dây

Streaming HTML hoạt động thế nào ở tầng giao thức, cách đặt Suspense boundary, tránh waterfall, selective hydration, Partial Prerendering trong Next.js 16, tác động lên TTFB, LCP và CLS, những proxy âm thầm buffer stream và cách xử lý lỗi khi status 200 đã được gửi đi.

Hiệu năng9 phút

Quy trình làm frontend cùng AI mà vẫn trụ được trên production

Coding agent thật sự giúp được team frontend ở đâu và âm thầm hỏng ở đâu, cách cho chúng context bằng AGENTS.md và task nhỏ, lên plan trước khi code, vòng lặp kiểm chứng, review PR do AI viết, rủi ro supply chain như slopsquatting, và những kỹ năng nào quan trọng hơn với kỹ sư mid và senior.

Công cụ & quy trình9 phút

Đánh giá tính năng LLM: biết nó chạy đúng và giữ cho nó đúng

Xây golden dataset từ usage thật, kiểm tra deterministic trước, LLM-as-judge với rubric và các bias của nó, so sánh pairwise, chạy eval trong CI khi đổi prompt hay model, theo dõi chi phí và độ trễ cùng chất lượng, tín hiệu online, tracing, và cách tránh overfit bộ eval.

Hệ thống & kiến trúc9 phút

Caching trong Next.js 16: Cache Components, use cache và Partial Prerendering thực chiến

Next.js 16 bỏ kiểu cache ngầm của App Router cũ: mọi thứ dynamic theo mặc định, bạn tự chọn chỗ cần cache bằng use cache. Bài này đi qua static shell và dynamic hole, cache key, cacheLife, cacheTag với updateTag, revalidateTag, refresh, và một trang sản phẩm e-commerce làm từ đầu đến cuối.

Hệ thống & kiến trúc26 phút

Tool calling và generative UI: khi LLM gọi code của bạn và trả về component

Tool calling thật ra là một vòng lặp do code của bạn điều khiển. Bài này đi qua cách định nghĩa tool bằng schema, agent loop có giới hạn bước, xử lý args sai, message list với part có kiểu, stream args dở dang, render tool call thành component và bắt người dùng xác nhận trước những tool có side effect.

Frontend & giao diện9 phút

View Transitions API: animation chuyển trang và shared element không cần thư viện

Cơ chế snapshot và cây pseudo-element của View Transitions, startViewTransition trong SPA, transition giữa hai document, view-transition-name, view-transition-class và types, shared element từ danh sách sang trang chi tiết, reduced motion, những bẫy hiệu năng, và cách dùng component ViewTransition của React trong Next.js 16.

Frontend & giao diện8 phút

RAG trả lời đúng trong thực tế: chunking, hybrid search với pgvector, reranking và đánh giá

Demo RAG thì ai cũng dựng được trong một buổi chiều; làm cho nó trả lời đúng mới là phần khó. Bài này đi qua một pipeline RAG viết bằng TypeScript trên PostgreSQL/pgvector: chunking theo cấu trúc, hybrid search gộp bằng RRF trong một câu SQL, reranking, phân quyền trước khi xếp hạng, trích dẫn và cách đo chất lượng bằng con số.

Hệ thống & kiến trúc30 phút

UX pattern cho tính năng AI: thiết kế giao diện cho kết quả xác suất từ góc nhìn frontend

Cách mình thiết kế và xây UI cho những tính năng mà mỗi lần chạy lại ra một kết quả khác: ngân sách độ trễ và streaming, gợi ý có thể chấp nhận, sửa hoặc bỏ qua với state model có type, undo và preview, nguồn trích dẫn trung thực, feedback nối vào analytics, xử lý lỗi và accessibility.

Frontend & giao diện9 phút

Core Web Vitals: hiểu đúng LCP, INP, CLS và cách tối ưu

Ba chỉ số Google dùng để đo trải nghiệm thật của người dùng — đo thế nào, được tính ra sao, vì sao ảnh hưởng SEO, và quy trình cụ thể để tìm đúng nguyên nhân rồi sửa.

Hiệu năng14 phút

Input đa phương thức cho tính năng LLM: gửi ảnh, PDF và audio từ trình duyệt

Phần frontend khi gửi file cho LLM: file input, kéo thả và paste, nhận diện loại file bằng magic bytes, thu nhỏ ảnh và xoá EXIF ngay trên trình duyệt, ảnh HEIC từ iPhone, PDF, ghi âm bằng MediaRecorder, upload qua presigned URL có progress và huỷ, dọn object URL, accessibility và những gì server vẫn phải kiểm tra.

Frontend & giao diện9 phút

List virtualization từ con số 0: render 100.000 dòng mà vẫn mượt

Tự tay viết một virtual list bằng React + TypeScript: toán windowing với số liệu cụ thể, overscan, chiều cao thay đổi với prefix sum và binary search, đo bằng ResizeObserver, chống giật khi scroll, accessibility — và khi nào không nên virtualize.

Hiệu năng18 phút

Structured output cho tính năng LLM: khi bạn cần dữ liệu, không cần văn xuôi

Cách mình xây tính năng sản phẩm trên LLM mà kết quả là JSON có kiểu: chế độ structured output của các API, định nghĩa schema bằng Zod, xử lý refusal và output bị cắt, retry kèm sửa lỗi, version prompt trong code, kỳ vọng đúng về temperature và cách thiết kế schema mà model làm tốt.

Hệ thống & kiến trúc9 phút

React Compiler trong thực tế: đưa vào một codebase đang chạy

React Compiler thực sự làm gì, các Rules of React nó dựa vào, ESLint plugin, rollout từng phần bằng annotation mode và "use no memo", xử lý useMemo/useCallback cũ, cách kiểm chứng nó chạy, các lý do bail out thường gặp, thư viện bên thứ ba và chi phí build.

Hiệu năng10 phút

Ghi chép như một kỹ sư

Vì sao mình bắt đầu ghi lại những gì học được khi làm việc, định dạng đơn giản mình dùng, và cách ghi chép dần thành bài viết.

Học hỏi & sự nghiệp2 phút

Cascade layers và @scope: chấm dứt cuộc chiến specificity trong codebase lớn

Vì sao CSS của dự án lớn luôn trượt dần về !important, cách @layer thay đổi luật thắng thua của cascade, những bẫy như style không nằm trong layer và !important bị đảo ngược, @scope với donut scope và proximity, các gotcha của native nesting, và lộ trình đưa một codebase cũ vào layer.

Frontend & giao diện9 phút

Signals và fine-grained reactivity: cơ chế bên dưới và khi nào thật sự cần

Signals theo dõi dependency thế nào, vì sao push-pull cho cập nhật không bị glitch, Solid, Preact, Angular và Vue dùng chúng ra sao, đề xuất TC39 đang ở đâu, React Compiler thay đổi được gì, và những cái bẫy khi chạy production — kèm một bản cài đặt signal nhỏ bằng TypeScript.

Hệ thống & kiến trúc9 phút

Ước lượng công việc frontend một cách trung thực

Vì sao ước lượng gần như luôn sai, cách chia nhỏ công việc theo trạng thái, accessibility, responsive và i18n, dùng khoảng và độ tự tin thay cho một con số, khi nào cần spike, cách nói chuyện với PM và cách so sánh ước lượng với thực tế để giỏi dần lên.

Học hỏi & sự nghiệp7 phút

Debug như senior với Chrome DevTools

Conditional breakpoint, logpoint, DOM breakpoint, XHR/fetch breakpoint, các tiện ích console như debug(), monitorEvents(), $0, copy(), tab Network, Performance và local overrides — cùng quy trình bốn bước mình dùng để tìm ra nguyên nhân thay vì đoán.

Công cụ & quy trình8 phút

Caching cho frontend developer: từ HTTP cache đến CDN và data cache

Cache-Control, ETag, tên file có hash, s-maxage và stale-while-revalidate ở CDN, service worker, staleTime trong TanStack Query — mỗi lớp cache làm gì, nên đặt header thế nào cho từng loại tài nguyên, và những lỗi khiến người dùng thấy dữ liệu cũ.

Hiệu năng9 phút

Modal dialog dễ tiếp cận: dùng thẻ dialog native cho đúng

Từ showModal(), top layer, ::backdrop đến quản lý focus, gắn nhãn, khoá cuộn, đóng khi bấm nền và dialog lồng nhau — kèm một component React nhỏ và cách tự kiểm tra bằng bàn phím và screen reader.

Frontend & giao diện8 phút

Feature flag ở frontend: phân loại, đánh giá, rollout và dọn dẹp

Feature flag giúp tách deploy khỏi release, nhưng dùng sai thì thành nợ kỹ thuật và giao diện nhấp nháy. Bài này đi qua bốn loại flag, đánh giá flag ở server hay client, định nghĩa flag có kiểu bằng TypeScript, rollout dần, A/B test và quy trình dọn flag.

Hệ thống & kiến trúc8 phút

Code Splitting và Lazy Loading trong React

Hướng dẫn thực tế giúp giảm lượng JavaScript tải ban đầu bằng cách kết hợp lazy loading theo route và theo component.

Hiệu năng1 phút

Từ mid-level lên senior frontend: điều gì thật sự thay đổi

Lên senior không phải là code nhanh hơn hay biết nhiều framework hơn. Đó là chuyển từ hoàn thành task sang chịu trách nhiệm cho kết quả. Bài này là những hành vi cụ thể, một bảng tự đánh giá, và các cái bẫy mình từng rơi vào.

Học hỏi & sự nghiệp9 phút

Form trong React 19: action, useActionState, useFormStatus và Server Actions

React 19 đưa form về gần với HTML hơn: prop action, trạng thái pending, cập nhật optimistic và Server Actions. Bài này đi qua cách mình dựng một form đăng ký đầy đủ — validate hai phía, trả lỗi theo field, accessible, và chạy được cả trước khi JavaScript tải xong.

Frontend & giao diện8 phút

Code review là một kỹ năng: cách review và cách nhận review

Review nên nhìn gì trước, viết comment sao cho người nhận học được thay vì tự ái, giữ PR nhỏ, xử lý bất đồng — và để máy lo phần format để con người tập trung vào thứ quan trọng.

Học hỏi & sự nghiệp9 phút

State machine cho UI: loại bỏ những trạng thái không thể xảy ra

Vì sao isLoading, isError và data cùng tồn tại là mầm mống của bug, cách mô hình hoá UI bằng trạng thái và sự kiện, một state machine có type bằng useReducer cho luồng submit form, và khi nào nên dùng thư viện statechart.

Hệ thống & kiến trúc7 phút

Xây dựng UI production với shadcn/ui

Vì sao sở hữu mã nguồn component tốt hơn cài một hộp đen — và shadcn/ui chọn đúng mức trừu tượng ở đâu.

Frontend & giao diện1 phút