Peter Norwig: Aprenda programación en ... 10 años

Nota del traductor: Este artículo fue publicado por Peter Norvig en 2001. Según la versión de 2001, se realizó una traducción al ruso . En 2014, el artículo se actualizó, pero la traducción no se actualizó. Por lo tanto, completé mi traducción del artículo sobre su versión moderna de 2014. Creo que el artículo no ha perdido su relevancia, aunque está algo desactualizado. Si encuentra algún error de traducción, escriba un mensaje personal.

¿Dónde están todos tan apurados?


Vaya a cualquier librería e inmediatamente verá un libro sobre cómo aprender Java en 24 horas, así como un sinfín de opciones sobre cómo aprender C, SQL, Ruby, algoritmos, etc. en unos días u horas. La Búsqueda avanzada de Amazon [ título: enseñar, usted mismo, horas, desde: 2000 ] enumera 512 libros. De los diez primeros, nueve son libros sobre programación (solo uno es sobre contabilidad). Obtendrá los mismos resultados al reemplazar "enseñar a sí mismo" con "aprender" y "horas" con "días".

Esto lleva a la conclusión: o las personas tienen prisa por aprender programación, o de alguna manera fabulosa es más fácil aprender programación que cualquier otra cosa. Felleisen y col. mencionaron esto en su libro Cómo diseñar programas , cuando escribieron: “La mala programación es fácil. "Los idiotas pueden aprender esto en 21 días, incluso si están llenos de nerds". El sitio web cómico Abtruse Goose también repasó este tema ( aquí está el enlace ).

Veamos qué puede significar el título del libro Teach Yourself C ++ en 24 horas :

  • Enséñese: en 24 horas no tendrá tiempo para escribir algunos programas importantes y sacar conclusiones de sus éxitos y fracasos. No tendrá tiempo para trabajar con un programador experimentado y comprender cuál es la ideología de C ++. En resumen, en este corto tiempo no aprenderás tanto. Entonces, el libro tiene en mente solo un conocimiento superficial, pero no una comprensión profunda. Como dijo Alexander Pope: " Poco conocimiento es algo peligroso ".
  • C ++: en 24 horas, eres bastante capaz de aprender algo de la sintaxis de C ++ (si ya conoces otro lenguaje de programación), pero no sabes mucho cómo usar este lenguaje. En resumen, si usted, por ejemplo, es un programador básico, aprenderá a escribir programas de estilo básico utilizando la sintaxis de C ++, pero no comprenderá para qué tareas es realmente bueno (o malo) C ++. ¿Entonces qué dices? Como dijo Alan Perlis : " Si un lenguaje no cambia su comprensión de la programación, aprenderlo es inútil ". Bueno, excepto que necesita aprender un poco de C ++ para comprender cómo usar algún tipo de biblioteca para una tarea específica. Pero en este caso, no estamos hablando de enseñar programación en el lenguaje; solo estás aprendiendo a completar una tarea específica.
  • en 24 horas: Desafortunadamente, como muestro a continuación, esta vez no es suficiente.

Aprende programación en 10 años


