¿Los libros como ‘Aprenda C++ en 21 días’ o ‘Aprenda Java en 20 días’ no son útiles para los desarrolladores de software, y las situaciones prácticas son suficientes para aprender todo lo que un desarrollador de software necesita?

Tienes razón: es imposible aprender un lenguaje informático (desde cero) en tres semanas. Incluso si te propones hacerlo, los libros que has mencionado son, irónicamente, las peores maneras de hacer tal intento.

Si ya tienes algo de experiencia, podrías dominar un nuevo lenguaje en tres horas, simplemente mirando algunos ejemplos de código y documentación. Los lenguajes de programación son bastante similares (siempre que compartan el mismo paradigma) y una vez que hayas aprendido unos cuantos, aprender un nuevo lenguaje es algo que podrías hacer perfectamente en el trabajo.

¿Son suficientes las experiencias prácticas? Sí, pero querrá que esas experiencias estén aisladas del trabajo que está haciendo. Aprender sobre la marcha funciona muy bien si ese es tu único objetivo, pero también requiere mucho más tiempo y esfuerzo. Por ejemplo, la primera vez que trabajas en un proyecto de desarrollo de software a gran escala, puede que no te des cuenta de la importancia de las pruebas automatizadas, y añadirlas más tarde sin duda te llevará más tiempo y esfuerzo. Un desarrollador de software con experiencia, sin embargo, lo incorporaría a un nuevo proyecto desde el principio.

¿Mi consejo? Siempre que aprendas o pruebes algo nuevo -ya sea un lenguaje, un framework o una librería- crea un proyecto medianamente grande con él, y consigue "sentirlo". El desarrollo de software es tanto un arte como una ciencia, pero poca gente le dirá esto. El conocimiento te convertirá en un buen desarrollador de software, pero sólo la experiencia te convertirá en un gran desarrollador.