Filosofía de la ingeniería: Yukihiro Matsumoto (Matz)

Puntos clave
- Diseña para las personas, no para las máquinas. Matz convirtió la alegría del programador en la función objetivo y dejó que el silicio pagara la cuenta. Cada decisión sintáctica responde a la pregunta «¿cómo se sentirá una persona al leer esto?» antes que a «¿con qué rapidez se moverán los bytes?».
- La mínima sorpresa significa mi mínima sorpresa. El principio no es una encuesta sobre las expectativas de los principiantes; es un autor competente que minimiza su propia frustración, medida después de aprender bien Ruby.
- MINASWAN: la cultura es un resultado de diseño. «Matz es amable y por eso nosotros somos amables» demuestra que la comunidad de un lenguaje es una superficie que puedes diseñar, no un simple accidente derivado de su gramática.
- Ruby es un solo gusto aplicado sin descanso. Su coherencia proviene de la síntesis: Perl, Smalltalk, Lisp, Ada y Eiffel armonizados en una sola voz en lugar del promedio de un comité.
El principio
«Para mí, el propósito de la vida consiste en parte en tener alegría. Los programadores a menudo sienten alegría cuando pueden concentrarse en el lado creativo de la programación, así que Ruby está diseñado para hacer felices a los programadores.» – Yukihiro Matsumoto1
La mayoría del diseño de lenguajes se optimiza para la máquina. La velocidad de compilación, la organización de la memoria, el número de instrucciones, todo aquello que le importa al silicio. Matz invirtió la prioridad. Decidió que el ser humano frente al teclado era el destinatario que importaba, y que la tarea de la máquina era servirle. «Las máquinas deberían servir a los seres humanos», dijo. «A menudo los programadores sirven a las máquinas de forma inconsciente. Deja que las máquinas te sirvan a ti.»2
Aquí la alegría es una restricción de diseño estricta, no un sentimiento blando disfrazado de ingeniería. Si la alegría de la persona es la función objetivo, entonces cada decisión sintáctica, cada nombre de método y cada valor predeterminado se convierte en una pregunta sobre cómo se sentirá una persona al leer y escribir el código, en lugar de cuán rápido se moverán los bytes. Matz hizo explícito y honesto el compromiso: Ruby gastaría los ciclos de la máquina para comprar la comodidad del programador. La misma convicción hace que el gusto sea un sistema estructural en lugar de una decoración: la experiencia de la persona que realiza el trabajo se convierte en la preocupación portante en vez de una reflexión tardía aplicada al final.
Una sola decisión gobierna todo lo que sigue: diseña para las personas, no para las máquinas. La sintaxis, la cultura y el lema de la comunidad se derivan de ella. El resto de este texto traza cómo la búsqueda de la propia felicidad de una sola persona se endureció hasta convertirse en una posición de ingeniería defendible, y por qué «servir a la persona» resulta ser tan riguroso como «servir a la máquina», y no una renuncia a ello.
Contexto
Yukihiro Matsumoto nació en la prefectura de Osaka, Japón, el 14 de abril de 1965, y se crió en Tottori desde los cuatro años.3 Se describe a sí mismo como un apasionado de los lenguajes; no un lingüista, sino un apasionado de los lenguajes de programación. Fue programador autodidacta hasta el final del bachillerato, y se graduó con un título en ciencias de la información por la Universidad de Tsukuba, donde trabajó en un laboratorio de investigación centrado en lenguajes de programación y compiladores.3 La fascinación llegó primero; Ruby fue su resultado final.
Bautizó Ruby en febrero de 1993 – el nombre surgió en un chat en línea con su colega Keiju Ishitsuka, antes de que se hubiera escrito una sola línea de código – y lo fue desarrollando a lo largo de los años siguientes.13 La motivación fue la insatisfacción. «Quería de verdad un lenguaje de scripting genuinamente orientado a objetos y fácil de usar», explicó. «Busqué uno, pero no pude encontrarlo.»4 Perl era potente pero, para su gusto, no estaba verdaderamente orientado a objetos. Python estaba orientado a objetos pero, para su gusto, no resultaba lo bastante agradable. Así que construyó el lenguaje que él mismo quería usar. Publicó la primera versión pública el 21 de diciembre de 1995.3
El nombre fue una pequeña broma. Los dos se decidieron por Ruby, una piedra preciosa, como un guiño a Perl, el lenguaje al que Ruby respondía en parte. Una perla, y luego un rubí: un sucesor nombrado como una mejora incremental.4 Durante años Ruby fue un fenómeno principalmente japonés, con sus listas de correo y su documentación en japonés. El salto mundial llegó más tarde y desde fuera: David Heinemeier Hansson construyó Ruby on Rails sobre él, y Rails llevó Ruby al resto del mundo a mediados de la década de 2000.4 El lenguaje que una sola persona construyó para su propia felicidad se convirtió en el sustrato de las aplicaciones web de toda una generación.
El trabajo
El diseño de Ruby: la alegría y el principio de mínima sorpresa