Los estudios ( Bloom (1985) , Bryan y Harter (1899) , Hayes (1989) , Simmon y Chase (1973 ) demostraron que se necesitan unos diez años para dominar las habilidades en un área específica, por ejemplo, en jugando ajedrez, composición musical, trabajando con telégrafo, dibujando, tocando el piano, natación, tenis, neurofisiología y topología. El secreto está en la práctica reflexiva : no solo la repetición mecánica, sino la búsqueda de tareas que son más altas que su nivel actual, resolviéndolas, analizando sus acciones durante su solución y después de que se resuelvan, corrigiendo los errores cometidos. Y de nuevo. Y de nuevo. No hay un camino más corto: incluso Mozart, quien a los 4 años se convirtió en un niño milagro musical, tardó 13 años en comenzar a crear música de clase mundial. Los Beatles en 1964 irrumpieron en la escena con un montón de éxitos y actuaron en el show de Ed Sullivan. Pero antes de eso habían estado jugando en los pequeños clubes de Liverpool y Hamburgo desde 1957. Y a pesar de su fama mundial entre los fanáticos, su primer éxito entre los críticos musicales llegó con el lanzamiento del sargento Pepper en 1967.

Esta idea fue popularizada por Malcolm Gladwell en su libro, aunque allí habla de 10,000 horas, no de 10 años. El famoso fotógrafo Henri Cartier-Bresson (1908-2004) expresó esta idea de la siguiente manera: " Las primeras 10.000 fotografías serán las peores " (ni siquiera sospechaba que con una cámara digital algunas personas lograran alcanzar esta cifra en una semana). La experiencia real viene con la vida: Samuel Johnson (1709-1784) escribió: “La experiencia en cualquier campo solo se puede obtener a través del trabajo de toda una vida; no hay precio más bajo "; Chaucer (1340-1400) se quejó: " Tan poco para vivir, tanto para aprender ". Hipócrates (400 aC) es famoso por su afirmación "la vida es corta, la ciencia es vasta ", que suena completamente así: "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", y en la traducción rusa "Life en resumen, la ciencia es vasta, el caso de los temblores, la experiencia es engañosa, el juicio es difícil ". Por supuesto, ni un solo número puede ser la respuesta exacta: no hay razón para suponer que todas las habilidades (programación, jugar al ajedrez, damas, un instrumento musical) requieren exactamente el mismo tiempo para dominarlas, así como lo que requieren diferentes personas exactamente al mismo tiempo. Como dijo el profesor K. Anders Ericsson : “ En la mayoría de las áreas, es simplemente increíble cuánto tiempo lleva dominar incluso a los más talentosos. El número '10 .000 horas 'solo lo ayuda a comprender que estamos hablando de varios años de arduo trabajo de 10-20 horas a la semana para alcanzar el nivel más alto incluso para el talento más talentoso desde el nacimiento

Entonces quieres convertirte en programador


Aquí está mi receta para el éxito en la programación:

  • Interesarse en la programación y crear algo solo por diversión. Debería ser tan interesante para usted que no sería una pena gastar los próximos 10 años / 10,000 horas en ello.
  • Programa . El mejor entrenamiento es la práctica . En términos técnicos, "el nivel máximo de rendimiento para un individuo en un área determinada no se alcanza automáticamente con la experiencia, por el contrario, el nivel de productividad puede aumentarse incluso en los individuos más experimentados debido a un deseo consciente de mejora" ( p. 366 ) y "para el entrenamiento más efectivo se necesita un buen La tarea con el nivel apropiado de complejidad para un individuo en particular, una evaluación comprensible de su implementación y la posibilidad de su implementación repetida y corrección de errores Ibok ”(pp. 20-21) El libro Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life es una lectura muy instructiva sobre este pensamiento.
  • Hable con otros programadores; leer otros programas Esto es mucho más importante que cualquier libro o curso de capacitación.
  • Si quieres, dedica cuatro años a estudiar en la universidad (o en la escuela de posgrado). Esto le dará acceso al trabajo que requiere títulos y títulos probados. Pero si no le gusta estudiar, puede (con cierto celo) obtener el mismo conocimiento por su cuenta o directamente en el trabajo. En cualquier caso, aprender solo de los libros no es suficiente. " La educación en informática no convertirá a nadie en un experto en programación, al igual que estudiar pinceles y pigmentos de colores no puede convertir a nadie en un artista maestro " , escribe Eric Raymond , autor de The New Hacker's Dictionary. El mejor programador que tuve que contratar solo tenía un curso escolar integral detrás de él, y creó excelentes programas , moderó la lista de correo de sus fanáticos y ganó suficiente dinero en opciones para comprar su propio club nocturno .
  • Trabaja en proyectos con otros programadores. Sé el mejor programador en un proyecto; Ser el peor en los demás. Cuando eres el mejor, evalúas tu habilidad para liderar un proyecto e inspiras a otros con tu visión. Cuando eres el peor, aprendes de los maestros qué hacen y qué no les gusta hacer (esto es lo que te indican que hagas).
  • Trabaja en proyectos después de otros programadores. Intenta descifrar un programa escrito por otra persona. Eche un vistazo más de cerca a lo que se requiere para comprender el código y corríjalo cuando no haya programadores cerca que lo hayan escrito. Piense en cómo diseñar sus programas para que sean más fáciles de apoyar para aquellos que trabajarán con ellos después de usted.
  • Aprenda al menos media docena de lenguajes de programación . Elija un idioma para el aprendizaje que se base en abstracciones de clase (por ejemplo, Java o C ++), uno que admita abstracciones funcionales (por ejemplo, Lisp o ML o Haskell), uno que admita la abstracción sintáctica (por ejemplo, Lisp), un lenguaje declarativo (por ejemplo, , Prolog o C ++ - plantillas), y uno - enfatizando la concurrencia (por ejemplo, Clojure o Go).
  • No olvides que en la frase "informática" se encuentra la palabra computadora . Recuerde cuánto tiempo le toma a su computadora ejecutar una instrucción, leer una palabra de máquina de la memoria (con y sin perder en el caché), leer una secuencia de palabras de máquina de un disco, buscar un registro en un disco ( Respuestas aquí )
  • Participe en la estandarización de un lenguaje de programación. Puede ser una comisión ANSI C ++, o una reunión en su equipo donde usted determina cuántos espacios deja para sangrar en el código - 2 o 4. En cualquier caso, descubrirá qué les gusta a otras personas en el idioma, qué tan profundamente sienten y también quizás descubras de dónde vino.
  • Sepa cuándo es el momento de abandonar la comisión de estandarización de idiomas lo más rápido posible.

Con todo lo anterior, solo leer libros no te dará tanto. Antes del nacimiento de mi primer hijo, leí todos los libros sobre el cuidado de bebés, y aún no entendía qué hacer. 30 meses después, cuando mi segundo hijo se estaba preparando para nacer, ¿crees que busqué en los libros para refrescar mi memoria? No Confié en mi propia experiencia, que resultó ser mucho más útil y mejor que miles de páginas escritas por expertos.

Fred Brooks, en su artículo " La bala de plata no existe " , describió tres pasos para encontrar grandes programadores:

  1. Identifique sistemáticamente a los mejores programadores lo antes posible.
  2. Asigne un mentor al programador que se dedicará al desarrollo del talento y supervisará cuidadosamente su carrera.
  3. Fomentar la comunicación de los talentos crecientes entre sí en todos los sentidos, para que intercambien ideas.

Resulta que algunas personas ya tienen cualidades que les permiten convertirse en grandes programadores; solo necesitan ser dirigidos por el camino correcto. Alan Perlis lo expresó de manera más sucinta: “A todos se les puede enseñar a esculpir esculturas; Miguel Ángel tendría que aprender a no esculpirlos. Del mismo modo, con los grandes programadores ". Perlis quería decir que los grandes tienen algunas cualidades internas que no se adquieren a través del entrenamiento. ¿Pero de dónde vienen estas cualidades? ¿Es congénito? ¿O son producidos por celo? Como dijo Aguste Gusto (personaje de la caricatura Ratatouille ), " cualquiera puede cocinar, pero solo los intrépidos pueden volverse geniales ". Creo que en nuestro caso estamos hablando de un deseo ardiente de dedicar la mayor parte de mi vida al autoaprendizaje centrado en la programación. Pero puede haber una palabra intrépida más apropiada. O, como dijo Anton Yego (crítico de Aguste Gusto): " no todos pueden convertirse en grandes artistas, pero un gran artista puede aparecer en todas partes ".

Entonces, adelante, compre un libro en Java / Ruby / JavaScript / PHP; tal vez obtendrá algún beneficio de ello. Pero no podrá cambiar su vida y no se convertirá en un experto en programación en 24 horas o en 21 días. ¿Qué tal pasar 24 meses de arduo trabajo dominando continuamente el tema? Ahora ya estamos teniendo una conversación seria ...

Literatura


  • Bloom, Benjamin (ed.) Talento en desarrollo en los jóvenes, Ballantine, 1985.
  • Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
  • Bryan, WL & Harter, N. "Estudios sobre el lenguaje telegráfico: la adquisición de una jerarquía de hábitos. Psychology Review, 1899, 8, 345-375
  • Hayes, John R., Solucionador de problemas completo Lawrence Erlbaum, 1989.
  • Chase, William G. y Simon, Herbert A. "Percepción en el ajedrez" Psicología cognitiva, 1973, 4, 55-81.
  • Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

Las respuestas


Tiempo estimado para realizar varias operaciones en una PC típica:
ejecución de una instrucción típica1 / 1,000,000,000 sec = 1 nanosec
leer del caché L10.5 nanosec
error al predecir la transición5 nanosegundos
leer del caché L27 nanosec
captura / liberación de mutex25 nanosegundos
lectura de la memoria principal100 nanosec
enviar 2K a través de una red de 1 Gbps20,000 nanosegundos
leer 1 MB secuencialmente de la memoria250,000 nanosec
leer desde el disco con búsqueda (buscar)8,000,000 nanosec
leer 1 MB secuencialmente desde el disco20,000,000 nanosec
Enviar un paquete de datos desde los EE. UU. a Europa y viceversa150 milisegundos = 150,000,000 nanosegundos


Aplicación: selección de idioma


Algunos lectores me preguntaron qué lenguaje de programación deberían aprender primero. No hay una respuesta única para esta pregunta, pero considere los siguientes puntos:

  • Contacta a tus amigos . Cuando me preguntan, "¿qué sistema operativo debo elegir: Windows, UNIX o Mac?", Respondo: "usa el que usan tus amigos". Lo que aprenda de sus amigos cubrirá más que cualquier diferencia interna entre sistemas operativos o lenguajes de programación. Considere también a sus futuros amigos: la comunidad de programadores, de la cual formará parte si continúa su capacitación. ¿El idioma de su elección tiene una gran comunidad en crecimiento o es pequeño y está desapareciendo gradualmente? ¿Hay muchos libros, sitios web y foros donde pueda obtener respuestas? ¿Te gustan las personas que pasan el rato en estos foros?
  • Comience simple . Los lenguajes de programación C ++ y Java están diseñados para el trabajo profesional de grandes equipos de programadores experimentados que están más preocupados por la eficiencia de la ejecución de su código. Como resultado, estos lenguajes de programación tienen estructuras complejas para resolver tales problemas. Es importante que aprenda a programar. No necesitas complejidad extra. Necesita un lenguaje especialmente creado para que sea fácil de aprender y recordar.
  • Jugar. ¿Cómo le gustaría aprender a tocar el piano: de la manera interactiva habitual, cuando escucha cada nota tan pronto como presiona una tecla, o en "modo de lote", cuando escucha la melodía completa solo después de presionar todas las notas de una canción en las teclas? Por supuesto, la forma interactiva es mucho más fácil, como lo es la programación. Seleccione un idioma que tenga un modo interactivo de operación y reprodúzcalo.

Teniendo en cuenta todos estos criterios, recomiendo Python o Scheme como el primer lenguaje de programación. O JavaScript, pero no porque esté idealmente diseñado para principiantes, sino porque hay muchos libros de texto en este idioma, por ejemplo, en Kahn Academy . Pero su caso particular puede ser especial, por lo que hay muchos otros idiomas para elegir. Si tiene menos de diez años, puede que le guste el idioma de Alice o Squeak o Blockly (a los estudiantes mayores también les pueden gustar). Lo principal es tomar una decisión y comenzar a aprender.

Apéndice: libros y otros recursos


Me preguntan qué libros y sitios web son mejores para aprender. Repetiré nuevamente: "leer libros por sí solo no es suficiente", pero recomiendo lo siguiente:

Source: https://habr.com/ru/post/es416167/


All Articles