Mejorar en Programación

¿Como mejorar como Programador?

Mejorar en Programación

Volver al contenido

Copiar enlace

Mejorar en programación, require practica, habitos y una cierta disciplina que puede llevar años cumplir con efectividad. Si quieres mejorar en esto probablemente pienses que todo se trata de escribir codigo, pero esto en realidad es solo una parte. Y es que programar y escribir código a diferencia de los que muchos puedan creer, estan relacionados pero son dos cosas distintas, y se desarrollan de forma distinta.

El ganador del Premio Turing del 2014, Lexlie lamport lo describe muy bien.

Entonces como programar consiste más en pensar y escribir código es más una acción mecanica que conlleva usar un lenguaje de programación, ambos necesitan distintas practicas para que las desarrollemos. Así que este articulo lo voy a dividir en dos partes.

La primera consite en como mejorar nuestras habilidades programando, y la segunda, que será la siguiente que publicaré, consistira en como podemos mejorar en la escritura de código.

Y si tienes prisa estos son los temas que mencionaré en este video, aunque tambien daré una lista de recursos para que puedas usarlo.

  • Indentifica tus carencias
  • Aprende a Representar Abstracciones (Data Structures)
  • Algoritmos

empecemos con la parte más básica, Indentificar tus carencias.

Indentifica tus Carencias

Cuando hablo de identificar tus carencias, me refiero a que cada programador puede reflexionar sobre sus propios procesos de aprendizaje e identificar aquellas partes que se les son más difíciles poner en practica.

En nuestro caso consiste en identificar que es lo que se nos es dificil al momento de plasmar un una solución en código.

Por ejemplo un problema muy comun que tienen muchos programadores iniciantes, es que no entienden lo que escriben, y pueden llegar a creer que basta con memorizar codigo y pensar que en algun momento por arte de magia lo entenderán.

Coloquemos de ejemplo esta porcion de código que he encontrado en unos segundos en internet:

async getAllUser (req, res) {
    try {
      const limit = parseInt(req.query.limit);
      const skip = parseInt(req.query.skip);

      const userService = new userService();
      const users = await userService.getAll(limit, skip);

      return res.status(200).json(users);
    } catch(e){
      return res.status(500).json(e)
    }
},

esta sacado de este enlace al azar de internet: https://www.softwareontheroad.com/pagination-in-nodejs-mongo/

Si puedes llegar a explicar este código aun no sabiendo el contexto, o al menos tener una idea minima de para que sirve, puede que ya entiendas muchos conceptos básicos de código.

por ejemplo, esta fraccion de código basicamente me dice que es una funcion asincrona, que recibe 2 datos, no se si son strings objetos, o cualquier estructura:

async getAllUser (req, res) {

},

pero las siguientes lineas, debido a la notacion de puntos (x.y.z) me dicen que son objetos:

const limit = parseInt(req.query.limit);
const skip = parseInt(req.query.skip);

de hecho las propiedas limit y skip estan siendo convirtiendas a enteros, lo que signfica que luego necesitaran incrementarlas u operar con estas.

Luego viene la instacion de una clase:

const userService = new userService();

Lo que significa que estan usando el paradigma orientado a Objetos. de hecho esto se ve en la siguiente liena donde se usa un metodo del objeto instanciado.

const users = await userService.getAll(limit, skip);

Luego se usan metodos encadenados que reciben el resultado y que retornan algo acabando con la funcion:

return res.status(200).json(users);

Que al final estan todos dentro de un Try catch:

try {
  const limit = parseInt(req.query.limit);
  const skip = parseInt(req.query.skip);

  const userService = new userService();
  const users = await userService.getAll(limit, skip);

  return res.status(200).json(users);
} catch(e){
  return res.status(500).json(e)
}

Lo que es para validar el error.

Si estas empezando la idea no es que sepas todo al 100%, pero si debes saber que por cada cosa que obvies o ignores, eventualmente puede hacer que otras porciones de código se vuelvan muy dificiles de leer. asi que si tienes una porcion de código grande, trata de ver cada porcion e identifica que no entiendes para que luego investigues cada tema, uno por uno.

Recuerdas ese tipico dicho divide y venceras, aqui es donde aplica eso.

Usando un trozo de papel o aplicaciones que te permitan tomar notas (como Notion u Obsidian.md por ejemplo), siempre que encuentres una porcion de código que no entiendas, apuntalo, o copialo. Para que luego investigues que significa esa parte.

Por ejemplo como funciona el new, o que significa await. ambos son partes de temas como el paradigma de orientacion a objetos en javascript y el otro es asincronia en Javacsript, cosas que son cursos en si mismos, y que solo sabras que tendras que aprender si los has identificado primero, para poder investigarlos más a fondo.

