Buscamos la meta, desengañémonos, no hay meta, lo importante es el camino y como lo andamos.

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 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. Aunque python es tipado, no me parece elegante para comenzar, el alumno se creará malos hábitos si las conversiones de un tipo a otro se hacen sin saber por qué. 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 lenguajes con declaración 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? sin embargo, dentro de los lenguajes tipados se debería enseñar primero los que declaran variables y reservan espacio a mano, huelga decir la potencia que los lenguajes donde no se declara el tipo es menor a los que en este artículo tratamos en cuando a eficiencia en la generación de código.

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.

  

Archivado en:

Notificación de comentarios

Si quieres recibir un email cuando se actualice este artículo, por favor, regístrate aquí

Suscribir a los comentarios de este artículo RSS

Comentarios

# Erick Huerta said on mayo 16, 2008 19:27:

Totalmente de acuerdo, yo soy una victima de las nuevas tecnologias y ahora que regreso a los cimientos del lenguaje C++ me esta costando mucho trabajo implementar la liberación de memoria y que asignar una un objeto a otro no solo es "copiar" como lo entiendes con las nuevas tecnologias. Recibe un coordial saludo.

# poochie said on junio 2, 2008 14:59:

Yo también totalmente de acuerdo, por dos razones:

1) C y C++ son lenguajes casi perfectos para enseñar los fundamentos de la programación, ademas son necesarios a la hora de implementar software que requiere bajo nivel de programación (drivers, compiladores etc)

2) Tanto java, .net, como ABAP (lenguajes/plataformas que cumplen su función mas que bien) están a años luz en cuanto a rendimiento de C/C++. Donde yo trabajo a nadie se le pasa por la cabeza que los procesos que desarrollamos sean en un lenguaje de programación que no sea C/C++ ya que de otra forma no podriamos ejecutar los picos de miles de llamadas a la hora que pueden tener ciertos procesos

# Dani said on junio 2, 2008 15:37:

En cierto modo estoy de acuerdo contigo, porque es necesario saber como funcionan las asignaciones dinámicas de memoria y demás para adquirir buenas conductas, pero no me parece que vayas a ser mejor o peor ingeniero por dominar ese aspecto de la programación al 100%. Posiblemente sí vayas a ser mejor programador, pero no mejor ingeniero. Igual que a un arquitecto no le enseñan en su licenciatura a poner ladrillos y los edificios siguen sin caerse. Bajo mi punto de vista, es beneficioso a veces para un diseñador poder abstraese de esos aspectos para asemejar el mundo real al mundo modelado, y esto es más complicado en lenguajes como C. Vamos, que yo pienso que sí es correcto el uso de lenguajes como Java para iniciar al ingeniero en la programación, ya que en un futuro su trabajo será el de diseñar y no el de programar (otra cosa es que sea realmente así...), y dejaría para cursos más avanzados aspectos de implementación a más bajo nivel, que cuando te los explican sin tener idea de programación cuesta más entenderlos.

# joze said on junio 2, 2008 15:38:

Aquí en la UIB en vez de C, en Fundamentos de Programación empleábamos el ADA. El C era algo así como un lenguaje de pros xD

# Guille said on junio 2, 2008 15:39:

Yo estudio informática en la complu y empezamos en primero con Pascal, ahora en segundo estamos con C++ y en tercero daremos Java (aunque ya he visto algo en una optativa). Aparte de C y ensamblador que das en las asignaturas de arquitectura. Es obvio que no se puede empezar la casa por el tejado.

# colubra said on junio 2, 2008 15:51:

Totalmente de acuerdo en casi todo.

Soy de los que piensa que python es un buen comienzo para una persona que no ha visto nada de codigo en su vida, ya que permite enseñar a dicha persona como es un algoritmo y que pasos debe seguir para la resolución de un problema sin nada más que desvie su atención.

Ahora, tambien pienso que es fundamental tener que "pelearse" con la reserva de memoria y "lidiar" con los punteros.

Creo que es posible la union de las dos vertientes sin crear "monstruos picateclas". Ahora bien, todo en su justa medida. Ni todo son restricciones ni todo el monte es oregano.

Un saludo, genial articulo.

