Aprender a programar programando

Introducción al diseño empírico de sistemas de información

No soy ingeniero, ni soy programador. Pero en las últimas semanas me he estado metiendo más y más en el tema de aprender a programar y a la implementación de herramientas informáticas sencillas para resolver algunos problemas o necesidades. Y aunque sé que no lo estoy haciendo “bien”, en el sentido de que sé que mis soluciones no son las mejores ni las mejor optimizadas, es una experiencia de la cual saco mucho: siento que tengo más control sobre la tecnología que utilizo, que puedo personalizar mejor la manera como manejo la información, y que entiendo mejor la manera como funcionan otras herramientas que utilizo. En el proceso de crearlas, las herramientas se desmitifican.

Mi “proceso”, si puede llamarse así, es completamente empírico. Siento que una de las principales barreras que uno enfrenta en este tipo de situaciones de aprendizaje es que el costo de empezar es muy alto: aprender a programar significa, por ejemplo, aprender la sintaxis de un lenguaje de programación, aprender a utilizar ciertas herramientas de desarrollo, montar un entorno de desarrollo, etc. Así que estoy tratando de modelar mi proceso no como una alternativa a metodologías profesionales de desarrollo de software o tecnologías en general, sino más como una recomendación sobre cómo empezar para aquel que no sabe bien por dónde. Y es que en estos casos en mi propia experiencia me ha parecido importante, primero, no hacerlo en abstracto, como suelen hacerlo la mayoría de tutoriales de programación con ejercicios de ciertos conceptos formales, sino empezar desde el principio trabajando sobre un problema que resulte personalmente importante. Y segundo, simplemente empezar e ir arreglando los problemas sobre la marcha, en lugar de intentar tener todas las preguntas resueltas de antemano.

Lo que sigue es un intento por esquematizar este proceso, como lo he venido experimentando armando herramientas como CVRanalytics o Gamedex.

1. Identificar un problema

Siempre que he intentado aprender con tutoriales, mi experiencia ha sido frustrante porque pierdo el interés rápidamente y pierdo la constancia para seguir practicando. Lo mismo ocurre con herramientas como Codeacademy.

He tenido mucho mejores resultados cuando parto desde el principio trabajando en un proyecto, cualquiera que sea el proyecto, incluso cuando no tenga objetivos claramente definidos. Trabajar con un proyecto específico le da propósito a aprender conceptos básicos como bucles, condicionales, funciones, clases, y demás. Y se vuelve más un tema de qué es lo que quiero hacer: con CVRanalytics, por ejemplo, mi intención era simplemente ver cómo era posible explorar el Informe Final de la CVR usando código y herramientas computacionales, sin saber bien cuál sería el resultado. Con Gamedex, en cambio, necesitaba una herramienta de investigación que me permitiera catalogar información sobre producción de videojuegos, para luego poder analizarla. Partir de necesidades personales sirvió como incentivo personal para seguir aprendiendo.

Lo interesante además fue que en ambos casos, era consciente de que existían mejores maneras de cumplir con estos objetivos. Pero como se trataba de aprender a diseñar estas herramientas, en realidad no importaba que ya fuera un problema resuelto, sino al contrario, que las soluciones ya existentes podían servirme como plantilla para responder a algunas preguntas o resolver problemas.

2. Modelar los datos

Escoger un problema para trabajar entonces era un tema medianamente trivial, a partir de los problemas o tareas en las que estaba trabajando. Lo siguiente era pensar en el tipo de modelado de datos que tenía que hacer. En otras palabras: decidir cuáles eran los inputs de información sobre los cuales quería hacer algún tipo de procesamiento, y qué tipo de datos necesitaba sobre ellos para poder hacerlo.

Tiene mucho que ver que desde el principio me enfoqué en trabajar con programación orientada a objetos. En este paradigma, uno define ciertos objetos con los cuales trabajará, que tienen ciertos atributos. Un cuadrado, por ejemplo, tiene un solo atributo, longitud, a partir del cual todo el cuadrado puede calcularse. En una aplicación web, un usuario puede tener atributos como su nombre de usuario y contraseña para poder acceder al sistema. Y así sucesivamente. Entonces un primer paso es decidir (1) cuáles serán los objetos con los cuales trabajaremos, y (2) qué atributos tienen que tener estos objetos que nos interese luego poder manipular o analizar.

