El núcleo de la pregunta es por qué los programadores autodidactas generalmente no están expuestos a ciertos conceptos y qué es diferente sobre el enfoque que adopta un plan de estudios formal de CS.
Entonces, considerando que fui autodidacta desde el quinto grado hasta que ingresé a la universidad, trataré de responder la pregunta en términos de lo que consideraría la diferencia de lo que aprendí y sentí que me hizo un mejor programador, en lugar de decir si Acababa de seguir siendo un programador autodidacta.
Las clases que consideraría inversiones de por vida son las siguientes:
- Diseño del compilador
- Arquitectura de Computadores
- Sistemas operativos
- Algoritmos y complejidad computacional.
En menor medida, la Teoría de la Computación y las Redes de Computadoras también son muy importantes (la primera tiene muchas partes que quizás nunca uses, hay algunos aspectos muy prácticos, como por qué ciertos tipos de máquinas de estado tienen limitaciones, a cómo dirías estructura un analizador sintáctico para que las cadenas sean lo más eficientes posible).
- ¿Cómo podría revivir un medio de investigación fértil como el que solía florecer en las comunidades de investigación soviéticas (por ejemplo, Mech-mat en la Universidad Estatal de Moscú en los años 70)?
- ¿Qué habilidades tienen el mejor retorno de la inversión en términos de esfuerzo, tiempo y dinero que tiene que gastar para dominarlo?
- ¿Qué es una escuela ficticia?
- ¿Qué escuela de la Ivy League ofrece el mejor programa de historia del arte de pregrado?
- ¿Cuál es tu mejor y más memorable incidente en tu vida escolar?
Entonces, ¿cómo se desarrolla realmente esta comprensión?
Mis recomendaciones son las siguientes
1. Compilador y arquitectura informática
La construcción de un compilador reúne muchas ideas diferentes de la informática teórica y la arquitectura informática de una manera muy práctica. En segundo lugar, actuará como una función forzada para que estés expuesto a la programación en lenguaje ensamblador de una manera que se sienta significativa.
Obtenga una copia de “The Dragon Book” y “Hennessey and Patterson” como se muestra a continuación:
http://www.amazon.com/Compilers-…
http://www.amazon.com/Computer-A…
Lee ambos libros.
Cree su propio compilador para un lenguaje real que emita un código de ensamblaje real que enlace y construya un binario a partir de él. No tiene que ser perfecto, puede ser un subconjunto del idioma, la parte importante aquí es que tienes suficiente exposición para poder compilar de manera aproximada pero razonablemente precisa el código que escribas en el idioma en el que se encuentre tu programa a nivel de la máquina.
Si te quedas atascado y necesitas ayuda en el camino, gcc -s
es tu amigo.
Una vez que haya construido su compilador, lea el libro de arquitectura de la computadora nuevamente, y una vez que lea más sobre arquitectura, piense en cómo esa comprensión podría mejorar su compilador.
En mi opinión, escribir tu propio compilador es la inversión de tiempo más apalancada que harás en toda tu carrera como programador si eres autodidacta, así que continúa.
2. Aprenda a abordar algoritmos a un nivel más abstracto.
Parte de esto es fácil de entender, como incluso en la escuela secundaria, mi libro de texto tenía una explicación de por qué la clasificación de burbujas era [matemática] O (n ^ 2) [/ matemática], frente a cómo Quicksort era [matemática] O (n log (n)) [/ math], y fue bastante intuitivo.
Sin embargo, los algoritmos más refinados no son tan intuitivos si eres autodidacta, como por ejemplo cómo equilibrar árboles, o cómo puedes realizar varias operaciones algorítmicas sin recurrencia o cómo ciertas estructuras de datos parecen tener lo que parecen tener propiedades esotéricas pero en realidad son bastante prácticas.
También hay ejemplos de cosas que quizás nunca uses, pero el hecho de que las hayas aprendido te dará una idea y desarrollará tus capacidades de pensamiento. No he usado un árbol de separación en nada de lo que había hecho en la vida real, aunque en el esquema más amplio de cosas estoy agradecido con mi profesor por usarlo como un análisis amortizado (que ha sido aplicable a algunas cosas que he hecho )
Obtenga una copia de CLR, implemente algunas de las estructuras de datos más interesantes.
Desarrollar y comprender el análisis asintótico.
Si bien un profesor teórico de CS puede fruncir el ceño al hacerlo, aunque en ausencia de más tareas y asignaciones, cronometrar su programa con diferentes entradas lo ayudará a construir esta intuición.
http://www.amazon.com/Introducti…
3. Sistemas operativos
Cree cosas que le permitan comprender el equivalente de lo que sucede en los núcleos.
Por ejemplo, compilación intente construir una biblioteca que le permita acceder a un archivo plano como un sistema de archivos.
Lea el código del kernel para sistemas de archivos y pilas de redes.
4. Ponlo todo junto
Los buenos graduados de CS no son magos con varitas, sino personas que tienen una base sólida y han desarrollado esa mentalidad analítica donde pueden diseccionar y aprender cualquier cosa nueva que vean.
Si alguna vez ve una pieza de software que le interese, hágase la pregunta “¿Qué está pasando a nivel de máquina para este software?” y también pregúntese “¿Qué está sucediendo en el nivel algorítmico más abstracto?”.
Si llega al punto en el que puede hacer ambas cosas como una segunda naturaleza, y moverse sin problemas entre los extremos de los niveles más abstractos a los niveles más bajos de la máquina como una dualidad, y puede aplicar esta filosofía a cualquier tipo de software en cualquier tipo de dominio que ves, felicitaciones, tienes la mayor parte del aprendizaje que te hubiera dado un título de CS.
Si no:
ir a 1;
(Con disculpas a Dijkstra).