Bienvenido

Hola, me llamo Fernando Serrano Carpena. Soy desarrollador de software desde hace más de 15 años. Llevo toda mi carrera compaginando mi pasión por las teconologías web con los gráficos por computador. Aquí puedes ver algunos de mis proyectos más recientes.

PD: si estás viendo esta web desde un PC, puedes probar a introducir comandos con tu teclado en el terminal de la izquierda.

$ Portafolio_

Volver arriba

Aquí puedes ver una selección de los proyectos más recientes en los que he participado.

Volver arriba

$ Tecnologías_

Volver arriba

Un breve resumen de las tecnologías que más utilizo en mis proyectos, y mi experiencia en cada una. Haz clic en cada una para obtener más información.

Astro

Astro

Me gusta Astro por ser un framework de desarrollo web versátil. Permite crear sitios web renderizados en el servidor y utilizar componentes de otros frameworks gracias a “Astro Islands”. Mediante la integración de otros frameworks, estas islas se pueden renderizar en el servidor y hidratar en el frontend para contenido dinámico.

Algunas de las integraciones que incorpora Astro son React, Svelte, Vue o Tailwind. Aunque fue diseñado originalmente para sitios web estáticos precompilados, su integración con bibliotecas de frontend lo hace útil para más aplicaciones.

Actualmente estoy trabajando en un TPV con Astro y React, que permite renderizar componentes en el servidor y hidratarlos en el cliente. También estoy utilizando Astro para la página web de paella-core, un sitio web estático con documentación y ejemplos interactivos del reproductor de vídeo.

Este mismo portafolio está implementado también con Astro.

C#

C#

He utilizado C# para programación de plugins de Unity y de Godot, que permitieran importar en estos motores gráficos los assets creados con mi motor gráfico bg2 engine. Actualmente sigo manteniendo el plugin de importación para Godot.

C/C++

C/C++

Actualmente estoy manteniendo tres proyectos implementados con lenguaje C++:

  • bg2 engine - native: el API nativa de mi motor gráfico.
  • bg2-io: biblioteca de lectura y escritura de archivos de assets de mi motor gráfico. Este es el código base que utilizo para generar la versión de WebAssembly para JavaScript.
  • bg2 Unreal Tools: paquete de plugins para carga de assets de bg2 engine dentro de Unreal.
CSS

CSS

Creo que en la base del conocimiento de cualquier persona que se dedique al frontend web es conocer profundamente HTML y CSS. Por ese motivo, además de utilizar CSS en todos mis proyectos que usan tecnología web, me gusta mantenerme al día de las novedades en el lenguaje y aprender nuevas técnicas.

Docker

Docker

Desde hace unos años utilizo Docker como herramienta para instalar el entorno de desarrollo en los PCs donde trabajo. Principalmente utilizo contenedores de Docker para instalar sistemas de gestión de bases de datos, algunos entornos de ejecución que quiero mantener fuera del host y algunas aplicaciones web.

También uso Docker para generar contenedores para distribuir el código a producción. No suelo utilizarlo para desarrollo, aunque alguna vez si que lo he usado para mantener código que utilizaba alguna versión antigua de un runtime.

Git

Git

He pasado por muchos sistemas de control de versiones: CVS, Subversion y Mercurial, antes de acabar utilizando Git. Es cierto que hay ciertas cosas que me gustan más en Mercurial, pero he acabado en Git porque se ha convertido prácticamente en un estándar.

Prefiero utilizar la terminal de comandos porque es la única forma que veo en la que puedes saber exactamente lo que estás haciendo. Si que me gusta usar alguna interfaz gráfica de usuario para tareas que son bastante tediosas usando la terminal, como por ejemplo comparación de versiones de un fichero o visualización del estado de las ramas en un repositorio.

JavaScript

JavaScript

JavaScript (y TypeScript) es el lenguaje que utilizo en la mayoría de mis proyectos full stack. Hay lenguajes que me gustan más, pero desde que tenemos entornos como Node.js me parece que es la mejor opción para utilizar el mismo lenguaje tanto en frontend como en backend.

