Skip to content
This repository has been archived by the owner on Oct 13, 2021. It is now read-only.

Engineering doc template

Hoang Pham edited this page Feb 19, 2021 · 2 revisions

Theo như kinh nghiệm của tôi từ Google, engineering docs là để các thành viên trong team trao đổi và cùng đưa ra quyết định về thiết kế hệ thống. Ví dụ:

  • Một hệ thống phần mềm cần bao gồm những components nào?
  • Roll back, roll out, release, etc. như thế nào?
  • Alert ra sao
  • etc. Bộ documents này giúp mọi người hiểu dễ nắm bắt hơn về tổng thể của hệ thống và cũng như giúp mọi người đọc lại nếu có hiểu lầm. Để document được hiệu quả, người viết cần theo một template nhất định và cần liệt kê ra những yếu tố cần có của một hệ thống phần mềm (software system).

Sau đây là template mà mọi người cần follow:

Title

#1 #2
Author Tên người viết
Ngày viết MM/DD/YYYY
Lần sửa cuối MM/DD/YYYY
Reviewers personGithubId [✅], anotherPersonGithubId [❌], anotherGithubId [ ]

Tóm tắt về mục tiêu

Nói ngắn gọn về những điểm cần đạt được của project V.D: Tạo một service để authenticate user

Yêu cầu kĩ thuật
- Server cần support Firebase
Những yêu cầu khác
- ... 

Background and overview

Nói qua về mục đích tại sao lại cần project này, những khó khăn khi không có project này. Nếu có data cụ thể support những data đó thì càng tốt. Cho những project làm việc trực tiếp với trải nghiệm của người dùng (UX), cần viết rõ hơn hoặc có support từ market research trước khi design docs được bắt đầu. Tóm tắt qua những lợi ích khi project này được hoàn thành

Design chi tiết

Thiết kế của hệ thống, liệt kê bằng các hình vẽ (diagram) để người đọc hiểu được tổng quan của hệ thống (high level design). Sau đó người viết cần phải đưa ra design decision dựa trên tính chất của project (back-end/front-end).

  1. Tại sao những design đơn giản hơn lại không hợp lý? Nêu ra điểm mạnh/yếu của design này và tại sao lựa chon nó thay cho các design khác.
  2. Latency (có thể skip nếu mà có human facing task, i.e. front-end). Cụ thể hơn, người design cần phải hiểu được hệ thống này sẽ có bottlenecks ở đâu, và cần đặt ra latency target cho từng hệ thống. Cần đưa ra metrics cho hệ thống và tạo dashboard để theo dõi
  3. Scalability: hệ thống của bạn scale được như thế nào? Xem xét về lượng data (database, blob storage, etc.) và lượng traffic (request per second) nếu cần thiết.
  4. Reliability (có thể skip nếu làm front-end): Khi mất data thì bạn xử lý thế nào? Có cần thêm redundancy server/database để handle reliability không? Phương án đã có đã làm thế nào để giải quyết vấn đề reliability? Khi có partial data loss thì xử lý thế nào?
  5. Các hệ thống liên quan: Xem xét hệ thống này có liên quan như thế nào đến các hệ thống khác, và xử lý như thế nào khi hệ thống ngoài bị sập?
  6. Security: Tính bảo mật của hệ thống như thế nào?
  7. Test: bạn test hệ thống ra sao? Unit test, integrated test, load test?
  8. Monitoring: Theo dõi các thông số ra sao
  9. Alerts: Khi nào cần thông báo cho người trực (on-call) rằng hệ thống có lỗi và cần sửa gấp?
  10. Analytics: Có cần thêm hệ thống phân tích thông tin hay không?
  11. Communications: Cần những hình thức liên lạc như thế nào? v.d. Email, điện thoại, in-app notification, chat?
  12. Kế hoạch launch project: Tóm tắt về khối lượng công việc, tiến độ xử lý công việc, bao nhiêu người tham gia project, kế hoạc roll back khi có lỗi ra sao

Ước lượng tiến độ

Đưa ra các mục tiêu nhỏ mà project cần đạt được, và đạt được trong bao lâu. Có những yếu tố rủi ro nào sẽ đẩy lùi lại tiến độ của project? Khối lượng công việc và thời gian hoàn thành thực tế có gần được như dự kiến không?

Những việc cần làm tiếp theo

Những việc mà không thể hoàn thành trong project này hoặc timeline này, cần tiếp tục trong một project kế tiếp.