Aprende a programar en diez años
Por Peter Norvig. Teach
Yourself Programming in Ten Years.
Traducción libre al español por Carlos Rueda - http://loro.sf.net
¿Por qué todos tienen tanto afán?
Entra a cualquier librería y encontrarás Aprende Java
en 7 Días y demás variaciones interminables ofreciendo
enseñar Visual Basic, Windows, Internet, etc., en unos pocos días
u horas. Yo hice la siguiente búsqueda avanzada (power
search) en Amazon.com :
pubdate: after 1992 and title: days and
(title: learn or title: teach yourself)
y obtuve 248 ítems de resultado. Los primeros 78 fueron libros de
computación (el número 79 era Aprende Bengali en 30 días
-- Learn
Bengali in 30 days ). Remplacé "days" (días) por
"hours"
(horas) y obtuve, sorprendentemente, resultados similares: 253 libros más,
con 77 libros de computación seguidos de Aprende Gramática
y Estilo en 24 horas (Teach
Yourself Grammar and Style in 24 Hours) en el número 78.
Del total de los primeros 200, 96% fueron libros de computación.
La conclusión es que, o bien la gente tiene un gran afán
por saber de computadoras, o bien las computadoras son algo fabulosamente
más fácil de aprender que cualquiera otra cosa. No hay libros
sobre cómo aprender Beethoven, o Física Cuántica,
o incluso Estética Perruna en pocos días.
Analicemos lo que podría significar un título como Aprende
Pascal en Tres Días (Learn
Pascal in Three Days):
-
Aprende: En 3 días no tendrás tiempo de escribir varios
programas significativos, y de aprender de tus éxitos y errores
con ellos. No tendrás tiempo de trabajar con un programador experimentado
y entender lo que es vivir en ese ambiente. En resumen, no tendrás
tiempo de aprender mucho. Así que esos libros sólo podrán
lograr una familiaridad superficial, no un entendimiento profundo. Como
dijo Alexander Pope, poco aprendizaje es asunto peligroso.
-
Pascal: En 3 días puedes aprender la sintaxis de Pascal (si
ya conoces un lenguaje similar), pero no podrás aprender mucho cómo
usarla. En síntesis, si fueras, digamos, un programador Basic, podrías
aprender a escribir programas en el estilo de Basic usando la sintaxis
de Pascal, pero no aprenderías realmente para lo que Pascal es bueno
(o malo). Entonces ¿cuál es el objetivo? Alan
Perlis dijo alguna vez: "Un lenguaje que no afecte tu manera de pensar
acerca de la programación, no merece conocerse". Un objetivo posible
es que tienes que aprender un poco de Pascal (o más probablemente,
algo como Visual Basic o JavaScript) porque necesitas tener una interface
con una herramienta existente para realizar una cierta tarea. Pero entonces
no estás aprendiendo cómo programar; estás aprendiendo
cómo realizar esa tarea.
-
en Tres Días: Desafortunadamente, no son suficientes, como
se describe en la siguiente sección.
Aprende a programar en diez años
Algunos investigadores (Hayes
, Bloom)
han mostrado que toma aproximadamente diez años desarrollar habilidades
en cualquiera de una amplia variedad de áreas, incluyendo el juego
de ajedrez, la composición musical, la pintura, el piano, la natación,
el tenis, y la investigación en neurosicología y topología.
Parece no haber atajos: incluso Mozart, prodigio musical a los 4 años,
se tomó 13 más antes de empezar a producir música
de calidad mundial. En otro género, parece que los Beatles llegan
a escena apareciendo en el espectáculo de Ed Sullivan en 1964. Pero
ellos habían estado tocando desde 1957, y aunque tenían una
masa de seguidores desde antes, su primer gran éxito, Sgt. Peppers
, apareció en 1967. Samuel Johnson pensaba que se requieren más
de diez años: "La excelencia en cualquier área puede lograrse
sólo mediante el trabajo de toda una vida; no es algo que pueda
adquirirse a un menor precio." Y Chaucer se quejaba "the lyf so short,
the craft so long to lerne."
Aquí está mi receta para el éxito en programación:
-
Interésate en la programación, y haz programación
porque es divertida. Asegúrate que se mantiene tan divertida que
estarás en disposición de invertir diez años.
-
Habla con otros programadores. Lee otros programas. Esto es más
importante que cualquier libro o curso.
-
Programa. El mejor tipo de aprendizaje es aprender haciendo (learning
by doing) . Para decirlo más técnicamente, "El máximo
nivel de desempeño de los individuos en un dominio dado, no se logra
automáticamente como función de experiencia extendida, sino
que el nivel de desempeño puede incrementarse incluso en individuos
altamente experimentados como resultado de esfuerzos deliberados por mejorar."
(p.
366) y "el aprendizaje más efectivo requiere una tarea bien
definida con un apropiado nivel de dificultad acorde con el individuo,
retroalimentación informativa, y oportunidades de repetición
y corrección de errores." (p. 20-21) El libro Cognition
in Practice: Mind, Mathematics, and Culture in Everyday Life es
una interesante referencia sobre este punto de vista.
-
Si quieres, dedica cuatro o cinco años en una universidad (o más
en una escuela de graduados). Esto te dará acceso a algunos posiciones
que requieren credenciales, y te dará un entendimiento más
profundo del campo, pero si no disfrutas la escuela, puedes (con algo de
dedicación) obtener una experiencia similar trabajando. Como sea,
la lectura de libros por sí sola no será suficiente. "La
educación en computación no puede hacer a nadie un expero
programador más que el estudio de pinceles y pigmentos puede hacer
a alguien un pintor experto" dice Eric Raymond, autor de The New Hacker's
Dictionary. Unos de los mejores programadores que yo haya contratado
alguna vez tenía sólamente un grado de bachiller (High School);
pero ha producido una gran cantidad de excelentes
programas , tiene su propio grupo
de noticias (news
group) , y sin duda es mucho más rico de lo que yo llegue a
ser.
-
Trabaja en proyectos con otros programadores. Sé el mejor programador
en algunos proyectos; sé el peor en otros. Cuando eres el mejor,
tienes que poner a prueba tus habilidades para liderar un proyecto y para
inspirar a otros con tu visión. Cuando eres el peor, aprendes lo
que los maestros hacen, y aprendes lo que a ellos no les gusta hacer (pues
te ponen a hacerlo por ellos).
-
Trabaja en proyectos después que otros programadores. Proponte
entender un programa escrito por otra persona. Mira cuánto toma
entenderlo y hazle correcciones cuando los programadores originales no
están allí. Piensa en cómo diseñar tus programas
para facilitarles el trabajo a aquellos que le harán mantenimiento
después de tí.
-
Aprende por lo menos una media docena de lenguajes de programación.
Incluye uno con soporte para abstracciones de clases (como Java o C++),
uno que dé soporte a la abstracción functional (como Lisp
o ML), uno que dé soporte a la abstracción sintáctica
(como Lisp), uno que dé soporte a especificationes declarativas
(como Prolog o plantillas C++), uno que dé soporte a corutinas (como
Icon o Scheme), y uno que dé soporte al paralelismo (como Sisal).
-
Recuerda que hay "computadoras" en la "ciencia de la computación".
Conoce cuánto le toma a tu computadora ejecutar una instrucción,
alcanzar una palabra de la memoria (con y sin cache), leer palabras consecutivas
de disco, y ubicar una nueva localización en disco. (Respuestas
aquí.)
-
Involúcrate en un plan de estandarización de algún
lenguaje. Podría ser en el mismo comité ANSI C++, o podría
ser simplemente decidir si tu estilo de codificación tendrá
niveles de identación de 2 ó 4 espacios. Como sea, averigua
lo que les gusta a otras personas en un lenguaje, cómo lo perciben,
y quizá incluso un poco de por qué lo perciben como lo hacen.
-
Ten el buen juicio para lanzar el plan de estandarización del
lenguaje tan pronto como sea posible.
Con todo lo anterior en mente, es cuestionable qué tan lejos puedes
llegar sólo leyendo libros. Antes de que naciera mi primer hijo,
leí todos los libros Aprende a (How To), y sin embargo
me sentía como un tonto principiante. 30 meses después, cuando
nació mi segundo hijo, ¿acaso regresé a los libros? No.
Al contrario, me apoyé en mi experiencia personal, que me resultó
mucho más útil y confiable que las miles de páginas
escritas por los expertos.
Fred Brooks, en su ensayo No
Silver Bullets, identificó un plan de tres partes para encontrar
grandes diseñadores de programas:
-
Sistemáticamente identificar a los diseñadores líderes
lo más pronto posible.
-
Asignar un tutor de carrera para que sea responsable del desarrollo del
prospecto y mantenga cuidadosamente un registro de seguimiento.
-
Ofrecer oportunidades a los diseñadores en crecimiento para que
interactúen y se motiven mutuamente.
Esto asume que algunas personas ya tienen las cualidades necesarias para
ser grandes diseñadores; la tarea es persuadirlos apropiadamente.
Alan
Perlis lo dice de manera más sucinta: "A cualquiera se le puede
enseñar a esculpir: A Miguel Angel habría que habérsele
enseñado cómo no hacerlo. Así pasa con los grandes
programadores".
Así que adelante, compra ese libro de Java; probablemente obtendrás
algo de él. Pero no cambiará tu vida o tus reales habilidades
como programador en 24 horas, días o incluso meses.
Referencias
Bloom, Benjamin (ed.) Developing
Talent in Young People, Ballantine, 1985.
Brooks, Fred, No
Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Hayes, John R., Complete
Problem Solver Lawrence Erlbaum, 1989.
Lave, Jean, Cognition
in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge
University Press, 1988.
Respuestas
Tiempos de demora de varias operaciones en una PC típica de 1GHz,
verano de 2001:
execute single instruction |
1 nsec = (1/1,000,000,000) sec |
fetch word from L1 cache memory |
2 nsec |
fetch word from main memory |
10 nsec |
fetch word from consecutive disk location |
200 nsec |
fetch word from new disk location (seek) |
8,000,000nsec = 8msec |
Peter Norvig (Copyright
2001)