En Gamedex esto fue fácil, pues el objeto era claramente un videojuego. Pero luego se fueron desprendiendo, sobre la marcha, la necesidad de otros objetos: el objeto Organización para registrar información de los desarrolladores, el objeto Nota para almacer comentarios e información adicional sobre los juegos, o el objeto Evento para información sobre la historia de una Organización. En CVRanalytics, la elección y el diseño de los objetos estuvo mucho más atado al análisis de secciones específicas del Informe y la manera como presentaban la información: así, por ejemplo, leyendo la cronología de los acontecimientos uno podía encontrar que un objeto podía delimitarse en función a cada una de las secciones anuales en esa parte del documento. Estas decisiones se convierten luego en clases dentro del modelo de programación orientada a objetos, y cada instancia de una clase se vuelve un objeto operable.

Lo importante aquí es recalcar también que esto es un proceso iterativo, y que se complica poco a poco. No es importante tener el modelo de datos perfecto para poder empezar: implicar tener simplement alguno que se pueda ir probando. Esto es a lo que me refiero por diseño empírico: podemos ensayar una hipótesis en código, probarla, y seguir trabajando sobre ella hasta chocar contra un problema que nos obliga ampliar o corregir el código, y así sucesivamente. En este modelo, empezar con cualquier esquema es mejor que esperar hasta tener el esquema “correcto” para poder empezar.

3. Escoger herramientas

Me ha pasado incontables veces que la selección de las herramientas correctas se vuelve una parte importantísima de un proyecto. ¿Qué lenguaje, qué framework, qué entorno de desarrollo usar para programar?

No importa. Lo que importa es empezar.

Las herramientas más importantes para empezar con una aplicación básica son un buen editor de textos (diferente a un procesador de textos) y una terminal de comandos. No se necesita mucho más que eso. Las opciones de lenguajes de programación son varias, y para alguien que recién empieza deberían ser más contingentes a la facilidad de su curva de aprendizaje y el volumen de recursos de ayuda existentes: lenguajes con comunidades de usuarios extensas son preferibles a lenguajes altamente especializados. Algunas opciones recomendables pueden ser Python (que es lo que yo he escogido hasta ahora), Javascript (que es lo que quiero aprender luego), Ruby, o Processing.

Varios de estos lenguajes ofrecen herramientas sobre las cuales uno puede empezar a programar directamente, sin nada adicional. Pero quizás la mejor opción es utilizar un buen editor de textos, idealmente uno que resalte elementos de sintaxis del lenguaje escogido. Algunas buenas opciones son Notepad++, TextWrangler o Sublime Text.

¿Es necesario algún software adicional especial para empezar a programar? No. Cualquier otra cosa, para alguien que recién empieza, probablemente confunda más que ayude, y puede llevar a depender más de una herramienta que del conocimiento que se adquiera sobre el lenguaje. Es mucho más importante aprender a utilizar bien herramientas como Google y, especialmente, Stack Overflow para saber dónde buscar soluciones cada vez que uno encuentra un problema. Otra herramienta muy útil es GitHub, que te permite ir actualizando versiones de tu código y ver a versiones anteriores si encuentras que algún cambio que hiciste malogra algo, además de poder subir tu repositorio de código a la web para poder compartirlo con otras personas o utilizarlo desde varias computadoras. Y en Quora puedes encontrar buenas respuestas sobre por qué utilizar una herramienta, plataforma o tecnología por encima de otra.

4. Crear una versión básica

Tienes tu proyecto, los datos con los que quieres trabajar, y las herramientas que utilizarás. Ahora solo se trata de empezar.

Aquí es donde los tutoriales pueden ser útiles para saber cómo empezar a empezar. Pero el ciclo de desarrollo, al menos en mi experiencia, es algo más o menos así:

  1. Quiero implementar una función X en el lenguaje Y
  2. Googleo “función X en lenguaje Y”
  3. Encuentro un artículo en Stack Overflow, o un mensaje en un foro, o un blog post que habla sobre el tema.
  4. Leo dos o tres como para comparar las opciones.
  5. Reproduzco el código que ofrecen y lo adapto para funcionar con el código que ya tengo.
  6. Volver a 1.

