¿Las mejores formas de enseñar a un principiante a programar? [cerrado]


324

Pregunta original

Actualmente estoy comprometido en enseñarle a mi hermano a programar. Él es un principiante total, pero muy inteligente. (Y en realidad quiere aprender). Me he dado cuenta de que algunas de nuestras sesiones se han estancado en pequeños detalles, y no creo que haya sido muy organizado. ( Pero las respuestas a esta publicación han ayudado mucho ) .

¿Qué puedo hacer mejor para enseñarle de manera efectiva? ¿Existe un orden lógico que pueda usar para ejecutar concepto por concepto? ¿Hay complejidades que debería evitar hasta más tarde?

El lenguaje con el que estamos trabajando es Python , pero los consejos en cualquier idioma son bienvenidos.


Como ayudar

Si tiene buenos, agregue lo siguiente en su respuesta:

  • Ejercicios para principiantes e ideas de proyectos
  • Recursos para la enseñanza de principiantes.
  • Vídeos de pantalla / publicaciones de blog / libros electrónicos gratuitos
  • Imprima libros que sean buenos para principiantes

Describa el recurso con un enlace para que pueda echar un vistazo. Quiero que todos sepan que definitivamente he estado usando algunas de estas ideas. Sus envíos se agregarán en esta publicación.


Recursos en línea para enseñar a principiantes:


Libros impresos recomendados para enseñar a principiantes


No entiendo por qué esto debería estar cerrado. Al menos 295 usuarios han encontrado esta pregunta (y las 92 respuestas) lo suficientemente útiles como para votarla, y 290 llegaron a considerarla como una de sus favoritas. La pregunta resultó en una agregación muy útil de recursos de enseñanza. Realmente no ha dado como resultado 'argumentos' o 'debates', pero realmente muchos buenos consejos sobre cómo abordar uno de los difíciles 'factores humanos' en la programación. Creo que cerrar una pregunta como esta es draconiana y perjudicial para la comunidad de StackOverflow.
Justin Standard

@JustinStandard ¿Ha considerado convertir sus ediciones en varias de las respuestas a los comentarios? Por ejemplo , aquí , aquí y aquí
Jason Plank

Respuestas:


118

Tuve que trabajar con varios programadores principiantes (nunca escribieron una línea de código), y este otoño haré un taller después de la escuela con estudiantes de secundaria. Esto es lo más parecido que tengo a la documentación. Todavía es un trabajo en progreso, pero espero que ayude.

1) FizzBuzz. Comience con los programas de línea de comandos. Puede escribir algunos juegos o herramientas divertidos, muy rápidamente, y aprende todas las características del lenguaje muy rápidamente sin tener que aprender primero las herramientas GUI. Estas primeras aplicaciones deberían ser lo suficientemente simples como para que no necesite usar ninguna herramienta de depuración real para que funcionen.

Si nada más, cosas como FizzBuzz son buenos proyectos. Sus primeras aplicaciones no deberían tener que lidiar con DB, sistema de archivos, configuración, etc. Estos son conceptos que simplemente confunden a la mayoría de las personas, y cuando solo está aprendiendo la sintaxis y las características básicas del marco, realmente no necesita más complejidad.

Algunos proyectos:

  • Hola Mundo!
  • Tome el año de mi nacimiento y calcule mi edad (solo (ahora - entonces) sin correcciones mensuales). (matemática simple, entrada, salida)
  • Pida una dirección (arriba, abajo, izquierda, derecha), luego dígale al usuario su destino (caer en un agujero, encontrar un pastel, etc.). (Lógica booleana)
  • FizzBuzz, pero cuenta una vez por segundo. (Bucles, temporizadores y más lógica)
  • Dependiendo de su edad, a algunos realmente les gusta una aplicación que llama a los usuarios un insulto aleatorio en algún intervalo. (Bucles, matrices, temporizadores y aleatorio si hace que el intervalo sea aleatorio)

2) Proyecto simple Una vez que tienen una buena comprensión de las características del lenguaje, puede comenzar un proyecto (los juegos simples y divertidos funcionan bien). Debe intentar que el primer proyecto se pueda completar en 6-12 horas. No pierdas el tiempo para diseñarlo temprano. Déjelos diseñarlo incluso si apesta. Si se desmorona, hable sobre lo que sucedió y por qué falló, luego elija otro tema y comience nuevamente.

