Cómo aprender a programar desde cero
Tags: beginners, programming, spanish
Published: 2022-12-11 16:16:45

![Teclado Lenguajes de Programación](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9o5zb39lnvmncgtpda9r.png)

Que título más aburrido. Pero no se me ocurrió otro mejor. La verdad es que estaba buscando algo más creativo, pero este tema era muy específico y puntual para un artículo de este estilo.

Vamos a ver los verdaderos pasos a seguir para aprender a programar desde cero. Y cuando digo “cero”, me refiero a eso.

Estuve haciendo una investigación a fondo sobre artículos de este tipo, y todos caen en el mismo error:

- Elegí el lenguaje de programación.
- Aprendé y enseñá.
- ¡Tolerancia al fracaso y disfrutá el camino!

Es hasta casi comercial, aunque no nos estén vendiendo nada. Estos artículos raspan la superficie. No profundizan en la verdadera cuestión:

> Si vas a programar desde cero, primero tenés que entender qué es programar.

Cuando vas a la facultad, esto te lo enseñan. Hay mucha gente que critica el sistema educativo universitario; y se establecen en el concepto de que los cursos son la solución.

Y aquí, mi querido lector/a, tengo que detenerme: Los cursos favorecen a la industria, la aceleran. Pero no son la solución definitiva.

Cuando uno realiza un curso, por ejemplo de Diseño Web, aprende a utilizar las herramientas indicadas para diseñar sitios web. Aprende HTML para maquetar un sitio, CSS para darle estilos y Javascript para darle la lógica.

Hasta acá todo suena genial. El problema es que no están profundizando en las bases. Por ejemplo: ¿Por qué usamos la sentencia IF? ¿Cómo funciona internamente la memoria cuando declaramos una variable? ¿Qué es el tipado dinámico y por qué se usa en Javascript?

Con esto no quiero desprestigiar a los cursos. Cumplen su propósito: salida laboral rápida. Pero ser programador, se trata de entender que luego de terminar dicho curso, debemos profundizar en las verdaderas bases.

El problema es que si no sos consciente de ello, nunca te vas a sentar a aprenderlas. Vas a creer que esto es lo único que hay.

> No seas un programador en Javascript, se un programador.

## Razonamiento Lógico