Y yo se que esto parece más relacionado a escribir código, pero recuerda que gran parte del trabajo d eun programador es investigar cosas que no sabe, asi que este proceso de ir aprendiendo más y más conforme te lo encuentres es lo que diferencia a los juniors de los senior. De hecho muchas veces he tenido que aprender un poco más de encriptados, protocolos de red, concurrencia, y asi, tratando de entender solo una pequeña linea de código.

Investigar actualmente es más facil, gracias a buscadores como Google o Chat GPT. Pero recuerda que estos solo son referencias y al final tu debes entender lo que estas hcaciendo.

De hecho muchas veces he visto a muchos iniciantes volver a los fundamentos debido a esto, undamentos como tipos de datos, y las estructuras de datos, lo que me lleva al siguiente punto.

Aprende a representar Abstracciones

Programar consiste en resolver problemas, y los problemas en la vida real son medibles y representados con distintos valores. Asi que cada lenguaje de programacion tiene soporta a los que llamamos tipos de datos o Datatypes, ya saben:

Enteros:

20

Flotantes:

20.3

Booleanos:

true

y asi. Por ejemplo en Javascript estos son los más comunes pero otros lenguajes de programacion ofrecen más tipos de datos que estan definidos por longitudes numericas, como los Double, Decimal, complex, entre muchos otros.

En realidad esto es particular de cada lenguaje, soportar tipos de datos que requieran más o menos precision, dependiendo de que progrmaas se crearan con ellos.

Estos son los fundamentos de escribir código, de hecho es algo muy simple, si te pido represntar un texto como las letras del abecedario en el computador:

sabes que estos son un String

o si te pido representar el numero 23 sabes que puede ser representado por un Integer.

Pero si te pido representar algo no tan obvio como una lista de numeros:

10, 20, 30

que deberia ser? un ¿arreglo, un slice, una tupla?

o si te doy la informacion de una persona como:

que deberia ser un objeto (o dictionary), o una clase?

Bueno todo esto de representar conjunto de datos de forma organizada, forman parte de lo que llamamos Estructuras de datos o Data Structures. De hecho aqui lo menciono quizas con estructuras muy comunes pero son muchas más e implementarlas es distinto dependdiendo del programa que desarrollaras o el lenguaje que uses.

Por ejemplo algunas estructuras de datos muy comunes son:

  • Array, un conjunto de elementos del mismo tipo almacenados en secuencia
  • Stack, Una estructua de datos LIFO (Last In - First Out), ultimo en entrar, primero en salir
  • Queue, una estructura de datos FIFO (Firt In - First Out), primero en entrar, primero en salir
  • Linked List, elementos que estan vinculados entre si mediante enlaces
  • Tree, una estructura que representa relaciones de elementos padres e hijos
  • Graph, Un conjunto de nodos y arcos que representan relaciones entre ellos
  • Hash Table, permiten buscar elementos eficientemente basados en una clave

Todos estos nos permiten organizar y almacenar datos, para que luego podamos acceder a estos de forma eficiente. De hecho esto suena como si hablaramos de una base de datos, y si las bases de datos son un ejemplo de su uso, ya que guardan datos en estructuras como tabla. pero hay otros como

  • el sistema de archivos del sistema operativo usa los arboles de directorios
  • los navegadores usan Stacks para mantener el historial de navegacion,donde la página más recientemente visitada se encuentra en la parte superior de la pila y la página más antigua se encuentra en la parte inferior.
  • Los juegos a menudo utilizan árboles para representar estructuras de juego, como la estructura de un laberinto o un mapa. También pueden utilizar colas para mantener una lista de acciones pendientes o eventos en el juego.
  • Sistemas operativos: Los sistemas operativos utilizan colas para mantener una lista de procesos que deben ejecutarse, y las prioridades se establecen en función de la posición de cada proceso en la cola

Aprenderlos no es muy complicado, pero lleva su tiempo aplicarlos en algun lenguaje, De hecho hay muchos libros dedicados a estructura de datos para un solo lenguaje, si buscas en Google cosas como:

  • javascript data structures book
  • c++ data structures book
  • java data structures book

y así, puedes encontrar muchos cursos o libros muy buenos, ya depende de ti investigar opiniones de cada uno

Ahora representar datos es vital, pero tambien saber como los vamos a usar y es aqui donde entran los Algoritmos.

Algoritmos

