<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Comiscience</title>
    <description>The latest articles on Forem by Comiscience (@cosmicflood).</description>
    <link>https://forem.com/cosmicflood</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F841273%2F94e70792-af6b-4fa2-9195-ba446c14e771.jpg</url>
      <title>Forem: Comiscience</title>
      <link>https://forem.com/cosmicflood</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cosmicflood"/>
    <language>en</language>
    <item>
      <title>The Mistake We've Made with Our Open-Source Product: Premature Optimization</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Sat, 22 Feb 2025 06:40:56 +0000</pubDate>
      <link>https://forem.com/cosmicflood/the-mistake-weve-made-with-our-open-source-product-premature-optimization-4bmi</link>
      <guid>https://forem.com/cosmicflood/the-mistake-weve-made-with-our-open-source-product-premature-optimization-4bmi</guid>
      <description>&lt;p&gt;We started FeatBit (an &lt;a href="https://www.featbit.co" rel="noopener noreferrer"&gt;open-source feature flag platform&lt;/a&gt;) almost 4 years ago, and it has been open-sourced for 2 and a half years. Premature optimization is one of the biggest mistakes we've made.&lt;/p&gt;

&lt;p&gt;We don’t regret the optimizations we implemented, as some customers appreciate them. However, our growth path could have been easier if we had started simpler instead of focusing on premature optimization.&lt;/p&gt;

&lt;p&gt;This is our &lt;a href="https://www.featbit.co/developers/ih-keep-your-open-source-product-simple-and-scalable" rel="noopener noreferrer"&gt;original blog - Keep open-source product simple and scalable&lt;/a&gt;. To make it easier to read, I’ve copied my content here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;We are FeatBit, an open-source feature flag platform. This article discusses the mistakes we made and the lessons we learned while building and maintaining an open-source product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premature optimization is the root of all evil&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.featbit.co%2Fdevelopers%2Fblog%2Fih-keep-your-open-source-product-simple-and-scalable%2F002.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.featbit.co%2Fdevelopers%2Fblog%2Fih-keep-your-open-source-product-simple-and-scalable%2F002.webp" alt="Premature Optimization for Open Source Project" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FeatBit was designed as a self-hosting-friendly service, and it has remained that way until today. On the other hand, FeatBit wanted to provide customers with a performance guarantee. So, we put in a lot of effort at the very beginning of our open-source journey:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We offer two versions to suit different needs:

&lt;ul&gt;
&lt;li&gt;Standard: Supports high concurrency and connections, but does not include experimentation analysis.&lt;/li&gt;
&lt;li&gt;Professional: Based on Standard, with added capabilities to handle large data volumes for experimentation analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Our platform uses WebSocket connections for real-time feature flag updates, and we’ve made efforts to ensure:

&lt;ul&gt;
&lt;li&gt;High performance.&lt;/li&gt;
&lt;li&gt;Scalability for high concurrency.&lt;/li&gt;
&lt;li&gt;High availability for continuous uptime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;We provide several ready-to-use &lt;a href="https://github.com/featbit/featbit-charts" rel="noopener noreferrer"&gt;open-source deployment solutions&lt;/a&gt;, such as:

&lt;ul&gt;
&lt;li&gt;Docker Compose.&lt;/li&gt;
&lt;li&gt;Kubernetes.&lt;/li&gt;
&lt;li&gt;Terraform.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These efforts seemed like the right things to do at the time. However, after receiving feedback from customers, we realized that we had made several mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintenance Complexity.&lt;/li&gt;
&lt;li&gt;Premature Optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Maintenance Complexity
&lt;/h2&gt;

&lt;p&gt;To ensure high performance, scalability, and availability, we introduced Redis, MongoDB, Kafka, and ClickHouse as databases. However, the big challenges we faced are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;MongoDB is well-known, but it's not widely used by most of our target customers.&lt;/li&gt;
&lt;li&gt;Many of our target customers lack experience with Redis.&lt;/li&gt;
&lt;li&gt;Kafka and ClickHouse are even less relevant; many B2B customers don’t need them because they don’t deal with large volumes of data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It doesn’t make sense to require customers to learn and manage technologies that FeatBit doesn’t directly provide, as this can be a dealbreaker when deciding whether to adopt our product. Especially when the maintainers are Ops teams, not the developers and product managers who will actually use FeatBit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Premature Optimization
&lt;/h2&gt;

&lt;p&gt;We might not have built such a complex system at the beginning of our product development.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;REST APIs are sufficient for many use cases. We could have supported WebSocket after receiving enough feedback.&lt;/li&gt;
&lt;li&gt;We didn't need to focus on high performance for individual calculation resources. Making it scalable would have been enough.&lt;/li&gt;
&lt;li&gt;A multiple-region high availability solution wasn't necessary at the start. Edge agents might have been simple enough.&lt;/li&gt;
&lt;li&gt;We didn't need to add too many features (such as A/B experimentation) initially. Focusing on feature flags might have been sufficient.&lt;/li&gt;
&lt;li&gt;We didn't need to design a microservice architecture at the beginning. A monolithic architecture might have been enough.&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By considering these points, we could have started with a much simpler architecture, allowing us to focus more on marketing and enabling users to easily deploy and use FeatBit in their production environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pivot to Simplicity
&lt;/h2&gt;

&lt;p&gt;We recognized our mistakes, but time has passed. Fortunately, the complex system we built allowed us to gain highly valued paid customers. However, to acquire more customers, we need to simplify our product so it can be used by a broader audience.&lt;/p&gt;

&lt;p&gt;Making decisions is always difficult, because supporting a simpler version means we won't have time to develop new features. So, we conducted further investigation before making a decision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We identified which databases are most commonly used by our target customers.&lt;/li&gt;
&lt;li&gt;We spoke with potential customers to understand their actual needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Based on this, we decided to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provide a standalone version that uses only PostgreSQL as the database, removing Redis, MongoDB, Kafka, and ClickHouse.&lt;/li&gt;
&lt;li&gt;Support both MongoDB and PostgreSQL as primary databases, catering to different customer needs.&lt;/li&gt;
&lt;li&gt;Improve the FeatBit Agent to simplify many scenarios:

&lt;ul&gt;
&lt;li&gt;Customers who don't want to self-host the entire FeatBit system can host an agent to keep data in their own environment.&lt;/li&gt;
&lt;li&gt;Customers who don't want to self-host a multi-region FeatBit system can deploy agents in different regions to maintain high availability and scalability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Premature optimization is detrimental to acquiring early customers. However, if you've already built a complex system and received enough customer feedback, it's never too late to simplify your solution.&lt;/p&gt;

&lt;p&gt;In the future, we may reduce the number of microservices and simplify our system. This will not only improve deployment and maintenance but also make it more developer-friendly.&lt;/p&gt;

</description>
      <category>devcyclechallenge</category>
      <category>programming</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Launchdarkly Open Source Alternatives</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Mon, 18 Dec 2023 09:56:39 +0000</pubDate>
      <link>https://forem.com/cosmicflood/launchdarkly-open-source-alternatives-4lcf</link>
      <guid>https://forem.com/cosmicflood/launchdarkly-open-source-alternatives-4lcf</guid>
      <description>&lt;p&gt;Here are 3 articles about Launchdarkly Alternatives:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools"&gt;Best Free and Open Source Feature Flag Tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co/blogs/What-Are-the-Best-Open-Source-Feature-Flags-Tools-Available-in-2023"&gt;What Are the Best Open Source Feature Flags Tools Available in 2023?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co/blogs/launchdarkly-alternatives"&gt;What Are the Viable Alternatives to LaunchDarkly for Feature Flagging&lt;/a&gt;&lt;/p&gt;

