Developing a Custom Desktop App for a Medical Training Center
A Journey of Learning and Growth
Nota: abajo de todo vas a encontrar la versión en español de esta publicación (busca el titulo: ESPAÑOL).
Building a software solution from scratch is never just about writing code—it’s about solving problems, choosing the right tools, and learning continuously throughout the process. In this post, I’ll share my experience developing a desktop application for a medical training center, highlighting key lessons learned, challenges faced, and the strategies I used to deliver a robust and reliable product.
1. Choosing the Right Technology Stack: The Research Phase
The first step in any project is deciding on the right technology stack. Since I was working solo, I needed technologies that were both powerful and familiar. After evaluating several options, I chose:
Python for its versatility and large ecosystem of libraries.
MySQL for its robustness and suitability for relational data.
CustomTkinter to create a modern and user-friendly GUI.
This stack allowed me to balance ease of development with the ability to handle the complexity of the client's requirements. Additionally, I made use of virtual machines to distribute the app across different operating systems, ensuring cross-platform compatibility.
2. Leveraging AI for Project Structure and Development
I didn’t work alone—AI tools like ChatGPT and Claude played a crucial role in helping me structure the project. From setting up the initial architecture to solving specific implementation issues, these AI tools acted as valuable assistants, allowing me to speed up development and focus on problem-solving.
AI-assisted development provided me with:
Guidance on best practices in Python packaging and code organization.
Help in designing the database schema.
Code snippets and solutions for handling edge cases and specific features.
3. Building a Relational Database from Scratch
The heart of the application was a relational database to manage students, courses, and payments. I designed the entire database schema from scratch, ensuring that it was both scalable and easy to maintain. Using MySQL, I created tables for:
Students
Courses
Payments
Additionally, I ensured proper indexing and normalization to optimize query performance. Working directly with SQL queries helped me gain deeper insight into how relational databases operate under the hood.
4. Emphasizing Good Software Development Practices
Since this project was a real-world solution, I knew that following good development practices was crucial for long-term maintainability. Some of the practices I adhered to included:
Modularization: I structured the project as a Python package, breaking down the code into reusable modules.
Code Organization: I kept the project well-organized by separating concerns into different folders (e.g., GUI, database, utilities).
Documentation: I documented the entire process, including code comments and user instructions, making it easier for the client to understand and use the product.
Code Reusability: Wherever possible, I wrote reusable functions and avoided duplication, which greatly improved the readability and maintainability of the code.
5. Iterative Development and Client Feedback
One of the key factors that contributed to the project’s success was maintaining constant communication with the client. I followed an iterative development approach, regularly showing the client prototypes and early versions of the app. This allowed me to:
Get feedback on the app’s interface and functionality.
Quickly make changes based on their input.
Ensure that the final product met the client's expectations.
This collaborative approach not only improved the quality of the app but also helped me understand the client’s needs more deeply.
6. Deploying the Database in the Cloud: Research and Solutions
Deploying the database was another interesting challenge. Initially, I experimented with a free trial on Google Cloud Platform (GCP), which gave me experience with cloud deployment and managing cloud-based databases. However, for the production environment, I ultimately chose DonWeb, a local hosting provider.
The deployment process involved:
Learning to configure a Linux virtual machine on DonWeb.
Setting up the MySQL server securely on this machine.
Ensuring that the database was accessible to the application without compromising security.
This phase of the project was particularly rewarding, as it pushed me to learn about Linux system administration, including using the command line, setting up firewalls, and managing remote servers.
Final Thoughts: The Power of Real-World Projects
This project was much more than just another freelance job—it was a hands-on learning experience that significantly boosted my skills in software development, database management, and client communication. Working on real-world projects is, in my opinion, one of the best ways to learn because it exposes you to real challenges, forces you to find solutions, and ultimately teaches you things that no tutorial ever could.
Key takeaways from this project:
Always do thorough research before choosing your tech stack.
Iterative development and constant feedback are key to delivering a product that meets (and exceeds) client expectations.
Don’t be afraid to dive into unfamiliar territory—whether it’s learning a new operating system like Linux or deploying a cloud database, every challenge is an opportunity to grow.
What’s Next?
I’m eager to continue working on exciting projects like this one, applying what I’ve learned and taking on new challenges. If you’re working on something interesting and looking for a developer to help bring your ideas to life, feel free to reach out!
Español
Desarrollando una Aplicación Personalizada para un Centro de Cursos de Medicina: Un Proceso de Aprendizaje y Crecimiento
Desarrollar una solución de software desde cero no se trata solo de escribir código; es un proceso que implica investigar, elegir las herramientas adecuadas y aprender continuamente. En esta publicación, quiero compartir mi experiencia desarrollando una aplicación de escritorio para un centro de cursos de medicina, destacando los desafíos enfrentados, las lecciones aprendidas y las estrategias que utilicé para entregar un producto robusto y funcional.
1. Investigación para Elegir el Stack Tecnológico Adecuado
El primer paso en el proyecto fue elegir el stack tecnológico correcto. Al ser un desarrollador independiente en este proyecto, necesitaba tecnologías que fueran potentes, pero también familiares. Después de investigar distintas opciones, opté por:
Python por su versatilidad y su amplio ecosistema de bibliotecas.
MySQL por su robustez y capacidad para manejar datos relacionales.
CustomTkinter para construir una interfaz gráfica moderna y amigable para el usuario.
Este stack me permitió desarrollar la solución de manera eficiente, cumpliendo con los requerimientos del cliente y asegurando una buena experiencia de usuario. Además, utilicé máquinas virtuales para distribuir la aplicación en distintos sistemas operativos, asegurando la compatibilidad multiplataforma.
2. Uso de IA para Estructurar y Desarrollar el Proyecto
Durante el desarrollo, utilicé herramientas de IA como ChatGPT y Claude para acelerar el proceso. Estas herramientas me ayudaron a:
Diseñar la estructura principal del proyecto.
Resolver problemas específicos de implementación.
Seguir buenas prácticas de desarrollo.
Redactar documentación y preparar los entregables.
Gracias al soporte de estas IA, pude dedicar más tiempo a la solución de problemas y al desarrollo de funciones clave, manteniendo un flujo de trabajo constante y eficiente.
3. Construcción de una Base de Datos Relacional desde Cero
Uno de los componentes esenciales del proyecto fue la base de datos. Diseñé y construí una base de datos relacional con MySQL, creando tablas para:
Alumnos
Cursos
Pagos
El diseño se enfocó en la escalabilidad y el rendimiento, aplicando principios de normalización y asegurando un correcto manejo de índices para optimizar las consultas. Este trabajo me permitió afianzar mis conocimientos en bases de datos relacionales y SQL.
4. Buenas Prácticas en el Desarrollo de Software
Al ser un proyecto real, me aseguré de seguir buenas prácticas de desarrollo para que el producto fuera mantenible a largo plazo. Algunas de estas prácticas incluyeron:
Modularización: Estructuré la aplicación como un paquete de Python, dividiendo el código en módulos reutilizables.
Organización del Código: Separé el proyecto en carpetas según las responsabilidades (interfaz gráfica, base de datos, utilidades).
Documentación: Documenté el proceso completo, incluyendo comentarios en el código e instrucciones detalladas para el cliente.
Reutilización de Código: Evité la duplicación de código, desarrollando funciones reutilizables para mantener el proyecto limpio y legible.
5. Desarrollo Iterativo y Feedback del Cliente
Una de las claves del éxito de este proyecto fue mantener una comunicación constante con el cliente. Implementé un enfoque de desarrollo iterativo, presentando prototipos y versiones preliminares al cliente. Este proceso permitió:
Recibir retroalimentación valiosa.
Hacer ajustes rápidos según los comentarios del cliente.
Asegurar que el producto final cumpliera con las expectativas.
La retroalimentación continua no solo mejoró la calidad del producto, sino que también ayudó a afinar detalles importantes que inicialmente no se habían considerado.
6. Investigación para Desplegar el Servidor SQL en la Web
Otro de los grandes desafíos fue la investigación y despliegue de la base de datos en la nube. Inicialmente, utilicé una prueba gratuita de Google Cloud Platform (GCP), lo que me permitió familiarizarme con el despliegue en la nube y la administración de bases de datos remotas. Sin embargo, para el entorno de producción, me decidí por DonWeb, un proveedor local de hosting.
El proceso de despliegue incluyó:
Configurar una máquina virtual Linux en DonWeb.
Instalar y asegurar el servidor MySQL en esa máquina.
Aprender sobre administración de sistemas Linux, incluyendo el uso de la terminal, configuración de firewalls y manejo de servicios remotos.
Este paso fue especialmente gratificante, ya que me permitió aprender nuevas habilidades relacionadas con el despliegue de aplicaciones en entornos de producción.
Reflexiones Finales: El Valor de los Proyectos Reales
Este proyecto fue mucho más que un trabajo freelance. Representó una oportunidad para aplicar mis conocimientos, enfrentar desafíos del mundo real y aprender nuevas tecnologías y buenas prácticas. Creo firmemente que trabajar en proyectos reales es una de las mejores formas de crecer profesionalmente, ya que te obliga a encontrar soluciones creativas y enfrentarte a situaciones que no aparecen en los libros o tutoriales.
Mis principales aprendizajes de este proyecto fueron:
La importancia de una buena investigación inicial antes de elegir el stack tecnológico.
El valor del feedback del cliente durante el proceso de desarrollo.
La necesidad de estar dispuesto a aprender constantemente, ya sea sobre nuevas tecnologías o sistemas operativos.
¿Qué sigue?
Estoy entusiasmado por seguir trabajando en proyectos similares, aplicando lo que he aprendido y asumiendo nuevos retos. Si tienes un proyecto interesante y estás buscando un desarrollador que pueda llevar tus ideas a la realidad, ¡no dudes en contactarme!