Quel genre de projet développer avec un langage fonctionnel ?

Bonjour,

On entend souvent dire que la programmation fonctionnelle est une très bonne expérience pour un développeur.
Mais également qu’il ne la privilégierait pas pour de gros projets.

Dans quels cas la programmation fonctionnelle est-elle plus ou moins pertinente ?
N’est-ce qu’une question de goût ou de choix de la part d’un développeur ?

Alors, quel genre de projet développer avec un langage fonctionnel ?

3 « J'aime »

C’est très peu utilisé en entreprise, entre autre à cause du fait que cela peu souvent conduire à la production de code totalement illisible pour d’autres que le programmeur du code en question. C’est donc un handicap à la programmation en équipe, à la maintenabilité et à l’évolutivité et donc à sa pérennité, donc effectivement pas l’idéal pour un gros projet en équipe. D’après ce sondage 2014 c’est utilisé par moins de 2,5% des développeurs, et c’est en baisse car le même sondage en 2013 donnait 2,85%. Je pense que ça peu être cependant intéressant à voir dans un processus éducatif c’est une bonne gymnastique intellectuelle.

2 « J'aime »

La programmation fonctionnelle me parait intéressante dans le cadre de l’implémentation de micro services, pour traiter des événements asynchrones, ou bien faire des traitements de données.

Elle permet souvent de réduire la consommation en mémoire, de paralléliser facilement, et de simplifier les implémentations. Certains patterns de plus en plus utilisés sont issus de la programmation fonctionelle, comme MapReduce. Le code produit est facile à tester, car sans état.

Par contre, comme le dis @Masterdev, abuser de la programmation fonctionnelle peut rendre le code plus difficile à lire et à maintenir, et est clairement à éviter lorsqu’on a besoin de gérer des états. Dans ce cas, il vaut mieux utiliser la POO et créer des classes qui encapsulent les états (données) et les fonctions (méthodes).

Aujourd’hui, on assiste plutôt a une convergence des langages modernes, avec Java 8 qui supporte un peu plus la programmation fonctionnelle et JavaScript qui supporte (bientôt) la POO par classes (ES6)

Pour citer que quelques examples de frameworks :

NodeJS: On ne le présente plus.
Spark: Java 8 ouvre les possibilités de programmation fonctionnelle (Lamba, MapRedure, …), et Spark en est un bon exemple.
PlayFramework: Framework web écrit en scala, langage fonctionnel (ou pas, car très complet) sur la JVM.

1 « J'aime »

Tout d’abord je voudrais répondre à @Masterdev et @Toilal sur le fait que la programmation fonctionnel conduit souvent à du code totalement illisible par d’autre que le programmeur du code en question, je voudrait dire que le cas se présente aussi en OO ou l’on peut se retrouver avec des hiérarchies d’objet abhérante et puis c’est aussi une question d’habitude, surtout que les langages fonctionnels ont les même capacités de modularisation (polymorphisme, héritage, … ) que les langages orientés objets.

Ensuite pour répondre à la question initial, la majeur partie de notre codebase backend est écrit en Scala et donc forcément c’est utilisé pour des gros projets chez nous, après la programmation fonctionnel à plein d’avantage, comme une facilité à gérer la concurrence , la composition de fonction simple, pas de side effect, l’immutabilité. Après clairement la programmation fonctionnel est adapté à du traitement de donnée et à des systèmes à forte concurrence/parallélisme.

1 « J'aime »

Code illisible ? Selon quels critères ? Tous les langages de programmation ont des idiomes, des habitudes d’écriture du code, et tous les programmeurs correctement formés dans un langage donné sont supposés être habitués à ces idiomes. Je ne vois pas pourquoi du code écrit dans un langage fonctionnel serait illisible.

Est-ce qu’on pourrait privilégier l’avis de gens qui programment vraiment dans des langages fonctionnels, plutôt que de se taper les clichés habituels ? Merci.

1 « J'aime »

La question initiale est bizarre : quel genre de projet développerait-on dans un langage orienté objet ? Ça dépend du langage, non ? Pourquoi ne pas regarder les projets qui existent déjà dans différents langages fonctionnels (Scala, OCaml, Haskell, Lisp, Scheme, Erlang…) et se demander lesquels ont eu du succès, et pourquoi ?

La POO apporte un cadre structurant que la programmation fonctionnelle n’apporte pas, c’est tout ce que je voulais dire sur le sujet de la lisibilité. Si vous lisez bien, je n’ai pas écrit que faire du fonctionnel rends le code illisible. Mais ça peut le rendre. C’est pareil pour la POO, construire une architecture alambiquée à base de classes abstraites inutiles rends le code moins lisible.

Aussi, et surtout, on peut faire de la programmation fonctionnelle dans un cadre de POO, l’un n’empêche pas l’autre, les deux sont même plutôt complémentaires, et c’est l’orientation qu’a pris Java avec la version 8. Idem en Python, qui supporte très bien les deux paradigmes depuis très longtemps.

Et pour répondre à @unpoulet, les langages les plus populaires sont aussi les plus larges et couvrent en général plusieurs paradigmes et idiomes, donc je dirais que c’est plutôt une affaire de style et de façon de résoudre les problèmes plutôt que de langage.

J’aurai donc plutôt posé la question suivante “Quel genre de problème résoudre en programmation fonctionnelle ?”

L’inverse est tout aussi vrai. OCaml, avec son système de module et de foncteur (qui n’ont pas la même signification en C++) permettent tout autant de créer des programmes conséquent. Unison, Ocsigen, Coq ou encore Hack sont des programmes importants en OCaml.

OCaml, comme Scala mais dans une autre mesure, intègre l’OO. On peut dénoter que l’OO en OCaml est un peu marginal d’ailleurs, comme quoi le fonctionnel suffit à pas mal de problématique.

Pour ma part je n’ai jamais eu l’occasion de faire de gros projet avec mais j’ai fait pas mal de veille, par curiosité, et dans le cadre d’un benchmark pro également.
Pour la gymnastique intellectuelle, il y a cet excellent MOOC de Coursera sur Scala.

Pour répondre à la question, le framework Play! basé sur Scala est assez inspiré de Rails, Symfony, etc. On y retrouve le pattern MVC et certains réflexes de Rails.

Un projet web perso ou pro quelconque en Scala/Play! peut être totalement pertinent.
La question est plutôt sur les compétences des équipes et des recrutements futurs dans le cas d’un projet pro.

p.s. en parlant de Coursera, cet article explique pourquoi Coursera a choisi Scala et Play! plutôt que PHP.

Tout à fait, et on peut aussi utiliser Scala/Play! sans faire du programmation fonctionnelle du tout. Beaucoup d’utilisateurs de ce framework n’en font pas, pourtant l’outil est à disposition.

Human Coders - Le centre de formation recommandé par les développeur·se·s pour les développeur·se·s