Cómo aprender a programar
Cómo aprender a programar sin ir a la universidad
No podría empezar este artículo sin aclarar que mi recomendación personal es que vayas a la universidad a estudiar una carrera de desarrollo de software. Pero existen diversas circunstancias por las cuales a una persona puede resultarle imposible eso. Y de todas maneras tiene derecho a (y ciertamente la posibilidad de) aprender a programar. Es por eso, y porque he visto que esta pregunta surge todo el tiempo, que decidí escribir esta nota.
Cómo iniciarse en la programación
La complejidad de decidir el camino para iniciarse en la programación
Sé que lo que vamos a decir a continuación puede resultar un poco desalentador. Pero no puedo llegar a una conclusión sobre cómo introducirse en el mundo de la programación sin primero explicar la complejidad de esta tarea. Sin embargo mi intención es que al final de la lectura tengas algunas herramientas para hacerlo sin fracasar en el intento.
El universo de sistemas es vasto. El desarrollo de software es una de sus áreas pero no la única. La programación es una parte del desarrollo de software. Y aún así la programación en sí misma es vasta.
Como si eso no fuese suficiente, para poder programar exitosamente vamos a necesitar cierto grado de conocimientos de las áreas de desarrollo de software y sistemas en general. Esto dependerá del programa que estemos desarrollando, el negocio, la plataforma. Si vamos a programar el backend de una aplicación web tenemos que saber sobre redes, internet, HTTP, HTML, CSS, sistemas operativos y tal vez me esté olvidando de algo. Esto va a sumarse a la complejidad de la programación que incluye al menos el aprendizaje de un lenguaje de programación, estructuras de datos, normalización de bases de datos, algoritmos, bibliotecas. Y esta lista también podría variar dependiendo del entorno en el que nos encontremos.
Desde luego que no será posible abarcar todo. Es una cantidad de temas que impide que los aprendamos todos al mismo tiempo. E incluso iniciar uno de ellos puede presentar un desafío. Si tomamos como ejemplo la elección del lenguaje que vamos a aprender. Cómo establecer cual. Hay cientos de lenguajes de programación y decenas de ellos son ampliamente utilizados en la actualidad. Muchos de ellos compiten entre sí en un determinado paradigma así que será imposible no enfrentarse a la elección de uno entre varios para comenzar.
Aún en la universidad donde al tener varias materias durante un cuatrimestre o año es posible que vayamos adquiriendo conocimientos de varios de estos temas al mismo tiempo es imposible abarcarlos. Muchísimo más problemático será hacerlo desde nuestra casa y con una organización propia.
El camino
Mi propuesta es comenzar por aprender sólo un lenguaje de programación. Esa sola tarea nos forzará a adquirir conocimientos de algunas de las otras áreas. Por ejemplo, en casi cualquier curso o libro que enseña un lenguaje de programación tendremos explicaciones sobre las estructuras de datos más comunes y simples. Y dependiendo del libro o curso es posible que recibamos conocimiento de estructuras más complejas. También dependiendo de lo que el autor del curso o libro que usemos para aprender a programar haya decidido puede que tengamos alguna introducción a redes, por ejemplo. Pero la idea es que el propio aprendizaje del lenguaje nos vaya llevando a conocer los conceptos que necesitamos. Este enfoque tiene algunas consecuencias que no debemos olvidar: estaremos adquiriendo algunos conceptos muy informalmente o inconscientemente. Es importante que en algún momento del futuro, si todo avanza bien y nos gusta lo que estamos aprendiendo, empecemos a estudiar estos conceptos formalmente. Porque puede ser fácil que a esa altura subestimemos la importancia de esta formalidad.
Dado que una carrera de desarrollo de software lleva muchos años es imposible que un programador sólo conozca un lenguaje a lo largo de la misma. Sí es posible que sólo conozca en profundidad algunos de los que utilice. Así que la elección del lenguaje para comenzar no tiene por qué ser una sentencia. Tenemos que aprovechar eso para relajarnos a la hora de esta decisión. Si el lenguaje que elegimos no es el más adecuado para nosotros es algo que sabremos sólo después de haber adquirido unos cuantos meses de experiencia (en el mejor de los casos). Aún si decidimos cambiar de lenguaje después de un tiempo, muchos de los conocimientos conceptuales que hayamos adquirido mientras aprendíamos el primero nos servirán para el segundo lenguaje.
Pero aunque está claro que podemos elegir un lenguaje sin tanta presión por hacerlo bien la primera vez. Lo ideal es que utilicemos algún criterio que tenga sentido para nuestra situación. Si sabemos que nos interesa la programación web de interfaz gráfica tiene sentido que comencemos aprendiendo Javascript. Pero si creemos que nos va a gustar más el backend Javascript no es el lenguaje ideal. Podríamos empezar por ahí de todas forma. Pero lo más probable es que aprender un lenguaje como Java termine siendo la mejor inversión inicial. Y si Java suena a un lenguaje muy antiguo tal vez Kotlin sea una buena alternativa.
Finalmente necesitamos advertir que esta forma de empezar a programar nos limitará bastante a la hora de escribir programas que tengan aplicación inmediata. Porque un programa no es una aplicación. Un programa está compuesto por un conjunto de instrucciones para que la computadora realice ciertas tareas (realizar cálculos, escribir información en disco, mostrar algo en pantalla). Una aplicación es el empaquetado de uno o más programas para construir una herramienta que se pueda distribuir a los usuarios y tiene una utilidad concreta para una persona que no necesariamente tiene conocimientos de informática. Por todo esto, poder desarrollar una aplicación requiere más conocimientos que los necesarios para escribir un programa. Tendremos que impedir que nos gane la ansiedad ya que después de unos meses de haber empezado todavía nos resultará muy lejano el poder crear una aplicación.
Elegir el lenguaje
Dijimos anteriormente que no vamos a jugarnos la vida en esta decisión. Pero al mismo tiempo tiene sentido que hagamos el esfuerzo de hacer una elección educada. Si nos gustan las aplicaciones móviles no tiene sentido que empecemos con Javascript. Podemos ir por Java o Swift que son los lenguajes nativos para Android y iOS respectivamente.
La siguiente lista no pretende ser una verdad absoluta sino una guía. Y la elección de cada lenguaje tiene mucho que ver con preferencias personales. Pero creo honestamente que será de utilidad a mucha gente que quiere emprender la aventura de aprender a programar. La idea es describir un área específica en la cual los programadores suelen especializarse y contar de qué se trata. Así podrás intentar imaginarte si una te interesa más que la otra y usar eso para decidirte por un lenguaje en particular.
Backend
Si nos dedicamos al backend vamos a estar desarrollando aplicaciones web o cliente-servidor para internet (o intranets). Más específicamente la parte que corre en el servidor y que suele tener la lógica de negocio. Esto involucra acceso a datos y archivos. Posiblemente Could Computing, integración con servicios de terceras partes. Por lo que se necesita conocimiento de bases de datos y redes.
Los lenguajes que recomiendo son Java, Kotlin.
Frontend
Esta es la parte cliente del concepto cliente-servidor en el caso de aplicaciones web. Aquí estaremos programando la lógica de la interfaz de usuario (UI/UX) incluyendo la implementación en HTML y CSS del diseño que recibiremos de los diseñadores gráficos y UX.
El lenguaje casi excluyente en esta área es Javascript.
Móviles (Mobile)
Aplicaciones que pueden ser autónomas (realizan todo el trabajo por sí solas) o cliente-servidor donde cumplen el rol de cliente mientras que en el servidor habrá programas desarrollados por especialistas en backend o cloud computing. Son muy parecidas a las aplicaciones de escritorio que corren en Windows, Linux, Mac y otros sistemas operativos.
Creo que en este caso hay que elegir uno de los lenguajes Java/Kotlin o Swift que son los nativos para Android y iOS respectivamente.
Aplicaciones de escritorio
También llamadas stand-alone. Son aplicaciones que corren en Windows, Linux, Mac y otros sistemas operativos y usualmente tienen una interfaz gráfica o se interactúa con ellas desde la terminal o shell. Como mencionamos anteriormente son muy parecidas a las Móviles en cuanto al tipo de tareas que realizan. Aunque la infraestructura en al que se apoyan son muy distintas debido a la naturaleza del hardware y el sistema operativo donde corren.
El primer lenguaje que recomiendo aquí es Java debido a que éste también se usa en backend y en Android. Por lo que las ventajas de aprenderlo son obvias. Las otras alternativas son .NET (donde preferiría C#) o C++. Pero realmente no creo que valga la pena empezar con esos lenguajes salvo que exista algún otro motivo para preferirlos por sobre Java.
DevOps
En ésta área se programa mayormente para automatizar el desplegado de infraestructura para backend de aplicaciones web, cliente-servidor o cloud. Se utiliza código para asegurar un proceso automatizado y reproducible de ese despliegue. Son fundamentales los conocimientos de redes, sistemas operativos, cloud-computing y seguridad.
El lenguaje más utiliza aquí es Python seguido posiblemente por Go. Aunque yo no lo elegí mucho en esta lista es un lenguaje muy popular y recomendado. Personalmente creo que es un buen lenguaje pero no tiene mucha aplicación en las áreas en las que yo me manejo.
Embedded (microcontroladores)
Aunque muchas veces lo olvidamos porque aquí llegan usualmente los ingenieros electrónicos (tal vez más en Argentina que en Estados Unidos) esta es una categoría del desarrollo de software muy importante. Dentro de la electrónica el campo que más emplea este tipo de desarrollo es el del Control Numérico. Y se trata de programar computadoras industriales y microcontroladores para automatizar procesos. Estableciendo interfaces con todo tipo de sensores físicos y controladoras de motores y otros actuadores.
Creo que el lenguaje más utilizado es C/C++ seguido por Rust.
Full stack
Incluyo esta categoría para que la lista esté completa pero no creo que sirva para a elección del primer lenguaje. Un programador full stack es aquél que puede programar tanto el frontend como el backend. Y no se llega a esto sin empezar por uno de sus componentes.
En ese caso personalmente recomiendo arrancar por el backend con un lenguaje tipado como Java. Aunque esto es opuesto a lo que se suele recomendar. El fundamento de esa recomendación opuesta a la mía es que Javascript es más visual y por lo tanto se percibe una recompensa mucho más rápido. Y esto ayuda a mantener la constancia. Consejo que tampoco me parece mal. Pero para mí aprender un lenguaje tipado en primer lugar facilita mucho las cosas luego.
Fotografía de Anna Shvets