Kỹ sư phần mềm · TikTok Search · Singapore

Tôi làm việc ở tầng bên dưới.

Có những hành vi tưởng như chỉ app native lớn mới làm được: hero transition, kéo tua waveform, cắt video chính xác tới từng khung hình, một runtime Node không cần server. Tôi xây những thứ đó ở tầng bên dưới, nơi code sản phẩm thường dừng lại, rồi mở mã nguồn. Hiện có khoảng 224.000 lượt cài mỗi tháng đang dựa vào chúng.

Lặn xuống

Cuộn để xuống một tầng

223.945lượt cài từ npm trong tháng qua, cộng tất cả package
824sao GitHub của các repo trên trang này
395người theo dõi trên GitHub
1.040.805lượt xem trên 88 bài viết Viblo

Cập nhật ngày 30 tháng 9, 2026, lấy từ API công khai của GitHub, npm và Viblo.

L1 · TS · Lynx · React

Hiện tại: hiệu năng client cho TikTok Search.

Từ tháng 2/2024 tôi làm về hiệu năng client cho TikTok Search ở Singapore: màn hình đầu tiên hiện nhanh tới đâu, kết quả cuộn mượt ra sao, và pipeline ảnh, video tốn bao nhiêu tài nguyên bên trong một app iOS và Android rất lớn. Tôi có thể kể về cách làm, còn con số thì phải ở lại công ty. Vì vậy mọi thứ khác trên trang này đều là code của chính tôi.

Công việc chính · 2024 → nay

TikTok Search

Tốc độ render màn hình đầu, độ mượt khi cuộn danh sách, chi phí của media. Đo trên thiết bị thật chứ không tranh luận suông trong buổi review.

UI đa nền tảng

Lynx

Phần lớn việc gần đây của tôi xoay quanh Lynx, framework đa nền tảng mã nguồn mở: TypeScript ở trên, render native ở dưới, và tối ưu hiệu năng phải đứng vững ở cả hai phía.

Android · iOS · JS

Xuyên tầng là chuyện thường

Một lỗi hiệu năng hiếm khi chỉ nằm ở một tầng. Việc của tôi là lần theo nó từ component, qua bridge, vào Kotlin hay Swift, xuống tận khung hình bị rớt.

Quy trình

Làm việc cùng AI

Tôi vận hành các AI agent như một nhóm nhỏ: một agent lên kế hoạch, một agent viết code, một agent review, một agent kiểm tra trên máy thật. Giá trị nằm ở hàng rào an toàn: diff nhỏ, kiểm tra lặp lại được, và luôn có người duyệt cuối.

planbuildreviewverify
Quan trọng là vòng lặp, không phải sự ồn ào: mỗi bước đều để lại thứ mà bước sau kiểm tra được.

Công cụ thuộc tầng này

konva-inspector

React DevTools dành cho app canvas: xem cây scene, profiler cho việc vẽ và heatmap cho biết layer nào vẽ lại nhiều nhất. Đã lên store của Chrome, Firefox và Edge.

  • 45 sao
  • Chrome · Firefox · Edge

Nhàm chán nhưng gánh cả hệ thống

node-scp

Một SCP client cho Node.js dùng promise. Đã sáu năm tuổi, vẫn đều đặn ra bản mới, và một mình nó có lượt tải nhiều hơn tất cả thư viện React Native của tôi cộng lại. Không có nó, khá nhiều script deploy sẽ gãy.

115.496lượt cài / tháng

L2 · Swift · Kotlin

Native module: mười một cái, cùng một kỷ luật.

Swift và Kotlin trên New Architecture của React Native, không có animation nào chạy trên JS thread. Tổng cộng 108.388 lượt cài mỗi tháng, và tất cả vẫn đang được bảo trì, điều mà phần lớn dự án cá nhân không làm được. Bốn trong số đó được dựng lại cho web ngay bên dưới, để bạn chơi thử thay vì chỉ đọc.

Swift · Kotlin · FFmpeg

react-native-video-trim

79.182lượt cài / tháng · 176 sao

Trình cắt video mà hàng chục nghìn app tin dùng trên production. Khi thư viện FFmpeg nó phụ thuộc bị bỏ rơi, tôi dựng lại chính thư viện đó: một bản ffmpeg-kit do cộng đồng duy trì cho Android, iOS và React Native, hỗ trợ page size 16 KB của Android 15.

Swift · Kotlin · Fabric

react-native-shared-hero

38sao

Chuyển cảnh shared-element mượt mà giữa các màn hình trong React Native. Ảnh hoặc thẻ bay từ màn này tới đúng vị trí của nó ở màn tiếp theo, khớp theo id nên dùng được với bất kỳ router nào. Chuyển động chạy native bằng Swift và Kotlin trên Fabric, còn cử chỉ vuốt quay lại và kéo để đóng sheet trên iOS bám theo tay từng khung hình.

