programming learning khan academy language-agnostic

language-agnostic - khan - learning programming



¿Cómo mantener un curso de programación interesante? (17)

Supongo que el siguiente es un problema estándar en cada escuela o universidad:

Es su trabajo enseñar programación. Desafortunadamente, algunos de los estudiantes son semiprofesionales y tienen años de experiencia, mientras que otros ni siquiera conocen los conceptos básicos, por ejemplo, el concepto "variable tipeada".

Hasta donde yo sé, esto lleva a una de las siguientes situaciones:

  1. La programación está pensada desde lo básico. Los estudiantes experimentados se aburren y dejan de visitar las conferencias. Como consecuencia, perderán incluso las cosas que aún no conocen.
  2. Los profesores y profesores afirman que requieren conocimientos básicos (lo que sea que eso signifique). Los estudiantes inexpertos no pueden seguir las clases y muchos de ellos se enfocarán en cosas sin importancia (por ejemplo, entendiendo cada detalle de un ejemplo complejo sin tener el concepto detrás del ejemplo). Algunos de ellos se darán por vencidos.
  3. Las universidades inventan un lenguaje de programación artificial para darles a los programadores experimentados y a los novatos "iguales oportunidades". La mayoría de los estudiantes se sentirán frustrados con el "lenguaje inútil".

¿Hay una cuarta solución, que es mejor que las anteriores?


Creo que podrías ser un brindis.

Después de algún punto, la diferencia es solo amplia. Llevará todo el año lograr que los principiantes lleguen al punto en que puedan incluso comprender cosas que no aburrirán a las personas más avanzadas.

Sin embargo, esto claramente depende del tema y la configuración. Para algunas combinaciones de aquellos, la solución es enseñar al nivel que se le factura a la clase. Aquellos que van a avanzar conseguirán el consejo y renunciarán, los que no tienen experiencia se retrasarán y renunciarán. No te preocupes por eso, ya que ninguno debería haber tomado la clase de todos modos. Si, por otro lado, necesitan tomar la clase, alguien más arriba en la escalera se equivocó.


En un curso que tomé, una gran parte de la calificación del curso se derivó de un proyecto de fin de trimestre que se anunció de antemano con crédito adicional disponible para complementos variados y adornos. Un estudiante suficientemente experimentado podría comenzar a trabajar en él, mientras que a sus hermanos menos preprandiados se les enseñaban los conceptos básicos.

Pero como dice Dave Markle, parte de esto es una cuestión de conseguir los estudiantes correctos en su clase: usted realmente quiere una cohorte que sea muy parecida desde el principio.


OMI: este es un problema basado en la ubicación de los estudiantes, no es algo que debería interesarle demasiado a usted como profesor.

Si el curso es una introducción a la programación de una computadora, entonces realmente necesita comenzar con lo básico. Si tiene un aula llena de profesionales que saben cómo programar y no se presentan, era un problema con la descripción de su curso, o la escuela les obliga a tomar la clase como un pre-requisito sin permitirles probar. .

Su trabajo debe ser describir lo que quiere enseñar en la descripción del curso y enseñarlo. Si los estudiantes se matriculan y están sobrecalificados, ese es su problema. Creo que lo único que realmente debes evitar es tratar de hacer que el curso sea demasiado avanzado para principiantes si tu curso es realmente para principiantes.


Recientemente asistí a un curso en el que había un amplio espectro de experiencia en programación entre los estudiantes. Todavía lograron mantener a los programadores experimentados en la clase interesados ​​por tener un programa de ejercicios en el que programaron las partes prácticas de los ejercicios (la parte de programación), y publicaron los resultados en una tabla de puntaje alto. Al final de cada conferencia, el profesor dio algunos consejos sobre cómo podríamos mejorar nuestros tiempos aún más. Como todos sabemos, a todos los ingenieros les encanta competir por encabezar esas listas, así que seguimos apareciendo e incluso aprendimos una o dos cosas nuevas. Los estudiantes inexpertos también pudieron completar los ejercicios, incluso si no les importaba demasiado su tiempo.