</description>
      <category>launchdarkly</category>
      <category>featureflags</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Flagsmith vs. Unleash: Which Open Source Feature Flag Tool Wins?</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Wed, 15 Nov 2023 08:58:16 +0000</pubDate>
      <link>https://forem.com/cosmicflood/flagsmith-vs-unleash-which-open-source-feature-flag-tool-wins-7ea</link>
      <guid>https://forem.com/cosmicflood/flagsmith-vs-unleash-which-open-source-feature-flag-tool-wins-7ea</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Unleash/unleash" rel="noopener noreferrer"&gt;Unleash&lt;/a&gt; and &lt;a href="https://github.com/flagsmith/flagsmith" rel="noopener noreferrer"&gt;Flagsmith&lt;/a&gt; are two popular platforms for &lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;feature management&lt;/a&gt;. They allow developers to deploy, test, and optimize features without affecting the end users. In this blog post, we will compare them in terms of tech stack, features, integrations, pricing, support community, and open source license.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp3rxr43le5rwjum9dh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwp3rxr43le5rwjum9dh2.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt;: Unleash is built with Node.js and PostgreSQL, while Flagsmith is built with Python and PostgreSQL. Both platforms use Redis for caching and message queueing. Unleash and Flagsmith have both a web interface written in React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;: Both platforms offer similar features, such as &lt;a href="https://www.featbit.co/" rel="noopener noreferrer"&gt;feature flags&lt;/a&gt;, &lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;feature toggles&lt;/a&gt;, feature experiments, multivariate testing, segmentation, targeting, and feedback. However, Unleash has some unique features, such as gradual rollout, kill switch, activation strategies, custom strategies, and plugins. Flagsmith has some unique features, such as identity management, user traits, remote config, environments, and organizations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrations&lt;/strong&gt;: Both platforms support various integrations with third-party tools and services. Unleash integrates with Slack, Datadog, Prometheus, Sentry, and more. Flagsmith integrates with Segment, Amplitude, Mixpanel, Optimizely, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr7eim85v1hmm9ejq8nn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr7eim85v1hmm9ejq8nn.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;: Both platforms offer free and paid plans. Unleash has a free plan for up to 10 users and 1000 feature flags. Its paid plans start from $49 per month for up to 25 users and 2500 feature flags. Flagsmith has a free plan for up to 50 users and unlimited feature flags. Its paid plans start from $99 per month for up to 500 users and unlimited feature flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Support community&lt;/strong&gt;: Both platforms have active support communities on GitHub, Slack, Discord, Stack Overflow, and other channels. Unleash has over 9000 stars on GitHub and over 1900 members on Slack. Flagsmith has over 3000 stars on GitHub and over 500 members on Discord.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source license&lt;/strong&gt;: Both platforms are open source and have permissive licenses. Unleash is licensed under the Apache License 2.0, while Flagsmith is licensed under the BSD 3-Clause License.&lt;/p&gt;

&lt;p&gt;If you're not the fun of Javascript and Python, you can try other &lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;feature flag tools&lt;/a&gt; which is built with Golang, C# and .NET&lt;/p&gt;

&lt;h2&gt;
  
  
  FeatBit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co" rel="noopener noreferrer"&gt;FeatBit&lt;/a&gt; provides an enterprise-level feature flag service. It's completely open source and licensed under the MIT license. It's basically built with .NET and MongoDB (support Azure CosmosDB, PostgreSQL with FerretDB), and uses Redis for caching and message queuing. FeatBit has a web interface written in Angular.&lt;/p&gt;

&lt;p&gt;FeatBit also offers a professional version that adds Kafka for message queuing and ClickHouse for data warehousing. This provides a robust solution for companies that have high traffic (like more than millions MAU) and need to do data analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwr78jaul13ms2qcpd9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwr78jaul13ms2qcpd9u.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FeatBit provides a more flexible way to do traffic splitting for ab test, such as mutually exclusive and orthogonal layering features to solve overlapping problems. FeatBit currently also provides a basic frequentist analysis tool for ab test.&lt;/p&gt;

&lt;p&gt;FeatBit supports various integrations with third party tools and services. Like Flagsmith and Unleash, FeatBit also offers OpenFeature SDKs to avoid vendor lock-in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j1wvjizul0x1qvsro3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j1wvjizul0x1qvsro3e.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FeatBit offers more free open source features than Flagsmith and Unleash. It now offers a self-hosting solution with unlimited seats for enterprise-level customers. FeatBit has active support communities on GitHub and Slack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go Feature Flag Tools
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/thomaspoignant/go-feature-flag" rel="noopener noreferrer"&gt;GoFeatureFlag&lt;/a&gt; is a lightweight and fast feature flag service for Go applications. It's fully open source and licensed under the Apache License 2.0. It's built with Go and uses a pluggable storage system that supports various backends, such as Consul, Redis, YAML file, etc. GoFeatureFlag has a simple and intuitive API that makes it easy to use in any Go project. GoFeatureFlag is a more performant and lightweight solution than LaunchDarkly and ConfigCat. It does not require any external dependencies or services, and can run entirely within your own infrastructure. GoFeatureFlag has active development and maintenance on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnx2kc2dyqfp5tzegclb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnx2kc2dyqfp5tzegclb.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/flipt-io/flipt" rel="noopener noreferrer"&gt;Flipt&lt;/a&gt; is a self-hosted feature flag solution that helps you deliver faster and safer software. It's completely open source and licensed under the Apache 2.0 license. It's built with Go and uses SQLite, PostgreSQL, or MySQL as the backend database. Flipt has a web interface written in React. Flipt also has a cloud version that offers more features and benefits for teams that want to scale up their feature flag management. This includes advanced analytics, team collaboration, and security features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Others
&lt;/h2&gt;

&lt;p&gt;If you're interested in learning more feature flag tools, you can check out the following resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;Self-Hosted and Open Source Feature Flag tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://posthog.com/blog/best-open-source-feature-flag-tools" rel="noopener noreferrer"&gt;All-in-one suite of product and data tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/search?q=feature+flag&amp;amp;type=repositories" rel="noopener noreferrer"&gt;GitHub Feature Flag Repositories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Which open source feature flag tool will win in 2023? Unleash, Flagsmith, FeatBit (and others) can all be the winners, it depends on which tech stack, pricing and features you need. So, you can choose the best one for your project.&lt;/p&gt;




&lt;p&gt;Original article: &lt;a href="https://www.featbit.co/blogs/flagsmith-vs-unleash" rel="noopener noreferrer"&gt;https://www.featbit.co/blogs/flagsmith-vs-unleash&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to implement feature flags</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Thu, 09 Nov 2023 03:00:04 +0000</pubDate>
      <link>https://forem.com/cosmicflood/how-to-implement-feature-flags-m1b</link>
      <guid>https://forem.com/cosmicflood/how-to-implement-feature-flags-m1b</guid>
      <description>&lt;p&gt;Original Blog: &lt;a href="https://www.featbit.co/blogs/how-to-implement-feature-flags" rel="noopener noreferrer"&gt;https://www.featbit.co/blogs/how-to-implement-feature-flags&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co" rel="noopener noreferrer"&gt;Feature flags&lt;/a&gt;, also known as feature toggles, have become an essential tool for modern software development. They enable developers to control the release of new features and updates in a flexible and controlled manner. In this blog post, we'll explore what feature flags are, their classical and modern use cases, and how to implement them effectively in front-end, mobile, and server-side applications. We'll also delve into the concept of overlapping design A/B testing and how feature flags play a crucial role in building robust experimentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classical Use Cases: Derisk Your Deployments
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Testing in Production: Feature flags enable you to test new features in a production environment without exposing them to all users. This reduces the risk associated with untested code.&lt;/li&gt;
&lt;li&gt;Canary Release: Gradually roll out new features to a subset of users before making them available to everyone, ensuring a smoother deployment.&lt;/li&gt;
&lt;li&gt;Allow/Block List: Control feature access for specific users or groups, giving you fine-grained permission management.&lt;/li&gt;
&lt;li&gt;Beta Testing: Invite a select group of users to try out new features, gathering feedback before a full release.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ayxvgdrhuep0qvxn2zc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ayxvgdrhuep0qvxn2zc.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Modern Use Cases: SRE and Growth
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Observability: Gain insights into feature usage, performance, and user behavior through feature flag data and analytics. This allows the system to automatically trigger a feature rollback operation at the first sign of trouble. For more information, you can visit &lt;a href="https://docs.featbit.co/integrations/datadog" rel="noopener noreferrer"&gt;FeatBit's DataDog integration documentation&lt;/a&gt; or blog article 《&lt;a href="https://www.featbit.co/blogs/feature-flags-observation-tool-gradual-db-migration" rel="noopener noreferrer"&gt;Use of Feature Flags and Observability Tools for Gradual Database Migration&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;Experimentation: Implement feature flags to A/B test new ideas, gather data, and make data-driven decisions about feature effectiveness. Feature flags give you a more flexible solution to meet the traffic splitting requirments in a complex experimentation design, such as Orthogonal Layering, Mutually Exclusive, etc. You can combine a feature flag tool with your data analysis tool to create a better experimentation system rather than buying an expensive third-party AB testing service.&lt;/li&gt;
&lt;li&gt;Software Monetization: Use feature flags to control access to premium features, subscriptions, or other monetization strategies. This allows you to adapt your pricing model and offerings based on user behavior and feedback. You can read following article to get a realworld example, 《&lt;a href="https://docs.sentinel.thalesgroup.com/softwareandservices/EMS/EMSdocs/UG/featureflags.htm#:~:text=Use%20Sentinel%20EMS%3F-,What%20are%20Feature%20Flags%3F,runtime%2C%20without%20deploying%20new%20code." rel="noopener noreferrer"&gt;Sentinel EMS Workflow with Feature Flag Management Platforms&lt;/a&gt;》&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Standardizing with OpenFeature
&lt;/h2&gt;

