The static-all Split - Dividing Zillow's JavaScript Monolith Repository
Bài tóm tắt Zillow 2017 3. Quy mô lớn Độ khó: Trung bình
Zillow · 2017 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- Năm 2012, dự án "The Great Schism" tách mọi tài nguyên tĩnh (JS, CSS, ảnh, template) khỏi ứng dụng monolith Java vào một repo tên static-all.
- Bốn năm sau: hơn 30 team đều sửa static-all. Code từ 9 file JS (1.119 dòng, 4/2007) lên 1.386 file JS (291.632 dòng), 1.078 file LESS, 6.071 ảnh (5/2016).
- Phát hành hằng tuần: các team dồn merge vào
developcùng lúc, xung đột; toàn bộ front-end deploy thành một gói, lỗi ở một tính năng nhỏ phải rollback cả front-end; build bằng công cụ Java (Maven) hơn 30 phút, gói vài trăm MB.
Thay đổi chính
- Tách static-all thành nhiều bundle theo tính năng (không theo team), mỗi bundle chứa mọi file tĩnh của tính năng; phụ thuộc giữa bundle được phép nhưng một chiều; build task dùng chung.
- Kiểm kê từng file trong một bảng "Ownership Map", gán team; code cũ ít dùng (trang SEO đuôi dài) để lại.
- Quy trình mỗi bundle: tạo repo, chuyển file, xoá bản gốc. JS không phải sửa tham chiếu vì dịch vụ JS loader biết mọi module theo tên duy nhất, trang tham chiếu theo tên bundle.
- Test tự động qua endpoint kiểm tra của loader: trùng module (copy mà quên xoá), thiếu phụ thuộc, và phụ thuộc vòng (công cụ vẽ đồ thị từ hack week).
- Các team chia đợt theo roadmap; kênh Slack, email, wiki, epic JIRA.
- Sau dự án: static-all khoá quyền, chỉ vài gatekeeper được xoá. Số bundle 1 → 60, build static-all 30 → 8 phút, thay đổi mỗi tháng trong static-all 300 → 12, người commit mỗi tháng 75 → 3.
Vì sao
- Repo và gói deploy chung buộc mọi team đi chung lịch phát hành và chung rủi ro rollback; tách theo tính năng trả lại quyền ship độc lập (Monolith và microservices — đi và quay lại, CI và build ở quy mô lớn).
- Lớp gián tiếp (loader theo tên module) làm việc dời file gần như không phải sửa code gọi (Kiến trúc frontend).
Bài học cho SWE
- Tách theo tính năng, giữ phụ thuộc một chiều, và có test tự động bắt phụ thuộc vòng mới.
- Không cần chuyển hết code cũ: khoá repo cũ để nó chỉ còn được xoá.
- Dự án chạm mọi team cần lịch theo đợt và kênh truyền thông riêng.
Liên quan
#static-all#JS monorepo split#The Great Schism 2012#feature bundles#JS loader service#circular dependency detection#ownership map#weekly release#Maven build 30 min
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (2)