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

Yếu tố cần cho một code base để team work hiệu quả

Hoang Pham edited this page Feb 20, 2021 · 4 revisions
#1 #2
Author @hoangpham95
Trạng thái DRAFT/Reviewing/Approved
Ngày viết 02/20/2021
Sửa cuối 02/20/2021
Reviewers @hoangpham95 [ ]

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

Liệt kê ra các yêu cầu để code base được tối ưu cho việc hoạt động của nhóm, và các yêu cầu cơ bản để việc bảo trì thường xuyên (maintenance) dễ dàng nhất. Các yếu tố bao gồm:

  • Linting, code style and formatting
  • Design docs
  • Testing, including unit and integration test, and enable code coverage
  • Building và deploying

2. Tổng quan

Để một nhóm hoạt động được một cách trơn tru, những công việc liên quan đến nền móng của code base nên được thiết lập ngay từ lúc đầu để làm giảm những rào cản không cần thiết khi làm việc với code base đó. Một developer mới vào team nếu không quen với việc setup của code base sẽ mất rất nhiều thời gian để setup những yếu tố trên, và setup của developer đó có thể sẽ conflict với setup của team. Điển hình là việc linting của VSCode (prettier, eslint, etc.): nếu developer đó có setup sẵn global linting của họ, thì khi họ bắt đầu làm việc với code base của team, sẽ có nhiều code style được format không phù hợp với các tiêu chí của team.

Ngoài ra design docs là để những thành viên vào sau có cái nhìn tổng quan hơn về hệ thống phần mềm, giảm thời gian onboarding và giúp thành viên mới productive hơn trong công việc. Design docs cũng giúp những thành viên đã có trong team viết ra được những khó khăn trong khi làm project, cũng như timeline để giải quyết những khó khăn đó.

Việc viết test sẽ chủ yếu phụ thuộc vào thời gian của mỗi project, nhưng để một project hoạt động trơn tru nhất, test sẽ luôn luôn cần thiết. Unit test để đảm bảo logic của code hoạt động và integration test để đảm bảo toàn bộ hệ thống đang hoạt động với nhau.

Để project hoạt động trơn tru và developer dành phần lớn thời gian viết logic bằng code, việc deploying và building cũng là một yếu tố quan trọng. Building để đảm bảo project đã compile thành công, vượt qua hết test. Deploying là để đảm bảo project được shift lên production endpoint để đưa ra test trong team cũng như external users. Nếu việc deploy và build được tự động hoá từ đầu, developer sẽ giảm được rất nhiều thời gian để build và deploy thủ công, và nhiều thời gian hơn để viết code.

3. Chi tiết

Project của SneakGeek hiện tại sẽ chủ yếu là TypeScript (React Native và node.js), một ít Java, Objective-C và C++ cho React Native. Hiện tại có rất nhiều toolings cho TypeScript nói riêng và JavaScript nói chung. Chúng ta nên sử dụng những tooling dựa trên tiêu chuẩn của cộng đồng (industry and community standard) để dễ hơn cho việc bảo trì (maintenance). Do vậy, chúng ta nên sử dụng những tooling như sau:

  • Linting, formatting and code style:
    • Formatting and code style: Trước đây TypeScript phần lớn sẽ được format bởi tslint, nhưng hiện tại team tslint đang deprecating và chuyển sang support cho eslint. Chúng ta sẽ dùng eslint để kiểm tra linting; eslint được dùng để kiểm tra xem code có được format đúng với style hay không, và sẽ dùng prettier để format lại code cho phù hợp với code style. Ngoài ra, chúng ta sẽ cần chạy prettier cho pre-commit để format những file được thay đổi trong code base, hoặc tạo Github actions để kiểm tra linting trước khi commit. Cũng giống như tsconfig.json, cần có một file .eslintrc.root.json và .prettierrc.root.json ở folder gốc và các project con sẽ extends từ root project.
    • Testing: Jest là một test framework được sử dụng rộng rãi, và chúng sẽ dùng trong các project con để viết test. Các framework như React, React Native và Nest (cho back-end) đã có jest sẵn và chúng ta không cần làm gì nhiều để setup.
    • TypeScript: nên có một file tsconfig.json chung cho cả hai project, liệt kê ra những yếu tố mà cả hai project cần, và có tsconfig.json riêng cho từng project nếu cần override. Như vậy, repository của SneakGeek sẽ giống như sau
