Au cours de mes quatre années à l'université, nous avons utilisé beaucoup de programmation fonctionnelle dans plusieurs langages de programmation fonctionnels. Mais j'ai également utilisé beaucoup de programmation orientée objet pour, et en fait j'utilise plus de langages orientés objet lorsque je fais mon propre petit projet pour préparer mon premier travail. Mais je souhaite souvent que je codais dans un langage de programmation fonctionnel lors de ces projets.
Cependant, lors de la recherche d'un emploi, il est très rare de voir un emploi où la connaissance d'un langage de programmation fonctionnel est requise.
Pourquoi les langages de programmation fonctionnels ne sont-ils pas davantage utilisés dans l'industrie? Il y a beaucoup de nouvelles sur les langages de programmation fonctionnels de nos jours, donc je me demande si la programmation fonctionnelle est en train de se répandre dans l'industrie maintenant?
Je dirais que l'une des raisons pour lesquelles la programmation fonctionnelle n'est pas plus courante est le manque de base de connaissances. D'après mon expérience, les entreprises sont très peu enclines à prendre des risques en termes de mise en œuvre de technologies qui ne sont pas le courant principal et préfèrent investir dans des cadres éprouvés (Java, c ++, c #). Ce n'est que lorsqu'il existe un besoin commercial (comme dans Ericsson) que de nouveaux paradigmes sont envisagés. Mais même dans le cas d'Ericsson, j'ai entendu dire que la direction exigeait l'utilisation de c ++ et que Joe Armstrong a été contraint de coder les appels erlang en c ++ !! Cela devrait montrer à quel point les entreprises hésitent à mettre en œuvre de nouvelles technologies!
J'étais professeur et, tout comme les programmeurs, les professeurs sont toujours à la recherche de la prochaine grande chose. Quand ils pensent en avoir trouvé un, ils en font un mouvement, et tout le monde s'entasse. Puisqu'ils prêchent aux étudiants qui pensent que les professeurs doivent être vraiment intelligents, sinon pourquoi seraient-ils professeurs, ils n'obtiennent aucune résistance.
La programmation fonctionnelle est un tel mouvement. Bien sûr, il y a beaucoup de belles questions intéressantes à étudier, et beaucoup d'articles de conférence intéressants à écrire. Ce n'est pas une idée particulièrement nouvelle, et vous pouvez le faire dans à peu près n'importe quel langage moderne, et les idées n'ont pas besoin d'être nouvelles pour être intéressantes. C'est aussi une bonne compétence à avoir.
Étant donné que, la programmation fonctionnelle n'est qu'une flèche à avoir dans votre carquois, pas la seule, tout comme OOP n'est pas la seule.
Mon bœuf avec le monde de l'informatique est le manque d'interaction pratique avec l'industrie pour déterminer ce qui fait vraiment sens dans le monde réel, à savoir le contrôle de la qualité. Si ce contrôle de la qualité était là, il pourrait y avoir un accent différent, sur la classification des problèmes et les gammes de solutions à ceux-ci, avec des compromis, plutôt que sur les derniers fourgons.
Parce que le plus gros problème du développement logiciel de nos jours est la capacité à gérer la complexité. Ce n'est pas l'objet de la plupart des langages de programmation fonctionnels. En tant que tel, les langues qui font en font une priorité (à savoir les langues les plus populaires OOP) ont tendance à voler certaines des fonctionnalités les plus cool qui sortent des plus académiques langages fonctionnels et ainsi rester au top.
La programmation fonctionnelle commence définitivement à faire son chemin - lentement mais sûrement.
Par exemple, la startup que je crée utilise un langage fonctionnel (Clojure) comme langage de développement principal pour les raisons suivantes:
Productivité - apprentissage FP est difficile, mais une fois que vous avez compris, c'est très difficile à battre en termes de puissance et d'expressivité. J'écris probablement environ 1/10ème du nombre de lignes pour implémenter une fonctionnalité donnée par rapport à ce que j'aurais eu besoin en C # ou Java
Fiabilité - les fonctions pures sont beaucoup plus faciles à raisonner et à tester que les objets avec état. Par conséquent, vous pouvez écrire de meilleurs tests et valider beaucoup plus facilement l'exactitude de votre code.
Concurrence - les langages fonctionnels mettent l'accent sur l'immuabilité, ce qui présente d'énormes avantages pour les applications simultanées que de devoir fonctionner efficacement sur plusieurs cœurs. Qu'on le veuille ou non, le fonctionnement sur plusieurs cœurs est l'avenir. Voir http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey pour une explication brillante de la raison pour laquelle c'est si important
Composabilité/modularité - les langages fonctionnels semblent se prêter à connecter des composants plus facilement que des systèmes complexes OO. Je reste n'ont pas trouvé toutes les raisons de cela, mais une partie vient du fait que vous n'avez pas toute la "complexité incidente" que les modèles OO traînent avec eux. La conversation on Radical Simplicity de Stuart Halloway explore ces idées de manière beaucoup plus approfondie.
[~ # ~] modifier [~ # ~] : En réponse au commentaire de Despertar, un exemple de la "complexité incidente" de OOP qui limitent la modularité sont les problèmes du clonage profond par rapport au clonage superficiel: vous ne pouvez pas composer des objets ensemble et les passer comme des structures composites sans une analyse très minutieuse de la sémantique de clonage et de mutation. est gérable, mais dans les systèmes complexes, il devient rapidement un problème important. Ce problème n'existera pas en premier lieu si vous comptez sur des structures de données fonctionnelles pures.
Hé, celui-ci a l'air frais. (Dig Dig Dig)
Je pense que la plupart des langages de programmation ont prospéré en ayant une "application de tueur" - quelque chose de convaincant qui était exclusif au langage (ou vu de cette façon). Cela ne veut pas dire que la totalité de l'adoption a été cette application, mais qu'elle a conduit le langage à une acceptation plus large.
Voici mon point de vue pas très précis de ce créneau qui a conduit à l'adoption de certaines des langues que nous avons aujourd'hui:
En dehors de cela, de nombreux langages propriétaires sont entrés dans la porte par le biais de puissantes organisations de vente (Oracle et, dans une moindre mesure, les langages de Microsoft), créant efficacement leur propre niche.
Une remarque très importante à propos de cette liste: la "niche" de la langue, comme l'indique l'application killer, devient de plus en plus précise au fil des décennies. Notez le dernier de la liste: le script de jeu , en particulier. Il devient de plus en plus difficile pour les langues d'attirer l'attention en raison de la liste des choses qui sont déjà assez bien faites par une autre langue.
Donc, tout langage fonctionnel doit vraiment décoller est une niche. En réalité, il n'y a pas encore d'énormes langages fonctionnels, mais il y en a beaucoup dans des niches plus petites:
Maintenant, le seul langage majeur que je pense avoir laissé de côté dans cette discussion est Python. Python a fait quelque chose de très intéressant; il a réussi sans apparaître comme le gagnant dans un créneau majeur. Cela pourrait signifie que je me trompe catégoriquement pour afficher la popularité de la langue de cette façon. Cela pourrait également signifier qu'une langue suffisamment bonne peut devenir populaire sans une application géniale pour conduire l'adoption et l'acceptation, mais c'est très difficile et peut prendre très longtemps (Perl a une histoire similaire, mais est arrivée quelques années plus tôt et est maintenant moins utilisée).
De cela, je peux dire quels langages fonctionnels je pense sont en hausse:
Si vous me demandiez où chercher les langages fonctionnels populaires, je dirais que vous êtes à la recherche d'un langage fonctionnel avec un développement cloud clé en main (à la Heroku ou GAE) ou un développement d'applications mobiles clé en main.
Pour la même raison que LISP n'a jamais vraiment compris (que les guerres de flammes commencent!). La programmation fonctionnelle est un paradigme très étranger par rapport à la programmation impérative et orientée objet. Si, comme la grande majorité des étudiants CS, vous avez commencé avec C et avez progressé vers C++/Java, vous avez tendance à ne pas vouloir apprendre à penser d'une manière complètement orthogonale à la façon dont vous pensez normalement.
Prenons les entreprises et la programmation.
Certaines entreprises utilisent leur logiciel comme un atout stratégique. Ce n'est pas typique. Pour la plupart des entreprises, l'informatique est quelque chose qui soutient les vraies affaires de l'entreprise. C'est une dépense nécessaire. Ils sont conservateurs car ils savent que pour $ X, ils peuvent obtenir l'informatique dont ils ont besoin, tandis que s'ils passent à quelque chose de différent, ils économiseront moins de $ X si tout va bien et perdront très gros si tout va mal.
De plus, dans les entreprises, la chose la moins chère à faire est généralement ce qu'ils ont fait hier. Le changement, cependant, souhaitable, coûte cher. Si une entreprise devait passer, par exemple, d'une solution C # /. NET, même à F #, elle aurait des problèmes. Leurs programmeurs (qui ne sont probablement pas les programmeurs les plus pointus du monde) devraient apprendre une nouvelle langue, maîtriser les deux et les utiliser fréquemment. Il y aurait des routines écrites dans les deux pendant longtemps. S'ils devaient passer à quelque chose comme Haskell, ou s'ils utilisaient C++/MFC en premier lieu, ils changeraient beaucoup plus, et ce serait beaucoup plus cher.
En outre, il y aura une offre de programmeurs C # et un support Microsoft continu pendant longtemps. On peut compter sur les pratiques informatiques actuelles. Il n'y a pas le même niveau de soutien institutionnel ou d'assurance de la disponibilité continue des programmeurs.
Par conséquent, pour la plupart des entreprises, une modification de la programmation fonctionnelle serait coûteuse à l'avance et ne sera rentabilisée que si la réduction des coûts informatiques est suffisante à long terme, sauf que le long terme est potentiellement incertain.
Vous écrivez déjà du code dans un style fonctionnel, mais vous ne le savez pas.
Lorsque vous devez effectuer des tests unitaires pour votre code, vous avez tendance à écrire des fonctions testables, qui ne créent pas d'effets secondaires et n'en dépendent pas, et renvoie toujours le même résultat sur les mêmes arguments (appelées fonctions pures). C'est le principal avantage des programmes fonctionnels.
Je pense que les langages fonctionnels sont trop limitatifs. Ainsi, au lieu de remplacer les langages impératifs par des langages fonctionnels, les langages impératifs obtiendront des fonctionnalités fonctionnelles. De nos jours, presque tous les langages de programmation ont des fermetures et des lambdas.
Je pense qu'il n'y a qu'une seule vraie réponse à votre question. Vous pouvez entrer dans de nombreuses raisons connexes pour lesquelles cette réponse est le cas, mais ce sont des questions différentes.
C'est ici:
Est-ce que ça se fait sentir? Tout dépend si les personnes qui ont confiance en l'utilisation des langages fonctionnels deviennent architectes et choisissent de l'utiliser pour les projets sur lesquels ils travaillent.
Le vrai problème est l'état.
Les langages fonctionnels n'ont pas d'état global. La plupart des problèmes industriels nécessitent un état à grande échelle (comment représenter un grand livre ou un ensemble de transactions) même si certaines fonctions à petite échelle ne le nécessitent pas réellement (traitement d'un grand livre).
Mais nous exécutons du code sur des machines d'architecture Von-Neuman qui sont intrinsèquement pleines d'état. Nous ne nous sommes donc pas réellement débarrassés de l'état, les langages fonctionnels cachent simplement la complexité de l'état au développeur. Cela signifie que le langage/compilateur doit gérer l'état en coulisses et le gérer.
Ainsi, même si les langages fonctionnels n'ont pas d'état global, leurs informations d'état sont transmises en tant que paramètres et résultats.
Alors la question devient alors la langue peut-elle gérer efficacement l'État derrière le sens? Surtout lorsque la taille des données dépasse de loin la taille de l'architecture.
Le système d'exploitation a beaucoup aidé au cours des deux dernières années dans la visualisation de l'espace d'adressage afin que les applications n'aient officiellement pas à s'en soucier. Mais les applications qui ne s'inquiètent pas tombent dans le piège de la destruction du matériel lorsque la pression de la mémoire devient intense (la suppression du matériel ralentira vos processus à une analyse).
Comme le programmeur n'a pas de contrôle direct sur l'état dans le langage fonctionnel, ils doivent s'appuyer sur le compilateur pour gérer cela et je n'ai pas vu de langages fonctionnels qui gèrent bien cela.
Du côté inverse de la médaille, le programmeur à état complet a un contrôle direct sur l'état et peut ainsi compenser les faibles conditions de mémoire. Bien que je n'aie pas vu beaucoup de programmeurs assez intelligents pour le faire.
L'industrie a beaucoup de programmeurs inefficaces à plein régime.
Mais il est facile de mesurer les améliorations de ces programmes au fil du temps. Vous jetez une équipe de développeurs au problème qu'ils peuvent améliorer le code en améliorant la façon dont le programme gère l'état.
Pour les programmes fonctionnels, les améliorations sont plus difficiles à mesurer car vous devez améliorer les outils qui amélioreront les programmes (nous examinons simplement comment les applications gèrent efficacement l'état sous-jacent ici, pas l'amélioration globale du programme ).
Donc, pour l'industrie, je pense que cela se résume à la capacité de mesurer les améliorations du code.
Il y a beaucoup de programmeurs stat-full disponibles à la location. Les programmeurs fonctionnels sont difficiles à trouver. Ainsi, votre modèle d'offre et de demande de base entrerait en vigueur si l'industrie passait à une programmation de style fonctionnel et ce n'est pas quelque chose qu'ils veulent faire (les programmeurs sont assez chers comme ça).