La maña

Los desarrolladores actuales no necesitamos saber de algoritmos

Así como lo oyes, los desarrolladores actuales no necesitamos saber de algoritmos. ¿Para qué saber de algoritmos si ya está todo implementado?. Por favor, estamos en el 2018, solo necesitamos importar la biblioteca correcta o usar el framework que nos resuelve el problema, un if por aquí un for por allá y listo, sin ninguna gota de sudor y si necesitamos algo más específico podemos usar un servicio que nos brinde lo que queremos, por ejemplo algoritmia o googlear por algún módulo que podamos usar como este.

¡Espera un momento!

Creo que estamos de acuerdo con que todo mundo puede ser un programador, solo necesitamos tomar algún curso en algún lenguaje y a los pocos minutos ya estamos escribiendo nuestro primer Hola mundo, y más tarde, ya tenemos un script que nos automatiza las tediosas tareas que nos dejan en la escuela.

Sin embargo, hay una gran diferencia entre escribir programas como el del ejemplo anterior a desarrollar nuestra propia implementación de git. Ser un buen programador requiere tiempo, pasión y dedicación para así poder tener un amplio conocimiento y brindar soluciones realmente eficaces y eficientes.

Seguramente tú, al igual que yo y muchos otros más programadores hemos escrito soluciones a problemas innumerables veces y nos hemos topado con ese código que no nos gusta del todo, sabemos que soluciona nuestro problema pero de alguna manera no nos termina de convencer y pasamos tiempo en encontrar una manera mejor de hacer las cosas. A veces, el compañero de al lado nos dice “Oye, qué te parece si intentas hacerlo así…”, y derrepente te das cuenta que la perspectiva y experiencia de cada persona hace la diferencia en cómo puedes resolver un problema.

Imaginemos que un amigo te reta a escribir un programita porque sabe que eres un excelente programador y no lo defraudarías. Te dice que escribas un programa que calcule la potencia de un número N elevado a la potencia P, con la restricción que sólo puedes usar multiplicaciones y que le imprimas el resultado módulo 10,000 para evitar que el número sea tan grande que no lo puedas guardar.

El problema es muy fácil, por ejemplo si N=2 y P=3 basta con multiplicar “2 * 2 * 2”, una regla que aprendimos en la primaria desde niños, veamos la solución (estándar C).

El código anterior resuelve el problema, sin embargo tu amigo al verlo se percata de que a pesar de ser una solución no es la mejor, y te dice, que pruebes con los valores N=4 y P=1,000,000,000, cuando lo ejecutas con esos valores te das cuenta que tu programa tarda más de 2 segundos en darte el resultado. ¿Qué pasaría si ese código fuera una función que se invocara varias veces con los mismos valores que te dí? — dice tu amigo — , si se invocara 100 veces tardaría varios minutos en terminar de procesar todo, puesto que estaría haciendo 1,000,000,000 * 100 operaciones (sólo de calcular la potencia), si este pequeño código fuera una parte de algún programa que estés desarrollando sería un serio cuello de botella.

Si lo quisieras mejorar, — continua tu amigo — , debes recordar otras propiedades de la potencia. Por ejemplo si quisiéramos calcular 4⁸ podemos notar lo siguiente:

4⁸ = 4⁴ * 4⁴

4⁴ = 4² * 4²

4² = 4 * 4

Si te das cuenta, en vez de multiplicar 8 veces 4 puedes hacerlo en solo en 3 operaciones, y para resolver 4¹⁰⁰⁰⁰⁰⁰⁰⁰⁰ necesitas !menos de 30 operaciones¡, reduciendo considerablemente el tiempo de ejecución, además, seguro notarás que se convierte en una definición recursiva, veámoslo.

Te das cuenta cómo algo tan trivial se convierte en un serio problema si no es atacado de la forma correcta.

Quizás hasta este punto ya te hayas preguntado ¿De qué me sirve saber complejos algoritmos si he desarrollado muchas aplicaciones y jamás he usado cosas como esas?
Estoy de acuerdo, no todos los programadores nos enfrentamos en nuestro día a día con problemas que requieran un fuerte conocimiento sobre algoritmia, algunos solo se dedican a escribir aplicaciones donde la lógica es tan simple que al final lo más complejo es lidiar con validaciones para que tu sistema no falle con los datos de entrada o los flujos que toma para resolver y entregar una respuesta.

