Feature Flag – Developer “lén lút” đưa tính năng mới cho người dùng như thế nào?

Hãy tưởng tượng, team của bạn đang cần xử lý 1 tình huống như thế này:

  • Tình huống: Application của công ty đang chạy ổn định, nhưng người dùng phàn nàn UI quá rắc rối, do đó chúng ta phải re-design lại 1 số trang
  • Sau khi đã có desisgn mới, quá trình implement các trang này khá lâu. Để PM và QA có thể test được, ta phải implement các trang này, kết nối với data thật hoặc data ở môi trường Staging.

 

  • Yêu cầu: Sau khi PM xác nhận, QA đã test xong, ta sẽ cho 1 số beta user dùng thử UI mới trước, còn lại vẫn dùng UI cũ. Sau một thời gian, ta sẽ cho toàn bộ người dùng sử dụng UI mới
  • Trong quá trình implement các trang này, ta vẫn phải bảo trì, sửa đổi và nâng cấp application cũ.
Redesign hệ thống luôn luôn là chuyện đau đầu

Một trong những cách đơn giản nhất là tạo 1 branch riêng để implement việc re-design này. Sau đó, khi implement xong thì ta có thể merge vào branch chính.

Tuy nhiên, với những thay đổi lớn như vậy, việc merge code/setup về lâu dài sẽ khá phức tạp. Ta cũng khó mà cho beta user dùng thử design mới, vì họ không thể vào môi trường staging.

Do vậy, ta có 1 cách hay và hiệu quả hơn nhiều, đó là dùng feature flag.

Feature Flag là cái chi chi?

Nói đơn giản, Feature Flag là 1 kĩ thuật cho phép developer thay đổi cách hoạt động của ứng dụng, mà không cần phải sửa code (ngạc nhiên chưa).

Nghe cao siêu như vậy chứ kĩ thuật này không hề phức tạp chút nào. Ta sẽ sử dụng một biến, xem nó như cờ (flag) để quyết định luồng chạy của ứng dụng.

Code ở đây cũng khá đơn giản thôi, dựa vào giá trị SHOW_NEW_UI là true hay false mà ta sẽ hiển thị UI cũ hay UI mới!

Tới đây hẳn bạn đọc sẽ thắc mắc: Ủa nếu vậy muốn thay đổi hoạt động của ứng dụng, ta cũng phải sửa code để thay đổi biến SHOW_NEW_UI sang false hoặc true mà ?? Thằng Code Dạo lừa mình à??

Hihi, thật ra mình không lừa các bạn đâu. Để làm được chuyện đó, chúng ta sẽ không lưu giá trị của feature flag SHOW_NEW_UI trong code, mà lưu ở … chỗ khác cơ!

Lưu trữ feature flag ở đâu?

Feature flag được dùng để thay đổi cách hoạt động của một chương trình. Do vậy, để có thể dùng feature-flag hiệu quả, ta phải tìm cách thay đổi giá trị của Flag đó, mà không cần thay đổi code.

Do vậy, feature flag thường được lưu trữ như sau:

  • Lưu trữ trong code, mỗi khi sửa phải deploy lại code
  • Lưu trữ trong configuration file (web.config trong C#, .env trong NodeJS) hoặc biến môi trường. Khi cần sửa chỉ cần sửa config và chạy lại
  • Lưu trữ trong 1 số service bên ngoài, developer/PM có thể vào và bật/tắt flag này
Ngày xưa công ty mình dùng launchdarkly, PM hoặc dev chính có quyền vào thay đổi flag

 

Lúc này, feature flag có thể được dùng như sau:

Ứng dụng của Feature Flag

Các bạn thấy không, Feature Flag chỉ là 1 kĩ thuật đơn giản, nhưng ta có thể làm được khá nhiều hay ho với nó:

  • Code chưa hoàn chỉnh ta cũng có thể deploy được, chỉ cần set feature flag thành false là code đó sẽ không chạy
  • Set feature flag khác nhau ở mỗi môi trường khác nhau. Ví dụ flag đó là true ở môi trường test và stage,  cho PM và QA có thể tha hồ test, không ảnh hưởng đến môi trường production.
  • Khi gắn feature flag, ta nên truyền thêm context và thông tin người dùng. Do vậy, ta có thể show tính năng mới cho beta user, cho 1 số người dùng được chỉ định.
Với feature flag, ta có thể roll out dần tính năng cho người dùng

Một số kinh nghiệm khi dùng feature-flag

Ngoài ra, mình còn 1 số kinh nghiệm nho nhỏ khi dùng feature flag

  • Đặt tên flag dễ hiểu: Tên flag cũng như tên biến vậy, các bạn nên viết rõ ràng flag này dùng cho chức năng gì, chứ đừng ghi “flagA”, “flagB” sau này kiểm tra lại mệt lắm đấy
  • Gắn vô nhớ gỡ: Khi thêm 1 flag vào code, các bạn nên tạo ticket/note lại để gỡ flag đó ra khỏi code sau này. Ví dụ các bạn đã code xong chức năng mới, thay vì để flag đó true hoài thì hãy … xoá luôn flag đó, sửa lại code là được
  • Hạn chế độ phức tạp: Đôi khi, flow của ứng dụng sẽ khá phức tạp. Nếu dùng Feature Flag, bạn sẽ thêm if/else vào nên càng phức tạp hơn. Để hạn chế, bạn nên code chức năng mới trong hàm/mobile mới, sau đó dùng flag để show/UI những UI gọi code mới đó
  • Cho phép PM/QA sửa feature-flag: Một số tool quản lý feature-flag có kèm theo dashboard, phân quyền, cho phép ta phân quyền những người được đổi flag. Theo kinh nghiệm của mình cứ cho PM/QA và đổi flag khi cần để họ test. Nếu ổn thì PM cũng có thể bật flag trên Production để relase 1 tính năng luôn.

Tạm kết

Bài viết này dùng khá nhiều thuật ngữ kĩ thuật, do đó có đoạn nào chưa rõ ràng, các bạn cứ comment để mình giải thích nhé!

Bản thân bạn và team có dùng feature-flag không? Bạn có kinh nghiệm gì hay ho với nó không? Hãy chia sẽ trong mục comment nha!

 

Tìm hiểu thêm:

5 thoughts on “Feature Flag – Developer “lén lút” đưa tính năng mới cho người dùng như thế nào?”

  1. Phải đăng nhập để vô trả lời “quá hay” :D. Nọ có dùng cái này mà vẫn chưa hiểu lắm sao phải dùng (chỉ là senior bảo là dùng nó đi). Cám ơn bài viết của anh

    Like

  2. Đọc xong tình huống thì có vẻ khá rắc rối, hầm bà lằng các kiểu. Đến khi biết kỹ thuật này thì thấy thực ra cũng không khó như vậy, chỉ là chưa tìm ra cách giải tối ưu mà thôi :))

    Like

  3. Hay! Ngoài lưu trữ giá trị enable/disabled trong code, web.config/xml, hay web service, nghịch nghịch nhét vào bảng lookup table trong cơ sở dữ liệu chắc cũng được hén. Flow mới vài tháng sau rùi cũng thành flow cũ, hi vọng thiết kế sao để mai này đi clean up cho nó dể dàng.

    Like

  4. Nói như vậy thì ngay từ đầu lúc design kiến trúc code phải apply, chứ không giữa chừng mới code if-else thì cũng mất công gom code vs phân tách, lại sinh ra 1 đống bug tha hồ fix :)))

    Like

Leave a Reply to Tôi dại dột Cancel reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s