aboutsummaryrefslogtreecommitdiff
path: root/locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po
diff options
context:
space:
mode:
Diffstat (limited to 'locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po')
-rw-r--r--locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po444
1 files changed, 0 insertions, 444 deletions
diff --git a/locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po b/locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po
deleted file mode 100644
index 89911ca..0000000
--- a/locale/fr/LC_MESSAGES/_articles/2020-10-19-feature-flags-differences-between-backend-frontend-and-mobile.po
+++ /dev/null
@@ -1,444 +0,0 @@
-#
-msgid ""
-msgstr ""
-
-msgid ""
-"*This article is derived from a [presentation][presentation] on the same "
-"subject.*"
-msgstr ""
-
-msgid ""
-"When discussing about feature flags, I find that their costs and benefits "
-"are often well exposed and addressed. Online articles like \"[Feature Toggle"
-" (aka Feature Flags)][feature-flags-article]\" do a great job of explaining "
-"them in detail, giving great general guidance of how to apply techniques to "
-"adopt it."
-msgstr ""
-
-msgid ""
-"However the weight of those costs and benefits apply differently on backend,"
-" frontend or mobile, and those differences aren't covered. In fact, many of "
-"them stop making sense, or the decision of adopting a feature flag or not "
-"may change depending on the environment."
-msgstr ""
-
-msgid ""
-"In this article I try to make the distinction between environments and how "
-"feature flags apply to them, with some final best practices I've acquired "
-"when using them in production."
-msgstr ""
-
-msgid ""
-"[presentation]: {% link _slides/2020-10-19-rollout-feature-flag-experiment-"
-"operational-toggle.slides %} [feature-flags-article]: "
-"https://martinfowler.com/articles/feature-toggles.html"
-msgstr ""
-
-msgid "Why feature flags"
-msgstr ""
-
-msgid ""
-"Feature flags in general tend to be cited on the context of [continuous "
-"deployment](https://www.atlassian.com/continuous-"
-"delivery/principles/continuous-integration-vs-delivery-vs-deployment):"
-msgstr ""
-
-msgid "A: With continuous deployment, you deploy to production automatically"
-msgstr ""
-
-msgid "B: But how do I handle deployment failures, partial features, *etc.*?"
-msgstr ""
-
-msgid ""
-"A: With techniques like canary, monitoring and alarms, feature flags, *etc.*"
-msgstr ""
-
-msgid ""
-"Though adopting continuous deployment doesn't force you to use feature "
-"flags, it creates a demand for it. The inverse is also true: using feature "
-"flags on the code points you more obviously to continuous deployment. Take "
-"the following code sample for example, that we will reference later on the "
-"article:"
-msgstr ""
-
-msgid ""
-"While being developed, being tested for suitability or something similar, "
-"`notifyListeners()` may not be included in the code at once. So instead of "
-"keeping it on a separate, long-lived branch, a feature flag can decide when "
-"the new, partially implemented function will be called:"
-msgstr ""
-
-msgid ""
-"This allows your code to include `notifyListeners()`, and decide when to "
-"call it at runtime. For the price of extra things around the code, you get "
-"more dynamicity."
-msgstr ""
-
-msgid ""
-"So the fundamental question to ask yourself when considering adding a "
-"feature flag should be:"
-msgstr ""
-
-msgid "Am I willing to pay with code complexity to get dynamicity?"
-msgstr ""
-
-msgid ""
-"It is true that you can make the management of feature flags as "
-"straightforward as possible, but having no feature flags is simpler than "
-"having any. What you get in return is the ability to parameterize the "
-"behaviour of the application at runtime, without doing any code changes."
-msgstr ""
-
-msgid ""
-"Sometimes this added complexity may tilt the balance towards not using a "
-"feature flag, and sometimes the flexibility of changing behaviour at runtime"
-" is absolutely worth the added complexity. This can vary a lot by code base,"
-" feature, but fundamentally by environment: its much cheaper to deploy a new"
-" version of a service than to release a new version of an app."
-msgstr ""
-
-msgid ""
-"So the question of which environment is being targeted is key when reasoning"
-" about costs and benefits of feature flags."
-msgstr ""
-
-msgid "Control over the environment"
-msgstr ""
-
-msgid ""
-"The key differentiator that makes the trade-offs apply differently is how "
-"much control you have over the environment."
-msgstr ""
-
-msgid ""
-"When running a **backend** service, you usually are paying for the servers "
-"themselves, and can tweak them as you wish. This means you have full control"
-" do to code changes as you wish. Not only that, you decide when to do it, "
-"and for how long the transition will last."
-msgstr ""
-
-msgid ""
-"On the **frontend** you have less control: even though you can choose to "
-"make a new version available any time you wish, you can't force[^force] "
-"clients to immediately switch to the new version. That means that a) clients"
-" could skip upgrades at any time and b) you always have to keep backward and"
-" forward compatibility in mind."
-msgstr ""
-
-msgid ""
-"Even though I'm mentioning frontend directly, it applies to other "
-"environment with similar characteristics: desktop applications, command-line"
-" programs, *etc*."
-msgstr ""
-
-msgid ""
-"On **mobile** you have even less control: app stores need to allow your app "
-"to be updated, which could bite you when least desired. Theoretically you "
-"could make you APK available on third party stores like "
-"[F-Droid](https://f-droid.org/), or even make the APK itself available for "
-"direct download, which would give you the same characteristics of a frontend"
-" application, but that happens less often."
-msgstr ""
-
-msgid ""
-"On iOS you can't even do that. You have to get Apple's blessing on every "
-"single update. Even though we already know that is a [bad "
-"idea](http://www.paulgraham.com/apple.html) for over a decade now, there "
-"isn't a way around it. This is where you have the least control."
-msgstr ""
-
-msgid ""
-"In practice, the amount of control you have will change how much you value "
-"dynamicity: the less control you have, the more valuable it is. In other "
-"words, having a dynamic flag on the backend may or may not be worth it since"
-" you could always update the code immediately after, but on iOS it is "
-"basically always worth it."
-msgstr ""
-
-msgid ""
-"[^force]: Technically you could force a reload with JavaScript using "
-"`window.location.reload()`, but that not only is invasive and impolite, but "
-"also gives you the illusion that you have control over the client when you "
-"actually don't: clients with disabled JavaScript would be immune to such "
-"tactics."
-msgstr ""
-
-msgid "Rollout"
-msgstr ""
-
-msgid "A rollout is used to *roll out* a new version of software."
-msgstr ""
-
-msgid ""
-"They are usually short-lived, being relevant as long as the new code is "
-"being deployed. The most common rule is percentages."
-msgstr ""
-
-msgid ""
-"On the **backend**, it is common to find it on the deployment infrastructure"
-" itself, like canary servers, blue/green deployments, [a kubernetes "
-"deployment "
-"rollout](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-"
-"a-deployment), *etc*. You could do those manually, by having a dynamic "
-"control on the code itself, but rollbacks are cheap enough that people "
-"usually do a normal deployment and just give some extra attention to the "
-"metrics dashboard."
-msgstr ""
-
-msgid ""
-"Any time you see a blue/green deployment, there is a rollout happening: most"
-" likely a load balancer is starting to direct traffic to the new server, "
-"until reaching 100% of the traffic. Effectively, that is a rollout."
-msgstr ""
-
-msgid ""
-"On the **frontend**, you can selectively pick which user's will be able to "
-"download the new version of a page. You could use geographical region, IP, "
-"cookie or something similar to make this decision."
-msgstr ""
-
-msgid ""
-"CDN propagation delays and people not refreshing their web pages are also "
-"rollouts by themselves, since old and new versions of the software will "
-"coexist."
-msgstr ""
-
-msgid ""
-"On **mobile**, the Play Store allows you to perform fine-grained [staged "
-"rollouts](https://support.google.com/googleplay/android-"
-"developer/answer/6346149?hl=en), and the App Store allows you to perform "
-"limited [phased releases](https://help.apple.com/app-store-"
-"connect/#/dev3d65fcee1)."
-msgstr ""
-
-msgid ""
-"Both for Android and iOS, the user plays the role of making the download."
-msgstr ""
-
-msgid ""
-"In summary: since you control the servers on the backend, you can do "
-"rollouts at will, and those are often found automated away in base "
-"infrastructure. On the frontend and on mobile, there are ways to make new "
-"versions available, but users may not download them immediately, and many "
-"different versions of the software end up coexisting."
-msgstr ""
-
-msgid "Feature flag"
-msgstr ""
-
-msgid ""
-"A feature flag is a *flag* that tells the application on runtime to turn on "
-"or off a given *feature*. That means that the actual production code will "
-"have more than one possible code paths to go through, and that a new version"
-" of a feature coexists with the old version. The feature flag tells which "
-"part of the code to go through."
-msgstr ""
-
-msgid ""
-"They are usually medium-lived, being relevant as long as the new code is "
-"being developed. The most common rules are percentages, allow/deny lists, "
-"A/B groups and client version."
-msgstr ""
-
-msgid ""
-"On the **backend**, those are useful for things that have a long development"
-" cycle, or that needs to done by steps. Consider loading the feature flag "
-"rules in memory when the application starts, so that you avoid querying a "
-"database or an external service for applying a feature flag rule and avoid "
-"flakiness on the result due to intermittent network failures."
-msgstr ""
-
-msgid ""
-"Since on the **frontend** you don't control when to update the client "
-"software, you're left with applying the feature flag rule on the server, and"
-" exposing the value through an API for maximum dynamicity. This could be in "
-"the frontend code itself, and fallback to a \"just refresh the page\"/\"just"
-" update to the latest version\" strategy for less dynamic scenarios."
-msgstr ""
-
-msgid ""
-"On **mobile** you can't even rely on a \"just update to the latest version\""
-" strategy, since the code for the app could be updated to a new feature and "
-"be blocked on the store. Those cases aren't recurrent, but you should always"
-" assume the store will deny updates on critical moments so you don't find "
-"yourself with no cards to play. That means the only control you actually "
-"have is via the backend, by parameterizing the runtime of the application "
-"using the API. In practice, you should always have a feature flag to control"
-" any relevant piece of code. There is no such thing as \"too small code "
-"change for a feature flag\". What you should ask yourself is:"
-msgstr ""
-
-msgid ""
-"If the code I'm writing breaks and stays broken for around a month, do I "
-"care?"
-msgstr ""
-
-msgid ""
-"If you're doing an experimental screen, or something that will have a very "
-"small impact you might answer \"no\" to the above question. For everything "
-"else, the answer will be \"yes\": bug fixes, layout changes, refactoring, "
-"new screen, filesystem/database changes, *etc*."
-msgstr ""
-
-msgid "Experiment"
-msgstr ""
-
-msgid ""
-"An experiment is a feature flag where you care about analytical value of the"
-" flag, and how it might impact user's behaviour. A feature flag with "
-"analytics."
-msgstr ""
-
-msgid ""
-"They are also usually medium-lived, being relevant as long as the new code "
-"is being developed. The most common rule is A/B test."
-msgstr ""
-
-msgid ""
-"On the **backend**, an experiment rely on an analytical environment that "
-"will pick the A/B test groups and distributions, which means those can't be "
-"held in memory easily. That also means that you'll need a fallback value in "
-"case fetching the group for a given customer fails."
-msgstr ""
-
-msgid ""
-"On the **frontend** and on **mobile** they are no different from feature "
-"flags."
-msgstr ""
-
-msgid "Operational toggle"
-msgstr ""
-
-msgid ""
-"An operational toggle is like a system-level manual circuit breaker, where "
-"you turn on/off a feature, fail over the load to a different server, *etc*. "
-"They are useful switches to have during an incident."
-msgstr ""
-
-msgid ""
-"They are usually long-lived, being relevant as long as the code is in "
-"production. The most common rule is percentages."
-msgstr ""
-
-msgid ""
-"They can be feature flags that are promoted to operational toggles on the "
-"**backend**, or may be purposefully put in place preventively or after a "
-"postmortem analysis."
-msgstr ""
-
-msgid ""
-"On the **frontend** and on **mobile** they are similar to feature flags, "
-"where the \"feature\" is being turned on and off, and the client interprets "
-"this value to show if the \"feature\" is available or unavailable."
-msgstr ""
-
-msgid "Best practices"
-msgstr ""
-
-msgid "Prefer dynamic content"
-msgstr ""
-
-msgid ""
-"Even though feature flags give you more dynamicity, they're still somewhat "
-"manual: you have to create one for a specific feature and change it by hand."
-msgstr ""
-
-msgid ""
-"If you find yourself manually updating a feature flags every other day, or "
-"tweaking the percentages frequently, consider making it fully dynamic. Try "
-"using a dataset that is generated automatically, or computing the content on"
-" the fly."
-msgstr ""
-
-msgid ""
-"Say you have a configuration screen with a list of options and sub-options, "
-"and you're trying to find how to better structure this list. Instead of "
-"using a feature flag for switching between 3 and 5 options, make it fully "
-"dynamic. This way you'll be able to perform other tests that you didn't "
-"plan, and get more flexibility out of it."
-msgstr ""
-
-msgid "Use the client version to negotiate feature flags"
-msgstr ""
-
-msgid ""
-"After effectively finishing a feature, the old code that coexisted with the "
-"new one will be deleted, and all traces of the transition will vanish from "
-"the code base. However if you just remove the feature flags from the API, "
-"all of the old versions of clients that relied on that value to show the new"
-" feature will go downgrade to the old feature."
-msgstr ""
-
-msgid ""
-"This means that you should avoid deleting client-facing feature flags, and "
-"retire them instead: use the client version to decide when the feature is "
-"stable, and return `true` for every client with a version greater or equal "
-"to that. This way you can stop thinking about the feature flag, and you "
-"don't break or downgrade clients that didn't upgrade past the transition."
-msgstr ""
-
-msgid "Beware of many nested feature flags"
-msgstr ""
-
-msgid "Nested flags combine exponentially."
-msgstr ""
-
-msgid ""
-"Pick strategic entry points or transitions eligible for feature flags, and "
-"beware of their nesting."
-msgstr ""
-
-msgid "Include feature flags in the development workflow"
-msgstr ""
-
-msgid ""
-"Add feature flags to the list of things to think about during whiteboarding,"
-" and deleting/retiring a feature flags at the end of the development."
-msgstr ""
-
-msgid "Always rely on a feature flag on the app"
-msgstr ""
-
-msgid ""
-"Again, there is no such thing \"too small for a feature flag\". Too many "
-"feature flags is a good problem to have, not the opposite. Automate the "
-"process of creating a feature flag to lower its cost."
-msgstr ""
-
-msgid ""
-"function processTransaction() {\n"
-" validate();\n"
-" persist();\n"
-" // TODO: add call to notifyListeners()\n"
-"}\n"
-msgstr ""
-
-msgid ""
-"function processTransaction() {\n"
-" validate();\n"
-" persist();\n"
-" if (featureIsEnabled(\"activate-notify-listeners\")) {\n"
-" notifyListeners();\n"
-" }\n"
-"}\n"
-msgstr ""
-
-msgid ""
-"title: \"Feature flags: differences between backend, frontend and mobile\"\n"
-"date: 2020-10-19\n"
-"updated_at: 2020-11-03\n"
-"layout: post\n"
-"lang: en\n"
-"ref: feature-flags-differences-between-backend-frontend-and-mobile\n"
-"eu_categories: presentation"
-msgstr ""
-
-#~ msgid ""
-#~ "title: \"Feature flags: differences between backend, frontend and mobile\"\n"
-#~ "date: 2020-10-19\n"
-#~ "updated_at: 2020-11-03\n"
-#~ "layout: post\n"
-#~ "lang: en\n"
-#~ "ref: feature-flags-differences-between-backend-frontend-and-mobile\n"
-#~ "category: presentation"
-#~ msgstr ""