Cuándo elegir Elm de verdad: los perfiles donde la apuesta sale bien
Después de cuatro lecciones desmontando objeciones queda la parte más difícil y la única que decide algo: enunciar sin coartadas en qué situaciones adoptar Elm es la decisión correcta y en cuáles es un error que se pagará caro. Esta lección propone hacerlo con cuatro variables que se pueden estimar antes de escribir la primera línea y que, combinadas, predicen el resultado mejor que cualquier argumento sobre garantías: el horizonte de vida del producto, el coste real de un fallo en producción, la proporción entre lógica de dominio y superficie de integración, y la estabilidad de la propiedad del código. Sobre esas cuatro variables se construyen los perfiles donde la apuesta sale bien —productos internos de larga vida, dominios con reglas duras, equipos pequeños con propiedad estable, sistemas donde un fallo cuesta dinero o confianza— y se enuncian con la misma franqueza los perfiles donde no sale: prototipos desechables, productos cuyo núcleo es una pieza que no existe en el ecosistema, equipos con rotación alta y sin propiedad, y organizaciones donde la decisión de tecnología no la toma quien la mantiene.
Toda decisión de tecnología es una apuesta sobre el futuro, y lo que distingue una apuesta razonada de una corazonada es haber escrito antes qué tendría que ser cierto para que salga bien. Con Elm esa escritura es especialmente útil porque su perfil de coste es inusual: cobra por adelantado y paga a plazos. La curva de adopción es empinada las primeras semanas, la integración con lo existente exige diseño en lugar de importaciones, y hay piezas que habrá que envolver o escribir. Todo eso ocurre en los primeros meses, donde es visible y duele. El retorno llega después, en forma de una cosa que no se ve porque consiste en ausencias: incidentes que no ocurren, refactorizaciones que no dan miedo, entregas que no requieren una ronda de comprobación manual, código de hace tres años que se lee sin arqueología. Un perfil de coste así solo tiene sentido si el proyecto vive lo suficiente para cobrar el retorno, y por eso la pregunta de si Elm es bueno está mal formulada. La pregunta correcta es cuánto va a durar esto, cuánto cuesta que falle, cuánto de lo que hay que construir es dominio y quién será el dueño dentro de dos años.
- Estimar las cuatro variables que predicen el resultado de la adopción antes de escribir código.
- Reconocer los perfiles de proyecto y de equipo donde el retorno diferido llega a cobrarse.
- Identificar con franqueza los perfiles donde la apuesta pierde y saber decirlo a tiempo.
- Diseñar una adopción por fronteras que permita comprobar la hipótesis sin comprometer el producto entero.
Las cuatro variables
La primera es el horizonte. Un producto que vivirá seis meses no llega a cobrar nada de lo que Elm ofrece, porque todo su retorno está en el mantenimiento. Un producto que vivirá cinco años y será modificado continuamente por gente distinta está exactamente en el otro extremo. La pregunta no es cuánto se tarda en construirlo sino cuántas veces se cambiará después, y esa cifra suele conocerse mejor de lo que se admite: los productos internos de una organización, las herramientas de operaciones y los sistemas de administración viven casi siempre más de lo que su primera versión sugiere.
La segunda es el coste de un fallo. Hay interfaces donde un error de ejecución produce un usuario molesto que recarga la página, y hay interfaces donde produce una transacción incorrecta, un dato médico mal mostrado, una operación financiera con el signo cambiado o una pérdida de confianza que no se recupera. Cuanto más cara sea la cola de la distribución, más vale una garantía frente a una probabilidad muy buena, y esa es literalmente la diferencia que Elm ofrece frente a un sistema de tipos con escapes.
La tercera es la proporción entre lógica de dominio y superficie de integración. Un producto cuya dificultad está en reglas, estados, transiciones y validaciones aprovecha todo lo que el lenguaje sabe hacer. Un producto cuya dificultad está en orquestar diez servicios externos con sus propios widgets pasa la mayor parte del tiempo en la frontera, que es justamente donde Elm cobra más caro. La proporción se puede estimar contando, en el mapa de pantallas, cuántas resuelven reglas propias y cuántas presentan o envuelven algo ajeno.
La cuarta es la estabilidad de la propiedad. Un equipo que mantiene lo que construye internaliza el retorno; un equipo que entrega y desaparece lo externaliza y solo ve el coste. Este factor explica buena parte de por qué la misma decisión técnica se juzga excelente en una empresa de producto y desastrosa en una consultoría por proyecto, sin que ninguna de las dos se equivoque.
Las cuatro variables no se combinan por suma sino casi por producto, y esa distinción importa. Un proyecto con horizonte largo, coste de fallo alto y mucho dominio propio, pero sin propiedad estable, no es un caso favorable con una pega: es un caso desfavorable, porque quien pagaría el coste inicial no es quien cobraría el retorno y esa asimetría acaba imponiéndose sobre cualquier mérito técnico. Lo mismo ocurre cuando falla el horizonte: da igual lo bien que encajen las otras tres si el producto se apaga en nueve meses. La forma correcta de usar estas variables no es sumar puntos sino comprobar que ninguna está en cero, y solo entonces mirar la magnitud de las demás.
Ninguna de las cuatro requiere adivinar el futuro, y ese es su mérito. El horizonte se estima mirando cuánto han vivido los productos comparables de la misma organización. El coste del fallo se estima preguntando a quien responde de las incidencias qué costó la última. La proporción entre dominio e integración se cuenta sobre el mapa de pantallas que ya existe. Y la estabilidad de la propiedad se lee en el organigrama, no en las intenciones. Cuatro cifras aproximadas obtenidas en una tarde predicen mejor el resultado de la adopción que cualquier debate sobre las virtudes del lenguaje, y tienen la ventaja de que se pueden discutir con quien no sabe programar.
| Variable | Favorece a Elm |
Desaconseja Elm |
|---|---|---|
| Horizonte | Años, con cambio continuo | Meses, o desechable |
| Coste del fallo | Dinero, seguridad, confianza | Molestia recuperable |
| Dominio frente a integración | Reglas y estados propios | Widgets y servicios ajenos |
| Propiedad del código | Estable, quien construye mantiene | Rotatoria, se entrega y se abandona |
Los perfiles donde sale bien
El primero y más claro es el producto interno de larga vida con reglas duras: sistemas de administración, herramientas de operaciones, paneles de control, aplicaciones internas de seguros, banca, logística o salud. Tienen horizonte largo, coste de fallo alto, mucha lógica de dominio, poca dependencia de piezas visuales exóticas, y usuarios cautivos que no exigen el último efecto de moda. Es el perfil sobre el que descansan casi todos los casos de adopción documentados que han sobrevivido más de cinco años.
El segundo es el equipo pequeño con propiedad estable, entre dos y ocho personas, que construye y mantiene lo mismo durante años. Aquí el retorno se internaliza por completo y el riesgo de concentración de conocimiento se gestiona con formación en pares desde el primer día. La ausencia de decisiones triviales que el lenguaje impone vale más en un equipo pequeño que en uno grande, porque cada discusión evitada es una fracción mayor de su capacidad. Hay además un efecto que estos equipos describen con insistencia: la desaparición casi total del trabajo de comprobación manual antes de cada entrega, que en un equipo de cinco personas puede suponer un día entero por semana recuperado.
El tercero es el módulo crítico dentro de un sistema mayor. No hace falta convertir el producto entero: se aísla la parte donde un fallo cuesta caro —el editor de una póliza, el flujo de pago, la configuración de un dispositivo— y se construye ahí con el constructor de elemento, incrustado en la página que gestiona la tecnología existente. La frontera es explícita, la hipótesis se comprueba en meses y el coste de revertir es acotado.
El cuarto perfil es menos evidente y aparece con frecuencia en dominios regulados: el producto cuyas reglas están escritas en otro sitio y no las decide el equipo. Cálculo de primas, liquidaciones, elegibilidad de prestaciones, configuraciones de producto con restricciones combinatorias, protocolos clínicos. Lo que caracteriza a estos casos es que las reglas son numerosas, cambian por decisión externa y hay que poder demostrar que el programa las implementa todas. Un sistema de tipos que obliga a enumerar variantes y a tratar cada una convierte un cambio normativo en una lista finita de errores de compilación, y esa lista es a la vez el plan de trabajo y la evidencia de que no queda nada suelto. Pocas cosas encajan tan bien con la disciplina del lenguaje como un dominio en el que alguien de fuera decide las reglas y alguien de dentro responde de haberlas aplicado.
-- Adopcion por frontera: el modulo critico vive dentro de la pagina existente
main : Program Configuracion Model Msg
main =
Browser.element
{ init = init
, update = update
, subscriptions = subscriptions
, view = view
}
-- Fuera queda todo lo demas. La frontera es el contrato de banderas y ports,
-- y su tamano es exactamente lo que hay que revisar en la decision.
Conviene subrayar una cosa sobre este tercer perfil, porque es el que convierte la discusión en algo comprobable. Una adopción por frontera transforma una decisión de fe en un experimento con resultado observable: se fija de antemano qué habría que ver a los seis meses para considerar que la hipótesis se sostiene —número de incidentes en ese módulo frente a los equivalentes, tiempo de incorporación de la última persona que lo tocó, coste de los tres últimos cambios de dominio— y se mira. Casi nadie lo hace, y por eso casi todas las adopciones se juzgan por impresiones. Una hipótesis escrita antes de empezar es la diferencia entre haber aprendido algo y haber discutido durante seis meses.
Interno y longevo
Horizonte de años, reglas duras, usuarios cautivos. El retorno diferido llega entero.
Equipo pequeño y estable
Quien construye mantiene. Cada discusión evitada pesa más cuanto menor es el equipo.
Módulo crítico aislado
Se acota la apuesta a la parte cara de equivocarse y se comprueba la hipótesis en meses.
Prototipo desechable
Todo el coste por delante y ningún plazo para cobrar. Aquí la respuesta honesta es no.
Los perfiles donde no sale, dicho a tiempo
-- El perfil regulado: la norma cambia y el compilador escribe el plan de trabajo
type Cobertura
= Basica
| Ampliada { franquicia : Centimos }
| Total { franquicia : Centimos, asistencia : Asistencia }
| Reducida { limite : Centimos } -- la norma introduce esta
-- Ningun calculo, ninguna pantalla y ningun informe compila
-- hasta que alguien decida que hacer con la variante nueva.
-- La lista de errores es la lista de cosas por revisar, y esta completa.
Hay cuatro situaciones donde recomendar Elm es un error, y decirlo pronto vale más que cualquier defensa entusiasta. La primera es el prototipo desechable o el producto de validación rápida: todo el coste está por delante y no hay ningún plazo para cobrar el retorno. La segunda es el producto cuyo núcleo funcional es una pieza de la categoría bloqueante, ya sea un editor enriquecido, un lienzo con manipulación directa o el widget de un proveedor; en ese caso la aplicación se convierte en un anfitrión de código ajeno y hereda toda su complejidad sin ninguna de sus ventajas. La tercera es la organización con rotación alta y sin propiedad estable, donde el conocimiento se concentra y se pierde antes de difundirse. La cuarta, la más importante y la que menos se dice, es aquella en la que la decisión de tecnología no la toma quien la va a mantener: una adopción impuesta desde fuera fracasa aunque sea técnicamente correcta, porque el coste inicial se paga con voluntad y nadie pone voluntad en una decisión que no tomó.
Conviene añadir una quinta situación que no es de proyecto sino de momento, y que arruina adopciones técnicamente impecables: hacerla coincidir con una entrega comprometida. El coste inicial de Elm se paga en semanas donde el equipo produce menos de lo habitual, y si esas semanas caen dentro de un plazo cerrado, la adopción se juzgará por la única métrica que estará mirando todo el mundo. La consecuencia no es que la decisión se revierta, que sería sano, sino algo peor: se abandona a medias, quedando un módulo en la tecnología nueva que nadie termina y que se cita durante años como prueba de que aquello no funcionó. Adoptar es también elegir cuándo, y el momento correcto es aquel en que el equipo puede permitirse ser lento sin que nadie lo interprete.
| Señal en la conversación | Qué suele significar de verdad |
|---|---|
| Necesitamos algo funcionando ya | El horizonte es corto o el momento es malo |
| Nadie más lo usa aquí | Falta propiedad estable o plan de difusión |
| El diseño exige este widget | La pieza puede ser el núcleo; hay que medirlo |
| Luego lo migramos si hace falta | Nadie ha respondido a la prueba de la reversión |
Antes de comprometerse conviene responder una pregunta incómoda con números: si dentro de nueve meses hubiera que volver atrás, qué costaría exactamente. En una adopción por frontera la respuesta es reescribir un módulo cuyo tamaño se conoce, con un contrato de entrada y salida que ya está escrito. En una adopción total la respuesta es rehacer el producto. Si la organización no puede permitirse la segunda respuesta, la decisión ya está tomada y consiste en empezar por un módulo. Una apuesta que no se puede deshacer no es una apuesta, es un compromiso, y los compromisos exigen mucha más evidencia que las apuestas.
flowchart TD
A[Evaluo adoptar Elm] --> B{Horizonte de anios}
B -->|No| N[No compensa]
B -->|Si| C{Cuesta caro un fallo}
C -->|No| M[Dudoso, mide otra vez]
C -->|Si| D{Predomina el dominio}
D -->|No| N
D -->|Si| E{Quien construye mantiene}
E -->|No| M
E -->|Si| F[Empieza por un modulo critico]
F --> G[Comprueba la hipotesis en meses]
style F fill:#a6e3a1,color:#11111b
style N fill:#f38ba8,color:#11111b
style M fill:#f9e2af,color:#11111bAl final de un recorrido como este queda una tentación comprensible: pedir un veredicto. Y el veredicto no existe, no por prudencia sino porque la pregunta que lo pediría está mal planteada. Toda tecnología distribuye el esfuerzo total de un producto a lo largo del tiempo, y esa distribución es su rasgo más determinante, mucho más que cualquiera de sus características enumerables. Unas concentran el esfuerzo al principio, cuando el equipo tiene energía, la dirección tiene paciencia y nadie está todavía atrapado; a cambio dejan una pendiente suave donde cada cambio posterior cuesta aproximadamente lo mismo que el anterior. Otras lo difieren, permiten arrancar en días y van cobrando en forma de incidentes, sesiones de depuración, migraciones obligatorias y esa sensación de que tocar una parte del programa exige comprobar otras tres. Ninguna de las dos distribuciones es mejor en abstracto, y esta es la parte que cuesta aceptar: si tu producto no va a existir dentro de dos años, la que difiere es objetivamente superior, porque el coste diferido nunca llega. Lo que hace especial a Elm no es que sea seguro o funcional o elegante, sino que su distribución es de las más extremas que existen en la dirección de concentrar el esfuerzo al principio, y por eso sus defensores y sus detractores tienen razón a la vez: describen el mismo objeto observándolo en momentos distintos de la curva. La madurez técnica consiste precisamente en saber qué punto de esa curva es el que tu proyecto va a habitar de verdad, y en elegir la distribución que corresponde a ese punto aunque contradiga tus preferencias personales, tu experiencia previa o lo que resulte más cómodo defender en una reunión. Casi todas las malas decisiones de tecnología que he visto no consistieron en elegir mal la herramienta, sino en elegirla para un horizonte que no era el real.
- Estima las cuatro variables para un proyecto tuyo con cifras concretas, no con adjetivos.
- Define las tres observaciones que mirarías a los seis meses para saber si la hipótesis se sostiene.
- Cuenta en tu mapa de pantallas cuántas resuelven reglas propias y cuántas envuelven algo ajeno; saca la proporción.
- Identifica el módulo donde un fallo cuesta más caro y evalúa si podría aislarse con el constructor de elemento.
- Escribe el contrato de esa frontera: qué banderas entran, qué
portssalen y qué queda fuera. - Responde con números a la prueba de la reversión a los nueve meses y decide en consecuencia.
- Redacta en un folio la hipótesis que estarías comprobando y qué observación concreta te haría abandonarla.
- Comprueba que ninguna de las cuatro variables está en cero antes de mirar la magnitud de las otras tres.
- Elige el momento de la adopción y justifica por qué el equipo puede permitirse ser lento durante esas semanas.
- Escribe la recomendación contraria para el mismo proyecto y comprueba cuál de las dos resiste mejor tus propios datos.