Recientemente estuve viendo un curso de JavaScript de Wes Bos a manera de refrescarme un poco y no perder la práctica pero sobre todo para mantenerme al día con las actualizaciones en el mundo de la tecnología, que es a lo que me dedico y, mientras veía uno de los primeros videos sobre el tema de variables, me di cuenta la difícil, o al menos ambiguo, que se volvió para Wes explicar el concepto de variables y como utilizarlas.
Y es que para cualquier programador moderno o más bien, que haya aprendido a programar recientemente, en la era del Internet, es muy probable que el primer lenguaje con el que se topen sea por recomendación o curiosidad sea JavaScript que por cierto, considero una pésima primera opción para quien quiere aprender este fino arte de convertir código a programas.
Haber aprendido programación con lenguajes «viejos» o con paradigmas diferentes permite entender muchos otros conceptos después. Por ejemplo, en el caso de Wes, trataba de explicar lo siguiente:
var name = "Gustavo";
let age = 36;
const cool = true;
Comenta Wes que lo anterior es la explicación de cómo podemos definir variables en JS de diferentes maneras. Después presenta lo siguiente:
var name = "Gustavo";
let age = 36;
const cool = true;
var name = "Adolfo";
Lo cual, para los que sabemos programación, entendemos lanzará un error. ¿Por qué? Por que estamos redefiniendo la variable, o al menos es lo que trata de explicar Wes.
Cuando tomé mis primeros cursos de programación, en lenguajes «tipados» como Turbo Pascal o C, el concepto de tipos de datos era imprescindible, por ejemplo, para definir las mismas variables en C:
char name[] = "Gustavo";
int age = 36;
const bool cool = true;
Lo relevante en este caso es la parte anterior al nombre de la variable, en el caso del nombre char
para la edad int
y para el factor cool const
y bool
¿Qué tienen en común estas tres palabras? Que son utilizadas para declarar el tipo de dato, es decir, en lenguajes tipados como C (o Java, C#, C++, Rust, etc.) es necesario indicarle al compilador el tipo de dato que almacenará una variable (o una constante, para el caso de cool
) y acto seguido se define su valor. Dos conceptos de hecho mezclados en la misma operación pero que son completamente diferentes; declarar no es lo mismo que definir. Por ejemplo:
# Declarar
int age;
# Definir
age = 36;
En el ejemplo anterior primero declaro la variable, es decir, indico al compilador el tipo de dato y el nombre de la variable. En el siguiente bloque simplemente asigno un valor a dicha variable que también se le conoce como «inicializar«. El primer concepto es una declaración, el segundo es una definición.
Veamoslo así: Cuando México se declaró independiente aquella madrugada del 16 de Septiembre de 1810 con «el grito de Dolores«, la población no sabía exactamente cómo funcionaría esa independencia, solo sabía que se declaraba. No fué sino hasta 1824, cuando se consumó la lucha, que se definió realmente lo que sería dicha constitución.
El mismo concepto podemos utilizar en programación: se declara una variable una sola vez, pero podemos redefinirla muchas otras veces. Y claro, en el caso de las constantes, obviamente solo podemos definirlas una vez. No existe tal concepto como una «variable constante» pues el mismo nombre de una invalida a la otra. Una constante es una constante, es decir, almacena un valor que no cambiará, una variable almacena un valor con dicha posibilidad.
Y he ahí el problema. Muchos de estos conceptos que han sido removidos de lenguajes modernos para facilitar la tarea del programador (lo cual es positivo) hacen que explicarlos a nuevos aprendices sea a veces complicado, sobre todo si no se tienen las bases de programación que abarquen todo tipo de paradigmas, no solo el que esté de moda.
Refuerzo mi idea de que el conocimiento teórico, aun para conceptos o tecnologías que muchos llaman obsoletas o innecesarias, hace la diferencia entre programadores mediocres o simplemente «code monkeys» y verdaderos ingenieros en software.
UPDATE
Código completo del ejemplo en C
:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
char name[] = "Gustavo";
int age = 36;
const bool cool = true;
char cool_factor[9];
int main()
{
if (cool)
{
strcpy(cool_factor, "a cool");
}
else
{
strcpy(cool_factor, "a simple");
}
printf (
"Hello, World! My name is %s, %s person and I'm %d years old \n",
name,
cool_factor,
age
);
return 0;
}
Puede ser compilado en GCC en *nix con el siguiente comando:
gcc -o hello hello.c
Gustavo no se si varia la terminología de un lenguaje a otro pero considero que primero se define la variable y luego se declara, la primera solo seria reservar un espacio de la memoria para poder almacenar datos y la ultima seria una declaración muy bien sea vacía o con algún dato para que este ya inicializada la variable y no tener que hacerlo posteriormente durante el desarrollo del código.
Hola Gustavo, llevo algunos meses aprendiendo de forma autodidacta la programación con el lenguaje python. Este tema se me pasó por alto, no me he topado con él o sencillamente el lenguaje no se presta para hacer la distinción. Quiero preguntar, por cuál lenguaje recomiendas empezar según tu vasta experiencia. Me interesa este mundo, quisiera dedicarme a ello, pero aún no me decido a que quiero dedicarme, por eso la solicitud de recomendación. Para ver el panorama y elegir el camino que mejor se adapte a mi. Por lo demás, gracias, muy clara la diferencia de los conceptos.
Definitivamente Python es una muy buena elección, es con el lenguaje que yo aprendí conceptos de programación orientada a objetos. Quizá una vez que te sientas más familiar con toda la terminología y conceptos generales de programación podrías pasarte a C# que maneja conceptos de lenguajes compilados y tipados a diferencia de Python, JS, Ruby etc. Si en verdad quieres aprender la teoría más básica (y que te ayudaría a definitivamente entender cualquier otro lenguaje) C es una excelente opción pero la curva de aprendizaje no es pequeña.
Saludos!