&lt;p&gt;The trend in feature flag implementation is to standardize with solutions like &lt;a href="https://openfeature.dev/" rel="noopener noreferrer"&gt;OpenFeature&lt;/a&gt; that provide SDKs and templates to streamline the process. Standardization is beneficial for 2 reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Avoid Vendor Lock-In: Many third-party &lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;feature flag tools&lt;/a&gt; now support the OpenFeature SDK standard, reducing the risk of vendor lock-in and giving you more flexibility.&lt;/li&gt;
&lt;li&gt;Essential Interfaces: OpenFeature provides essential interfaces to help you build a robust feature flag SDK. These interfaces help ensure you follow best practices and maintain consistency.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Implementing Feature Flags Across the Stack
&lt;/h2&gt;

&lt;p&gt;A feature flag can be implemented across all your software applications: Web and Mobile APP, Back-end Services, Algorithms, and so on. Here's an example of how to use a feature flag across an entire project. Suppose you have a new method to tell users when to buy Google stock. The new version changes the user interface, the backend data source, and the calculation algorithm, so you need to keep all pages consistent for the same user.&lt;/p&gt;

&lt;p&gt;You can create one or more feature flags to control the new version release. Here we will create a single boolean feature flag to control the release of a new feature. First, we will create a feature flag called "The Art of Buying Stocks". The figure below shows what a feature flag looks like in FeatBit's user interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2if80wni7f4kyee9u8z0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2if80wni7f4kyee9u8z0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then let's see how we implement this feature flag in our front-end and back-end applications. &lt;/p&gt;

&lt;p&gt;Suppose you have a UI that suggests when to buy Microsoft stock. You have two components, each presenting a different UI view for a different version of "The art of buying stocks". You use a feature flag to control which component is displayed or not. Here's an example in VUE code (if you're using the feature flag React, you'll just need to modify the code with React style):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5r3yiwovkwq3le8o3xba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5r3yiwovkwq3le8o3xba.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To make the user see the same UI in both Web APP and Mobile APP, you should also implement such kind of work in your Mobile APP. &lt;/p&gt;

&lt;p&gt;Suppose the new method (m2) needs to read additional data different from m1. You now have several ways to implement it. Here's my favorite ways (one or another):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add feature flag that wraps and controls the different data retrieval functions in its parent function. But this adds some extra work to clear the function flag in both front-end and back-end code.&lt;/li&gt;
&lt;li&gt;Add a new API for the new method (m2), so we don't need to add a feature flag in the backend anymore. But:

&lt;ul&gt;
&lt;li&gt;Adding a new API may cause extra work for the API gateway.&lt;/li&gt;
&lt;li&gt;You have to delete the whole API when you finally choose the new method.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Here's an example in asp.net core. If the feature flag returns "m2", the program will retrieve the data source using the "RetriveDataFromFeatBiDB()" function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7e6jj9ljxj1xe6nusws.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7e6jj9ljxj1xe6nusws.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you implement the code in your application, the rest things you need to do is just control and release the feature in the UI. As shown in the figure shown below, you can set a custom rule to release new methods only to users who live in California. To minimize the potential risk, you can reduce the blast radius to just 10% of users. (This is also called progressive rollout)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu1rv70qkmpoxs2r2y10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffu1rv70qkmpoxs2r2y10.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Robust Overlapping Design A/B Testing
&lt;/h2&gt;

&lt;p&gt;Overlapping design A/B testing involves running multiple experiments simultaneously, where users can be part of multiple experiments simultaneously. A robust feature flags service should meet the following requirements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Able to create Orthogonal layers to stacking tests in an independent, non-overlapping manner. Each variation remains isolated, simplifying analysis and minimizing conflicts and unintended consequences.&lt;/li&gt;
&lt;li&gt;Should be able to avoid conflicts, it's essential to make parameters mutually exclusive. Feature flags are instrumental in achieving this, allowing precise control over which users experience specific variations or changes.&lt;/li&gt;
&lt;li&gt;Able to divide your user base into distinct groups based on relevant attributes or behavior. This allows you to run experiments on specific user segments, providing insights into how changes affect different groups.&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Many &lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;feature flag tools&lt;/a&gt; have tried to provide features to support this. FeatBit is a good open source solution to achieve this goal. Figure below shows how FeatBit empowers the AB test design with orthogonal layers and mutually exclusive split feature flags traffic in a single layer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9c7tin7e53pkx9xqnudm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9c7tin7e53pkx9xqnudm.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature Flag Open Source Tools
&lt;/h2&gt;

&lt;p&gt;I wrote before another article about the tools, read article 《&lt;a href="https://www.featbit.co/blogs/Free-and-Open-Source-Feature-Flag-Tools" rel="noopener noreferrer"&gt;Best Free and Open Source Feature Flag Tools&lt;/a&gt;》.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.featbit.co" rel="noopener noreferrer"&gt;Feature flags&lt;/a&gt; are a critical component of modern software development, allowing you to derisk deployments, run experiments, and maintain a flexible release strategy. By standardizing with solutions like OpenFeature and implementing feature flags consistently across your stack, you can achieve a robust and adaptable approach to software development and testing. Embrace the power of feature flags to build better products and make data-driven decisions.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploy Feature Flags Management Service on Azure using Terraform</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Sat, 07 Oct 2023 06:48:00 +0000</pubDate>
      <link>https://forem.com/cosmicflood/deploy-feature-flags-management-service-on-azure-using-terraform-iae</link>
      <guid>https://forem.com/cosmicflood/deploy-feature-flags-management-service-on-azure-using-terraform-iae</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/featbit/featbit"&gt;FeatBit&lt;/a&gt; is a fast, scalable, and popular open-source feature flags service that enables teams to test their applications in production, roll out features incrementally, and instantly rollback if an issue arises.&lt;/p&gt;

&lt;p&gt;This guide describes how to deploy FeatBit on Azure using Terraform. In lieu of the blog, you can visit our &lt;a href="https://github.com/featbit/azure-container-apps"&gt;GitHub repository&lt;/a&gt; directly to start your installation journey. This &lt;a href="https://github.com/featbit/azure-container-apps"&gt;GitHub repository&lt;/a&gt; contains terraform code for deploying FeatBit on Azure. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AUEjvuXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gao894m69nb8na2ddzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AUEjvuXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5gao894m69nb8na2ddzy.png" alt="Image description" width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the figure above, FeatBit's services are deployed as Azure Container Apps (ACA) in Azure. Such as FeatBit's UI portal, FeatBit's API server, FeatBit's evaluation server, FeatBit's DA server. Evaluation service and API service communicate with DA service inside ACA.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: ACA is actually a managed Kubernetes cluster. You can find more information about ACA in &lt;a href="https://docs.microsoft.com/en-us/azure/container-apps/"&gt;Azure Container Apps official document&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All services are located in an Azure VNet, we use private endpoint and private DNS zone to secure the access to Azure Cache for Redis and Azure CosmosDB for MongoDB. You can find more information about private endpoint and private DNS zone in &lt;a href="https://docs.microsoft.com/en-us/azure/private-link/private-endpoint-overview"&gt;Azure official document&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;FeatBit's UI portal, API server and Evaluation server are exposed to the public internet through an Azure Load Balancer and Azure IP addresses. You can find more information about Azure Load Balancer in &lt;a href="https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-overview"&gt;Azure official document&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download Terraform Code
&lt;/h2&gt;

&lt;p&gt;Download the Terraform code source from the &lt;a href="https://github.com/featbit/azure-container-apps"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with Terraform Azure Provider
&lt;/h2&gt;

&lt;p&gt;If you're not familiar with Terraform Azure Provider, you can follow the steps in the &lt;a href="https://developer.hashicorp.com/terraform/tutorials/azure-get-started/azure-build"&gt;official Azure Provider tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy FeatBit to your Azure
&lt;/h2&gt;

