h1

Programar no es para todos

09/19/2012

Wizdoc [Icon By Buuf]  Reflexiones.

La mayoría de los buenos programadores no programan porque esperan que se les pague o reciban la adulación del público, sino porque les parece divertido programar.

Linus Torvalds (n. 1969), ingeniero de software finlandés, conocido por iniciar y mantener el desarrollo del “kernel” (en español, núcleo) Linux.

El pasado 12 de Septiembre fuimos a celebrar el Día del Programador – el 256o día del año, ó 2^8 – aunque sea sólo comiendo tortas, ya que todavía nos falta por explorar los alrededores de la oficina porque nuestra empresa cambió de locación la semana pasada. Nuestro equipo de trabajo está conformado por programadores de diferentes lenguajes, incluyendo Java, C/C++ y .NET. La verdad es que he tenido mucha suerte de caer en una empresa con personal como éste, ya que aunque tenemos nuestra ración de problemas, ellos son algunas de las personas más capaces que he conocido en los más de diez años que llevo en este negocio.

Ahora bien, muchos mantienen la teoría de que “se necesita un cierto tipo de mente para aprender a programar, y no todo el mundo puede hacerlo.” No es de extrañarse, ya que con el pasar de los años casi todos hemos sido testigos – y en algunas instancias, hemos sido infortunados copartícipes – de personas que entraron a esta industria más por azar que por una verdadera vocación; gente que sin importar cuántos cursos, coaching y apoyos reciban, invariablemente hacen de las suyas en los proyectos a los que están asignados. Sin embargo, ¿existe algún fundamento científico que valide esta teoría?

En 2006, Saeed Dehnadi y Richard Bornat de la Universidad Middlesex en el Reino Unido, redactaron un estudio donde encontraron que:

Todos los maestros en cursos de programación encuentran en los resultados [de sus evaluaciones] una “joroba doble”. Es como si existieran dos poblaciones: los que pueden [desarrollar programas] y los que no pueden; cada uno con su propia e independiente curva de campana. Casi toda la investigación en la enseñanza y aprendizaje de la programación se ha concentrado en la enseñanza: cambiar el idioma, el área de aplicación, utilizar un IDE y trabajar en la motivación. Nada de esto funciona y la joroba doble persiste. Tenemos un examen que separa la población que puede programar, antes de que el curso siquiera empiece. Podemos desmenuzar la joroba doble. Es probable que [el lector] no lo pueda creer, pero lo hará después de escuchar esta charla. No sabemos exactamente cómo/por qué funciona, pero tenemos algunas buenas teorías.

The camel has two humps (working title). Dehnadi & Bornat. (School of Computing, Middlesex University, UK, 2006).

Resulta que con un sencillo test es posible detectar aquellos individuos que podrán desempeñarse bien en el mundo de la programación incluso antes de que tengan una instrucción formal. Es decir, programar no es algo complejo sino abstracto que requiere cierta manera de pensar – denominado en el mundo de la psicología como un “modelo cognitivo” – que muchos encuentran increíblemente difícil. Por ejemplo, la siguiente pregunta del examen lo dice todo:

Lea el siguiente enunciado y seleccione la respuesta correcta en la siguiente columna:


    int a = 10;
    int b = 20;
    a = b;

Los nuevos valores para a y b son:


[ ] a = 20 b = 0
[ ] a = 20 b = 20
[ ] a = 0 b = 10
[ ] a = 10 b = 10
[ ] a = 30 b = 20
[ ] a = 30 b = 0
[ ] a = 10 b = 30
[ ] a = 0 b = 30
[ ] a = 10 b = 20
[ ] a = 20 b = 10

Esta pregunta puede parecer demasiado sencilla para un programador experimentado, pero sorprendentemente, incluso después de algunas semanas de instrucción, los participantes “no aptos” seguían sin saber cómo asignar correctamente el valor a una variable. El resultado del estudio en general demuestra que la mayoría de los seres humanos no podemos aprender a programar: entre el 30% y el 60% de todos los estudiantes universitarios de sus respectivos departamentos de ciencias de la computación fallan el primer curso de programación. De administrarse como un examen de diagnóstico, es posible separar los tres tipos de estudiantes que tomarán el curso:

• 44% de estudiantes de ciencias de la computación pueden formar un modelo cognitivo de forma consistente, incluso si éste es incorrecto.

• 39% de estudiantes nunca forman un modelo consistente.

• 8% de los estudiantes ni siquiera se tomaron la molestia en contestar las preguntas.

Lo que permite a los profesores enfocarse en los estudiantes que requieren un mayor esfuerzo para aprovechar el curso. Lo más extraño de todo es que de acuerdo a los autores, los tres principales obstáculos en el aprendizaje de la programación, independientemente del lenguaje, son:

1. Asignación de variables y secuencias.
2. Recursión e iteración.
3. Concurrencia.

¡Guau! y yo me quejo de apuntadores y árboles-KDB. De hecho, los resultados parecen acertados ya que si bien recuerdo, la asignatura que redujo mi generación de “Ingeniería en Sistemas Computacionales” de 100 a aproximadamente 30 estudiantes fue ni más ni menos que la de Estructuras de datos, donde estos elementos se usaban continuamente. Todo lo que precedió dicha clase fueron materias de tronco común o de “historia de la computación”. Es más, fue la primera vez que presencié un 1.2 (de una calificación máxima de 10) en un examen parcial. Sobra decirlo, algunos resultados de examen se convirtieron en verdaderos dramas de telenovela.

