Como estudiante de secundaria, ¿cómo puedo enseñar programación a mis compañeros de clase interesados?

De hecho, también probé esto en la escuela secundaria, excepto usando Java (para mi club de robótica).

Primer consejo: no uses Java .

El problema con Java es que está demasiado alejado de la esencia de la informática: hay demasiada complejidad adicional. Tienes que agitar un poco con la mano (“oh sí, solo escribe ‘public static void main’ y no te preocupes por lo que significa”), lo que realmente se interpone en el camino de enseñar programación real . Todo es una distracción.

Por esa razón, C ++ y Coq también están fuera.

No estoy diciendo que no puedas enseñar bien la programación con estos lenguajes, sí que puedes, y muchas personas que conozco comenzaron con uno de ellos (bueno, no Coq: P), pero estarías haciendo más trabajo por ti mismo. Todos esos detalles adicionales, muchos de los cuales son caprichos completamente arbitrarios o simplemente históricos, hacen que sea demasiado fácil perder la atención de las personas. ¡Y 1-2 horas a la semana es menos tiempo de lo que piensas!

En cambio, elige un idioma que sea lo más simple posible. Mi preferencia es el esquema. Tiene algunas ventajas:

  • básicamente no hay sintaxis : todo está entre paréntesis, separados por espacios. Esto ahorrará muchos dolores de cabeza, sin estropear llaves ni olvidar puntos y comas. La sintaxis es útil una vez que tienes más experiencia en programación, pero es bastante superficial y solo se interpone en el camino del aprendizaje.
  • todo es una expresión : no hay distinción arbitraria de expresión / expresión; en cambio, todo se comporta de la misma manera. Otra cosa que no tiene que preocuparse por explicar.
  • multiparadigm : Scheme admite la programación funcional e imperativa razonablemente bien, e incluso puede extenderse para enseñar POO.
  • enseñanza centrada : Scheme es un lenguaje de instrucción popular, por lo que tiene una cantidad desproporcionada de recursos para principiantes y herramientas para principiantes. Especialmente miraría a Racket, que es una versión particular de Scheme muy adecuada para la enseñanza.
  • pequeño : el esquema es pequeño y elegante. Muy pequeña. Esto significa que tiene muchos menos casos de esquina y comportamientos extraños que otros idiomas, lo que significa menos sorpresas y menos confusión. También es lo suficientemente pequeño como para que aprendas tú mismo sin perder demasiado tiempo.

Libros
Hay un par de buenos libros que usan Scheme y están disponibles de forma gratuita en línea. Estructura e interpretación de programas de computadora (SICP) es un clásico, pero podría ser demasiado para una clase de una vez por semana.

Otra alternativa más simple es Simply Scheme . Es un buen lugar para comenzar: fue escrito explícitamente como una introducción al SICP. Este es con el que probablemente iría.

Finalmente, está Cómo diseñar programas , escrito por el equipo detrás de Racket. No lo he leído yo mismo, pero he escuchado cosas buenas al respecto, por lo que probablemente valga la pena echarle un vistazo.

En su lugar, probablemente buscaría estructurar los temas en torno a Simply Scheme , pero agregaré algunos de sus propios ejercicios o proyectos para darle vida a las cosas. Probablemente se divertirá más enseñando si solo usa el libro como guía y hoja de ruta en lugar de seguirlo completamente capítulo por capítulo. También puede buscar ideas e inspiración en algunos de los otros libros.

Consejo general
Lo más probable es que explicar todo tomará más tiempo de lo que piensas. Si no le importa un poco de preparación, intente revisar el material que desea cubrir en un día y hora determinados. Luego presupuesta 1.5-2x más tiempo para la cosa real. Si eres como yo y eres demasiado vago para hacer eso, bueno, solo tenlo en cuenta y limita el alcance de cada día :). Además, creo que es más fácil agregar contenido con gracia que cortar contenido en el último momento.

En la misma nota, en lo que respecta a la velocidad, definitivamente me equivocaría al ir más lento. Por supuesto, eso se basa en cómo trato de explicar las cosas (es decir, demasiado rápido). Como ya estás bastante avanzado, no me sorprendería que tengas la misma actitud. Tendrás que prestar mucha atención las primeras veces para descubrir si estás sesgado demasiado en cualquier dirección, no quieres aburrir o perder a las personas, pero ten cuidado especialmente de ir demasiado rápido.

Es probable que las personas se confundan con cosas que le resulten fáciles o completamente evidentes. Cuando presenté Java por primera vez, resultó que modificar las variables no era intuitivo para todos, lo cual no esperaba. En todo caso, esas preguntas son más probables porque probablemente no pasará suficiente tiempo en estos temas. No te preocupes demasiado por eso. Honestamente, nunca estoy seguro exactamente cómo responder preguntas como esa; Si no puedo pensar en otra cosa, solo trato de reformular mi explicación. Funciona sorprendentemente bien.

