13 julio 2006

Aprende a programar en 10 años...

Me encontre con este texto en la pagina de Illasaron y me parecio bastante interesante.

Texto original: Peter Norvig
Traducido por: Carlos Rueda


¿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 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 Bengalí en 30 días). Remplacé "days" por "hours" 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 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:

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 se necesitan 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 programa porque es divertido. Asegúrate de que te diviertes tanto como para 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 practicando. 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.


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 expertoUnos de los mejores programadores que yo haya contratado alguna vez tenía sólamente un grado de bachiller; pero ha producido una gran cantidad de excelentes programas, tiene su propio grupo de noticias, y sin duda es mucho más rico de lo que yo pueda llegar 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.

A cualquiera se le puede enseñar a esculpir: A Miguel Angel habría que haberle enseñado cómo no hacerlo. Así pasa con los grandes programadores.Con todo lo anterior en mente, es cuestionable lo lejos que puedes llegar sólo leyendo libros. Antes de que naciera mi primer hijo, leí todos los libros Aprende a..., 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 haberle 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.

4 comentarios:

mikeshot dijo...

Ya Tadeo, no busques más pretextos y decídete a PROGRAMAR. Tarde o temprano deberás escribir una aplicación, aunque sea para sacar de apuros a alguien :-P

See ya then !!!

Jesus Ferruzca dijo...

El texto es correcto... lo dificil es iniciar, y darte cuenta que es divertido programar, no es Tadeoso, perdón tedeoso... ES DIVERTIDO LOGRAR QUE TU SISTEMA FUNCIONE O HAGA LO QUE TE PIDEN!.

Como dice el Mike, no pongas pretextos, según mis cálculos llevo 6 años programando, pero me hacen falta más de 10 para aprender correctamente a hacerlo....

Tú, Tadeo, tienes el apoyo de nosotros tus amigos, donde tengas dudas y te podamos ayudar no lo dudes...

Si quieres un Mustang para tí... la solución es un poco más dificil por el lado de Soporte Técnico... ERES INGENIERO EN SISTEMAS.

INGÉNIA SISTEMAS!

En la escuela se aprende muy poco, muchisimo muy poco... pero estuvimos ahí mas por el papel que por otra cosa... acá en la practica está todo.

Preguntale al Jerry... SOY AFORTUNADO AL VERLO PROGRAMAR.. no me creas mucho, pero creo que ya se le olvido lo que es documentar.

Ayer me lucieron su módulo.. nuestra jefa de proyecto, y la neta, no es tan tarado como se vé (:P).. si sabe programar. je je je

El próximo en programar será el Ingeniero en Sistemas Computacionales, Daniel Esaú Tadeo Durán.

He Dicho!

Unknown dijo...

Yo solo quiero rockear, yo solo quiero rockear, yo solo quiero rockeaaaaaarrr....
YEAAHHH....
Se que tengo que programar y lo voy a hacer no se preocupen, la cosa es que no estoy para contarlo ni ustedes para saberlo... asi que no les voy a decir ni mayes :P jejejeje

DeadVax dijo...

Envidiosooooo jajaja ps ya sabes comparte el conocimiento, cuando quieras nosotros te compartiremos nuestro conocimiento acerca de las ciencias que dominamos, como: Futbol, Mamiruquis jaja, albures, etc, etc tu no te preocupes =P.. echale ganas Mateo San-Cudo, cuidese ahi nos estamos viendo