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
23
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購物 App x ATDD: 利用 ATDD 改善開發流程
line_developers_tw
PRO
0
11
Grafana Alloy Best Practice
line_developers_tw
PRO
0
620
Distributed Tracing in LINE Taiwan
line_developers_tw
PRO
0
27
只有 Status page 還不夠!講人話才知道 Infra 發生什麼事
line_developers_tw
PRO
2
240
LINE Chatbot 的終極進化:如何使用 Gemini、多模態和 Gemma 突破對話式 AI 的界限
line_developers_tw
PRO
0
440
高中生的純軟外商生活攻略
line_developers_tw
PRO
0
120
TECH FRESH 實習分享
line_developers_tw
PRO
0
31
如何跨入資料科學
line_developers_tw
PRO
0
25
大AI時代,高中生該如何 找到自己的大秘寶
line_developers_tw
PRO
0
34
Other Decks in Technology
See All in Technology
LLVM/ASMを使った有限体の高速実装
herumi
0
120
OCI で始める!! Red Hat OpenShift / Get Started OpenShift on OCI
oracle4engineer
PRO
1
200
どこよりも遅めなWinActor Ver.7.5.0 新機能紹介
tamai_63
0
210
Jetpack Compose Modifier 徹底解説 / Jetpack Compose Modifier
wiroha
0
210
Oracle Autonomous Database:サービス概要のご紹介
oracle4engineer
PRO
1
7.1k
突撃! 隣のAmazon Bedrockユーザー 〜YouはどうしてAWSで?〜
minorun365
PRO
3
400
Classmethod AI Talks(CATs) #1 司会進行スライド(2024.09.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol1_2024-09-19
shinyaa31
0
250
JTCや セキュリティチェックリストが夢の跡
nikinusu
1
800
QAに対する超個人的な解釈 / Personal Take on QA
toma_sm
1
160
『GRANBLUE FANTASY Relink』キャラクターの魅力を支えるリグ・シミュレーション制作事例
cygames
0
170
PDF Viewer作成の今までとこれから
hunachi
0
480
「自動テストのプラクティスを効果的に学ぶためのカードゲーム」 ( #sqip2024 )
teyamagu
PRO
2
190
Featured
See All Featured
RailsConf 2023
tenderlove
28
820
Building Your Own Lightsaber
phodgson
101
6k
The Invisible Side of Design
smashingmag
296
50k
Practical Orchestrator
shlominoach
185
10k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.6k
Code Reviewing Like a Champion
maltzj
517
39k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
109
6.9k
No one is an island. Learnings from fostering a developers community.
thoeni
18
2.9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
230
17k
What’s in a name? Adding method to the madness
productmarketing
PRO
21
3k
Why Our Code Smells
bkeepers
PRO
334
56k
We Have a Design System, Now What?
morganepeng
48
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