Las herramientas potentes se ganan fama de hostiles, y el razonamiento popular es que, si algo es difícil de usar, tiene que ser serio. Es al revés. Las herramientas que castigan no filtran por habilidad, filtran por tolerancia.
La mentira de que difícil significa potente
En algún momento «herramienta de expertos» pasó a ser sinónimo de «lo averiguas o no lo averiguas». Opciones crípticas. Mensajes de error que nombran un problema sin nombrar una solución. Documentación que da por hecho que ya sabes la respuesta a la pregunta que le haces.
Nada de eso es potencia. Es fricción que nadie se molestó en eliminar desde el diseño. Una herramienta puede ser profunda y legible a la vez: la profundidad está en lo que puede hacer, la legibilidad en cómo te cuenta lo que está haciendo. Son ejes distintos, y la mayoría de las herramientas que presumen del primero descuidan discretamente el segundo.
La accesibilidad en las herramientas para desarrolladores no consiste en quitar la parte honda de la piscina. Consiste en no obligar a la gente a adivinar dónde están los escalones.
La abstracción que sostiene y la que atrapa
Hay una diferencia entre una abstracción que te sostiene y una que te atrapa. La mala oculta tan por completo el sistema subyacente que, en cuanto te sales del camino feliz, te quedas varado, sin ningún modelo de lo que ocurre de verdad. La buena te da una superficie de trabajo y mantiene accesible lo real.
La prueba cabe en una frase: ¿puedes reproducir a mano todo lo que la abstracción hace por ti? Si la respuesta es no, está ocultando en lugar de ayudar, y el día que falle no tendrás suelo donde apoyarte.
De esa prueba se derivan tres compromisos, y son los que se exigen a nuestras propias herramientas:
- El camino guiado es el valor por defecto, nunca el techo.
- Toda acción generada se puede ver como el comando que representa.
- Nada de lo que hace la interfaz es algo que no pudieras hacer tú mismo.
El tercero tiene dientes. Descarta el atajo cómodo en el que una herramienta llega a una API privada o a un archivo de estado oculto para que un flujo parezca fluido, porque ese es precisamente el flujo que te deja tirado cuando se rompe.
La divulgación progresiva como principio básico
La mayoría de las interfaces ponen todas las opciones delante de ti a la vez y lo llaman potencia. No es potencia, es ruido. La divulgación progresiva significa que el caso común es inmediato y la larga cola está a un paso deliberado, nunca eliminada.
En la práctica, un formulario de despliegue se abre con tres campos en lugar de treinta, y el panel avanzado (comprobaciones de estado personalizadas, estrategia de despliegue, límites de recursos) queda tras un interruptor explícito: accesible en cuanto lo necesitas, documentado donde está y no en un manual aparte que tengas que ir a buscar.
El mismo principio se aplica a escala de un solo comando. Los valores por defecto se ocupan del caso común y las opciones del resto, así que nunca pagas el coste de la segunda línea hasta que la necesitas.
# el caso común: sin ceremonia, con valores por defecto ya elegidos por ti
$ deploy
# el mismo comando, con la cola larga hecha explícita
$ deploy --strategy=canary --health-timeout=90s --max-surge=2deploy ahí es un sustituto de la herramienta a la que quieras exigir este estándar. Lo que importa es la forma del argumento, no el binario.
Los valores por defecto son opiniones que se entregan
Un valor por defecto es una opinión que entregas a todos los que no lo sustituyen. Tratarlo como un añadido de última hora, con el valor con que se inicializó el analizador de configuración, es como una herramienta acaba siendo técnicamente configurable y prácticamente inutilizable.
La manera de elegirlo es elegirlo como lo harías para un colega cuidadoso: la opción segura, reversible y adecuada para el caso común. Un despliegue es incremental por defecto en lugar de todo de golpe. Una operación destructiva se ejecuta por defecto como simulación. Un tiempo de espera tiene por defecto un valor que sobrevive a una red lenta en lugar de fallar al primer tropiezo.
Buenos valores por defecto significan que el camino más corto es también un camino razonable. Nadie debería tener que leer el manual para evitar pegarse un tiro en el pie.
Los mensajes de error son la verdadera documentación
Nadie lee la documentación cuando las cosas funcionan. Leen tu mensaje de error cuando algo se rompe, lo que lo convierte en el texto más leído que tu herramienta producirá jamás. Trátalo como tal.
Un buen error responde tres preguntas: qué pasó, por qué y qué hacer a continuación. Uno críptico responde la primera y te abandona en las otras dos.
# críptico: nombra un síntoma, deja al lector tirado
Error: ECONNREFUSED 127.0.0.1:5432
# útil: nombra la causa, da el siguiente comando, apunta al contexto
Error: could not connect to the database at 127.0.0.1:5432.
The postgres service for this project is not running.
Start it: docker compose up -d postgres
Check logs: docker compose logs postgresEl mismo fallo de fondo. Uno te deja traducir un código de error TCP a una acción, el otro te entrega la acción. Escribir la segunda versión cuesta unos minutos, una vez. La primera la paga cada usuario, cada vez que se topa con ella, para siempre.
La regla a la que se somete cada mensaje:
- Nombrar la causa, no solo el síntoma.
- Dar un siguiente paso concreto, idealmente un comando que se pueda ejecutar exactamente como se imprime.
- Enlazar al contexto pertinente, no a la página de inicio.
- No culpar nunca al usuario de un estado al que la herramienta le permitió llegar.
Adónde lleva esto
Accesible no significa simple, y potente no significa hostil. Nunca fueron opuestos. Simplemente nos acostumbramos a herramientas que trataban la fricción como una función y llamaban expertos a los supervivientes.
Este es el estándar con el que se está construyendo aquí el trabajo en sistemas, incluido el sistema operativo, que está en desarrollo y no tiene nada que descargar. Publicar el estándar antes que el software es deliberado: un compromiso escrito en público es mucho más fácil de discutir, y mucho más difícil de retirar en silencio, que un producto que ya salió.