Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Feature Flags Suck! - KubeCon Atlanta 2025

Feature Flags Suck! - KubeCon Atlanta 2025

Feature Flags Suck! - The Problems With Feature Flagging and How To Avoid Them

OK, feature flags are actually pretty awesome, but if you use them wrong you could certainly be forgiven for thinking they suck.

After helping many teams along their flag adoption journey, some common pitfalls become clear. In this talk we'll avoid the pain and suffering by hearing some horror stories which illustrate the most common problems that teams run into and how to avoid them.

• Learn about the most common mistake - too many flags!
• Marvel at 3 neat tricks to keep the number of flags in check!
• Commiserate with the many organizations who roll their own feature flagging solution, then learn how CNCF's OpenFeature project can save them!
• See how to track flag usage and impact using Open Telemetry!

Avatar for Pete Hodgson

Pete Hodgson

November 13, 2025
Tweet

More Decks by Pete Hodgson

Other Decks in Programming

Transcript

  1. “Why would you need a service for this?!” “It’s just

    a database table and 20 lines of code” “It’s just an if/else”
  2. “It’s just an if/else” “We use feature flags a lot.

    We have way too many. They’re awful.” LEADS TO
  3. “It’s just an if/else” “Why would you need a service

    for this?!” “It’s just a database table and 20 lines of code”
  4. flag evaluation evalution context dynamic evaluation rules engine admin UI

    permissions audit trail “remind me, why are we building all this ourselves?” }“I can do this with a DB table and 20 lines of code” @thepete.net
  5. “we have them everywhere, it sucks” • We have thousands

    of flags • Our codebase is littered with if/else • Hard to know whether a flag is still live or still being used • Changing some flags might(?) cause disaster
  6. !

  7. ! 1381 / 0.17 = 8124 feature flags in just

    Uber’s mobile apps over a thousand dead flags
  8. {"featureFlags": ["actions_custom_images_public_preview_visibility","alternate_user_config_repo","api_insights_show_missing_data_banner","attestations_filtering","attestations _sorting","billing_hard_budget_limits_for_licenses","billing_hide_expired_credits","billing_unfiltered_discounts","client_version_header","codespaces_prebuild _region_target_update","contentful_lp_footnotes","copilot_agent_cli_public_preview","copilot_agent_task_list_v2","copilot_agent_tasks_btn_code_nav","copilot_a gent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_api_agentic_issue_marshal_yaml","copilot_api_github_draft_update_issue_skill","co pilot_capi_error_response_telemetry","copilot_chat_agents_empty_state","copilot_chat_attach_multiple_images","copilot_chat_disable_model_picker_while_streamin g","copilot_chat_file_redirect","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selec tion_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_skip_thread_create","copilot_custom_copilots","copilot_custom_copilots_feature_preview" ,"copilot_duplicate_thread","copilot_extensions_deprecation_notice","copilot_features_raycast_logo","copilot_file_block_ref_matching","copilot_free_to_paid_te lem","copilot_ftp_hyperspace_upgrade_prompt","copilot_ftp_settings_upgrade","copilot_ftp_upgrade_to_pro_from_models","copilot_ftp_your_copilot_settings","copi

    lot_generate_commit_message_dry_regenerate","copilot_immersive_structured_model_picker","copilot_immersive_task_within_chat_thread","copilot_insights_column_c hart_axis_legibility_fix","copilot_insights_usage_export_ndjson","copilot_issue_list_show_more","copilot_mission_control_feedback","copilot_mission_control_se ssion_feedback","copilot_no_floating_button","copilot_pipes_github_graphql_nodes","copilot_premium_request_quotas","copilot_read_shared_conversation","copilot _share_active_subthread","copilot_spaces_as_attachments","copilot_spaces_ga","copilot_spark_empty_state","copilot_spark_loading_webgl","copilot_spark_progress ive_error_handling","copilot_spark_read_iteration_history_from_git_v2","copilot_spark_use_billing_headers","copilot_spark_write_iteration_history_to_git","cop ilot_stable_conversation_view","copilot_workbench_agent_seed_tool","copilot_workbench_cache","copilot_workbench_connection_reload_banner","copilot_workbench_p review_analytics","copilot_workbench_skip_repo_on_codespace","copilot_workbench_use_single_prompt","direct_to_salesforce","disable_dashboard_universe_2025_pri vate_preview","dotcom_chat_client_side_skills","failbot_report_error_react_apps_on_page","fgpat_permissions_selector_redesign","ghost_pilot_confidence_truncat ion_25","ghost_pilot_confidence_truncation_40","github_models_scheduled_hydro_events","global_search_multi_orgs","global_sso_banner","global_sso_banner_dismis s_dialog","hpc_improve_dom_insertion_observer","inp_reduced_threshold","insert_before_patch","issue_fields_report_usage","issues_copilot_cross_repo_assign","i ssues_expanded_file_types","issues_react_blur_item_picker_on_close","issues_react_bots_timeline_pagination","issues_react_include_bots_in_pickers","issues_rea ct_prohibit_title_fallback","issues_react_remove_placeholders","issues_sticky_sidebar","item_picker_issue_type_tsq_migration","kb_convert_to_space","kb_semant ic_api_migration","lifecycle_label_name_updates","link_contact_sales_swp_marketo","marketing_pages_search_explore_provider","mcp_registry_install","memex_mwl_ filter_field_delimiter","memex_roadmap_drag_style","new_traffic_page_banner","open_agent_session_in_vscode_insiders","pinned_issue_fields","pr_sfv_new_diff_fe tch","primer_react_segmented_control_tooltip","primer_react_unified_portal_root","record_sso_banner_metrics","remove_child_patch","repos_insights_remove_new_u rl","repository_suggester_elastic_search","sample_network_conn_type","scheduled_reminders_updated_limits","site_homepage_collaborate_video","site_homepage_con tentful","site_msbuild_webgl_hero","spark_fix_rename","spark_force_push_after_checkout","spark_improve_image_upload","spark_kv_encocoded_keys","spark_show_dat a_access_on_publish","spark_sync_repository_after_iteration","viewscreen_sandbox","webp_support","workbench_store_readonly"]}
  9. identifying stale flags • Assign each flag an expiration date

    when you create it • Recorded as flag metadata • Track where each flag is in the lifecycle • e.g. In development, internal release, beta release, experimenting, fully released • again, as flag metadata • add ownership metadata to each flag • e.g. which team, perhaps which codebase
  10. identifying stale flags • Analyze flags that are not being

    evaluated • This identifies flags which have been removed from your code (or never added!)
  11. Flag Metadata Ownership (which team) Flag Observability When was this

    flag’s configuration last changed? Is this flag still being checked? Expiration Feature lifecycle Feature Flagging Platform
  12. finding the time • Time bombs • Log errors when

    a flag is still being used after a certain date • Throw an exception after a certain date (!) • Create cleanup tickets when you create the flag • Allocate time for cleanup • Align incentives by institute work-in-progress limits • Only allow N active flags at any one time • "Program Management tricks” • Metrics, KPIs • leaderboards showing which teams are best at removing flags
  13. feature flags provide benefits • Less feature branches • Safer

    releases • Data-driven product decisions feature flags come at a cost • code complexity • feature flag debt • effort to manage releases or experiments flags ain’t free
  14. Too many flags flag by default unhelpful experiments Multiple decision

    points unhelpful de-risking not removing enough adding too many @thepete.net
  15. flag evaluation evalution context dynamic evaluation rules engine admin UI

    permissions audit trail “remind me, why are we building all this ourselves?” }“it’s just an if/ else statement” @thepete.net
  16. Parting Thoughts • Challenge the “DB table and 20 lines

    of code” narrative • Treat feature flagging with respect, manage your flags with intention • Feature flags are a means to an end • Use OpenFeature!