Si tuviera que mencionar el Core de nuestro oficio, es este. Voy a tomar prestados un par de fragmentos de un [artículo](https://definicion.de/razonamiento-logico/) que habla de esto:

> Cuando una persona razona, desarrolla un razonamiento. Razonar es la actividad mental que permite lograr la estructuración y la organización de las ideas para llegar a una conclusión.

Las palabras clave aquí son estructuración y organización. En mi experiencia dando cursos, este es el error más común en los alumnos. Cuando uno enseña, predica estos dos conceptos, pero lleva mucho tiempo asimilarlos y aplicarlos.

Ser programador implica saber organizarse. Antes de meter cualquier línea de código, hay que analizar y estructurar la solución que necesitamos implementar.

Si fallamos en esto tan simple, vamos a terminar desarrollando cosas que se tengan que refactorear constantemente.

Para aplicar este concepto, podemos tomar un papel y diagramar nuestro análisis. O simplemente nuestro editor y empezar a escribir ideas de cómo va a ser. Con la práctica y los años, terminamos armando esquemas mentales.

> La lógica, por su parte, es la ciencia dedicada a la exposición de las formas, los métodos y los principios del conocimiento científico.

No olvidemos que la Programación es una rama de las ciencias de la computación. Por ende, como toda ciencia, aplicamos el método científico. Esto puede parecer algo extraño y ajeno, pero es simplemente el análisis, la prueba y el error.

> Un razonamiento lógico, en definitiva, es un proceso mental que implica la aplicación de la lógica. A partir de esta clase de razonamiento, se puede partir de una o de varias premisas para arribar a una conclusión que puede determinarse como verdadera, falsa o posible.

Entonces el proceso mental de sentarse a analizar un problema y crear una solución, es meramente la aplicación directa del razonamiento lógico.

De hecho, llevado más a un terreno cotidiano, cuando un desarrollador tiene un determinado problema y busca en StackOverflow, empieza todo el proceso de experimentación.

Desconocemos todas las características de un determinado lenguaje, y resulta que necesitamos recorrer una lista de objetos, por ejemplo. Entonces buscamos la sentencia que nos permite hacer eso, y la probamos en nuestro código.

Estamos experimentando, porque al fin y al cabo, a pesar de que nos aseguren que es la respuesta correcta, no tenemos la certeza de que va a funcionar. Porque existen escenarios y problemas diferentes.

## Algoritmos

Hasta el momento no hablamos de un solo lenguaje de programación. Y esto es importante. De hecho, es lo último que vamos a ver. Porque hay mucho más detrás, y saberlo nos va a garantizar ser mejores analistas.

Este tema es tan importante, que en la facultad existe una o más materias con el mismo nombre.

> Un algoritmo se puede definir como una secuencia de instrucciones que representan un modelo de solución a un determinado tipo de problemas. O bien como un conjunto de instrucciones que realizadas en orden conducen a obtener la solución de un problema.

El concepto parece poco amigable, así que vamos a explicarlo en profundidad.

Cuando se nos presenta un problema, necesitamos trabajar con un algoritmo que lo solucione. Por ejemplo, en la serie Silicon Valley, el protagonista desarrolla un algoritmo que reduce el peso de los archivos de canciones. Esto lo hace porque alivia tanto el tráfico de su sitio web como la subida de las mismas.

El escenario es claro, tenemos un problema y planteamos una solución. Vamos a inventarnos un poco el guión, dado que desconozco el proceso de reducir el peso de un archivo de audio.

Se nos presenta un problema: Tenemos un sitio web donde podemos subir canciones y reproducirlas. Pero nuestro tráfico es bastante corto, y al subir más de diez canciones, acabamos con la cuota mensual.

Entonces necesitamos desarrollar una solución a ese problema. Se nos ocurre reducir el tamaño de los archivos subidos a la plataforma. Para poder hacerlo, necesitamos crear un algoritmo.

Definamos las características de un algoritmo:

- Preciso: Debe ser definido de manera rigurosa, sin dar lugar a ambiguedades.
- Definido: Si se ejecuta un algoritmo dos o más veces, debe dar el mismo resultado.
- Finito: Debe terminar en algún momento.
- Tiene uno o más elementos de entrada.
- Debe producir una salida.

Teniendo en cuenta estos puntos, vamos a crearlo:

- Entrada: Archivo de audio
- Se procede a usar las técnicas de comprensión de 7zip. (Me lo estoy inventando intensamente).
- Convertir cualquier archivo a mp3, considerando el formato uno de los más comprimidos. Se estima pérdida de calidad.
- Salida: Archivo de audio comprimido al 70%.

Como ven, un algoritmo define un marco teórico. No hay ningún tipo de práctica hasta el momento. Pero esto es fundamental, porque la práctica es en realidad la implementación de nuestros argumentos teóricos.

Para profundizar este tema, les dejo un [documento](http://ing.unne.edu.ar/pub/informatica/Alg_diag.pdf) que pertenece a una facultad de ingeniería.

## Diagramas de Flujo

En primera instancia quiero aclarar que el documento que compartí en el apartado anterior posee una explicación más detallada al respecto de este tema.

Los diagramas de flujo son lo mejor que nos ocurrió a los desarrolladores desde tiempos inmemoriales. Nos permiten plasmar nuestro algoritmo de un modo gráfico y muy fácil de entender.

Además nos permiten ver las variaciones en una salida, usar condiciones, bucles, referencias a almacenamiento, ingreso y salida de datos, entre otras cosas.

Les dejo un ejemplo de un diagrama de flujo:

![Diagrama de Flujo Bombilla](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b0b3e8xcq8xz457e2wbp.png)

Tenemos un problema, nuestra lámpara no funciona. Necesitamos una solución. Entonces desarrollamos un algoritmo que pregunta ciertos estados del componente y en base a la respuesta devuelve una salida.

Como ven, ni siquiera me hace falta explicar demasiado en este punto. El propio diagrama nos da una visión del problema y las posibles soluciones.

Lo más interesante, no me pregunten por qué, pero ocurre: Cuando diagramamos, tendemos a modificar nuestro algoritmo inicial. Llevarlo al gráfico nos cambia ciertas formas de entender el problema y terminamos ideando soluciones más flexibles en nuestro algoritmo.

Por ejemplo, puede ser que armando las condiciones nos demos cuenta de que nos olvidamos tres o cuatro variaciones. Entonces nuestro algoritmo se vuelve más sofisticado, y cubre problemas que no sabíamos que existían hasta ese momento.

## Pseudocódigo

Mucha gente se tiende a confundir con este concepto. He visto publicaciones en Facebook de gente que quiere desarrollar software con Pseudocódigo. No me lo estoy inventando.

Empecemos echando un poco de luz al asunto. ¿Qué es el pseudocódigo?

> El principal objetivo del pseudocódigo es el de representar la solución a un algoritmo de la forma más detallada posible, y a su vez lo más parecida posible al lenguaje que posteriormente se utilizara para la codificación del mismo. ([Fuente](http://desarrollodesoftwaregabriel.blogspot.com/p/para-que-sirve-el-pseudocodigo.html?m=1))

En resumen, es lo más cercano a programar, pero solo a nivel representativo. Por ejemplo, si tuviéramos que tomar el ejemplo de la lámpara, nuestro pseudocódigo sería asi:

```
INICIO
  IMPRIMIR “La lámpara no funciona”
SI (“Está enchufada?”)
  SI (“Está quemada?”)
    FUNCION cambiarAmpolleta()
  NO
    FUNCION comprarLampara()
NO
  FUNCION enchufarLampara()
FIN
```

Esto nos permite tener una visión general de como podemos aplicar nuestro algoritmo mediante código. Es interesante porque nos abstraemos del lenguaje de programación. Nos concentramos solo en nuestro algoritmo.

Luego en cada lenguaje tendremos ciertas formas específicas de aplicarlos, pero no nos tiene que importar ahora.

> El error más común de los desarrolladores es condicionarse al lenguaje o tecnología que utilizan al aplicar un algoritmo.

Pero el pseudocódigo no es aplicable a la vida real. Esta confusión viene de la mano de un compilador que hizo esto posible. Se trata de [PSeInt](http://pseint.sourceforge.net/).

Un editor de código muy interesante que nos permite usar pseudocódigo y ejecutarlo. Si es interesa, tengo un [repositorio en GitHub](https://github.com/maxwellnewage/pseint-ejemplos) con ejemplos de cada uno de sus sentencias.

Este editor que también es compilador, nos da una facilidad, una experiencia aproximada de cómo va a funcionar nuestro algoritmo. Pero luego debemos llevarlo a una tecnología real y aplicable.

Es importante entender esta diferencia para no caer en la confusión de que podemos programar con PSeInt. Nos ayuda, si, pero estamos hablando de cosas distintas.

## Aprender C/C++
Y llegamos a la parte en donde mucha gente va a estar dividida en su opinión: Yo considero que los mejores lenguajes para entender los fundamentos en programación son C y C++.

Lo interesante de C, es que nos permite aprender:

- Qué es un compilador.
- Por qué muchos lenguajes hoy día están basados en C.
- Qué son las variables y constantes.
- Qué son los condicionales y bucles.
- Cómo se maneja la memoria manualmente. Entender la diferencia entre por ejemplo el Garbage Collector de Java.
- Entrada y salida de datos.
- Lectura y Escritura de Archivos.
- Funciones.
- Como funciona el paradigma de programación estructurada o imperativa.

Y así podría seguir tres kilómetros más de artículos. Yo empecé con C y hoy estoy contento de haberlo hecho. Me dio perspectiva. Me permitió entender que hacen bien o mal otros lenguajes de programación.

Luego esta C++. Una especie de C con esteroides. Es un lenguaje que nos introduce de lleno en el paradigma de la programación orientada a objetos, uno de los paradigmas más usados en este siglo.

Muchos quizá opinen que lo ideal es empezar con Python. Me parece una buena opción también. Pero creo que es interesante apuntar a aprender un lenguaje más dificil al principio. C tiene sus vueltas y dolores de cabeza, y esto nos lleva a mejorar dado que nos obliga a aprender muchas cosas para solucionar un determinado problema.

Mi consejo es que aprendan todo lo que necesiten de C hasta interfaces gráficas no inclusive. Lo mismo con C++, aunque hay muchas librerías gráficas, pero salvo que quieran meterse a crear programas para Windows, MacOS y Linux, no conviene que profundicen tanto esto.

Para los que se quieren dedicar a la electrónica, C es su mejor amigo. Hoy día se sigue utilizando para desarrollar microprocesadores. Y más para el lado de nosotros, los simples mortales que solo conocemos el verde de las placas, también se puede usar en Arduino.

Para los que quieren desarrollar videojuegos, C++ es una opción muy interesante. Pero si no quieren manejar la memoria directamente, pueden optar por C#. Mucha gente ama C# y con razones: se pueden crear juegos en Unity, soluciones web en .NET y aplicaciones con Winforms entre otras cosas.

## Conclusiones
Este camino puede ser un poco más pesado, pero es el correcto. No estoy siendo dogmático, son fundamentos que tienen más años que muchos lectores, y yo incluido.

Con estas bases van a poder entender la programación desde un contexto no solo profesional, sino profundamente técnico. Y sobretodo, científico.

Espero que les haya gustado el artículo y comenten cómo empezaron ustedes a programar!