Personalmente, no soy un gran admirador de la tarea. Un buen enfoque es tener un problema de programación relativamente pequeño y autónomo en el que las personas puedan trabajar con lo que saben. Idealmente, trate de hacerlo abierto para que cualquier persona realmente entusiasta pueda hacer algo genial con un poco de esfuerzo extra. Sin embargo, no esperaría que todos trabajen demasiado en nada durante la semana, por lo que no pondría demasiado énfasis en ello.

Organizar todo en torno a algunos proyectos pequeños y medianos es probablemente una buena idea. Lo hará más divertido para todos y permitirá que las personas cementen lo que están aprendiendo al usarlo. Si no te importa desviarte de las bibliotecas para hacer cosas como dibujar, puedes hacer algunas cosas geniales.

Para muchos temas, hacer dibujos y visualizaciones realmente ayuda. La mayoría de los maestros y profesores que he tenido no lo hacen lo suficiente. Es una excelente manera de darle vida a un ejemplo. Utilice una pizarra o, mejor aún, mejore con SVG o LaTeX (aunque esto requiere un poco de esfuerzo por adelantado).

No se me ocurre nada más que agregar. Y siga mi consejo con un grano de sal: no tengo mucha experiencia enseñando a mí mismo, y sobre todo no estudiantes de secundaria.

Como comentario, escribí la segunda mitad de esta respuesta cuando estaba realmente cansado, y se nota. Tiene un efecto mucho mayor en mi escritura de lo que pensaba, lo que en su mayoría no noto cuando realmente estoy escribiendo.

Idioma

¿Cuáles son sus objetivos finales para esta serie de lecciones?

¿Desea darles una introducción a la programación o comenzar dándoles una buena base sobre la cual puedan desarrollarse más tarde solos?

Si codifica C ++, sabe que la programación en sus raíces está muy relacionada con el hardware / compilador, por lo que necesitarían algunos conocimientos sobre cómo funcionan las computadoras / memoria / CPU y otros problemas relacionados con el compilador. Así es como mi universidad se acercó a la programación de enseñanza también.

Pero hoy en día puedes utilizar lenguajes de alto nivel donde no se necesitan conocimientos de hardware o compiladores.

Soy un desarrollador de Delphi / C # y uso el lenguaje de scripting Lua para cuando necesito lidiar con cosas de C ++ pero quiero que sea simple. JavaScript también es bueno para comenzar a aprender. Ruby también es genial. Python si quieres un poco más de profundidad.

Los lenguajes de alto nivel son útiles para enseñar a las personas a pensar como un codificador. Permiten al codificador evitar lidiar con cosas de bajo nivel y centrarse principalmente en la lógica detrás de la aplicación.

Esto es muy importante porque la tecnología / los idiomas evolucionan y cambian, pero si aprendes a pensar como un codificador, eso está ahí para quedarte.

Plan de estudios

Y el plan que mencionó Narendra Joshi parece ser un buen camino a seguir.

Primero tendrá que hacerlo usted mismo y, dependiendo de cuánto tiempo planifique la clase, deberá extraer los puntos principales para que se ajuste a su horario.

Otra cosa es intentar que la clase sea entretenida. Tome los ejercicios de ese plan y transfórmelos en problemas del mundo real que a un niño de entre 18 y 18 años le interesarían. A nadie le gusta resolver un problema que realmente no les importa. Es por eso que la tarea es tan aburrida para la mayoría de las personas. 🙂

Además, durante la clase, acepte que puede cometer errores y que algunos de sus estudiantes pueden llamarlo por eso. Está bien. La gente comete errores. Así es como aprendemos. Agradézcales por darse cuenta y continúe con la clase. Si lo toma como algo personal, se sentirá frustrado y no le gustará toda la enseñanza.

La enseñanza necesita mucha preparación previa por parte del profesor, por lo que es mejor que comiences. ¡Buena suerte!

En realidad, me resulta más difícil enseñar a personas que no están interesadas, y para hacer esto sugeriría computación física: programar a Arduinos para que haga cosas reales. El lenguaje de procesamiento es muy simple y lo que hace su programa se refleja en las cosas reales que suceden (lea un sensor, encienda un LED …)