No sé si tu curso puede implementar esta solución, pero si lo es, deberías considerarlo.


Si tiene muchos estudiantes experimentados o este es un curso de nivel superior / graduado, debe centrarse en la integración en el ecosistema existente. Ser capaz de comprender e integrar en un proyecto existente en lugar de trabajar siempre desde cero es la habilidad más importante que puede dar para dar a los estudiantes.

Por lo tanto, las asignaciones de programación deben provenir de escenarios del mundo real. Por ejemplo, asignarles tareas en un proyecto de código abierto. Esto también puede hacerlo más interesante, especialmente porque su trabajo puede formar parte de un proyecto del mundo real.

Si se trata de principiantes, mala suerte, tendrá que apegarse a lo básico, aunque si los estudiantes no son CS major, puede crear problemas desde sus propios dominios (por ejemplo, ingeniería, química, etc.)


Creo que hay un par de cosas que puedes hacer para ayudar a cerrar la brecha entre los estudiantes avanzados y principiantes y para mantener a todos interesados ​​e involucrados en el curso.

Talleres avanzados

Si se puede arreglar (usando estudiantes de doctorado, etc.), realice un taller semanal opcional al que cualquiera puede asistir, pero que está dirigido a los estudiantes más experimentados. Establezca una tarea de código / desafío cada semana y luego en el taller, vaya a través de varias soluciones al problema y discuta las implicaciones y la teoría detrás de las diferentes opciones.

Esto proporciona un desafío interesante para los codificadores experimentados, ya que tienen algo en lo que meterse los dientes. Abre un poco de debate y puede ayudar a las personas intermedias a comprender conceptos interesantes y si logra que las personas presenten sus soluciones, introduce un estilo de revisión abierto que es beneficioso. También ayuda a los principiantes en que no es necesario presentarles conceptos realmente avanzados en la serie principal de conferencias solo para mantener a la gente experimentada interesada.

Participación de los estudiantes

Las personas con experiencia en general tienen experiencia porque disfrutan de la codificación, etc. y muchas personas aman compartir sus conocimientos. Una buena manera de usar esto, y ayudar tanto a los principiantes como a los estudiantes avanzados, es lograr que los estudiantes más avanzados participen en la enseñanza. Si dirige clases / laboratorios donde los estudiantes completan ejercicios, intente conseguir voluntarios de los estudiantes más experimentados para actuar como mentores / supervisores de los laboratorios. Cuando los principiantes luchan pueden ayudar explicando detalles finos o sutilezas, etc.

Esto realmente puede ayudar a los principiantes, ya que nunca hay suficiente personal disponible para que todos puedan hacer preguntas individuales. También puede beneficiar realmente a las personas más avanzadas, ya que tener que explicar el concepto que "conoces" es una excelente manera de reforzarlas en tu propia mente, e incluso de descubrir que tienes sutiles malentendidos en tu propio conocimiento.


No asuma más de lo que necesita; intente seleccionar entornos de programación que no tengan demasiado equipaje intelectual. Puede pensar que un programa C "Hello world" es simple, pero eso requiere la comprensión de los archivos fuente, la compilación, el tipado estático y la estructuración de bloques. No hay conceptos fáciles para un principiante. En comparación, escribir "print ''hello world''" en un shell de Python los evita. Las declaraciones, los tipos compuestos, la orientación a objetos, los punteros, el punto flotante, la recursividad, la modularidad, los hilos, las devoluciones de llamada, la modularidad, las redes, las bases de datos, etc., son conceptos importantes que requieren un esfuerzo de aprendizaje. Y, hay muchas cosas divertidas que hacer sin ellas. Su objetivo debe ser lograr que todos en el grupo realicen ejercicios de programación lo más pronto posible.

