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.
Trang này có âm thanh. Bạn hãy bật loa lên nhé.
Kỹ sư phần mềm · TikTok Search · Singapore
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.
Cuộn để xuống một tầng
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
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
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
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
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
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.
Công cụ thuộc tầng này
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.
Nhàm chán nhưng gánh cả hệ thống
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.
L2 · Swift · Kotlin
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
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
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”.
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.
Địa điểm
BallScale
Ký vào đây
Các thành viên còn lại
L3 · C · Rust → Wasm
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
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.
# bấm Chạy để khởi động một dev server ngay tại đây
Chưa có gì trên localhost.
TypeScript · Kubernetes · Grafana
Đư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
L4 · GPU · khung hình
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.
Heatmap “xem lại nhiều nhất” phía trên thanh tua của YouTube
L1 · Hiện tạiRê chuột để xem trước video, theo cách của YouTube
L1 · Hiện tạiMổ xẻ cách Twitter chặn xem mã nguồn trang
L2 · NativeThư viện ảnh của Instagram: chụm, kéo và lật trang
L2 · NativeApp La bàn của iOS, có cả mặt số lẫn rung phản hồi
L2 · NativeLớp phủ pointer-location dành cho nhà phát triển Android, đóng gói thành module
L2 · NativeMàn hình splash có hiệu ứng mở ra kiểu Twitter, viết native
L3 · RuntimeNhúng frontend DevTools của Chrome và điều khiển qua Chobitsu
L3 · RuntimeMột codebase C, build WebAssembly kiểu lai
L4 · Khung hìnhThanh tiến trình vẫn mượt giữa hai lần cập nhật thời gian
L4 · Khung hìnhVì sao một requestAnimationFrame là chưa đủ
L4 · Khung hìnhChặn quay màn hình với video render bằng phần cứng, giống cách Netflix làm
Viblo · 2.905 người theo dõi
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.
3 tháng 1, 2021 · 234 vỗ tay · 16.103 lượt xem
Hành trình từ Việt Nam tới công việc kỹ sư phần mềm ở Singapore.
Đọc trên Viblo →15 tháng 2, 2024 · 177 vỗ tay · 11.801 lượt xem
Phỏng vấn kỹ sư phần mềm ở TikTok Singapore thực tế diễn ra thế nào.
Đọc trên Viblo →31 tháng 7, 2020 · 195 vỗ tay · 61.823 lượt xem
Nhập môn CI/CD với GitLab. Bài được đọc nhiều nhất.
Đọc trên Viblo →20 tháng 12, 2019 · 258 vỗ tay · 36.388 lượt xem
Dockerize một ứng dụng Node.js từng bước. Bài được vỗ tay nhiều nhất.
Đọc trên Viblo →11 tháng 10, 2020 · 168 vỗ tay · 37.279 lượt xem
Code tốt hơn, làm việc nhóm nhẹ đầu hơn với Husky, lint-staged và commitlint.
Đọc trên Viblo →2018 - 2025 · 88 bài
Các series viết từ 2018 tới 2025, phần lớn đi kèm một repo minh hoạ trong họ viblo-*.
Xem trên Viblo →2014 → 2026
Chọn một chặng, hoặc dùng phím mũi tên.
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.
Tình nguyện viên · làm từ xa
Tổ chức phi lợi nhuận dạy công nghệ cho học sinh Việt Nam. Tôi phụ trách độ ổn định và khả năng mở rộng.
Singapore · ứng dụng web
Xây ứng dụng web cho bộ phận kinh doanh và giao dịch.
Singapore · R&D
Nhận dạng giọng nói, API và hạ tầng cloud.
Singapore · R&D
Xử lý âm thanh dạng stream và phát hiện từ khoá trong giọng nói.
Thực tập và làm bán thời gian
FPT Software (C#, iOS), Hosco Software, Rabiloo (Laravel, Vue). Cũng là lúc những bài Viblo đầu tiên ra đời.
ducmai.me