¿Por qué es importante la programación competitiva?

Responder esta pregunta puede ser difícil, ya que no muchas personas están interesadas en el tema. Ya sea porque no lo conocen o porque lo ven como algo que puede consumir mucho tiempo sin realmente dar herramientas para el día a día en el área laboral. Y, así como existen estas dos razones, seguro hay millones más que podrían aparecer. Antes de leer este artículo, te recomendaría que leas el concepto de programación competitiva, solo en caso de que no estés familiarizado con este fascinante mundo.

No estoy hablando solo de leer rápido, también hablo de entender qué se está queriendo comunicar con el texto frente a ti, cómo encontrar ambigüedades, cómo entender un problema y aplicar la abstracción para eliminar cualquier detalle que no sea importante para la solución final. Esto es realmente importante en mi opinión, porque a veces puede haber requerimientos mal escritos, mal especificados o existir algunos de hasta 40 páginas de las cuales solo unas 10 contengan información valiosa. La habilidad de elegir las cosas que son realmente importantes y separarlas de lo demás es crucial para cualquier programador, especialmente cuando los requerimientos vienen de otra compañía, es decir de parte de un tercero que no sería tu empleador directo.

2.

Los algoritmos son lo que los programadores hacemos, pero hay muchísimos algoritmos y paradigmas acerca de los que muy probablemente jamás hayas escuchado o conozcas un poco sin saber bien de qué se tratan, a pesar de ser fascinantes. Desde conceptos como los “Algoritmos Voraces” y la “Programación Dinámica”, pasando por algoritmos sobre grafos como “El Algoritmo de Dijkstra” y “El Algoritmo de Ford-Fulkerson”, técnicas de “Divide y Vencerás” como la “Exponenciación Modular”, así como también utilizaciones de optimización de parejas como el “Máximo Grafo Bipartito” o, incluso, encontrar el árbol de recubrimiento mínimo, como el “Algoritmo de Prim”.

Y por supuesto no podemos pasar por alto estructuras de datos como los “Tries”, los “Árboles Binarios de Búsqueda Indexados” y los “Árboles de Segmento” por mencionar algunos.

Solo he nombrado algunas estructuras y algoritmos, pero la lista es casi interminable. Como programadores, conocerlos nos ayudará a entender cómo funcionan las cosas por detrás… qué otros métodos podemos utilizar para resolver problemas sin necesidad de usar la fuerza bruta y, como necesitamos adaptar un requerimiento a un algoritmo o a un conjunto de ellos, nos ayuda a abstraernos y elegir la mejor solución para el problema actual, sabiendo que cada algoritmo tiene ventajas y desventajas.

Además de resolver problemas, los programadores entendemos que las computadoras son máquinas con recursos finitos: tienen una cantidad de memoria limitada para trabajar y una determinada cantidad de instrucciones por segundo que el procesador puede ejecutar. En programación competitiva usualmente hay límites de tiempo de ejecución y de memoria bastante bajos: un problema tan simple como retornar el n-ésimo elemento de un arreglo, puede ser bastante retador si el límite de memoria disponible es bajo y un problema tan simple como encontrar pares de elementos, puede ser bastante complicado si los tiempos de ejecución son estrictos. Así que, en programación competitiva, y en general, debemos tener un entendimiento de la “notación Big O” para complejidad en tiempo y memoria, esto para poder entender cuando algún algoritmo va a ser muy lento o muy pesado para los límites que se están manejando. Esto nos puede ayudar mucho en el día a día de trabajo, ya que debemos optimizar el código constantemente. Por ejemplo: hacer que un programa corra lo más rápido dentro de sus posibilidades, consumiendo la menor cantidad de memoria posible.

Sí, conocer bien un lenguaje, un framework y otras cosas es muy importante. De hecho, puede ser llevado de la mano con todas las ventajas que hemos nombrado antes. Algunas compañías especialmente grandes, como Amazon o Google, toman mayor consideración a aquellas personas que pueden resolver estos problemas sin utilizar frameworks o librerías. Por ejemplo, el problema más común que piden resolver en las entrevistas de Amazon, es el del “BFS” y lo tenés que hacer desde cero ya que no te permiten usar una librería externa al lenguaje. Hay miles de lugares para practicar este tipo de situaciones, porque parece ser, cada vez más, un requerimiento importante para ingresar a trabajar en empresas grandes y con importante notoriedad.

Hay muchas más ventajas de aprender sobre este mundo y también hay algunas desventajas. No obstante, recomiendo muchísimo que si tienes algún interés empieces ya mismo a investigar y aprenderás cosas que ni te imaginabas que existían. ¡Gracias por leer! Espero volver a escribir pronto sobre algunos de los algoritmos que nombré.

Por Rodolfo Miquilarena, senior developer.

Turning good ideas into outstanding software.

Turning good ideas into outstanding software.