La enseñanza de habilidades mixtas es difícil; transmítelo dividiendo el grupo si puede. Tal vez publique una prueba de conceptos básicos y tenga una sección opcional de conceptos básicos para aquellos que no obtuvieron el 100%. Algunas personas piensan que son programadores experimentados pero que han malentendido las ideas básicas.

Si el tiempo de curso disponible es demasiado corto para permitir que la gente pruebe muchos ejercicios, entonces soltaría el material más avanzado antes de dejar el trabajo práctico.


Sentarse en su silla viendo a alguien hablar es aburrido (incluso si habla bien).

Las cosas son interesantes si puedes lograr algo, cuando puedes manipular el mundo y tener un momento de éxito. Así que agregue tantos ejercicios prácticos como pueda y asegúrese de que puedan hacerlo a tiempo y de que puedan hacerlo con éxito a tiempo.

Nada es más frustrante que escuchar: "Bueno, lamento que no puedas completarlo. Puedes encontrar una solución aquí. Copiemos eso y pretendamos que funcionó y sigamos adelante". Los ejemplos durante un curso son simples y las personas frente a usted lo saben. Entonces, si ni siquiera pueden resolver los ejemplos simples que traes para ellos, ¿qué van a pensar?


Siempre pienso que es mejor aprender a través de la práctica. Al comienzo del curso, especialmente es increíblemente aburrido enseñar la sintaxis del lenguaje en una conferencia. Es mucho mejor exigir a sus alumnos que completen algún trabajo por su cuenta o en un laboratorio con asistentes. Esto permite que los estudiantes más experimentados superen rápidamente el trabajo.

Una vez hecho esto, puede tener una conferencia en la que discuta algunas de las soluciones a los problemas. Por qué son buenos y por qué son malos

Esto funciona especialmente bien si también estructuras tu curso de tal manera que los estudiantes siempre estén trabajando en su trabajo anterior. La primera semana puede ser algo simple como calcular cuántos días tengo desde mi cumpleaños. Un problema que es relativamente simple matemáticamente pero tiene algunos casos extraños. Esto puede tomar varias horas para alguien sin experiencia. Especialmente si están aprendiendo sintaxis al mismo tiempo. Pero les da un objetivo simple para trabajar hacia.

Después de esto, puedes gastar en eso. Por ejemplo: tome el programa de las últimas semanas y agregue la funcionalidad que le permite procesar por lotes un archivo. Esto le enseña a la gente la importancia de reestructurar y refactorizar, y puede expandirse semana tras semana. Incluso puede querer distribuir un buen trabajo de la semana anterior para los que se están quedando atrás para usar. Obviamente, tendrá que asegurarse de que las personas no se retrasen demasiado, pero esta es una buena manera de asegurarse de que todos sientan que tienen una buena oportunidad, incluso si el trabajo de la semana anterior no fue demasiado bueno. Aquellos que están bien terminarán

La clave es mantener sus sesiones de conferencias en un nivel relativamente alto y que las personas aprendan la sintaxis por sí mismas o con los asistentes de laboratorio. Puede enseñarles diferentes formas de pensar sobre un problema, pero el acto real de escribir código es mucho más fácil de aprender al hacerlo.


Una vez en una pesadilla de programación terminé enseñando una clase para principiantes y una clase avanzada en el mismo salón de clases al mismo tiempo. Lo que hice fue dividir mi tiempo entre los dos niveles comenzando asignando al grupo avanzado una tarea para hacer en clase mientras trabajaba con los principiantes y luego asignando una tarea a los principiantes mientras trabajaba con los avanzados. Podrías hacer algo similar (solo haciendo que los grupos se auto-seleccionen en el grupo en el que querían estar). Prepare material adicional para los más avanzados y estará listo para las carreras.

Otra estrategia es mantener todo en el nivel de principiante, pero ofrecer a los estudiantes más avanzados otro material para obtener crédito adicional (o incluso como sustitución de algunas de las tareas más simples que requiere de los principiantes). Discuta las tareas más avanzadas con ellos fuera de la clase o individualmente mientras la clase está trabajando en el trabajo práctico en el laboratorio.

