En estos días en que las decisiones de negocio se toman en base a los datos, se me pidió muchas veces activar cierta funcionalidad para al poco tiempo apagarla porque no rendía. Otras veces por motivo de algún bug o algún caso no contemplado requerimos volver atrás alguna de estas funcionalidades. Las tareas de llevar a producción y hacer rollback de funcionalidades en sitios que tienen que estar disponibles las 24hs los 7 días de la semana y sin downtime no siempre es sencilla. Por suerte nosotros contamos con infraestructura para hacerlo, pero a veces la funcionalidad va acompañada de otras funcionalidades y el rollback implica perder otras funcionalidades que quizás no se quieren sacar. Se puede solucionar modificando el código, pero esta situación se tornó muy frecuente, en especial cuando las funcionalidades son pruebas de concepto que no se sabe como van a funcionar.
Por suerte me topé con un interesante artículo de Pete Hodgson en un blog de Martin Fowler donde presenta la idea de Feature Toggles. Hace un tiempo decidí implementar esto en una de las aplicaciones que mantengo. La primer aproximación hace un tiempo fue usando un json de configuración que me permitía prender o apagar configuraciones con una query a la base.
La razón por la que optamos por un Json en vez de modelar el concepto de Feature fue debido a que se tornó una necesidad urgente desde el lado de desarrollo pero que no debía frenar las historias de negocio que hicieron apareccer la necesidad. Eso sumado a no tener mucha noción de la naturaleza que iban a tener las features derivó en esta primera aproximación.
Hace unos días terminamos un proceso de reificación de las features, que pasaron a cumplir un rol fundamental en el mantenimiento de nuestra aplicación y pasaron a ser entidades de primer nivel y dejaron de ser sólo un string en un Json. Este proceso nos llevó a definir beans que modelan el concepto o la semántica de cada features. Definimos features de tipo prendido/apagado, otras de tipo String y otras Integer. Al levantar la aplicación usando Spring, exponemos todas las features en un panel de control que gente de producto puede activar o desactivar. De esta manera podemos rápidamente sacar funcionalidades nuevas a producción que son fácilmente editables sin necesidad que eso insuma tiempo del equipo de desarrollo.