Durante meus quatro anos na universidade, temos usado muita programação funcional em várias linguagens de programação funcional. Mas também usei muita programação orientada a objetos e, de fato, uso mais as linguagens orientadas a objetos ao fazer meu pequeno projeto para me preparar para o meu primeiro trabalho. Mas, muitas vezes, desejo codificar uma linguagem de programação funcional ao executar esses projetos.
No entanto, ao procurar um emprego, é muito raro ver um trabalho em que o conhecimento de uma linguagem de programação funcional seja necessário.
Por que as linguagens de programação funcional não são mais usadas no setor? Atualmente, existem muitas novidades sobre linguagens de programação funcional, então me pergunto se a programação funcional está pegando no setor agora?
fonte
Respostas:
Eu diria que uma das razões pelas quais a programação funcional não é mais prevalente é a falta de base de conhecimento. Minha experiência é que as empresas são muito avessas ao risco em termos de implementação de tecnologias que não são o fluxo principal e preferem investir em estruturas testadas e verdadeiras (java, c ++, c #). É somente quando há uma necessidade comercial (como na Ericsson) que novos paradigmas são considerados. Mas mesmo no caso da Ericsson, ouvi dizer que a gerência exigia que o c ++ fosse usado e Joe Armstrong foi obrigado a codificar chamadas erlang em c ++ !! Isso deve mostrar como as empresas estão relutantes em implementar novas tecnologias!
fonte
Eu era professor e, assim como programadores, os professores estão sempre procurando a próxima grande coisa. Quando eles acham que encontraram um, eles o transformam em uma onda e todos se empilham. Como eles estão pregando para estudantes que pensam que os professores devem ser realmente inteligentes, caso contrário, por que eles seriam professores, eles não têm resistência.
A programação funcional é um movimento. Certamente, há muitas perguntas interessantes a serem investigadas e muitos artigos de conferências interessantes para escrever. Não é uma idéia particularmente nova, e você pode fazê-lo em praticamente qualquer linguagem moderna, e as idéias não precisam ser novas para serem interessantes. Também é uma boa habilidade para ter.
Dado isso, a programação funcional é apenas uma seta para ter em sua aljava, não a única, assim como o OOP não é a única.
Minha discussão com a academia de ciência da computação é a falta de interação prática com a indústria para determinar o que realmente faz sentido no mundo real, ou seja, controle de qualidade. Se esse controle de qualidade estivesse lá, poderia haver uma ênfase diferente, na classificação de problemas e na variedade de soluções para eles, com vantagens e desvantagens, em vez de apenas as últimas bandwagons.
fonte
Porque o maior problema no desenvolvimento de software atualmente é a capacidade de gerenciar a complexidade. Este não é o foco da maioria das linguagens de programação funcionais. Como tal, as línguas que fazer fazer que uma prioridade (ou seja, as linguagens OOP mais populares) tendem a roubar algumas das características mais frias que saem das linguagens funcionais mais acadêmicos e assim permanecer no topo.
fonte
A programação funcional está definitivamente começando a pegar - lenta mas seguramente.
Por exemplo, a inicialização que estou construindo está usando uma linguagem funcional (Clojure) como a principal linguagem de desenvolvimento pelos seguintes motivos:
Produtividade - aprender FP é difícil, mas quando você pega o jeito, é muito difícil vencer em termos de poder e expressividade. Provavelmente, estou escrevendo cerca de 1/10 do número de linhas para implementar qualquer parte da funcionalidade em comparação com o que eu precisaria em C # ou Java
Confiabilidade - funções puras são muito mais fáceis de raciocinar e testar do que objetos com estado. Portanto, você pode escrever testes melhores e validar a correção do seu código com muito mais facilidade.
Simultaneidade - linguagens funcionais enfatizam a imutabilidade, que traz enormes benefícios para aplicativos simultâneos do que a necessidade de executar efetivamente em vários núcleos. E goste ou não, rodar em múltiplos núcleos é o futuro. Consulte http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para obter uma explicação brilhante de por que isso é tão importante
Compossibilidade / modularidade - linguagens funcionais parecem prestar-se a conectar componentes mais facilmente do que sistemas OO complexos. Ainda não descobri todas as razões para isso, mas parte disso decorre do fato de você não ter toda a "complexidade incidental" que os modelos OO arrastam com eles. A palestra sobre Radical Simplicity de Stuart Halloway explora essas idéias com muito mais profundidade.
EDIT : Em resposta ao comentário de Despertar, um exemplo da "complexidade incidental" dos sistemas OOP que limita a modularidade são os problemas de clonagem profunda vs. clonagem superficial: você não pode compor objetos juntos e passá-los como estruturas compostas sem muito análise cuidadosa da semântica de clonagem e mutação. Em casos pequenos, isso é gerenciável, mas em sistemas complexos, rapidamente se torna um problema significativo. Esse problema não existirá em primeiro lugar se você confiar em estruturas de dados funcionais puras.
fonte
Falta de aplicativo matador
Ei, este aqui parece novo. (dig dig dig)
Eu acho que a maioria das linguagens de programação prosperou com um "aplicativo matador" - algo atraente que era exclusivo da linguagem (ou visto dessa maneira). Isso não quer dizer que toda a aceitação tenha sido essa aplicação, mas que levou o idioma a uma aceitação maior.
Aqui está minha visão não muito precisa de qual nicho impulsionou a adoção de alguns dos idiomas que temos hoje:
Além disso, muitas linguagens proprietárias chegaram às portas através de poderosas organizações de vendas (Oracle e, em menor grau, as linguagens da Microsoft), criando efetivamente seu próprio nicho.
Uma observação muito importante sobre essa lista: o "nicho" do idioma, conforme indicado pelo aplicativo matador, fica cada vez mais específico com o passar das décadas. Observe o último na lista: Script de jogo , especificamente. Está ficando cada vez mais difícil que os idiomas obtenham atenção por causa da lista de coisas que já são bem feitas por outro idioma.
Então, o que qualquer linguagem funcional realmente precisa decolar é um nicho. Na realidade, ainda não existem grandes linguagens funcionais, mas há muito em nichos menores:
Agora, a única linguagem importante que sinto que deixei de fora dessa discussão é o Python. Python fez algo muito interessante; conseguiu, sem parecer ser o vencedor em qualquer nicho importante. Isso pode significar que eu estou completamente errado ao visualizar a popularidade do idioma dessa maneira. Também pode significar que um idioma bom o suficiente pode se tornar popular sem um aplicativo matador para impulsionar a adoção e a aceitação, mas é muito difícil e pode demorar muito tempo. (Perl tem uma história semelhante, mas veio alguns anos antes e agora tem menos aceitação.)
A partir disso, posso dizer quais linguagens funcionais estão em ascensão:
Se você me perguntasse onde procurar em seguida por linguagens funcionais populares, eu diria que está procurando uma linguagem funcional com desenvolvimento de nuvem chave na mão (à la Heroku ou GAE) ou desenvolvimento de aplicativo móvel chave na mão.
fonte
Pela mesma razão que Lisp nunca conseguiu entender (que comecem as guerras de fogo!). A programação funcional é um paradigma muito estranho comparado à programação imperativa e orientada a objetos. Se, como a grande maioria dos estudantes de CS, você começou com C e progrediu para C ++ / Java, não deseja aprender a pensar de uma maneira que é completamente ortogonal à maneira como você normalmente pensa.
fonte
Vamos considerar negócios e programação.
Existem empresas que usam seu software como um ativo estratégico. Isso não é típico. Para a maioria das empresas, a TI é algo que suporta os negócios reais da empresa. É uma despesa necessária. Eles são conservadores porque sabem que por US $ X podem obter a TI de que precisam, enquanto que, se mudarem para algo diferente, economizarão menos de US $ X se tudo correr bem e perderão muito se tudo correr mal.
Além disso, nas empresas, a coisa mais barata a fazer é normalmente o que fizeram ontem. Mudança, no entanto, desejável, é cara. Se uma empresa mudasse, digamos, de uma solução C # / .NET, mesmo para F #, ela teria problemas. Seus programadores (que provavelmente não são os programadores mais perspicazes por aí) teriam que aprender um novo idioma, ser proficientes em ambos e usá-los com frequência. Haveria rotinas escritas em ambos por um longo tempo. Se eles mudassem para algo como Haskell, ou se usassem C ++ / MFC, eles estariam mudando muito mais, e isso seria muito mais caro.
Além disso, haverá um suprimento de programadores em C # e o suporte contínuo da Microsoft por muito tempo. As práticas atuais de TI podem ser contadas. Não existe o mesmo nível de suporte institucional ou garantia de disponibilidade contínua de programadores.
Portanto, para a maioria das empresas, fazer uma alteração na programação funcional seria caro antecipadamente e só se pagará se a redução nos custos de TI for suficiente a longo prazo, exceto que o longo prazo é potencialmente duvidoso.
fonte
Você já escreve código em estilo funcional, mas não o conhece.
Quando você é obrigado a fazer testes de unidade para seu código, costuma escrever funções testáveis, que não criam ou dependem de efeitos colaterais, e sempre retorna o mesmo resultado nos mesmos argumentos (as chamadas funções puras). Essa é a principal vantagem dos programas funcionais.
Eu acho que linguagens funcionais são muito limitantes. Portanto, em vez de substituir linguagens imperativas por funcionais, as linguagens imperativas terão recursos funcionais. Hoje em dia quase toda linguagem de programação possui encerramentos e lambdas.
fonte
Eu acredito que há apenas uma resposta real para sua pergunta. Você pode se deparar com vários motivos relacionados a essa resposta, mas essas são perguntas diferentes.
Aqui está:
Está pegando? Tudo isso depende se as pessoas que confiam no uso de linguagens funcionais estão se tornando arquitetas e optando por usá-las nos projetos em que trabalham.
fonte
O verdadeiro problema é o estado.
Linguagens funcionais não têm estado global. A maioria dos problemas industriais exige estado em grande escala (como você representa um razão ou um conjunto de transações), mesmo que algumas funções em pequena escala não o exijam (processando um razão).
Mas estamos executando código em máquinas de arquitetura Von-Neuman que são inerentemente cheias de estado. Portanto, na verdade, não nos livramos do estado, as linguagens funcionais apenas escondem a complexidade do estado do desenvolvedor. Isso significa que o idioma / compilador precisa lidar com o estado nos bastidores e gerenciá-lo.
Portanto, embora as linguagens funcionais não tenham estado global, suas informações de estado são passadas como parâmetros e resultado.
Olhando para ele do lado do hardware
O sistema operacional ajudou muito nos últimos anos na visualização do espaço de endereço, para que os aplicativos não precisem se preocupar oficialmente com isso. Mas os aplicativos que não se preocupam caem na armadilha de debulhar o hardware quando a pressão da memória se torna intensa (o hardware debilitante atrasará seus processos).
Como o programador não tem controle direto sobre o estado na linguagem funcional, ele deve contar com o compilador para lidar com isso, e eu não vi linguagens funcionais que lidem bem com isso.
No lado oposto da moeda, o programador de estado completo tem controle direto sobre o estado e, assim, pode compensar as condições de pouca memória. Embora eu não tenha visto muitos programadores que são realmente inteligentes o suficiente para fazê-lo.
Olhando do lado da indústria:
A indústria possui muitos programadores ineficientes em todo o estado.
Mas é fácil medir melhorias nesses programas ao longo do tempo. Você coloca uma equipe de desenvolvedores no problema de que eles podem melhorar o código, melhorando a maneira como o programa lida com o estado.
Para programas funcionais, as melhorias são mais difíceis de serem mensuradas, pois você precisa melhorar as ferramentas que os aprimorarão (estamos apenas olhando como os aplicativos lidam com o estado subjacente de forma eficiente aqui, não a melhoria geral do programa).
Então, para a indústria, acho que tudo se resume à capacidade de medir melhorias no código.
Do ponto de vista da contratação
Existem muitos programadores completos disponíveis para contratação. Programadores funcionais são difíceis de encontrar. Portanto, seu modelo básico de oferta e demanda entraria em ação se a indústria mudasse para a programação de estilo funcional e isso não é algo que eles querem que aconteça (os programadores são caros o suficiente).
fonte
Esta questão tem premissa ligeiramente errada. Pelas seguintes razões:
fonte
Porque é mais difícil depurar FP.
fonte