Aquí es donde comienza a presentar las capacidades de depuración de sus herramientas. Incluso si puede ver el problema leyendo el código, debe enseñarles cómo usar las herramientas y luego mostrarles cómo puede verlo. Eso tiene el doble propósito de enseñar las herramientas de depuración y enseñar cómo identificar errores sin herramientas.

Una vez, o si el proyecto se vuelve funcional, puede usarlo para introducir herramientas de refactorización. Es bueno si luego puede expandir el proyecto con algunas características simples que nunca planeó. Esto generalmente significa refactorización y depuración significativa, ya que muy pocas personas escriben incluso código medio decente la primera vez.

Algunos proyectos:

  • Juego del ahorcado
  • Experimentar con robótica ( Vex y Mindstorms son opciones)

3) Proyecto real Comience un proyecto real que puede llevar algún tiempo. Utilice el control de fuente adecuado y procure tener un horario. Ejecute este proyecto como un proyecto real, por lo menos, es una buena experiencia tener que lidiar con las herramientas.

Obviamente necesita ajustar esto para cada persona. Lo más importante que he encontrado es hacer que incluso las primeras aplicaciones simples se apliquen a lo que le interesa a la persona.

Algunos proyectos:

  • Tetris
  • Motor de blog basado en archivos de texto
  • Trabajo de robótica más avanzado

Esta es una gran guía. Personalmente, no puedo codificar mi salida de una bolsa de papel (me gustaría ver a alguien hacer eso en la vida real, en realidad), así que esto parece una buena guía para enseñarme a mí mismo también.
keyofnight

Esta es una muy buena respuesta. Mi única objeción es que Tetris no es una buena opción para un primer o segundo juego. En ese nivel, la detección de colisiones puede ser un problema difícil; es genial si pueden resolverlo.
phkahler

@phkahler Entiendo su punto de vista, pero creo que Tetris es interesante porque hay tantas implementaciones de OSS / demo que puede analizar antes y después de escribir su código.
Eric Haskins

30

Podrías intentar usar a Alice . Es un programa 3D diseñado para su uso en clases de programación introductoria.

Los dos mayores obstáculos para los nuevos programadores son a menudo:

  • errores de sintaxis
  • motivación (escribir algo significativo y divertido en lugar de artificial)

Alice utiliza una interfaz de arrastrar y soltar para construir programas, evitando la posibilidad de errores de sintaxis. Alice te permite construir mundos en 3D y tener tu código de control (simple) de personajes en 3D y animación, que generalmente es mucho más interesante que implementar listas vinculadas.

Los programadores experimentados pueden mirar a Alice como un juguete y burlarse de arrastrar y soltar líneas de código, pero la investigación muestra que este enfoque funciona.

Descargo de responsabilidad: trabajé en Alice.


Lo supe a través de la última conferencia de Randy Pausch. El razonamiento detrás de este proyecto me dejó alucinado.
Jesvin Jose

28

Recomiendo Logo (también conocido como la tortuga) para obtener los conceptos básicos. Proporciona una buena caja de arena con retroalimentación gráfica inmediata, y puede demostrar bucles, variables, funciones, condicionales, etc. Esta página proporciona un excelente tutorial.

Después del logotipo, muévase a Python o Ruby. Recomiendo Python, ya que está basado en ABC, que fue inventado con el propósito de enseñar programación.

Al enseñar programación, debo secundar la sugerencia de EHaskins de proyectos simples y luego proyectos complejos. La mejor manera de aprender es comenzar con un resultado definitivo y un hito medible. Mantiene las lecciones enfocadas, le permite al estudiante desarrollar habilidades y luego desarrollarlas, y le da al estudiante algo para presumir ante sus amigos. No subestimes el poder de tener algo que mostrar para el trabajo de uno.

