El resurgir de la programación funcional

Si bien jamás hayas trabajado con ella, seguro que has oído charlar de la programación funcional. Y cada días un poco más, puesto que semeja que hay un hype con ella. Este paradigma de programación, que parecía haber sido olvidado por la enorme masa de desarrolladores, lleva varios años reapareciendo.

Es verdad que han sido otros lenguajes imperativos, especialmente los imperativos y orientados objetos, los que se han llevado la fama de ser más productivos y eficientes para un mayor número de labores. Mas no todo el planeta piensa igual. Recientemente ha aparecido una corriente crítica, argumentando que la mayor parte de los beneficios que este género de lenguajes plantean, tal vez no sean tan terminantes. Aunque la POO siempre y en toda circunstancia ha prometido modelar el planeta real y suministrar código reutilizable, cuando adquirimos algo de experiencia nos damos cuenta que eso no es nada fácil.

Con lo que no ha tardado en aparecer gente que considera que es más simple programar con un enfoque funcional, aseverando aun, que se es considerablemente más productivo y que se reduce el número de bugs y fallos.

Si los lenguajes funcionales son la solución a nuestros inconvenientes (probablemente no), es una cosa que el tiempo afirmará, mas mientras podemos examinar qué opciones tenemos.

¿Por qué razón el renacer de la programación funcional?

La programación funcional lleva muchos años entre nosotros, mas siempre y en toda circunstancia se asociaba más a ambientes académicos que a empresariales y productivos. Es una cosa que semeja que comienza a mudar y muchas empresas, ciertas fundamentales, están apostando fuerte por este paradigma. ¿Por qué razón?

Una de las razones es posible que las aplicaciones cada vez son más bastante difíciles de ejecutar en una máquina. Es cada vez más preciso poder aguantar grandes dosis de concurrencia y paralelismo. Sin embargo el hardware actual, nos da unas capacidades de paralelismo jamás vistas, y la nube hace poco a poco más fácil (y económico) edificar sistemas distribuidos en diferentes servidores. Y claro, para labores como estas, un lenguaje funcional puede desenvolverse como pez en el agua.

La programación funcional tiene conceptos bien interesantes, tanto que que muchos lenguajes no funcionales están poquito a poco adoptándolos

Está claro asimismo, que la programación funcional tiene conceptos bien interesantes, tanto que que muchos lenguajes no funcionales están poquito a poco adoptándolos. Las últimas versiones de Java ya incluyen expresiones lambda, cosa ya incluida C# hace bastante tiempo. Cada versión de C# incluye más peculiaridades funcionales y en verdad en su última versión, la siete, incluye el término funcional del pattern matching. Ruby, Python o bien Go, son otros lenguajes que incorporan ciertas peculiaridades funcionales.

Tampoco debemos olvidar JavaScript, que tiene muchos conceptos funcionales desde hace ya tiempo (funciones anónimas, funciones como miembros de primera clase etcétera). Siendo uno de los lenguajes más populares, es simple que estos conceptos lleguen cada vez a más programadores, haciendo que la revolución funcional llegue un poco más lejos.

Mas esto no termina acá, puesto que a los viejos rockeros funcionales, se están agregando muchos nuevos lenguajes, con otras muchas peculiaridades modernas. Es el caso de Elixir, Clojure, Scala o bien Elm, por refererir ciertos.

¿Mas esto es ruido o bien es una tendencia de veras?

A los programadores nos chifla estar a la última. Ya antes que aprender Cobol, probablemente prefiramos aprender algo más moderno (que no tiene pues ser mejor). Tanto nos agrada aprender, que muy frecuentemente terminamos cayendo en el hype sin pararnos a meditar en las consecuencias.

Pensando en los fríos datos, y mirando el índice Tiobe del último mes, podemos ver que los lenguajes funcionales están lejísimos de los primeros puestos. Hay más datos que nos asisten a confirmar este punto y si nos marchamos a la conocida encuesta de Stack Overflow de dos mil diecisiete, los datos son similares. Los lenguajes funcionales no están ni de lejos entre los más populares. En el planeta laboral, pasa aproximadamente lo mismo. Podemos ver en Indeed que el número de trabajos en lenguajes funcionales, es bajísimo equiparado con el de otros lenguajes más populares como Java o bien C#.

Esto no desea decir que debamos dejar a un lado la programación funcional, sencillamente que debemos ponerla en su contexto. Si deseamos localizar un trabajo como programador, es más simple localizar un trabajo usando un lenguaje no funcional. Mas si es verdad que numerosas start-ups, de esas que cambian las reglas del juego, apuestan poco a poco más por ese paradigma. Conque quizás no sea insensato comenzar a dedicar tiempo en aprender alguno de estos lenguajes. Y si no, por lo menos vamos a haber aprendido mucho por el camino.

¿Qué opciones tengo si deseo aprender programación funcional?

Si deseamos aprender programación funcional, hoy tenemos muchas opciones. Para todos y cada uno de los gustos y para todos y cada uno de los sabores. Vamos ciertos de ellos:

Haskell

Haskell es uno de esos lenguajes funcionales conocidos como puros. Esto desea decir que no deja mutar los datos y que las operaciones se tratan como la evaluación de funciones matemáticas.