# anjz said on junio 2, 2008 15:53:

Python es un lenguaje tipado (de echo, a veces se cataloga como fuertemente tipado) . Lo que ocurre es que la asignación de tipo es dinámica. El programador no dice de que tipo es una variable, cuando se le asigna un valor esa variable se convierte en una variable del mismo tipo que el valor asignado.

Lo que está claro es que es igual de quejica que cualquier otro si en una operación hay variables de tipos que no concuerdan con lo que se espera.

# Iván said on junio 2, 2008 16:02:

Buenas. Yo también estudié en Albacete. Soy Ingeniero Superior en Informática y estoy trabajando en programación Fortran (es una larga historia...). La verdad es que a mi quinta, en primero nos enseñaron punteros, y hasta dimos el tema de ficheros en C. C++, como tu bien dices, lo aprendimos en 3º con la asignatura de Tratamiento Digital de Imágenes, donde de verdad tienes que prestar atención a la creación y liberación dinámica de memoria si no quieres que tu proceso deje sin memoria al sistema operativo. Tienes razón en cuanto a que ahora, las nuevas generaciones de informáticos, en general, aprenden menos características fundamentales de la programación como son los punteros en C. Uno sabe de punteros en C y ya puede hacerse una idea de como funcionan las referencias en lenguajes como Java, o en Fortran, aunque este último es un lenguaje compilado. Un amigo mío, que acaba de empezar Ing. Tecńica informática en Albacete me comentaba que no habían llegado a dar punteros en Fundamentos de Programación I, por lo que me llevé las manos a la cabeza. La verdad es que le he estado ayudando con Estructuras de Datos de 2º y está un poco verde en cuanto nivel de programación. Se hace un pisto con la conversión de tipos y a veces mezcla las churras con las medinas. En fin, es lo que toca en estos tiempos en los que se pierden las buenas costumbres.

No se si recordarás la asignatura que impartía Juan Aranda Carrilero en 3º. Se llamaba "Programación de Sistemas". Esta asignatura, que creo que ya no existe por falta de gente que se la coje, entre otras cosas trataba de hacer una introducción a la programación desde la programación espagheti a la programación basada en componentes, los problemas derivados de la utilización de distintos compiladores al enlazar con estos componentes, y finalmente la utilización de componentes COM para desarrollar componentes "portables" entre  clientes pesados en Win32. En la asignatura de verdad se comprende como funciona la herencia múltiple en C++, así como funciona el mecanismo de polimorfismo en este lenguaje. Pienso que esta asignatura es una asignatura clave para los que quieran conocer a fondo la programación C y C++.

La programación en lenguajes de más alto nivel como Python, como tu bien dices debería ser enseñada una vez tienes nociones de lenguajes como el C y Java, y no desde un principio. Espero que esta práctica no se inponga en la Escuela Politécnica de Albacete. Yo tuve el placer de utilizar Python en 4º con Ismael, en la asignatura de Procesadores de Lenguajes y la verdad, en principio te soluciona la vida, a la hora de la programación. Otra historia es a la hora de depurar cuando ya no sabes ni  a que tipo de objeta referencia una variable. En fin.

Yo ahora estoy liado con cosas que no tienen que ver con Python, estoy con programación Fortran 90 y MPI.

Bueno, un saludo Clemente, y que te vaya bien por Tres Cantos.

# Darío Madrid said on junio 2, 2008 16:03:

En la ULPGC como primer lenguaje nos ponían ADA, una vez dominabas el fuerte prototipado te metían C y C++,  creo que entiendo lo que quieres decir de que los programadores aprendan desde lo más básico, el problema es que las nuevas tecnologías que usan las empresas ya no utilizan esta filosofía, SAP por ejeplo, asi que creo que en la misma Facultad deberían enseñarse ambas cosas, aunque suponga un sobreesfuerzo para los estudiantes.

# A.Clemente said on junio 2, 2008 16:11:

a #Iván. siempre es agradable encontrar gente que estudió en el mismo lugar que tú. Me temo que tú eres más antiguo que yo en esto pues yo no llegué a conocer tal asignatura. Y sí, es cierto que han quitado el tema de los punteros en C pues ya me dí cuenta al darle clases a un amigo.

