09 julio 2020

Qué bonita es la Programación

Que bonita es la programación
El año 1969
vi por primera vez un programa escrito en Fortran en una revista Mecánica Popular. Fue amor a primera vista, lo copié y le estuve dando vueltas y revueltas durante meses, diez años después, en 1979 en la universidad tomé mi primer y único curso de programación que aprobé sin problemas y cuando terminé en la universidad ya tenía claro a que me iba a dedicar, así fue como pasé los siguientes 15 años viviendo de eso, fue muy divertido mientras duró, después lo dejé.

Muchos años después -más que nada por nostalgia- seguí un cuso online de programación en Python del profesor Charles Severance, de la Universidad de Michigan y fue como volver con una antigua novia, me fue muy bien y me pidieron que fuera instructor ayudante del mismo curso al año siguiente. Pero no lo hice bien, no tenía paciencia para estar revisando el código que escribían otros buscando donde estaba el error, así es que lo dejé nuevamente.

La cosa es que durante un tiempo conservé el entusiasmo y abrí un blog bilingüe llamado "Aprenda Python en 3 días" o "Python in 3 days". Lo escribí en uno o dos días lo publiqué y lo dejé por allí olvidado. Para mi sorpresa, con el tiempo lleva acumuladas 17.180 visitas y se ha convertido en el segundo blog más popular detrás de este Templo del Ocio. Como tiene su versión en inglés, la mayoría de las visitas son de India y Estados Unidos, de alguna manera se ha ido haciendo popular -no se como en realidad- y me tiene muy contento.

A veces pienso que podría traducir este Templo del Ocio al inglés, pero son tantas entradas que de solo imaginar el trabajo me da sueño, creo que en inglés podría ser mucho más popular que ahora pero mi redacción en inglés no sería buena. Hay muy pocas cosas que creo hacer bien y una de esas es redactar, por eso a veces me jacto que -generalmente- lo que publico acá está bien redactado, dudo que pudiese hacer lo mismo en inglés.

En ese blog de Python creo que hice un experimento interesante: enseñar un nuevo lenguaje de programación tal como se enseña a hablar a un niño. Los niños imitan frases completas para luego modificarlas, creo que tengo un punto interesante en eso, tal vez debería ser la forma estándar de enseñar programación,

Porque el método que se usa casi universalmente consiste en (i) enseñar la "gramática" del lenguaje (las instrucciones y su sintaxis) y (ii) planteando "problemas" a los estudiantes para que estos los resuelvan, con lo que se supone se les va a desarrollar el ingenio, tal vez a unos pocos les guste así, pero creo que es una forma aburrida y descorazonadora de aprender.

Resulta que las personas no funcionamos así, por eso el método tradicional es ineficiente y engorroso. Es como si a un bebe que no sabe hablar primero le recitaran el diccionario para que memorice las palabras y luego le enseñaran las reglas de la gramática ¡absurdo! Todos aprendemos a hablar imitando frases completas, expresiones, conversaciones. Por eso mi método se basa en presentar soluciones ya hechas, explicar como funcionan y luego pedir a los alumnos que las modifiquen o mejoren.

Asi por ejemplo, para el siguiente problema "tomar un texto y crear una lista con todas las palabras no repetidas que contiene" yo propuse el siguiente código de ejemplo como solución.

Bueno, el asunto que hasta ahora he recibido otras 36 maneras de hacerlo, que pueden ver aquí. La mayoría funcionan, otras no, pero revisando las distintas soluciones uno se encuentra con sutilezas del lenguaje y con algunas instrucciones potentes que yo ni conocía. La solución que más me gusta, hasta el momento, fue esta
Simple y elegante. En mi código yo usé la manera más sencilla, ingenua y fácil de entender (a mi modo de ver), la clave está en la línea "if element in lst" que me obligó a usar una instrucción adicional "else", el otro código usa "if element not in lst", una solución demasiado fina para mi tosco y anticuado estilo de programación, basado en Fortran y Visual Basic. Es un detalle mínimo, pero también un enfoque diferente para solucionar el problema.

La cosa es que yo sabía que algo andaba mal con el código, igual que cuando uno lee algo mal redactado y "no le suena bien" mi código no sonaba, así es que coloqué el comentario "este código es medio rebuscado con dos loops anidados, si alguien tiene una versión más simple, bienvenido". Bueno, hubo otros 36 que aparecieron con sus propias soluciones. Por eso encuentro que la programación es tan bonita, un mismo problema se puede solucionar de muchas formas diferentes. 

Me encanta haber escrito ese blog y que sea popular en todo el mundo, también hice un curso online con lo mismo pero quedó pésimo, me avergüenza y lo bajaría si no fuera porque de vez en cuando me llegan 4 o 5 dólares por él, la codicia es más fuerte que la vergüenza.

¿Una nueva forma de ganarme la vida?
A propósito de Udemy, en los tres meses desde que empecé a cobrar por mi curso para pequeños empresarios, estoy recibiendo entre 60 y 80 dólares todos los meses sin mover un dedo, bueno la verdad es que llevo solo tres meses, pero si ese ritmo de venta se mantiene, podré pagar Internet y alguna otra cosita gracias a ese curso, lo que me pone muy contento. Si le agregamos los generosos aporte que recibe la Benemérita Fundación Mi Billetera, tal vez en un futuro llegue a conseguir mi sueño de ganarme la vida sin trabajar en absoluto, en fin, veremos que pasa.