Teóricamente, puedes seguir con Python, ya que Python puede hacer casi cualquier cosa. Es un buen vehículo para enseñar programación orientada a objetos y (la mayoría) algoritmos. Puede ejecutar Python en modo interactivo como una línea de comando para tener una idea de cómo funciona, o ejecutar scripts completos a la vez. Puede ejecutar sus scripts interpretados sobre la marcha o compilarlos en binarios. Hay miles de módulos para ampliar la funcionalidad. Puede hacer una calculadora gráfica como la que se incluye con Windows, o puede hacer un cliente IRC, o cualquier otra cosa.

XKCD describe el poder de Python un poco mejor: "¡Estás volando! ¿Cómo?"  "¡Pitón!"

Puede pasar a C # o Java después de eso, aunque no ofrecen mucho que Python aún no tenga. El beneficio de estos es que usan la sintaxis de estilo C, que usan muchos lenguajes (¿me atrevo a decir más?). Aún no necesita preocuparse por la administración de la memoria, pero puede acostumbrarse a tener un poco más de libertad y menos agarre del intérprete de idiomas. Python aplica espacios en blanco y sangría, lo cual es bueno la mayor parte del tiempo pero no siempre. C # y Java le permiten administrar su propio espacio en blanco sin dejar de escribir.

A partir de ahí, el estándar es C o C ++. La libertad en estos idiomas es casi existencial. Ahora está a cargo de su propia administración de memoria. No hay recolección de basura para ayudarlo. Aquí es donde se enseñan los algoritmos realmente avanzados (como mergesort y quicksort). Aquí es donde aprende por qué "falla de segmentación" es una palabra de maldición. Aquí es donde descarga el código fuente del kernel de Linux y observa el Abismo. Comience escribiendo un búfer circular y una pila para la manipulación de cadenas. Luego, sube tu camino.


En realidad, no administras completamente la memoria en C. Tienes malloc, etc., y lo administras gratis por ti. Solo tiene que decirle al sistema cuándo quiere más memoria y cuándo ha terminado con la memoria que ha estado usando.
compman


12

Paquete Python VPython - Programación 3D para Ordinary Mortal ( video tutorial ).

Ejemplo de código:

from visual import *

floor = box (pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)
ball = sphere (pos=(0,4,0), radius=1, color=color.red)
ball.velocity = vector(0,-1,0)
dt = 0.01

while 1:
    rate (100)
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < ball.radius:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

Bola que rebota VPython http://vpython.org/bounce.gif


Bueno para justo después de que hayan aprendido los conceptos básicos. Crear imágenes es una excelente manera de motivar a las personas a aprender programación.
phkahler

12

Comience con gráficos de tortuga en Python.

Usaría los gráficos de tortuga que vienen de serie con Python. Es visual, simple y podría usar este entorno para introducir muchos conceptos de programación como iteración y llamadas a procedimientos antes de llegar demasiado lejos a la sintaxis. Considere la siguiente sesión interactiva en python:

>>> from turtle import *
>>> setup()
>>> title("turtle test")
>>> clear()
>>>
>>> #DRAW A SQUARE
>>> down()        #pen down
>>> forward(50)   #move forward 50 units
>>> right(90)     #turn right 90 degrees
>>> forward(50)
>>> right(90)
>>> forward(50)
>>> right(90)
>>> forward(50)
>>>
>>> #INTRODUCE ITERATION TO SIMPLIFY SQUARE CODE
>>> clear()
>>> for i in range(4):
        forward(50)
        right(90)
>>>
>>> #INTRODUCE PROCEDURES   
>>> def square(length):
        down()
        for i in range(4):
            forward(length)
            right(90)
>>>
>>> #HAVE STUDENTS PREDICT WHAT THIS WILL DRAW
>>> for i in range(50):
        up()
        left(90)
        forward(25)
        square(i)
>>>
>>> #NOW HAVE THE STUDENTS WRITE CODE TO DRAW
>>> #A SQUARE 'TUNNEL' (I.E. CONCENTRIC SQUARES
>>> #GETTING SMALLER AND SMALLER).
>>>
>>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING
>>> #EACH SUCCESSIVE SQUARE TILTED

Al tratar de cumplir las dos últimas tareas, tendrán muchos intentos fallidos, pero los fracasos serán visualmente interesantes y aprenderán rápidamente a medida que intentan descubrir por qué no obtuvo lo que esperaban.