LOs algoritmos son una serie de pasos que usamos para resolver algun problema. y estos estan relacionados a las estructuras de datos. porque usano las esturctuas de datos organizamos y almacenamos datos, pero usando algoritmos procesamos y manipulamos estos datos.

Por ejemplo, si deseas ordenar una lista de números, primero debes elegir una estructura de datos que te permita almacenar los números, como una lista.

let numbers = [5, 3, 1, 4, 2];

Luego, debes elegir un algoritmo de ordenamiento, como el algoritmo de ordenamiento por burbuja o Bubble Sort, que especifica cómo debes manipular los datos en la estructura de datos para ordenarlos. En este caso, la estructura de datos y el algoritmo de ordenamiento trabajan juntos para resolver el problema de ordenar una lista de números

let bubbleSort = (inputArr) => {
    let len = inputArr.length;
    let checked;
    do {
        checked = false;
        for (let i = 0; i < len; i++) {
            if (inputArr[i] > inputArr[i + 1]) {
                let tmp = inputArr[i];
                inputArr[i] = inputArr[i + 1];
                inputArr[i + 1] = tmp;
                checked = true;
            }
        }
    } while (checked);
    return inputArr;
};

Ahora los algoritmos también se pueden clasificar en función de su complejidad temporal (Time Complexity), que describen cuánto tiempo tomará un algoritmo para completarse en función del tamaño de la entrada:

algunos tiempos de complejidad comunes son:

  • O(1): tiempo constante, independiente del tamaño de la entrada.
  • O(log n): tiempo logarítmico, crece lentamente con el tamaño de la entrada.
  • O(n): tiempo lineal, crece en proporción directa al tamaño de la entrada.
  • O(n log n): tiempo log-lineal, crece más rápido que el logaritmo pero más lento que la proporción directa.
  • O(n^2): tiempo cuadrático, crece rápidamente con el tamaño de la entrada.
  • O(2^n): tiempo exponencial, crece extremadamente rápido con el tamaño de la entrada.

y así sucesivamente.

También se pueden clasificar en función de su complejidad espacial (Space Complexity), que describe cuánta memoria adicional se requiere para ejecutar un algoritmo.

Estos temas tambien siempre son colocads a prubenas en entevistas de trabajo de empresas de software como Google, Apple, Meta, Amazon y asi., EN youtube hay muchas entrevistas de trabajo de estas, asi que tomas las de retos ver de que se trata y a medida que vas viendo, investigalas.

la elección de una estructura de datos y un algoritmo adecuados para un problema específico puede tener un impacto significativo en la eficiencia y la efectividad de la solución. Por lo tanto, es importante elegir cuidadosamente las estructuras de datos y los algoritmos adecuados para cada problema

sitos como Leetcode, hackerrank, o CodeChef

Crea Proyectos Continuamente

Ahora, no solo aprendas algoritmos y estructuras de datos, ser bueno resolviendo problemas abstractos puede ayudarte a mejorar tu logica, pero en la vida real la gran mayoria tambien tienen que resolver problemas reales, que necesitan que conozcas herramientas, para poder solucionarlos.

Asi que a menos que quieras dedicarte a la programacion competitiva, que se trata justamente de esto de resolver solo problemas abstractos, tambien aprender ciertos sistemas de bases de datos, Frameworks y bibliotecas que te permiten crear progrmas de verdad, como apps de escritorio, movil, web. en donde llegues a usar estos conceptos teoricos quizas en un sistema de busqueda, o de streamming, o por que no crear tu propia base de datos quizas. es decir ponlos en practica creando aplicaciones. estas a su vez tambien te pueden servir para tu portafolio.

Aptitudes de un Programador

Ahora muy a parte de los temas que estudies, tambien en mi opinion hay cierto tipos de actitudes que identifican a lo que es un muy programador:

