- Introducción
- Descripción general del software
- Proceso de desarrollo
- Retos y soluciones
- Estado actual del proyecto
- Resultados y conclusiones
- Miscelánea
Este documento recopila mis reflexiones sobre el proyecto didibudget a octubre de 2025. Su finalidad es plasmar pensamientos y consideraciones sobre el desarrollo y evolución de dicho proyecto de software.
Mi intención es dejar por escrito múltiples pensamientos, entre ellos:
- lo aprendido durante el desarrollo del proyecto
- evaluar el impacto que ha supuesto en mi vida realizar el proyecto
- reflexionar acerca del proceso de desarrollo de dicho software
- documentar ciertas decisiones que tomé durante el desarrollo
En 2014 comencé a utilizar una hoja de cálculo para gestionar mis finanzas personales. Durante algunos años, mensualmente anotaba y clasificaba todos los gastos en esa hoja de cálculo para gestionar mejor mis ahorros y mis gastos. Este método era mejor que los sistemas anteriores que había utilizado, pero seguía resultando poco práctico y engorroso.
Decidí buscar una alternativa. Encontré diferentes aplicaciones para realizar esta función, pero todas las alternativas que encontré tenían uno o más inconvenientes. Algunos de estos inconvenientes eran:
- elevado coste
- ceder mis datos financieros a empresas de terceros
- la falta de funcionalidades alineadas con mis necesidades
- excesiva complejidad de uso
- imposibilidad de migrar mis datos
- estar a merced de los cambios de ese producto (precio, políticas de transparencia, funcionalidades, restricciones, etc)
Por aquella época, algunos bancos comenzaban a ofrecer en sus portales de "banca online" ciertos gráficos y datos estadísticos sobre las operaciones que realizabas como usuario de esos bancos, pero eran funcionalidades muy básicas o que carecían de utilidad práctica real.
En 2019, y viendo que ningún software existente se adaptaba a lo que yo necesitaba, me propuse desarrollar mi propio software de gestión de finanzas personales.
Disponer de un método práctico para gestionar mis finanzas personales y que esté perfectamente adaptado a mis casos de uso. Tener la posibilidad de evolucionar su funcionamiento a medida que mis necesidades vayan cambiando.
El software es una aplicación web cuya interfaz está especialmente pensada para que la introducción de datos mediante dispositivos móviles sea útil, sencilla y práctica.
Desarrollar este proyecto requirió muchas horas. Como no todo el mundo dispone de ese tiempo, decidí publicar el software bajo licencia MIT y hacerlo disponible para cualquiera.
La aplicación no utiliza herramientas y/o servicios de terceros para trackear el comportamiento del usuario, ni tampoco cede ningún tipo de dato a ninguna empresa. Tampoco existe un sistema de monetización del proyecto y no hay ningún tipo de publicidad. Los datos se almacenan en una base de datos en la nube.
Las principales funciones del software son:
- Permitir el registro de usuarios
- Permitir autenticarse
- Registrar periódicamente los ahorros del usuario
- Visualizar gráficos de los ahorros del usuario
- Registrar de manera detallada un gasto realizado por el usuario
- Visualizar gráficos de los gastos realizados por el usuario
- Obtener promedios de los gastos realizados en diferentes ventanas de tiempo
- Visualizar los gastos mensuales clasificados por categorías y subcategorías
- Visualizar un sumatorio detallado de los gastos del último año
- Visualizar el dinero invertido en ahorros de largo plazo
- Gestionar los datos introducidos
- Permitir a los administradores visualizar los usuarios registrados
El software está distribuido en múltiples repositorios. La aplicación consta de 4 capas diferenciadas:
- La aplicación web, que permite a los usuarios interactuar con sus datos
- El backend, que se encarga de realizar de puente entre la capa de persistencia y la aplicación web
- La capa de persistencia, responsable de almacenar la información introducida por los usuarios
- La gestión de las copias de seguridad de los datos, que realiza copias de seguridad de manera periódica y automatizada de los datos almacenados en la capa de persistencia
Algunas de las tecnologías y herramientas utilizadas son: Git, Node.js, Jest, Testing Library, React, MongoDB, Postman, GraphQL y Apollo.
También he utilizado servicios como Netlify, Heroku, MongoDB Atlas, GitHub y GitHub Actions.
Kanban fue la metodología utilizada para organizar y priorizar las tareas.
El desarrollo siguió un enfoque iterativo y evolutivo, donde el diseño, la implementación y el uso del software avanzaban de forma paralela.
El software debía mejorar los casos de uso que ya gestionaba mediante una hoja de cálculo.
El objetivo principal era poder utilizarlo cómodamente desde un teléfono móvil.
Desde el inicio decidí separar el backend y el frontend en repositorios independientes.
El diseño y la arquitectura evolucionaron a medida que el uso real del sistema revelaba nuevas necesidades.
Cada funcionalidad seguía este proceso:
- Definir el caso de uso y dibujar en papel el diseño de la interfaz (por ejemplo, registrar un gasto).
- Determinar las interacciones con los elementos de la interfaz.
- Diseñar el modelo de datos necesario para la entidad correspondiente.
- Establecer un contrato para los endpoints de la API.
- Implementar en el backend la capacidad de registrar la entidad.
- Desarrollar y probar los endpoints definidos.
- Verificarlos mediante Postman e introducir los primeros registros.
- Implementar la parte frontend.
- Evaluar los resultados y refactorizar si era necesario.
Se testearon principalmente las partes críticas del software, en especial:
- Funciones que transforman datos
- Expresiones regulares
- Flujos clave del sistema
El mantenimiento del software ha sido constante desde su creación. Las tareas principales incluyeron:
- Refactorización de código
- Actualización y sustitución de dependencias
- Corrección de errores
- Ampliación de funcionalidades
- Mejora de las funcionalidades existentes
El principal reto al desarrollar ha sido la ausencia de tiempo. Claramente ha sido un gran condicionante en el proyecto que ha influenciado en la planificación del trabajo y el alcance del mismo.
Sin embargo, no ha sido un desafío para mí tener un proyecto personal de larga duración. A menudo otros desarrolladores me comentan que tienen múltiples proyectos empezados que nunca llegan a concluir satisfactoriamente. Por suerte, esto no ha sido un problema para mí. Me he sentido afortunado de ser constante y tener la capacidad de seguir trabajando en este proyecto durante años sin perder la motivación.
Realizar una aplicación en tu tiempo libre requiere optimizar todos los minutos que dispones para dedicar al proyecto. Para sacar adelante el proyecto con éxito, tomé algunas decisiones clave:
- dedicar más tiempo a imaginar como debía ser la funcionalidad antes de tratar de programarla
- limitar el alcance de algunas funcionalidades y centrarse en aquello que realmente aportaba valor
- utilizar una librería de UI de código abierto en vez de tratar de desarrollar mi propio CSS
Actualmente estoy utilizando el software a diario.
El proyecto es de código libre y tiene una licencia permisiva para que cualquier persona pueda utilizarlo libremente si así lo quiere.
Estoy agradecido de haber podido realizar este proyecto. Siento que todas las horas invertidas y el esfuerzo realizado valieron la pena.
He notado que el software ha evolucionado a medida que yo lo hacía como desarrollador. A pesar de todo, la limitación de tiempo libre ha sido siempre el principal reto y limitante para obtener un software más completo, moderno y perfeccionado.
En los últimos años TypeScript se ha impuesto claramente frente a JavaScript. He notado mucho la ausencia de esta tecnología en el proyecto y claramente es algo que probablemente incorporaré al proyecto.
En su momento decidí utilizar React en el frontend, pero ahora apostaría claramente por Vue.
Con los conocimientos adquiridos, hoy estructuraría el proyecto de otra forma. En cierto modo, he tenido que convivir con un software que refleja más mi manera de trabajar de hace un lustro que la actual.
En 2025 la Inteligencia Artificial ha irrumpido con fuerza con herramientas como GitHub Copilot. Me hubiera gustado contar con esa ayuda a lo largo de los años en los que he desarrollado este software.
Este proyecto me ha ayudado a ponerme en la piel de muchos perfiles y roles: UX&UI, Product Owner, etc. Esto ha propiciado tener una mirada más amplia de las problemáticas del desarrollo de software.
Encontrar el equilibrio entre pragmatismo y calidad ha sido clave debido a la falta de tiempo libre disponible para dedicarle al proyecto. Algunas veces se sacrificó usar alguna tecnología más moderna en favor de desarrollar una nueva funcionalidad. Otras veces se limitó el alcance para añadir algún test clave.
Lidiar con la deuda técnica en un proyecto de tan larga duración ha sido revelador y a veces agotador. Por el camino tuve que realizar algunas migraciones que fueron inesperadas y lidiar con librerías que eran deprecadas en favor de otras. Todo ello ayudó a mejorar mi conocimiento sobre el desarrollo de software, el open source y la cadena de dependencias sobre la que se apoya todo el software existente.
Detallo aquí enlaces a los repositorios mencionados:
- didibudget-backend
- didibudget-frontend
- didibudget-automated-database-backup. Esto es un enlace a un repositorio privado, por lo que solo los usuarios autorizados podrán acceder a dicho recurso. Sin embargo, hay documentado un esbozo de dicho repositorio a modo de ejemplo aquí: mongodb-database-backup. Este repositorio contiene un automatismo para generar copias de seguridad de la base de datos de manera periódica.