La idea más citada sobre Ruby es el «principio de mínima sorpresa»: el lenguaje debería comportarse como esperas, de modo que dediques tu atención al problema y no a la herramienta. Matz respalda el principio, pero corrige una lectura errónea habitual. «El principio de mínima sorpresa significa el principio de mi mínima sorpresa», dijo. «Y significa el principio de mínima sorpresa después de que aprendas Ruby muy bien.»5
Esa corrección resume toda la filosofía en una sola frase. No encuestó a los programadores para promediar sus expectativas. Diseñó el lenguaje para minimizar su frustración, apostando a que un lenguaje que deleitara a su propio autor – un usuario competente y exigente – deleitaría a los demás una vez que alcanzaran la fluidez. «Quería minimizar mi frustración durante la programación, así que quiero minimizar mi esfuerzo al programar», dijo. «Yo mismo quiero divertirme programando.»5 Ruby es un lenguaje personal que escaló. Su consistencia no es la consistencia de un comité; es la consistencia de un solo gusto aplicado sin descanso.
Diseñar para las personas, no para las máquinas
Matz trata el software como un medio para las personas, no como un conjunto de instrucciones para el hardware. «No subestimes el factor humano», dijo. «Aunque estemos frente a las computadoras, estas son medios. Trabajamos para el ser humano, con el ser humano. La mayoría de nuestras tareas tienen que ver con las personas, después de todo.»5 Lleva la idea más allá del eslogan: la interfaz, para Matz, es el producto entero. «Si tu sistema tiene una mala interfaz, nadie lo usará. Por eso la interfaz o superficie del sistema, ya sea hacia los usuarios o hacia otras máquinas, es muy importante.»2
El corolario es una negativa a someterse a las preferencias de la máquina. Cuando le preguntaron por la relación entre el ser humano y la computadora, Matz fue tajante: «Nosotros somos los amos. Ellas son las esclavas.»6 La máquina existe para servir la intención del programador, y un lenguaje que obliga a la persona a pensar como una CPU tiene la relación al revés. Los bloques de Ruby, su modelo en el que todo es un objeto, sus nombres de método legibles – Array#each, Integer#times, String#upcase – gastan todos complejidad de implementación para que la superficie se lea como una intención.
MINASWAN: la cultura como resultado de diseño
El artefacto más inusual de Ruby no es una función; es una norma de la comunidad. Matz tiene un talante célebre por su amabilidad y paciencia, y esa disposición se propagó hasta convertirse en un lema: MINASWAN – «Matz es amable y por eso nosotros somos amables».7 En los primeros días de Ruby, cuando las discusiones se acaloraban en las listas de correo, los miembros de la comunidad respondían invocándolo para imponer un tono más cálido. Se extendió hasta convertirse en identidad.8
La lección que la mayoría de los diseñadores de lenguajes pasan por alto es que la cultura también es una superficie de diseño. Un lenguaje es más que su gramática; es la experiencia de hacer una pregunta y obtener una respuesta generosa, de leer una biblioteca cuyo autor se preocupó por que la entendieras. Matz diseñó la sintaxis y, con el ejemplo, también diseñó la postura social que la rodea. Un lenguaje construido para hacer felices a los programadores hizo crecer una comunidad comprometida con la amabilidad porque el mismo valor impulsaba ambas cosas: la comunidad es el principio de mínima sorpresa aplicado a las personas.
mruby: la filosofía en un espacio restringido
En abril de 2012, Matz publicó mruby como código abierto – una implementación ligera e integrable de Ruby creada para funcionar en lugares donde Ruby completo resulta demasiado pesado: microcontroladores, sistemas embebidos, dispositivos de consumo.9 Cumple con un subconjunto de la especificación Ruby ISO/IEC 30170 y se distribuye como un pequeño intérprete con un compilador de bytecode y una máquina virtual, integrable en C o C++ del mismo modo que Lua.10
mruby resulta interesante precisamente porque pone a prueba la filosofía bajo presión. Cuando dispones de kilobytes de RAM y de ningún lujo en cuanto a ciclos, ¿sobrevive «diseñar para las personas»? La respuesta de Matz fue mantener la expresividad de Ruby mientras desprendía el peso del entorno de ejecución – llevar la alegría de escribir Ruby hasta la capa del firmware en lugar de obligar a los desarrolladores de sistemas embebidos a bajar al C. La apuesta centrada en la persona se sostuvo incluso en el lugar más hostil para ella.
El método
El método de Matz es la empatía formalizada en una disciplina de diseño. El movimiento recurrente consiste en preguntarse no «¿qué es correcto para la máquina?», sino «¿qué sentirá la persona?» – y luego pagar cualquier coste de implementación que exija esa respuesta.
El segundo movimiento es la síntesis. Ruby es abiertamente derivativo: la pragmática y las expresiones regulares de Perl, el modelo de objetos puro y el paso de mensajes de Smalltalk, la flexibilidad de Lisp, fragmentos de Ada y Eiffel.4 Matz no inventó un nuevo paradigma. Tomó las mejores ideas de los lenguajes que admiraba y las armonizó en una sola voz coherente. Pocos diseñadores ejercen ese gusto: la disciplina de tomar en lugar de inventar, y la disciplina aún más difícil de lograr que las partes prestadas encajen en vez de chocar. El principio de mínima sorpresa es en parte una consistencia interna: una vez que aprendes un rincón de Ruby, el siguiente se comporta de la manera que el primero te enseñó a esperar.
El tercer movimiento es la honestidad sobre el compromiso. Matz nunca pretendió que Ruby fuera la opción rápida, y lo dijo con claridad, en lugar de proclamar calidez mientras optimizaba en silencio para las pruebas de rendimiento. El coste es real y concreto: como en Ruby todo es un objeto, hasta un entero es un objeto de primera clase, y la aritmética ocurre enviándole el mensaje + en lugar de ejecutar una instrucción de máquina en bruto.14 La comodidad de 5.times o (1..n).map – tratar los números como objetos con los que puedes conversar – se paga con una sobrecarga de despacho y asignación en la que un int de C nunca incurre. Matz eligió la superficie legible y dejó que el entorno de ejecución absorbiera la factura, que es exactamente la apuesta enunciada con claridad.
Cadena de influencia
Quiénes lo moldearon
Larry Wall y Perl. Ruby heredó la sensibilidad pragmática y orientada a resolver problemas de Perl, así como su ADN de expresiones regulares. El propio Matz planteó Ruby como una respuesta a Perl – conservando lo práctico y corrigiendo lo que él veía como su falta de verdadera orientación a objetos. (Influencia directa)4
Smalltalk. La convicción de que todo es un objeto – los enteros, las clases, nil – y de que el cómputo ocurre enviando mensajes proviene de Smalltalk. Es la herencia estructural más profunda del modelo de objetos de Ruby. (Influencia directa)4
Lisp, Ada y Eiffel. Lisp aportó flexibilidad y la idea de que el lenguaje debería plegarse al programador; Ada y Eiffel aportaron otros fragmentos concretos de sintaxis y diseño. Ruby es la síntesis. (Influencias formativas)4
A quiénes moldeó
La web de la era Rails. Ruby on Rails convirtió a Ruby en el lenguaje predeterminado de toda una generación de startups y le dio a la «felicidad del desarrollador» un argumento comercial: los programadores más felices entregaban más rápido, de modo que el lenguaje centrado en la persona ganaba proyectos por economía, y no solo por sensación.
La expectativa básica de toda una generación. Después de Ruby, los programadores esperaban que los lenguajes fueran agradables – que se leyeran como prosa, que perdonaran, que deleitaran. Esa expectativa redefinió el listón que los lenguajes más nuevos debían superar para ser tomados en serio.
Crystal y Elixir. Crystal toma prestada la sintaxis de Ruby casi por completo mientras se compila a código nativo a través de un backend de LLVM.11 Elixir, el lenguaje funcional de José Valim para la BEAM, lleva la sensibilidad ergonómica de Ruby al mundo concurrente; Valim cita su «experiencia previa en Ruby» para muchas de sus construcciones prestadas.12 La estética de Ruby sobrevivió a su entorno de ejecución. (Linaje estilístico)
El hilo conductor
He aquí la tensión productiva. Matz optimiza para la felicidad humana y es honesto en cuanto a que gasta los ciclos de la máquina para lograrlo. El otro polo de la ingeniería optimiza para la máquina – John Carmack contando ciclos hasta que el fotograma encaja en el presupuesto, Linus Torvalds defendiendo el «buen gusto» como la estructura de datos que hace desaparecer el caso especial. Carmack y Torvalds preguntan qué merece el hardware; Matz pregunta qué merece la persona. Ninguno de los dos polos está equivocado. Los mejores sistemas viven en la discusión entre ambos – lo bastante expresivos para que una persona disfrute al escribirlos, lo bastante disciplinados para que la máquina no quede insultada. Matz es la prueba de que «diseñar para la persona» es una posición de ingeniería legítima y rigurosa, y no un mero consuelo. (Puente de la serie)
Lo que yo saco de esto
Construyo herramientas para desarrolladores e infraestructuras de orquestación para agentes de IA, y la apuesta de Matz es la que sigo haciendo: la persona en el bucle es el destinatario que importa. Un agente de programación, igual que un lenguaje de programación, es una interfaz entre la intención de una persona y la ejecución de una máquina. Si te sorprende, te combate o te obliga a pensar como la máquina en lugar de pensar en el problema, ha fracasado – por muy ingeniosas que sean sus tripas internas. Todo el sentido de esas tripas internas es hacer que la experiencia resulte legible para la persona. Por eso también mantengo la superficie honesta y la pila delgada – el manifiesto sin compilación es el principio de mínima sorpresa aplicado a una cadena de herramientas. Y al igual que Matz se negaba a fingir que Ruby era rápido, prefiero ser honesto sobre el compromiso antes que ocultarlo: la calidad es la única variable, y la felicidad del programador forma parte de la calidad, no se opone a ella.
Preguntas frecuentes
¿Cuál es la filosofía de ingeniería de Yukihiro Matsumoto?
Matz diseña lenguajes de programación para la felicidad y la productividad de la persona en lugar de para la eficiencia de la máquina. Su propósito declarado: «Ruby está diseñado para hacer felices a los programadores.»1 Trata la experiencia del programador – legibilidad, alegría, mínima sorpresa – como la restricción de diseño primordial, y acepta un entorno de ejecución más lento como el precio honesto de servirla. «Las máquinas deberían servir a los seres humanos», dijo. «Deja que las máquinas te sirvan.»2
¿Qué es el principio de mínima sorpresa en Ruby?
Es la idea de que el lenguaje debería comportarse como espera un usuario experimentado, minimizando la fricción. Matz aclara que significa «el principio de mi mínima sorpresa» – diseñó Ruby para minimizar su propia frustración como usuario competente, y «el principio de mínima sorpresa después de que aprendas Ruby muy bien», no la sorpresa de un principiante en su primer día.5
¿Qué significa MINASWAN?
MINASWAN significa «Matz es amable y por eso nosotros somos amables» – un lema de la comunidad Ruby que nació del talante amable y paciente de Matsumoto. Los primeros rubyistas lo invocaban para imponer un tono generoso en las listas de correo, y se convirtió en parte de la identidad cultural de Ruby.78 Refleja la idea de que la comunidad de un lenguaje es, en sí misma, una superficie de diseño.
¿Qué lenguajes influyeron en Ruby?
Ruby es una síntesis deliberada. Tomó la sensibilidad pragmática y las expresiones regulares de Perl, el modelo de objetos puro y el paso de mensajes de Smalltalk, la flexibilidad de Lisp y elementos de Ada y Eiffel. Matz combinó las funciones que admiraba en un solo lenguaje coherente en lugar de inventar un nuevo paradigma.4
Sources
-
Bill Venners, “The Philosophy of Ruby: A Conversation with Yukihiro Matsumoto, Part I.” Artima Developer, 29 September 2003. “For me the purpose of life is partly to have joy… so Ruby is designed to make programmers happy.” ↩↩
-
Bill Venners, “Matz on Craftsmanship: A Conversation with Yukihiro Matsumoto, Part III.” Artima Developer, 2003. “Machines should serve human beings… Let machines serve you.” Also: interface as the surface of the system. ↩↩↩
-
“Yukihiro Matsumoto.” Wikipedia. Born 14 April 1965 in Osaka Prefecture, raised in Tottori from age four; University of Tsukuba information science; first Ruby release 21 December 1995; mruby (April 2012). ↩↩↩
-
Sinclair Target, “The Ruby Story.” Two-Bit History, 19 November 2017. Started 1993; “I really wanted a genuine object-oriented, easy-to-use scripting language”; naming with Keiju Ishitsuka after a gemstone / nod to Perl; influences from Perl, Smalltalk, Lisp, Ada, Eiffel; “I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy”; Rails-driven global breakout. ↩↩↩↩↩↩↩↩
-
Bill Venners, “The Philosophy of Ruby, Part I.” Artima Developer, 2003. “The principle of least surprise means principle of least my surprise”; “I wanted to minimize my frustration during programming”; “Don’t underestimate the human factor… We are working for human, with human.” ↩↩↩↩
-
“Yukihiro Matsumoto.” Wikiquote, citing The Philosophy of Ruby, A Conversation with Yukihiro Matsumoto, Part I, Bill Venners, Artima Developer, 2003. “We are the masters. They are the slaves.” ↩
-
“Yukihiro Matsumoto.” Wikipedia. “Matz’ demeanor has brought about a motto in the Ruby community: ‘Matz is nice and so we are nice,’ commonly abbreviated as MINASWAN.” ↩↩
-
“MINASWAN.” Wiktionary. Initialism of “Matz is nice and so we are nice”; origin and use as a community-tone norm in Ruby’s early days. ↩↩
-
“Mruby.” Wikipedia. mruby open-sourced April 2012 under Matsumoto’s direction; lightweight, embeddable implementation for constrained environments; conforms to a subset of ISO/IEC 30170. ↩
-
“mruby – Lightweight Ruby.” mruby.org. Embeddable interpreter, bytecode compiler (mrbc), and virtual machine; embeddable into C/C++ in a manner similar to Lua; ISO/IEC 30170:2012 compliance. ↩
-
“Crystal (programming language).” Wikipedia. “With syntax inspired by the language Ruby… it compiles to much more efficient native code using an LLVM backend.” ↩
-
José Valim, “Elixir Design Goals.” elixir-lang.org, 8 August 2013. “Given my previous background in Ruby, it is natural that some of the constructs added were borrowed from Ruby.” Also: Elixir runs on the BEAM (Erlang VM), per “Elixir (programming language),” Wikipedia. ↩
-
“Ruby (programming language).” Wikipedia. “The name ‘Ruby’ originated during an online chat session between Matsumoto and Keiju Ishitsuka on 24 February 1993, before any code had been written for the language.” ↩
-
“class Integer.” Ruby Core Reference. “An Integer object represents an integer value.” Arithmetic operators such as
self + otherare documented as public instance methods, meaning integer arithmetic is performed via method dispatch on an object rather than a raw machine instruction. ↩