11

La clave es que la persona en cuestión necesita tener algún problema que quiera resolver. Si no tiene un programa que desea escribir (y algo sensato y bien definido, no "¡Quiero escribir el próximo terremoto!"), Entonces no puede aprender a programar, porque no tiene nada que lo motive . Quiero decir, podrías leer un libro y tener una comprensión aproximada de la sintaxis y la semántica de un idioma, pero hasta que tengas un programa que quieras escribir , nunca entenderás la ortiga.

Si ese impulso existe, entonces todo lo demás son solo detalles menores.


Creo que la mejor manera de aprender cualquier materia técnica es aprender a resolver problemas pequeños e incrementales.
cbednarski




5

Este es un libro fantástico que mis hermanos pequeños solían aprender:

http://pine.fm/LearnToProgram/

Por supuesto, lo más importante es comenzar un programa real y útil de algún tipo INMEDIATAMENTE después de terminar el libro.


4

Si está interesado, ¿no son los detalles menores las partes buenas? Con Python, ya has cortado la GUI para que la confusión desaparezca. ¿Por qué no elegir un proyecto, un juego o algo así e implementarlo? El clásico juego de adivinanzas de números hi-lo se puede implementar simplemente desde la línea de comandos en 20-30 líneas de código (dependiendo del idioma, por supuesto) y le proporciona variables, condiciones, bucles y la entrada del usuario.



4

Simplemente lo dejé escribir toneladas de código. Deje que maneje todo lo que hacen, y solo esté disponible para responder preguntas.

Lo creas o no, después de unos meses de escribir toneladas de código malo, él comenzará a tener la idea y comenzará a escribir mejores programas. En ese momento, puede atascarse en detalles (memoria, etc.) y también hablar sobre principios generales de diseño.

He oído que lo que separa a los grandes artistas de los mediocres es que cada vez que practican, mejoran en algo, sin importar cuán pequeño sea. Deja que tu hermano practique, y mejorará cada vez que se siente al teclado.

Editar: [Justin Standard]

Esteban, esto me recuerda a un reciente mensaje de terror de codificación , y yo no creo que tiene razón. Pero creo que todavía vale la pena encontrar métodos para guiar su práctica. No hay duda, quiero que escriba tanto código como sepa hacer. Esa es una razón por la que estoy pidiendo proyectos de muestra.


Sí, sé de qué publicación estás hablando Justin. Leerlo me recordó que la mayoría de las cosas que he aprendido provienen de intentar y aprender de mis propios errores. ¡Realmente no puedo enfatizar lo suficiente la importancia de aprender haciendo!
Esteban Araya

2

En primer lugar, comience como todos los demás: con un programa Hello World . Es simple y les da una sensación básica para el diseño de un programa. Intente y recuerde cuándo fue la primera vez que programó y cuán difíciles fueron algunos de los conceptos: comience de manera simple.

Después de Hello World, pase a crear algunas variables básicas, aritméticas, luego a la lógica booleana y las declaraciones if / else. Si tienes uno de tus viejos libros de texto de programación, mira algunos de los primeros ejemplos y haz que lo revise. Simplemente no intente introducir demasiado de una vez, o será abrumador y confuso.


2

Algo que debe tener muy en cuenta al enseñarle a su hermano a programar es que no confíe demasiado en usted. A menudo, cuando me encuentro ayudando a otros, comienzan a pensar en mí como el libro de respuestas a todas sus preguntas y, en lugar de experimentar para encontrar una respuesta, simplemente me preguntan. A menudo, el mejor maestro es la experimentación y cada vez que su hermano tiene una pregunta como "¿Qué pasará si agrego 2 a una cadena?" deberías decirle que lo pruebe y lo vea por sí mismo. También he notado que cuando no puedo transmitir un concepto a alguien, es útil ver un código de muestra donde podemos ver cada segmento individualmente y explicarlo pieza por pieza. Como nota al margen, las personas nuevas en la programación a menudo tienen problemas con la idea de la programación orientada a objetos,


2

Yo solía enseñar programación y tu hermano tiene una ventaja principal sobre la mayoría de mis estudiantes que quiere aprender :)

