En 2013, cuando Facebook "solamente" contaba con 1228 millones de usuarios mensuales activos (frente a los más de 2.400 millones actuales), la compañía compartió que a la plataforma se subían 350 millones de fotos cada día. Desde entonces, las necesidades de infraestructura en ancho de banda para soportar tanta carga y descarga de imágenes y vídeos no han dejado de crecer, pues además de los usuarios, también ha crecido el número de smartphones, y con ello, el número de fotos hechas al día.
Tantos millones de fotos subidas desde móviles suponen varios retos. El primero es que incluso en redes de baja calidad, como las presentes en zonas rurales o remotas de por ejemplo la India, la foto pueda subirse en el menor tiempo posible y sin perder calidad. El segundo reto es que el espacio ocupado en la red de servidores de Facebook y en la tarifa de datos del usuario al subir y al visualizar sea lo menor posible. Buscando solucionar toda esta problemática, en el seno de Facebook nació Spectrum.
Spectrum es una librería de procesamiento de imágenes open source, desarrollada por el equipo de Infraestructura de imágenes de Facebook con la meta de que, como decíamos, la subida de imágenes sea mucho más ligera, y por tanto efectiva. Está diseñada para las aplicaciones de Facebook de iOS y Android, pero dada su naturaleza de código abierto, cualquier desarrollador puede utilizar Spectrum como desee, incluso modificándola para adaptarla a sus necesidades.
Para lograr el objetivo final de que la subida de nuestras fotos sea más ligera, Spectrum realiza una transcodificación en local en el dispositivo (nuestro smartphone) para reducir el tamaño, tratando de mantener a la vez la máxima calidad de imagen. Una vez aligerado el tamaño de las imágenes, Facebook las sube.
Según nos contaron Alexander Oprisnik y Daniel Hugenroth, desarrolladores de Spectrum, el problema al que se suelen enfrentar los desarrolladores para construir un proceso de compresión de imágenes multiplataforma es que los archivos de salida pueden diferir enormemente entre una plataforma y otra. Utilizar directamente librerías como MozJpeg (el encoder de Mozilla), comentan desde el equipo, requiere escribir código nativo en C y C++, lo que supone mucho esfuerzo y mantenimiento extra, frente al paquete más fácil de implementar que firman que Spectrum proporciona. Curiosamente, su núcleo sí está escrito en C++.
Al hablarnos de la librería, los desarrolladores de Spectrum, pusieron mucho énfasis en que al usar una API declarativa, los desarrolladores no tienen que pensar en los pasos intermedios, sino solamente en las propiedades de los archivos de salida que se quieren conseguir en función de la plataforma. Con esto, Spectrum elige en base a unas preferencias cómo hacer el proceso de transcodificación de la imagen. Por ejemplo, la herramienta está escrita para que al girar una imagen JPEG, el proceso se realice sin pérdida.
A ello ayudan unas "recetas" contenidas en los plugins (de JPEG y otros formatos) que indican cómo elegir la mejor secuencia posible para las solicitudes. Spectrum ordena las recetas priorizando las que aportan mayor eficiencia y conversión con menor pérdida.
Asimismo, la herramienta soporta integración con librerías como la mencionada MozJpeg o libpng y libwebp, más allá de APIs generales de cada plataforma. Esto permite que los desarrolladores accedan a recursos que requieren más potencia computacional y son más intensivos energéticamente, es decir, que consumen más batería de nuestro dispositivo, pero reducen más aún el tamaño del archivo, que es el objetivo final. Sobre todo, insistían, es la meta al lidiar con redes móviles de baja calidad en países emergentes, donde aún es común encontrar el 2G.
En resumen, lo que Facebook ofrece es un paquete para desarrolladores de iOS y Android con APIs para Java para el sistema de Google y Objetive-C para el sistema de Apple. Facilita el trabajo y pone un buen sistema de compresión al alcance de desarrollos que requieren tratar con imágenes, pero cuyos responsables no son expertos en la materia.
Un aspecto interesante de Spectrum es que se desarrolla en Europa, en la sede londinense de Facebook, que ocupa un lugar destacado por las soluciones de seguridad que aporta a nivel mundial. Allí conocimos los detalles de Spectrum de manos de destacados ingenieros de software del equipo de Infraestructura de imágenes, que también han estado involucrados en el desarrollo de Fresco. Se trata de otra librería open source de gestión de imágenes en aplicaciones que utilizan Wikipedia o Twitter, entre otras.
Cuando acabamos la charla, también nos interesamos por el hecho de si Instagram utilizaba Spectrum para la compresión de imágenes. Es un punto polémico, porque históricamente, y ahora en las Stories, Instagram hace que las fotos subidas a Android luzcan peor (o mucho peor) que las de iOS, algo especialmente palpable en Stories. Nos contaron que Instagram no utiliza Spectrum, y no conocen los detalles sobre por qué la compresión difiere entre ambas plataformas móviles.
.