Además de implementar funciones, se utilizó para configurar permisos de funciones y límites de uso, como límites de velocidad de API, planes de precios y lógica de facturación, copia en la aplicación, contenido del CMS, internacionalización y localización, formularios, diseños de página y embudos, todos nuestros modelos de IA, indicaciones, temperaturas, pesos, cadenas, umbrales de predicción, reglas para automatizar aprobaciones y detectar spam y fraude, mapas de redireccionamiento, tiempos de espera, números mágicos, configuraciones de integración de terceros y trabajos automatizados en el backend, y una gran cantidad de otros tipos de configuración. Sin embargo, en todos estos casos de uso de configuración diferentes, obtuvimos los mismos beneficios generales. En primer lugar, obtuvimos actualizaciones instantáneas desacopladas de las implementaciones de código y del ciclo de lanzamiento. En segundo lugar, desacoplamos las dependencias en nuestra organización. Empoderamos a otros para que se auto-servieran y realizaran cambios por sí mismos sin el proceso lento de ida y vuelta con nosotros. También significaba que podíamos centrarnos en enviar código a producción sin que ellos nos bloquearan. En tercer lugar, una vez que teníamos toda esta configuración rica, se volvió fácil optimizarla con pruebas A-B y bucles de IA automatizados. En cuarto lugar, simplificamos nuestro sistema extrayendo toda esta lógica de configuración, como el código específico del usuario, de diferentes bases de código y en una única fuente de verdad. También separamos las preocupaciones de código y configuración para poder centrarnos en la lógica de alto nivel en nuestro código y luego preocuparnos por los detalles de configuración más tarde o darle a alguien más el control sobre eso. Y en quinto lugar, obtuvimos más flexibilidad para adaptarnos a los requisitos cambiantes sin necesidad de realizar cambios en el código.
Entonces, la configuración de la aplicación es excelente, pero ¿cómo construimos un sistema de configuración de aplicaciones flexible que pueda escalar a todos esos casos de uso complejos que hemos mencionado? Bueno, primero necesitamos un lenguaje de esquema flexible y un sistema de tipos para definir las entradas que ingresan a nuestro sistema, como el entorno actual o el usuario, y las salidas que salen de nuestro sistema, como nuestras banderas de funciones o los planes de precios que ofrecemos. En segundo lugar, necesitamos un lenguaje de configuración flexible para definir la lógica que asigna las entradas a las salidas, y también deberíamos poder incorporar pruebas A-B y bucles de IA en nuestra lógica. Y luego necesitamos una interfaz de usuario para que las personas no técnicas puedan editar esa lógica de manera visual. Y en tercer lugar, necesitamos un sistema analítico para registrar eventos y luego ver los resultados de nuestras pruebas A-B y recopilar datos de entrenamiento para los bucles de IA. Cuando combinamos esos tres elementos, un lenguaje de esquema flexible, un lenguaje de configuración flexible y un sistema analítico, podemos escalar a todos los diferentes casos de uso que mencionamos anteriormente. Esto es realmente poderoso, pero también es un poco aterrador, ya que estamos trasladando la lógica empresarial fuera de nuestra base de código y hacia nuestro sistema de configuración. Si el sistema falla o realizamos un cambio incorrecto, podría causar problemas importantes. Además, tampoco queremos afectar el rendimiento o la eficiencia de nuestra aplicación al consultar un sistema de configuración externo. ¿Entonces, cómo podemos hacer que la configuración sea tan segura, confiable, eficiente y eficiente como nuestro propio código?
Bueno, primero, podemos diseñar el SDK para evaluar localmente nuestra lógica de configuración. Por lo tanto, obtiene toda la lógica de configuración del servidor de antemano en una única solicitud de red inicial. Y luego, después de eso, no hay dependencia del servidor para evaluar la configuración. Por lo tanto, es muy confiable, eficiente y eficiente. Pero aún tenemos esa única solicitud de red inicial que podría fallar. Para hacerlo más robusto, podemos incluir una instantánea de nuestra lógica de configuración en nuestro paquete de aplicaciones para que el SDK pueda usarla como respaldo en caso de que no pueda inicializarse desde el servidor. Y también podemos configurar un webhook para desencadenar una nueva compilación e implementación de nuestra aplicación cada vez que cambie la lógica de configuración, para mantener esa instantánea actualizada. Y luego, si hacemos eso, ni siquiera necesitamos inicializarnos desde el servidor en absoluto, y podemos usar el SDK en un modo solo local sin conexión. Pero luego perdemos el beneficio de poder actualizar la configuración instantáneamente desde el servidor. Pero si combinamos esos enfoques donde tenemos la instantánea actualizada en tiempo de compilación y la inicialización instantánea desde el servidor, entonces obtenemos lo mejor de ambos mundos. Lo siguiente que podemos hacer es que cuando se evalúa la configuración, podemos pasar valores de respaldo codificados en duro para el caso en que el SDK no se haya inicializado y no haya instantánea. También podemos asegurarnos de que la configuración se evalúe con una seguridad de tipos completa de extremo a extremo para evitar errores tipográficos, detectar errores en tiempo de compilación en lugar de tiempo de ejecución y permitir una experiencia de desarrollo moderna con integración de IDE para autocompletar código, encontrar todas las referencias y comentarios de js. Y finalmente, podemos controlar la versión de toda nuestra configuración en un historial estilo git para ver exactamente qué cambió y cuándo, con diferencias claras de nuestros cambios y ramas para probar y previsualizar cambios antes de fusionarlos en la rama principal para la solicitud de extracción. También podemos agregar roles y permisos de equipo para requerir que los cambios se revisen primero en una solicitud de extracción para incorporar de manera segura a miembros del equipo no técnicos. Entonces, para resumir, con la evaluación local, las instantáneas en tiempo de compilación, la seguridad de tipos y el control de versiones estilo git, podemos obtener un nivel similar de seguridad, confiabilidad, rendimiento y eficiencia como nuestro propio código. No hay ninguna herramienta o plataforma como esta, por lo que creamos Hypertune y aquí hay algunos enlaces para que nos conozcas. Y gracias por escuchar hoy. Espero que hayas disfrutado la charla.
Comments