Los problemas y aplicaciones que se exigen allá afuera son tan variados que existe bastante desarrollo donde la algoritmia no está tan involucrada, pero al igual, la cantidad de desarrollo que requiere fuertes conocimientos de algoritmia es enorme, por ejemplo, para realizar la logística de vuelos aéreos, o realizar la planeación de las rutas de para el envío de sondas espaciales que duran años a una exactitud impresionante, o el entrenamiento de máquinas de aprendizaje para la detección de enfermedades, o la detección oportuna de posibles accidentes con sistemas embebidos en los automóviles que son capaces de reaccionar sin intervención alguna, o mejor aún, dejar a computadoras el trabajo de modelado y construcción de ASIC’s que ocupen el menor espacio posible (para reducir costes de producción) con la capacidad de ejecutar en ellos a nivel de hardware algoritmos (reconocimiento facial) de manera más eficiente para al final poder poner caritas de perritos en nuestras fotos.

Aunque no lo creas casi siempre puedes encontrar una forma de mejorar la solución de un problema y la algoritmia te da ese plus para hacer la diferencia y tomar decisiones más acertadas al momento de hacer un desarrollo, no por nada a muchas empresas aparte de tu expertis en lenguajes o frameworks les interesa demasiado tus habilidades de solución de problemas.

Hasta este punto solo queda decidir qué tipo de programadores queremos ser, y si decidimos ser buenos programadores debe quedarnos claro que jamás vamos a dejar de aprender y debemos tener pasión por ello.

¿Y cómo empiezo a mejorar mis habilidades de Algoritmia?

La literatura y recursos para aprender es enorme, solo falta que tengas la firme decisión de comenzar y si ya estás involucrado, mejorar aún más. Existen diversas plataformas donde puedes mejorar tus habilidades y conocimientos y algunas de ellas son:

TopCoder
Es una plataforma donde puedes competir con los mejores de todo el mundo,
además de ello, no solo cuenta con competencias de algoritmia sino abarca mucho más con jugosos premios en efectivo.

CodeForces: Otro de los grandes, desarrollado y mantenido por nuestros amigos rusos (Saratov Chernyshevsky State University), si lo que buscas es competencia seguro que aquí la encontrarás y bastante dura.

HackerRank
Es una plataforma donde programadores compiten resolviendo problemas de
algoritmia al igual que TopCoder, enfocado principalmente en prepararse para entrevistas y aplicar en empresas de enorme reputación.

CodeFights
Es similar a las anteriores solo que a diferencia no solo compites contra otras
personas, si no compites contra bots creados por empresas y si les ganas podrías ser considerado como candidato por las mejores Empresas de Silicon Valley.

Geeks For Geeks
Contiene un compendio de información acerca de algoritmos. También puedes practicar ahí resolviendo problemas propuestos y que más practicar en la sección de Interviews para aplicar a un entrevista en Google​, Amazon, Microsoft, ​y muchas otras más.

Tambíen hay muchos jueces en línea como la UVa Online Judge, Caribbean Online Judge, CodeChef donde puedes entrenar tus habilidades.

También inscríbete en concursos de algoritmia ya sea locales, nacionales o internacionales como el Concurso ​Organizado por Google​, CodeJam, con premios económicos de hasta $15,000 dólares, o también al Concurso de Facebook, ​Facebook HackerCup. Si aún eres estudiante Universitario puedes ingresar a los concursos organizados por la ACM-ICPC y viajar por el mundo para ir a la final y ganar una jugosa cantidad de dinero como premio, o si eres estudiante de primaria y secundaria puedes meterte a la Olimpiada Mexicana de Informática la iniciativa de México para fomentar y promover el interés por la Algoritmia y el desarrollo tecnológico de México.

No es tarde para comenzar y eso es un hecho, de aquí en adelante depende de tí y la única limitante son tus ganas de crecer y aprender.