un saludo iván y que a tí también te vaya bien.

# DiThi said on junio 2, 2008 16:12:

Iba a decir exactamente lo mismo que anjz: Python es fuertemente tipado, y no puedes sumar un número con una cadena, por ejemplo; o una lista con una tupla.

i = 0

a = "hola"

b = 3.5

Ahí está claro de qué tipo es cada uno, pero por si no queda claro siempre se puede hacer esto:

i = int()  #sin argumento, el valor por defecto es 0

a = str("hola")

b = float(3.5)

Si quieres iniciar 15 variables del mismo tipo básico en la misma linea:

a = b = c = d = e = 0

Esto no sirve para objetos, claro, (salvo que quieras que todos sean el mismo) además que sería poco legible. En python, legibilidad ante todo.

De cualquier modo, incluso enseñando solo python, es complicado explicar lo de por valor o por referencia. Python es un lenguaje fácil y maravilloso... para los que tienen experiencia.

# Lochi said on junio 2, 2008 16:12:

Bueno, yo lo cierto es que empecé con Pascal en la Universidad y aunque no llegaba a ser tan exhaustivo con los punteros y las reservas de memoria como C, te ayudaba a ir comprendiendo de qué iba "eso de la programación". Mucha gente me decía que ese lenguaje no servía para nada porque no se usa, pero lo que eran incapaces de comprender es que lo importante no es aprender lenguajes útiles, sino aprender a programar en general.

# ^SaRgE^ said on junio 2, 2008 16:16:

Estudio en la Politécnica de Alicante y soy de tu misma opinión. Aquí en la EPS, en las carreras de Informática se empieza por C++ en FP1 y FP2. La verdad que se hace todo con C++, y se da una buena base sobre punteros, otra cosa es que el alumno no llegue a asimilarlo o no llegue a ver su importancia desde el principio. Luego en asignaturas como Programación de Sistemas de Tiempo Real (último curso en Ing. Tec. Inf. Sistemas) se emplea Ada. En asignaturas como programación Orientada a Objetos, Programación y Estructuras de Datos; y Computabilidad (2º curso), se desarrolla la capacidad de abstracción. En otras asignaturas como Arquitectura de Computadores o Sistemas Operativos, se enfatiza más en el conocimiento de la máquina, cosa que en el resto también se hizo pero no a tan bajo nivel. En mi opinión, y no se como será en el resto de universidades, aquí en la EPS no se pierden las buenas costumbres, siempre puedes tener profesores buenos o malos, que hagan incapie en unos aspectos u otros, o despierten el interés y motiven al alumno, pero el temario es el que es, y si quieres estudiar, tienes todo y sabes donde buscarlo.

# mario said on junio 2, 2008 16:20:

Totalmente de acuerdo contigo, un buen profesional es aquel que domina a la perfección la metodología de programación, sabe que hace y porque lo hace, el lenguaje empleado es lo de menos.

# Sito said on junio 2, 2008 16:20:

Ahora lo unico que saben hacer las empresas es reutilizar codigo, que a nivel empresarial esta genial por que los tiempos de desarrollo disminuyen enormemente, pero con eso solo ganas que los programadores solo sepan copy/paste, a mi en la carrera el primer "lenguaje" que me enseñaron fue pseudocodigo y direis que mierda de lenguaje es ese... esa es la base de todo informatico, de ahi que el lenguaje al que luego apliques ese codigo te de totalmente igual... como decia el autor del articulo,  la verdad ahora que soy analista hecho enormemente programar... porque no es lo mismo romperte el coco  como desarrollador que como analista con el UML, pero bueno es la evolucion natural del informatico, desde mi humilde punto de vista...

Un Saludo Gente

# gabriel said on junio 2, 2008 16:22:

pues yo tengo una opinión un poco contraria a la vuestra que a lo mejor se debe a que no tengo los mismo estudios que vosotros  ya que yo estudio un ciclo medio pero vamos al caso, java es un lenguaje con el que es muy fácil de trabajar por lo tanto java es muy gratificante para la gente que se mete en este mundillo ademas de ser una excelente base para los que en un futuro van a programar en  c/c++,  desarrollar en el es bastante rápido y sin duda alguna la carencia de punteros en un mundo dominado por memorias de mas de 4 gb y procesadores que trabajan a mas de 3ghz con mas de cuatro nucleos es una gran ayuda  

