O grande projeto no qual estou trabalhando há alguns anos é uma aplicação de controle (e tudo) de um dispositivo avançado, o coração de seu firmware.
O dispositivo é bastante avançado, com mais funcionalidades diferentes do que eu poderia dizer da memória, e 98% delas são tratadas por esse grande executável. Por um lado, o programa é de fácil manutenção, bem modularizado por dentro, devidamente documentado, há uma separação razoável de funcionalidades por diretórios e arquivos e assim por diante.
Mas, no final, tudo fica agrupado em um aplicativo que faz de tudo, desde comunicação remota ao banco de dados, manipulação da tela sensível ao toque, manipulação de uma dúzia de vários protocolos de comunicação, medições, vários algoritmos de controle, captura de vídeo, hora do nascer do sol e data da páscoa (sério, e são necessário para propósitos muito sérios!) ... Em geral, coisas que são muito pouco relacionadas, geralmente relacionadas apenas através de alguns dados que gotejam entre alguns módulos distantes.
Isso pode ser feito como vários executáveis separados que se comunicam, por exemplo, por soquetes, com finalidade mais específica, talvez carregados / descarregados conforme necessário, e assim por diante. Nenhuma razão específica para que seja feito dessa maneira.
Por um lado, funciona e funciona bem. O projeto é mais simples, sem manter a construção de vários binários. A estrutura interna também é mais fácil, quando você pode simplesmente chamar um método ou ler uma variável em vez de falar sobre soquetes ou memória compartilhada.
Mas por outro lado, o tamanho, a escala dessa coisa me assusta, parece pilotar o Titanic. Eu sempre fui ensinado a modularizar, e agrupar tudo em um arquivo gigantesco parece errado. Um problema que conheço é uma falha pesada de um módulo (mesmo insignificante) que trava tudo - mas a qualidade do código garante que isso realmente não ocorra nas versões de lançamento. Caso contrário, a separação interna e a programação defensiva garantem que isso ainda funcione corretamente, mesmo que metade dos módulos internos falhe normalmente por algum motivo.
Que outros perigos eu negligenciei? Por que isso me assusta? Isso é apenas medo irracional do desconhecido? Fazer grandes projetos sérios dessa maneira é uma prática aceita? Acalme meus medos ou me dê um bom motivo para refatorar a versão 2.0 em vários binários menores.