También es útil mantener las conferencias interesantes con muchos ejemplos del mundo real. Sin embargo, tendí a dar una conferencia lo menos posible y presentar el material más a través de la discusión en clase y los ejercicios prácticos y haciendo preguntas principales. Hacer que encuentren la información para responder sus preguntas (y la participación en clase fue parte de la calificación) les hará prestar más atención.

También finalicé cada semestre con un proyecto de curso que solo describí lo que tenían que hacer para obtener una B. Una A implicaría hacer un trabajo más allá de eso, incluido el trabajo en un área no cubierta en clase. Los estudiantes más avanzados pueden brillar buscando nuevas cosas realmente geniales e incluso los principiantes suelen encontrar la manera de hacer algo que no cubre el curso. Es increíble cuánto esfuerzo extra van a hacer cuando no saben cuánto más tienen que hacer para obtener una A. Otros instructores se sorprenderían de la calidad del final de los proyectos del curso que obtuve y varios de ellos comenzaron usando el mismo método.


Frecuentemente he estado en esta situación, primero en el aspecto estudiantil y luego en el aspecto docente.

La mayoría de las escuelas imponen ese tipo de cursos y su plan de estudios. Esto es una tontería, pero así es la vida. Si su escuela lo permite, sugeriría que se ofrezca la exención de asistencia a los estudiantes si pasan una prueba de detección temprana. Es de su interés y del interés de los estudiantes de primer año no sentarse en una clase donde una parte significativa de la población está aburrida. Incluso estar en una habitación con toneladas de personas que comienzan en sus laptops daña el discurso. Todos deben asistir a las pruebas y enviar tareas, pero al menos no tienen que presentarse.

Una vez que trabajes con los novatos, averigua si son mayores o no mayores. A los no mayores les molestará estar en un curso de CS, debes tratar de hacerlo accesible para ellos. Por ejemplo, use ejemplos de física, química o matemática en lugar de crear un sistema de interfaz gráfica interactiva.

Si son CS major, sería mejor que se interesen :)


Mi opinión es que enseñar programas de muestra es aburrido para la mayoría de las personas. Búsqueda, clasificación, clasificación de entrada ascii de 7 bits, uso de unix y make, apertura de un archivo, escritura de un archivo ...

Estos son problemas aburridos . Independientemente de su importancia / utilidad, estas son herramientas. Desafortunadamente, las herramientas son lo que se enseña en los cursos de introducción, no en los problemas.

Pero necesita herramientas para poder resolver un problema. Entonces es una especie de problema de huevo de gallina.


Puede ser mejor separar algunas áreas de preocupación con lo que algunos llamarían "Programación introductoria":

1) Introducción a las computadoras personales y la informática moderna. Suponiendo que el software del curso se ejecuta en Windows, puede haber algunos que necesiten cubrir los aspectos básicos de una computadora, por ejemplo, qué es un disco duro, teclado, mouse, monitor, CPU, placa base, etc. Tenga en cuenta que esto no tiene nada que ver incluso una línea de código que no sea nombrar sistemas operativos potencialmente. Para algunas personas, esto puede ser nuevo para ellos y, por lo tanto, tener un curso que cubra lo básico bien puede valer la pena. También en este curso serían formas de usar un mouse y todos sus diversos botones, cuáles son los diversos tipos de cables y conexiones que las personas tienen, cuáles son los controladores, cuáles son los parches, qué son partes de una red, por ejemplo, firewall, enrutador, carga balanceadores, etc. La idea aquí no es entrar en cómo configurar un firewall a la perfección, sino que la persona entienda para qué son los diversos componentes de hardware y posiblemente cómo configurar una red inalámbrica doméstica como los conceptos más complicados que se enseñan.

2) Principios de programación. Esto comenzaría con la idea de cuáles son los pasos que hay para ejecutar una secuencia de comandos. Cosas como la impresión y la realización de operaciones matemáticas, por ejemplo, la conversión de Imperial a métrica, se cubriría con posiblemente la clasificación como el ejemplo más complicado, visto desde una variedad de algoritmos diferentes y una comprensión en un nivel básico de notación de gran O.