ademas si el programa no esta lo suficientemente optimizado siempre nos quedara la opción de pasarlo a c y hacer unos pequeños arreglillos

simplemente creo que java es la evolución natural de los lenguajes de programación y seguramente los futuros lenguajes de programacion aprovecharan estos puntos

por favor no me comáis por esto XD

# linoeldelapuch said on junio 2, 2008 16:29:

Yo en 1º di Pascal, y bueno... la experiencia me dice que tampoco es que se deba comenzar con un lenguaje que ya hace años que es un fósil

# Juan said on junio 2, 2008 16:29:

¿Pero qué me estás contando? Resulta que la Ingeniería en informática ha desaparecido del panorama universitario española a causa de Bolonia, y tú con estás fantasías. Si te parece, también podríamos programar en ensamblador, ¿no te jode?

Lo que nos debe de importar a día de hoy a todos es el conseguir ATRIBUCIONES PROFESIONALES, que somo los únicos gilipollas ingenieros que no las tienen, y al final somos las últimas putas en las empresas, así de claro te lo digo.

INGENIERÍA EN INFORMÁTICA, ¡REGULACIÓN YA!

# A.Clemente said on junio 2, 2008 16:32:

Hola  #Juan bien y correcta me parece tu opinión, mas este es un blog tecnológico no de regulación de la informática, lo tuyo está más bien en ingenieros de primera y similares. La carreara, regulada o no, seguirá produciendo gente que no conocerá bien las máquinas que programa debido a su exceso de abstracción. Un saludo.

# Pedro said on junio 2, 2008 16:38:

Pues claro que todo esto se está perdiendo en la universidad. Sobre todo que la Ingeniería en Informática no tiene directrices nacionales con Bolonia, y cada universidad se está sacando el "grado" que les sale de los cojones.

Además, el empresario sólo quiere carnaza barata. Si es ingeniero y cuela por 600€, pues mejor. Se la suda categóricamente toda esta disertación que nos has metido, ya que NUNCA vas a subir un sólo escalafón profesional mientras sigas siendo el pica-teclas oficial (aunque programes en binario).

Así de triste es la realidad.

# Juan said on junio 2, 2008 16:41:

Ok #A.Clemente, intentaré expresarme en estos foros que comentas.

En cualquier caso, tienes toda la razón con tu exposción.

Gracias y un saludo.

# Luis said on junio 2, 2008 16:42:

Cuantos quebraderos de cabeza con los *punteros...

# indie said on junio 2, 2008 17:03:

Creo que afortunadamente hay una evolución en Informática. Yo tambien soy de la vieja Escuela.. y estudie la ingenieria y demás , pero creo que dentro de nuestro sector hay hueco para muchisima gente.

Llevo doce años trabajando en analisis y he cambiado de un lenguaje a otro y de una metodologia a otra; al final creo que quien manda son las grandes empresas tienen a sus profesionales.. Microsoft los suyos, Oracle los suyos..

# pingON said on junio 2, 2008 17:32:

vamos a ver.., programar es describir una solución a un problema.

pongamos un ejemplo: necesito almacenar agua para poder beberla en dosis suficiente y abundante, pero sólo quiero emplear una mano. La solución podría ser una JARRA.

Hasta aquí el enfoque de un Ingeniero.

Necesitamos una Jarra no importa el material ni el color, la jarra es el "Ingenio" necesario para solucionar el enunciado.

veamos varias implementaciones, de la jarra: en papel se deshará  antes que podamos usarla, en plástico se deformará con el tiempo y el calor del contenido, En barro aguantará siglos si no se rompe antes.

Hasta aquí el enfoque de un programador.

¿de verdad pensáis que el material de trabajo es lo demos?. el lenguaje que se use determina la robustez y versatilidad de vuestra solución.

Saludos y gracias a Nicklaus Wirth por su Pascal y al C. hoy nada en programación puede sorprenderme.

