¿Cómo sugeriría a aquellos de nosotros que nos estamos enseñando cómo programar aprender las habilidades que normalmente nos faltan?

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).

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).

Escribir código Cualquier cosa en la vida que desee mejorar requiere práctica.

Leer libros. Haga una lectura enfocada de un libro que cubra el idioma que ha elegido. Escriba tantos programas de muestra como pueda, asegúrese de que compilan y funcionan.

Lee el código de otras personas. Encuentre un proyecto de código abierto de buena reputación que implemente algo similar a lo que está tratando de implementar, lea el código y aprenda de él. Asegúrese de prestar atención a la licencia del código si planea copiarlo o modificarlo.

Pero no solo lea, haga. Escribe código, golpea paredes y encuentra formas de resolverlos. Nunca se recuperará sin sudar algunos proyectos propios. Mientras lo hace, encontrará cosas que no sabe. Luego vuelves a los libros, o al código fuente. Si no aprende temprano sobre cómo encontrar respuestas en los libros o en el código de otras personas, en mi opinión, se ha separado de un par de recursos valiosos.

Para ampliar lo que dijo Michael Habibi, el truco está en identificar las habilidades que te faltan y que vale la pena aprender. En realidad, aprender la habilidad es fácil y se deja como un ejercicio para el lector motivado.

Pero, ¿cómo sabes lo que no sabes?

Comience identificando buenos programadores. En blogs, en twitter y en quora. Luego vea cuáles son las cosas por las que se obsesionan. ¿Alguien sigue y sigue sobre sistemas de tipos, Scala y programación funcional y no tienes idea de lo que están hablando? Tal vez eso es algo para leer. ¿Hay una publicación de blog sobre algún problema técnico de CS que muchos “buenos programadores” retuitearon y no viste cuál era el problema? Pon esa área en tu lista de tareas.

Enjuague. Repetir.

Resista el aprendizaje de cosas nuevas por el simple hecho de aprender (porque entonces pasará todo su tiempo leyendo cosas y no tendrá suficiente tiempo para crear cosas), pero si “sigue” a los buenos programadores, pronto se verá empujado a aprender cosas.