También uso JavaScript en el editor de escenas de mi motor gráfico. Se trata de un motor gráfico que se utiliza principalmente en web, así que utilicé Electron.js para hacer que la visualización de las escenas fuera idéntica en producción y en desarrollo.

Para desarrollo móvil he utilizado JavaScript con React Native. Me parece una buena opción para aplicaciones sencillas que tengan que ser multi plataforma.

Langchain

Langchain

Langchain es un proyecto de código abierto que permite crear chats conversacionales con modelos extensos de lenguaje (LLM), disponible en Python y en JavaScript.

Aunque es muy reciente, está teniendo bastante éxito. Flowise es un proyecto que se basa en Langchain para crear el mismo tipo de chats, pero mediante un lenguaje visual, conectando cajas para implementar funcionalidades. Generalmente utilizo Flowise para crear prototipos, y luego traslado ese prototipo a código utilizando Langchain.

He trabajando con el API de JavaScript para crear un plugin para Paella Player en el que el usuario puede preguntar datos sobre el vídeo.

La terminal de la cabecera de este portafolio incorpora un chat implementado con Langchain, utilizando WebLLM: una biblioteca que permite ejecutar el modelo de lenguaje en el host local. Puedes probarlo si dispones de un navegador compatible con WebGPU y al menos 4GB de memoria VRAM en la tarjeta gráfica. Para ver si tu dispositivo es compatible, escribe chat en la terminal.

MongoDB

MongoDB

Además de utilizar MongoDB para el catálogo de recursos multimedia del portal UPV Media, me gusta utilizarlo como base de datos para back ends basados en Node, porque es una base de datos que se lleva especialmetne bien con JavaScript y TypeScript.

No suelo acceder directamente a las bases de datos MongoDB a través de su API de JavaScript, por lo general prefiero utilizar un ODM como Mongoose.

OpenGL

OpenGL

Utilicé OpenGL para la primera versión del API nativa de mi motor gráfico bg2 engine, pero actualmetne no tengo ningún proyecto activo en el que lo esté utilizando. Para mis proyectos actuales de gráficos por computador en los que interactúo directamente con el API gráfica ahora utilizo Vulkan.

PostgreSQL

PostgreSQL

Durante muchos años utilicé MySQL preferentemente antes que PostgreSQL, porque los servidores de hosting de la épica de precio razonable prácticamente te obligaban a utilizar PHP y MySQL.

A medida que fui migrando mis proyectos a VPS, empecé a cambiar a PostgreSQL. Me parece un sistema de gestión de bases de datos mucho más robusto, potente y escalable. Actualmente utilizo PostgreSQL siempre que me hace falta usar una base de datos relacional. He trabajado también con triggers y procedimientos escritos en PL/PgSQL, aunque actualmente prefiero dejar la lógica fuera del servidor de base de datos por ser mucho más fácil de depurar y mantener.

React

React

Es la biblioteca que más utilizo en mis proyectos de web. Aunque hay alternativas que me gustan más, considero que actualmente tiene la mejor relación entre características, comunidad, rapidez en el desarrollo y flexibilidad.

He podido desarrollar también algunos prototipos con React Native para aplicaciones móviles, aunque ninguno de esos proyectos llegaron a pasar de la fase de prototipo.

Rust

Rust

Actualmente Rust es mi lenguaje de programación preferido. Por ese motivo intenté utilizarlo para el desarrollo de la nueva versión de bg2 engine - native. Desafortunadamente, para utilizar Vulkan a través de Rust dependes de varias bibliotecas cuyas APIs no son demasiado estables: hay muchos cambios entre una versión y otra, y esto me hacía perder mucho tiempo simplemente en mantener el código actualizado.

Por ese motivo acabé decidiéndome por C++ como lenguaje para mi motor gráfico: Vulkan se publica en lenguaje C, y de esta forma puedo integrar las nuevas extensiones nada más publicarse, y además dejo de depender de bibliotecas de terceros.

En la actualidad estoy desarrollando la nueva versión del editor de mi motor gráfico bg2 engine usando Tauri, un entorno similar a Electron, en el que se utiliza Rust en la parte de interacción con el host.

He considerado también usar Rust para algunos proyectos de backend en los que estoy trabajando, pero acabé descartando por la poca disponibilidad de personal cualificado.