# Guti said on junio 2, 2008 17:42:

Me extraña que con la protección de memoria, tuvieras que resetear la máquina si el puntero se iba de madre.

Quizás hablamos de un Visual C++ de 16 bits, que también lo hubo.

Cosas similares, me pasaron con frecuencia con DOS en 16 bits, y sobretodo en Win16, pero con el paso a los 32 bits, ya fuera DOS, como Windows, jamás.

# A.Clemente said on junio 2, 2008 17:47:

pues así es Guti, la máquina debaja de responder por completo y estoy hablando de 32 bits por supuesto, tal vez el programa intentaba acceder de mala forma a sus propios datos machacándolos, lo que ocasionaba operaciones infinitas de complejidad exponencial (lo más deseado jejeje)

# Marcapasos said on junio 2, 2008 18:03:

Bueno, yo empece en ensamblador para los 8 bits, en un MSX2. Me hice un par de juegos comerciales y tal, de esos que se vendian en casettes (bueno, el MSX2 ya tenia disquete de 3.5, pero nos entendemos).

Del ensamblador en 8 bits pasé al PC: Visual C++, algo de Visual Basic, algo de PHP, algo de javascript... en fin, llega un momento en el que todos los lenguajes son iguales asi que no es necesario seguir enumerando.

Ahora he vuelto al ensamblador, en PC, con el MASM (sería igual con cualquier otro). Definitivamente es con el lenguaje que mas agusto me siento.

Ahora bien, un profesional no puede desarrollar programas complejos con ensamblador, por mucho que la calidad que se consiga sea altisima. Yo no soy un profesional, lo mio es una aficion aunque me haga programas que me sirvan para mi profesion, pero tengo ojos en la cara.

En resumen, que entiendo que el tema de punteros y tal aporta calidad a tus conocimientos, pero no es necesario. Por eso en estos tiempos que corren todo se deja en manos de la fuerza bruta del ordenador y por eso cada vez se necesitan bichos mas potentes.

# Jedive said on junio 2, 2008 18:52:

"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"

Sí, sólo que en C no existe paso por referencia, eso es cosa de C++. En C los punteros, como todo lo demás, se pasa por valor.

# A.Clemente said on junio 2, 2008 19:42:

hola Jedive: Depende de por donde se mire. Al pasar un puntero en C se hace una copia del mismo y digamos que sí se pasa por valor, sin embargo, este valor no deja de ser una referencia ¿no?

# A.Clemente said on junio 2, 2008 20:09:

Exactamente jevide, un puntero es una referencia, tu lo has dicho, por tanto, lo que dicho yo también es cierto. Haces una copia de un puntero, pero esa copia sigue siendo un puntero o referencia a algo de todas formas aunque se pase por valor, me he explicado ahora?

# JC.Que? said on junio 2, 2008 20:10:

Aquí en la ETSEIB (UPC, barcelona, industriales) damos una asignatura donde se trata eso. En "Fonaments d'informatica" i "Informática" damos algunos conceptos muuy vagos de lenguaje pseudoalgorismico, algunos esquemas de recorrido tratamiento, fusión, etc....

Y al final de Informática se da punteros. Entonces se entienden todas las malditas horas picando C y compilando mal y "makes pointer from integrer without a cast".

Y la mitad del final es un ejercicio de dobles punteros, mallocs y free's y diseño descendente.

Aunque soy consciente de que es muy poco, muy vago y que es la "maria" de los primeros años de industriales ("maria" = la asignatura + facil)... Si te pones empiezas a comprender un poco mejor de que va el mundo de la programación... y supongo que tiene otras utilidades en la carrera, supongo.

El artículo me ha commovido bastante, de cabo a rabo. Aunque se agradecerían algunos saltos de línea ;).

Quitar los punteros de C ... me atreveria a hacer una analogia como es quitar el estudio de tensiones mediante modelos de plástico y luz polarizada. Se dice que ya no se usa, pero es necesario saber de que va y que existen.

# Abel said on junio 2, 2008 20:17:

Hola, es la primera vez que te visito, me ha parecido un artículo bastante interesante.

