¿Cuáles son los mejores recursos (sitios, libros o tutoriales) para aprender a programar?

He pasado entre 6 y 8 horas / día enseñándome a mí mismo para programar durante el último mes y básicamente he buscado en Internet todos los tutoriales gratuitos o semi-gratuitos que existen.

Aquí están las cosas buenas que he usado y recomendado:

  1. CodeHS: problemas de formato de video y luego programados personalmente, que comienzan con un lenguaje de juguete llamado Karel y avanzan a Javascript, y culminan en hacer que el juego se rompa en su navegador. Fundado por dos ex-CS106a TAs en Stanford de los cuales el plan de estudios se adaptó en gran medida. Tienen probablemente 40 horas de contenido realmente bueno y, lo que es más importante, le brindan ayuda amistosa e individual con aproximadamente 3 horas de respuesta cuando la necesita. Mira mi versión de Breakout que hice después de hacer todo el contenido: EpicBreakout. (1)
  2. Python Class de Google: a diferencia de lo anterior, requiere cierta configuración en su máquina (es decir, no está codificando en el navegador), pero sigue siendo bueno. Alrededor de dos días de conferencias sobre Python con un puñado de buenos problemas, que culminan en expresiones regulares (como un CRTL + F personalizado en un documento de Word) y un problema en el que descifras una imagen codificada de un sitio web.
  3. CodingBat: problemas de Python y Java. Sin lujos, solo los ejercicios, probablemente mejor para alguien con un poco de experiencia (lo que significa que sabes qué es una función / parámetro y puedes usar Google para descubrir / encontrar la sintaxis / funciones que necesitas). El sitio fue creado por el mismo tipo que enseñó la clase Google Python.
  4. Khan Academy: algunos tutoriales de introducción (en su mayoría centrados en gráficos / animación) en JS utilizando una biblioteca bien considerada (Processing.js) y luego un espacio de proyecto abierto para que vea los programas que otras personas han hecho (es decir, el resultado final y el código) y hacer el suyo propio, potencialmente despojando de su trabajo. Aquí hay un juego que hizo un tipo que sirvió de inspiración para mi versión de Breakout: Mercury Subspace. Bastante bien, ¿verdad?
  5. Codecademy: formato sólido de código de lectura y escritura de pequeños problemas divididos en diferentes subpiezas. Utilicé sus tutoriales HTML / CSS para obtener un fondo básico antes de hacer mi sitio web personal (http://www.thenickhuber.com/) y voy a usar sus cosas en JS y jQuery más avanzados cuando llegue a él. Aún así, su calificador está un poco defectuoso y hay una gran variación en la calidad del curso / superposición en el material, ya que todo está escrito por diferentes personas.
  6. Aprenda Python The Hard Way – Ejercicios de lectura y luego implementación, comenzando sin ningún conocimiento asumido. Bueno, pero aún no tan bueno como los problemas interactivos; Me di por vencido después de hacer ~ 20% más o menos porque es repetitivo sin disculpas, pero he leído muchas buenas críticas al respecto.

Otras cosas buenas que quiero ver:

  1. Curso de Stanford para iPhone (todas las diapositivas y tareas: http://www.stanford.edu/class/cs…): una aplicación para iPhone parece un proyecto temprano tan bueno, porque es muy fácil mostrar a tus amigos lo que has hecho, pero tengo que averiguar cuán completable sería para mí. Además, no puede clasificar sus conjuntos de problemas si solo está trabajando por su cuenta a partir del material en línea.
  2. K&R (http://www.amazon.com/Programmin…) – Libro de introducción de gran prestigio sobre C e implementaciones de los algoritmos más canónicos. (Si conoce un sitio web que intenta hacer algo como esto, me encantaría obtenerlo de usted).
  3. Los numerosos cursos de CS en Coursera y Udacity. Sin embargo, creo que es muy importante que tengas a alguien calificando tu trabajo para que puedas obtener comentarios (y que realmente resuelvas los problemas en lugar de solo mirar las conferencias). No estoy seguro de si esto es posible si tomas el curso “fuera de ciclo” y qué tan buenos son los problemas, pero aún así vale la pena echarle un vistazo.

Después de un mes, ahora tengo una mejor idea de lo que puedo hacer y esto informa cosas que creo que sería genial hacer. En este punto, estoy muy emocionado de continuar con este enfoque de aprendizaje basado en proyectos, ya que creo que es más efectivo / duradero / divertido que más tutoriales / clases, pero aún es difícil lograrlo fuera del entorno universitario / laboral.

  1. Nota: es imposible de ganar en este momento: necesito refactorizarlo y expandirlo, incluyendo un montón más de potenciadores y el enfrentamiento final con el jefe final de nuestro héroe, The Brick King. FYI, mi puntaje más alto es como 550 y el juego se vuelve defectuoso a niveles altos. Cambiar a viñetas ayuda y en realidad agrega algunas dificultades inesperadas. Me encantaría recibir sus comentarios / ideas.

¡Tener cuidado! “¿Cómo puedo aprender Python?” es una pregunta muy diferente de “¿Cómo puedo aprender a usar computadoras para resolver problemas?” El idioma no importa: si estudias a partir de la última pregunta, aprenderás cualquier idioma en poco tiempo.

Analogía y manifiesto.

Digamos que te dije que quiero aprender a cocinar. Probablemente recomendaría algún libro de recetas que le guste. Lo que sería genial si solo quisiera preparar la cena para mi familia: podría repetir los pasos de esas recetas y disfrutar de los resultados. Pero esa sería una respuesta terrible si tengo mayores aspiraciones. Si realmente quiero impresionar a mis amigos, hacer algo nuevo o único, ser un “cocinero de improvisación”, necesito entender lo que está sucediendo en la mente de esos autores de recetas. Necesito entender la teoría, no solo la práctica.

El problema, por supuesto, es que si me siento a leer un libro de texto enorme sobre la teoría de la cocina todo el día, sería un chef terrible, tanto porque no tendría práctica real como porque seguramente me rendiría. dentro de unos dias!

Para aprender de esta manera, abogo por combinar la teoría con la práctica. Auto-plagio [1]: “deriva la motivación y la intuición de la exploración de arriba hacia abajo mientras consolida la comprensión y ese acceso universal crucial con una subida de abajo hacia arriba”.

Una historia de advertencia

Ahora de vuelta a la programación. Comencé mi camino hacia la informática nerdery en la escuela primaria con uno de esos ubicuos libros de Learn C ++ en 21 días. ¡Lo terminé y pude hacer que la computadora haga cosas! Algunas cosas. Pequeña
cosas. Cuando mi software se rompió, no entendí por qué. Cuando el problema se hizo demasiado grande, no pude expresarlo. Las bibliotecas con las que trabajaba parecían mágicas, y cuando necesitaba algo más allá de lo que podían hacer, no tenía poder. Podría expresar instrucciones en C ++, claro, pero no entendía qué instrucciones expresar .

Pero aquí está la parte aterradora de mi historia, por qué quiero advertirte sobre esto: esa sensación nebulosa de impotencia continuó durante casi una década , a pesar de que pasé horas todos los días escribiendo código. No mejoró. No osmí una comprensión real. Tuve que retroceder, subir, invocar la humildad para admitir que no tenía idea de lo que estaba sucediendo, y luchar por las partes más fundamentales de un campo que pretendía haber aprendido. Eso fue doloroso y derrochador. No lo hagas

Si desea usar computadoras para resolver problemas, lo más difícil que necesita aprender no es la parte de “computadora”: es resolver problemas. La naturaleza de las soluciones de problemas generales, eficientes, correctas y hermosas está más cerca de las matemáticas y la física que de la ingeniería eléctrica. Una vez que haya creado una solución real, hacer que la computadora lo haga no será el problema. Los desafíos en mi trabajo provienen del pensamiento y de mi pizarra, no de la escritura y mi computadora.

Ok, finalmente, algunos consejos amigables

El problema con toda esta torre de marfil es que predigo que perderás totalmente tu motivación si intentas hacer todas las cosas grandiosas de la teoría desde el principio. Vi que eso le sucedía a muchos estudiantes de CS 1 en Caltech.

Entonces, esto es lo que propongo: claro, usa Codecademy y aprende a hacer aplicaciones iOS. Haz un pequeño ciclo de retroalimentación por ti mismo. Construya juguetes divertidos para motivarse a sí mismo a comprender, de modo que pueda construir mejores juguetes.

En este momento, la mejor introducción que he visto a esta teoría es Estructura e interpretación de programas informáticos, que está disponible de forma gratuita en línea. Tiene “computadora” en el título, pero en realidad se trata más de resolver problemas. Bonificación: la prosa es cuidadosa y concisa.

El idioma que enseña no es importante. Eso es a propósito. Está diseñado para que pueda aprenderlo instantáneamente y centrarse en la resolución de problemas, no en la sintaxis.

Cuando termines de leer ese libro, sabrás qué buscar a continuación.

Una posdata para el arte

He hablado sobre la tensión entre comprensión y utilitarismo, pero hay una tercera fuerza en juego aquí: la belleza.

Cuando entiendo algo nuevo sobre la estructura de los problemas, siento que veo estrellas. El mundo florece a mi alrededor. Nuevas posibilidades en todas partes. ¡Es tan hermoso!

Hay un lado artístico en todas estas cosas, al igual que las matemáticas. Cuando estaba en la escuela secundaria, mi introducción a ese aspecto de este mundo fue la Guía del por qué (conmovedora) de Ruby, que está a medio camino de Ruby. Si ya aprendió Python o JavaScript, puede pasar al capítulo 5 o 6.

[1]: de arriba a abajo; abajo hacia arriba