Sobre la importancia de saber programar en C

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”.

11 Comments

  1. Nelson
    March 5, 2010 #

    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 :-)

  2. Miguel
    March 6, 2010 #

    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…

  3. Juan David Vélez
    March 6, 2010 #

    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.

  4. Mauricio
    March 7, 2010 #

    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.

  5. Julian Garcia
    March 7, 2010 #

    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.

  6. Sergio
    March 8, 2010 #

    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.

  7. Alfabravo
    March 12, 2010 #

    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.

  8. Deya
    October 18, 2010 #

    Buenos Días, me gustaría aprender a programar en C, no conozco nada de este lenguaje…. cuando estuve en pregrado no vi este lenguaje.

    • Sergio
      October 18, 2010 #

      Bueno, agarra un libro, un compilador de C, y empieza a estudiar 😉

  9. ShikaCSK
    October 24, 2010 #

    Bueno por mi parte apenas soy estudiante de 1° semestre en la carrera de ing. en sistems computacionales, soy de mexico… y en todo lo que e visto de programacion me e dado cuenta que C es la base de la programacion Estructurada; y la programacion estructurada es la base de la programacion de hoy en dia.
    Yo e programado en cierta cantidad de lenguajes hasta cierto punto sencillos de aprender; y aunque C es tambien algo sencillo es el que tiene mas potencial para trabajar mas directamente con un sistema.
    Por lo tanto no entiendo como no enseñan C en estas universidades mensionadas anteriormente. Java tiene mucho potencial, pero C es mas nativo para cualquier sistema; con el simple hecho de que el Kernel de Linux esta escrito en mayor parte por C y hablar que el Kernel de Linux es una de las maravillas en la Informatica.
    Aun asi no digo que C sea necesario; aun asi es demasiado importante… aunque lo realmente necesario es saber programar; saber analizar el problema hacer el algoritmo y pseudocodigo y con esto la programacion es lo de menos…
    Esta es mi forma de pensar; yo comparto de que hoy en dia es un fallo que no se enseñe C en diversas escuelas…

    Bueno me despido

  10. Martín
    October 26, 2010 #

    Creo que está bien aprender a utilizar C, como lenguaje básico, pero me parece más importante para conocer la máquina y cómo se interactua con ella, aprender assembler, pues ahí es donde realmente se ve como funciona un procesador y como se manipula la memoria y los demás dispositivos. El aprendizaje de C debería utilizarse para enseñar a manejar estrucuras de programación y luego si sobre esas bases aprender a utilizar otros lenguajes orientados a objetos como Java.

    En conclusión lo realmente importante es aprender como resolver un problema utilizando como herramienta un computador, sin importar el lenguaje de programación que se utilice.

Leave a Reply

Powered by WordPress. Designed by Woo Themes