C, C++ y los punteros: ¿perdemos las buenas costumbres?
Publicado 24 enero 08 02:23 | A.Clemente
Navegando por ahí encontré por casualidad un interesante artículo en inglés sobre lenguajes de programación titulado "Computer Science Education: Where Are the Software Engineers of Tomorrow?" "Educación en ciencias de la computación: ¿Dónde están los ingenieros del software del mañana?"
Escrito por Robert B.K. Dewar y Edmond Schonberg, doctores en Ciencias de la Computación de la universidad de Nueva York y Presidente y Vice-presidente de AdaCore Inc., tratan de presentar a la educación de hoy día como insuficiente a la hora de tomar conciencia de cómo la máquina física va inherentemente unida al código programado. Estos señores han llegado a una conclusión a la que también llegué yo por mi cuenta el año pasado mientras me ganaba un dinerillo como profesor particular y que después comentaré. En este artículo, se defiende abiertamente la nafasta influencia que Java, como primer lenguaje de programación enseñado en las universidades, crea en el novato programador un estilo mecánico de programación que apenas requiere conocimientos fuera del lenguaje.
Muchos de vosotros que habéis estudiado una titulación de Informática o estáis en ello, recordaréis con nostalgia aquel primer año en que C era el lenguaje de referencia a aprender para estar curtido a prueba de bombas, seguro que tenéis grabado a fuego vuestros primeros pasos intentando comprender como funcionaban los punteros y cómo se pasaban por referencia, además de las funciones malloc, calloc, sizeof y similares. Aquello era bueno, te hacía pensar, te obligaba a tomar conciencia de cómo el programador, al tirar el código, tenía que llevar una cuenta mental del mapa de memoria para no causar un desbordamiento, era imperante que para cargar un objeto en memoria se debía calcular su tamaño y hacer las referencias oportunas hacia él de modo que se era totalmente consciente en todo momento de la relación leguaje-máquina.
C y C++ lo tienen todo, programación a bajo nivel que nos permitía programar controladores para todo tipo de maquinitas, hasta lo más abstracto, el concepto de namespace, herencia, clase y objeto con el valor añadido de tener que ser el programador el encargado de reservar memoria (famosisimos new o malloc dependiendo del momento) y por supuesto de destruir el objeto una vez no hiciese falta (con un destructor que ha pasado al olvido) y sobre todo, lo que más me gusta: son lenguajes fuertemente tipados.
No confundáis lo que quiero decir, no pretendo volver a lo viejo, solamente enseñarlo pues así crearemos buenos programadores con sólida cimentación, aquellos que saben dónde va a parar todo el código que han escrito. Las nuevas tecnologías son buenas y muy útiles para hacer las cosas, .NET, J2EE, SAP/Abap... permiten hacer virguerías impensables hace pocos años con sus lenguajes de alto nivel y sus librerías fáciles de comprender, también hacen un uso óptimo de la máquina sin llegar a colgarla además de encargarse de borrar lo no utilizado una vez no es necesario. Son tecnologías que se deben usar para no caer en la chapuza, sin embargo, veo necesaria la enseñanza de C y C++ como medio de hacer ver al alumno que no todo el monte es orégano y de recordarle que, al fin y al cabo, está escribiendo instrucciones para ser ejecutadas por una máquina.
Recuerdo cuando hace tres años tuve que hacer un programa para tratamiento digital de imágenes en Visual C++ en el que, a base de punteros, tenías que declarar un bitmap y dejarlo en una zona de memoria de modo que cada vez que tuvieses que modificarlo, debías apuntar hacia él y tener plena conciencia en todo momento de qué estabas haciendo exactamente en la memoria. Recuerdo las veces que tuve que pulsar el botón de reset del ordenador por inactividad total del sistema para poder continuar y pensar mejor qué era lo que esta haciendo. Es bonito saber que hay gente capaz de escribir un bucle for y extraer los datos de un determinado bloque de memoria a bajo nivel, incluso de escribir en C un programa que escribirá a su vez cosas en ensamblador (si amigos, se trata de un compilador o intérprete en su defecto)
Me alarmé profundamente cuando el año pasado, dando clases particulares de Fundamentos de la programación I a un amigo mío, vi que habían cancelado el tema de los punteros, con ello acabaron con la filosofía de C, si cancelan los punteros, pensé, ¿que sentido tiene la asignatura? podrían comenzar directamente con Java y esto que se ahorraban. De este modo, los alumnos no sabrán que un objeto o una variable no se crea en las nubes a no ser que sean capaces de llegar a esa conclusión por ellos mismos. Tal vez no caigan en la cuenta de que hay que reservar un espacio para ella y apuntarla cuando nos haga falta pasarla por referencia o crear una copia en una zona adjunta o donde queramos cuando la pasemos por valor. Estos conceptos se han perdido con los nuevos lenguajes, ahora asumimos que todo es por referencia cuando se trata de un objeto o por valor cuando se trata de un tipo simple y encima se nos destruye automáticamente.
Por supuesto, no podía pasar por alto los lenguajes no tipados, los famosos lenguajes script que, aunque son muy versátiles y funcionan en condiciones extremas por su condición de ser, normalmente, interpretados, también crean muy malos hábitos a los aprendices de programador, se trata de una depuración de prueba y error en la que caer en fallos es fácil por hacer asignaciones al tuntún como que la variable jota ahora devuelve un string y en la siguiente línea devuelve un ornitorrinco. Leí un artículo por ahí de alguien que aconsejaba aprender python como primer lenguaje y me echaba las manos a la cabeza. Lo no tipado no me parece elegante, el alumno se creará malos hábitos. A mi parecer, un entero es un entero y debe morir como entero, pues es la filosofía informática es esta, formatear información y guardarla en celdas para que signifiquen algo. Recomiendo los lenguajes script a la gente ya curtida pues son realmente útiles para muchas cosas en las que los tipados se halla realmente limitados, pero no para empezar en esto de la programación.
Hace un año tuve que programar un sencillo compilador en la carrera y tuvo que ser en Python y la verdad, era de locos pegarse con eso hasta coger la soltura necesaria, después me he pegado con otros como VBScript y javascript ahora como desarrollador web y he conseguido reafirmarme más aún en mis teorías de no enseñar estos lenguajes como primeras lenguas. Utilizando un lenguaje tipado incluso se tiene la ventaja de poder usar ayudas en tiempo real en el entorno de programación pues suelen traer herramientas para ver que contiene determinado objeto durante la depuración, ya que este se encuentra reservado y formateado con un tipo concreto que permite saber si hemos intentado meter el triangulito de plástico duro en la hueco con forma de cuadrado ¿os acordáis de los juegos para los niños pequeños? Así es amigos, una depuración más sencilla que hará mucho bien por nuestra salud mental.
Todo esto no interesa a las empresas que como finalidad buscan picateclas que no se pregunten el funcionamiento de una máquina, carne vendida como el embutido a las software factories donde llegan licenciados en carreras que poco tienen que ver con la informática y son entrenados en cursos de un mes de java y ¡hala!, a trabajar como analistas. Esto no trae nada bueno, no ganaremos en buenos profesionales con buenas costumbres programáticas, que realicen código bonito y de calidad y estén por tanto, bautizados en fuego. Un buen programador no debe entender de Java, de C# o Visual Basic, ni siquiera de C ni de C++ realmente, a un buen programador no debe importarle el lenguaje pues finalmente todos sirven para lo mismo. Un buen programador es capaz de abstraerse del lenguaje y de implementar un algoritmo formal para resolver cierto problema de forma algorítmica en una máquina que guarda datos y puede operar con ellos. Todo esto amigos, se puede perder si la universidad no deja de producir programadores sin abstracción y las empresas de contratar gente sin nociones. Todo esto, en definitiva, no me gusta.
|