Yo empecé hace, ufff, demasiado tiempo ;-). Un spectrum y el código máquina para Z80. Después en la universidad vi el ensamblador del x86, c, C++. Y luego he visto perl, algo de Tcl, scripts de shell y ahora es el java el que me da de comer.

Un par de ideas muy resumidas:

-Estoy de acuerdo con la visión que das en tu artículo, y estoy de acuerdo con aquel que recomendaba aprender un lenguaje de programación diferente cada año, creo que tener una visión de las muchas posibilidades a la hora de enfrentarse a un problema de programación es enriquecedor, positivo e incluso necesario. Y me parece un error que desaparezca de un temario de un ingeniero cosas que le acercan a lo real, a lo tangible, a lo puede fallar...

-La semana pasada Fowler hablaba de DSL y del miedo que las nuevas generaciones le tenían a hacer un parser, cuando es algo "básico" en el conocimiento de un informático (no básico en cuanto a sencillo, pero al final todos los programas se transforman en ensamblador, ya sea para ser ejecutado por un procesador o una máquina virtual tipo JVM o CLR o lo que sea). Y lo decía bastante sorprendido, e iba muy en la línea que tú apuntas.

- Entiendo el comentario de Gabriel de las 4Gb, pero también hay que ser conscientes de las limitaciones de los dispositivos moviles...

Y no alimentes a los trolls, creo que no merecen la pena

# A.Clemente said on junio 2, 2008 20:20:

Por cierto, yo corroboro a Abel, creo que seguiré su consejo.

# A.Clemente said on junio 2, 2008 20:37:

"Algunos autores dicen que todo en C se pasa por valor, ya que cuando se pasa un puntero se hace también una copia (de modo que el puntero se pasa por valor)"

Ves?, no todo el mundo está de acuerdo con eso pues, aunque los punteros se pasen por valor en C (que sí, ya te lo dije antes), siguen referenciando algo y siguen siendo referencias, de ahí mi afirmación y no le estoy dando vueltas llevo tiempo diciendo lo mismo que no quieres leer.

No hace falta que me expliques cómo se pasa una cosa por valor o por referencia para intentar dejarme en rídiculo, hace ya mucho años que aprendí a hacerlo y que me pusieron a prueba con ello.

Y no, hace muchos años también que dejé de programar en C/C++ cosa que recuperaría en caso necesario por supuesto, que mas da el lenguaje? es como dice Abel, que habría que aprender un lenguaje cada año.

fuente: http://arco.inf-cr.uclm.es/~david.villa/pensar_en_C++/products/vol1/ch08s03s03.html

# TheOm3ga said on junio 2, 2008 21:14:

Nabe déjate de pamplinas. Yo no me voy a poner a decir qué chuminadas enseñan en tu modulito de FP porque no lo he cursado, así que ahórrate los comentarios sobre lo que enseñan o dejan de enseñar en la Universidad.

# Carlos said on junio 3, 2008 0:13:

Tienes casi toda la razon. Veintipico años de profesor de informatica en la Universidad te lo reconocen.

Animo.

# Baco said on junio 3, 2008 0:43:

¿Y si quitan los punteros, que hacen con las listas enlazadas, las pilas, las colas, y el mete-cola/saca-cola?

¿En Algoritmia o Técnicas de Clasificación y Búsqueda como pueden estudiar los árboles binarios?

Además, también soy de la opinión de que es mejor conocer la base, que te ayuda a entender mejor lo que haces y ser más eficiente.

Está muy bien pensar que un ingeniero informático terminará haciendo análisis o dirigiendo proyectos, no solo picando código. Pero para empezar tendrá que estar de picateclas, o por lo menos debería pasarse una buena temporada haciendolo, antes de tener experiencia suficiente y una visión suficientemente amplia para realizar solo tareas de análisis o de dirección.

Y los 4 GB de memoria y los tropecientos GHz no son para hacer los mismos programas pero con código menos eficiente, debería ser para crear programas más avanzados o para meter más aplicaciones en un mismo servidor (consolidación y/o virtualización).

# yampeku said on junio 3, 2008 9:21:

Como bien te han dicho por ahí arriba. Entender ese tipo de cosas te hace ser mejor programador, no mejor ingeniero.

