C como un lenguaje para aprender a programar

Hace algún tiempo, conversaba con un colega de mi Universidad sobre la forma en que se enseña a programar a los estudiantes.

En mi Universidad, el lenguaje de programación utilizado para enseñar a programar es Java. Como parte de nuestra conversación, le comentaba a mi colega las desventajas que personalmente percibía en usar dicho lenguaje con el propósito de enseñar conceptos básicos de programación y por qué personalmente pienso que no logra compararse contra enseñar un lenguaje como C.

Este artículo intenta recapitular los puntos más interesantes de dicha conversación. Si bien me enfoco en Java, lo dicho aquí perfectamente aplica a C# también.

Supongamos que eres un profesor de Primero, enseñando los fundamentos de la programación, y yo soy uno de tus alumnos.

¿Cómo dictarías este curso? Pues, si te pareces en algo a mi, probablemente en la primer clase de Laboratorio escribirías un clásico programa “Hola Mundo” en el pizarrón y le pedirías a tus alumnos que lo prueben.

Ahora, si estás usando Java, lo primero que deberías hacer es pedirnos a los estudiantes que iniciemos nuestros “IDEs”, creemos una nueva “clase” y copiemos el programa del pizarrón en un nuevo “método”…

Yo, como tu estudiante, quien jamás ví nada de programación en el Liceo, probablemente no sepa de qué me estás hablando tan pronto mencionaste la palabra “IDE”. Tu, como profesor del curso, pacientemente me explicarías que los “IDEs” se utilizan para escribir y ejecutar programas en una computadora y que lo más probable sea que tenga que usar un “IDE” cada vez que vaya a hacer un programa.

Quizás, como estudiante, acepte tu explicación o, quizás, pregunte por qué es que jamás había escuchado de un “IDE” cuando utilizo programas de todo tipo en mi computadora desde siempre. Si tienes poca suerte y te realizo la segunda pregunta, ¡BAM! instantáneamente tendrás que explicarme la diferencia entre el “desarrollar un programa” y “ponerlo en producción”, o bien, pedirme que “haga un acto de fé en que las cosas son así” y que me limite a pensar en el ejemplo en el pizarrón.

Ok… en cualquiera de los dos casos no entiendo qué es un “IDE”, ni por qué lo necesito, ni por qué estamos usando éste y no otro, pero bueno, sigamos adelante. Este es un curso de programación, después de todo, no de “IDEs”.

Bien, tu dijiste que cree una nueva “clase” y copie el programa del pizarrón en un “método”. ¿Podrías explicarme bien qué es una “clase” y qué es un “método”?

Oops… Como profesor ahora sí que estás en problemas. Claramente estos son conceptos de Programación Orientada a Objetos y, ciertamente, no quieres comenzar a estudiar este tipo de cosas antes de que tus alumnos ni siquiera hayan escrito su primer programa “Hola Mundo”. Lo único que puedes hacer en este caso es, nuevamente, pedirle a tus estudiantes que confíen en tí ya que “las cosas son así en Java”.

Bien, como tu estudiante, nuevamente acepto ciegamente lo que me dices (sin tener idea de qué es nada de lo que estoy haciendo ni por qué) y finalmente mi programa se parece a lo siguiente:

public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.println("Hello, world!");
    }
}

Presiono el botón de “Play” en mi “IDE” y funciona. Todo parece estar en orden. Todo excepto un detalle: ¿cuántos conceptos en este pequeño fragmento de código piensas que hay, de los cuales tus estudiantes no tenemos ni idea de qué son o por qué están ahí? Pues, probablemente de todo esto no solo comprendamos muy poquito, sino que además ya estemos dudando de si seremos capaces de escribir siquiera un programa por nuestra cuenta, sin ayuda del Profesor.

La peor parte es que, de todos los conceptos que hay dentro de este fragmento de código, ¿cuántos son realmente razonables de ser explicados en un curso de Programación 1? ¿Solo println, quizás?

¿Por qué? Pues porque para poder explicar qué es una “clase”, qué es un “método” y qué son: “public”, “static”, “String[]”, “System” y “out”, tengas que comenzar a enseñar conceptos de POO desde el primer día de clase y realmente no quieres hacer eso, por dos motivos: 1) terminarás confundiendo a todos tus estudiantes y 2) la mayoría de todos esos conceptos no resultan útiles para para este curso en absoluto!

Entonces… si enseñar de esta manera parece tan complicado, ¿por qué estas usando Java para enseñar a programar? Si me preguntas a mi, pienso que no deberías. Personalmente pienso que C sería un candidato mucho mejor.

Compara el programa Java anterior con el equivalente en C:

#include <stdio.h>
int main()
{
    printf("Hello, world!");
    return 0;
}

¿Cuál piensas que es más fácil de explicar a alumnos de Primero? A lo sumo probablemente termines explicando qué significa “#include”, a lo cual puedes simplemente responder que es un archivo donde printf está definido. Con eso basta. Nada de complicaciones ni “actos de fé”. Nada de “public static void main(String[] args)”. Tan solo un simple printf.

¿Qué sucede con todo el lío del “IDE”? Pues, resulta que un simple editor de texto con resaltado de sintaxis y un compilador de C son todo lo que realmente necesitas. Compilar código C es extremadamente sencillo, si el sistema se encuentra correctamente configurado. Un comando como el siguiente es suficiente para producir un ejecutable:

gcc hello.c -o hello.exe

Es así de sencillo y lo mejor de todo es que obtienes un ejecutable. Un simple archivo .exe sobre Windows. Eso es lo que tus estudiantes están esperando. Eso es lo que un programa es para ellos: un archivo .exe. En Java, tu compilador hubiese generado un archivo “.class” y tendrías que explicar a tus alumnos cómo invocar la Máquina Virtual de Java, explicar qué es un Runtime y por qué es necesario para que tu código (que ya está compilado, ¿no?) ejecute.

Una ventaja final: pidiendo a tus estudiantes que compilen su código a mano (en vez de usar el botón “Play”), indirectamente les estás pidiendo que aprendan a utilizar la aplicación Terminal (créeme, la mayoría de los estudiantes no saben qué es esto o cómo se usa) y estás brindando los fundamentos para que aprendan cómo utilizar un sistema operativo sin ventanas e incluso comenzar a aprender la forma de trabajo de UNIX.

Tu puedes lograr todo eso (y más) sin tener que pedirles que “confíen en tí” o que se guarden sus preguntas durante dos años, hasta que hayan aprobado su primer curso de POO.

Podrías argumentar que, incluso si java parece más complicado al principio, es más popular y por lo tanto, no puede ser un error enseñarlo. Yo estoy completamente de acuerdo, pero pienso que debería enseñarse como un segundo o tercer lenguaje, no como el primero. Java no solo requiere que el estudiante espere hasta que haya pasado por 2 o 3 cursos de programación antes de poder comprender completamente el lenguaje, sino que, con este enfoque, existen varios conceptos que simplemente no aprenderá nunca, tales como Manejo de Memoria o Punteros.

Así que, en vista de todo esto, si eres un Profesor, dictando un curso de Programación 1 y estás usando Java, te pido sinceramente que lo reconsideres. C no tiene por qué ser difícil y tus estudiantes te agradecerán por brindar un curso completo y autocontenido.

This entry was posted in C++, Programacion. Bookmark the permalink.

9 Responses to C como un lenguaje para aprender a programar

Comments are closed.