Soy realmente bueno en todos los aspectos teóricos de CS, pero no soy bueno en programación. ¿Qué debo hacer?

Te encuentras con el problema que muy pocos (si los hay) cursos / libros / tutoriales realmente te enseñan: cómo convertir un “problema” / idea en un conjunto de acciones lo suficientemente detalladas como para que una computadora pueda “entender” qué hacer .

Le han dado muestras y formas estándar de solucionar problemas estándar. Entonces se espera que extrapoles esos a su problema / idea específica, combinándolos a su gusto. Pero ahí es donde los cursos (et al) generalmente se detienen … porque esa parte es la parte difícil de la programación.

El lenguaje es casi inmaterial en comparación con esto. Incluso las estructuras de datos y los algoritmos son meros ejemplos de cómo otros han resuelto estos problemas antes. Afortunadamente, se han resuelto tantos problemas que la mayoría se puede terminar a través de ajustes menores a algoritmos de ejemplo utilizando estructuras de datos prediseñadas. Pero también, desafortunadamente, hay tantos que es posible que no veas el algoritmo (madera) para las teorías (árboles).

Creo que el mejor curso de acción para la mayoría de los posibles programadores es tratar de comprender el problema perfectamente, es decir, asegurarse de saber qué entradas está tratando de convertir a qué resultados (eso es realmente cualquier programa). Luego, para comenzar a dividir ese problema en subproblemas (es decir, tratar de descubrir el “cómo” mediante la técnica de dividir y conquistar). Al principio, no se preocupe demasiado por cómo codificar, y mucho menos por lo que la computadora misma va a hacer. Solo piense en cómo le diría a otra persona (con habilidades similares a usted) los pasos para resolverlo. Luego, “atonta” a tu persona imaginaria y divide esos pasos en instrucciones aún más simples. Continúa por este camino hasta que veas algo familiar en uno de los algoritmos / estructuras de datos que has aprendido. Solo entonces comienza a codificar.

Pocos programadores comprenden este “proceso de diseño” desde el principio, y la mayoría solo se acostumbra después de una práctica seria (a veces incluso años antes de que puedan “idear” un gran programa por sí mismos). Descubrirá que cuanto más lo haga, más fácil será. Es más como aprender a surfear que aprender historia, al principio parece completamente imposible. Pero cuanto más intentas y fracasas, menos fallas, hasta que tienes éxito. Y cuanto más lo sigas, más trucos complejos podrás hacer en mares cada vez más agitados.

Solo he visto otro curso que lo hace de manera completamente opuesta. Busque algo llamado “De NAND a Tetris”. Te muestra de manera efectiva los detalles detrás (incluso) del hardware para que entiendas “por qué” una computadora es tan estúpida. Tenga en cuenta que también sigue hasta el último ejemplo de cómo construir un juego de tetris, solo que comienza por “construir” primero la computadora. Puede ser una buena manera de aprender para algunos, pero según mi experiencia, la mayoría se beneficiaría más de un proceso de diseño de arriba hacia abajo.

Esta es una pregunta tan buena que no se puede discutir de manera significativa sin descender al atolladero de la ciencia cognitiva. No entender la respuesta fue la razón del fracaso de AI Mark II: sistemas expertos. “Hacer lo que hago, no lo que digo” es una representación de representación precisa de los académicos del acantilado que se cayó en aquel entonces.

Creo que su problema es un ejemplo del abismo entre “aprendizaje de libros” y “memoria muscular”, “saber qué” y “saber cómo”, la “memoria de producción” y la “memoria declarativa”, etc. Estas son descripciones útiles de una realidad dolorosa

Es una buena idea abrirse camino en una discusión sobre aprender a programar bien, porque lo que estoy a punto de decir parece un poco sucio y contra intuitivo. Para comenzar con lo que parece ser una afirmación de hecho que no se siente bien: un buen toque escribe más rápido que sea posible. Es decir, parece haber un camino directo entre los ojos y los dedos. No es necesario pensar (consciente). La mayoría de los modelos estándar de rendimiento humano caen aquí. Cuando comienzas a aprender una tarea, la realizas lentamente, pensando en cada paso. Después de un (largo) tiempo, cuando se encuentra con una matriz, escribe una estructura de bucle incrustada, un bucle adicional para cada dimensión adicional, sin pensar. (También pasa al modo “sangrar esta estructura con precisión es crítico”, también sin pensar).

Al igual que los mecanógrafos, lo que hacen los buenos guitarristas y pianistas es igualmente imposible. Una vez que empiezas a pensar en lo que debes hacer a continuación, tu capacidad para hacerlo realmente se desploma. Necesitas entrar en el ritmo y quedarte allí. Esto requiere mucha práctica obsesiva, para mantener su cerebro consciente fuera del oído, ojo y asa del dedo. Tienes que practicar tanto que no tienes que pensar en lo que sucederá después. Los músicos tienen buenos términos aquí: tener chuletas es la capacidad de mantener todos sus talentos estilísticos, interpretativos y musicales en juego sin pensar. Una de las palabras más insultantes que los músicos pueden usar para describir la actuación de otro es decir que solo estaban bromeando .

Chuletas ahora se usa ampliamente, con diferentes grados de comprensión. Noodling , desafortunadamente, no lo es.

Entonces, ¿cómo obtienes tus habilidades de programación? Bueno, usted programa montones y montones. Y mucho Tienes que practicar y practicar. En las buenas escuelas de música, habitas en salas de práctica, salas pequeñas con salas acolchadas (insonorizadas). Te obligas a practicar muchas horas al día. Los músicos profesionales continúan practicando de manera obstinada, para que no pierdan sus habilidades.