Ese es el problema de la informática: un informático debería diseñar un programa, no implementarlo

# TuringTest said on junio 3, 2008 9:23:

#Baco: ¿cómo se hacen las listas enlazadas, pilas, colas...?

Fácil: con referencias.

La base de la programación no debe ser aprenderse el funcionamiento a bajo nivel de una arquitectura de CPU concreta, sino aprender estructuras de datos, bloques de control, y abstracción, abstracción, abstracción.  

Una vez que sepan programar un algoritmo de reserva de memoria a nivel teórico, se les puede explicar como detalle de implementación que las posiciones de memoria se representan con un array, y las referencias con punteros en C. Pero el bajo nivel debe ser eso, un detalle de implementación. No la base de su carrera como programadores.

Sobre todo, porque aprender C NO GARANTIZA que sepan entender la reserva de memoria, las asignaciones, la paginación de bloques, los punteros lejanos... he visto gente "tirar líneas" de C y pelearse con el compilador hasta que "parece que" funciona (= compila sin error), y luego la lógica del algoritmo básico para recorrer la estructura de datos estaba completamente mal.

# Ivan said on junio 3, 2008 9:34:

A ver, aqui en España todavía se enseña C en primero, tal y como lo describes. Java y demás lenguajes ya son para cursos más avanzados o en  asignaturas optativas.

# Juan said on junio 3, 2008 12:29:

"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"

Que gran verdad... y eso cuando te dan un curso decente que generalmente es de lo básico, lo ínfimo. El problema es que los encargados de aprobar el temario no piensan en la educación como obtención de conocimientos y librepensamiento, si no más bien en la obtención de €€€ o $$$ o cualquier otra moneda. Si no miremos la ESO... ¬¬

Saludos.

# Quique said on junio 3, 2008 15:46:

Hola

Soy Ingeniero Informatico y trabajo con ADA.

A todos aquellos que habeis hablado de C como lenguaje fuertemente tipado deciros que en mi opinion eso no es asi. En C puedes juntar churras con merinas y se lo traga tranquilamente. Eso no es un lenguaje fuertemente tipado, es un lenguaje tipado a secas.

El uso de punteros es una opcion bastante obsoleta en mi opinion. Puede que tuviera sentido en el pasado, pero lo cierto es que para la inmensa mayoria de aplicaciones, y eso no implica que en algunos casos no sea asi, es innecesario, puesto que los lenguajes implementan herramientas similares que te permiten abstraerte de la maquina. En ocasiones es necesario bajar a ese nivel y en entonces es util, pero solo en ocasiones.

Yo jamas curse C en la universidad, aunque lo he aprendido posteriormente por motivos profesionales. El hecho de que se utilice Pascal en la universidad es obvio, pues nacio con vocacion didactica.

Espero haber aportado una vision diferente al asunto.

Saludos

# Jimmy said on junio 4, 2008 6:39:

En mi universidad damos C en primero y C++ en segundo. En tercero Java. Y por el medio en tecnología de computadores pues otros paradigmas de la programación como el funcional (con Lisp) o el lógico (con Prolog). Además por motivos de la vida, he estado en 3 Universidades y en todas dan el tema de punteros. A lo mejor te refieres a un caso puntual, pero yo todos los que conozco de otros sitios que han dado C saben qué es un puntero.

# Anonimo said on junio 16, 2008 1:00:

Totalmente de acuerdo. Estudio ingenieria informatica en una de las escuelas mejores de España y cual ha sido mi asombro cuando me enteré a principios de este curso de que se quitaba totalmente C del temario de 1º y 2º. Sin embargo seguirá usandose a partir de 3º en el mismo contexto de ahora y con su misma dificultad. Ya estoy acabando la carrera y el conocimiento que me ha dado C con sus punteros y su reserva de memoria del funcionamiento mas básico de la máquina no lo habría adquirido nunca con java, Lisp o cualquier otro lenguaje de "mas nivel"

¿Qué opinas?

(requerido) 
(opcional)
(requerido) 

About A.Clemente

Soy de Villarrobledo (Albacete) Ingeniero Técnico Informático. Actualmente trabajando como desarrollador ASP.NET y SharePoint 2007