La búsqueda de la excelencia en la programación

Enviado por Point_to_null el 14 Julio, 2010 - 19:43.

Programador

Encontré hace poco este excelente articulo escrito por Antonio Cangiano en su blog "El zen de la programación". Es una invitación para realizar la reflexión que todos nos debemos a nosotros mismos. El lucido planteo sobre la naturaleza de la inteligencia y del aprendizaje le bastaría para ser meritorio pero, no conforme con eso y aprovechando lo dinámico y fluido de su estilo, el autor presenta sus estrategias y métodos en la búsqueda de la excelencia en la programación; métodos que yo ya he comenzado a aplicar felizmente.

Como no soy del todo egoísta, y en sintonía con mis convicciones sobre las ventajas de compartir el conocimiento, me pareció buena idea traducirlo y publicarlo en este humilde blog para provecho de todos nosotros. El autor así me lo autorizó y hoy les presento esta imperfecta traducción:


Como escribí una serie de reflexiones sobre la búsqueda de la excelencia en la programación debo iniciar mi ensayo pidiéndole que olvide que escribí aquellas palabras. Lo invito a evaluar las opiniones e ideas presentadas aquí sin ad hominem, sino en base a sus propios méritos. Puede ser fácil, de otro modo, desestimarlas erróneamente con la infame pregunta planteada por Steve Jobs a un blogger: "¿que has hecho que es tan grandioso?".

Quiero decir; hablo de la meta ambiciosa y noble de conseguir la excelencia en la programación aunque soy plenamente consciente de no haber alcanzado dicha excelencia. Por el momento no creo que pueda señalar algo que vaya a impresionar a Steve Jobs (o a observadores menos críticos). Soy solo un viajero en la ruta del aprendizaje, con deseo de compartir sus experiencias y planes.


Dos visiones de la inteligencia

Dominar una disciplina compleja implica mucho aprender durante varios años, o décadas. Maximizar la habilidad para aprender es, por lo tanto, una inversión que puede recompensar rápidamente.

El mayor impacto en mi habilidad para aprender fue causado por un cambio en mi manera de considerar la inteligencia. Hay, principalmente, dos formas de pensar en ella: considerarla como una habilidad intrínseca y estática o como una característica más dinámica y cultivable del ser humano.

Científicos congnitivistas y psicólogos determinaron concluyentemente que la gente que percibe la inteligencia como una característica dinámica se supera y logra más éxito que aquellos que la internalizan como una habilidad intrínseca estática.

Vale la pena mencionar que la inteligencia puede realmente ser desarrollada a través de su aplicación. Este es el modo de percibirla que es base del método de aprendizaje del estudiante.

Esta diferencia de percepción es, muchas veces, condicionada en la infancia temprana. Los niños que son alentados a trabajar duro para alcanzar resultados, y son felicitados en base a sus esfuerzos, tienden a desarrollar una percepción dinámica de inteligencia y resultan siendo personas que pueden trabajar. Otros niños están condicionados para pensar que lo están haciendo bien porque son "inteligentes" y que su inteligencia probablemente los conducirá al éxito por si sola.

La sociedad tiene fascinación por los genios y a los padres les gusta presumir que sus pequeños son varias desviaciones estándar mejores que la media, pero condicionar a los niños de esta manera tiene consecuencias peligrosas y contraproducentes.

Los niños que son etiquetados y alabados por sus “capacidades innatas”, sufrirán de un exceso de confianza que afectará su habilidad para desafiarse a si mismos a través de las profundidades de lo desconocido porque sentirán que podrían poner en peligro su estatus. ¿Que sucederá si fallan? Significaría, a sus ojos, que tal vez no son las personas inteligentes que suponían ser. Todos vimos a estos niños fallar para, rápidamente, inventar excusas como “Oh, no lo estaba intentando en realidad”.

Un padre que cultiva el interés de un niño por el trabajo duro probablemente aliente a su hijo con palabras como “Está bien. Sigue estudiando y definitivamente lo harás mejor la próxima vez”. Un padre proponiendo un modelo de inteligencia estática puede justificar las fallas de sus hijos en determinado tema concluyendo que “quizás X no es lo tuyo”.[1]