&lt;p&gt;Run &lt;code&gt;terraform init&lt;/code&gt; to download the required providers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;terraform plan&lt;/code&gt; to see what will be deployed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;terraform apply&lt;/code&gt; to deploy FeatBit to your Azure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before applying the Terraform deployment, you can modify variables defined in &lt;code&gt;variables.tf&lt;/code&gt; files to customize your deployment. For example, you can&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change the name of the resource group by changing the value of the &lt;code&gt;resource_group_name&lt;/code&gt; variable in the &lt;code&gt;variables.tf&lt;/code&gt; file in the &lt;code&gt;terraform&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Change the name of the resources location by changing the value of &lt;code&gt;location&lt;/code&gt; variable in the &lt;code&gt;variables.tf&lt;/code&gt; file in the &lt;code&gt;terraform&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Change the redis configuration by changing the value of &lt;code&gt;redis&lt;/code&gt; variable in the &lt;code&gt;variables.tf&lt;/code&gt; file in the &lt;code&gt;terraform&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To change cpu, memory, number of replicas of each container app, you currently have to edit directly in the &lt;code&gt;main.tf&lt;/code&gt; file in the &lt;code&gt;terraform/aca&lt;/code&gt; directory. We will add these variables in the future to make installation easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Support
&lt;/h2&gt;

&lt;p&gt;The current Terraform code is actually only for the FeatBit Standard version. &lt;a href="https://docs.featbit.co/docs/tech-stack/standard-vs.-professional"&gt;Click here to see the difference between Standard and Pro version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For any questions, you can contact us by creating an issue, joining our &lt;a href="https://join.slack.com/t/featbit/shared_invite/zt-1ew5e2vbb-x6Apan1xZOaYMnFzqZkGNQ"&gt;Slack channel&lt;/a&gt;, or emailing us at &lt;a href="//mailto:support@featbit.co"&gt;support@featbit.co&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>featureflags</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Deploying the Feature Flags Service to Azure Kubernetes Service (AKS) using Helm, Exposed via Azure Load Balancer</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Thu, 10 Aug 2023 11:39:01 +0000</pubDate>
      <link>https://forem.com/cosmicflood/deploying-the-feature-flags-service-to-azure-kubernetes-service-aks-using-helm-exposed-via-azure-load-balancer-44lj</link>
      <guid>https://forem.com/cosmicflood/deploying-the-feature-flags-service-to-azure-kubernetes-service-aks-using-helm-exposed-via-azure-load-balancer-44lj</guid>
      <description>&lt;p&gt;&lt;a href="https://www.featbit.co" rel="noopener noreferrer"&gt;FeatBit&lt;/a&gt; is an open-source feature flags service that enables teams to test their applications in production, roll out features incrementally, and instantly rollback if an issue arises.&lt;/p&gt;

&lt;p&gt;This guide outlines how to deploy FeatBit to Azure Kubernetes Service (AKS) using Helm charts, with services exposed via Azure Load Balancer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An active Azure subscription.&lt;/li&gt;
&lt;li&gt;An AKS cluster.&lt;/li&gt;
&lt;li&gt;Azure CLI installed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kubectl&lt;/code&gt; installed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating Public Static IPs for FeatBit Services
&lt;/h2&gt;

&lt;p&gt;FeatBit utilizes three public services:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;UI Portal&lt;/strong&gt;: This is the interface for team members to manage feature flags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Server&lt;/strong&gt;: The backend which the portal communicates with to fetch and manage feature flags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation Server&lt;/strong&gt;: The endpoint SDKs communicate with to retrieve feature flag variations or rules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each service requires its own public IP. Here's how you can set them up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Public IP for the UI Portal&lt;/span&gt;
az network public-ip create &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group containing your AKS&lt;span class="s1"&gt;'s vnet} --name featbit-ui-ip --sku Standard --allocation-method static