3) Introducción a estructuras de datos y programación avanzada. Ahora, introduzcamos el concepto de una base de datos relacional y cómo funcionan las bases de datos en general y tengamos proyectos con aplicaciones del mundo real, por ejemplo, haga que cada alumno tome una lista de algo que tenga como DVD o CD y ponga estos en un esquema de base de datos para almacenar esta información Además, la idea de la aritmética de coma flotante y sus limitaciones, por ejemplo, que una computadora no almacena el valor total de pi sino más bien una aproximación que debería ser lo suficientemente buena en la mayoría de los casos.

4) Introducción a la Programación Paralela y Sistemas Operativos. Aquí tendría un trabajo en profundidad para construir un sistema operativo y manejar cómo escribir código que se puede ejecutar simultáneamente o en paralelo y cuán eficientes son los diversos programas bajo diferentes circunstancias.

Así es como pude ver a alguien dividiendo la programación para que no esté donde alguien pueda aprender en una semana para pasar la final sin mirar nada más.


Ejemplos del código del mundo real que el alumno puede imaginarse haciendo fuera de su tiempo libre. Recuerdo que un maestro que me decía que usara valores const era el impuesto de algo. Solo tuve que usar el valor en dos lugares. Me preguntó qué pasaría si tuviera que cambiarlo. Dije que solo en dos lugares y que lo cambiaré a mano. Tampoco podría imaginar que el gobierno cambiara el impuesto%.

No puedo pensar en un ejemplo no complejo en el que usaría una const así que no intentaría enseñarles a usar eso, pero para las matrices simplemente escribiría un juego de adivinanzas, luego cuando el jugador gana el juego, reproduce todas las conjeturas en el mismo orden para ellos No hay una manera fácil de hacer eso sin matrices y pude ver cómo sería útil hacer un seguimiento de los pasos / conjeturas de alguien (presumiendo los derechos de la rapidez con que una persona lo adivinó).


El primer día dé el plan de estudios (lo que aprenderán) y requiera conocimiento básico (cosas que debe saber o no tomar esta clase) y quédese con él. Después de esto, todo lo que puede hacer es enseñar bien (explicar las cosas bien, responder preguntas, dar una broma o dos de vez en cuando, etc.). El cuidado que asiste a la clase, si el campo es aburrido o no, si el estudiante mintió sobre prerrequisitos o no, quién escucha y el otro yada yada está más allá de sus controles. Además, debes esperar que los adultos sean adultos. Si los estudiantes se saltan la clase y la prueba de as, tal vez eso sea lo mejor para ellos. Si se saltan las pruebas de clase y de bomba, quizás estén en el lugar equivocado.

Odiaba cuando los profesores tenían esta mentalidad cuando estaba en la universidad. Ahora como un profesional que trabaja, lo entiendo.


Creo que la mejor manera de mantenerlo interesante es traer ejercicios prácticos e interesantes a lo largo de la teoría. Tomar un enfoque de solución de problemas es excelente (con problemas interesantes, divertidos, emocionantes y del mundo real). Esto requiere que el profesor tenga experiencia práctica, trabaje con nuevas tecnologías y las conozca bastante bien, y no solo enseñe lo que había aprendido hace un par de décadas.

La cuestión es que la programación debe aprenderse con la práctica. El instructor debe enfocarse en motivar a los estudiantes a codificar y tratar de resolver los problemas ellos mismos. Esto se puede hacer asignando un proyecto completo similar a la vida al comienzo del curso y trabajando a través de los subproblemas que ocurren en el proyecto en la clase. De esta manera, los estudiantes tendrán una idea de por qué existe alguna característica específica en el lenguaje de programación y dónde podría ser útil.

Solo un pensamiento. ¡No lo intenté! ;)


Centre los ejercicios de programación en deportes o películas.