Quisiera compartir cuál fue mi camino para aprender a programar. Posiblemente escriba una colección varios tutoriales explicando todo lo que aprendí. Muchas de las cosas que exponga quizá sean algo viejas, pero lo importante es saber hacerlas para poder realizar cosas más complejas con ese conocimiento.
Básicamente, los primeros 3 meses de mi vida como programador los pasé estudiando Karel. Karel, para quien no lo conoce, es el lenguaje de programación utilizado en la olimpiada mexicana de informática a nivel primaria y secundaria. En el pasado, se utilizaba en la olimpiada de bachillerato, y en los viejos tiempos, se utilizaba en la omijal a nivel universitario.
Karel tiene 2 sintaxis, soporta una versión basada en Java y otra similar a Pascal. Personalmente, prefiero la sintaxis en Pascal pues tiene instrucciones en español, que para un niño de primaria es más sencillo que tener que explicarle las instrucciones en inglés. Eso sí, la sintaxis de Java al utilizar llaves es un poco más corta, aunque no creo que haga mayor diferencia en un concurso.
La parte qué mas me sirvió de Karel fue aprender sobre recursividad, pues para un novato, es el concepto más complicado de entender. No lo dejé hasta que logré comprenderla (o al menos eso creí en su momento) y que ya no necesitaba más aprenderlo para la olimpiada.
Después aprendí de C++. Fue un cambio duro en sus inicios, pues pasé de algo visual a donde todo era abstracto y tenía que imaginar todo lo que pasaba. Aprendí a utilizar las variables, los tipos de datos, arreglos, estructuras de control, ciclos y matrices. Con eso fui capaz de resolver el poco material de estudio que había en el sitio de la olimpiada.
El siguiente paso lo dí hacia los algoritmos de ordenamiento. Aprendí el algoritmo de la burbuja, selección, inserción y el método de shell. Quicksort fue algo que estaba fuera de mi alcance en ese momento por no saber implementar funciones, pero creo que habría sido un buen momento para practicar recursión en este nuevo lenguaje.
Entrando en temas fuertes de la olimpiada, ya en la preselección estatal, nos empaparon conceptos de estructuras de datos y búsquedas. Aprendí un poco de grafos. De aquí en adelante una de las líneas de aprendizaje que desarrolle fue la de la programación competitiva, que para ser honesto sigo aprendido aun (muy esporádicamente).
Ya estando en la facultad, me interesé mucho por la criptografía. Leí un libro de criptografía que me compartieron en la olimpiada. Eran las clases de un profesor de MIT. Aprendí las bases del RSA, Diffie Hellman y el concepto de las curvas elípticas (creo que no comprendí del todo las bases matemáticas) y la implementación de ElGamal. También documentándome un poco de historia aprendí de la máquina Enigma de los nazis y la implementé en Java. Para manejar números muy grandes empecé a jugar con python.
Aprendí de programación orientada objeto de la mano de uno de mis mejores profesores de toda la carrera y personalmente creo que a la fecha mis habilidades de abstracción son bastante adecuadas. Aprendí un poco de Java pero me gustaba más C++ (a la fecha sigo prefiriéndolo).
Después de todo este viaje, llego el turno de la programación lógica y funcional. Cambiar del paradigma estructurado y orientado a objetos (que en mi opinión son muy similares) al declarativo. La clase que tome en la universidad nos llevó por prolog. El primer ejercicio que disfruté muchísimo fue con los axiomas de peano, donde con pura recursión (Karel de nuevo salvandome) había que definir las operaciones suma, restá, multiplicación, división, exponente y si había valor la raíz cuadrada. Claro que tenía otra ventaja, pues para este entonces ya había leído el libro de la trenza dorada donde se tocaba este tema.
Después de Prolog pasé por LISP (vaya dolor de cabeza) donde no pasé mucho tiempo hasta que eventualmente conocí a uno de mis más grandes amores: Haskell. Por años, las personas me han criticado diciendo que Haskell no sirve para nada, que es una perdida de tiempo. Pues yo creo que al sufrir algunos traumas con este lenguaje, aprendes a programar mejor en los otros paradigmas. No voy a profundizar mas en Haskell, pues creo que eventualmente podría escribir una serie de articulos dedicada a semejante lenguaje.
Después de esto llevé un curso de gráficos por computadora en la universidad. Aprendí algoritmos geométricos para modelado, pero quise ir un poco más allá y estudiar transformaciones 3D (en mi universidad no alcanzabamos a ver esos temas). Lo que me atrajo por mucho fue aprender de la existencia de la geometría fractal. De nuevo, no quiero profundizar ahora porque creo que se merece una entrada en este blog, pero básicamente la geometría fractal aplica a figuras que se contienen dentro de si mismas a infinitas escalas. De alguna forma, el ejemplo más simple que se me ocurre es el de un árbol. Un árbol puede ser descrito como una linea que se parte en 2 y así infinitamente.
Simultáneo a todo esto, estuve aprendiendo también un poco de desarrollo web (de algo hay que vivir). Aprendí PHP y JavaScript. Aprendí lo suficiente como para no querer tocar PHP y tampoco querer dedicarme a hacer front end (bueno, solo un poco). Programé un space invaders en JS siguiendo un tutorial que me encontré por ahí hace unos ayeres. A la par aprendía de bases de datos.
Finalmente, en mi último año de universidad aprendí a utilizar hilos y concurrencia. Aprendí a utilizar puertos y un poco de redes. Y tomé algunas materias de inteligencia artificial. Para todo esto, debo decir que siempre me interesé por las matemáticas, y aunque parezca obvio, siempre estuve aprendiendo un poco al respecto.
Ya fuera de la universidad aprendí lo que es el verdadero trabajo en equipo para un desarrollador. Sistemas de control de versiones y patrones de diseños, utilizar más herramientas como linters que ayudan a mantener una base de código muy similar en el equipo.
Aprendí Ruby y el camino me llevo a la infraestructura, donde puedo decirles que he aprendido diversas tecnologías como contenedores, servidores http, ftp, de correo, dns (todo lo que un buen sysadmin sabría). Mi manejo de linux mejoró bastante. Aprendí mucho de Amazon Web Services (amazon no solo es sólo tienda). A mantener la auditabilidad y monitorizar sistemas. Más herramientas como ansible y chef que ayudan a mantener las configuraciones automatizadas.
Por ahora, he dejado un poco de lado las cuestiones técnicas, pero me gustaría continuar aprendiendo más de contenedores, desarrollo de pipelines de CI, pero la vida me ha llevado a otras aguas como el liderazgo.
Pues si alguien quisiera saber todo lo que se sobre programación, básicamente esto es todo lo que he estudiado. Llegue a tocar algunos otros lenguajes como kotlin, scala, elixir, go y crystal, pero no me considero desarrollador en ninguno de ellos por falta de experiencia.
Espero algún día contar con bastante material en el blog como para que alguien pueda aprender todas estas cosas (las que valga la pena, pues posiblemente en un futuro la mitad de todo esto ya esté obsoleto).
Hasta aquí esta entrada. ¿Qué te ha parecido? Suena a que es mucho, ¿verdad? No te preocupes si vas empezando en esto, solamente me tomó 8 años llegar hasta aquí. Si vas empezando relajate y disfruta el camino. Si ya eres experimentado, espero sirva de guía para mejorar tus conocimientos.