Taking PHP Seriously

Bài tóm tắt Slack 2016 2. Tăng trưởng Độ khó: Dễ

Slack · 2016 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc

Bối cảnh

  • Slack viết phần lớn logic server bằng PHP. Đây là lựa chọn lạ vào năm 2016, dù Facebook, Wikipedia, WordPress, Etsy… đều thành công với nó.
  • Đây là bài bình luận/lập luận, không phải postmortem; gần như không có số liệu của chính Slack.

Thay đổi chính

  • Lập luận chính: tách "PHP ngôn ngữ" (tệ) khỏi "PHP môi trường" (tốt). Ba ưu điểm của môi trường:
    1. Trạng thái: mỗi request bắt đầu từ con số không. Bug ở request t không ảnh hưởng request t+1, tức là có sẵn một dạng cô lập lỗi.
    2. Concurrency: mỗi request một luồng; muốn song song thì gọi HTTP bất đồng bộ (shared-nothing, copy vào/copy ra), an toàn hơn khoá + trạng thái chung.
    3. Workflow: "nghĩ, sửa, tải lại trang", không phải khởi động lại server. Năng suất cộng dồn qua vòng đời dự án.
  • Thừa nhận các lỗi của ngôn ngữ: ép kiểu bất ngờ (123 == "123foo" là true), ngữ nghĩa tham chiếu/giá trị lẫn lộn, triết lý "cố chạy tiếp bằng mọi giá" (chia cho 0 trả về false), thư viện chuẩn không nhất quán.
  • Đường nâng cấp:
    • HHVM (JIT): Facebook báo hiệu quả CPU tăng 11,6 lần, Wikipedia 6 lần. Slack đã chuyển môi trường web sang HHVM và thấy latency giảm rõ ở mọi endpoint, nhưng chưa có số đo CPU so sánh tương đương.
    • Hack: kiểu tĩnh dần dần (gradual typing), áp cho từng phần codebase; type checker chạy nền nên vẫn giữ workflow "tải lại trang". Lúc viết bài Slack mới bắt đầu chuyển sang Hack.

Vì sao

Theo Slack (tác giả): ưu điểm của môi trường (cô lập lỗi, concurrency an toàn, năng suất) lớn hơn tác hại của ngôn ngữ. Hack/HHVM cho một lộ trình thêm kiểu tĩnh và hiệu năng sau khi đã phát triển, chỉ ở chỗ đáng làm.

Bài học cho SWE

  • Đánh giá công nghệ theo toàn bộ môi trường chạy và vòng lặp phát triển, không chỉ theo cú pháp.
  • Cải tiến dần thay vì viết lại: gradual typing cho phép nâng chất lượng codebase lớn mà không phải dừng lại.
  • Mô hình "mỗi request một trạng thái sạch" tự nhiên cô lập lỗi. Đây cũng là lý do Instagram cần pre-fork + copy-on-write (Instagram 2017), dù hai bài nói về hai runtime khác nhau.

Liên quan