Miedo al éxito
El Tomás Jr. me critica por que no hago otros cursos para ganar más plata. No es tan sencillo muchacho. Varios años atrás leí un manual para interrogatorios, decía que lo principal era que el interrogador conociera la personalidad del interrogado, entonces describía varios tipos de personalidad con sus fortalezas y debilidades, una de esas era la personalidad con miedo al éxito. Algo así debo tener yo porque me gusta llegar solo al borde del éxito, como esos jugadores que llegan hasta el arco y llegados allí, intencionalmente desvían el tiro. tal vez yo tenga esa personalidad porque  soy el rey del casi-casi.   

La cosa es que mi curso online ya tiene más de cuarenta mil estudiantes inscritos en distintas plataformas, recién lo cambié de gratis a pagado y ya se vende más o menos bien, pero todavía no me decido a hacer otro, eso se llama tenerle miedo al éxito. Es muy curioso, o tal vez simplemente soy un vago, esa es la otra posible explicación.

Si alguna vez me quedara en la miseria (de nuevo) creo que podría desempolvar mis recuerdos de programador, repasar un poco el Python que es un lenguaje que me acomoda mucho y tal vez ganar unos pocos dólares inventando aplicaciones, claro que para eso necesitaría el incentivo del hambre que hoy no tengo, pero así como van las cosas nunca se sabe.

5 comentarios:

  1. Deberías volver a revisar Python. Con el auge de la computación en la nube, se ha potenciado harto, abarcando Data Science y Machine Learning, y quizás es por eso el que tenga tantas visitas tu sitio.

    ResponderBorrar
  2. Python está de moda desde hace años, es una vuelta al tan vilipendiado Basic, si sabes Basic, sabes Python casi automáticamente. el otro lenguaje que yo creo indispensable es Java Scipt, también mirado en menos por la academia pero es un concepto maravilloso por la idea de poder colocar código al lado del cliente.

    Una cosa que se me olvidó mencionar es la estética de los lenguajes existen principalmente dos estéticas, las que derivaron del Fortran (Basic, Python) y los que derivaron del Pascal y del C (C++, Java, Java Script) eso es muy importante porque -como toda estética- tiene una ideología detrás, algunos jamás nos podremos acostumbrar a la estética de Javam otros se incomodan con la de Python, etc. Es un asunto del que he escuchado muy poco y creo que es importante.

    La estética "tipo C" es muy buena para programas enormes muy modulares, con clases, programación estructurada y orientada a objetos. Proyectos complejos hechos por grandes equipos de muchos programadores. La estética "tipo Basic" es mejor para microprogramas aunque igual se está usando en proyectos grandes porque el Python tiene un apoyo enorme de bibliotecas de toda clase.

    Para ciencia de datos el R, aunque es aburridísimo, yo que desconfío de la estadística jamás trabajaría en ciencia de datos. El machine learning, IA y esas cosas me parecen más que nada humo, no me interesan para nada.

    Lo que si me gustaría usar Python para hacer algunas cositas en Big Data, para eso el Python es campeón, tiene unas bibliotecas estupendas para saltar por la web y las mejores bibliotecas para manejar texto plano y datos sin estructura, creo que ahí se podrían hacer proyectos personales muy interesantes y no veo que se esté haciendo mucho en eso.

    ResponderBorrar
  3. Uno de los estudiantes pone este código con un solo loop, muy ingenioso y termina con un inmodesto comntario "perfect code" (las indentaciones (tab) no puedo ponerlas, sorry)

    fname="romeo.txt"
    fh = open(fname)
    rd = fh.read().split()
    lst = list()
    for i in rd :
    if i in lst:
    continue
    else :
    lst.append(i)
    lst.sort()
    print(lst)

    Bueno, not so perfect diría yo, peo mezclándolo con la solución que mostre antes quedaría

    fname="romeo.txt"
    fh = open(fname)
    rd = fh.read().split()
    lst = list()
    for i in rd :
    if i not in lst:
    lst.append(i)
    print (sorted(lst))

    Y este si creo que califica para "perfect code", muy elegante, usa rd = fh.read().split() una instrucción bien sofisticada que combina read y split, lo que hace innecesario el primer loop, claro que cuesta un poco entender como funciona a primera vista.

    Entonces viene la pregunta ¿vale la pena escribir un código tan elegante y económico si cuesta entender como funciona? Es cuestión de como piense cada cual, según mi filosofía, el código más claro y auto-explicativo es siempre el mejor, aunque no sea el más elegante, creo que uno debe escribir código que sea entendible a primera vista siempre que se pueda, pese a que a veces parezca redundante, además mientras más sencillo el algoritmo, más fácil de depurar

    ResponderBorrar
  4. Despues de leer esto, volveré a programar...

    ResponderBorrar
  5. Jose, es fácil y divertido. Con Python escribir código volvió a ser divertido, afortunaamente

    ResponderBorrar

"Send me a postcard, drop me a line
Stating point of view
Indicate precisely what you mean to say
Yours sincerely, wasting away
Give me your answer, fill in a form
Mine for evermore
Will you still need me, will you still feed me
When I'm sixty-four"