Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

The Magic of Feature Toggles

Slide 3

Slide 3 text

王天甫 (Aki Wang) 許子庭 (Noah Hsu)

Slide 4

Slide 4 text

Feature Toggle

Slide 5

Slide 5 text

Function A Function B

Slide 6

Slide 6 text

Function A Function B

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity> getLayoutOrder() { return ResponseEntity.ok(buildLayoutOrder()); } private Map, ?> buildLayoutOrder() { throw new UnsupportedOperationException("Not implemented yet"); } }

Slide 9

Slide 9 text

@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"); } }

Slide 10

Slide 10 text

BUY NOW BUY NOW V S

Slide 11

Slide 11 text

@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"); } }

Slide 12

Slide 12 text

@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"); } }

Slide 13

Slide 13 text

@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"); } }

Slide 14

Slide 14 text

Invisibility Speed Experimentation Safety Live Update

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Feature Toggle is second best solution. The best solution is to find a way to gradually integrate, without Feature Branches or Feature Toggles

Slide 17

Slide 17 text

Flagship4j

Slide 18

Slide 18 text

Standardizing Feature Flagging for Everyone

Slide 19

Slide 19 text

One SDK, any backend Supports your favorite tools Speaks your language

Slide 20

Slide 20 text

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"); }

Slide 21

Slide 21 text

Supports your favorite tools

Slide 22

Slide 22 text

Speaks your language

Slide 23

Slide 23 text

OpenFlagr Open source feature flagging, A/B testing, and dynamic configuration microservice in Go.

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

USE CASES

Slide 27

Slide 27 text

ON On / Off 100%

Slide 28

Slide 28 text

ON Rollout 100%

Slide 29

Slide 29 text

Blue A / B Testing Green 50% 50%

Slide 30

Slide 30 text

Q & A

Slide 31

Slide 31 text

No content