De lo que estás hablando es de más ingeniería de software que programación. Es un poco de arquitectura, un poco de "mejores prácticas" y "patrones de diseño", un poco de trabajo con otros. Si bien hay libros que pueden ayudar, la mayor parte proviene de la experiencia. Nadie comienza a escribir, digamos, Microsoft Word.
Piense en un gran programa "real" que le gustaría escribir. Ahora piense en las diversas piezas que necesita construir para que funcione de la manera que desee. Por ejemplo, en un juego moderno en primera persona, necesitará un motor de gráficos en 3D, IA que no sea un personaje del jugador, un módulo de música / sonido, un motor de física y un módulo de nivel superior que haga cumplir las reglas del juego (sabe el "mapa", cómo interactúan los diversos personajes, etc.). Y luego está la obra de arte y el diseño de personajes y la música, ninguno de los cuales es código, pero son necesarios para que el juego se complete.
Ahora: ¿Cuál de estos construirás tú mismo y cuál obtendrás en otro lugar? La mayoría de los proyectos de software grandes no se programan desde cero. Tal vez utilizará un motor 3D y un módulo de música / sonido listos para usar y programará solo las cosas que hacen que su juego sea único. De acuerdo, debe averiguar qué módulos de terceros va a utilizar, lo que implicará factores como el costo, los idiomas con los que trabajan, las características que tienen, cómo está diseñado su API (es decir, qué tan completo está es decir, qué tan bien encaja con su estilo de programación personal, etc.). Tal vez escribirá "pruebas de concepto" o programas de prueba utilizando uno o dos candidatos para los diversos módulos de terceros para asegurarse de que harán todo lo que necesita y que sea fácil de usar.
Además, incluso el código que desea escribir puede ser un trabajo demasiado grande para que lo complete usted solo en el plazo que tiene en mente. ¿Cuántos otros programadores necesitas para trabajar en el proyecto? ¿Cómo va a dividir el trabajo? ¿Cómo se diseñarán los distintos módulos para que encajen todos aunque hayan sido escritos por diferentes personas? ¿Cómo van a trabajar todos en el mismo código fuente sin eliminar los cambios de los demás (respuesta: control de versiones, que es extremadamente útil cuando se trabaja solo, pero indispensable cuando se trabaja con otros).
Una vez que haya descubierto qué módulos desea escribir internamente, realizará el mismo proceso. Calcule las piezas de cada módulo, cómo deben encajar y cuáles escribirá usted mismo y cuáles obtendrá en otro lugar. Continúa desglosando las cosas hasta que cada pieza sea lo suficientemente pequeña como para que la tengas en mente, para que digas: "¡sí, podría escribir eso!" Y luego hazlo. Mientras lo hace, se encontrará con obstáculos imprevistos en la forma en que las diferentes partes de su programa encajan entre sí. Estos serán frustrantes, pero son oportunidades para que usted aprenda más sobre su oficio, y deben verse de esa manera.
Inicialmente, solo podrá mantener en su mente piezas muy pequeñas de su programa, por ejemplo, funciones individuales, por lo que tendrá que desglosar muchas cosas antes de comenzar a codificar. A medida que gane experiencia, pensará en funciones en lugar de tener que pensar en funciones y comenzar a pensar en objetos. Y luego pensarás en objetos y pensarás en módulos más grandes. Finalmente, estará pensando en módulos y pensando en programas completos, grandes y reales.
Y luego descubrirás que todavía tienes mucho que aprender ... pero así sigue. Si, como programador, alguna vez deja de aprender, está obsoleto y será reemplazado por un modelo más nuevo.
De todos modos, no tengas miedo y no te preocupes si esto suena ... horrible o imposible y realmente no quieres ser un programador después de todo. No es para todos. Me encanta la música y los postres, y puedo tocar un poco las teclas y cocinar algunos platos, pero no estoy dispuesto a dedicar el tiempo necesario para convertirme en un gran músico o un maestro de cocina.
Si resulta que no desea ser un programador que escribe aplicaciones de escritorio grandes y reales, existen otros tipos de trabajos de programación. Podría convertirse en un programador incorporado, por ejemplo. Hay desafíos definidos e interesantes involucrados en la escritura de programas integrados, y usted está haciendo un trabajo útil, pero generalmente los programas son bastante más pequeños que las aplicaciones de escritorio. O podrías escribir aplicaciones web. En la Web, es fácil unir pequeños trozos de funcionalidad, por lo que podría escribir (por ejemplo) un sistema de comentarios en la Web y sería útil incluso si no se trata de una aplicación web completa. También es fácil mejorar gradualmente las cosas en la Web, por lo que puede comenzar con (por ejemplo) un cliente de correo web básico y, con el tiempo, evolucionar a algo como Gmail. (Pero no hagas eso, porque entonces estarás compitiendo con Gmail).
Si no quiere ser un programador, pero aún quiere trabajar con computadoras, posiblemente podría ingresar a TI u otro campo técnico. En estos casos, conocer tanta programación como ya lo hace es muy útil, porque sus pares pueden no tener tanto. O, ya sabes, conviértete en músico si eso te atrae, porque (como la mayoría de los campos) involucra computadoras hoy en día. Escriba pequeños programas que manipulen archivos de audio o MIDI de varias maneras inteligentes, lo que lo convierte en un mejor músico. Descubrirá que cualquier habilidad de programación que tenga se puede aplicar en muchos campos para mejorar su trabajo.