Sin embargo, en su caso sugiero:

  • Recuerde que los ejemplos deben venir antes que los conceptos, para motivar el aprendizaje.
  • Comience explicando la idea de la computación antes de los detalles de la programación.
  • Dígales la diferencia entre un enunciado en matemáticas (la raíz cuadrada de x es un valor y tal que y> = 0 e y * y = x) y un algoritmo para encontrar la raíz cuadrada (vea el método de Heron).
  • Explique la diferencia entre “iguales” en matemáticas (una aserción) y “asignar a” en algoritmos (una operación: asignación). Esto introduce la idea de que la programación actúa a través del tiempo: hay un “antes”, un “estado presente” y un “después”.
  • ¿Dónde se almacena el “estado actual”? Introducir la idea de variables. Demuestre que a = a + 1 está mal en matemáticas pero está bien en algoritmos.
  • Explicar el flujo de control y sus variaciones básicas (ejecución secuencial, ejecución condicional, ejecución iterativa). Mostrar ejemplos
  • Ahora puedes introducir un idioma. Mi sugerencia es utilizar un lenguaje interpretado para que se puedan mostrar ejemplos mínimos y sea posible experimentar sobre la marcha. Mostrar hola mundo.
  • A partir de ahora, presente pequeños problemas de programación, cada uno con un solo desafío adicional con respecto al problema anterior. Comience con problemas muy básicos como “calcular área y perímetro de un rectángulo” y continúe introduciendo (¡un paso a la vez!) Ejecución condicional y bucles. Luego continúe con detalles menos básicos, por ejemplo, E / S, formas alternativas de expresar condiciones y bucles, funciones …
  • Con respecto a las funciones (o cualquier tipo de subprograma), explíquelas con la necesidad de ampliar las capacidades incorporadas del lenguaje con módulos reutilizables. Por ejemplo, su idioma puede no tener una raíz cuadrada; puede programar el método de Heron en una función y luego llamarlo para calcular la diagonal de un rectángulo. Encuentre algunos ejemplos que hacen que sea obviamente ventajoso llamar a una función en lugar de repetir código. Solicite una modificación al código de una función y muestre lo loco que sería cambiar cada aparición de ese código si lo repite en todas partes donde sea necesario (esfuerzo + errores).
  • Recuerde introducir conceptos antes de programar construcciones. Los conceptos se entienden mejor cuando tiene un problema y necesita alguna forma de resolverlo. Por ejemplo, puede introducir coma flotante al tener un problema que requiere calcular 1/2, que es 0 en cualquier tipo de entero. (Solo un ejemplo; muchos idiomas interpretados se escriben débilmente y se convertirán automáticamente a coma flotante).
  • Encuentre un conjunto entretenido de problemas para usar como ejercicios. Haga que sean desafiantes, pero paso a paso, y en el grado correcto en cada paso.

Bueno, en primer lugar, evite JAVA. JAVA es un lenguaje útil pero no la mejor opción para aprender a programar de primera mano. Te aconsejaré que sigas sinceramente el libro “Cómo pensar como un informático”, solo buscalo en Google, obtendrás el PDF (es gratis).

Lenguaje de programación: creo que la mejor opción es Python. Es simple con muy poca sintaxis y el pseudocódigo se asigna directamente a los scripts. De todos modos, si quieres seguir con C / C ++ está bien.

Para mantener las cosas interesantes después de que se sientan cómodos con los problemas normales de programación, presénteles la programación de sockets en cualquier idioma que terminen usando, créanme que será divertido …)

Enséñeles qué es la informática. No empieces solo con la codificación.
Le recomendaría que les enseñe su propia versión de este curso: Estructura e interpretación de programas de computadora. Puedes ver los videos de la conferencia. El curso completo está disponible en el sitio web. También hay tareas y exámenes. En el proceso de hacerlo, aprenderás mucho también. 🙂

Sugeriría comenzar con las aproximadamente 25 actividades que componen Computer Science Unplugged. Separa los conceptos de CS de tener que aprender un idioma y una cadena de herramientas al mismo tiempo. Ya está en un formato estudiante-maestro para usted, y hay videos que muestran varias formas en que otros maestros han enseñado las lecciones. Es un poco juvenil (dirigido a estudiantes más jóvenes). pero lo he usado para enseñar exitosamente a niños y adultos. Creo que la naturaleza juvenil ayuda a los adultos a no sentirse intimidados por el material. Honestamente, está increíblemente bien organizado y, al final, si tus amigos entienden completamente todas las lecciones, estarán por delante de muchos graduados de CS.

¡No lo enseñe demasiado abstracto y proporcione ejemplos interesantes!

Ok, tus compañeros de clase están interesados, pero mantenlos así. Personalmente, me hubiera encantado que me presentaran el procesamiento y algunos de sus ejemplos (o algo posiblemente también gráficamente atractivo), porque en la escuela secundaria no me interesaba la programación y mi maestra nos enseñó Java y bases de datos que no me interesaban. yo en absoluto
No puedo aconsejarle sobre la velocidad o qué cubrir y no conozco a sus compañeros de clase, ¡pero comenzaría con algo bastante sencillo y un lenguaje que le brinde resultados rápidamente para que sus estudiantes tengan cierta sensación de logro !

Simplemente póngalos en el programa y vea por sí mismo los conceptos que ya conoce.
Vaya despacio, asegúrese de que entiendan los conceptos básicos de qué es un tipo, cómo funciona la lógica, etc.
Una vez más, haga que programen mucho, no necesita ser algo útil, la práctica y la paciencia son la clave.
Tenga en cuenta que terminará con 1 o 2 estudiantes solamente ^^

Para aprender a programar se trata de aprender el proceso computacional, por lo que el diagrama de flujo es esencial. Estas conferencias de Stanford sobre metodología de programación pueden ayudar en esa dirección.
Stanford School of Engineering

Enseñar algo prácticamente.