README có hẳn một bảng so sánh với các thư viện lâu đời, và một mục tên là “Khi nào các lựa chọn khác vẫn hợp hơn”.

Sân chơi

Bản web viết riêng cho trang này, mô phỏng gần đúng hành vi native. Bản thật chạy trên UI thread của điện thoại bạn.

Chuyển cảnh shared-element

react-native-shared-hero

Địa điểm

Chạm vào một thẻ để mở. Bấm quay lại, Esc hoặc kéo xuống để trở về.

Bộ sưu tập loader

react-native-loader-kit

BallScale

Vài mẫu trong hơn 30 kiểu loader. Chọn một mẫu để xem tên.
0:00 / 0:24
Kéo ngang trên waveform, hoặc focus vào rồi dùng phím mũi tên.

Ký vào đây

Ký vào đây. Nét càng nhanh càng mảnh, như bút thật.

L3 · C · Rust → Wasm

Runtime: dev server ngay trong tab, socket trong một mạng lưới.

Bên dưới framework là runtime, bên dưới runtime là syscall, bộ nhớ và dây mạng. Đây là hai dự án sống ở tầng này.

TypeScript · Rust/Wasm · MIT

vivari

72sao

Node, Bun và Python chạy ngay trong tab trình duyệt của bạn. Cài npm thật, dev server thật có hot reload, chạy được cả app Express và Next.js, mà không có server nào làm hộ. Mã nguồn mở (MIT), một lựa chọn thay cho WebContainers của StackBlitz.

“Không phải hàng giả lập: Vivari chạy đúng lib/ thật của Node, npm, yarn, pnpm thật, và CPython thật. Không có server nào làm hộ.”trích README của vivari

Cách hoạt động: mã gốc của Node chạy trong Web Worker, file nằm trên một ổ đĩa ảo viết bằng Rust/Wasm, và một Service Worker đóng vai localhost.

Chạy thử trên vivari.run

Dev server ngay trong tab này

vivari

# bấm Chạy để khởi động một dev server ngay tại đây

Chưa có gì trên localhost.

0 Số server đã dùngMọi thứ ở trên đều chạy trong tab này.0 request do tab của bạn phục vụ
Thử bản thật trong vivari Studio Đây là bản mô phỏng sát thực tế. Studio mới chạy bản thật.

TypeScript · Kubernetes · Grafana

socket.io-mesh-adapter

300kkết nối đồng thời

Đưa Socket.IO vượt qua nút thắt broker: một mạng lưới đánh đổi N² kết nối để không còn bước nhảy nào qua broker. Đã benchmark 300.000 kết nối đồng thời trên mười pod Kubernetes, kèm metric Prometheus, dashboard Grafana dựng sẵn và cơ chế loại bỏ consumer chậm khi bị backpressure.

Cũng ở tầng này

Mesh và broker

socket.io-mesh-adapter
0 kết nối0 bước nhảy mỗi lần phát
Phát một tin nhắn và đếm số bước nhảy.

L4 · GPU · khung hình

Lab: dựng lại hành vi của các app nổi tiếng từ gốc.

Thói quen đều đặn nhất trong lịch sử GitHub của tôi: chọn một hành vi mà một sản phẩm nổi tiếng đang có, tìm hiểu xem họ thật sự làm thế nào, rồi dựng lại cho tới khi nó chạy giống hệt.

Viblo · 2.905 người theo dõi

Một triệu lượt đọc, toàn bằng tiếng Việt.

88 bài trên Viblo, 1.040.805 lượt xem và 5.367 lượt vỗ tay, bài gần nhất từ 12 tháng 4, 2025. Đây là kho lưu trữ hơn là tín hiệu hiện tại: Docker, Kubernetes, micro-frontend và Vue không còn là thứ tôi làm hằng ngày, nhưng đó là nơi khá nhiều bạn dev Việt lần đầu làm quen với các công cụ này.

2014 → 2026

Chặng đường tới đây.

Chọn một chặng, hoặc dùng phím mũi tên.

TikTok Search

Singapore · hiệu năng client

Khởi động nguội, hiệu năng cuộn và danh sách, chi phí pipeline ảnh và video trong một app iOS và Android rất lớn. Gần đây làm nhiều với Lynx và các bài toán xuyên tầng.

ducmai.me

Bạn đang làm về runtime trên trình duyệt, nội tại React Native, hay một hệ thống phải chịu tải lớn? Cứ nhắn cho tôi.

↑↓ để chọn · Enter để chạy · Esc để đóng