Hace 5 años escribí una entrada donde contaba el gran cambio que tuvo la página de Altenwald Books, cómo avanzó de ser una página estática con gran dependencia en integraciones de terceros, si quieres leerlo por aquí anda, hablemos ahora de cómo ha ido progresando.
Como dije, la página avanzó de una página de libro única donde se vendía el libro de Erlang/OTP Volumen I y II con integraciones como AddThis, Disqus, PayPal, Mailchimp, Google Analytics y Sellfy.
La página intenta ser un punto de partida y la venta se hace o en PayPal para los libros físicos, o en Sellfy para los libros digitales, AddThis para compartir, Disqus para los comentarios, Mailchimp para tomar contactos para la lista de correo y Google Analytics para ver cómo crece.
Esto evolucionó a una aplicación de servidor hecha en Phoenix Framework, un Phoenix Framework al mismo nivel que el explicado en el libro de Phoenix Framework donde todo se hace con integraciones a nivel de servidores web, a través de API y con ello pasamos a:
- PostgreSQL-BDR fue una elección de base de datos que me gustó por sus promesas, por sus luces, pero también tiene sus sombras. Os cuento un poco más adelante.
- Torch es una herramienta que genera páginas de administración. Un gran aliado en un inicio, pero también con muchas limitaciones.
- FacturaDirecta es un gran aliado y muy recomendable. No obstante, también tiene sus limitaciones y sobre todo solo sirve para España y no para los Países Bajos (al menos cuando lo dejé).
- Slack es una herramienta muy empleada y muy recomendable para empresas, para múltiples trabajadores, pero al final tiene sus limitaciones y sobre todo si tu presupuesto se debe ajustar. Existen otras soluciones gratuitas y cuento más adelante con cuál me quedé finalmente.
Sobre los servicios web que uso, he tenido que ir cambiando algunas de las herramientas a lo largo del tiempo pero he mantenido siempre las mismas prestaciones, servicios para:
- Convertir la dirección IP de quien visita la página a un código de país.
- Envío de emails transaccionales. Para el alta de usuarios, cambio de clave y notificaciones.
- Registro de emails en una lista de correo para un envío semanal. Mantener el contacto.
- Pasarelas de pago.
Comencemos con las secciones para profundizar en cada avance y cambio.
El stack elegido y su avance
Elegí Phoenix Framework y no me arrepiento de mi decisión. Es cierto que cuando implementé en 2018 la página la versión de Phoenix fue la 1.4 y después de esto, en cada versión, ha supuesto un cambio bastante tedioso. Principalmente en la parte de frontend porque comenzamos con Brunch, para convertir después a Webpack y más tarde a esbuild.
El coste de mantenimiento adaptativo ha sido muy alto. No obstante, ha valido la pena. A día de hoy el sistema corre en Erlang/OTP 26, Elixir 1.15 y Phoenix Framework 1.7. Aún no he incluido partes del sistema en LiveView, porque considero que es una tecnología que aún tiene un par de cambios que realizar y no quiero seguir gastando en adaptación.
Hay que recordar que un mantenimiento correctivo y adaptativo son siempre vistos como gastos. El primero por invertir tiempo en corregir un código que no funcionó correctamente con el impacto que trae consigo y el segundo por tan solo ser una adaptación a nuevo hardware, nuevo sistema operativo, nueva versión del lenguaje, del framework o de las bibliotecas.
Aunque también invertí tiempo en realizar mantenimiento perfectivo que como su nombre indica no es solo agregar nuevas funcionalidades (yo llamaría a este el mantenimiento evolutivo) sino que consiste principalmente en refactorizar el código para incrementar la calidad interna y disminuir la deuda técnica.
Paneles de Administración
Después de probar con Torch y Kaffy decidí finalmente implementar mi propia aplicación de administración. A nivel de proyecto, cree una nueva aplicación para hacer uso de la aplicación de datos y lógica de negocio e implementar los mecanismos necesarios para gestionar los libros, los carritos, las ofertas y todo lo necesario a nivel de la tienda.
El problema de Torch es que generaba una gran cantidad de código que después había que arreglar.
El problema de Kaffy es que se rompía con mucha facilidad y no permitía un gran nivel de flexibilidad. Con modelos de datos complejos termina perdiendo rápidamente su utilidad.
Finalmente desarrollé una serie de interfaces con lo que realmente necesitaba para el modelo de datos que había creado y no solo me facilitó la experiencia de gestionar la tienda, sino que también me proporcionó nuevas ideas de cómo modelar mejor los datos.
Volviendo a PostgreSQL
Seamos sinceros, la página web no tiene un tráfico tan grande como para justificar un cluster. Es caro. Las caídas en el sistema se debían principalmente a acciones dentro del servidor más que a problemas con la base de datos y las copias de seguridad dan la tranquilidad necesaria para no tener que preocuparse excesivamente por los servidores de base de datos.
Así que desmonté el PostgreSQL-BDR y dejé tan solo un PostgreSQL simple.
No obstante, también tengo que decir que antes traté de lanzarme a utilizar CockroachDB o Yugabyte descubriendo siempre que los casos de uso que contemplan estas bases de datos y para los cuales brillan no era el mío.
Funcionalidades
A nivel de funcionalidades y tal y como he ido viendo en el artículo de 2018, con respecto a la compra y venta no ha avanzado mucho, es decir, la compra, las ofertas y las descargas siguen ahí.
En ofertas tan solo he mejorado en la creación masiva de códigos de oferta. Para empresas o sorteos donde la persona que entrega el código le permite realizar la compra a quien obtiene el código y así se crea un usuario, porque sí, hemos agregados usuarios al sistema.
Los usuarios permiten una recurrencia en el sistema, un usuario que compró un libro puede entrar en su cuenta y ver su estantería, le permite volver a descargar los libros ya comprados, tener acceso a sus actualizaciones y ver sus órdenes de pedido. Lo de facturas ya lo iremos viendo.
Agregué también una sección de blog. ¿Otro blog como este? Bueno, en principio mi intención era fusionarlos. Agregar una redirección automática del dominio .org al .com y con el tiempo eliminar este dominio, pero me resultó muy incómodo el hecho de pensar en escribir algo que se salga un poco del tema principal de la programación para el blog de la tienda de libros. No. Prefiero mantener ambos blogs separados de momento.
Eso no quita que termine moviendo algunos artículos al blog de la tienda porque considere que allí puedan generar mejor tráfico para la tienda, pero lo vamos viendo.
Otra característica interesante han sido las páginas de inicio (o landing pages). Estas páginas dedicadas expresamente a un libro en concreto permiten mejorar la posición en los buscadores. O eso me dijeron los de SEO. Así que ahora páginas como Historia de los Lenguajes de Programación ofrecen una URL amigable y un contenido relacionado con el libro con varias llamadas a la acción.
Por último, este mismo año agregué la última característica, los paquetes (o bundles) que permiten adquirir un conjunto de libros al carro con un solo clic. Esta funcionalidad ha sido inestimable para las comunicaciones donde ofrecía ofertas de combo de libros y finalmente aplicarlas a las páginas de inicio permite crear páginas como Erlanger donde se venden los libros de Erlang y al comprar se introducen ambos junto con su descuento en el carro.
En lo sucesivo seguramente abra la posibilidad de comprar códigos de regalo para otros que puedan enviarse por email. Cualquier sugerencia que se os ocurra es bienvenida.
¿Qué haremos en los próximos 5 años?
La tienda de Altenwald ha evolucionado hasta convertirse en el negocio central. Al menos, desde el punto de vista de la web. Sin embargo, aún teniendo una cantidad creciente de libros, los ingresos no son comparables a un salario y por tanto, el negocio debe ampliarse o pivotar de alguna forma.
Tras hablar con algunas personas, tengo claro que ofrecer cursos online es una propuesta a explorar y seguramente agregue una nueva aplicación al proyecto que pueda permitir la creación de un campus virtual dentro de Altenwald para la enseñanza de algunas doctrinas de programación principalmente.
Veamos cómo vamos progresando.