Hace cerca de 15 años, en la Universidad de los Andes, la programación se enseñaba usando “C“, un lenguaje de programación muy popular desarrollado en los 70, en paralelo con el desarrollo del sistema operativo UNIX. En los 90, lenguajes de programación como Java fueron reemplazando al lenguaje C tanto en la empresa como en las aulas. Hoy en día, según me dicen, la programación se enseña usando Java y los estudiantes simplemente no aprenden C.
Este cambio preocupa a ciertos de mis colegas quienes consideran que, aún si no se va a usar este lenguaje, un programador debería saber programar en C. Muchos de estos colegas se quejan de los programadores más jovenes acusandolos de “no saber que es un apuntador”, lo cual parece ser, por el tono de la queja, algo muy grave. Qué tan realmente es importante saber programar en C para un programador? Cual es el realmente el fondo del asunto.
Yo supongo que lo que deploran mis colegas es el hecho de que al no haber tenido contacto con un lenguaje con manejo explicito de la memoria, aritmetica de apuntadores, acceso directo a ciertas funciones del sistema, etc, los programadores de hoy en dia sean menos concientes de qué es lo que ocurre con los recursos de la maquina cuando un programa es ejecutado. El verdadero debate es entonces sobre que tanto necesita conocer un programador sobre la manera como sus programas actuaran en terminos de los mecanismos de base de un computador. Personalmente creo que es importante. Por esta misma razon, creo que es importante tener idea de como está implementado un compilador.
Por otra parte, recordemos a Edsger Dijkstra, quién dijo: “computer Science is no more about computers than astronomy is about telescopes”.
Esta entrada me recuerda la frase: “A Lisp programmer knows the value of everything, but the cost of nothing.” — Alan Perlis. Recuerden que es una generalización. No me odien
Pues a mi me han dado ganas de aprender C (voy en tercer semestre de sistemas en los andes) y ahora mismo estamos viendo algunas cositas, pero en una materia que no hace parte de las principales de programación.
Creo que lo que la universidad quiere hacer es graduar administradores camuflados de ingenieros y por eso ese tipo de conocimiento es menospreciado. Y según lo que he escuchado es una tendencia en otras universidades: Un amigo que estudia en la nacional me dijo que en estructuras de datos nunca vieron grafos y que en ingenieria de software lo pusieron a leer el tlc…
Yo sé C. Aprendí C con el libro de shildt, es un libro corto que explica exactamente en que consiste ese lenguaje. (c++ nunca lo aprendí)
Me atrevo a decir que programar bien en java es algo muchisimo más desafiante que programar bien en C. (creo que eso es una verdad de perogrullo para cualquier persona que sepa java y C, ese “me atrevo” es con relación a la escuela de “pero es que ahora les enseñan java”).
Creo que si los alumnos al terminar su carrera entienden bien el funcionamiento de java, entonces seguramente estan bien preparados para programar en cualquier lenguaje. Lo mismo aplicaba en mis tiempos con el lenguaje C, saber C (entenderlo) casi que garantizaba la buena preparación para programar en ese tiempo. Para estos tiempos actuales creo que es más util que les enseñen Java a que les enseñen C. Es que Java no es un lenguaje de juguete, es muchisimo más rico que C, no entiendo a los hackers que lo menosprecian.
Una cosa curiosa: yo aprendí C, yo entendía las cosas de la carrera, hacia bien las tareas de la universidad, hice el compilador de juguete de la materia de compiladores, en fin. Y sin embargo a la hora de programar profesionalmente soy medio regular, eso me parece curioso e interesante. Los mejores programadores que conozco, juzgandolos como una camada, son los que aprendieron a programar en cobol y que no saben muy bien como funciona el computador (en esos tiempos eso eran asuntos de “esos gringos”), pero esos manes viejitos me descrestan con su técnica para programar: el orden, la rigurosidad, etc.
Tuve el honor de dictar un ramo en la Universidad donde salí, ahí realice clases de sistemas de computación donde vimos fundamentos de procesos, gestión de memoria, comunicación de procesos y tcp/ip.
Este era un ramo de nivel medio (dictado a partir del tercer año) de la carrera de Ingenieria de Ejecución Informática.
Tuve dos problemas.
1.- En los ramos anteriores se eliminó la utilización de pseudocodigo como base de la programación.
2.- Se eliminó Pascal y/o C como lenguaje de aprendizaje academico.
Esto en pos de emplear Java como lenguaje academico y de aprendizaje en temas de programación.
CUUUUUUUUEEEEEKKKKK…..
Reprobé a la mitad del curso, pues en sistemas de computación había que emplear a Pascal o C para crear los programas; dado que en Java bajas una libreria y listo.
Perdí más de la mitad del semestre enseñando a programar y a utilizar C para que pudieran cumplir con los objetivos de la asignatura.
Del total de alumnos que tuve (25), solo 3 entendieron medianamente los fundamentos de procesos, tcp/ip y gestión de recursos.
Esto fue el año 2000, hoy diez años despues…
Las universidades ya no se molesta en enseñar a programar, porque un ingeniero no es un programador (CUEEEEEK 1), por lo mismo la segunda lengua de todo ingeniero (SQL) no la conocen y no la dominan (CUEEEEEK 2).
En resumen.
Para mí, por formación, no me interesa que un Ingeniero sepa o no sepa C; sino que sepa programar abstrayendose de los detalles de implementación. Y es imperdonable que un ingeniero “no se peine” (domine a la perfección) el SQL.
Yo estoy completamente de acuerdo con todo lo que se plantea en la entrada, no aprendí nada de C y lo poco que sé de apuntadores se lo debo a unas cuantas cositas que hice en C++; en algún momento arranqué con Java y jamás volví a usar C++, y a veces en realidad siento ese vacío de conocimiento que sólo le da uno el untarse metiéndole la mano al manejo de memoria. Hay muchas otras cosas “old school” que uno sí debería aprender, seguramente C es una de ellas, pero me da la impresión que la lista es larga…
La cita de Dijkstra está muy bonita, no la conocía.
Nelson: si, muy apropiada la frase. De cierta manera creo que habla bien de lisp
Miguel: si, por eso los estudiantes deben tomar en mano su propia educacion, para corregir las fallas de la universidad.
Juan David: interesante comentario. Este post esta inspirado en su sugestion de hablar del pensum d eingenieria de sistemas.
Mauricio: muy interesante la historia. El tema de la importancia de saber SQL da para otro post…
Julian: muy de acuerdo, la lista es muy grande. Yo tambien se muy poco de C, solo lo que aprendi con los proyectos universitarios.
El poder de abstracción es la necesidad real. Es lo que permite detectar los problemas reales al llegar a la implementación que resuelve el problema.
Las particularidades de una tecnología se resuelven más fácil si se domina el concepto detrás de lo que se intenta hacer, no simplemente siguiendo una receta para hacer una aplicación web en java o conociendo el poder de malloc… realmente cualquiera podría decir que deberían enseñar a programar con python o con C, para que sepan realmente cuánto cuesta ordenar el HashMap, cuándo cuesta recorrer el ArrayList con el Iterator y etc etc etc…
Igual, hoy en día las aplicaciones de escritorio que veneraba otro lector de este blog (por ejemplo) sobreestiman los recursos físicos de los que se dispone y aún cuando usan lenguajes de “bajo nivel”, usan los recursos de forma descuidada… mientras que las aplicaciones web deben preocuparse más por el impacto de los componentes en el tiempo de carga de una interfaz. Esto último es algo que no veo que haya considerado galactus en su entrada,… y es algo con lo que muchos crecen hoy en día, haciendo cosas en PHP sin ser estrictos, tan sucios como les es posible ser. Y eso en otros entornos cuesta muchísimo…
Este tema da para mucho más. Por ahora, creería que C no es la única forma de enseñar que lo bueno, si breve, dos veces bueno.