Entre estas tenemos

  • Querer aprender constantemente y ser apasionado por la profesión. La parte inicial para poder aprender algo, es que primero tengas el interes de hacerlo. Programadores que son muy capaces siempre estan abiertos a aprender nuevos temas o ver nuevas formas de hacer un trabajo.

  • Contar con una buena capacidad analítica. Muchas veces los problemas en código no son muy obvios, hay veces que programas finales fallan porque cierto codigo consume mucho más en producción, o requiren de cierto recursos de harwdare adicional. o ciertas veces puedes llegar a plantear soluciones a problemas que no existirian si tuvieran un mejor diseño en primer lugar. todo es parte de la capcidad para analizar todo un sistema y que se gana con el tiempo

  • Ser realista. Hay veces que tenemos la mejor herramienta de software, o la mas novedosa, pero tambien debemos contar con el tiempo que nos tomaria aprenerla y llevarla a cabo

  • Ser creativo. no solo te guies por las forma más recomendadas de como hacer software, sino prueba otras formas, y midelas tanto en tiempo y espacio

  • Tener paciencia. muchas veces no sabremos como resolver cierto problemas, pero si continuas estudiando e investigando, pasaras de no saber nada, a saber algo, y de algo a saber poco, para que finalmente puedas entener del problema

  • Tener capacidad de comunicación y saber trabajar en equipo.

  • Indpendiente. Usar las soluciones de internet, esta batante ien para ahorra tiempo, pero cuando se trate de estudiar, no siempre esperes que te resuelvan el problema, gran aprender a programar es saber encontrar la solucion por uno mismo.

  • Ser flexible y capaz de adaptarse al cambio. esto porque todo el area TI siempre esta cambiando, con tencologías que simplifican y reducen el coste. Asi que no tomes tu trabajo como una secta, mira otras soluciones que surgen, investigalas, pruebas y si se pueden ayudarte a mejorar aprendelas y usals, sino dejalas de lado.

  • busqueda de constantes retos. Retate a obtener una certificacion en un periodo de tiempo, retate a crear un proyecto que tu crees no puedes hacer, o a empezar esa startup que quieres. Al igual que el ejercicio si todo los dias haces la misma cantidad de esfuerzo no vas a mejorar, en el estudio es igual, retata a aprender cosas que no sabes, y veras como te ayudara a mejorar todas las aptitudes anteriores.

  • soporte al estres. hay un tema que siempre veo en muchos articulos o blogs cuando dan sugerencias de como mejorar, y es formar parte de grupos de programacion, o buscar alguien que te ayude, o buscar un instituto que te enseñe o buscar ayuda en general.

Un aspecto importante de cualquier programador es resolver problemas, que muchas veces son complicados, es parte del trabajo sobrellevar el estres. No siempre vamos a saberlo todo, y muchas veces nos costará aprender algo. es completamente normal.

de hecho la razon de que te mencione que lleves proyectos constantemente, es para que al retarte con desafios constantemente, aprendas a sobrellevar el estres de no saber, y entener que es un proceo por el que casi siempre se pasa.

Todos sabemos que llegamos al trabajo sabiendo que pasaremos horas pensando en problemas que no son tan faciles. eso es parte del trabajo. Porque si fuera facil para que nos pagarian.

Habitos Diarios

Finalmente hay algunos habitos que pueden ser beneficiosos y que pueden ayudarte a mejorar en muchos aspectos mas alla que solo progrmar,

Los primeros importantes son

  • Estudia todos los días un minimo de Horas diarias, en lo personal yo le dedico unas 3 horas minimo. No al mismo tema, pero si todos estan relacionados a codigo de cierta forma.
  • Intentar leer articulos, libros, o documentos frecuentemente. esto te ayudar a no solo estar pendiente que te expliquen algo siempre como en los videos, ademas que el saber
  • Practicar en Ingles. practicamente este el idioma de código, asi que todas las documentaciones y recursos tipicamente estan en este idioma, ademas que aprenderlo te puede ser beneficioso para poder obtener un trabajo remoto con un mejor salario, ademas de tener acceso a un mercado laboral muy grande.
  • Organizate y, aprende a tomar notas. parece obvio, pero programar no es todo lo que vamos a hacer en un solo dia, muchas veces necesitamos hacer otras tareas ajenas como limpiar tu casa, ir al medico, ir ala univesidad, hacer tareas, etc. bueno si quires disfrutar de tu trabajo ademas de tu vida, una buena forma es dividir en tiempo.

E incluso a modo de distraccion tambien puedes usar juegos que te entretegan o hacer que tu entretiniemiento no solo sea una perdida de tiempo

por ejemplo quizas jugar videojuegos que requiera cierta destreza, intentar leer libros de temas que te inspiren, o ejecutar proyectos a modo de prueba pueden ser formas que te pueden mantener activo sin ser necesariamente estresantes y que te mantendran activo

Conclusión

Por supuesto estas no son las unicas habilidades pero si serian en mi opinion un 80% de las que conlleva a mejorar como programador. Ahora ese otro 20% es lo que hablare en el siguiente video, que está mucho más relacionado a como ser mucho más productivo escribieno código, asi que nos vemos en el sigueinte video.

Recursos

Actualizado por ultima vez el

Estos son algunos puntos importantes para todos aquellos programadores que quieran mejorar sus habilidades y no saben en que invertir su tiempo para poder lograr esto

¿Quieres Compatir mi Contenido?

Publicado:hace 3 años

Actualizado:hace 2 años

;