Ariel Costas

Revisitando código de mi época «soydev»

Desde siempre me ha gustado la informática, y si bien aprendí a escribir programas hace muchos años, no empecé a hacerlo en serio hasta mediados-finales de 2019, cuando decidí retomar PHP. Con el tiempo fui moviéndome hacia NodeJS, donde tuve una época soydev donde en vez de solucionar problemas recurría al código de otros para hacerlo, creando programas absurdamente complejos e inútiles, que por supuesto, nunca terminaba.

El otro día visité mi dominio en Web Archive, y me encontré con artículos antíguos titulados "mi «stack» de desarrollo y por qué lo elijo" o "cómo comprobar subcadenas iguales en Java". Este último enlazaba a mi GitLab, que contenía un repositorio muy antíguo de mi proyecto Vigo360, donde intenté implementar desde cero una especie de CMS para gestionar el contenido ded ese proyecto.

En este proyecto utilizaba una inmensa cantidad de bibliotecas, dependencias y software innecesario, que voy a pasar a mencionar ahora, así como la forma en que lo haría (y estoy haciendo, en privado) en la actualidad.

Empezando por el principio: README chapucero

De aquellas no gestionaba nada bien el tema escribir README (ahora tampoco lo hago mucho mejor) pero al menos sé que no debo escribir comandos para probar cosas en dicho README. Pues ahí estaba, en puro spanglish una llamada a curl para hacer una consulta GraphQL al servidor para subir una imágen a un endpoint.

En la raíz del repositorio también nos encontramos un CHANGELOG con solo "latest" y poniendo cambios a nombres, tipos y chorradas varias que no le importaban a nadie más que a mí, porque no era código público y no era estable.

Despliegue: Docker y AWS

Para mí Docker y AWS era lo que estaban de moda en aquel momento, y como buen soydev que era, decidí escribir mi programa para que utilizase AWS y contenedores docker, por supuesto, ded la forma más chapucera posible.

En cuanto a AWS, tenía varios servicios configurados en una plantilla YML de CloudFormation (para orquestar servicios desde una plantilla, sin hacerlo a mano). Entre ellos: un bucket para el contenido estático, uno de backup y otro de logs. Servía el contenido estático desde una CDN de CloudFront (ya me contarás para qué, si no me iban a visitar tantas personas ni de tantos sitios), almacenando los logs al S3 correspondiente.

Por último, tenía configurado SES para enviar correo desde dicho dominio, con un par de plantillas en texto y HTML ahí puestas.

En cuanto a docker, en un VPS con Ubuntu y docker descargaba las imágenes nuevas con cada versión, generadas por el CI de Gitlab cada vez que hacía tag. Por tanto, subía mi código con mi tag, esperaba 10-15 minutos a que esa monstruosidad infernal se compilara, y luego actualizaba el servidor.

AWS entero puede remplazarse por un servidor de correo y NGINX bien configurados, sin todo el jaleo de plantillas, permisos y facturación (evitar una factura de 10.000 euros era la intención). En cuanto a Docker, subir el código a git y en el servidor hacer git pull && make o el comando que sea para compilar es suficiente.

¡JavaScript! ¡JavaScript por todas partes!

Como buen soydev, utilizaba JavaScript (o mejor dicho, NodeJS y TypeScript) para todo lo que hiciera. ¿Backend? Node y TypeScript ¿Frontend? JavaScript con un framework. Sí, de aquellas no sabía escribir código para llamar a la base de datos o quien fuera y luego sacar HTML sin más.

Mi "backend" consistía de GraphQL (con su framework para implementarlo), un ORM para poder hacer las consultas SQL necesarias directamente y express como servidor Web. En total tenía unas 40 dependencias directas para mantener dicha chapuza.

En cuanto a "frontend", tenía tres módulos, todos incompletos y funcionales de aquella manera. Tenía por un lado 'admin', que era un panel administrativo hecho con Svelte y estilizado con TailwindCSS (aparentemente, escribir código propio no era lo mío) y un total de 38 dependencias directas para hacer lo que HTML 5 y CSS 3 hacen.

También el módulo "www", que sería la página pública para los lectores de nuestro proyecto. Este también usaba lo mismo que el anterior, pero en vez de reutilizar estilos, componentes y demás, simplemente copiaba las cosas de un lado al otro, rompiendo el principio DRY.

Por último, pero no por ello menos chapucero, el módulo "auth", como los dos anteriores. Por algún motivo que no recuerdo 9 meses más tarde, quise separar el inicio de sesión del resto del sistema de administración. Pero bueno, era la misma chapuza JavaScript-Tailwindesca, con lo que no hay mucho más que mencionar.

¿Cómo remplazar toda esta mierda?

En la actualidad estoy ¿reescribiendo? (no estoy mirando nada de lo que hice aquí) el proyecto, esta vez siendo mucho más conservador con la tecnología que uso y más cuidadoso con las dependencias. Estoy utilizando Go y MySQL, y renderizando las páginas HTML directamente.

Por tanto, escribo unas consultas a mano y unas plantillas HTML con CSS, y lo mando directamente al cliente. No tengo varios megabytes de JavaScript cargando cada vez, para una SPA. Tampoco tengo Docker ni GitLab CI para compilar, porque ya lo puede hacer mi VPS con Debian.

¿Me siento avergonzado de ese código que escribí? Sí y no. Pienso que es código antíguo, de cuando no sabía nada mejor y me guiaba por modas, en vez de por tecnología que me permitiera resolver problemas por mí mismo. Escribo HTML y CSS a mano, utilizando los elementos estándar y escribiendo estilos a mano.

También uso Go, cuya biblioteca estándar cubre la mayoría de mis necesidades, y recurro a alguna dependencia cuando no. Por último, aprendí a usar mi sistema (Linux) en vez de confiar en la poca seguridad y comodidad que me pudiera brindar Docker.