En la academia de informática, esta situación suele ser imposible: asignamos tareas pequeñas de programación de sandbox y, a menudo, hacemos que los estudiantes trabajen en grupos, con solo una o dos programaciones. (Esta es una elección de conciencia por parte de los maestros, porque las habilidades de trabajo en grupo son críticas para las carreras de los graduados). Los estudiantes que fueron niños clave, programadores antisociales, súper geeks o lo que sea en la escuela secundaria a menudo ya tienen sus habilidades. (A veces son 10 veces mejores que sus maestros de amortiguación. Esto es realmente sorprendente – y vergonzoso – cuando lo encuentras en un niño de 13 años.) En proyectos grupales, sus compañeros intentan aprovecharse de ellos, pero la explotación en realidad es al revés dirección. Los grandes programadores a veces no tienen habilidades sociales o administrativas, y preferirían hackear el código. Algunos de ellos se dan cuenta de esto conscientemente y hacen todo lo posible para evitar otros roles.

Pasos realistas para que te conviertas en un programador realmente bueno:

  1. Para un programa de 6 meses a un año, durante al menos 10 horas al día, en un idioma que ya “sabe”.
  2. Pase 6 meses haciendo nada más que aprender otros buenos lenguajes de programación. La meta-habilidad que estás aprendiendo aquí es una parte importante de tus habilidades de programación. (Puede comparar esta habilidad haciendo un seguimiento del creciente grado de odio que siente por HTML y todos sus desafortunados compinches. (Kludges son feos y desagradables).
  3. Haz lo anterior porque te encanta, no porque tengas que hacerlo. Fallar aquí significa que solo puedes ser (como yo) un programador adecuado.

Chico, ¡apuesto a que nunca esperabas esto!

(Hay muchos nombres para la dicotomía. Maxwell Gladwell’s Blink: The Power of Thinking without Thinking es una introducción indolora. Thinking, Fast and Slow de Daniel Kahneman es un poco menos indoloro y mucho más respetable académicamente).

Obtenga una computadora portátil / de escritorio e inicie la codificación.

Comience desde un programa básico simple (¡Hola mundo! También es genial para empezar)

¡Imagínense, si hubiéramos estudiado química / cualquier ciencia sin ningún experimento, qué aburrido sería!

Así que comience a codificar, cree sus repositorios en línea públicos o privados e implemente lo que ha aprendido en teoría. Descubrirá muchas trayectorias de programación una vez que tenga manos a la obra.

Una vez que pueda codificar todos los algoritmos básicos y las estructuras de datos (en general), elija un pequeño proyecto para hacer. Trabaja en ello todos los días y construye.

Es cuestión de tu arduo trabajo y tiempo, pronto serás un gran programador.

Todo lo mejor

¡Decir ah!

Me recuerdas el día que puse un pie en este hermoso país (EE. UU.).

Desde una perspectiva académica, sabía el idioma inglés de arriba a abajo, pero mantener una conversación en la vida real fue extremadamente desafiante.

Había escrito tres párrafos de otras cosas relevantes en esta respuesta, pero luego algo me golpeó. ¿Qué tan bueno es tu comprensión de la POO? (Programación orientada a objetos)

Creo que esta puede ser la fuente de tus luchas. Los algoritmos y las estructuras de datos solo pueden llevarte tan lejos. Si desea escribir un programa, debe aprender a modelar cosas de la vida real en código y orquestar sus interacciones en consecuencia.

Por supuesto, hay otras metodologías de programación (por ejemplo, de procedimiento), pero supongo que está buscando el mundo de los objetos.

¿Estoy en algo? 🙂

Una vez asistí a una charla en la que el orador, un profesor, dio su opinión de que la informática era sobre computación y no estaba fundamentalmente vinculada a la existencia de computadoras tal como las conocemos. No estoy totalmente de acuerdo, pero él hizo un argumento convincente. Hay mucho espacio en CS para los teóricos que no son programadores estelares. Es posible que no sea el mejor ingeniero de software, pero aún puede resolver problemas importantes en un nivel abstracto y dejar el meollo de la codificación para aquellos con la habilidad. CS es en última instancia un esfuerzo de equipo, después de todo.

Estás en una posición increíble. Usted tiene un manejo de la CS teórica, algo que pocas personas pueden afirmar sinceramente, y ha identificado una de sus principales debilidades.

Sugiero seguir una clase de algoritmos con asignaciones de codificación reales. Algo en Python: fácil para principiantes.

Pruebe el curso de Eric Demaine [1] en OpenCourseWare del MIT.

¡Probablemente pasarás por la teoría y te divertirás muchísimo implementando tus algoritmos favoritos desde cero!

Notas al pie

[1] Introducción a los algoritmos

Eres bueno en todos los aspectos teóricos de CS. Esa es una buena ventaja que tienes. Ahora ve al segundo paso. Tienes que aprender programación. Para eso estoy dando mi enlace de respuesta anterior:

¿Qué lenguajes de programación debería aprender para programar con experiencia?

Al; l la mejor y feliz programación

Creo que no tienes una comprensión básica de los conceptos de programación. Debes tomarlos primero y luego pasar a la codificación real.

Aquí hay un artículo para principiantes que lee esto, te ayudará:

Quiere aprender programación de codificación. ¿Dónde empiezo? – TopNewsage

Si está dispuesto y le gusta programar, puede aprenderlo en cuestión de días.
Básicamente un programa contiene
1) entrada
2) procesamiento de datos de entrada
3) Out out o resultado
El programa de aprendizaje es mucho más simple.

Al comenzar a programar, los primeros pasos siempre buscan ayuda en línea / en libros. Le recomiendo que tome un curso / vea una serie de videos en línea que le enseñe la parte de programación de su idioma elegido. ¡Es un método muy eficiente y predigo que no pasará mucho tiempo antes de que comprenda los conceptos básicos por completo!