Si decides ir con C, un amigo tiene un sitio que tiene el tipo de programas que los de las generaciones anteriores recuerdan como tipos básicos. Los más complejos usan ncurses, lo que niega su uso como ayuda didáctica, pero algunos de ellos son pequeñas cosas y puedes aprender muchas cosas sin que te enseñen.

Personalmente, creo que Python y Ruby serían excelentes lenguajes iniciales.

EDITAR: la lista de tareas de programación para principiantes aparecidas durante la noche podría ser justo lo que estás buscando.


2

Realmente depende del estilo de aprendizaje de tu hermano. Muchas personas aprenden más rápido ensuciándose las manos y simplemente metiéndose en ello, cristalizando los conceptos y el panorama general a medida que avanzan y desarrollan su conocimiento.

Yo prefiero comenzar con el panorama general y profundizar en lo esencial. Lo primero que quería saber era cómo encaja todo, luego todo ese gobbledygook orientado a objetos, luego sobre clases e instancias, etc. Me gusta conocer los conceptos subyacentes y un poco de teoría antes de aprender la sintaxis. Tuve un poco de ventaja porque escribí algunos juegos en BASIC hace 20 años, pero nada más desde entonces.

Tal vez sea útil sombrear un proceso de producción comenzando con una declaración de misión general, luego un plan y / o diagrama de flujo, luego elabore algún pseudocódigo (inclinado hacia la sintaxis que finalmente usará) antes de escribir el código.

La regla de oro aquí es descubrir el estilo inclinado de su estudiante.


2

Si su hermano tiene acceso a iTunes, puede descargar conferencias en video de un curso introductorio de ciencias de la computación impartido por Richard Buckland en la Universidad de Nueva Gales del Sur. Es un instructor atractivo y cubre los fundamentos de la informática y el lenguaje C. Por lo menos, dígale a su hermano que reproduzca los videos en segundo plano y algunos conceptos podrían penetrar por osmosis. :)

COMP1917 Higher Computing - 2008 Sesión 1 http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

Si el enlace no funciona, aquí hay una ruta:

Inicio -> iTunes U -> Ingeniería -> Computación superior COMP1917 - 2008 Sesión 1


2

Hay un wikibook que es bastante bueno para aprender Python .

No sé cómo son los wikilibros para otros idiomas, pero personalmente aprendí Python del wikilibro como era en febrero de 2007

ps: si no estás familiarizado con los wikilibros , es básicamente la versión wikipedia de la creación de libros. es un poco difícil de describir, pero si revisas algunos de los libros allí verás cómo funciona



2

Creo que Python es una gran idea. Le daría algunas tareas básicas para hacer por su cuenta y le diría que cualquier callejón sin salida que encuentre probablemente se pueda resolver con un viaje a Google. Para mí, al menos, resolver un problema por mi cuenta siempre hizo que se resolviera mejor que alguien que me dijera la solución.

Algunos posibles proyectos (sin ningún orden en particular):

  • Simulador de monedas. Deje que el usuario ingrese el número deseado de intentos para el lanzamiento de la moneda. Ejecútelo y muestre los resultados junto con el porcentaje de cara o cruz.

  • Haga un convertidor de temperatura con un menú que tome la entrada del usuario para elegir qué tipo de conversión quiere hacer el usuario. Después de elegir la conversión y hacerlo, debería volver al menú principal.

    Aquí hay un ejemplo de un convertidor extendido con la misma idea: http://pastebin.org/6541

  • Haga un programa que tome una entrada numérica y muestre la calificación de letra a la que se traduciría. Terminará evaluando la entrada contra las declaraciones if y elif para encontrar dónde encaja.

  • Haga un cuestionario simple que pase por varias opciones múltiples o complete las preguntas en blanco. Al final, mostrará cómo lo hizo el usuario. Puede elegir cualquier pregunta que quiera.

  • Tome una entrada de un número (presumiblemente grande) de centavos y conviértalo en denominaciones más grandes. Por ejemplo, 149 centavos = 1 dólar, 1 cuarto, 2 monedas de diez centavos y 4 centavos.

  • Crea un administrador de listas simple. Poder agregar / eliminar listas y agregar / eliminar entradas en esas listas. Aquí hay un ejemplo de un administrador de listas navideñas: http://pastebin.org/6543

  • Cree un programa que construya y luego pruebe si los números ingresados ​​forman un cuadrado mágico (con una matriz 2D). Aquí hay un código de muestra, pero realmente debería imprimir el cuadrado en cada paso para mostrar dónde está el usuario en términos de construir el cuadrado: http://pastebin.org/6544

