, , ,

Aprender un lenguaje de programación nuevo

by

Dificultad: Principiante

Tanto si estás empezando como si ya has programado muchos proyectos en tu vida, el proceso de empezar con un lenguaje de programación nuevo puede ser muy intimidante y frustrante. ¡Aquí te dejo una pequeña guía para enfrentarte a este nuevo reto por etapas!

Si nunca has programado antes…

… ¡no sufras! En este blog encontrarás cursos completos de programación completamente gratuitos con ejercicios que hacer para mejorar tus habilidades. Si no están publicados todavía, o prefieres una plataforma interactiva, te dejo links a varios sitios donde aprender haciendo. Ninguno me promociona, así que puedes tener la certeza de que los he probado y me gustan 😉

Si te gusta más ir por libre, este artículo debería indicarte los temas que debes entender para poder programar a gusto. Los he listado en el orden que creo que tiene más sentido aprenderlos, para que cimientes bien el conocimiento antes de pasar a cosas más complejas. ¡Recuerda hacer muchos ejercicios!

Por último, aunque es totalmente posible aprender programación de manera autodidacta (y no me extrañaría que muches de vosotres hayáis acabado aquí por desesperación con algunes profesores) nunca subestimes el valor que tiene un curso profesional de programación. Yo aprendí a programar antes de entrar a la carrera de Ingeniería Informática, pero fueron mis profesoras las que de verdad afianzaron mis conocimientos y me dieron las herramientas para enfrentarme a todos los proyectos que vinieron después.

Dicho esto, si no tienes acceso o recursos a instrucción profesional, no dudes en dejarme tus dudas en los comentarios y trataré de ayudarte todo lo que pueda.

Cómo usar este artículo

En este pequeño escrito pretendo dejarte una lista de temas que debes mirar e interiorizar para aprender la sintaxis y gramática de un lenguaje de programación imperativo en su totalidad. El título de cada sección representa cada uno de esos temas, y dentro encontrarás una ampliación en detalle de qué buscar.

Básico

Compiladores, intérpretes y editores