Al enfrentar una derrota el chico de la “inteligencia estática” puede derrumbarse bajo el peso de su propia falla, como si el fracaso fuese un reflejo de su valor intrínseco en lugar de un tropezón temporal y una oportunidad para mejorar. Un chico de “inteligencia dinámica” simplemente se esforzará más la próxima vez. Genios o no, la excelencia y maestría en cualquier área requiere un gran esfuerzo y muchos chicos “inteligentes” fallan cuando el listón se levanta lo suficiente como para que la “inteligencia” baste por si sola. Esto usualmente coincide con el ingreso a la universidad.

Estoy muy familiarizado con todo esto porque fui uno de esos chicos. Fui etiquetado por mis padres y maestros de ciencias como “genio”. Incluso los psicólogos de la escuela, quieres vinieron para ayudarme a reconocer las carreras a las que mejor me adaptaría, terminaron diciéndome que yo podía seguir casi cualquier carrera (en ese tiempo estaba interesado en física nuclear) y de acuerdo a sus (casi sin sentido) pruebas de coeficiente intelectual yo era clasificado como "genio".

Hay que tener en cuenta que el problema no fueron las etiquetas. La mayoría de los chicos inteligentes se darán cuenta de que son inteligentes por su cuenta con bastante rapidez. El problema real fue que no me enseñaron el valor del esfuerzo intelectual a largo plazo. El esfuerzo en si mismo era considerado un detrimento a mi estatus. No solo se esperaba que yo tuviera éxito sino que se esperaba que lo lograra sin esfuerzo (un ambición “utópica”).

Uno de los primeros ejemplos de esto que puedo recordar cuando mi padre “me sorprendió estudiando” por unas horas el mismo libro antes de un examen en la escuela intermedia. El me dijo algo así como “¿Porque necesitas estudiar? Un genio como tu debería resolver el examen sin tener que estudiar”. Esto es absurdo, ahora lo sé, y probablemente es una de las cosas más tontas que mi padre —por lo demás bastante lucido— me dijo. Sin embargo una oración así puede tener un fuerte impacto en un joven.

Otro ejemplo tiene que ver con Latín. Mi profesora era lectora de manos y la clásica loca de los gatos; no le tuve respeto desde el comienzo. Por eso no presté atención en clases, además de no estudiar latín en casa, yo gesté mi propio fracaso. Cuando llegó la primera evaluación, obtuve una calificación ligeramente negativa. Mi menos que profesional profesora me dijo: “Oh, pensé que eras muy bueno pero supongo que no”. Después mi padre puso su parte diciendo algo así como: “Bueno, no te preocupes, supongo que los idiomas no son tu fuerte”.

Boom. Esto me bastó para dejar de interesarme en Latín e ignorar completamente una materia en la que no era excelente. Nadie podría decirme “eres estúpido porque no entiendes Latín” si yo no lo intentaba en absoluto. Entonces fui el chico del secundario que hacía cálculos avanzados por si mismo por diversión, mientras mi clase se complicaba con Álgebra, pero que apestaba en Latín. En retrospectiva, los patrones de pensamiento requeridos para la excelencia en Latín no son muy diferentes de los requeridos para la excelencia en matemáticas o para dominar el inglés como segunda lengua. Sospecho que de haberme esforzado un poco podría haber sido muy bueno y podría haber disfrutado la materia.

A través de los años debí reajustar esta percepción completamente. Al caer de bruces más de una vez aprendí que la excelencia solo se puede lograr combinando talento y esfuerzo. La verdadera genialidad es ser capaces de dedicar cientas de horas de estudio y practica a lo que se está intentando aprender y entender.

Miguel Ángel escribió:

Si la gente supiera cuan duro he trabajado para lograr mi destreza, no la encontrarían tan maravillosa en absoluto

Bajo esta nueva definición fui un completo idiota que debió aprender de cero como apreciar el valor del esfuerzo para afilar y desarrollar su "talento" (que no es más que una semilla).


Aprendiendo a aprender

Estando muy interesado en la programación, ciencias de la computación, matemáticas y la ciencias en general decidí, en algún momento, que debía cambiar enteramente mi actitud hacia el aprendizaje si me quería encumbrar en alguna de estas disciplinas. El esfuerzo era ahora más importante que la inteligencia por sí sola y solo debo sentirme satisfecho si hago un buen trabajo intentando algo realmente desafiante; esto no puede ser alcanzado con solo "talento".

