Bienvenidos todos a un nuevo post para el canal, en este post vamos a ver 7 apps que te permitirán o ayudaran a aprender a programar en el lenguaje de tu elección.
Índice
Primero de todo quiero mencionar que hacer estas 7 apps no significa que vayas a pasar de un nivel junior a senior, pero si te van a dar los conocimientos que vas a necesitar para pasar de un nivel a otro.
Los ejemplos de código están escritos en C#, pero la verdad es que da igual el lenguaje, simplemente usa el que tu quieras aprender.
1 - Proyectos básicos para aprender a programar
Así que el primero de los proyectos que voy a sugerir es un hola mundo, hacer un hola mundo parece sencillo y una chorrada, pero no lo es tanto, ya que tienes que instalar todo lo necesario para poder hacer dicha salida por pantalla, y esto te puede llevar un par de horas.
Una vez tienes todo configurado correctamente lo que tenemos que hacer es continuar con programación básica debemos entender que son las variables, los operadores o cómo debuggear;
Un ejemplo de este tipo de proyectos podría ser la secuencia de fibonacci, la cual es muy popular y se puede hacer de diferentes formas. Aquí un ejemplo.
public static int Fibonacci(int n)
{
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
O en su forma iterativa, la cual es mucho más eficiente en números grandes
public static int Fibonacci(int n)
{
if (n <= 1)
return n;
int fib = 1;
int prevFib = 1;
for (int i = 2; i < n; i++)
{
int temp = fib;
fib += prevFib;
prevFib = temp;
}
return fib;
}
Una vez tienes este proyecto funcionando, puedes pasar al siguiente nivel. hacer algo simple, pero que a la vez sea muy reconfortante, En mi caso elijo el juego de la serpiente o snake.
Para hacer este ejercicio vas a necesitar saber qué son las clases y los objetos, a nivel básico. Y opcionalmente le puedes poner que la puntuación más alta se guarde en un fichero con la fecha, así habrás trabajado con ficheros y fechas.
Personalmente pienso que este es el nivel básico de programación, ya que como digo incluye, conocimientos básicos de programación orientada a objetos, incluye el uso de arrays para el tamaño de la serpiente y ficheros y fechas para la puntuación.
2 - Proyectos intermedios para mejorar en programación
Para los proyectos intermedios, vamos a pasar a un segundo nivel, ya no vamos a trabajar con los elementos más básicos del lenguaje, si no que vamos a ir un poco más en detalle, dentro de la programación orientada a objetos, trabajaremos con interfaces, herencia, polimorfismo, programación concurrente o asíncrona.
Un ejemplo de ejercicio de nivel intermedio para mi es simular el funcionamiento de una barbería/peluquería.
En una barbería tenemos a los barberos que cortan el pelo, y luego tenemos a los clientes que necesitan un corte de pelo, pero claro, cada uno de ellos tarda un tiempo aleatorio, no todos van a tardar el mismo tiempo.
Por ejemplo, el primer cliente puede tardar 1 hora en tener el corte de pelo que quiere, mientras que el segundo 15 minutos y el tercero 25 minutos.
Si tenemos dos barberos, uno de ellos estará ocupado mientras el segundo realiza al segundo y tercer cliente y empieza con el cuarto.
Para realizar este ejercicio vas a necesitar conocimiento sobre concurrencia e hilos, que en el caso de .NET se hace con la clase Task. Aquí tienes un post sobre programación asíncrona en C#.
Este podría ser un ejemplo, donde tenemos un número de barberos y un número de clientes predefinidos:
Console.WriteLine("Welcome to the barber shop!");
int barbers = 2;
ConcurrentQueue<Client> clients = new ConcurrentQueue<Client>() { };
foreach (int i in Enumerable.Range(0, 10))
{
NewClient(i);
}
await DoWork();
void NewClient(int number)
{
Random random = new Random();
clients.Enqueue(new Client($"Client {number}", random.Next(1,10)));
}
async Task CutHair(Client client)
{
Console.WriteLine($"The {client.Name} started to cut his hair");
await Task.Delay(client.TimeInSeconds * 1000);
Console.WriteLine($"The {client.Name} finished in {client.TimeInSeconds} seconds");
}
async Task DoWork()
{
List<Task> workingBarbers = new List<Task>();
while (clients.Any() || workingBarbers.Count>0)
{
while (workingBarbers.Count < barbers && clients.TryDequeue(out Client client))
{
Task barberTask = CutHair(client);
workingBarbers.Add(barberTask);
}
Task freeBarber = await Task.WhenAny(workingBarbers);
workingBarbers.Remove(freeBarber);
}
}
record Client(string Name, int TimeInSeconds);
Pero lo podemos complicar un poco más, podemos modificar el código para que nos lleguen clientes mientras estamos cortando el pelo de otros clientes que ya están en la propia barbería.
Esto sería un ejemplo:
using System.Collections.Concurrent;
Console.WriteLine("Welcome to the barber shop!");
int barbers = 2;
bool isBarberShopClosed = false;
ConcurrentQueue<Client?> clients = new ConcurrentQueue<Client?>() { };
foreach (int i in Enumerable.Range(0, 10))
{
NewClient(i);
}
await Task.WhenAll(AttendClients(), MoreClients());
void NewClient(int number)
{
Random random = new Random();
Console.WriteLine($"New Client {number} arrival");
clients.Enqueue(new Client($"Client {number}", random.Next(1, 10)));
}
async Task CutHair(Client client)
{
Console.WriteLine($"The {client.Name} started to cut his hair");
await Task.Delay(client.TimeInSeconds * 1000);
Console.WriteLine($"The {client.Name} finished in {client.TimeInSeconds} seconds");
}
async Task AttendClients()
{
List<Task> workingBarbers = new List<Task>();
while (clients.Any() || workingBarbers.Count > 0)
{
while (workingBarbers.Count < barbers && clients.TryDequeue(out Client client))
{
Task barberTask = CutHair(client);
workingBarbers.Add(barberTask);
}
Task freeBarber = await Task.WhenAny(workingBarbers);
En C# tenemos suerte porque todo el tema de hilos y concurrencia está detrás del tipo Task, lo cual simplifica muchísimo el trabajo, pero en otros lenguajes puede ser algo más complejo.
Como ejercicio para entender la concurrencia me parece que es muy bueno.
El segundo proyecto que yo considero como nivel intermedio, te va servir y mucho para el mundo real y las aplicaciones empresariales:
Crear un Foro o un Blog como este donde estás leyendo este post.
Personalmente para practicar, creo que un foro puede ser más completo, ya que tienes multitud de usuarios (sesiones), necesitarás incluir una base de datos así como proveer de funcionalidades como bloquear hilos para que no se pueda contestar o que solo los administradores puedan hacerlo, categorías, etc.
Inicialmente, deberás hacer la aplicación de forma Full Stack, osea todo en un lenguaje, en una sola aplicación monolítica, por ejemplo en ASP.NET Core, y teniendo las capas separadas utilizando arquitectura hexagonal.
Después intentar adentrarse en una tecnología front end, ya bien sea Blazor si lo que quieres es continuar en .NET o irte a tecnologías JavaScript como Vue, React o Angular.
Además esta acción te llevará en el back end a implementar una API lo cual es muy importante a día de hoy, ya que es donde van a estar el 90% de trabajos Back-end. Asegúrate de que tu API maneje adecuadamente todos los métodos HTTP (GET, POST, PUT, DELETE), proporcione respuestas coherentes y esté bien documentada.
Como puedes imaginar, este proyecto es MUY grande y te puede llevar desde una semana a varios meses, depende cuantas horas le metas de forma diaria.
Y que no se te olvide hacer tests, ya que son una parte fundamental del desarrollo.
2.1 - Programación intermedia en un lenguaje específico
Otra forma de entender la programación intermedia, o incluso la avanzada es centrandonos en un lenguaje específico, no en los conceptos generales de programar un blog o un foro, si no en entender que es un indexer y cómo fucniona en C#, o que es un Diccionario en C# y en que se diferencia de una Lista.
Cuando hablamos de programación intermedia, yo lo entiendo de esa forma, que tenemos dos opciones, una es sobre un lenguaje específico y otra sobre un ámbito más global completamente independiente de un lenguaje.
3 - Proyectos avanzados que te llevarán al siguiente nivel
En esta sección tengo dos proyectos principales.
El primero puede ser una aplicación o un juego en tiempo real, no estoy hablando de que crees el Clash Royale, pero si que puedes hacer un juego donde dos usuarios juegan al parchís o a las cartas, una versión de poker o blackjack donde juegas con un amigo puede ser un gran ejemplo.
vas a tener que tocar tecnologías que ya tocaste en la versión del blog/foro como pueden ser lenguajes de servidor o las bases de datos, pero también vas a necesitar coger cierto conocimiento en websockets y saber cómo funcionan.
Finalmente el que para mí puede ser el proyecto que más puertas te va a abrir a nivel profesional, es un sistema distribuido, sistemas claves a día de hoy en el mundo empresarial.
Empieza por hacer una web de una tienda donde se crean productos, se crean pedidos y se venden los productos, esto lo puedes hacer con microservicios, aqí en una primera versión tienes que incluir las mismas ideas que incluiste para el foro o blog, pero de una forma distribuida, por ejemplo, ya no vas a mantener sesiones, si no que vas a tener un token JWT.
Luego una vez lo tengas montado con microservicios y funcione correctamente continua con arquitecturas propiamente asíncronas, como son incluir un service bus para la comunicación, abstraer credenciales, logs, monitorización, etc.
Tienes que ser capaz de montarlo todo en tu máquina con contenedores (ej: docker) o incluso montarlo todo en kubernetes utilizando helm.
Si eres capaz de dominar todos los proyectos que he propuesto, lo más probable es que nunca tengas problemas para encontrar trabajo.
A darle Duro!