Haskell está basado en el cálculo lambda (de ahí su logotipo) y debe su nombre a Haskell Brooks Curry, matemático estadounidense, que curiosamente da nombre a otro lenguaje de programación (Curry) y al término de currificación.

Si deseáis probar Haskell, lo podéis hacer desde exactamente el mismo navegador.

Nuestro compañero Jose Juan, ya nos charló de Haskell por acá.

Erlang/Elixir

La comunidad de Erlang vive un reaparecer, merced a Elixir y es por este motivo que debemos tenerlo en consideración. Erlang fue un lenguaje creado en un inicio para la administración de centrales telefónicas de Ericsson allí por mil novecientos ochenta y seis. Con esta premisa terminó siendo un lenguaje funcional, concebido para aplicaciones distribuidas y tolerantes a fallos. Erlang como Elixir es un lenguaje de tipado activo.

Con el reaparecer de la programación funcional, José Valim creó Elixir. Un lenguaje con una sintaxis basada en Ruby, que se ejecuta sobre la máquina virtual de Erlang y es absolutamente compatible con él (en verdad se pueden usar librerías de Erlang en Elixir). Así, Elixir puede aprovechar las peculiaridades concurrentes de Erlang, con una sintaxis más próxima para muchos programadores. En verdad muchos programadores de Ruby están comenzando a adoptar Elixir, dado su desempeño. La llegada de programadores a Elixir, hace que llegue savia nueva a Erlang, fortaleciendo las dos comunidades.

Si deseáis más información, en turincon.netDev, asimismo hemos hablado de Elixir.

Scala

La máquina virtual de Java es una de las más avanzadas, y esto hace que se produzcan muchos lenguajes nuevos en torno a ella. Scala es seguramente uno de los más conocidos. Si bien Scala aguanta todas y cada una de las peculiaridades propias de la POO de Java, asimismo tiene muchas peculiaridades funcionales como: funciones anónimas, funciones de orden superior, lazy evaluation, currificación, pattern matching, tuplas etcétera

Evidentemente Scala no se puede acotar como lenguaje funcional puro (es más bien multiparadigma), mas incluso siendo lenguaje orientado a objetos, se distancia de la programación imperativa.

El código de Scala es compatible con los programas ya existentes en Java, lo que siempre y en toda circunstancia es un plus.

Antonio Leiva ya entrevistó a los chicos de cuarenta y siete Degrees, que nos contaron su experiencia con Scala.

Clojure

Otro lenguaje funcional que corre sobre la máquina virtual de Java es Clojure. Clojure es un dialecto de Lisp, con lo que una parte de la idea de representar de igual forma código y datos. El tipado de Clojure, como el de otros lenguajes funcionales como Elixir es activo. Y asimismo como en otros lenguajes funcionales Clojure fomenta la imperturbabilidad de los datos. Clojure utiliza el término de identidad, que es algo como una entidad lógica asociada a diferentes valores a lo largo del tiempo.

Si deseamos probar este lenguaje podemos hacerlo de forma directa desde el navegador

Si deseamos reemplazar nuestro JavaScript por un lenguaje funcional, podemos utilizar ClojureScript, que deja crear código de Clojure que se compila a JavaScript y es compatible con los navegadores web.

F#

F# es el lenguaje funcional de Microsoft, compatible con el stack de .NET. Por defecto los datos son inalterables, si bien podemos detallar que puedan mutar su estado. La sintaxis de F# se fundamenta en la de OCaml, si bien con diferencias. Una de las curiosidades de F# es que es un lenguaje estático, en el que no hay que acotar tipos, puesto que estos son prácticamente siempre y en toda circunstancia colegidos por el compilador.

F# es multiparadigma, con lo que tiene toques de programación imperativa, como bucles while y for y asimismo aguanta programación orientada a objetos.

Este lenguaje se puede usar para una enorme pluralidad de funciones, desde producir JavaScript (con Fable, hacer aplicaciones web, o bien aplicaciones para móviles con Xamarin.

Si deseáis probar F# podéis hacerlo desde un navegador

Vale, existen muchos lenguajes funcionales, mas ¿por qué razón debo utilizarlos?

Si bien es verdad que los programadores vivimos muy frecuentemente de las tendencias, asimismo es verdad que una mala herramienta raras veces llega a ser popular. Conque si la programación funcional recibe más atención va a ser por algo. Estas son ciertas supuestas ventajas que podemos obtener:

El código tiende a ser más brev y expresivo
Que el estado sea inalterable, evita muchos fallos en tanto que no hay efectos secundarios
Que el estado sea inalterable, nos ayuda en sistemas concurrentes o bien paralelos
Las funciones reciben factores y devuelven un resultado, con lo que son siempre y en todo momento previsibles (si son funciones puras).
El testing tiende a ser más fácil, en tanto que si escribimos funciones puras, los resultados son más previsibles.
De todas y cada una formas, si bien esas ventajas no sean suficientes, si bien en nuestro cada día utilicemos otro género de lenguajes, es muy aconsejable aprender otros paradigmas de programación. Nos abre la psique a ideas nuevas, y eso nos hace mejore programadores. Y es que en ocasiones, enriquece considerablemente más aprender un lenguaje nuevo, que aprender más cosas del lenguaje que empleamos todos y cada uno de los días.

En turincon.net | Aterrizando en la programación funcional