aboutsummaryrefslogtreecommitdiff
path: root/v2/src/content/en/slide/rollouts.ps
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2023-04-15 16:21:40 -0300
committerEuAndreh <eu@euandre.org>2023-04-15 16:21:40 -0300
commitbcd1d0be109aae75ed7d34545f893208a671e316 (patch)
tree1f7aa11a29131430a649b8b10c249c1abda0710e /v2/src/content/en/slide/rollouts.ps
parentv2: Generate sitemap.xml (diff)
downloadeuandre.org-bcd1d0be109aae75ed7d34545f893208a671e316.tar.gz
euandre.org-bcd1d0be109aae75ed7d34545f893208a671e316.tar.xz
v2: WIP support for slides
Diffstat (limited to 'v2/src/content/en/slide/rollouts.ps')
-rw-r--r--v2/src/content/en/slide/rollouts.ps500
1 files changed, 500 insertions, 0 deletions
diff --git a/v2/src/content/en/slide/rollouts.ps b/v2/src/content/en/slide/rollouts.ps
new file mode 100644
index 0000000..0a8b39f
--- /dev/null
+++ b/v2/src/content/en/slide/rollouts.ps
@@ -0,0 +1,500 @@
+%!PS-Adobe-3.0
+%%DocumentMedia: SLIDE 842 595 0 () ()
+%%EndComments
+%%BeginDefaults
+%%PageMedia: SLIDE
+%%EndDefaults
+<< /PageSize [842 595] /ImagingBBox null >> setpagedevice
+
+/reencode {
+ exch
+ findfont
+ dup length dict
+ begin
+ {
+ 1 index /FID ne
+ { def }
+ { pop pop }
+ ifelse
+ } forall
+ /Encoding ISOLatin1Encoding def
+ currentdict
+ end
+ definefont pop
+} def
+/Times /Times reencode
+/Courier /Courier reencode
+/Times-Italic /Times-Italic reencode
+/Helvetica /Helvetica reencode
+
+
+/headerheight 75 def
+
+/frontfontsz 60 def
+/authorfontsz 40 def
+/titlefontsz 40 def
+/mainfontsz 30 def
+/codefontsz 18 def
+/tinyfontsz 18 def
+
+/titlefont /Helvetica findfont titlefontsz scalefont def
+/mainfont /Courier findfont mainfontsz scalefont def
+/codefont /Courier findfont codefontsz scalefont def
+/tinyfont /Times findfont tinyfontsz scalefont def
+/frontfont /Helvetica findfont frontfontsz scalefont def
+/authorfont /Times-Italic findfont authorfontsz scalefont def
+/authorfonttwo /Times findfont authorfontsz scalefont def
+
+
+/pagewidth 842 def
+/pageheight 595 def
+/leftmargin 30 def
+/topmargin 595 def
+
+/pad 10 def
+
+/titlefonth titlefontsz pad add def
+/mainfonth mainfontsz pad add def
+/codefonth codefontsz pad add def
+/tinyfonth tinyfontsz pad add def
+/frontfonth frontfontsz pad add def
+/authorfonth authorfontsz pad add def
+
+/headermargin
+ pageheight headerheight titlefonth sub 2 div titlefontsz add sub
+def
+/rightmargin pagewidth leftmargin sub def
+/tbtop topmargin def
+/ypos topmargin def
+
+/xcur { currentpoint pop } def
+/ycur { currentpoint exch pop } def
+
+/wordbreak ( ) def
+/linewrap {
+ /proc exch def
+ /linelength exch def
+ /textstring exch def
+ /breakwidth wordbreak stringwidth pop def
+ /curwidth 0 def
+ /lastwordbreak 0 def
+ /startchar 0 def
+ /restoftext textstring def
+ {
+ restoftext wordbreak search
+ {
+ /nextword exch def pop
+ /restoftext exch def
+ /wordwidth nextword stringwidth pop def
+ curwidth wordwidth add linelength gt
+ {
+ textstring startchar
+ lastwordbreak startchar sub
+ getinterval proc
+ /startchar lastwordbreak def
+ /curwidth wordwidth breakwidth add def
+ }
+ {
+ /curwidth curwidth wordwidth add
+ breakwidth add def
+ } ifelse
+ /lastwordbreak lastwordbreak
+ nextword length add 1 add def
+ }
+ {
+ pop exit
+ } ifelse
+ } loop
+ /lastchar textstring length def
+ textstring startchar lastchar startchar sub
+ getinterval proc
+} def
+
+/line {
+ 0 0 0 setrgbcolor
+ 0.5 setlinewidth
+ leftmargin ypos moveto
+ rightmargin ypos lineto
+ stroke
+} def
+
+/center {
+ dup
+ /str exch def
+ /sw str stringwidth pop def
+ /xpos pagewidth sw sub 2 div xcur sub def
+ xpos 0 rmoveto
+} def
+
+/objcenter {
+ pagewidth exch sub 2 div 0 translate
+} def
+
+/s {
+ /tbtop topmargin def
+ /ypos topmargin def
+ 1 1 1 setrgbcolor
+ 0 setlinewidth
+ newpath
+ 0 pageheight moveto
+ pagewidth pageheight lineto
+ pagewidth 0 lineto
+ 0 0 lineto
+ closepath
+ fill
+ stroke
+} def
+
+/l {
+ /h exch def
+ /ypos ypos h sub def
+ leftmargin ypos moveto
+} def
+
+/title {
+ frontfonth l
+ frontfont setfont
+ 0.5 0.5 0.9 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { frontfonth l center show }
+ linewrap
+ frontfonth 2 div l
+ frontfonth l
+} def
+
+/author {
+ authorfont setfont
+ 0 0 0 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { authorfonth l center show }
+ linewrap
+} def
+
+/authortwo {
+ authorfonttwo setfont
+ 0 0 0 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { authorfonth l center show }
+ linewrap
+} def
+
+/header {
+ /ypos pageheight headerheight sub def
+ 0 0 0 setrgbcolor
+ 0 setlinewidth
+ newpath
+ 0 pageheight moveto
+ pagewidth pageheight lineto
+ pagewidth ypos lineto
+ 0 ypos lineto
+ closepath
+ fill
+ stroke
+ leftmargin headermargin moveto
+ titlefont setfont
+ 0.5 0.5 0.9 setrgbcolor
+ center show
+ leftmargin ypos moveto
+} def
+
+/n {
+ mainfont setfont
+ 0 0 0 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { mainfonth l show }
+ linewrap
+} def
+
+/cn {
+ codefont setfont
+ 0 0 0 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { codefonth l show }
+ linewrap
+} def
+
+/tn {
+ tinyfont setfont
+ 0 0 0 setrgbcolor
+ { pagewidth leftmargin 2 mul sub }
+ { tinyfonth l show }
+ linewrap
+} def
+
+/is {
+ /level1 save def
+ /showpage {} def
+} def
+
+/ie {
+ level1 restore
+} def
+
+/bs {
+ /tbtop ypos def
+} def
+
+/be {
+ /tm tbtop pad sub def
+ /bm ypos pad sub def
+ newpath
+ leftmargin 10 sub tm moveto
+ rightmargin tm lineto
+ rightmargin bm lineto
+ leftmargin 10 sub bm lineto
+ closepath
+ 0 0 0 setrgbcolor
+ 0.5 setlinewidth
+ stroke
+} def
+showpage
+%%Page: 1 1
+s
+( Rollout, feature flag, experiment, operational toggle) title
+(Different use cases for backend, frontend and mobile ) authortwo
+showpage
+%%Page: 2 2
+s
+() n
+() n
+() n
+( "Feature flags" tend to come up when talking about continuous deployment) title
+showpage
+%%Page: 3 3
+s
+() n
+() n
+() n
+() n
+(CI: continuous integration) authortwo
+() n
+(CD: continuous delivery) authortwo
+() n
+(CD: continuous deployment) authortwo
+showpage
+%%Page: 4 4
+s
+( Types) header
+() n
+() n
+() n
+(1. rollout) n
+(2. feature flag) n
+(3. experiment) n
+(4. operational toggle) n
+showpage
+%%Page: 5 5
+s
+( Rollout) header
+( For *rolling out* a new version of software) title
+(Short-lived using percentages) n
+(- a new deployment of kubernetes) n
+(- new APK released to the Play Store) n
+showpage
+%%Page: 6 6
+s
+( Feature flag) header
+( For turning a feature *on* or *off* ) title
+(Medium-lived using allow list, A/B test, percentage, app version, etc.) n
+(- :new-chargeback-flow) n
+(- :new-debit-card-activation-screen) n
+showpage
+%%Page: 7 7
+s
+( Experiment) header
+( For analysing behaviour) title
+(Medium-lived using allow list and A/B test) n
+(- :debit-withdrawal-test) n
+showpage
+%%Page: 8 8
+s
+( Operational toggle) header
+( For disabling features in #crash-like situations) title
+(Long-lived using percentage) n
+(- :bank-barcode-payment) n
+(- :savings-bank-barcode-query-provider) n
+showpage
+%%Page: 9 9
+s
+() n
+() n
+(We know know about the types) authortwo
+( But they have different relevance for backend, frontend and mobile) title
+showpage
+%%Page: 10 10
+s
+( backend) header
+() n
+() n
+(1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp) n
+(2. feature flag: ~common-rollout~ common-xp and datasets) n
+(3. experiment: common-xp) n
+(4. operational toggle: ~common-rollout~ common-xp ) n
+showpage
+%%Page: 11 11
+s
+( frontend) header
+() n
+() n
+(1. rollout: CDN and page refreshes) n
+(2. feature flag: percentages and maybe IPs \(no :customer/id on the website\)) n
+(3. experiment: via dynamic backend control) n
+(4. operational toggle: via dynamic backend control ) n
+showpage
+%%Page: 12 12
+s
+( backend) header
+() n
+() n
+(1. rollout: app stores) n
+(2. feature flag: via dynamic backend control) n
+(3. experiment: via dynamic backend control) n
+(4. operational toggle: via dynamic backend control ) n
+showpage
+%%Page: 13 13
+s
+() n
+() n
+(Key differentiator is) authortwo
+( how much *control* we have over the environment) title
+showpage
+%%Page: 14 14
+s
+( backend) header
+( full control) title
+showpage
+%%Page: 15 15
+s
+( frontend) header
+( partial control) title
+(We choose when to make a new version available ) n
+showpage
+%%Page: 16 16
+s
+( mobile) header
+( very limited control) title
+(- app stores can restrict updates \(worse for iOS\)) n
+(- customers still have to download new versions ) n
+showpage
+%%Page: 17 17
+s
+( Costs) title
+(- more complex code) n
+(- compatibility with old app versions) n
+(- nesting is exponential) n
+showpage
+%%Page: 18 18
+s
+( Benefits) title
+(- dynamicity) n
+showpage
+%%Page: 19 19
+s
+( weighting costs × benefits) header
+( The less control we have, the more we value dynamicity ) title
+showpage
+%%Page: 20 20
+s
+( weighting costs × benefits) header
+() n
+() n
+() n
+(- backend: sometimes worth the cost) n
+(- frontend: almost always worth the cost) n
+(- mobile: *always* worth the cost) n
+showpage
+%%Page: 21 21
+s
+() n
+() n
+() n
+( Best practices) title
+showpage
+%%Page: 22 22
+s
+( dynamic content > feature flag) title
+(Always true for mobile, almost always for frontend ) n
+showpage
+%%Page: 23 23
+s
+( Use :include-list for named groups ) title
+(Always true for backend, frontend and mobile ) n
+bs
+({:rules) cn
+( #{{:types :include-list) cn
+( :content {:filename "debit-team-members.txt"}}}}) cn
+be
+showpage
+%%Page: 24 24
+s
+( Always use :app-version) title
+(Only for mobile) n
+bs
+({:rules) cn
+( #{{:types :app-version) cn
+( :content {:min-version #{{:platform :android) cn
+( :code 1000000}) cn
+( {:platform :ios) cn
+( :code 2000000}}}}}}) cn
+be
+showpage
+%%Page: 25 25
+s
+( Extend ~common-rollout~ common-xp if required) title
+(That's how :include-list, :app-version, etc. were born) n
+showpage
+%%Page: 26 26
+s
+( Beware of many nested feature flags) title
+(True for backend, frontend and mobile) n
+showpage
+%%Page: 27 27
+s
+( Don't delete app-facing feature flags) title
+(True for mobile) n
+showpage
+%%Page: 28 28
+s
+() n
+() n
+() n
+( Include a feature flag on the whiteboarding phase) title
+showpage
+%%Page: 29 29
+s
+() n
+() n
+() n
+( Include deleting/retiring the feature flag at the end) title
+showpage
+%%Page: 30 30
+s
+( Avoid renaming a feature flag) title
+(Use :app-version with :min-version instead) n
+showpage
+%%Page: 31 31
+s
+() n
+() n
+() n
+( And most importantly...) title
+showpage
+%%Page: 32 32
+s
+( *Always* rely on a feature flag on the app) title
+(Never do a hotfix, avoid expedited releases at all costs) n
+showpage
+%%Page: 33 33
+s
+( References) header
+() n
+(1. "Feature Toggles \(aka Feature Flags\)", by Pete Hodgson) n
+(2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet) n
+(3. Accelerate, by N. Forsgren, J. Humble and G. Kim) n
+(4. these slides: euandre.org/slide/) n
+(5. prose version of this presentation) n
+(6. view source) n
+
+showpage
+
+%%EOF