El gran proyecto en el que estoy trabajando durante un par de años ahora es una aplicación de control (y todo) de un dispositivo avanzado, corazón de su firmware.
El dispositivo es bastante avanzado, con más funcionalidades diferentes de las que podría decir de la memoria, y el 98% de ellas son manejadas por este enorme ejecutable. Por un lado, el programa es bastante fácil de mantener, bien modularizado en su interior, debidamente documentado, hay una separación razonable de funcionalidades por directorios y archivos, etc.
Pero al final, todo se agrupa en una aplicación que hace todo, desde la comunicación remota de la base de datos, el manejo de la pantalla táctil, el manejo de una docena de protocolos de comunicación diferentes, mediciones, varios algoritmos de control, captura de video, hora del amanecer y fecha de Pascua (en serio, y son ¡Necesario para propósitos muy serios!) ... En general, cosas que están muy poco relacionadas, a menudo solo relacionadas a través de algunos datos que se filtran entre algunos módulos lejanos.
Podría hacerse como varios ejecutables separados que se comunican entre sí, por ejemplo, a través de sockets, con un propósito más específico, tal vez cargados / descargados según sea necesario, y así sucesivamente. No hay una razón específica por la que se hace de esta manera.
Por un lado, funciona, y funciona bien. El proyecto es más simple, sin mantener la construcción de múltiples binarios. La estructura interna también es más fácil, cuando puedes llamar a un método o leer una variable en lugar de hablar por sockets o memoria compartida.
Pero por otro lado, el tamaño, la escala de esta cosa simplemente me asusta, se siente como pilotar Titanic. Siempre me enseñaron a modularizar, y agrupar todo en un archivo gigantesco se siente mal. Un problema que conozco es que una falla importante de un módulo (incluso insignificante) bloquea todos, pero la calidad del código asegura que esto realmente no ocurra en las versiones de lanzamiento. De lo contrario, la separación interna y la programación defensiva aseguran que esto seguirá funcionando correctamente, incluso si la mitad de los módulos internos falla normalmente por alguna razón.
¿Qué otros peligros pasé por alto? ¿Por qué esto me asusta? ¿Es esto solo miedo irracional a lo desconocido? ¿Hacer grandes proyectos serios de esta manera es una práctica aceptada? Calma mis miedos o dame una buena razón para refactorizar la versión 2.0 en múltiples binarios más pequeños.