Uno de los consejos más importantes que puedo dar es que intentes aprender el lenguaje de programación aislado del entorno en el que vayas a utilizarlo. Es decir, si quieres aprender un lenguaje (C#, C++, Python, Lua…) para desarrollar en un motor (Unity, Godot, Unreal Engine, LÖVE2D…), no lo aprendas programando dentro de ese motor. Aprende el lenguaje en sí, aparte, para que las características propias del entorno no te estorben. Aunque parezca contraintuitivo, aprenderás mucho más rápido y en mayor profundidad de esta manera. Los motores y los entornos suelen requerir instrucciones o maneras especiales de hacer las cosas que no son propias del lenguaje, a menudo frustrando o incluso haciendo imposibles ejercicios que deberían ser directos y sencillos. Es complicarse la vida antes de tiempo.

Esto significa que debes buscar un entorno aislado para programar y ejecutar tu código. En la mayoría de los casos, todo lo que necesitarás será un editor de texto, el compilador de tu elección de lenguaje y una forma de mandarle el archivo con el código.

Deberás prestar atención al tipo de lenguaje con el que estés tratando. Por norma general, hay dos tipos de lenguajes de programación:

  • Compilado – El compilador leerá el código, lo transformará a código máquina y creará un ejecutable con el que podrás probar tu programa.
  • Interpretado – El intérprete leerá y ejecutará el código línea a línea, en directo, sin crear un ejecutable. Pruebas tu programa observando e interactuando con el intérprete en tiempo real. También pueden generar un ejecutable para distribuirlo.

Ninguno de los dos es mejor o peor que el otro; cada uno tiene sus pros y sus contras. Hayas elegido el que hayas elegido, necesitarás saber con qué estás tratando para descargarte el compilador o intérprete correcto y poder encontrar soluciones cuando te topes con fallos.

Respecto a los editores de texto, te valdrá casi cualquiera. En los foros de tu lenguaje elegido podrán recomendarte el mejor. Si quieres una solución que te valga para programar en muchos lenguajes, yo te recomiendo VSCode. Podrás instalarle el marcador de colores de casi cualquier lenguaje y ejecutarlo desde su consola integrada.

En este punto, deberías haber aprendido:

  • Qué tipo de compilador o intérprete utiliza tu lenguaje, y haberlo instalado.
  • Con qué editor de texto vas a escribir tu código.
  • Cómo ejecutar código con este compilador o intérprete.

Main, el punto de entrada

Todos, absolutamente todos los lenguajes de programación tienen una línea que se ejecutará antes que ninguna otra.

Tu primer objetivo será encontrar dónde empieza a ejecutarse tu lenguaje de programación. Probablemente tenga un aspecto parecido a esto:

void main (string[] args) 
{
    // Tu código iría aquí
    return 0;
}

Si no lo encuentras, es posible que tu lenguaje no necesite un bloque de código especial para empezar a ejecutarse. Si ese es el caso, la primera línea del primer archivo que le pases al compilador o intérprete será la primera en ejecutarse, y seguirá de ahí en adelante.

¡OJO!
Algunos lenguajes de programación requieren que el primer archivo tenga un nombre especial, como por ejemplo main.

Variables y operaciones

Una vez sabes dónde empezar a escribir tus líneas, es hora de averiguar cómo escribirlas.

La unidad de código más simple que existe son las variables, que guardarán valores para que podamos operar con ellos, así que nuestro objetivo será encontrar cómo declararlas y cómo escribir las operaciones que se les aplican.

La declaración de las variables dependerá de si el lenguaje es tipado o no. Este es todo otro mundo en el que perderte, pero en resumen;

  • Los lenguajes tipados necesitarán que declares el tipo de la variable. Es decir; qué tipo de información vas a guardar dentro de ella. Hay diferentes grados de tipado entre los diferentes lenguajes.
  • Los lenguajes no tipados no requerirán estas indicaciones, aunque podrían permitírtelas.

También deberás investigar si las variables del lenguaje que estás aprendiendo son locales o globales por defecto, y cómo declararlas de una o la otra manera. Si no sabes lo que es esto, no te preocupes todavía.

Para poder asignar valores, deberás echarle un vistazo a los tipos que puede manejar tu lenguaje de programación, cómo se llaman dentro de él y cómo escribirlos.

  • bits, bytes, integers (16, 32, 64, …), floats (16, 32, 64, …), char, strings…

Deberás investigar:

  • Cómo declarar variables, asignarles un valor y cambiarles el valor.
  • Cómo escribir la suma, resta, multiplicación, división, módulo y otras operaciones matemáticas que puedas hacer con una calculadora.
  • Cómo concatenar (juntar) strings y caracteres. Algunos lenguajes te permitirán utilizar los operadores numéricos del punto anterior para formar un conjunto de herramientas muy interesante.
  • Cómo usar operadores booleanos; and, or, not, xor, etc.
  • Opcional: Cómo usar operadores con bits.

Librerías

Todos los lenguajes te dejarán importar librerías de una manera u otra para poder usar código de terceras personas, para que no tengas que reinventar la rueda. Esto lo averiguarás en cuanto empieces con la siguiente sección.

Input y output

Para hacer tus ejercicios necesitarás meter datos y ver las respuestas del programa. La mayoría de intérpretes y compiladores te permitirán hacer esto mediante una librería IO que deberás importar en tu código, y una consola durante la ejecución donde verás e introducirás esos datos.

Si no te he convencido antes con lo de aprender a programar aislándote de tu futuro entorno, aquí es donde encontrarás el primer obstáculo casi con total seguridad. Lo más habitual es que cada entorno anule la consola propia del lenguaje y te obligue a usar la suya propia, lo cuál te obligará a utilizar una librería I/O diferente. Estas librerías a menudo estarán escondidas o será más difícil operar con ellas, porque no serán la fuente de I/O del entorno en el que trabajes.
Unity, por ejemplo, no te permitirá introducir datos mediante su consola. LÖVE2D te permite activar o esconder la consola mediante el archivo config (que tendrás que aprender a utilizar) porque es sólo para debuggear.
Cada entorno tiene su aquél.

Ya que estamos mirando input y output, sería interesante mirar también cómo escribir y leer de archivos, aunque puedes obviar esto hasta la sección Otros aspectos a tener en cuenta.

En esta sección, deberías encontrar:

  • Cómo importar librerías y cuáles son las más utilizadas en tu lenguaje.
  • Cómo llamar a esas librerías.
  • Cómo escribir por consola.
  • Cómo recibir datos por consola.

Condiciones y bucles

O dicho de otra manera; bloques de código. En algún momento necesitarás bifurcar el flujo del programa o repetirlo varias veces, sobre todo cuando trabajes con variables más complejas, así que es el momento de cogerles el tranquillo.

Si nunca has programado, te aconsejo un orden para las estructuras que más te interesará mirar:

  • Condicionales if then else – Haz esto o lo otro en base a una condición booleana.
  • Bucles for – Se ejecutan hasta que una variable llega a determinado valor.
  • Bucles while – Se ejecutan hasta que una condición deja de cumplirse. Pueden sustituir a los for.
  • Bucles do while – Una forma diferente de ejecutar bucles while.

Y si te apetece meterte con los bloques avanzados;

  • Condicionales switch – Como los if, más legibles pero limitados. No todos los lenguajes lo tienen.
  • Bucles foreach – Como los for, depende del lenguaje se pueden utilizar de maneras muy locas.

Arrays, listas y otras estructuras de datos

Como sabes, las variables son extremadamente importantes, pero guardar un sólo valor por variable es muy limitante. Ahora que ya podemos iterar y bifurcar con facilidad, es el momento de investigar cómo funcionan los arrays, las listas y otras estructuras de datos que puedan estar a tu alcance.

Puede sorprender, pero no todos los lenguajes de programación operan con estas estructuras de la misma manera. En concreto, los lenguajes no tipados pueden tener formas muy divertidas de jugar con los arrays; para Lua directamente no existen, son todo tablas. Échale un vistazo al tuyo.

Si nunca has programado, te recomiendo que vayas paso a paso. Busca ejercicios de arrays cuyo tamaño sea fijo, y avanza desde ahí.

Te recomiendo aprender en este orden:

  • Arrays – Valores guardados en secuencia. El número de valores que puedes guardar (el tamaño del array) es fijo.
  • Listas – Son como arrays pero su tamaño es variable.
  • Diccionarios – Te permiten guardar datos bajo claves, algunos lenguajes te dejan operar con ellos como si fueran listas.
  • Otras estructuras de datos: colas (queues), árboles (trees), stacks, heaps y todas las que puedas encontrar.

Funciones

Las funciones son otra de las piezas fundamentales de la programación; bloques de código muy útiles que podrás llamar desde casi cualquier parte, ahorrándote reescribir código y los bugs que ello pudiera ocasionar.

Concretamente, deberás investigar:

  • Cómo declarar una función – Es decir, cómo se escribe la firma de la función. Es un concepto un poco avanzado, pero merece la pena que te vaya sonando si no has programado nunca.
  • Cómo declarar sus argumentos – Para poder abstraer bien tu código te hará falta pasarle valores a una función en algún momento, a estos valores les llamamos argumentos. En los lenguajes tipados el nombre del argumento suele ir precedido de su tipo (int, float…) y en los no tipados, no.
    • Avanzado: Si ya has programado, te interesará mirar cómo declarar el paso de la dirección de la variable y su tratamiento, los conocidos in out ref.
  • Cómo declarar el tipo que devuelve, si es que devuelve alguno – Si es tipado, probablemente debas escribir void (nada) o el tipo del valor a devolver (int, float). Los no tipados a menudo prescinden de estos descriptores.
  • Cómo declarar el valor o valores a devolver – En la mayoría de lenguajes, esto se hace con un return seguido de la variable o valor a devolver. Sin embargo, hay algunos lenguajes que te permitirán devolver más de un valor, y merece mucho la pena investigarlo.

Intermedio

Clases y Structs

Una vez manejes todos los conceptos mencionados arriba, llega el momento de complicarse la vida.

Las clases y los structs son unas unidades de código que nos permiten representar objetos o entidades. Actúan como tipos especiales de variable que habremos creado nosotres, así que podrás utilizarlas en todos los sitios donde hayamos indicado un tipo. Las clases son objetos muy flexibles que pueden guardar datos y ejecutar lógicas complejas, mientras que el struct se concibió más para guardar datos que pasas entre un punto y otro del código, sin cambiar sus valores internos, aunque también pueda ejecutar lógica.

El concepto de clase y struct varía de lenguaje a lenguaje. Cuando hablamos de clases y structs, en realidad estamos utilizando la definición dada por la familia de lenguajes C. Para Lua, por ejemplo, un struct sería cualquier tabla, y requerirá la creación de una metatabla para declarar algo parecido a una clase. Python, por otro lado, tiene clases pero no structs, y requiere del argumento self para referirse a sus atributos propios.

Como puedes ver, hay un mundo de lenguaje a lenguaje.

Así que vamos a pensar un poco más abstractamente, y decir que:

  • Una clase es un objeto/tipo mutable.
  • Un struct es un objeto/tipo inmutable.

Para que podamos considerarlo una clase o struct, requiere las siguientes características:

  • Tiene un nombre que la define.
    • Casa, Coche, Perro…
  • Puede contener valores, llamados atributos, que serán las variables de la clase.
    • Si tiene alarma, cuántas puertas tiene, la raza del perro…
  • Puede tener funciones propias, llamadas métodos, que permiten devolver valores y/o cambiar sus valores internos.
    • Apagar la alarma, arrancar el coche, ladrar…

Si cumple todos estos requisitos, funcionalmente es una clase.

Por tanto, deberás averigurar:

  • Cómo se declara una clase.
  • Cómo se declaran sus atributos.
  • Cómo se declaran sus métodos.

Y una vez tengas la clase creada:

  • Cómo crear una variable de esa clase.
  • Cómo acceder a sus atributos.
  • Cómo llamar a sus métodos.

Herencias

Como dijimos antes, repetir código puede conllevar a muchos errores, pero habrá veces en las que necesitemos muchas clases parecidas. Podemos tener una clase Coche, sí, pero hay muchos coches diferentes; no todos tienen cuatro puertas o se encienden con una llave.

Para ahorrarnos el trabajo de repetir clases y su código, y poder tratar a todas ellas como la clase «Coche», necesitaremos utilizar la Herencia.

La herencia es una característica en muchos lenguajes de programación que nos permitirá extender una clase para poder reutilizar todo su código o modificarlo si es necesario, y añadir comportamientos específicos.

Esto también varía de lenguaje a lenguaje; algunos no te permitirán hacer ningún tipo de herencia, mientras que otros te dejarán heredar de múltiples fuentes (Herencia Múltiple).

Por último, una de las características más interesantes de la herencia es el polimorfismo; la capacidad de dar respuestas diferentes según la clase llamada. Dicho de otra manera; que las clases hijas puedan sobre-escribir los métodos de sus clases madre, y que sean éstas las que ejecuten el código cuando se las llame.

Deberás descubrir:

  • Si tu lenguaje elegido permite Heredar clases.
  • Si permite la Herencia Múltiple.
  • Si permite el Polimorfismo.

Interfaces

Las interfaces son un tipo especial de objeto heredable. En vez de tener atributos y métodos programados, sólo definen la firma de una serie de funciones. Cuando una clase las hereda, tiene la obligación de implementar todas las funciones descritas dentro de la interfaz. De esta manera, podrás abstraer comportamientos entre clases muy diferentes, y tener la certe4za de que funcionarán debidamente.

En la mayoría de los casos una clase debería poder heredar de al menos otra clase y un número infinito de interfaces, pero es posible que no sea así en todos los lenguajes.

Deberás buscar:

  • Cómo definir una interfaz.
  • Cómo heredarla e implementarla.
  • Cómo llamar a sus métodos a través de la clase.

Avanzado

Patrones

Con todo lo que hemos visto hasta ahora, ya deberías conocer el lenguaje a un nivel muy decente y deberías poder programar lo que sea.

Ahora, si todavía te queda gusanillo de aprender más o no has programado nunca, mi consejo es que busques patrones de programación, tanto generalistas como específicos a tu lenguaje.

Los patrones de programación son estructuras hechas que repetiremos una y otra vez para solucionar problemas. No siempre serán la forma más eficiente de hacerlo, pero son un gran punto de apoyo. Te dejo aquí el catálogo de patrones de la web refactoring.guru para que le eches un vistazo. Inevitablemente, investigar estos patrones te llevará a temas que no tocaremos en este artículo. Te he listado algunas de esas cosas en la sección siguiente.

Aunque ya te sepas todos los patrones de programación que existen, te recomiendo también investigar en los foros cómo los implementa la gente y por qué. Hay algunos lenguajes de programación que necesitan formas especiales de hacer las cosas, a veces incluso serán más rápidas de lo que te podría ofrecer otro lenguaje. Siempre merece la pena echar un vistazo.

Otros aspectos a tener en cuenta

Hay mil aspectos de la programación para aprender. Yo sigo aprendiendo día a día. Te dejo aquí una lista de cosas que me vienen a la cabeza que podría interesarte mirar también:

  • Variables globales, cómo y dónde.
  • Estructuras de datos genéricas y cómo crearlas.
  • Funciones lambda.
  • Eventos.
  • Gestión de memoria.
  • Cómo leer y escribir de archivos.
  • Mejores prácticas.
  • Nomenclatura estándar – camelCase, snake-case, etc.

¿Y ahora qué?

Ahora que ya has aprendido casi todo lo que hay que saber de tu lenguaje de programación, ¡es hora de que vayas al entorno donde pretendes utilizado y te diviertas!

Espero que este artículo te haya servido de ayuda. Si encuentras algún error, falta algo o necesitas ayuda en lo que sea, no dudes en dejármelo en los comentarios.

Nos vemos en la siguiente excusa 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *