Tutoría a estudiantes que luchan con los conceptos básicos en C ++ [cerrado]

26

Estoy dando clases particulares a algunos estudiantes que tienen problemas importantes para aprender los conceptos básicos de su primer lenguaje de programación: C ++. He conocido a muchos estudiantes excelentes y brillantes que han reprobado o abandonado su primer curso de CS. Todas las personas a las que estoy dando tutoría dan una descripción similar de su experiencia en clase: el instructor avanza demasiado rápido, nada en las conferencias tiene sentido, et al. Antes de esta clase de CS, la mayoría de estos estudiantes con dificultades no habían expresado ningún interés en las computadoras como algo más que procesadores de texto, navegadores web o alguna otra forma de entretenimiento. La computadora es una caja negra que funciona, entonces, ¿por qué meterse con ella?

Mi mejor conjetura es que están teniendo problemas para conectar las abstracciones de la informática con conceptos familiares. Es decir, estos estudiantes pueden saber aprender matemáticas, biología o física, pero esas técnicas no funcionan cuando se trata de programación.

¿Alguien tiene alguna sugerencia o consejo? Los estudiantes a los que estoy ayudando no merecen reprobar esta clase. Está claro que el instructor no tiene en cuenta el estilo de aprendizaje de estos estudiantes. Es decir, el instructor no está fallando a sus alumnos.

AdmCrunch
fuente
2
Comentaristas: si tiene una respuesta, déjela como respuesta: no la deje como comentario. Si su respuesta ya ha sido agregada, vote por ella. Si desea discutir el tema de esta pregunta con otros, use el chat .
1
No? Desde mi experiencia, hay suficientes personas que programan y no

Respuestas:

42

Hay algunas cosas con las que prácticamente todos los principiantes luchan. Los estudiantes necesitan saber cómo leer el código antes de que puedan aprender a escribir el código.

  • La naturaleza secuencial de los lenguajes imperativos. Las personas tienen problemas para comprender que las funciones se ejecutan en secuencia, un elemento a la vez, como una receta. Una forma de superar esto es mostrar algún código que funcione a través de un depurador.
  • El operador de asignación ( =) en lenguajes de estilo C es extremadamente engañoso. Debe explicar con mucho cuidado que a = 5significa "asignar 5 a la variable a, no " a es igual a 5 ".
  • Para los principiantes, es seguro describir funciones como bloques de código estructurados a los que pueden saltar otras funciones. Además, los principiantes tienen problemas para comprender que en C ++, los argumentos de la función se identifican por orden, no por nombre.
  • La mayoría de los lenguajes de programación imperativos tienen algunos componentes declarativos y algunos componentes de procedimiento, y C ++ no es una excepción. Asegúrese de que el alumno comprenda que algunas partes del código describen la estructura del programa y otras partes (funciones) describen lo que el programa debe hacer.
  • Pasar por un programa con el depurador es una herramienta de enseñanza extremadamente importante y a menudo descuidada .
  • Las expresiones tienen tipos . 3+3es un entero, 3.5 + 3es un doble, "3" + "3"(en C #) es una cadena, x == 5 * 3 + 25es un booleano (o entero en C ++). Dedique mucho tiempo para asegurarse de que el estudiante esté completamente cómodo con esta noción.
  • El alcance variable es algo que los principiantes se confunden todo el tiempo. Explique al alumno cómo funciona el alcance y asegúrese de que sepa que un xdefinido en un alcance es diferente de un xdefinido en otro alcance.
  • Se hace referencia a cada variable al menos tres veces en su vida útil: declaración, asignación (a menudo realizada en la misma línea que la declaración), consumo. Si falta alguno de estos, entonces hay un error conceptual en alguna parte. Por la misma razón, si está analizando un programa de trabajo, siempre puede buscar estas tres cosas en el código para descubrir el propósito de una variable.
  • forlos bucles no deben enseñarse hasta que se den ejemplos adecuados de iteración usando whilebucles. La sintaxis abreviada es confusa y deja a los estudiantes preguntándose por qué no pueden simplemente usar whilebucles. Tener una hoja de trucos que describa un forciclo en términos de un whileciclo puede ser útil.
  • Las matrices y los punteros son bastante fáciles de enseñar, pero una pesadilla para aprender. En otras palabras, hasta que haga clic, la práctica es importante.
  • La idea de que el código es texto y que un programa compilado es de hecho un archivo es difícil de alcanzar para algunos principiantes. Asegúrese de mostrarles los archivos .cpp, .h y binarios en el shell.

Los componentes OOP de C ++ son una bestia completamente diferente, y espero que el instructor no llegue allí, porque OOP se enseña mejor usando lenguajes que fueron diseñados desde cero para ser OOP. En mi experiencia, enseñar OOP a través de C ++ nunca ha ido bien.

Rei Miyasaka
fuente
2
¿"La gente tiene problemas para entender que las funciones se ejecutan en secuencia"? Creo que eso es exactamente con lo que prácticamente nadie tiene problemas (excepto, tal vez, con personas que ya han aprendido un lenguaje funcional antes de comenzar el procedimiento). Pero estoy de acuerdo con todo lo que dices.
Leftaroundabout
3
+1 por avanzar con el depurador, para que tengan una idea de la diferencia entre el programa en sí y la ejecución del mismo.
Mike Dunlavey
44
@leftaroundabout Te sorprenderías. La matemática es principalmente declarativa, por lo que los lenguajes imperativos pueden desanimar a cualquiera que haya aprendido álgebra.
Rei Miyasaka
2
Esta respuesta parece ser solo un poco de "recitar conceptos". Los conceptos son indudablemente correctos y sin duda importantes, pero enseñar de esta manera es un poco como tratar de enseñar a alguien a conducir al ignorar las reglas del camino.
Riwalk
@ Stargazer712 Todos aprenden las reglas del camino antes de que se les permita probar el examen práctico. Podría presentar ideas esponjosas de trazo amplio como "la práctica es clave" o "ser creativo" o "pensar lógicamente", pero presumiblemente esas cosas son bastante obvias para cualquier instructor, así como para la mayoría de los estudiantes. También se podrían enseñar cosas abstractas como matemática discreta o teoría del lenguaje como precursor de la programación, pero eso solo se vuelve importante cuando la mecánica es tan compleja que los problemas no se pueden resolver solo por intuición. Tarde o temprano, las personas deben dejar de ser zen y comenzar a enseñar contenido .
Rei Miyasaka
19

¿Has enseñado programación antes?

Enseñé programación a estudiantes de CS y no CS durante cuatro años. El primer semestre, mi experiencia fue como la tuya, hasta que aprendí algunas cosas.

Lo que me pareció vaciamente simple no fue nada simple para los principiantes.

Independientemente del idioma, debe establecer un marco mental: cosas tan obvias que ni siquiera se da cuenta de que las conoce, como:

  • Las computadoras solo hacen una cosa a la vez. (Cualquiera que diga que tiene paralelismo y tuberías, vete. Vuelve cuando los estudiantes sepan algo). Las computadoras solo pueden hacer un pequeño número de cosas diferentes, y no pueden comenzar a dar un paso hasta que el anterior esté terminado. Solo digo esto, porque las computadoras parecen hacer tantas cosas, y las hacen instantáneamente, que para un principiante parece que hacen todo a la vez, y también le leen la mente.

  • Las variables son importantes. Es esencial comprender que el nombre de una variable y su contenido en tiempo de ejecución son dos cosas completamente diferentes. Los principiantes luchan con esto. Si digo "Escribe un programa para ingresar tu nombre y luego te saluda", necesitan darse cuenta de que necesitan una variable para mantener su nombre, y tienen que pensar un nombre para la variable, y se sienten tentados nombrarlo después de sí mismos y preguntarse qué significa "entrada".

  • Hay una gran diferencia entre el momento en que escribe / edita el programa y el momento en que se ejecuta. Durante sus primeros ejercicios, deben recordar esto con bastante frecuencia.

El lenguaje que usé fue BASIC, porque es muy simple para principiantes. No es difícil pasar a otros idiomas después de que hayan desarrollado un conjunto de habilidades básicas de programación.

A menudo escribíamos un programa en la pizarra y luego "jugabamos a la computadora". Es decir, coloque una X al lado de la declaración actual, hágalo manualmente, luego mueva la X a la siguiente declaración. Las variables eran rectángulos en el tablero, donde escribiríamos los contenidos actuales. Cuando sucedía una tarea, la borrábamos y poníamos el nuevo valor.

Un truco que desarrollé fue una computadora decimal simulada, con 1000 ubicaciones de memoria, cada una capaz de contener un número de 4 dígitos. Hubo un pequeño conjunto de "códigos de operación", como cargar el acumulador, agregar, almacenar, saltar, etc. Me gustaría que escribieran pequeños programas en este "lenguaje de máquina" y luego un solo paso para verlo funcionando. Luego, más tarde, conceptos como variables, saltos, etc., son mucho más fáciles de explicar.

Espero que ayude.

Mike Dunlavey
fuente
Me gusta esa idea de computadora simulada. ¿Tiene un lenguaje formal para ello o simplemente discute las ideas en pseudocódigo / inglés simple?
Rei Miyasaka
@Rei: Escribí (en BASIC) un simulador llamado Simple. Todo era interfaz de teclado. El usuario podría ingresar valores en la "memoria"; entonces podrían dar un solo paso y examinar el acumulador y la memoria en cada punto, si quisieran. Creo que esto fue realmente importante porque los hizo hacerlo , no solo hablar de eso.
Mike Dunlavey
Ah, está bien. Gracias, debería intentar algo así.
Rei Miyasaka
Esta debería ser la respuesta # 1 en mi opinión.
Riwalk
12

En mi opinión, C ++ es una exageración como primer idioma.

Si yo fuera usted, y tuviera suficiente tiempo a mano, me gustaría introducir los conceptos de programación y CS utilizando Python (o similar).

Cuando los conceptos son claros, es decir, cuando se sienten cómodos con las estructuras de datos básicas, la indirección, los algoritmos básicos, etc., introduciré lentamente C ++ y podrán relacionarse muy rápidamente con lo que ya habrían aprendido.

Yati Sagade
fuente
2
Estoy de acuerdo, pero los profesores generalmente no tienen el derecho de elegir qué idioma enseñar, y mucho menos los TA.
Rei Miyasaka
44
No estoy de acuerdo con Python. Pasé por mi primera clase CS 101 en C ++ y luego me cambié a una escuela que enseñaba CS 101 en Python. Los estudiantes de Python estaban TAN confundidos incluso en lo básico cuando todos tomamos la misma clase CS 201 ... Pero todos los estudiantes de C ++ sobresalieron.
OghmaOsiris
@OghmaOsiris, Francamente, no sé lo suficiente sobre Python, pero puede ser lo que viste podría haber sido simplemente la manifestación de un sesgo de autoselección. Después de todo, C ++ es aterrador para algunos estudiantes (especialmente para los estudiantes más inexpertos en programación).
Stephan Branczyk
@Oghma ¿Cuál fue la clase 201? Si es algo de bajo nivel, probablemente debería ser su propia rama con C como requisito previo.
Rei Miyasaka
1
@OghmaOsiris: Hmmm, tengo que estar en desacuerdo, bueno, no estar en desacuerdo, compartir una experiencia diferente en mi universidad, el cambio a Python como primer idioma ha demostrado ser muy útil hasta donde sé (el primero fue Java no C ++). No creo que las experiencias individuales cuenten como prueba de que una es mejor que la otra, que es una guerra de llamas sin fin. Yo podría argumentar a pesar de que Python podría ser un gran lenguaje de programación para empezar, ya que no recibe en su camino, lo que realmente hace que una mejor que la mayoría de los lenguajes de programación, que recibe muchos estudiantes ....
Trufa
4

Esto es lo que recomendaría:

  1. Dales todos los detalles que necesitan para resolverlo
  2. Anímalos a tratar de entender los detalles.
  3. Asegúrese de que tengan los detalles almacenados en forma compacta cuando los necesiten

Básicamente, le aconsejaría que cree un solo papel a4 que tenga todos los detalles necesarios requeridos. Algún tipo de manual de referencia que tiene todos los detalles. Algunos libros también pueden ayudar, por ejemplo, el libro "El lenguaje de programación C" ayudó enormemente porque tenía todos los detalles necesarios disponibles en forma compacta. La compresión de la información es parte necesaria en la creación del papel a4 que contiene todos los detalles.

tp1
fuente
3

La programación es sustancialmente diferente de los otros dominios comunes que encuentra un estudiante. Muchos estudiantes antes de la universidad han tenido éxito simplemente prestando atención en clase y tal vez haciendo algunas tareas con problemas fáciles y las respuestas al final del libro. Se trata más de memorizar procesos, luego de crearlos. También es la primera vez que muchos estudiantes obtienen la respuesta incorrecta repetidamente (errores de sintaxis, errores lógicos, fallas seg, etc.). Esto puede agotar la motivación de los estudiantes al trabajar en programas.

Para saber realmente qué está pasando con la programación, deberán PRACTICAR MUCHO. Una técnica que a menudo se pasa por alto es hacer que escriban el código psuedo en cualquier idioma nativo. Pídales que sigan expandiendo eso hasta que tengan una solución bastante detallada al problema. Entonces es cuestión de traducir eso en código real.

Peter Smith
fuente
3

Cuando estaba en la universidad, solía ser tutor para la introducción al curso de programación, entre otros cursos. El problema que está describiendo no es infrecuente. Dependiendo de cuál sea su rol específico, puede tener diferentes enfoques que desee adoptar.

Primero, si este es un problema generalizado que afecta a partes significativas de los estudiantes en la clase, si tiene acceso para hacerlo, me acercaría al profesor que enseña el curso con comentarios específicos sobre los conceptos que los estudiantes no están entendiendo, para que él o ella puede incorporar una revisión adicional de ese material a medida que aparece nuevamente en el término o mejorar el plan de estudios para futuros términos.

Si enseña una sección de discusión para el curso además de su tiempo de laboratorio, sería un momento maravilloso para exponer las cosas que eran confusas en la conferencia y ayudar a hacerlas más concretas y asegurarse de que se entiendan todos los fundamentos.

Si el único momento en que trabaja con estos estudiantes es durante su tiempo en el laboratorio de tutoría, aún puede usar este tiempo para enseñarles a los estudiantes, uno a uno, o algunos a la vez, los componentes conceptuales que necesitan para comprender y completar su tarea.

Pueden sentirse tan perdidos en clase que ni siquiera saben dónde detenerse y hacer preguntas. Si ese es el caso, vuelva a lo básico con ellos. ¿Dónde estaban en el curso la última vez que entendieron lo que estaba pasando? Si no están seguros, o "nunca" entendieron, puede que tenga que volver al principio para explicar hola mundo, enseñándoles cosas como qué es una variable, cómo la computadora toma su lista de "instrucciones" e intenta hazlos en orden, pero la computadora no es tan "inteligente" como nosotros, por lo que debes ser muy literal y decir las cosas exactamente para que la computadora las entienda, etc.

En realidad, ese es un punto de lucha y frustración que he visto con bastante frecuencia en los cursos de programación no especializados. Los estudiantes escriben un código. Parece "correcto", pero luego van a compilarlo y da un error, un error muy críptico. Y no tienen idea de qué tiene de malo. Y mira su código por horas. Luego, finalmente descubrí que era algo que parece trivial, como un punto y coma faltante o un aparato ortopédico en el lugar equivocado. Luego van a compilarlo nuevamente, y todavía hay un error, es otra cosa. Deletrearon un nombre de variable de manera diferente la segunda vez que lo usaron. Y así. Entonces le piden ayuda a un amigo o tutor o alguien, y pueden responderles "oh, simplemente agreguen esto y luego funcionará". Entonces su experiencia es que la programación es un poco "misteriosa"

Esa es un área como tutor, donde tienes mucho espacio para ayudar. Dependiendo de su nivel de frustración, podría tener diferentes enfoques para ayudarlos a descubrir por qué su código no funciona. Si de alguna manera lo están entendiendo, podría darles pistas e intentar ayudarlos a resolverlo por su cuenta. Pero si están al final de su cuerda, listos para rendirse frustrados, a menudo les daré un par de respuestas gratuitas, y luego intentaré al menos hacerles preguntas como "¿Entienden por qué este cambio solucionó su programa? ? "

Para algunos estudiantes, especialmente los que no son mayores, pueden no tener la atención metódica a los detalles necesarios para ser un buen programador o disfrutar de la programación. Puede sostenerlos a través de estrategias para ayudarlos a prestar atención a los detalles y ser lo suficientemente metódico para resolver los problemas, incluso si es un desafío para ellos.

Pero anal-retentivo sobre los estudiantes que sangran su código "correctamente"; con frecuencia, los programadores principiantes crean problemas con el anidamiento y el alcance porque tienen llaves que no coinciden o similares porque no prestan atención a lo que está anidado bajo qué. Dales una lista de verificación de "cosas para verificar cuando tu programa no compila", como sangrar todo el código correctamente y asegúrate de que las llaves coincidan, asegúrate de que todas las líneas terminen en punto y coma, especialmente alrededor del número de línea donde se muestra el primer error arriba, etc.

Enséñeles a compilar temprano y compilar a menudo. Escriba el código esqueleto mínimo (digamos, hola mundo), compile / pruebe. Agregue algunas líneas, compile nuevamente. Es mucho más fácil encontrar errores si solo está mirando un pequeño grupo de cambios, no uno grande.

Ayúdelos a aprender cómo dividir un problema en problemas solucionables más pequeños. Esto es lo mismo que hacemos como programadores profesionales para resolver problemas mucho más difíciles que no sabemos cómo resolver. Sigue dividiéndolo en pedazos hasta que llega a algo que sabe cómo resolver o puede investigar un poco para aprender cómo resolverlo. "¿Qué pasos necesitarías tomar para llegar a una solución que funcione?" Bueno, primero necesitarías un código esqueleto (hola mundo). ¿Sabes como hacer esto? Sí, genial, así que cuando hayamos terminado de hablar, ¡puedes comenzar haciendo eso! Entonces necesita leer un archivo como entrada. ¿Recuerdas haber leído sobre eso en el capítulo 4? ¿Realmente no? ¿Por qué no echas un vistazo a eso después de poner en marcha hello world, y ver qué tan cerca puedes llegar a hacer que funcione y luego volver a llamarme y yo? Te ayudaré un poco más cuando te quedes atrapado en eso. Es posible que las primeras veces solo necesite hacer una lista numerada de los pasos necesarios para resolver el problema, para que puedan aprender, por ejemplo, cómo descomponer el problema.

Si están obteniendo parte del material en clase, pero no todo, aliéntelos a hacer preguntas en clase, porque nueve de cada diez veces, no son el único estudiante que no comprende, y el profesor probablemente solo pasó por alto algo importante.

Si pasan "horas" mirando un error pero no lo descifran, eso es una pérdida de tiempo, no están aprendiendo mucho de él. A menudo, los errores son problemas de comprensión, y se trata de encontrar la visión correcta para resolverlo, y es posible que no tengan una habilidad especial para ese tipo de problemas. Sugiera otros enfoques generales para tomar cuando se atascan: pida ayuda a otro amigo en la clase (conozca a algunos compañeros de clase si es necesario), comience su tarea con anticipación para que tengan tiempo de detenerse y luego entren el tutor del laboratorio y hacer preguntas durante el horario de atención, o ir a las horas de oficina del profesor. Si están acostumbrados a abarrotar, lo que funciona bien para los sujetos de memorización, se encontrarán con un muro de frustración cuando ' se enfrenta a una programación que trata más sobre la resolución de problemas que la memorización. Muéstreles cómo buscar ejemplos de sintaxis en su libro de texto, stackoverflow, etc. Aliéntelos a publicar una pregunta en un foro privado de preguntas de clase si existe.

Enséñeles cómo reducir dónde deja de funcionar el código. Comenta cosas hasta que vuelvas a algo que se ejecuta, y luego agrega cosas lentamente hasta que vuelvas a tener ese defecto.

Muchas de estas ideas podrían convertirse en folletos si surgen mucho. Las estrategias suelen ser la parte que los profesores pasan por alto: pasan su tiempo en la sintaxis, la semántica de cómo escribir bucles, matrices, E / S, etc. Pero no dedican suficiente tiempo a "qué hago cuando intento ejecutar mi código y simplemente no se compila o se bloquea en mí "

Cuando se trata de cosas conceptuales, especialmente fundamentos, como "¿qué es una variable" o "qué es un bucle?" no entender eso les impedirá mantenerse al día con el resto del curso. En un curso basado en conferencias, el profesor puede no tener tiempo para responder todas las preguntas o ayudar a que se apague la bombilla de cada estudiante. Y eso es parte de por qué los tutores son tan importantes para aprender a programar. Es posible que necesiten instrucción individualizada con analogías adicionales para concretar un tema en particular.

Como estás enseñando en C ++, imagino que las clases surgen como un tema abstracto que algunos estudiantes luchan por "entender". A menudo, la abstracción de clases se enseña con ejemplos correspondientes a algún objeto aleatorio del mundo real, como un "cajero automático", y se hacen analogías con el objeto del mundo real. Es posible que tenga variables para realizar un seguimiento de cuánto dinero hay dentro, tiene métodos, que son como reglas que le dicen a la máquina de cajero automático cómo responder a condiciones particulares, etc. , y otros estudiantes captan mejor uno diferente.

Siempre que sea posible, dibuja para ellos. Como un diagrama de secuencia de lo que sucede con el tiempo para ayudarlos a ver el panorama general de lo que hace el código que están escribiendo. El usuario hace clic en este botón. Entonces el programa debería responder haciendo x, y y z. Dibuje una matriz como un montón de apartados postales en la oficina de correos que cada uno puede contener solo un número, y punteros como flechas que apuntan a la "dirección" en el frente de la casilla. Etc.

Jessica Brown
fuente
2

De todas las maravillosas opciones para los lenguajes de programación, esta universidad usa C ++ como su clase de introducción de CS para estudiantes que no son CS. En manos de un instructor talentoso, puede ser remotamente concebible, pero ¿por qué hacerlo tan difícil?

Cuando aprendí "Pascal" en mi clase de intro-CS de la universidad, pasamos las primeras 3 semanas trabajando con " Karel el robot ". Este era un entorno de programación similar al logotipo de sandbox muy simple donde todos los conceptos básicos (incluida la recursividad) se exploraron a fondo antes de hacerlo en Pascal. En "Karel the robot", controlas un robot en el espacio 2D utilizando un pequeño conjunto de comandos simples. Esto les brinda a los estudiantes una base concreta útil sobre la que pueden recurrir para lo que sucederá después.

¿Quizás hay ahora lenguajes de programación de instrucción más modernos que cumplen el rol de "Karel the Robot"? Sin embargo, probablemente sea demasiado tarde para tus alumnos ahora.

Angelo
fuente
Teníamos un programa similar llamado Alice.
OghmaOsiris
Esta es Alice: " en.wikipedia.org/wiki/Alice_(software) "
OghmaOsiris
@OghmaOsiris El enlace de Alice está roto. El final "se agregó a la url.
Zoot
Sí, sin él se cortó el final ')'.
OghmaOsiris
2

Además de lo que se dijo, supongo que, como principiantes, solo necesitan rascar la superficie, así que adapte su plan de estudios en consecuencia para evitar cosas complejas.

0-darles un problema simple (digamos evaluar una expresión).

1-dales tiempo para resolverlo.

2-darles la respuesta.

3-ve a través de la respuesta línea por línea

4-pídales que comparen su respuesta con su intento

5-pídales que deriven la lección de este problema

6-agregue un paso más al MISMO problema, digamos una condición que requiere una declaración IF

7-repita la tarea anterior en varios problemas. Para entonces habrían comprendido los conceptos básicos del lenguaje y cómo usar el entorno. El estaría listo para lo que viene después.

También,

-tienen un problema simple adicional para que puedan probar en casa cada 2 clases más o menos

Comprometerse con cada alumno para ver cuál es el punto que le impide avanzar

-proporcionar material de referencia fácil, olvidar temas complejos y libros complejos

-Observe sus comentarios con frecuencia y úselos

-pídales que se preparen para el próximo tema antes de que vengan a clase

Ninguna posibilidad
fuente
2

Lo que me ayudó cuando pasé por CS 101 fue aprender la lógica incluso antes de mirar el código. Revisamos tablas de verdad y cálculos preposicionales para comenzar a pensar "esto es verdadero o falso" y no "esto es igual o igual".

Eso fue justo cuando todo hizo clic para mí. Una vez que descubrí que la programación es básicamente manipular valores verdaderos / falsos en su núcleo, todo se volvió relativamente simple.

Y esto hizo que no importara qué idioma estaba usando, la lógica es la misma en todas partes. La sintaxis puede ser confusa, pero puedo decir cosas como "Ok, en Obj CI enviar mensajes a clases como esta y en C ++ los mensajes se enviaron de esta manera de otra manera. Pero el algoritmo no ha cambiado en absoluto". etc.

OghmaOsiris
fuente
2

Hay un artículo de ACM o IEEE en algún lugar que detalla algunos de los por qué los principiantes (incluso los graduados de CS que comienzan en el campo) deben sentarse detrás de un programador sénior y verlos codificar un problema.

Los profesionales a menudo se emparejan por problemas difíciles. A los estudiantes se les dice con demasiada frecuencia que no lo hagan. Ventajas del emparejamiento (turnándose en el teclado): 1. Al alumno se le dice lo que está haciendo mal de inmediato. Retroalimentacion instantanea. 2. Cuando el alumno mira al profesor, el alumno capta las cosas que el profesor nunca hubiera pensado señalar.

En lugar de dejar que un estudiante desarrolle malas prácticas, se les corta de raíz. (Daría la vuelta al # 1 con el # 2 aquí y dejaría que el estudiante mire al Instructor / TA PRIMERO )

Enseñar CS con un conjunto estático de diapositivas de PowerPoint no se presta bien al proceso temporal de escribir un programa. (De acuerdo, hay trucos que puedes hacer con el crecimiento de las funciones línea por línea, pero generalmente son incómodas).

Los alumnos necesitan saber dónde comenzar a escribir y dónde parar y compilar. Nuestros cerebros están en su mayoría conectados para leer de izquierda a derecha de arriba a abajo, ¡pero un programa es como un todo, elige tu propio libro de aventuras en una sola página!

Con demasiada frecuencia, un principiante copiará un programa completo y luego lo compilará. Incluso un profesional podría darle una primera oportunidad de esa manera, antes de darse cuenta de que deberían haber dejado todas las funciones vacías y compilar el programa, y ​​luego agregarlo iterativamente a un esqueleto funcional.

Además, está relacionada la ridícula idea de que la CS debería enseñarse sin una computadora y solo lápiz y papel. Me pregunto cuántos profesionales de programación empleados realmente piensan que esta es la mejor manera, o si es solo lo que hacen los instructores de CS porque a ellos mismos no les gusta trabajar con computadoras. Cualquier intento de eliminar una computadora de la imagen es muy malo. Hacerlo hace que la programación sea menos divertida y menos interactiva de lo que debería ser. Ya pasamos los días de ingresar datos en una tarjeta perforada y esperar pacientemente. Los desarrolladores profesionales de hoy son fanáticos de la gratificación instantánea. Afortunadamente, la mayoría de los estudiantes también lo son.

Obviamente, el dibujo de bonitos diseños con lápiz y papel antes y durante el proceso de desarrollo es una herramienta poderosa tanto para programadores profesionales como principiantes. ¡Esto como el tiempo de "manos en el teclado" también se debe gastar emparejamiento! Quizás aquí tenga sentido dejar que el estudiante intente la primera ronda antes de mirar al maestro, aunque incluso con esto probablemente valga la pena ver el proceso de pensamiento real del maestro.

Por último, las teclas de acceso rápido y los trucos de edición que emplea el desarrollador profesional no son "ruido" para el aprendizaje del estudiante. Lo más importante, involucran e interesan al estudiante. En segundo lugar, crean conciencia sobre las necesidades comunes de desarrollo. Además, las prácticas más básicas son a menudo fáciles de ejecutar pero inicialmente no son obvias. Un joven estudiante de carpintería puede aprender fácilmente cómo quitar un clavo con la garra de un martillo, pero en la mayoría de los casos primero se le debe decir que para eso es la garra. Algunas cosas extremadamente fáciles de hacer no son triviales de aprender sin que se les enseñe. Incluso los desarrolladores profesionales se olvidan de estos "trucos" todo el tiempo, y se benefician de las herramientas de refactorización como resharper para eliminar código redundante o no alcanzado, etc.

David
fuente
1
Por cierto, si alguien pudiera señalarme el título de ese artículo, ¡lo agradecería!
David
2

La programación informática es a menudo uno de los primeros cursos en los que se requiere la habilidad cognitiva de síntesis para aprobar. Esa habilidad es muy difícil de impartir a alguien más. Puede explicar todos los componentes que tienen disponibles y cómo funcionan. Puede dar una multitud de ejemplos de cómo otras personas han usado la síntesis para combinar esos componentes en un todo más útil, pero solo hay mucho que puede hacer sin que algo "haga clic" en la mente del alumno.

En mi experiencia, es la habilidad de síntesis lo que con mayor frecuencia elude a las personas que no "entienden" la programación. Tienen una comprensión perfecta de las partes, como variables, funciones y bucles, pero hacen preguntas como: "Entiendo por qué funciona, pero ¿cómo sabías que necesitabas poner un bucle allí?" Simplemente tienes que practicar hasta que lo consigas.

Karl Bielefeldt
fuente
2

Para citar mal a Aaron Hillegass, recuérdeles que no son estúpidos, es difícil. La programación es difícil de entrenar para su mente, es una forma completamente diferente de pensar, y si bien pueden estar luchando con los conceptos básicos, probablemente sean muy conscientes de que son y los hará bastante abatidos.

Digo esto como alguien que también reprobó su curso de CS de primer año, había programado mucho antes y obtuve todos los conceptos (VB, sí, bebé), pero C ++ simplemente no me hizo clic. Terminé volviendo a lo básico y trabajando desde allí, luego hizo clic, pero si alguien hubiera dicho "No eres un idiota, esto es difícil", me habría hecho la vida más fácil.

Nicholas Smith
fuente
0

Dijiste que "estos estudiantes pueden saber aprender matemáticas, biología o física, pero esas técnicas no funcionan cuando se trata de programación".

Hay una razón para esto, la programación requiere algo que esas otras disciplinas no necesariamente requieren: creatividad y ... fantasía . La capacidad de "imaginar cosas en el trabajo". Personalmente, encontré que tal requisito está más presente (por supuesto, con todas las excepciones debidas) de personas que vienen de la escuela técnica (electrónica y electromecánica en particular: tienen que "imaginar los flujos eléctricos y cómo se controlan entre sí", ya que no pueden ¡Véalos!) que de la "ciencia pura" (donde todo parece cambiar las matemáticas).

Para estos últimos casos, la "cognición visual" debe ser ayudada. Es importante no solo centrarse en la noción y el texto (el tipo -> compilar -> mirar los errores no puede funcionar si no puede "leer" los errores) sino proporcionar una forma de visualizar las cosas, ya sea en tiempo de diseño ( simulando lo que pasa en la máquina: prepárese con una pizarra blanca y un juego de post-it de color) y en el momento de la ejecución.

Para que esta última parte tenga éxito, debe darse una noción esencial de los sistemas operativos y "cómo los programas se ejecutan en una máquina" (y qué es esa máquina en realidad). Y se debe dar un IDE no intimidante. Normalmente tengo un "Bloque de código personalizado" con muchas cosas eliminadas para "no distraer". La noción de proyecto hecho de fuentes para generar objetos para vincular con la biblioteca debe darse ANTES de comenzar a hablar sobre un lenguaje.

El hello world tradicional de C ++ requiere un punto de entrada y un dispositivo de salida. El estudiante ya debe estar familiarizado con eso. El éxito de este tipo de cursos depende de los primeros días. Debe estimular una visualización de lo que sucede dentro de una computadora para que puedan comprender qué es la programación.
El resto es sintaxis (ciencia) y abstracción (fantasía).

Emilio Garavaglia
fuente