En fin, reforzando esto, en 2009 los mismos autores publicaron otro artículo donde fueron aún más allá:

El examen determina dos poblaciones en los cursos de introducción a la programación que se desempeñan significativamente diferente. Alrededor de la mitad de los novicios construyen de forma espontánea y aplican consistentemente un modelo mental de ejecución de programas, mientras que la otra mitad es incapaz de construir un modelo o aplicarlo coherentemente… Ahora que tenemos una prueba que comienza a medir la aptitud por la programación, necesitamos un mecanismo estandarizado para medir el desempeño…

Meta-analysis of the effect of consistency on success in early learning of programming. Dehnadi, Bornat & Adams. (School of Engineering and Information Sciences, Middlesex University, UK, 2009).

Sin embargo, vale la pena mencionar que también tiene mucho que ver la manera cómo se enseña la programación: después de todo, dejando de lado una discapacidad o daño cerebral, todos los seres humanos somos fundamentalmente iguales: nuestra biología es la misma y nuestro aprendizaje no depende de factores genéticos sino de diferencias en educación y cómo nuestro ambiente familiar nos prepara en enfrentar el “mundo real”. Tal vez si los maestros dejaran lo abstracto para el final y comenzaran con cosas pequeñas que posean resultados inmediatos, sería posible mejorar el nivel de enseñanza en programación. Por ejemplo, mi primer lenguaje fue LOGO, que en su forma más básica se limita a pequeñas instrucciones para dibujar gráficos de tortuga, con lo que es posible entender cómo programar:

LOGO Environment


Applet de Java que emula el ambiente del lenguaje de programación LOGO, usado para enseñar programación a niños y jóvenes. La tortuga se mueve mediante comandos (FORWARD, RIGHT, LEFT, PENUP, PENDOWN, SETPENCOLOR) para hacer dibujos vectoriales. (Fuente: Berkeley Foundation for Opportunities in Information Technology)

Las instrucciones son tan fáciles de aprender, que LOGO es usado por muchas instituciones para enseñar los fundamentos de la programación. Sólo porque estamos en la universidad no significa que debemos lanzarnos de lleno a Pascal o BASIC, ya que estos lenguajes son mucho más complejos y si uno no tiene la instrucción previa para saber cómo estructurar un programa de computadoras, el resultado será un estudiante de informática o ingeniero en sistemas computacionales que en el tercer semestre se cambie a diseño gráfico. ¿Suena demasiado extremo? De esos 100 que éramos de mi generación, después de haber pasado o reprobado “estructuras de datos”, muchos cambiaron de carrera a ingeniería industrial o administración de hoteles y restaurantes.

Así que, efectivamente hay gente que no puede programar. Tal vez la causa consiste en maneras diferentes de pensar; tal vez sólo se trata de un profesor que no supo cómo enseñar adecuadamente. Lo que sí es cierto es que si la parte más complicada de un proyecto de software es la comunicación/colaboración entre los stakeholders, es una buena idea cerciorarnos que todos sabemos distinguir entre un paso por valor y un paso por referencia, para evitar echarle más leña al fuego.

3 comentarios

  1. Como siempre tus artículos son muy, muy interesantes, no comento mucho pero siempre te leo. Referente al tópico, te comentaré que la secundaría donde estudie un Orientador Educativo (pero de esos que si te orientaban y no eran meros burócratas ocupando una oficina), nos realizó exámenes de actitud y aptitud para orientar nuestras capacidades generales hacia carreras específicas, y fue bastante preciso con la mayoría de mis compañeros (viendoló en retrospectiva 20 años después). En aquél entonces tu servidor tuvo 3 maestros de matemáticas distintos (2 excelentes uno verdaderamente fatal!), aún con el maestro de matemáticas que no era muy pedágogico, el amor a las matemáticas no cesó en mi persona, y claramente noté y notó el Orientador una tendencia a las ingenierías o economía… años después tuve un dilema entre estas dos ramas para definir mi area de estudio… ganó la ingeniería😀, me volví desarrollador por amor al arte, decía Hugo Sánchez :”Me divierte jugar… y si me pagan que mejor!”, parafraseandolo…-Me gusta programar (analizar, diseñar, determinar, codificar…) y si me pagan… que mejor!”, si me gusta, me extasía y en tono de broma a veces comentos -es una especie de orgasmo intelectual- (es broma he? no se piense que estoy diciendo que somos superdotados intelectualmente, solo que nos fascina). No sé que tanto a alguien que no le atraiga la matemática pueda programar, pero creo que un pilar en el campo de desarrollo.
    Saludos y espero con ansias la siguiente entrada del Bolog.


  2. Hola me gustaría saber cuál es tu carrera profesional, y además solicitarte que me respondas una entrevista pequeña, te la enviaría por correo, me interesan mucho tus artículos y ahora tengo un trabajo donde hay que hacer una entrevista a un profesional para identificar prácticas predominantes y emergentes de la carrera, yo estudio Ingeniería en Sistemas Computacionales, así que si pudieses hacerlo estaría muy agradecido. Bueno gracias por el blog me ha servido mucho en trabajos y de entretenimiento.


    • Seguro; soy parte de una generación 1996-2000 de Ingeniería en Sistemas Computacionales. Te acabo de enviar un correo a tu dirección. Saludos.



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: