特性切換或稱功能切換,英語:feature toggle[1]feature switchfeature flagfeature flipperconditional feature等。它是軟件開發中的一種技術,是替代維護多個源代碼分支(也稱特性分支)的一種方案,這使特性在完成並正式發布前也可以得到測試。特性切換是在運行期間隱藏、啟用或禁用特定功能。例如在開發過程中,開發人員可以啟用功能以進行測試,而其他用戶不會被啟用該功能和受到它的影響。[2]

持續發布和持續交付為開發人員提供了有關其代碼的快速反饋,而這要求儘早地集成其代碼更改。特性分支為此過程引入了一個旁路。[3]特性切換是實現持續交付的一項重要技術。

這種技術使開發人員得以發布包含未完成功能的產品版本。這些未完成的功能被隱藏或被禁用,因此不會出現在用戶界面中。這使軟件可以發布很多次小的增量版本,而無需承擔不斷分支與合併的成本。特性切換使軟件集成的周期得以更短。[4]項目團隊可以使用特性切換來加速開發過程,因為產品中可以包含默認不啟用的未完成代碼。

實現

編輯

特徵切換在本質上是條件語句中使用的變量。因此,這些條件語句中的塊可以根據特徵切換的值切換為開或關。切換為關的代碼塊類似於被注釋的代碼。這是開發人員可以繞過它們軟件中的某些流程,例如尚未準備好部署的功能。

功能切換的主要用途是避免在發布前的最後一刻因軟件合併而產生的衝突。儘管這可能導致切換負債。切換負債是指一個功能已被永久關閉後,軟件中仍存留着死亡的代碼,並可能帶來一些開銷。這種代碼必須被仔細甄別才能刪除,以免干擾到其他代碼。

功能切換主要有兩種類型。一種是開發人員在產品發布之前決定保留或刪除的發布切換(取決於其效果)。另一種是業務切換,它相較於舊的代碼是滿足不同的用法。

特性切換可用於以下情況:

  1. 將一個新功能添加到應用程序。
  2. 增強應用程序中的現有功能。
  3. 隱藏或禁用某項功能。
  4. 擴展一個接口。

特性切換可以存儲在:

  1. 數據庫中。
  2. 配置文件中。

功能組

編輯

功能組由一組可切換的互相配合的功能組成。這使開發人員可以輕鬆管理一系列相關的切換開關。[5]

灰度發布

編輯

特性標誌的另一個好處是灰度(Canary)發布。灰度發布(或Canary啟動或Canary部署)允許開發人員逐步為一小群用戶測試某項功能。如果功能的性能不令人滿意,則可以回滾它,沒有任何不利影響。[6]

雖然在大多數編程語言(例如Java[7][8]、Angular JS[9]、PHP[10]、JavaScript[11]等)中可以輕鬆實現這種模式,也存在一些函式庫[12]來進一步簡化這種用法。

馬丁·福勒指出,功能切換應該是你將功能投入生產時的最後一種選擇。取而代之,最好將功能分解成更小的部分,將每個部分安全地實現來引入到產品發布,從而避免導致問題。

許多大型網站都使用特性切換技術,包括Flickr[13]、Disqus[14]、Etsy[15]、reddit[16]、Gmail[17]和Netflix。[18]

有許多適用於各種編程語言和平台的開源的特性切換和特性標記解決方案。

參見

編輯

參考資料

編輯
  1. ^ Martin Fowler 29 October 2010. FeatureToggle. Martinfowler.com. 2010-10-29 [2013-09-27]. (原始內容存檔於2021-03-23). 
  2. ^ ALM Rangers - Software Development with Feature Toggles. msdn.microsoft.com. [2017-05-23]. (原始內容存檔於2017-09-01). 
  3. ^ Feature Flags for Mobile Apps - Apptimize. apptimize.com. [9 January 2017]. (原始內容存檔於2016-09-18). 
  4. ^ Programming JavaScript Applications. [2016-09-15]. (原始內容存檔於2016-09-15). 
  5. ^ Elliot, Eric. Programming JavaScript Applications. O'Reilly Media. 2014. 
  6. ^ Canary launches – how and why to canary release. launchdarkly.com. 7 April 2015 [9 January 2017]. (原始內容存檔於2016-09-17). 
  7. ^ Home - Feature Flipping 4 JAVA. [2016-09-15]. (原始內容存檔於2020-12-04). 
  8. ^ Togglz - Features flag for Java. [2016-09-15]. (原始內容存檔於2021-01-20). 
  9. ^ mjt01/angular-feature-flags. [2016-09-15]. 
  10. ^ A new feature toggling library for PHP | labs @ Qandidate.com. [2016-09-15]. (原始內容存檔於2020-11-12). 
  11. ^ Programming JavaScript Applications. [2016-09-15]. (原始內容存檔於2016-09-15). 
  12. ^ One of many feature toggle framework list: http://www.beautifulbuilds.com/feature-toggle-frameworks-list/頁面存檔備份,存於網際網路檔案館
  13. ^ Harmes, Ross. Flipping Out - code.flickr.com. flickr.net. [9 January 2017]. (原始內容存檔於2016-12-03). 
  14. ^ 存档副本. [2013-10-10]. (原始內容存檔於2013-11-05). 
  15. ^ How does Etsy manage development and operations?. codeascraft.com. 4 February 2011 [9 January 2017]. (原始內容存檔於2021-01-22). 
  16. ^ reddit/reddit. github.com. [9 January 2017]. 
  17. ^ Developing Gmail’s new look. googleblog.com. [9 January 2017]. (原始內容存檔於2020-11-11). 
  18. ^ Preparing the Netflix API for Deployment. netflix.com. [9 January 2017]. (原始內容存檔於2017-04-28).