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

  1. Por eso antes enseñaban Pascal, para mi el mejor lenguaje para aprender a programar.
    Ojo, hablo de Pascal “original” no Delphi Pascal que ahí tenes un montón de cosas que no ayudan al aprendizaje.

    La sintaxis es justo lo que esta esperando alguien que no sabe nada de programación y quiere hacer “su” programa.

    Para mi fue una pena cuando dejaron de enseñarlo en la facultad de nuestra Universidad.

    Abrazo

  2. Leonardo Val says:

    Muy buen articulo. Debo decir que C tiene otras complejidades que Java no tiene, y que hay que tener en cuenta también.
    Si vamos a lo que simplicidad se refiere, tenemos el “Hola mundo” en Python:

    > print “Hello, world!”

    😉

    [WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.

  3. Bruno says:

    Bueno el post, tiene varias puntas:
    * Lo primero es que para Programación Estructurada hay que usar Pascal u otro (C como decis vos). El tema con POO es muy diferente.
    * C también tiene IDE (el editor de texto), aunque sumamente sencilla. Alguien puede decir eso no es IDE, pero bue… es un tema de definición.
    * Si vas a ENSEÑAR POO, NO usaria Java, sino Smalltalk. Para tu ejemplo:
    Transcript show: ‘Hello Word’. Sin definir clases ni palabras “raras”, solamente objetos.
    * Por el tema de static, void, public class, etc, eso es por la implementación que hace Java de POO no es pura, es decir, Java (igual C++, C#) es un híbrido entre Programación Estructurada y POO. La mayoría de los programadores expertos y no tanto, usan la jerarquía de clases de Java/C++/C# como un repositorio de procedimientos para realizar operaciones, y esto no es POO.
    Como dijo Alan Kay: “i invented the term object oriented and i can tell you did not have C++ in mind”. “yo invente el termino orientado a objeto y te puedo decir que no tenia a C++ en mente”.

    Si de mi dependiera utilizaría Smalltalk para enseñar y para hacer cualquier tipo sistema chico/grande/gigante, etc.

    Coordiales Saludos,
    Bruno

    En realidad hay varias formas de hacer el Hello Word en Smalltalk, dependiendo que Smalltalk usas. En Dolphin Smalltalk serian:
    * Transcript show: ‘Hello Word’.
    * TextPresenter showOn: ‘Hello Word’
    * MessageBox notify: ‘Hello Word’
    * MessageBubble notify: ‘Hello Word’
    etc etc

  4. cnfss says:

    Lo considero acertado y haberlo sufrido me consta.

    Sin embargo, también considero la necesidad de realizar una separación tajante entre programación teórica y programació práctica.

    Dado que aunque en gran medida la programación teórica sin una base tangible puede ser muy dura de incorporar. Enseñar a programar NO es enseñar Java, C, C#, Smalltalk, Python .. blah.. blah.. blah..

    En particular, creo que a nivel de organizaciones, se podría organizar el tener cierto número de horas teóricas base, más prácticas efectuadas aparte y selecionando el lenguaje (dentro de un número determinado de lenguajes “admitidos” por los profesores de la cátedra teórica correspondiente).

    De esta manera, se puede desprender la necesidad de aprender lenguajes de programación actuales, con la necedidad de aprender a programar.

    En particular me parecería muy interesante la incorporación de más “cursos” opcionales o semi-opcionales a lo largo de una carrera, disminuyendo la cantidad de horas teóricas (que siempre terminan siendo horas teóricas-prácticas), y colocando en ese espacio, (y otros espacios que pudiesen quedar disponibles) incorporación de aprendizaje sobre lenguajes, cursos DE C, DE Java, DE Python, DE SmallTalk, DE Php+Html… Es decir, cursos en los que su foco es determinado lenguaje.

    No esperaría certificaciones pero sí tener un espacio donde no se aprende a programar, sino que se dan introducciones en mayor o menor profundidad a los lenguajes que cada uno considera interesantes; ya sea por curiosidad, por análisis del mercado de trabajo, o por necesidad…

    Saludos!

    MG

  5. Eduardo says:

    Me gusto este articulo, yo aprendi con pascal ( IDE free pascal) y lo pude absorber de buena manera, ademas me enseñaron solo lo basico de estructuras asi pude lograr una buena base y aprender a pensar de forma recursiva (aunque costo), sin preocuparme de otras cosas como modulos, clases y ninguna de esas cosas que para mi una persona que recien arranca solo nesesita escuchar hasta tener un nivel basico de como pensar de forma “adecuada”.
    Ademas al programar en pascal sin una IDE muy potente tambien se practica el tema de probar las cosas a mano, porque yo ya me tope con muchos programas que tuve que probar todo a mano en una hoja de cuadernola y un lapiz porque el debugger no me sirvio.

    Saludos.

  6. Felipe says:

    Buen artículo, de acuerdo con los argumentos.

    Yo hace dos años cuando empecé la carrera me pregunté lo mismo cuando arranqué p1, ¿aprender a programar en java?
    ¿No es OO?, si pero lo vamos a usar estructurado, what?

    Mire por donde se lo mire no tiene sentido, tampoco estuve de acuerdo cuando arranqué p2, estructura de datos y algoritmos es ideal para aplicar los conceptos de manejo de memoria, pero como era en java uno se despreocupaba, eso si el 95% de la clase sale sin saber manejar memoria, el otro 5% si sabe y es por otros motivos.

    Yo soy de los que piensa firmemente en que no es la forma de aprender tener herramientas que te faciliten las cosas, lo primero es aprender los conceptos, cuando se tiene el conocimiento despues se evalua que conviene o no, no nos olvidemos que en la facultad se deben enseñar estos conocimiento.

    Alejandro, yo siempre fui de tener esta misma postura, el tema es que a la universidad que voy a mucha gente le decis c o c++ y por poco menos lo tratan de algo arcaico, que ya fue, pienso que en un tiempo se van a dar cuenta cuan equivocados están.

    Abrazo!

  7. Gastón says:

    Estoy de acuerdo con que no se utilice java para enseñar a programar por todos los conceptos que se deberían manejar que vos bien mencionaste, pero el argumento del IDE no me parece válido ya que es posible programar en java usando un editor de texto común y compilando por la línea de comandos (javac). Así programa yo en java en la facultad (hace muchos años).
    Tampoco me parece apropiado usar C, el manejo de memoria y punteros es demasiado complejo para un curso introductorio.
    Por suerte en la Facultad de Ingenería de la Udelar (Uruguay) todavía se sigue usando Pascal. 🙂
    Saludos

  8. Eduardo says:

    El tema que se podria dar clases de C sin usar los punteros, porque pascal tambien tiene punteros y eso, pero no se enseñaban(Udelar), igual desde el año anterior se estan enseñando, Saludos

Comments are closed.