Migrating Doximity's iOS Newsfeed to SwiftUI Without Disrupting Users or Development

Bài tóm tắt Doximity 2026 4. Điều chỉnh Độ khó: Trung bình

Doximity · 2026 · 4. Điều chỉnh · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Newsfeed là màn hình được dùng nhiều nhất của app iOS. Feed là server-driven: server chọn card, section trong mỗi card và thứ tự; app sở hữu cách vẽ và hành vi của từng loại section đã biết.
  • State và logic của từng section nằm trong reducer (The Composable Architecture), không nằm trong view. Bản cũ là UITableView + diffable data source, mọi section là view UIKit. Nó chạy ổn nhiều năm nhưng thêm một loại section phải làm view, layout, nối vào feed, analytics, sizing, reuse.

Thay đổi chính

  • Lá trước: giữ nguyên khung feed, chuyển từng section sang SwiftUI và hiện bên trong cell UIKit sẵn có bằng UIHostingConfiguration. UIKit vẫn sở hữu list, reuse, cuộn; rủi ro giới hạn trong section vừa chuyển; section mới viết thẳng bằng SwiftUI, nên migration thành việc thường ngày chứ không tranh với việc sản phẩm.
  • Đảo chiều cầu nối: khi đủ section đã chạy ổn ở production, thay UITableView bằng ScrollView + LazyVStack của SwiftUI; section UIKit còn lại bọc bằng UIViewRepresentable với kích thước khai báo rõ.
  • Kiểm và phát hành: checklist ngoài so khớp hình ảnh còn có sizing của view lồng khi nội dung và cỡ chữ đổi; unit test cho state, UI test tự động cho hành trình chính, QA tay cho các tổ hợp nội dung do server sinh. Bật cho một phần nhỏ người dùng, theo dõi analytics, mở rộng dần, có đường lùi.
  • Gỡ giàn giáo: khi ổn định thì xoá view controller loading và container cũ, loading chuyển vào SwiftUI, một số hành vi navigation bar tự làm đổi sang mặc định của nền tảng.
  • Dựng benchmark cuộn tự động trên card thật: FPS trung bình, frame trễ, vượt ngân sách frame, p50/p95/p99 khoảng cách frame, làm mốc so cho mọi thay đổi sau.

Vì sao

  • Viết lại trên nhánh dài rồi ship sau vài tháng thì rủi ro tích hợp và sản phẩm quá cao. Theo Doximity, ranh giới sẵn có (logic tách khỏi view, feed ghép từ section) là thứ làm migration tăng dần khả thi.

Bài học cho SWE

  • Tìm một ranh giới ổn định, giữ hành vi qua ranh giới đó, và chỉ dời quyền sở hữu khi đường mới đã tự chứng minh ở production.
  • Cầu nối chạy được hai chiều cho phép đổi cả lá lẫn khung mà không có ngày chuyển một lần.
  • "Xong" là lúc giàn giáo cũ hết việc để làm; đo hiệu năng bằng benchmark lặp lại được thay cho cảm giác.

Liên quan