Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Magic of Feature Toggles:
Search
LINE Developers Taiwan
PRO
July 17, 2024
Technology
0
75
The Magic of Feature Toggles:
Speaker: Aki Wang, Noah Hsu
Event: iThome DevOps Day 2024
LINE Developers Taiwan
PRO
July 17, 2024
Tweet
Share
More Decks by LINE Developers Taiwan
See All by LINE Developers Taiwan
LINE 與 AI 機器人技術應用現況
line_developers_tw
PRO
0
4
QA Testing
line_developers_tw
PRO
0
1
jcconf_datadev_prod
line_developers_tw
PRO
0
5
jcconf_SPM_prod
line_developers_tw
PRO
0
3
jcconf_LINEPay_prod
line_developers_tw
PRO
0
4
Live Activities in LINE
line_developers_tw
PRO
0
13
Neumorphism x Liquid Glass
line_developers_tw
PRO
0
12
猜你喜歡 – 打造高度擴展的個人化電商推薦
line_developers_tw
PRO
0
32
打造新電商搜尋體驗- 搜尋意圖辨識
line_developers_tw
PRO
0
13
Other Decks in Technology
See All in Technology
Access-what? why and how, A11Y for All - Nordic.js 2025
gdomiciano
1
130
定期的な価値提供だけじゃない、スクラムが導くチームの共創化 / 20251004 Naoki Takahashi
shift_evolve
PRO
4
360
防災デジタル分野での官民共創の取り組み (2)DIT/CCとD-CERTについて
ditccsugii
0
140
綺麗なデータマートをつくろう_データ整備を前向きに考える会 / Let's create clean data mart
brainpadpr
3
370
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
11
78k
衛星画像超解像化によって実現する2D, 3D空間情報の即時生成と“AI as a Service”/ Real-time generation spatial data enabled_by satellite image super-resolution
lehupa
0
130
Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題 - BAKUCHIKU BANBAN #2
marokiki
0
180
AI ReadyなData PlatformとしてのAutonomous Databaseアップデート
oracle4engineer
PRO
0
230
リセラー企業のテクサポ担当が考える、生成 AI 時代のトラブルシュート 2025
kazzpapa3
1
140
extension 現場で使えるXcodeショートカット一覧
ktombow
0
220
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
20k
E2Eテスト設計_自動化のリアル___Playwrightでの実践とMCPの試み__AIによるテスト観点作成_.pdf
findy_eventslides
1
580
Featured
See All Featured
Side Projects
sachag
455
43k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
620
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Optimizing for Happiness
mojombo
379
70k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Done Done
chrislema
185
16k
Building an army of robots
kneath
306
46k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
How STYLIGHT went responsive
nonsquared
100
5.8k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Transcript
None
The Magic of Feature Toggles
王天甫 (Aki Wang) 許子庭 (Noah Hsu)
Feature Toggle
Function A Function B
Function A Function B
None
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { throw new UnsupportedOperationException("Not implemented yet"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
boolean isLayoutOrderEnabled = false; if (isLayoutOrderEnabled) { return ResponseEntity.ok(buildLayoutOrder()); } else { return ResponseEntity.notFound().build(); } } private Map<?, ?> buildLayoutOrder() { throw new UnsupportedOperationException("Not implemented yet"); } }
BUY NOW BUY NOW V S
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { return Map.of("color", "blue", "radius", "8px", "pos", "page"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { return Map.of("color", "green", "radius", "0px", "pos", "bottomNav"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
String themeName = "themeB"; switch (themeName) { case "themeB": return ResponseEntity.ok(buildThemeBLayoutOrder()); default: return ResponseEntity.ok(buildThemeALayoutOrder()); } } private Map<?, ?> buildThemeALayoutOrder() { return Map.of("color", "blue", "radius", "8px", "pos", "page"); } private Map<?, ?> buildThemeBLayoutOrder() { return Map.of("color", "green", "radius", "0px", "pos", "bottomNav"); } }
Invisibility Speed Experimentation Safety Live Update
longevity dynamism Release Toggles Ops Toggles Permission Toggles Experiment Toggles
years months weeks days changes with a deployment changes with runtime re-configuration changes with each request from https://martinfowler.com/articles/feature-toggles.html
Feature Toggle is second best solution. The best solution is
to find a way to gradually integrate, without Feature Branches or Feature Toggles
Flagship4j
Standardizing Feature Flagging for Everyone
One SDK, any backend Supports your favorite tools Speaks your
language
One SDK, any backend OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProvider(new OpenFlagrProvider());
Client client = api.getClient(); Boolean isHelloWorldEnabled = client.getBooleanValue("hello-world-enabled", false); if (isHelloWorldEnabled) { System.out.println("Hello World"); }
Supports your favorite tools
Speaks your language
OpenFlagr Open source feature flagging, A/B testing, and dynamic configuration
microservice in Go.
None
None
USE CASES
ON On / Off 100%
ON Rollout 100%
Blue A / B Testing Green 50% 50%
Q & A
None