#1 Bueno, lo de los exámenes lo dices tú. Como decía un profesor mío... hay estudiantes que van al 5 raspado, y tendrán el título en la pared también, pero luego no habrán aprendido como otros. Esos pues se conformarán con trabajar en las típicas consultoras de mala muerte.
( Echa un ojo a este hilo para más información sobre las consultoras esas: http://www.mediavida.com/foro/dev/oferta-empleo-desarrollador-web-jr-554719 )
Cuando yo estaba en la carrera, no hace tanto, empecé así. Me acuerdo que me conformaba con aprobar las asignaturas, que en un ingeniería tampoco es fácil. La cuestión es que así... no me llenaba. Luego pasaba un tiempo y muchas cosas ya ni las recordaba, por el hecho de a por el 5 pelado y no esforzarme más. Una asignatura que siempre recordaré que fui a sacarla del paso, por una cosa u otra, es "Compiladores" y ahora me tendría que sacar los apuntes y darle un profundo repaso si quisiera ponerme con ese tema, no me bastaría con mirar un poco en 2-3 páginas y ya.
El tema es que luego pensé... coño, yo lo que quiero es aprender e ir con ilusión y ya vendrán los aprobados. Así que me marqué como meta el ir estudiando día a día, todas las tardes en la biblioteca, y una cosa llevaría a la otra. Se me quedó bastante buena nota media de la carrera y eso fue fruto de lo que te digo. Y notaba que aprendía.
Bueno, todo esto lo digo porque me ha chocado la frase de echar siempre la culpa al sistema. Pues sí, a veces el sistema es mierda, pero también la gente va a lo mínimo.
Ahora estoy en una empresa y, mis compañeros, lo primero que me dijeron, medio en serio medio cachondeo, es que la página "stackoverflow" sería mi mejor amiga. Yo entiendo que las cosas hay que saberlas globalmente y no hace falta entrar en detalles ni saber como se implementa algo muy en concreto porque está ahí... pero sí tener una idea general. Por ejemplo, no hace falta saber de memoria como implementar el patrón de diseño "Singleton", por poner uno fácil, pero sí saber que tiene determinada estructura y que, cuando se crea ese objeto una vez ya no se puede volver a crear... y así puedes hacer dos cosas: Mirar un ejemplo en internet ya bien depurado y teniendo en cuenta todas las opciones (para que sea más eficiente) o hacerlo tú por tu cuenta. Yo soy partidario de la primera opción, siempre que tu entiendas como funciona... y no todo sea corta y pega.
Pues eso... si tu llegas a un sitio y tienes que usar X patrón, siguiendo con el ejemplo, y no lo recuerdas pues no basta con mirar el código y decir "ah vale, ya está, una clase Singleton". Creo que es necesario coger, por ejemplo, un programa que haga UML y hacerte tu pequeño esquema de su funcionamiento.
En definitiva, si llevas cosas que tengas flojas, pues, en tus ratos que tengas ganas haz cosas sobre eso. Por ejemplo, si los compiladores los tienes muy olvidados pues hazte un pequeño compilador y así vas haciendo y repasando la teoría y práctica. Y ya, pues eso, lo subes a tu Github y vas creando tu perfil.
Pero sobre los libros que preguntas... primero deberías saber en qué vas a trabajar o en qué quieres trabajar. Es decir, si tu objetivo es meterte a una empresa a desarrollar Android pues ¿para qué quieres ahora ponerte a refrescar compiladores o redes? Mejor tendrás que irte a Programación Orientada a Objetos, Java, Patrones de diseño, librerías que se usen para desarrollo de Android como Retrofit, por decir una, etc.
Eso sí, si ya te gusta leer bibliografía porque te gusta, por amor al arte, me parece perfecto, como dices en #4. Entonces me parece bien.