Calogero C’ Anello de A Bronx Tale escribió:

Lo más triste en la vida es el talento desperdiciado, y las decisiones que tomas marcarán tu vida para siempre.

En el proceso, comencé a internalizar algunos principios y me ocupé de problemas sobre el arte de aprender y el arte de la programación.


Una sensación horrible

Hay un sesgo cognitivo conocido como el efecto Dunning-Krugerz[2], en el cual las personas que no tienen experiencia o son menos competentes en una disciplina dada tienden a sobrestimar sus habilidades (se ven, en otras palabras, afectados por una superioridad ilusoria[3].

La contracara es que cuanto más estudias más te das cuenta de lo poco que sabes y de cuanto más te falta aprender (un concepto propuesto por Sócrates en la época de la Antigua Grecia). Esto es a la vez un placer y un malestar. Hay una gran cantidad de satisfacción en descubrir cosas. Pero vivir en la duda y ser consiente de lo poco que se sabe es un efecto desagradable con el que todos los aprendientes tienen que vivir. La duda es el agua que es fundamental para el crecimiento de la flor de la curiosidad intelectual[4].

Mi enfoque en este caso es abrazar y dominar mi ignorancia y mis miedos. Siempre que hay un concepto del que me siento particularmente ignorante, o que ronda por sobre mi cabeza, trato de hacerle frente como si mi vida dependiera de ello. Hay un sinnúmero de cosas sobre las que aún soy ignorante pero este enfoque realmente me sirvió con el paso de los años.

Si estás intentando aprender toda una rama de las ciencias de la computación o de las matemáticas te tomará un largo tiempo; entonces debes comenzar primero con los pequeños "temores” que pueden ser dominados, al menos a un nivel introductorio, en una pequeña cantidad de tiempo. En lugar de pensar “Oh sí, realmente debería aprender Git” por meses, comienza a aprender. El conocimiento esencial para trabajar con Git o Hg no toma meses en aprender (asumiendo que necesitas de estas herramientas en particular).

Pero si estás aquí para el largo plazo entonces no tengas miedo en mejorar tu arte estudiando temas avanzados que requieren un mayor compromiso en términos de tiempo. No hay atajos reales, la maestría de un arte requerirá cientos de horas de estudio dedicado y práctica.


Teoría y práctica

Los maestros en cualquier disciplina intelectual tienden a tener un buen conocimiento de los aspectos prácticos y teóricos. La búsqueda de la excelencia en programación requiere el estudio de muchos libros agudos que ampliarán tu vista del campo y como resultado. necesariamente, mejorarán tu arte.

Mi primera regla: Trabajar solo con libros no es suficiente. La programación requiere escribir y leer código todos los días durante años. Por eso me niego a irme a dormir si no he leído y escrito algún código ese día (esto no incluye el código que escribo por trabajo, por supuesto). Hasta ahora esta regla ha tenido un impacto positivo en mi habilidad para codear.

Mozart escribió:

Es un error pensar que la practica de mi arte ha llegado sencillamente a mi. Le aseguro, querido amigo, nadie ha dado tanto cuidado al estudio de la composición como yo. Hay apenas un famoso maestro en música cuyos trabajos no he estudiado con frecuencia y diligencia.


Amplitud vs. Profundidad

Mientras progresamos en nuestro viaje en la búsqueda de la excelencia en programación, una pregunta que se volverá molesta en la mente de las personas es si uno debe buscar la amplitud o la profundidad de los conocimientos. Hay un sinnúmero de lenguajes de programación, paradigmas, metodologías, tecnologías, etcétera.

Lo cierto es que si nos convertiremos en grandes maestros de la programación no podemos ignorar ninguno de ellos. En la práctica la profundidad tiene un impacto mucho más fuerte en el modo en que construir software. Es a través del entendimiento profundo que podemos ver el conjunto a través de las partes. Por eso hay valor en especializarse en solo algunos lenguajes y tecnologías y dominarlos realmente en profundidad.

Tener el trabajo hecho en el desarrollo de software requiere cierto pragmatismo y capacidad para aprovechar las herramientas a mano. No hay escape. La profundidad es necesaria, aunque no suficiente.

Encuentro que la web es particularmente buena al cubrir el aspecto de la amplitud de temas. Siempre hay nuevas e interesantes áreas que puedes aprender y con las que experimentar. No necesitas todo un libro de 600 páginas para hacerte de una idea de, o para comprender mejor, ciertas tecnologías que no son cruciales en tu área de especialización.

Aunque hay algunas pocas excepciones que podría mencionar, yo diría que uso internet como una ayuda para el crecimiento horizontal de mi conocimiento y los libros para el crecimiento vertical. Y, de nuevo, la profundidad está más determinada por la cantidad de tiempo, practica y esfuerzo invertidos que por el medio usado.


Donde encontrar el tiempo

Una de las objeciones que oigo a menudo, particularmente a la hora de leer libros, es “¡No tengo tiempo!”. En unos pocos casos extremos esto puede ser realmente cierto, pero creo que la mayoría de la gente subestima enormemente cuanto tiempo "desperdicia" en sus costumbres diarias (incluso solo navegando).

Los descansos son extremadamente importantes, no estoy abogando por un régimen de incesante estudio. simplemente sé cuan crucial es el ser constante. Es una maratón, no una carrera corta.

Mi segunda regla: Me niego a ir a dormir ni no he leído, al menos, un capitulo de un libro ese día. Muchas veces cojo el libro que estoy leyendo o con el que estoy trabajando y termino leyendo mucho más que solo un capitulo (esto realmente depende del libro, claro). Pero para mi la regla es clara, no me está permitido dormir hasta que un capitulo haya sido leído cada día.

Intenta este enfoque y verás que leer libros no toma mucho tiempo, simplemente haciéndolo puedes leer varios libros (incluyendo técnicos) cada mes.

Aristóteles escribió:

Somos lo que repetidamente hacemos. Excelencia, entonces, no es un acto sino un hábito.

Para ciertos libros es conveniente tener una copia en PDF en tu ordenador, así podrás saltar del libro a tu editor/consola ida y vuelta. Sin embargo, generalmente hablando, el ordenador tiende a ser un poco más distrayente y pensamientos como “chequearé mi mail rápidamente” pueden, con suma facilidad, conducir a horas gastadas haciendo otras cosas.

Por esta razón prefiero leer desde un libro de papel, lo que es también más cómodo para mis ojos en las lecturas largas después de un día frente al monitor. Incluso si estoy usando el ordenador al mismo tiempo para probar código, la presencia física del libro cerca de mi portátil es suficiente para recordarme que no debo distraerme con internet. Para mí, la profundidad y el enfoque requerido por los libros es también un antídoto para el re-cableado que la red tiende a hacer en nuestro cerebro[5].

A propósito, hace pocos días Amazon anunció el nuevo Kindle DX de grafito de color[6]. Creo que puedo hacer un desembolso y tenerlo para mi próximo 30 cumpleaños. La adquisición de numerosos libros de papel es caro, y dado el precio de los libros Kindle este movimiento terminaría por ser más barato a largo plazo. La gran pantalla e-ink se ve similar a un libro de papel y el dispositivo no es tan distrayente como un iPad (un Kindle es para leer, y eso es todo). Además, es más ligero que la mayoría de libros técnicos y seguramente ocupa menos espacio en casa.


Logrando el enfoque

Con tantas cosas que pasan en el mundo de la programación las distracciones llegan fácilmente. Mi método es enfocarme solo en la macro-tarea dada. Si estoy intentando aprender sobre procesos de calculo, por ejemplo, entonces durante los siguientes meses mi "tiempo de aprendizaje" estará principalmente destinado a ese tema, como si el resto del ecosistema de la programación se detuviera en el tiempo.

Luego está el enfocarse en un nivel de micro-tarea. Aprender sobre determinado tema siempre puede dividirse en una larga serie de pequeños pasos. Cuando me enfoco en uno de esos pequeños pasos todo lo demás deja de existir (o al menos en la teoría).

Un truco que uso para lograr el enfoque solemne en micro-tareas, leer código, escribir código o leer libros técnicos, es el uso de la Técnica Pomodoro[7]. En síntesis, uso software de cronometro[8], que me alerta cuando 25 minutos (un pomodoro) han pasado, y me da cinco minutos de descanso por cada pomodoro. Cada 4 pomodoros puedo tomarme un descanso más largo.

Cuando comencé a usar esta técnica pensaba que era sobretodo un truco y me costaba mucho tomar descansos. Solo quería seguir adelante y el “horario” me parecía tonto. Sin embargo, debo admitir que con él se logra un elegante balance entre el deseo de enfocarse durante periodos extensos de tiempo y la importancia de tomar mini-recreos regularmente.

Este método se convirtió en rutina para mi mente por lo que, aunque solo sea un truco, es una buena manera para mantenerme enfocado y “en la zona”.


En busca de la sprezzatura

La búsqueda de la excelencia requiere un gran manejo de uno mismo y una fundamental insatisfacción con ser solo bueno en una disciplina determinada. Creo que esto es verdad independientemente de la profesión que se tenga.

Mientras progreso en mi viaje voy descubriendo como la clave es hacer de la búsqueda de la excelencia un habito. Esto va contra mi naturaleza de ser un velocista intelectual, pero estoy aquí para el largo plazo y realmente estoy aprendiendo a disfrutar de la maratón como un proceso.

Mi meta a largo plazo es programar con sprezzatura[9], cuando el proceso está tan internalizado y es tan parte de mi subconsciente que parece casi sin esfuerzo (como si el acto de programar estuviera en la memoria muscular). Será un suceso sobre la noche, tras quince años de preparación.

Independientemente del nivel de mejoría alcanzado siempre tendremos el placer, privilegio y necesidad de continuar aprendiendo para el mejoramiento de nosotros mismos y de nuestro arte. Cuando no hay destino el viaje es lo que realmente importa.

Miguel Ángel escribió:

Ancora imparo. (sigo aprendiendo)


Notas

[1] Estos conceptos son explicados, aunque en forma mucho más elocuente, en los primeros capítulos del excelente libro El arte de aprender de Josh Waitzkin.
[2] El efecto Dunning-Kruger en Wikipedia.
[3] Superioridad ilusoria en Wikipedia (en inglés).
[4] Por más sobre la importancia de la duda en la ciencia, echa un vistazo al bello epilogo en ¿Que te importa lo que piensan los demás? por Richard P. Feynman.
[5] Por más sobre este fenómeno lee Lo superficial: lo que Internet le está haciendo a nuestro cerebro por Nicholas Carr.
[6] El nuevo Kindle DX en Amazon.
[7] La técnica Pomodoro.
[8] Pomodoro para Mac OS X.
[9] Sprezzatura en Wikipedia.

Imagen de angeloss
Enviado por angeloss el 14 Julio, 2010 - 20:17.

Excelente entrada, muy interesante, me han llamado mucho la atencion sus metodos y "tips" por asi llamarlos, admito que yo he perdido esa sed de conocimiento sobre la programacion, me la pasaba horas y horas leyendo, escribiendo, probando, pero por algun motivo esa necesidad ya no me es tan fuerte, voy a poner en practica estas estrategias que has traducido para nosotros, muy agradecido..

saludos wink

Imagen de cenizoish
Enviado por cenizoish el 15 Julio, 2010 - 12:12.
point to null escribió:

Hay un sesgo cognitivo conocido como el efecto Dunning-Krugerz, en el cual las personas que no tienen experiencia o son menos competentes en una disciplina dada tienden a sobrestimar sus habilidades (se ven, en otras palabras, afectados por una superioridad ilusoria

Me ha gustado mucho esta entrada, la inteligencia y el proceso de aprendizaje desde el punto de vista de un superdotado que reflexiona acerca de los cambios que se producen en su propia experiencia cognitiva. Esto un maestro zen lo citaría de la forma Si trabajas con tu cerebro sobre tu propio cerebro, ¿cómo evitar una confusión inmensa? y sin embargo parece que no hay confusión en sus palabras sino simplemente una extrema lucidez.

Me ha gustado especialmente el párrafo que cito porque, aunque desconozco el efecto Dunning-Krugerz, como buen diletante me he visto a veces atacado por esa ilusión de sobrestimar las propias habilidades como un borrico que, con sus orejeras, no puede ver el horizonte en toda su amplitud. Creo que en esa línea hay una buena parte de la población del foro que firma o pone como título debajo de su avatar que Sólo se que no sé nada. Por supuesto no puedo compararme, soy consciente de mis limitaciones informáticas y me autoevalúo en los últimos lugares de la lista de usuarios de esdebian.

Respecto al contenido general de esta entrada citar lo que leí en un libro acerca de la programación para linux, riéndose de esas publicaciones que proclaman "aprenda phyton en un mes" o cosas parecidas. Decía:

Aprenda a programar en diez años.

Y aclaraba que se puede aprender la sintaxis de un lenguaje en relativamente poco tiempo, pero que para aprender a programar de verdad se necesitan paciencia+estudio+dedicación=diez años en el mejor de los casos. Tiempo mínimo para "recablear" esas conexiones neuronales. Creo que son synapsis ¿no?, es igual, se trata de programación de nuestro cerebro a bajo nivel, bonita analogía: Para programar hay que autoprogramarse.

Te felicito por esta entrada, algunas las sigo con verdadero interés.

Un saludo.

Imagen de m__x_
Enviado por m__x_ el 15 Julio, 2010 - 14:12.

"Todo hombre puede ser, si se lo propone, escultor de su propio cerebro."
-- Santiago Ramón y Cajal

Imagen de roma
Enviado por roma el 15 Julio, 2010 - 14:21.

Solo aplausos clap clap clap
Muy bueno y me llego en un momento mas que interesante de mi vida Muchas Gracias!!!

Imagen de julio-linux
Enviado por julio-linux el 15 Julio, 2010 - 21:49.

Interesante articulo, verdaderamente inspira a seguir aprendiendo. Cada día se aprende algo nuevo first muchas gracias.

Por cierto muy Interesante el articulo Lo que Internet le está haciendo a nuestro cerebro
Saludos!

Imagen de karell
Enviado por karell el 16 Julio, 2010 - 03:04.

Muy interesante e instructivo. Además de haberlo "rumiado" hasta la saciedad para mi misma, voy a dárselo a leer a mi hijo quien, por cierto, está interesado en la Programación.
Excelente entrada, de primera. first

PD. Lo único que siento es no haber podido complementar la lectura con todas las notas que das al final, no a todas puedo acceder.
Saludos.

Imagen de Brezhnev Castro
Enviado por Brezhnev Castro el 16 Julio, 2010 - 04:14.

Uno de los mejores articulos que he leido, felicito al compañero que nos comparte este texto, pero quiero ser claro en que, algunos programadores como yo, debemos tener el habito de leer código muy seguido, de estructurar alguna solución a problemas planteados, pero también he caido algunas veces ( y soy honesto en esto ), en el efecto Dunning-Krugerz, me siento mal por esto, porque esto demuestra que no siempre seré el mejor, pero siempre estaré aprendiendo y más ahora en mis estudios para mi Especialización.

Que momento tan grato poder leer este articulo, me facino mucho, Gracias Point_to_null

Imagen de davity_mola
Enviado por davity_mola el 16 Julio, 2010 - 11:57.

Excelente artículo, me ha dado que pensar.
Muchas gracias por compartirlo y sobre todo por traducirlo.

Saludos

Imagen de cenizoish
Enviado por cenizoish el 16 Julio, 2010 - 12:08.
Victor Hugo escribió:

«Todo hombre lleva su Patmos dentro de sí. Es libre de subir o no subir a este terrible promontorio del pensa­miento, desde el cual se perciben las tinieblas. Si no va a él, permanece en la vida ordinaria, en la conciencia or­dinaria, en la fe ordinaria, en la duda ordinaria, y así está bien. Para el descanso interior es sin duda lo mejor. Si sube a la cima, queda preso en ella. Se le aparecen las profundas olas del prodigio. Y nadie puede ver impu­nemente aquel océano... Se obstina en el abismo absor­bente, en el sondeo de lo inexplorado, en el desinterés de la tierra y de la vida, en la entrada de lo prohibido, en el esfuerzo por palpar lo impalpable, por mirar lo invisible; y vuelve allí, y vuelve de nuevo, y se aco­da, y se abalanza, y da un paso, después dos, y así es como uno penetra en lo impenetrable, y así es como uno avanza en el ensanchamiento sin límites de la con­dición infinita.»

Se puede leer el ensayo íntegro en el siguiente enlace.
http://www.laeditorialvirtual.com.ar/Pages/Pauwels/ElRetornoDeLosBrujos_01.htm

Imagen de JQuin
Enviado por JQuin el 17 Julio, 2010 - 05:32.

Excelente. En hora buena tu traducción.