diff options
-rw-r--r-- | _articles/2020-10-12-feature-flags-differences-between-backend-frontent-and-mobile.md (renamed from _articles/2020-10-10-feature-flags-differences-between-backend-frontent-and-mobile.md) | 4 | ||||
-rw-r--r-- | _slides/2020-10-09-rollout-feature-flag-experiment-operational-toggle.slides (renamed from _slides/2020-10-10-rollout-feature-flag-experiment-operational-toggle.slides) | 39 | ||||
-rwxr-xr-x | scripts/assert-content.sh | 10 | ||||
-rwxr-xr-x | scripts/assert-spelling.sh | 2 | ||||
-rw-r--r-- | scripts/spelling/en.txt | 5 | ||||
-rw-r--r-- | scripts/spelling/international.txt | 20 |
6 files changed, 54 insertions, 26 deletions
diff --git a/_articles/2020-10-10-feature-flags-differences-between-backend-frontent-and-mobile.md b/_articles/2020-10-12-feature-flags-differences-between-backend-frontent-and-mobile.md index b655bfd..00d56f0 100644 --- a/_articles/2020-10-10-feature-flags-differences-between-backend-frontent-and-mobile.md +++ b/_articles/2020-10-12-feature-flags-differences-between-backend-frontent-and-mobile.md @@ -1,6 +1,6 @@ --- title: "Feature flags: differences between backend, frontend and mobile" -date: 2020-10-10 +date: 2020-10-12 layout: post lang: en ref: feature-flags-differences-between-backend-frontent-and-mobile @@ -8,7 +8,7 @@ category: presentation published: false --- -*This article is derived from a [presentation]({% link _slides/2020-10-10-rollout-feature-flag-experiment-operational-toggle.slides %}).* +*This article is derived from a [presentation]({% link _slides/2020-10-09-rollout-feature-flag-experiment-operational-toggle.slides %}).* When talking about [feature flags][feature-flags-article], I find that their costs and benefits weight differently when talking about backend, frontend and diff --git a/_slides/2020-10-10-rollout-feature-flag-experiment-operational-toggle.slides b/_slides/2020-10-09-rollout-feature-flag-experiment-operational-toggle.slides index cb374f4..7c78150 100644 --- a/_slides/2020-10-10-rollout-feature-flag-experiment-operational-toggle.slides +++ b/_slides/2020-10-09-rollout-feature-flag-experiment-operational-toggle.slides @@ -1,6 +1,6 @@ --- title: Rollout, feature flag, experiment, operational toggle -date: 2020-10-10 +date: 2020-10-09 layout: slides lang: en ref: rollout-feature-flag-experiment-operational-toggle @@ -104,6 +104,8 @@ Relevant as long as the new code is being developed Lives for as long as the code is in production. +It feels like a system-level circuit breaker. + --- We now know about the types @@ -114,28 +116,28 @@ We now know about the types # backend -1. **rollout**: k8s, blue/green, canary pipeline and `common-rollout` +1. **rollout**: k8s blue/green, canary and `common-rollout` 2. **feature flag**: `common-rollout` and datasets -3. **operational toggle**: `common-rollout` -4. **experiment**: `common-xp` +3. **experiment**: `common-xp` +4. **operational toggle**: `common-rollout` ??? -rollout: k8s, common-rollout - This is a bit why common-rollout isn't called *common-feature-flag*: it was -initially designed with backend usage of *rollouts* in mind. +initially designed with backend usage of mostly *rollouts* in mind, and just a +bit *feature flags*. -feature flag: +Avoid using configuration for doing operational toggles: it is less dynamic, so +it defeats the purpose. --- # frontend 1. **rollout**: CDN and page refreshes -2. **feature flag**: percentages and maybe IPs (no `:customer/id` on [www.nubank.com.br](www.nubank.com.br)) -3. **operational toggle**: via dynamic backend control -4. **experiment**: via dynamic backend control +2. **feature flag**: percentages and maybe IPs (no `:customer/id` on the website) +3. **experiment**: via dynamic backend control +4. **operational toggle**: via dynamic backend control --- @@ -143,8 +145,8 @@ feature flag: 1. **rollout**: app stores 2. **feature flag**: via dynamic backend control -3. **operational toggle**: via dynamic backend control -4. **experiment**: via dynamic backend control +3. **experiment**: via dynamic backend control +4. **operational toggle**: via dynamic backend control --- @@ -193,13 +195,14 @@ But it is easy to fallback to "reload the page and try again". # Costs - more complex code -- nested flags combine exponentially +- compatibility with old app versions +- nesting is exponential --- # Benefits -- dynamically choose code paths for each customer +- dynamicity --- @@ -293,7 +296,7 @@ Use `:app-version` with `:min-version` instead # ***Always*** rely on a feature flag on the app -Hotfixes and expedited releases is a thing of the past +Hot fixes and expedited releases is a thing of the past ??? @@ -314,8 +317,8 @@ You should ask yourself: References: -1. these slides: https://euandre.org/slides.html -2. [prose version of this presentation]({% link _articles/2020-10-10-feature-flags-differences-between-backend-frontent-and-mobile.md %}) +1. these slides: [euandre.org/slides.html]({% link slides.md %}) +2. [prose version of this presentation]({% link _articles/2020-10-12-feature-flags-differences-between-backend-frontent-and-mobile.md %}) 3. ["Feature Toggles (aka Feature Flags)"](https://martinfowler.com/articles/feature-toggles.html), by Pete Hodgson 4. [Continuous integration vs. continuous delivery vs. continuous deployment](https://www.atlassian.com/continuous-delivery/principles/continuous-integration-vs-delivery-vs-deployment), diff --git a/scripts/assert-content.sh b/scripts/assert-content.sh index e694580..626353c 100755 --- a/scripts/assert-content.sh +++ b/scripts/assert-content.sh @@ -8,7 +8,7 @@ red() { echo -e "${red}${1}${end}"; } ## Constant definitions -jekyll build +jekyll build --future JSON='_site/site.json' LANGS=(en pt fr) @@ -63,6 +63,7 @@ assert-frontmatter() { F="$1" DESIRED_LAYOUT="$2" PREFIX="${3:-}" + EXTENSION="${4:-md}" LANG="$(get-lang "$F")" REF="$(get-ref "$F")" URL="$(get-url "$F")" @@ -90,11 +91,10 @@ assert-frontmatter() { if [[ -n "${PREFIX}" ]]; then DATE="$(get-date "$F" | awk '{print $1}')" URL_BASENAME="$(basename "$(get-url "$F")")" - FILE="${PREFIX}/${DATE}-${URL_BASENAME%.html}.md" + FILE="${PREFIX}/${DATE}-${URL_BASENAME%.html}.${EXTENSION}" [[ -f "${FILE}" ]] || { - red "date/filename mismatch: '${FILE}' does not exist. To fix, run:" - echo " mv '${PREFIX}/${URL_BASENAME%.html}.md' '${FILE}'" + red "date/filename mismatch: '${FILE}' does not exist." exit 1 } fi @@ -125,7 +125,7 @@ done echo Linting slides... >&2 for slide in $(jq -r '.slides[] | @base64' "${JSON}"); do - assert-frontmatter "$slide" 'post' '_slides' + assert-frontmatter "$slide" 'slides' '_slides' 'slides' done echo Asserting unique refs... >&2 diff --git a/scripts/assert-spelling.sh b/scripts/assert-spelling.sh index e7bd3b8..edc56dd 100755 --- a/scripts/assert-spelling.sh +++ b/scripts/assert-spelling.sh @@ -15,7 +15,7 @@ done OUT="$(mktemp)" shopt -s globstar -jekyll build +jekyll build --future for f in _site/**/*.html; do if ! grep -E '^_site/vendor/' <(echo "$f") > /dev/null; then l="$(head -n2 "$f" | tail -n1 | cut -d\" -f2)" diff --git a/scripts/spelling/en.txt b/scripts/spelling/en.txt index bebfc76..8a4f0d0 100644 --- a/scripts/spelling/en.txt +++ b/scripts/spelling/en.txt @@ -4,15 +4,19 @@ Slides aren autocommit backend +barcode behaviour +chargeback couldn cronjobs curation declaratively decrypting didn +differentiator doesn duplications +dynamicity embeddable filesystem filesystems @@ -36,4 +40,5 @@ tradeoffs untrusted ve wasn +whiteboarding wouldn diff --git a/scripts/spelling/international.txt b/scripts/spelling/international.txt index 12126cc..b56072c 100644 --- a/scripts/spelling/international.txt +++ b/scripts/spelling/international.txt @@ -15,6 +15,7 @@ BSON BY BY-SA Bitbucket +CDN CI CLI Cantrill @@ -27,22 +28,27 @@ F FFI FTS Fastmail +Forsgren GADTs GPLv GPLv3 GTK GitLab Gmail +GoCD GuixSD HN HTTPS Halloway Haskell +Hodgson +IPs IndexedDB JS JSON Joyent L1 +LTS LaTeX Lerna LilyPond @@ -56,6 +62,7 @@ Nextcloud NixOS POSIX Pastebin +Pittet PouchDB README RPN @@ -68,6 +75,7 @@ Sourcehut Spacemacs StackOverflow Staltz +Sten TAB TBs TOML @@ -79,7 +87,9 @@ WebAssembly Yandex YouTube Zig +apk boneco +br brainer buildGoModule cargo2nix @@ -93,9 +103,11 @@ datoms dl edn en +euandre euandreh eval fr +frontend gcrypt gt guix @@ -104,14 +116,17 @@ h1 h6 hinarioespirita html +https i5 i7 ify intbytes +ios ish jekyll jemoji js +k8s kramdown libre lockfile @@ -130,6 +145,8 @@ pastebins plaintext progn pt +rollout +rollouts sbcl songbooks sourcehut @@ -137,7 +154,10 @@ sr swift2nix systemd touchpad +txt v8 +www +xp xyz youtube à |