Feature Flags

Chào các bạn, dạo này vật lộn với cơm áo gạo tiền quá nên chưa có thời gian viết bài mới. Nay rảnh chút nên mình viết bài mới này.

Đã bao giờ các bạn implement tính năng gì đó rất to. Khi cần release nó chúng ta sẽ phải merge branch của tính năng đó vào nhánh chính phải không nào. Khi đó cảm giác rất là thốn vì rất nhiều thứ đã thay đổi khi chúng ta đang dev tính năng mới. Đó là 1 ví dụ về những phiền phức khi chúng ta sử dụng nhánh riêng để phát triển tính năng hay còn gọi là Feature Branches.

Vừa rồi mình có một thời gian code dạo và học hỏi bên Cốc Cốc và học lỏm được kĩ thuật này. Hôm nay mình xin trình bày về kĩ thuật Feature Flags trong quá trình phát triển tính năng mới cho App.

1. Feature flags là gì

Feature Flags là kĩ thuật sử dụng flag để bật tắt tính năng nào đó trong app của chúng ta. Nó cho phép chúng ta thay đổi hành vi của hệ thống mà không phải thay đổi code. Nói ngắn gọn thì nó sẽ define các cờ boolean để chúng ta config hệ thống 🙂

Vậy có những loại Feature Flags nào.

Theo mình biết thì thường chia thành 2 loại là Static Feature FlagDynamic Feature Flag.

2. Các loại feature flags

2.1 Static Feature Flags

Static Feature Flags đơn giản là chúng ta define một struct hay 1 cái biến nào đó được set cố định thuộc tính true/false hoặc lưu ra file config. Và chúng ta sẽ check giá trị của nó hoặc đọc config để bật tắt các tính năng như mong muốn.

struct FeatureFlags {
    static let fastExportFeature = true // Define flags cho feature
}

Nhược điểm của nó là khi muốn bật flag thì phải compile lại. Khá là sida nên là sinh ra Dynamic Feature Flags.

2.2 Dynamic Feature Flags

Static Feature Flags khá sida nên nó sinh ra loại này nè. Dynamic Feature Flags thì chúng ta có thể bật tắt tính năng mà không cần phải compile lại app.

Chúng ta có thể dựng một màn hình chứa danh sách các flags và thực hiện bật tắt. Như bên Cốc Cốc thì sử dụng luôn mô hình có sẵn của Chromium bằng cách vào địa chỉ coccoc://flags

Ngoài ra có thể dùng một số dịch vụ bên ngoài để hỗ trợ bật tắt từ server để nâng tầm ảnh hưởng. Giả sử là release tính năng tới user chẳng hạn. Ví dụ như featureflags.io, rollout.io. Hay dùng luôn firebase remote config.

3. Ứng dụng nó vào trong project như thế nào

Trước khi bắt đầu thì mình giải thích thêm kĩ thuật này sẽ không tạo branch mới cho tính năng. Mà mình sẽ code và merge chúng vào nhánh chung mà không cần đợi hoàn thành tính năng.

Với mỗi tính năng trước khi phát triển chúng ta sẽ tạo một flags mới. Sau đó tiến hành coding thôi.

Khi code thì chú ý chúng ta sẽ phải check cờ tính năng mới có được bật hay không để áp dụng nó vào trong app. Nếu cờ k được bật thì phải đảm bảo nó sẽ chỉ chạy code cũ mà không chạy code mới.

Khi xong một phần nhỏ nào đó của tính năng thì chúng ta sẽ merge nó vào nhánh chung luôn cho nóng.

Cuối cùng khi xong thì chúng ta bật cờ đó lên cho tất cả user sử dụng chẳng hạn. 🙂

4. Ưu nhược điểm của Feature Flags

Ưu điểm
  • Giúp chúng ta, đồng nghiệp, sếp có thể dùng thử luôn tính năng trong quá trình phát triển. Giúp A/B Testing dễ dàng hơn. Không phải build 1 bản riêng để thử nghiệm chỉ 1 tính năng nào đó.
  • Giúp quá trình merge code dễ thở hơn rất nhiều ?
  • Giúp chúng ta dễ dàng release tính năng nào đó tới 1 số user thay vì tất cả.
  • Đẩy nhanh quá trình phát triển tính năng.
  • Giảm thiểu rủi ro khi release tính năng mới.

Nhược điểm

  • Phải if else nhiều gây ra code hơi rắc rối hơn xíu
  • Chỉ phù hợp với tính năng lớn, phát triển dài hạn.
  • Phải test kĩ để đảm bảo khi không bật flags thì code mới sẽ không được chạy.

Phần này toàn lý thuyết thôi. Phần sau mình sẽ demo nhé 🙂

Tham khảo thêm tại:

Leave a Reply