8/11/2006 10:50
Augusto Ruiz
Los punteros y la POO (o por qué hay que aprender C)
Quizá un título más apropiado sería ¿qué hace falta para ser un buen programador?
En el blog de Eugenio Estrada hay un post muy interesante, sobre todo por los comentarios que ha generado. Entre esos comentarios hay opiniones enfrentadas sobre un tema que últimamente levanta ampollas. Si todo el mundo está programando utilizando orientación a objetos, ¿por qué debería la gente aprender C - o Pascal - si luego no lo va a utilizar?
Creo que aprender C (a partir de ahora, cada vez que hable de C, hablo realmente de un lenguaje en el que se puedan utlizar punteros, y que sea estructurado, como puede ser también Pascal) es algo muy necesario para luego entrar de lleno en la orientación a objetos. Y Joel Spolsky también piensa así ;)
El artículo de Joel Spolsky trata acerca de lo que él busca cuando entrevista a gente para formar parte de su plantilla. Es decir, cuenta un poco qué es lo que hace falta para ser un buen desarrollador (según su opinión, que se acerca bastante a la mía). Y para ser un buen desarrollador, sólo hacen falta dos cosas, que son las que busca:
- Ser inteligente, y
- Terminar las cosas que se empiezan
Para ayudarle a comprobar el primer punto, en sus entrevistas normalmente suele pedir a los entrevistados que utilizando papel y lápiz hagan un pequeño programa en C con algún algoritmo que requiera el uso de punteros, o de recursión. Y voy a intentar traducir de su artículo el por qué hace eso:
>>15 años de experiencia entrevistando programadores me han convencido de que los mejores programadores tienen una aptitud para manejar varios niveles de abstracción simultáneamente. En programación, esto quiere decir que no tienen problemas con la recursión (en la que tienen que mantener en la cabeza varios niveles de la pila de llamadas a la vez), o en implementar algoritmos complejos basados en punteros (donde la dirección de un objeto es una especie de representación abstracta del objeto).
>>Me he dado cuenta de que entender punteros en C no es una habilidad, sino una aptitud. En el primer año de universidad suele haber unos 200 chavales al principio del semestre, y todos ellos escribieron juegos de aventuras complejos en BASIC para sus PCs cuando tenían 4 años. Pasan un rato divertido aprendiendo C o Pascal en la universidad, hasta que un día el profesor explica los punteros, y de repente no lo entienden. Ya no entienden nada a partir de ese punto. El 90% de los alumnos dejan la clase y se convierten en licenciados en Política, y luego les cuentan a sus amigos que no había los suficientes miembros del sexo apropiado que estuvieran cañón en sus clases de Programación (recordad que la Uni en los USA es diferente, los primeros años son comunes a las especialidades), y que por eso cambiaron de especialidad. Por alguna razón, la mayoría de la gente parece ser que nace sin la parte del cerebro que entiende los punteros. Los punteros requieren una forma compleja de pensar usando una indirección doble que ciertas personas simplemente no pueden hacer, y esa forma de pensar es crucial para poder hacer una programación buena. Muchos de los "script jocks" (no sé cómo traducir esto) empezaron a programar copiando código JavaScript en sus páginas web, y luego aprendieron Perl sin haber aprendido punteros, y no son capaces de producir código con la calidad que necesitas.
Después de leer este artículo (en una versión más antigua), empecé a aplicar esa pequeña prueba en las entrevistas técnicas que tenía que hacer en la empresa en la que trabajaba. Normalmente les pedía a los candidatos que implementasen una función (o un método, ya que yo les dejaba elegir el lenguaje que querían utilizar) que diese la vuelta a una lista enlazada.
- Muchos de los candidatos (con algún año de experiencia a sus espaldas) se lanzaban a escribir el código directamente, sin ni siquiera hacer un pequeño esquema con la lista enlazada, para hacerse una idea de este puntero que va aquí tiene que ir allí, etc. - picar sin pensar? malo, malo...
- Otros directamente no sabían lo que era una lista enlazada, y cuando se lo explicabas, se quedaban perplejos (en ese momento me preguntaba en qué universidad habían estudiado, y si las horas de estructuras de datos las pasaba fumando canutos o jugando al mus).
- Pero una de las cosas que pude ver es que la mayoría de la gente que elegía hacerlo en Java, VB.NET o C# tenía un serio problema con los constructores de los objetos. Se liaban a rellenar objetos y enlazarlos entre sí. La mayoría de las veces estaban rellenando el mismo objeto una y otra vez, enlazándolo consigo mismo. No eran capaces de entender que lo que manejaban son referencias a objetos.
Sólo uno de los que decidió utilizar C# me sorprendió poniendo: return list.Reverse(); Qué crack ;)
Un ejemplo de lo que se podría hacer sabiendo utilizar punteros (desde C# y sin usar código unsafe) se puede ver en los comentarios de este artículo de CodeProject.
Hay otra razón de peso para aprender a programar en C antes que en .NET (y ahora hablo únicamente de C). .NET al final es un wrapper construido sobre una API (sea Win32, o sobre las librerías estándar de C en el proyecto Mono). Ese wrapper puede tener bugs (y alguno tiene). Y cuando algo no funciona como es debido en ese wrapper, si no tienes los recursos suficientes para implementar una solución alternativa, lo llevas claro (bueno, más bien oscuro). Interop te puede ayudar, pero no hace milagros. Y si has programado en C para Win32, puedes saber por ejemplo lo que es el bucle de mensajes, y trastear con el WndProc de los controles de .NET. Sí, es raro, y puede que no te vaya a hacer falta... Pero si lo sabes, lo puedes utilizar. Si no... Pues no.
Algunas otras razones hay, como por ejemplo el tener presente siempre la utilización de los recursos (como en C tienes que pedirlos y liberarlos explícitamente, eso siempre ayuda), ya que ciertos recursos son limitados (conexiones a la base de datos, objetos de GDI...) y el no liberarlos correctamente puede hacer que una aplicación se arrastre, o directamente no funcione.
Y si nos vamos a los extremos... Al final el ordenador lo que hace es mover memoria de aquí para allá... :P
Por último, si quieres ser un buen desarrollador... (esto me fastidia, pero es así) hay que saber inglés. Y muy bien. Aunque gracias a Geeks cada vez hará menos falta.
En fin... ¿Qué opináis vosotros sobre este tema?
Archivado en: Opinión,POO,C
Comparte este post: