Aunque nunca hayas trabajado con ella, seguro que has oído hablar de la programación funcional. Y cada día más, ya que parece que hay un hype con ella. Este paradigma de programación, que parecía haber sido olvidado por la gran masa de desarrolladores, lleva unos cuantos años resurgiendo.
Es cierto que han sido otros lenguajes imperativos, en especial los imperativos y orientados objetos, los que se han llevado la fama de ser más productivos y eficaces para un mayor número de tareas. Pero no todo el mundo piensa igual. Últimamente ha aparecido una corriente crítica, argumentando que la mayoría de las ventajas que este tipo de lenguajes proponen, quizá no sean tan definitivas. Si bien la POO siempre ha prometido modelar el mundo real y proporcionar código reutilizable, cuando adquirimos algo de experiencia nos damos cuenta que eso no es nada sencillo.
Así que no ha tardado en aparecer gente que piensa que es más fácil programar con un enfoque funcional, afirmando incluso, que se es mucho más productivo y que se reduce el número de bugs y errores.
Si los lenguajes funcionales son la solución a todos nuestros problemas (seguramente no), es algo que el tiempo dirá, pero mientras tanto podemos analizar qué opciones tenemos.
¿Por qué el resurgimiento de la programación funcional?
La programación funcional lleva muchos años entre nosotros, pero siempre se asociaba más a entornos académicos que a empresariales y productivos. Es algo que parece que empieza a cambiar y muchas empresas, algunas muy importantes, están apostando fuerte por este paradigma. ¿Por qué?
Una de las razones puede ser que las aplicaciones son cada vez más difíciles de ejecutar en una sola máquina. Cada vez es más necesario poder soportar grandes dosis de concurrencia y paralelismo. No obstante el hardware actual, nos proporciona unas capacidades de paralelismo nunca vistas, y la nube hace cada vez más sencillo (y barato) construir sistemas distribuidos en distintos servidores. Y claro, para tareas como estas, un lenguaje funcional puede desenvolverse como pez en el agua.
La programación funcional tiene conceptos muy interesantes, tanto que que muchos lenguajes no funcionales están poco a poco adoptándolos
Está claro también, que la programación funcional tiene conceptos muy interesantes, tanto que que muchos lenguajes no funcionales están poco a poco adoptándolos. Las últimas versiones de Java ya incluyen expresiones lambda, cosa ya incluida C# hace mucho tiempo. Cada versión de C# incluye más características funcionales y de hecho en su última versión, la 7, incluye el concepto funcional del pattern matching. Ruby, Python o Go, son otros lenguajes que incorporan algunas características funcionales.
Tampoco debemos olvidar JavaScript, que tiene muchos conceptos funcionales desde hace tiempo (funciones anónimas, funciones como miembros de primera clase etc.). Al ser uno de los lenguajes más populares, es fácil que estos conceptos lleguen cada vez a más programadores, haciendo que la revolución funcional llegue un poquito más lejos.
Pero esto no acaba aquí, ya que a los viejos rockeros funcionales, se están añadiendo muchos nuevos lenguajes, con muchas otras características modernas. Es el caso de Elixir, Clojure, Scala o Elm, por citar algunos.
¿Pero esto es ruído o es una tendencia de verdad?
A los programadores nos encanta estar a la última. Antes que aprender Cobol, seguramente prefiramos aprender algo más moderno (que no tiene porque ser mejor). Tanto nos gusta aprender, que muchas veces acabamos cayendo en el hype sin pararnos a pensar 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 muy lejos de los primeros puestos. Hay más datos que nos ayudan a corroborar este punto y si nos vamos a la famosa encuesta de Stack Overflow de 2017, los datos son parecidos. Los lenguajes funcionales no están ni de lejos entre los más populares. En el mundo laboral, pasa más o menos lo mismo. Podemos ver en Indeed que el número de empleos en lenguajes funcionales, es muy bajo comparado con el de otros lenguajes más populares como Java o C#.
Esto no quiere decir que debamos dejar de lado la programación funcional, simplemente que debemos ponerla en su contexto. Si queremos encontrar un trabajo como programador, es más fácil encontrar un trabajo utilizando un lenguaje no funcional. Pero si es cierto que numerosas startups, de esas que están cambiando las reglas del juego, apuestan cada vez más por ese paradigma. Así que quizá no sea descabellado empezar a invertir tiempo en aprender alguno de estos lenguajes. Y si no, al menos habremos aprendido mucho por el camino.
¿Qué opciones tengo si quiero aprender programación funcional?
Si queremos aprender programación funcional, a día de hoy tenemos muchísimas opciones. Para todos los gustos y para todos los sabores. Vamos algunos de ellos:
Haskell
Haskell es uno de esos lenguajes funcionales conocidos como puros. Esto quiere decir que no permite 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 logo) y debe su nombre a Haskell Brooks Curry, matemático estadounidense, que curiosamente da nombre a otro lenguaje de programación (Curry) y al concepto de currificación.
Si queréis probar Haskell, lo podéis hacer desde el mismo navegador.
Nuestro compañero Jose Juan, ya nos habló de Haskell por aquí.
Erlang/Elixir
La comunidad de Erlang está viviendo un resurgir, gracias a Elixir y es por ello que debemos tenerlo en cuenta. Erlang fue un lenguaje creado inicialmente para la gestión de centralitas telefónicas de Ericsson allá por 1986. Con esta premisa acabó siendo un lenguaje funcional, pensado para aplicaciones distribuidas y tolerantes a fallos. Erlang al igual que Elixir es un lenguaje de tipado dinámico.
Con el resurgir 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 totalmente compatible con él (de hecho se pueden utilizar librerías de Erlang en Elixir). De esta manera, Elixir puede aprovechar las características concurrentes de Erlang, con una sintaxis más cercana para muchos programadores. De hecho muchos programadores de Ruby están empezando a adoptar Elixir, dado su rendimiento. La llegada de programadores a Elixir, está haciendo que llegue savia nueva a Erlang, reforzando ambas comunidades.
Si queréis más información, en GenbetaDev, también hemos hablado de Elixir.
Scala
La máquina virtual de Java es una de las más avanzadas, y esto está haciendo que se generen muchos lenguajes nuevos en torno a ella. Scala es probablemente uno de los más famosos. Aunque Scala soporta todas las características típicas de la POO de Java, también posee muchas características funcionales como: funciones anónimas, funciones de orden superior, lazy evaluation, currificación, pattern matching, tuplas etc.
Obviamente Scala no se puede definir como lenguaje funcional puro (es más bien multiparadigma), pero aun siendo lenguaje orientado a objetos, se aleja de la programación imperativa.
El código de Scala es compatible con los programas ya existentes en Java, lo cual siempre es un plus.
Antonio Leiva ya entrevistó a los chicos de 47 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, por lo que parte de la idea de representar de igual forma código y datos. El tipado de Clojure, al igual que el de otros lenguajes funcionales como Elixir es dinámico. Y también como en otros lenguajes funcionales Clojure promueve la inmutabilidad de los datos. Clojure hace uso del concepto de identidad, que es algo así como una entidad lógica asociada a distintos valores a lo largo del tiempo.
Si queremos probar este lenguaje podemos hacerlo directamente desde el navegador
Si queremos sustituir nuestro JavaScript por un lenguaje funcional, podemos usar ClojureScript, que permite 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 inmutables, aunque podemos especificar que puedan mutar su estado. La sintaxis de F# se basa en la de OCaml, aunque con diferencias. Una de las curiosidades de F# es que es un lenguaje estático, en el que no hay que definir tipos, ya que estos son casi siempre inferidos por el compilador.
F# es multiparadigma, por lo que tiene toques de programación imperativa, como bucles while
y for
y también soporta programación orientada a objetos.
Este lenguaje se puede utilizar para una gran variedad de funciones, desde generar JavaScript (con Fable, hacer aplicaciones web, o aplicaciones para móviles con Xamarin.
Si queréis probar F# podéis hacerlo desde un navegador
Vale, hay muchos lenguajes funcionales, pero ¿por qué debo usarlos?
Aunque es cierto que los programadores vivimos muchas veces de las modas, también es cierto que una mala herramienta rara vez llega a ser popular. Así que si la programación funcional está recibiendo más atención será por algo. Estas son algunas de las supuestas ventajas que podemos obtener:
- El código tiende a ser más conciso y expresivo
- Que el estado sea inmutable, evita muchos errores ya que no hay efectos secundarios
- Que el estado sea inmutable, nos ayuda en sistemas concurrentes o paralelos
- Las funciones reciben parámetros y devuelven un resultado, por lo que son siempre previsibles (si son funciones puras).
- El testing tiende a ser más sencillo, ya que si escribimos funciones puras, los resultados son más previsibles.
De todas maneras, aunque esas ventajas no sean suficientes, aunque en nuestro día a día usemos otro tipo de lenguajes, es muy recomendable aprender otros paradigmas de programación. Nos abre la mente a ideas nuevas, y eso nos hace mejore programadores. Y es que a veces, enriquece mucho más aprender un lenguaje nuevo, que aprender más cosas del lenguaje que usamos todos los días.
En Genbeta Dev | Aterrizando en la programación funcional