De cuando en cuando, este ciclo incluirá descubrimientos como que necesito un módulo o componente adicional, que entonces debo instalar y configurar para poder seguir avanzando, pero en general es un ciclo iterativo de resolución de problemas. Esto es programar en su versión más cotidiana.

Lo importante aquí es aspirar a una primera versión básica, un prototipo, que permita ir evaluando algunos de nuestros supuestos en el proceso de diseño e implementación. Simplemente que funcione, aunque esté incompleto o no haga mucho. Por ejemplo, cuando uno trabaja con Python, es muy probable que la primera versión funcione solo a través de la línea de comando y se vea sumamente primitiva para estándares actuales. Pero no importa, pues eso es suficiente para permitirnos evaluar varias cosas.

5. Agregar funciones

Lo que sigue a partir de ese prototipo es ir ampliando y mejorando nuestro diseño original. De nuevo, iterando. Y muchas veces, conforme vamos perfeccionando la técnica, regresando sobre los primeros esfuerzos para corregirlos, mejorarlos, o rehacerlos por completo. La primera interface web que hice en Python, para CVRanalytics, era una implementación un poco torpe de web.py. Pero luego con Gamedex aprendí a hacerlo mejor utilizando Flask, lo que me motivó a volver y rehacer la original de nuevo con Flask. Es el tipo de decisiones y ajustes que uno va haciendo sobre la marcha.

Un desarrollador profesional no haría esto, sino que tomaría estar decisiones de antemano, a partir de una investigación y análisis de las diferentes opciones existentes – un análisis de sistemas. Pero los que no somos desarrolladores profesionales, y queremos aprender, no tenemos este lujo, sino que más bien aprendemos a hacerlo empíricamente. El segundo proyecto se vuelve mejor, y luego el tercero, y así sucesivamente. A partir de jugar con diferentes módulos, versiones y herramientas, uno aprender a comparar y evaluar qué versiones son mejores en función al proyecto en el que está trabajando.

Quizás esta no es una buena introducción para el absoluto neófito, sino para aquel que ya tiene cierta noción del interés que tiene y que lo ha intentado algunas veces. Pero para aquel que está en esta posición, me parece importante desmitificar los requerimientos iniciales para poder crear algo, y mostrar que en realidad, con un editor de textos y acceso a Google uno puede empezar a experimentar con cosas interesantes.

3 thoughts on “Aprender a programar programando

  1. Pingback: Imperdibles (julio 10th – julio 15th) » Hipertextos [desde La Plata]

  2. ¡Hola Eduardo! comparto tu acercamiento a la programación, me pasa lo mismo. Enfoqué mi aprendizaje desde los problemas concretos que quiero resolver mediante la programación. En mi caso estoy utilizando LAMP para aplicaciones web-based. Estoy utilizando NetBeans como IDE. Espero que tus proyectos se desarrollen más. Una pregunta ¿Por qué decidiste utilizar Python? Debido a tu post me detuve un rato a examinar las posibilidades de Python, pero no me queda tan claro su potencial para la programación web, aunque he leído que muchos apuestan que terminará por reemplazar a PHP.

    Saludos!

    • Hola César,

      La verdad empecé con Python porque sabía que era un lenguaje bastante accesible para el aprendizaje, con una sintaxis muy limpia, la facilidad de no tener que inicializar variables para su uso, y especialmente por la enorme cantidad de recursos que uno puede encontrar para hacer cosas en Python. Al principio mi intención no era programar para la web, sino solo programar, entonces no me preocupé mucho por lo otro.

      Pero luego cuando ya tenía aplicaciones básicas quería habilitarlas para funcionar vía web, y encontré que con el uso de frameworks o microframeworks adicionales, uno puede armar aplicaciones web muy fácilmente sobre Python y utilizando el mismo código que ya tenía. Empecé con web.py, un módulo de Python para armar aplicaciones web, y luego probé Flask, otro módulo similar, y me gustó bastante más. Creo que proyectos mucho más grandes podrían requerir algo como Django, pero hasta ahora con Flask a mí me está yendo bastante bien. Con lo que recién estoy empezando a trabajar es con conexiones a bases de datos usando el módulo sqlite3, así que sobre eso no puedo decir mucho todavía, pero hasta ahora todo lo que he querido implementar con Python para la web ha sido posible con algunos módulos adicionales y un poco de investigación (y me gusta mucho trabajar con una sintaxis más limpia que PHP además).

Comments are closed.