Svelte

Svelte

Posiblemente esta biblioteca es la que más me gusta para interfaces de usuario. Hace unos años habría jurado que acabaría por sustituir a React, ya que se basa en los mismos principios, pero lo hace con muchísimo menos código, de una forma más directa, más sencilla y más intuitiva.

Por algún motivo, no acaba de terminar de despegar. Ya se ha situado en el top 10 de bibliotecas de frontend, pero está muy lejos de sus competidores. Generalmente, si tento posibilidad de escoger, suelo utilizar React antes que Svelte para proyectos en los que voy a trabajar con un equipo. Pero actualmente, he escogido Svelte para el frontend del editor de mi motor gráfico bg2 engine, simplemente porque se trabaja bastante más rápido que con React.

TypeScript

TypeScript

El único caso en el que prefiero seguir usando JavaScript sobre TypeScript es en la creación de bibliotecas. El caso de las bibliotecas es un poco especial, porque a veces resulta útil distribuir el código sin compilar. Para este caso de uso no es posible utilizar TypeScript, porque no sabemos cual es el sistema de building que va a usar la aplicación que consume el código de la biblioteca, e incluso es posible que no se esté utilizando ningún sistema de building en absoluto.

Para el resto de casos, los tipos de datos fuertes en tiempo de compilación resultan muy útiles para identificar errores y como ayuda con los sistemas de completado de código.

Vulkan

Vulkan

Vulkan es el API que estoy utilizando para la nueva versión de bg2 engine - native. Todavía no he publicado nada de esta versión, así que actualmente no tengo ningún otro proyecto en producción que utilice Vulkan. No obstante, tengo bastante experiencia en su uso, ya que empecé a hacer pruebas para utilizar Vulkan en bg2 engine poco después de que se publicara la especificación.

Recientemente, he creado un proyecto con fines educativos donde recopilo algunas de las técnicas que utilizo en bg2 engine. Se llama Vulkan Mini Engine, está disponible en Github, e incluye una rama principal en C++ y otra rama secundaria en Rust:

Vulkan Mini Engine en Github

WebAssembly

WebAssembly

Dentro de mi biblioteca bg2-io para lectura y escritura de assets de bg2 engine, opté por utilizar WebAssembly para poder implementar el código de carga de assets una sola vez, en lenguaje C, y utilizar ese código implementando un wrapper bastante ligero en JavaScript.

He utilizado WebAssembly a través de Emscripten. Existe la alternativa de compilar directamente WebAssembly desde código Rust, pero descarté esta opción porque el objetivo consistía en implementar el código el mínimo número de veces posible.

Cabe destacar la implementación del wrapper en JavaScript. Cuando utilizas WebAssembly en un navegador, creas una instancia para ejecutar el código, y asignas buffers de memoria que actúan como si fuera la memoria RAM del proceso de C. Internamente, todo el intercambio de datos entre JavaScript y C++ se hace de forma manual, por lo que has de conocer muy bien la forma en la que C organiza sus estructuras de datos. También debes utilizar técnicas de gestión de memoria, ya que evidentemente en la parte de WebAssembly no puedes hacer uso del garbage collector de JavaScript. He utilizado estas características en una ocasión para impmartir formación en C++, ya que permite experimentar en la práctica algunos conceptos que en C no son fáciles de ver solamente con la teoría.

WebGL

WebGL

Al margen de ser la única alternativa de API de gráficos para navegadores que está disponible en la mayoría de dispositivos actuales, su arquitectura y API es muy similar a OpenGL, con la que he trabajado durante años. Además, el lenguaje que se utiliza para implementar los shaders es el mismo que se utiliza para Vulkan (aunque en versiones mucho más antiguas).

Actualmente estoy utilizando WebGL en el desarrollo del API de navegador de mi motor gráfico bg2 engine. Estoy empezando a trabajar en una versión para WebGPU, que es la nueva especificación de API de gráficos de bajo nivel, una especie de Vulkan para web.

Volver arriba

$ Contacto_

Volver arriba

Puedes contactar conmigo a través del correo electrónico.

Volver arriba