¿Estoy en lo cierto al pensar que la función principal debería ser la función más grande de modo que contenga todas las llamadas a funciones que le permitan al lector leer mi código como si fuera una historia al encapsular los detalles en las funciones?

En general, cuanto más grande es el programa, más pequeño es el main ().

Para los ejercicios, a veces main () es todo lo que necesita. Una vez que comienzas a dividir las cosas, las grandes funciones se convierten en encarnaciones de la complejidad del mal. Por lo general, hay algunos patrones primarios más grandes en juego, como subprocesos, máquinas de estado, bucles de eventos, reactores, etc., y para leer el programa de otra persona, debe comprender qué enfoque de organización se está utilizando.

Ciertamente, no es raro que un main sea algo como:

int main (int argc, char ** argv)
{
my_context * context;
int rv;

contexto = initialize_my_context (argc, argv);
run_my_context (contexto);
rv = terminate_my_context (contexto);

volver rv;
}

donde tienes muy poca idea de lo que está pasando en “run_my_context” sin mirar el código.