# Public IP for the API Service
az network public-ip create --resource-group {resource group containing your AKS'&lt;/span&gt;s vnet&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; featbit-api-ip &lt;span class="nt"&gt;--sku&lt;/span&gt; Standard &lt;span class="nt"&gt;--allocation-method&lt;/span&gt; static

&lt;span class="c"&gt;# Public IP for the Evaluation Service&lt;/span&gt;
az network public-ip create &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group containing your AKS&lt;span class="s1"&gt;'s vnet} --name featbit-eval-ip --sku Standard --allocation-method static
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve the IPs using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az network public-ip show &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group containing your AKS&lt;span class="s1"&gt;'s vnet} --name featbit-ui-ip --query ipAddress --output tsv

az network public-ip show --resource-group {resource group containing your AKS'&lt;/span&gt;s vnet&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; featbit-api-ip &lt;span class="nt"&gt;--query&lt;/span&gt; ipAddress &lt;span class="nt"&gt;--output&lt;/span&gt; tsv

az network public-ip show &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group containing your AKS&lt;span class="s1"&gt;'s vnet} --name featbit-eval-ip --query ipAddress --output tsv
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Granting Delegated Permissions to AKS Cluster Identity
&lt;/h1&gt;

&lt;p&gt;Before deploying services with a load balancer, ensure the AKS cluster identity has the necessary permissions to the node resource group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;az aks show &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;your AKS name&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group name where your aks located &lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; identity.principalId &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;RG_SCOPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;az group show &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;resource group containing your public IPs&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; tsv&lt;span class="si"&gt;)&lt;/span&gt;

az role assignment create &lt;span class="nt"&gt;--assignee&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;--role&lt;/span&gt; &lt;span class="s2"&gt;"Network Contributor"&lt;/span&gt; &lt;span class="nt"&gt;--scope&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RG_SCOPE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Deploying with Helm and Custom Values
&lt;/h1&gt;

&lt;p&gt;Add the FeatBit Helm repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add featbit https://featbit.github.io/featbit-charts/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone and navigate to the Helm chart repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/featbit/featbit-charts

&lt;span class="nb"&gt;cd&lt;/span&gt; ./featbit-charts/charts/featbit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;code&gt;featbit-charts/charts/featbit/examples&lt;/code&gt; directory, locate the AKS example file, &lt;code&gt;expose-services-via-azurelb.yaml&lt;/code&gt;. Replace placeholders ({}) with the appropriate values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apiExternalUrl&lt;/code&gt;, the URL the UI portal utilizes to retrieve feature flags.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;evaluationServerExternalUrl&lt;/code&gt;, the URL the SDK accesses to obtain variations or rules for feature flags.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;staticIP&lt;/code&gt; of &lt;code&gt;ui.service&lt;/code&gt;, &lt;code&gt;api.service&lt;/code&gt; and &lt;code&gt;els.service&lt;/code&gt;, the public IPs you created in previous step.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;service.beta.kubernetes.io/azure-load-balancer-resource-group&lt;/code&gt;, the name of the resource group where your public IPs are situated.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiExternalUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://{API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Public&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;IP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Address,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ex.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;4.194.69.254}"&lt;/span&gt;
&lt;span class="na"&gt;evaluationServerExternalUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://{Evaluation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Service&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Public&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;IP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Address,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ex.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;4.193.158.12}"&lt;/span&gt;
&lt;span class="na"&gt;autoDiscovery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LoadBalancer&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;service.beta.kubernetes.io/azure-load-balancer-resource-group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Resource Group where your Public IP located in&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. myNetworkResourceGroup&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;staticIP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;UI Portal Public IP Address&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. 4.194.13.155&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LoadBalancer&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;service.beta.kubernetes.io/azure-load-balancer-resource-group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Resource Group where your Public IP located in&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. myNetworkResourceGroup&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;staticIP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;API Service Public IP Address&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. 4.194.69.254&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

&lt;span class="na"&gt;els&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LoadBalancer&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;service.beta.kubernetes.io/azure-load-balancer-resource-group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Resource Group where your Public IP located in&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. myNetworkResourceGroup&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;staticIP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;Evaluation Service Public IP Address&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;ex. 4.193.158.12&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preview the Helm installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;featbit featbit/featbit &lt;span class="nt"&gt;-f&lt;/span&gt; ./examples/expose-services-via-azurelb.yaml &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If all looks well, install the Helm chart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm &lt;span class="nb"&gt;install &lt;/span&gt;featbit featbit/featbit &lt;span class="nt"&gt;-f&lt;/span&gt; ./examples/expose-services-via-azurelb.yaml

&lt;span class="c"&gt;# or to upgrade&lt;/span&gt;
helm upgrade &lt;span class="nt"&gt;--install&lt;/span&gt; featbit &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ./examples/expose-services-via-azurelb.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NOTE: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure you run the command from the directory containing &lt;code&gt;expose-services-via-azurelb.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Specify a namespace with &lt;code&gt;--namespace&lt;/code&gt; option during installation if needed.&lt;/li&gt;
&lt;li&gt;Adjust replica counts or disable autoscaling in the YAML file as desired in &lt;code&gt;expose-services-via-azurelb.yaml&lt;/code&gt; file:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.Values.{service name， ex. api | ui | els | das }.replicaCount&lt;/code&gt;, the default value is 1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.Values.api.autoscaling.enabled&lt;/code&gt;, set the value to &lt;code&gt;false&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h1&gt;
  
  
  Verification
&lt;/h1&gt;

&lt;p&gt;Check that the services and pods are running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc

kubectl get po
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should show output similar to the provided image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnonsu2cr3e0aig74gjf5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnonsu2cr3e0aig74gjf5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, access the UI Portal via the public IP you established earlier:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4exe4yrk8syu9l41vpeu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4exe4yrk8syu9l41vpeu.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://andrewlock.net/deploying-asp-net-core-applications-to-kubernetes-part-3-deploying-applications-with-helm/" rel="noopener noreferrer"&gt;Deploying ASP.NET Core applications to Kubernetes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/featbit/featbit-charts" rel="noopener noreferrer"&gt;FeatBit's helm chart repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/load-balancer-standard" rel="noopener noreferrer"&gt;Use a public standard load balancer in Azure Kubernetes Service (AKS)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Original articles: &lt;a href="https://www.featbit.co/blogs/deploy-featbit-to-aks-alb" rel="noopener noreferrer"&gt;https://www.featbit.co/blogs/deploy-featbit-to-aks-alb&lt;/a&gt;&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>kubernetes</category>
      <category>azure</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Use of Feature Flags and Observability Tools for Gradual and Safety Database Migration</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Tue, 25 Jul 2023 16:07:49 +0000</pubDate>
      <link>https://forem.com/cosmicflood/use-of-feature-flags-and-observability-tools-for-gradual-database-migration-2cbi</link>
      <guid>https://forem.com/cosmicflood/use-of-feature-flags-and-observability-tools-for-gradual-database-migration-2cbi</guid>
      <description>&lt;h2&gt;
  
  
  Scenario Description
&lt;/h2&gt;

&lt;p&gt;Many companies encounter situations requiring database upgrades or migrations, particularly when transitioning from self-hosted database services to cloud-based services, from on-premises data centers to cloud data centers, and from old databases to new ones. Throughout the migration process, it's vital to ensure stability, prevent data loss, and avoid service downtime. One of the most common migration methods is the "Dual Write Database Migration."&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;The process of dual write migration is as follows, illustrated in the diagram below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initial Stage - The application interacts (reads/writes) with only the old database.&lt;/li&gt;
&lt;li&gt;On the existing code that reads/writes to the old database, we need to add code to read/write to the new database. For example, when inserting a record into a table, the data must be inserted into both the old and new databases simultaneously. Typically, these two insert operations are executed in parallel to maintain the original service call handling time as much as possible.&lt;/li&gt;
&lt;li&gt;When a database write request comes in, it is written to the old database and a small percentage of the traffic is also written to the new database.&lt;/li&gt;
&lt;li&gt;The percentage of traffic written to the new database is gradually increased until it reaches 100%. If any issues arise during this process, we can promptly rollback without impacting the production environment.&lt;/li&gt;
&lt;li&gt;After the write migration is complete, we begin to gradually increase the amount of data read from the new database, initially allowing 10% of the traffic to perform read operations on the new database. We measure performance and compare results during this process. If any issues are encountered, we can quickly rollback the new database read traffic without impacting the production environment.&lt;/li&gt;
&lt;li&gt;Once the new database has been handling 100% of the read/write operations without any issues for a certain period, we can decommission the old database and its related code services.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zxt3ehV9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/db-migration-indicator.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zxt3ehV9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/db-migration-indicator.png" alt="Image description" width="800" height="979"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the real operation process, it's not only the traffic of the old and new databases that needs to be gradually opened up. The read and write codes for the new database also need to be updated in the production environment services in a step-by-step manner to ensure a stable, iterative migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Methods and Tools
&lt;/h2&gt;

&lt;p&gt;Throughout the process, besides the design of the system architecture itself, two specific tools play crucial roles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Feature Flags service, responsible for flexible, real-time, stable traffic ramp-up and rollbacks. In this article, we used &lt;a href="https://github.com/featbit/featbit"&gt;FeatBit&lt;/a&gt; as a feature flag service.&lt;/li&gt;
&lt;li&gt;Observability service, providing comprehensive monitoring of service anomalies and timely alarms throughout the process. In this article, we used &lt;a href="https://www.guance.one/"&gt;GuanceCloud&lt;/a&gt; as an observability tool.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Using FeatBit to implement real-time database migration request traffic control
&lt;/h3&gt;

&lt;p&gt;The pseudo-code shown below demonstrates how to split the database read operations for a particular service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In line 6 of the code, by calling the &lt;code&gt;_fbService.BoolVariation("read-sport-olddb")&lt;/code&gt; method, we obtain the traffic control return value. If it's &lt;code&gt;true&lt;/code&gt;, we add the Query function of reading from the old database to the parallel task execution queue.&lt;/li&gt;
&lt;li&gt;In line 9 of the code, by calling the &lt;code&gt;_fbService.BoolVariation("read-sport-newdb")&lt;/code&gt; method, we obtain the traffic control return value. If it's &lt;code&gt;true&lt;/code&gt;, we add the Query function of reading from the new database to the parallel task execution queue.&lt;/li&gt;
&lt;li&gt;In line 19 of the code, we use the FeatBit Feature Flags SDK to simultaneously run two database read operations, compare and verify the results, return the correct value according to the execution situation, and send relevant exception data to observability tool.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Sport&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetSportsByCityAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Sport&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&amp;gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// When the feature flag for reading the old database for Sport-related services &lt;/span&gt;
    &lt;span class="c1"&gt;// returns true, we add a read task to the execution task queue.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_fbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BoolVariation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"read-sport-olddb"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetSportsByCityQueryAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_oldDbContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// When the feature flag for reading the new database for Sport-related services &lt;/span&gt;
    &lt;span class="c1"&gt;// returns true, we also add a read task to the execution task queue.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_fbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BoolVariation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"read-sport-newdb"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetSportsByCityQueryAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_newDbContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Two read operations are executed simultaneously (to avoid increasing request &lt;/span&gt;
    &lt;span class="c1"&gt;// time due to new data read) and the results are compared and returned.&lt;/span&gt;
    &lt;span class="c1"&gt;// If the results are inconsistent, we return the old database read result&lt;/span&gt;
    &lt;span class="c1"&gt;// and record the discrepancy.&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_fbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RunAndCompareDbTasksAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;timeoutDelayForNewDB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Set the maximum wait time for the new database to avoid a bad user experience&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeoutInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// When the new database call times out, send a message to observability tool&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unMatchInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;// When the returned results are inconsistent, send a message to observability tool&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// When an exception occurs, send a message to observability tool&lt;/span&gt;
                &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After integrating the similar code above into your project, you can use a Feature Flags's UI tool to scale database migration's dual-write and dual-read traffic. For example, we can initially adjust the traffic scaling of the feature flag &lt;code&gt;read-sport-from-newdb&lt;/code&gt; to 5%. If no anomalies are observed in the observability tool over a certain period, we can increase the traffic scaling percentage to 10% (as shown in the figure below).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6e0RcY1h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/ui-indicator-composite.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6e0RcY1h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/ui-indicator-composite.png" alt="Image description" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Use an Observability tool to Monitor the Entire Migration Process and Timely Discover Potential Problems
&lt;/h3&gt;

&lt;p&gt;During the entire data migration process, automated and timely error detection followed by rollback is extremely important. It can most effectively help us avoid numerous issues, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the operation of the new database brings significant system resource consumption, we need to know immediately and rollback through the Feature Flags system.&lt;/li&gt;
&lt;li&gt;When the number of write operations or read operations exceeding the estimated threshold due to timeout, we can quickly locate the problem, rollback and repair swiftly. This improves migration speed.&lt;/li&gt;
&lt;li&gt;When a write operation or read operation results in information errors (such as inconsistency in results, excessive request time, program exceptions, etc.), we can locate the specific error information based on the observability system, thereby accelerating the debugging speed.&lt;/li&gt;
&lt;li&gt;And so on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can use an observability system that integrates Application Performance Monitoring (APM), Real User Monitoring (RUM), and Metric capabilities to monitor abnormal data and system behavior. Examples include DataDog, Guance.one (as used in this article), and so on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quickly Locate Migration Errors through "Traces" and "Error Tracking"
&lt;/h3&gt;

&lt;p&gt;On the APM/Traces page of the observability tool, we find that some red items (i.e., Errors) have occurred during the migration process. Through the Resource column, we can easily see that errors occurred in our read operations on the new database, as shown below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ODCPYfMQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/apm-traces.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ODCPYfMQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/apm-traces.png" alt="Image description" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By clicking on the corresponding Error, we can quickly view its associated call chain flame graph. As the flame graph interpretation shows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;As indicated by the Span at the location marked &lt;strong&gt;circle 1&lt;/strong&gt; in the diagram below, a Timeout error occurred here during database migration, i.e., the reading time from the new database exceeded our acceptable request response time threshold.&lt;/li&gt;
&lt;li&gt;The position marked &lt;strong&gt;circle 2&lt;/strong&gt; points out that the error occurred when the Feature flag &lt;code&gt;read-sport-newdb&lt;/code&gt; was &lt;code&gt;true&lt;/code&gt;. This means we can quickly locate the Feature Flags that we may need to rollback or turn off to avoid migration risks.&lt;/li&gt;
&lt;li&gt;According to Span at the location marked &lt;strong&gt;circle 3&lt;/strong&gt;, we can quickly locate the server-side API service where the timeout occurred. The captured parameters and headers of the API can assist us in better debugging and resolving the issue later.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E9ohnh1W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/flame.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E9ohnh1W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/flame.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback Read Operations in Real Time Using Feature Flags to Avoid Timeout State
&lt;/h2&gt;

&lt;p&gt;Based on the &lt;code&gt;Traces&lt;/code&gt; and &lt;code&gt;Error tracking&lt;/code&gt; information above, we've quickly located the abnormal database read operation. Now all we need to do is return to the FeatBit UI, find the feature flag &lt;code&gt;read-sport-newdb&lt;/code&gt; we discovered above, and rollback its percentage to last state. As shown in the diagram below, we decrease the percentage of traffic allocation of &lt;code&gt;true&lt;/code&gt; from 10% back to 5% where no read anomalies were previously observed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cmuAc-sD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/rollback.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cmuAc-sD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/bestpractice/dbmigration/rollback.png" alt="Image description" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the rollback, as shown in the code below, the return value of &lt;code&gt;_fbService.BoolVariation("read-sport-newdb")&lt;/code&gt; will only have a 5% chance of being &lt;code&gt;true&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// When the feature flag for reading from the new database related to the &lt;/span&gt;
&lt;span class="c1"&gt;// Sport service returns true, add the read task to the execution queue.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_fbService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BoolVariation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"read-sport-newdb"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;GetSportsByCityQueryAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_newDbContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cityId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pageSize&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion and Next Steps
&lt;/h2&gt;

&lt;p&gt;This article introduces a basic method to reduce database migration risk by using an observability tool and a Feature Flag tool to implement a dual-write, dual-read operation mode. In real world operation, we may have a large number of businesses to deal with, and human intervention can lead to slow responses for various reasons. In subsequent articles, we will introduce more content, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using the Metrics service from an "Observability tool" and the Trigger service from &lt;strong&gt;&lt;a href="https://www.featbit.co"&gt;FeatBit&lt;/a&gt;&lt;/strong&gt; to implement automatic real-time rollback, disaster avoidance, and alarm solutions during migration.&lt;/li&gt;
&lt;li&gt;Using the Metrics service from "Observability tool" and the Scheduler service from &lt;strong&gt;&lt;a href="https://www.featbit.co"&gt;FeatBit&lt;/a&gt;&lt;/strong&gt; to implement automated scaling and rollback solutions.&lt;/li&gt;
&lt;li&gt;And more.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Original article: &lt;a href="https://www.featbit.co/blogs/feature-flags-observation-tool-gradual-db-migration"&gt;https://www.featbit.co/blogs/feature-flags-observation-tool-gradual-db-migration&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>devops</category>
      <category>programming</category>
      <category>featureflags</category>
    </item>
    <item>
      <title>How to Choose the Right Open Source Feature Flags Management Tool</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Tue, 23 May 2023 07:34:23 +0000</pubDate>
      <link>https://forem.com/cosmicflood/how-to-choose-the-right-open-source-feature-flags-management-tool-4aon</link>
      <guid>https://forem.com/cosmicflood/how-to-choose-the-right-open-source-feature-flags-management-tool-4aon</guid>
      <description>&lt;p&gt;Selecting an open-source feature flags management tool is a crucial decision that can significantly impact your software development process. Feature flags (or feature toggles) offer a powerful way to switch functionality on and off in a product, enabling safer deployments and continuous delivery.&lt;/p&gt;

&lt;p&gt;In this post, we'll examine five popular open-source feature flags management tools: FeatBit (C#), Unleash (Typescript), Flagsmith (Python), FeatureProbe (Rust), and Go Feature Flag (Go). We will discuss the technology they are built on, the unique advantages each brings, and the service level agreements (SLAs) they offer to help you make an informed decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.featbit.co"&gt;FeatBit&lt;/a&gt; (C#)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Ww0WQsH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tm7zt94m29p53euwj5xf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Ww0WQsH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tm7zt94m29p53euwj5xf.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FeatBit is developed primarily using C#. C# is a robust, statically typed language developed by Microsoft as part of the .NET platform. C# is known for its excellent performance and has seen increasing popularity in recent years. It offers strong support for concurrency and scales very well, making it suitable for applications that demand high performance. Furthermore, it's now fully open-source, which means it has a growing community of contributors continually enhancing the language and its tooling.&lt;/p&gt;

&lt;p&gt;In addition to its open-source offering, FeatBit provides a premium service that guarantees a certain level of service availability and performance, as outlined in their service level agreement.&lt;/p&gt;

&lt;p&gt;Choosing FeatBit can be an excellent choice if your team is familiar with the .NET platform and values the reliability and performance that C# brings.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://getunleash.io"&gt;Unleash&lt;/a&gt; (Typescript)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3bS276u2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7yuvo6n0bzkvj89i4iv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3bS276u2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7yuvo6n0bzkvj89i4iv.png" alt="Image description" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unleash is built primarily with TypeScript. TypeScript is a statically typed superset of JavaScript. It brings the safety of static typing to JavaScript, making the code more predictable and easier to debug. TypeScript is popular for web development due to its strong tooling support and compatibility with JavaScript.&lt;/p&gt;

&lt;p&gt;Unleash also offers a premium service with a guaranteed SLA, providing peace of mind for businesses that require reliable and consistent performance.&lt;/p&gt;

&lt;p&gt;If your team is comfortable with JavaScript and wants to leverage the advantages of static typing, Unleash could be a good fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/flagsmith/flagsmith"&gt;Flagsmith&lt;/a&gt; (Python)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--atBV4su9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vg4virn3nz9e43jxk4uy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--atBV4su9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vg4virn3nz9e43jxk4uy.png" alt="Image description" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flagsmith uses Python as its primary development language. Python's greatest strength lies in its simplicity and readability, making the codebase approachable for developers of varying skill levels. It also boasts a rich ecosystem of libraries and frameworks, which can speed up development.&lt;/p&gt;

&lt;p&gt;Like FeatBit and Unleash, Flagsmith also provides a premium service with a guaranteed SLA, ensuring reliable performance for critical applications.&lt;/p&gt;

&lt;p&gt;If you value simplicity and readability, and your application does not have extremely high-performance requirements, Flagsmith could be the right choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://gofeatureflag.org/"&gt;Go Feature Flag&lt;/a&gt; (Go)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PuaSN3F5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/saqhg7t78qpij5udb0ox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PuaSN3F5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/saqhg7t78qpij5udb0ox.png" alt="Image description" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go Feature Flag uses Go as its primary development language. Go is known for its simplicity, strong support for concurrency, and fast execution. The language is statically typed and compiled, which aids in producing efficient and reliable software.&lt;/p&gt;

&lt;p&gt;If your team values simplicity and fast execution, Go Feature Flag could be an excellent choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/featureprobe/featureprobe"&gt;FeatureProbe&lt;/a&gt; (Rust)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--785nkPsK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x7hwybtknvbhizihxglf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--785nkPsK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x7hwybtknvbhizihxglf.png" alt="Image description" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FeatureProbe is developed primarily with Rust. Rust is known for its excellent performance and reliability, making it suitable for system-level programming. It offers memory safety without a garbage collector, and its syntax is designed to help developers write code that behaves predictably.&lt;/p&gt;

&lt;p&gt;If your application requires a high level of performance and you're not intimidated by Rust's learning curve, FeatureProbe could be a great choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The choice of an open-source feature flags management tool depends on several factors, including your team's familiarity with the underlying technology, the specific needs of your project, and the trade-offs you're willing to make. Each tool has its strengths, and the best choice will depend on the specific needs and constraints of your project.&lt;/p&gt;

&lt;p&gt;Many of these tools also offer premium services withguaranteed SLAs, providing an extra layer of assurance for businesses that require consistent and reliable performance.&lt;/p&gt;

&lt;p&gt;Take the time to evaluate each tool, consider your requirements and resources, and make the choice that best fits your situation. Happy coding!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Original article: &lt;a href="https://www.featbit.co/blogs/choose-os-feature-flag-tool-by-tech-stack"&gt;https://www.featbit.co/blogs/choose-os-feature-flag-tool-by-tech-stack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>python</category>
      <category>go</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The best solution for a Feature Flagging server that is written in C#</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Mon, 15 May 2023 13:42:00 +0000</pubDate>
      <link>https://forem.com/cosmicflood/the-best-solution-for-a-feature-flagging-server-that-is-written-in-c-1d1e</link>
      <guid>https://forem.com/cosmicflood/the-best-solution-for-a-feature-flagging-server-that-is-written-in-c-1d1e</guid>
      <description>&lt;p&gt;Note: This article was originally posted on &lt;a href="https://www.featbit.co/blogs/seo-keywords-best-feature-flagging-server-csharp"&gt;https://www.featbit.co/blogs/seo-keywords-best-feature-flagging-server-csharp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the realm of software development, finding the right tools can sometimes feel like navigating through a labyrinth. One of our customers recently shared their journey of discovering FeatBit, illuminating how precise their search parameters were: they sought a feature flagging solution written in C#, open-sourced under the MIT License, and with active development. Their quest led them to us, and we couldn't be more thrilled to be part of their software development toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discovering FeatBit
&lt;/h2&gt;

&lt;p&gt;FeatBit, found at &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt;, is a dedicated Feature Flagging server, meticulously crafted to cater to the needs of modern-day software developers. Our tool fits snugly into the .NET ecosystem, being primarily written in C#, one of the most widely used languages in enterprise applications today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes FeatBit Stand Out?
&lt;/h2&gt;

&lt;p&gt;Our solution is not just another tool in the market. We’ve designed FeatBit to be intuitive, robust, and scalable, addressing the pain points developers often encounter in managing feature flags.&lt;/p&gt;

&lt;p&gt;Open-source under the MIT License, FeatBit encourages community-driven enhancements. We strongly believe in the power of collective wisdom and have made our software available for tinkering, modification, and improvement by developers worldwide. We are not just a tool created for developers; we are shaped by developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Commitment to Active Development
&lt;/h2&gt;

&lt;p&gt;We understand that the tech world is continuously evolving, and staying static is not an option. Our active development commitment ensures that we're always ready to adapt to new challenges, integrate feedback, and implement necessary changes. We're not just providing a solution; we're continuously refining it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Part of Your Software Development Toolkit
&lt;/h2&gt;

&lt;p&gt;Feature flagging is a powerful strategy for software development and release. It empowers developers to safely deploy, perform A/B testing, gradually roll out features, and improve overall software quality. FeatBit is built with these objectives at its core, providing developers the control they need while maintaining simplicity of use.&lt;/p&gt;

&lt;p&gt;The journey of our customer in discovering FeatBit sheds light on the nuanced requirements of today's developers. We are thrilled to have been the solution they were searching for, and we are excited to see more developers find their way to us.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Your FeatBit Journey Today
&lt;/h2&gt;

&lt;p&gt;Intrigued about FeatBit? Discover more at &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt; and see how we can be a part of your software development process.&lt;/p&gt;

&lt;p&gt;Ready to dive in? Click the Try it Online button or the Check GitHub button on the left side of the page to start your journey with FeatBit today. There's no better time to join the FeatBit community and start revolutionizing your feature flag management!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>featureflag</category>
      <category>csharp</category>
      <category>aspdotnet</category>
    </item>
    <item>
      <title>.NET Feature Flag: Embracing Flexibility with FeatBit</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Mon, 15 May 2023 11:48:45 +0000</pubDate>
      <link>https://forem.com/cosmicflood/net-feature-flag-embracing-flexibility-with-featbit-3049</link>
      <guid>https://forem.com/cosmicflood/net-feature-flag-embracing-flexibility-with-featbit-3049</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: This article was originally posted on &lt;a href="https://www.featbit.co/blogs/seo-keywords-dotnet-feature-flag"&gt;https://www.featbit.co/blogs/seo-keywords-dotnet-feature-flag&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the evolving landscape of software development, feature flags have become an essential tool. They allow developers to manage and control feature releases, perform A/B testing, and ensure safer deployments. For developers operating in the .NET ecosystem, having a feature flagging solution that seamlessly integrates with their workflow is critical. This is where FeatBit steps in.&lt;/p&gt;

&lt;h2&gt;
  
  
  FeatBit: Tailored for the .NET Ecosystem
&lt;/h2&gt;

&lt;p&gt;FeatBit, available at &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt;, is an open-source feature flag service designed with the .NET ecosystem in mind. Primarily written in C#, FeatBit offers a seamless solution for managing feature flags in .NET applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Choose FeatBit for .NET?
&lt;/h2&gt;

&lt;p&gt;FeatBit stands out for several reasons. Firstly, it's tailored for the .NET environment. As a solution written in C#, it integrates effortlessly with .NET projects, making it an ideal choice for .NET developers.&lt;/p&gt;

&lt;p&gt;Secondly, FeatBit is open-source under the MIT License. This encourages a collaborative development process, inviting developers not only to use FeatBit but also to contribute to its growth and evolution. This community-driven approach ensures that FeatBit remains relevant, robust, and responsive to the needs of .NET developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  FeatBit's Commitment to Active Development
&lt;/h2&gt;

&lt;p&gt;In the ever-changing world of technology, FeatBit remains adaptive. Our commitment to active development ensures that FeatBit is always ready to respond to new technological challenges, integrate valuable community feedback, and implement necessary enhancements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Your Journey with FeatBit Today
&lt;/h2&gt;

&lt;p&gt;If you're a .NET developer seeking a powerful, flexible feature flagging solution, FeatBit may just be the tool you need. Visit &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt; to explore our offerings.&lt;/p&gt;

&lt;p&gt;To jump right in, click the "Try it Online" or "Check GitHub" buttons on the left side of the page. This will allow you to dive into FeatBit, experience its functionality firsthand, and see how it can revolutionize your approach to feature flag management.&lt;/p&gt;

&lt;p&gt;Join the FeatBit community today and take the first step towards a more manageable and innovative approach to feature flagging in your .NET projects.&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>dotnet</category>
      <category>opensource</category>
      <category>developer</category>
    </item>
    <item>
      <title>Feature Flag C#: Enhance Your Development Process with FeatBit</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Mon, 15 May 2023 11:46:43 +0000</pubDate>
      <link>https://forem.com/cosmicflood/feature-flag-c-enhance-your-development-process-with-featbit-3c49</link>
      <guid>https://forem.com/cosmicflood/feature-flag-c-enhance-your-development-process-with-featbit-3c49</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: This article was originally posted on &lt;a href="https://www.featbit.co/blogs/seo-keywords-feature-flag-csharp"&gt;https://www.featbit.co/blogs/seo-keywords-feature-flag-csharp&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The software development world has embraced feature flags as a vital tool for controlling feature rollouts, conducting A/B testing, and ensuring safer deployments. For developers who work with C#, a feature flagging solution that aligns seamlessly with their existing workflows is paramount. This is where FeatBit shines.&lt;/p&gt;

&lt;h2&gt;
  
  
  FeatBit: A C#-Centric Feature Flag Solution
&lt;/h2&gt;

&lt;p&gt;Available at &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt;, FeatBit is an open-source feature flag service specially designed with C# developers in mind. It's primarily written in C#, allowing for seamless integration with the .NET ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why FeatBit is the Ideal Choice for C# Developers
&lt;/h2&gt;

&lt;p&gt;The strength of FeatBit lies in its ability to resonate with the community it serves. Being a solution written in C#, it provides an intuitive and harmonious experience for developers working with C#.&lt;/p&gt;

&lt;p&gt;Moreover, FeatBit, as an MIT licensed open-source project, encourages community engagement and contribution. This collaborative model ensures that FeatBit remains a tool that is not only made for developers but also shaped by developers, continually adapting and evolving to meet their needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Pledge to Active Development
&lt;/h2&gt;

&lt;p&gt;In the dynamic world of tech, FeatBit is not just keeping pace but also setting the pace. Our commitment to active development means we're always ready to adapt to new challenges, integrate valuable community feedback, and implement necessary enhancements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embark on Your FeatBit Journey Today
&lt;/h2&gt;

&lt;p&gt;If you're a C# developer in search of an efficient feature flagging solution, FeatBit is worth your consideration. To learn more, visit &lt;a href="https://www.featbit.co"&gt;https://www.featbit.co&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ready to get started? Click on the "Try it Online" or "Check GitHub" buttons on the left side of the page. Explore the world of FeatBit, experience its capabilities first-hand, and see how it can revolutionize your feature flag management.&lt;/p&gt;

&lt;p&gt;Join the FeatBit community today, and take your feature flagging strategy in C# to the next level.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>opensource</category>
      <category>developer</category>
      <category>featureflag</category>
    </item>
    <item>
      <title>Developer Tool 2.0 - LLM Powered Feature Flags &amp; Experimentation Management Service</title>
      <dc:creator>Comiscience</dc:creator>
      <pubDate>Tue, 04 Apr 2023 09:43:47 +0000</pubDate>
      <link>https://forem.com/cosmicflood/developer-tool-20-llm-powered-feature-flags-experimentation-management-service-nd2</link>
      <guid>https://forem.com/cosmicflood/developer-tool-20-llm-powered-feature-flags-experimentation-management-service-nd2</guid>
      <description>&lt;p&gt;Original Article: &lt;a href="https://www.featbit.co/blogs/LLM-Introducing-FeatBit-ChatGPT-Powered-FeatureFlags-Service"&gt;https://www.featbit.co/blogs/LLM-Introducing-FeatBit-ChatGPT-Powered-FeatureFlags-Service&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As ChatGPT (Large Language Model) has gained popularity, terms like Prompt Engineer, Prompt Ops, and LLM Ops have emerged. This got me thinking about whether this powerful model could be applied to practical programming scenarios. So, I decided to test its abilities in a couple of pain points with the Feature Flags on the FeatBit service. I found that both the GPT-3.5 API and GPT-4 Chat interfaces produced impressive results. However, despite fine-tuning the model to a certain extent, the performance of GPT-3 still fell short of my expectations. In this article, I'll describe the two scenarios I tested in more detail:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilize ChatGPT for eliminating dead feature flag code&lt;/li&gt;
&lt;li&gt;Leverage prompts for developer tool onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reduce Tech Debt - Remove Dead feature flags
&lt;/h2&gt;

&lt;p&gt;A straightforward way to use a feature flag in a codebase is with an if/else statement, like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;UP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FbClient&lt;/span&gt; &lt;span class="n"&gt;featureFlags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FbUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;ifC&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;featureFlags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BoolVariation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ui-c"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"12"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ifC&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;num1&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;num2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once a feature is fully implemented and delivered, or an experiment is completed and a winner is determined, one of the code paths will no longer be executed, necessitating the removal of the "dead" code. When frequently working with feature flags, you or your colleagues might inadvertently remove the incorrect code or overlook certain areas indirectly controlled by the feature flags. Although this may happen infrequently, it can still have an impact on your business and the entire development team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remove dead feature flags with chatGPT3.5 &amp;amp; 4
&lt;/h3&gt;

&lt;p&gt;I attempted to utilize ChatGPT to eliminate dead feature flags and associated code. For the initial trial, I employed &lt;a href="https://platform.openai.com/docs/guides/chat/introduction"&gt;chatGPT 3.5's ChatCompletion&lt;/a&gt; method. I provided ChatGPT with clear instructions on what needed to be done and supplied it with "pre-training/fine-tuning" examples.&lt;/p&gt;

&lt;p&gt;The image below presents a fine-tuning Prompt/Completion pair example. On the left side, there is code containing dead feature flags and related code. Conversely, on the right side, you can see the cleaned-up version of the code after the removal of dead feature flags.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wsq1F569--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/tech-debt-fine-tune.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wsq1F569--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/tech-debt-fine-tune.png" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;I provided six additional examples demonstrating the use and removal of feature flags to ChatGPT-3.5-turbo.&lt;/p&gt;

&lt;p&gt;Next, I tested ChatGPT by giving it a code snippet along with the same instructions to see if it could accurately remove dead feature flags and their associated dead code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TjWV1BEg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/tech-debt-removing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TjWV1BEg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/tech-debt-removing.png" width="800" height="355"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;As seen in the image above, the results are truly fascinating. This simple text demonstrates ChatGPT's potential to address a major pain point that no other solution has resolved thus far.&lt;/p&gt;

&lt;p&gt;However, upon testing it with a wider range of scenarios, it becomes apparent that more fine-tuning examples are needed for better performance. Unfortunately, as of now, fine-tuning is not available for ChatGPT-3.5 or ChatGPT-4. But fear not, it's only a matter of time!&lt;/p&gt;

&lt;p&gt;As time progresses, ChatGPT will likely offer more fine-tuning options to users, and other open-source large language models will gain similar capabilities. This prospect fills me with great hope.&lt;/p&gt;
&lt;h4&gt;
  
  
  text-davinci-003 &amp;amp; ChatGPT 3
&lt;/h4&gt;

&lt;p&gt;I attempted to fine-tune the &lt;code&gt;chatGPT-3&lt;/code&gt; model using the same example data, but unfortunately, it didn't yield any useful results. I also experimented with the &lt;code&gt;text-davinci-003&lt;/code&gt; model, which produced satisfactory outcomes, but at a higher cost.&lt;/p&gt;
&lt;h2&gt;
  
  
  Optimal Developer Tools Onboarding Experience
&lt;/h2&gt;

&lt;p&gt;Leveraging ChatGPT's code completion and code insertion capabilities, developers can effortlessly initialize FeatBit in their existing projects with just a simple prompt. Even without fine-tuning, you can utilize chat-completion to have GPT-4 read the GitHub documentation and learn how to use FeatBit's SDK.&lt;/p&gt;

&lt;p&gt;The image below illustrates the trial steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I input the FeatBit .NET SDK documentation into ChatGPT-4.&lt;/li&gt;
&lt;li&gt;I copy the code source from an ASP.NET Core 7's Program.cs file.&lt;/li&gt;
&lt;li&gt;instructed GPT-4 to initialize FeatBit's .NET SDK within the code source.&lt;/li&gt;
&lt;li&gt;GPT-4 returned the modified code after initialization.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LbnBaDgE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/onboarding.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LbnBaDgE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.featbit.co/images/blogs/LLM/onboarding.png" width="800" height="628"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;While GPT-4 performed well, it added some unnecessary code at the top of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.AspNetCore.Hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.DependencyInjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although not perfect, this fascinating trial showcases a new approach to developer tool onboarding. It highlights a novel interaction method between code and developers, as well as code and non-engineers.&lt;/p&gt;

&lt;p&gt;Copilot currently lacks this capability, but it's plausible that it will eventually offer an interface for developer tools to fine-tune and create plugins for Copilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  False Positive
&lt;/h2&gt;

&lt;p&gt;At present, both GPT-3.5 turbo and GPT-4 have demonstrated their potential to outperform humans in certain tasks. What they currently lack in accuracy can be improved through pre-training and fine-tuning with more data and real-world use cases.&lt;/p&gt;

&lt;p&gt;While there may be instances of false positives when addressing feature flag technical debt or initializing SDKs, the performance of these models will continue to improve as they are fed more practical use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;ChatGPT has shown immense potential in addressing practical programming pain points, such as removing dead feature flags and enhancing developer tool onboarding. While the current performance may not be perfect, it is important to remember that we are still in the early stages of exploring the capabilities of these language models. As more data and real-world use cases become available for pre-training and fine-tuning, we can expect to see significant improvements in the accuracy and usefulness of ChatGPT in a variety of programming scenarios. This not only promises to revolutionize the way developers interact with code, but also paves the way for more accessible and efficient solutions for non-engineers. The future of ChatGPT and similar models is bright, and we eagerly anticipate the advancements they will bring to the software development landscape.&lt;/p&gt;

&lt;p&gt;For more information, please visit &lt;a href="https://github.com/featbit/featbit/tree/feat/clean_useless_ff_with_llm/llm"&gt;FeatBit's GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By the way, I'm not a Python developer, it took me 30 minutes to install and grasp the basics of Python. I successfully completed my ChatGPT Python CLI program using only Copilot and ChatGPT-4.&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>devops</category>
      <category>chatgpt</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