snkgk
|__ tsconfig.root.json
|__ .eslintrc.root.js
|__ .prettierrc.root.js
|__ mobile/
  |__ tsconfig.json
  |__ .eslintrc.js
  |__ .prettierrc.js
  |__ ...
|__ api/
  |__ tsconfig.json
  |__ .eslintrc.js
  |__ .prettierrc.js
  |__ ...

và file tsconfig.root.json sẽ có dạng sau

{
    "compilerOptions": {
        "strict": true,
        ...
    }
}

Các khác sử dụng TypeScript sẽ có tsconfig.json riêng để extend file root config này, và sẽ override nếu cần thiết

{
    "extends": "../tsconfig.root.json",
    "compilerOptions": {
        // override here
    }
}

Chúng ta có thể setup repository dưới dạng một yarn workspace và để các folder share chung các package như jest, prettier, eslint và TypeScript, hoặc có thể để tự các project maintain từng library một. Để code base được thống nhất, nên sử dụng workspace cho những package chung được sử dụng chỉ 1 lần.

Tại sao những cách đơn giản hơn lại không hợp lý?

Chúng ta có thể dùng tslint để format, nhưng project này sẽ bị deprecated. Các library như prettier, eslint và jest đang là industry standard được sử dụng tại Airbnb, Facebook, Microsoft. Hệ thống yarn workspace và lerna cũng được sử dụng rộng rãi để sắp xếp code.

Latency:

N/A

Scalability:

N/A

Reliability:

N/A

Các hệ thống liên quan:

N/A

Security:

N/A

Test:

N/A

Monitoring:

Chúng ta có thể add thêm code coverage cho master và linting status cho từng pull request.

Alerts:

N/A

Analytics:

N/A

Communications:

N/A

Kế hoạch launch project:

  • Tìm hiểu về yarn workspace và lerna, và setup repository dưới dạng yarn workspace/lerna
  • Setup minimal back-end project (nest.js)
  • Setup minimal front-end project (React Native)
  • So sánh hai project và setup global TypeScript tsconfig.root.json
  • Setup global eslint và script cho linting từng project
  • Setup global prettierrc và script cho prettify từng project
  • Setup pre-commit hooks cho eslint
  • Setup github actions cho linting back-end
  • Setup github actions building cho back-end, including unit and integration testing
  • Setup github actions cho auto-deployment đến app engine server cho back-end
  • Setup github actions cho linting front-end
  • Tìm hiểu về building cho React Native trên Github actions, và setup build cho React Native
  • Tìm hiểu về deployment cho React Native: Firebase, App Center, etc. Cách deploy từ Firebase/App Center lên AppStore như thế nào?

4. Ướ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ìn chung việc setup sẽ tốn thời gian nhất vào

  • Setup workspace
  • Với mô hình workspace, chạy React Native app và Nest.js project có phải là vấn đề không?
  • Building và deploying mobile app sẽ tốn khá nhiều thời gian vì sẽ phải support cho Android và iOS, cũng như có nhiều dependencies tới các bên thứ 3 như là Google Play Store, App Store, TestFlight, Firebase hoặc là App Center.
  • Các việc setup đơn giản cho project có thể sẽ chỉ mất 1-2 ngày, và các task cho back-end cũng vậy.
  • Công việc building và deploying cho React Native sẽ mất thời gian hơn, mỗi task mất trung bình 1 ngày để hoàn thiện.

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

Design lần này để dành cho những công việc setup project. Các công cụ để làm project (VS Code integration) và design của project sẽ được hoàn thành trong project tiếp theo.