También sugeriría hacer algunas cosas con xTurtle u otro módulo de gráficos para mezclar las cosas y evitar que se aburra. Por supuesto, esta es una práctica de programación y no el scripting para el que mucha gente realmente usaría python, pero los ejemplos que di fueron tomados directamente de cuando estaba aprendiendo a través de python y funcionó muy bien para mí. ¡Buena suerte!



2

Si a tu hermano le gustan los rompecabezas, recomendaría Python Challenge . No lo usaría como una herramienta de enseñanza formal en un tutorial 1 a 1, pero es algo que puede hacer cuando no están juntos para desafiarse y divertirse.



2

Después de leer algunos libros electrónicos gratuitos, encontré que el mejor libro para aprender a programar fue Head First Programming, publicado por O'Reily Press. Utiliza Python como lenguaje y le brinda programas para trabajar desde el principio. Todos son más interesantes que 'Hello World'. Vale la pena el dinero que gasté en él, y dado que ha estado fuera por un tiempo, es posible que pueda encontrar una copia usada más barata en Ebay o Amazon.


1

Si desea enseñar los conceptos básicos de la programación, sin ser específico del idioma, existe una aplicación llamada Scratch que se creó en MIT. Está diseñado para ayudar a las personas a desarrollar habilidades de programación. A medida que los usuarios crean proyectos de Scratch, aprenden a crear condiciones, bucles, etc. También hay una comunidad de proyectos de scratch, desde la cual se pueden descargar los proyectos, de esa manera puede explorar los programas de otras personas y ver cómo se construyeron.


1

Creo que una vez que tenga los conceptos básicos (variables, bucles, etc.) hacia abajo, debe intentar ayudarlo a encontrar algo específico que le interese y ayudarlo a aprender las necesidades para que esto suceda. Sé que estoy mucho más inclinado y motivado a hacer algo si me interesa. Además, asegúrese de dejarlo luchar a pesar de algunos de los problemas más difíciles, nada es más satisfactorio que el momento en que lo resuelve por su cuenta.


1

Me enseñaron aprendiendo a resolver problemas de una manera independiente del lenguaje usando diagramas de flujo y PDL (lenguaje de diseño de programas). Después de un par de semanas de eso, aprendí a convertir la PDL que había escrito a un idioma. Me alegro de haber aprendido de esa manera porque he pasado la mayor parte de mis años programando, resolviendo problemas sin estar atado a un idioma. El lenguaje que uso siempre ha sido un detalle de implementación y no forma parte del diseño.

Tener que resolver el problema dividiéndolo en sus pasos básicos es una habilidad clave. Creo que es una de las cosas que separa a los que pueden programar de los que no pueden.

En cuanto a cómo abordar el orden de los conceptos de un idioma, creo que la forma más fácil es decidir si es tener un proyecto en mente y abordar los conceptos según sea necesario. Esto le permite aplicarlos, ya que son necesarios en algo que le interesa hacer. Al aprender un idioma es bueno tener varios proyectos simples en mente y algunos con complejidad progresiva. Decidir sobre ellos lo ayudará a mapear los conceptos que se necesitan y su orden.


1

También recomendaría ver algunos screencasts: generalmente se crean en el contexto de una tecnología específica, no un lenguaje, aunque si se muestra el código Python, eso funcionará :). El punto es que son creados por algunos buenos programadores y ver cómo un buen programador es bueno. Tú y tu hermano también podrían hacer algo de programación entre pares, esa podría ser una idea aún mejor. Simplemente no olvides explicar POR QUÉ haces algo de esta manera y no de esa manera. Creo que la mejor manera de aprender programación es a partir de buenos ejemplos y tratar de no ver siquiera los malos.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.