/ prog

Por favor, reinventa la rueda

[post original -> https://blog.cerebralab.com/#!/blog/11]

[Autor -> george.hosu@protonmail.com]

Reinventar la rueda es un modismo que queda invalidado por la metáfora que utiliza. Eso se debe a que la rueda es una de esas cosas que se ha reinventado con éxito a lo largo de la historia un número inimaginable de veces.

Los materiales que utilizamos para ello cambiaron, de innumerables tipos de piedra y madera a innumerables aleaciones metálicas y sustancias a base de carbono. El contenido y las proporciones de las ruedas han cambiado, desde unas ruedas algo circulares, llenas y anchas a otras perfectamente circulares, delgadas y huecas, con cientos de radios. Los componentes con los que interactúa una rueda, como el piso y el eje, tienen cambios, lo que hace que miles de rediseños de ruedas trabajen con ellos. El terreno y la maquinaria para la que se utiliza la rueda también ha cambiado drásticamente, dando lugar a muchas otras reinvenciones de la rueda. De hecho, incluso la forma básica de la rueda no esta intacta, con variaciones que van desde las buenas y viejas ruedas circulares hasta las cuadradas.

La mejor manera de visualizar los millones de reinvenciones de la rueda y el progreso que esto ha ayudado a lograr es pensar en cómo se han utilizado las ruedas a través del tiempo. Las ruedas han pasado de curiosidades que facilitaban un poco el trabajo, a objetos en los que confiamos para el aterrizaje seguro de fortalezas voladoras de miles de toneladas, portando armas de destrucción masiva que podrían significar el fin de la civilización (si esas ruedas fallaran...). Las ruedas pueden ser lo suficientemente pequeñas como para que sean imperceptibles para los sentidos humanos, lo suficientemente versátiles como para llevar un tanque a través de cualquier tipo de terreno, lo suficientemente fuertes como para soportar que la máquina corra a 500 km/h durante horas y horas y lo suficientemente inteligentes como para llevar a los robots a través del terreno impredecible de otros planetas.

Así que, los chicos que inventaron las primeras ruedas, hicieron un gran trabajo considerando las circunstancias.... Pero, estoy bastante contento de que cuando mi taxi llegue no este usando nada remotamente cercano a aquellas ruedas.

Volvamos a la programación.

Espero que la deconstrucción de la metafora haya ayudado a dar una idea de lo infundado que es este lenguaje a la hora de tratar con los ordenadores. Algunas de las piezas de software más utilizadas y esenciales jamás creadas son las reinvenciones de la rueda. Linux es una reinvención de Unix, Mariadb es una reinvención de Mysql (Mysqlb es una reinvención de Postgres/OracleDb y Postgres es una reinvención de varias bases de datos Oracle y otras). C++ moderno es una reinvención de C++, que es una reinvención de C (que es una reinvención de B que es una reinvención de BCPL), Rust es una reinvención de C++ moderno y C, Clojure es una reinvención de LISP, LISP es una reinvención de IPL y el cálculo Lambda, Haskell es una reinvención de System FC, que es una reinvención de System F, que es una reinvención del calculo Lambda, DOT es una reinvención de OO, Kotlin es una reinvención de Java... Podría seguir todo lo que quisiera. Vim es una reinvención de Vi, Wayland es una reinvención de Xorg, Systemd es una reinvención de unas 500 piezas de software diferentes, Ubuntu es una reinvención (o mejor dicho, reskin) de Debian.

Muchos avances en software no se hacen añadiendo a una base de código existente, sino repitiendo sobre ella y proponiendo algo mejor. Es por eso que para cada repositorio popular en github hay cientos de forks y para cualquier caso de uso imaginable usted tiene docenas de variaciones de herramientas a elegir. Inventa tu propia rueda, para tus propias necesidades y, quién sabe, tal vez el público en general la considere una rueda mejor.

A menudo se desalienta a la gente que "reinvente la rueda", a pesar del hecho de que la mayoría de los avances en informática son exactamente los relacionados con la reinvención de la rueda, en lugar de crear algo que es completamente nuevo. El cambio es incremental, volvemos a insistir en un concepto ya existente y lentamente lo modificamos y lo mejoramos, hasta que ni siquiera puedes entender cómo llegaste desde el original hasta donde estás. Y lo asombroso es que no nos cuesta nada más que tiempo hacerlo, eso es lo bueno de la programación, no hay escasez de recursos, no importa cuán loca sea tu reinvención, puedes crearla.

En su lugar, nos centraríamos en decirles a las personas cómo y cuándo reinventar la rueda. Me he permitido hacer una lista rápida.

Reinventa la rueda cuando ninguna rueda se adapte a tu carreta

Es decir, en lugar de diseñar un software o producto inferior para hacer frente a las bibliotecas existentes, crear la biblioteca o herramienta que necesitas, es muy probable que alguien más lo necesite también. Este enfoque puede tomar más tiempo, pero puede ser divertido y puede resultar en un mejor producto. Obviamente tienes que ser un poco flexible y escoger tus batallas, de lo contrario, terminas siendo uno de esos "programadores" C que insisten en que deben escribir sus propias listas y vectores, o uno de los "desarrolladores" de javascript que participa en las más de 100.000 descargas diarias de la biblioteca `is_odd'. El lugar donde se dibuja la línea es una pregunta abierta, sin una sola respuesta.

Un muy buen ejemplo de esto es Julia, un lenguaje de programación muy similar a python en todos los aspectos menos en tres: es fácil de desplegar sin necesidad de entornos virtuales, es mucho más rápido y está diseñado pensando en el paralelismo a gran escala. Julia es un muy buen ejemplo de reinvención de la rueda, ya que hace lo que se podría hacer, "teóricamente", con entornos virtuales, Cython, uso adecuado de librerías C/C++, algunas pautas de codificación y un poco de paciencia. Pero Julia hace estas cosas fuera de la caja y simplemente funciona... termina ahorrando mucho tiempo y haciendo el desarrollo más agradable. Es probablemente uno de los idiomas más sorprendentes (y pronto muy influyentes) del siglo XXI.

Reinventa la rueda si no ha habido reinvenciones recientes

Otra razón para reinventar la rueda es que nadie lo ha intentado últimamente. Esto podría significar que la rueda actual es muy buena y no necesita grandes mejoras, pero a menudo significa que hay mucha gente a la que le gustaría una mejor, simplemente no tienen el tiempo o la voluntad para hacerlo. A menudo ocurre que un problema se "arregla" de manera imperfecta, pero se deja al margen, ya que la tecnología y los marcos mentales actuales no pueden encontrar una solución mejor. Uno puede encontrar a menudo, mirando este tipo de problemas unos años después, que la tecnología está ahora al día y que pueden ser resueltos de una manera mucho mejor.

Un gran ejemplo de esto es el reconocimiento de imágenes, que fue pensado como el trabajo de los clasificadores "clásicos". Se hicieron montones de mejoras incrementales a estos clasificadores y para el 2010 se obtuvieron muy buenos resultados usando cosas como el kernel fisher. Todavía estába lejos de algo que se usaría para detectar tumores de cáncer o para conducir un coche, algo que estaba a medio camino entre un loro inteligente y un elefante en términos de precisión y tiempo de entrenamiento. Hasta que alguien tuvo la idea de adaptar la rueda menos popular de las redes neuronales de convolución para utilizar las GPU modernas y mejorar algunos de los modelos de reconocimiento de imágenes desarrollados inicialmente en los años 90. Surgió el famoso AlexNet & Co en 2012, que, en pocos años, abrió el camino a la asombrosa tecnología de reconocimiento de imágenes de hoy en día, que, en conjuntos de datos de tamaño mediano, puede en realidad superar a los humanos.

Reinventa la rueda si la rueda es de marca registrada

Este es el caso de muchos grandes proyectos de código abierto, cosas como Linux, GCC y git donde sólo se reinventa software ya existente. Sin embargo, eran mejores en ciertas áreas y eran de código abierto, lo que significaba que más gente los usaba y contribuía a ellos, haciéndolos exponencialmente más asombrosos, convirtiéndose rápidamente en la opción superior en todo el mundo.

Reinventa la rueda si crees que puede ser divertido

Tampoco hay nada de malo en tener la oportunidad de reinventar una rueda perfectamente buena. Puede que fracases, pero entenderás mejor por qué se eligió el diseño actual y probablemente aprenderás mucho. Después de todo, muchos problemas interesantes ya están resueltos, pero resolverlos de nuevo puede ser muy agradable, hay millones de personas que intentaron probar el teorema de Pitágoras o crear un "nuevo LISP", y la mayoría de ellos, posiblemente, terminaron reinventando una rueda de mierda o similar. Y si tu rueda es algo mejor, acabas de hacer algo para ayudar a la humanidad (o a ti mismo) haciendo algo que disfrutas.

En conclusión

Sal y reinventa la rueda. Porque ciertamente podrías hacer algunas mejoras. Y cuando alguien te diga que lo que estás haciendo es "inútil", recuérdales que lo que estás haciendo es uno de los procesos fundamentales por los que progresa nuestro campo. Y, cada vez que pienses que estas analizando un problema que ya ha sido resuelto por mejores hombres de maneras mejores. Recordemos que un nerd de 31 años con pocos conocimientos de astrofísica o matemáticas y unas pocas docenas de millones de dólares, logró humillar a la NASA, CNSA, la ESA, Roscomos, el ejército ruso-estadounidense y chino y muchas otras organizaciones "prestigiosas", con presupuestos de docenas o cientos de miles de millones, con docenas de miles de doctores y cientos de miles de ingenieros trabajando para ellos. Inventando un cohete que es mucho más barato, más potente, más seguro, más simple, más rápido de fabricar y que puede aterrizar con una precisión de centímetros en un planeta. Así que tal vez, el hecho de que usted esté intentando crear una librería de ploteo javascript más intuitiva y bonita, un JITC más rápido para python, una ALU de fabricación más barata, una mejor versión de shopify o una implementación más eficiente de busqueda en una tabla, no sea tan descabellado después de todo.

/ prog