Esta é uma longa história, mas tentarei resumir da melhor maneira possível. Somos uma loja .NET que cria software para diversos tipos de fundos. Por exemplo, escrevemos software de gerenciamento de reclamações de saúde, software de gerenciamento de pensão, software 401 (k) e algumas outras coisas do tipo financeiro.
Agora estamos entrando em um novo domínio: tipo de trabalho com derivadas e análises quantitativas, o que parece muito empolgante. Isso é algo que vai acontecer nos próximos 8 a 12 meses.
Agora, eu aprendi alguma programação funcional por conta própria, principalmente apenas olhares superficiais para várias linguagens através deste livro, mas nunca me aprofundou muito nela. Agora, como somos uma loja .NET, eu estava pensando que o F # poderia ser uma boa escolha, porque poderíamos potencialmente aproveitar algumas bibliotecas .NET e, possivelmente, o conhecimento existente.
Minha pergunta é: por onde começar? Estou tendo um tempo extremamente difícil tentando descobrir se devo ir com Haskell, Erlang, Scala, F #, etc. Todos parecem muito interessantes e capazes e, francamente, essa pode ser uma boa chance de sair sendo tão dependente da Microsoft.
Alguém já teve uma situação semelhante? Em caso afirmativo, qual foi sua experiência em dar um salto para funcional e o que você escolheu e por quê? Sei que essa é uma grande pergunta, mas não conheço nenhum desenvolvedor que esteja usando métodos funcionais no momento, então não tenho outro lugar para procurar além de pesquisar no Google incessantemente e encontrar guerras de chamas em todos os lugares na melhor linguagem funcional.
fonte
Respostas:
Protótipo, protótipo, protótipo! Pegue um pouco da funcionalidade comercial que você acha que requer programação funcional e experimente as várias linguagens e veja se elas realmente oferecem os benefícios e a interoperabilidade que você está procurando.
fonte
A primeira pergunta que você realmente precisa responder de verdade é por que está pensando em usar uma linguagem funcional. Se você não pode justificar um motivo comercial para a troca, não deve fazê-lo. Em outras palavras, querer introduzir uma nova estrutura, linguagem ou outra nova tecnologia em seu ambiente de trabalho apenas porque você deseja aprendê-la ou porque parece que a próxima coisa "legal" é definitivamente um erro. Então você precisa primeiro se perguntar com sinceridade qual é a motivação.
Se você realmente acha que precisa de uma linguagem funcional para resolver um problema específico, e assumindo que a maioria das linguagens funcionais convencionais atenderá aos seus requisitos, eu recomendaria a mais madura e a maior comunidade de usuários. Erlang é uma boa escolha e atende a esses dois requisitos, no entanto, em um ambiente puramente ms / .NET, eu posso entender usando o F #.
fonte
x:=3; y:=10; x:=add(x,x);
resulte em umx
que não seja 6 e umy
que não seja 10. Provar que suas funções estão corretas nesse contexto é impraticável.Concordo plenamente com o F # para uma loja com uma base de código .Net existente, da mesma forma que concordo totalmente com Scala para uma loja com uma base de código Java existente.
A programação funcional é uma ferramenta como qualquer outra. Quando bem utilizado e integrado ao modo como você já está desenvolvendo o código, ele pode torná-lo mais produtivo, facilitando o raciocínio sobre o que seu código está fazendo. A mudança de idioma está longe de ser gratuita, portanto, sua melhor aposta é uma solução que permite que você use o máximo possível do código existente pelo maior tempo possível na transição. A maneira mais segura de deixar de introduzir um novo idioma em seu ambiente, afinal, será dizer a seus colegas de trabalho que eles precisam reescrever tudo o que têm até agora para ver os benefícios de uma mudança que, neste momento, você ainda está tentando vendê-los.
fonte
Eu recomendaria iniciar a programação funcional sem também aprender um novo idioma imediatamente. Isso apenas torna mais difícil se você está tentando aprender um novo paradigma quando também está tentando entender a sintaxe de um novo idioma.
Obviamente, linguagens que foram desenvolvidas especificamente para executar programação funcional terão algumas vantagens (como ter construções específicas, como compreensão e tornar estruturas de dados imutáveis por padrão), mas, em geral, o maior passo a ser feito é mudar seu pensamento para um funcional. estilo. C # é ótimo para fazer isso.
Basicamente, você apenas para de alterar o estado do seu código. Eu fiz isso usando Java e é ainda mais fácil com C # porque você tem lambdas. Depois de entender o estilo e sentir o que é bom para ele, será muito fácil escolher uma linguagem funcional (independentemente de se você escolher F # ou Erlang) e ser imensamente produtivo com ela.
fonte
Se tudo o que você deseja é aprender e entender a programação funcional, basta instalar o IronPython e focar nos recursos funcionais do Python. Na pior das hipóteses, você aprenderá uma ferramenta que pode ser integrada ao C # para reduzir o número de linhas de código em um aplicativo e ajudá-lo a fornecer mais produtos sem erros antes do previsto.
Dê uma olhada nas apresentações do DaBeaz sobre geradores para obter um exemplo de como as abordagens funcionais no Python podem simplificar coisas complexas http://www.dabeaz.com/generators/
Fora isso, acho que seria sensato investir algum tempo com a Scala. Ele é executado no .NET no modo beta, para que você possa instalá-lo e usá-lo hoje para fins de aprendizado e, no outono, ele estará no modo de lançamento do .NET. Isso significa que você pode escrever um código no Scala que seja portátil na JVM e no .NET. E, como o Scala é baseado nos atores e na passagem de mensagens, é muito, muito fácil criar um aplicativo composto de vários programas separados, executando em várias máquinas separadas. Quando você adiciona a portabilidade .NET / JVM ao mix, há outro aspecto a considerar. Você pode ter um aplicativo que aproveite as bibliotecas Java de terceiros e as bibliotecas .NET de terceiros sem mexer no desenvolvimento de protocolos para fazê-los se comunicar. Ambos os processos seriam escritos em Scala, e usaria as mensagens remotas Scala (atores remotos) para se comunicar. Confira a biblioteca Akka, que parece que eventualmente se tornará parte da biblioteca padrão da Scala, a julgar pelo que o Typesafe.com está fazendo.
fonte
Certamente, eu concordo com o principal impulso da resposta aceita e, como você basicamente está mergulhando nas coisas de uma vez por todas, tentando Erlang, parece que você provavelmente tem um bom entendimento de como aprende e só precisava de um empurrãozinho no caminho certo. direção, tão claramente foi uma boa resposta para você ... Mas acho que abordaria a questão de maneira um pouco diferente, pois vejo que essa resposta não teria me ajudado muito; Eu sempre código para aprender! Então, aqui estão meus pensamentos ...
(BTW, eu continuo detalhando mais adequado para, digamos, capítulos de um livro, e tenho certeza de que não posso reprimir completamente meus instintos aqui, mas vou tentar uma abordagem diferente; resumindo meus pensamentos aqui e, caso alguém queira mais detalhes sobre alguma coisa ou pense que algo que eu digo é enganoso nesse formato, farei o possível para lembrar de passar por lembretes de resposta ...)
Para tentar me manter na tarefa, eis o meu entendimento das perguntas de impulso feitas no OP; Vou manter as margens ao mínimo, conforme necessário, para explicar ...
Primeiro as respostas rápidas:
eu estava em uma situação semelhante? Era pelo menos semelhante; Eu estava em uma posição de liderança realizando muitos projetos variados que ainda estavam relacionados ... (CRM / Web / DB / Integração de Dados / etc.)
como / por que eu pulei para o funcional? " Vi alguns exemplos de LINQ e, embora definitivamente tivesse sonhado com algum tipo de linguagem de consulta integrada e tipicamente estatizada [como eu havia usado principalmente linguagens estaticamente tipadas (principalmente C ++ e C # posterior) )] ao longo da minha carreira ... Mas, era um ambiente relativamente rápido em que eu estava, e apesar de muitas vezes ter conseguido ver o que estava por vir no passado, nunca havia pensado nisso, então nunca previ que fosse. poderia / permitiria operações em objetos antigos simples (risos!) com a mesma facilidade; quando eu vi, sabia que tinha que ter ... então, esse é o porquê e o começo do como: concentrei-me em aprender a entender o LINQ .
Quatro pensamentos ... errr, não, isso não está certo ...
Quando leio a resposta de Martijn Verburg , a menção da funcionalidade do negócio me chama a atenção imediatamente para começar a implementar o código para qualquer coisa em que estou trabalhando ... Dependendo de quão superficial era a experiência inicial, eu poderia responder de maneira diferente, mas assumindo que era apenas mergulhando o dedão do pé, não tenho certeza se tinha algo diretamente para o trabalho (ou trabalho em breve) que me proporcionaria a emoção / paixão que acho que você provavelmente deveria ter pelos primeiros problemas que começa a enfrentar ...
Eu me baseei quase inteiramente em linguagens de tipo estatístico + metáforas e padrões de OOP + o que quer que eu tenha acabado envolvendo meu cérebro acidentalmente enquanto resolvia meus problemas reais ao longo dos anos ... Aponte que, se você é como eu, você provavelmente tem muito cérebro dedicado a coisas que não o ajudarão muito com o LINQ / FP.
Eu penso nisso meio que como programação procedural pura versus programação OO: há muitas coisas processuais que você acabará usando no OOP, mas aqueles que acessam o C ++ a partir do C sem priorizar o grok / ken / "get" OO acabam sendo muito, muito ruins em C ++. Na verdade, entrevistei muitos (15+) desenvolvedores de longo prazo de firmware e drivers de dispositivo que realmente pensavam conhecer C ++, mas que, no máximo , tinham uma compreensão básica / didática do C ++, praticamente sem entender ou experiência em OOP - porque eles nunca fizeram o OOP ... Eles escreveram classes multiuso singleton com membros estáticos e funções estáticas com alguma quantidade de classes não estáticas / não singleton que foram usadas como estruturas.
E o FP tem alguns conceitos igualmente alucinantes (para aqueles que não foram levantados sobre o paradigma) e outras coisas que o acompanham, e (embora eu tenha achado a hibridação de muitas técnicas ideal para mim) eu entendo mais e mais com o passar do tempo, exatamente quão limitado meu pensamento era antes de obter habilidades funcionais reais no meu conjunto de ferramentas; Eu havia conseguido implementar muitas coisas no passado de uma maneira um pouco mais criativa que talvez a maioria dos programadores de OO, mas como eu uso os conceitos de como meu pensamento era atrofiado antes ... Há classes inteiras de problemas que podem ser resolvidos em algumas linhas que costumavam ser muito complicadas em C ++ / C #.
de repente você se encontra ...
Em uma postagem "muito longa"
Então ... O que devo aprender, querido PSE, querido PSE?
Eu, pessoalmente, comecei em C # com o LINQ. Isso me permitiu introduzir alguns conceitos de cada vez, e enquanto eu lia constantemente sobre FP e seus conceitos, e mais LINQ e o relacionamento entre os dois, ele me deu um caminho a seguir enquanto ainda fazia um trabalho produtivo. Eu adicionei algumas coisas ao mesmo tempo, as consultas de dados rapidamente se tornaram uma ferramenta útil para mim sem ter que entender muito.
Agora, olhando para trás, eu meio que gostaria de poder fazer meu próximo projeto (abordado cerca de um ano depois) primeiro; Eu me familiarizei moderadamente com o F # (que, aliás, me deu um grande avanço no aprendizado de ML (metalinguagem) e de outros derivados (por exemplo, OCaml também).
Basicamente, acho que uma resposta decente para 'o que' depende de encontrar um bom pareamento de algum problema de programação que lhe interesse, mas é claro que deve emparelhar com um pouco de FP que você deseja aprender ... (e você pode enxaguar / repita / ensaboe depois de tirar algo da lista ...) E, é claro, você sempre acaba aprendendo um pouco mais do que a principal coisa que se propõe a fazer; No começo, dei alguns passos de bebê, mas depois acabei fazendo coisas maiores e deixando as coisas menores se encaixarem enquanto as fazia.
Primeiro, o que flutua no seu barco? Especialmente no início, é melhor ter algo divertido e emocionante (para você) e que mantenha seu interesse suficiente para que valha a pena. Portanto, problemas de IOW para trabalhar e técnicas que resolvam esses problemas ... LINQ e consulta de dados em linha para mim primeiro. A recursão foi outra para mim, incluindo a recursão da cauda. Eu gosto muito da GodelEscherBach-ness; e eu estava lendo sobre recursão da cauda. Por volta dessa época, as coisas em que eu estava trabalhando foram suspensas e acabei tendo um grande período de tempo, para que eu pudesse continuar por um bom tempo. Foi mais fácil com menos interrupções, mas como escolhi coisas que achei divertidas, não foi tão difícil, mesmo com a interrupção do trabalho. :)
E, embora eu não tenha inventado nada legal, posso falar sobre o Programa de Caranguejo autoconsciente, eu consegui ficar muito bom nisso.
E ... Com o que aprenderei, querido PSE, querido PSE, com quê?
Para isso, usei vários algoritmos nos quais, de qualquer forma, eu estava interessado, além de várias coisas que eu imaginava se você poderia fazer em F #, e quando eu ficava sem ideias, lidava com coisas como 99 garrafas de cerveja e o Project Euler problemas ...
Tenho certeza que você pode encontrar muitas coisas que lhe interessam para as quais o FP é relevante; oferece tudo, desde aprimoramentos até OOP, que ajudam a declarar as coisas de maneira um pouco mais sucinta, até distorcer a maneira como você pensaria antes em uma forma que você não reconhece e provavelmente nem tinha o modelo mental para expressar antes.
Mas ... Há um buraco no meu modelo, querido PSE, um buraco ...
E é por isso que é importante que, especialmente no começo, mas realmente durante todo o seu tempo aprendendo (e nem sempre é verdade quando você está aprendendo alguma coisa?), Você pelo menos gaste um tempo entre os problemas para ler coisas não relacionadas, mas ainda FP e tempo para ler o código fonte escrito por especialistas, resolvendo preferencialmente os mesmos problemas ou problemas semelhantes; bem como suas explicações sobre as coisas ...
E o tempo todo, você precisa esforçar seu cérebro para entender tudo, não da sua antiga perspectiva, mas de dentro do próprio FP ... to está se tornando mais ou menos fluente em holandês; em algum momento eu consegui me colocar o suficiente na mentalidade (eu fiz isso por imersão, que é basicamente o que eu descrevi aqui; mergulhando no FP, em vez de tentar aprendê-lo apenas através do "livro larnin '" ...
E, eventualmente, eu fiz; Consegui internalizar tudo e girar meu cérebro até que comecei a usar o FP / LINQ sem que eu tivesse que fazer um esforço para traduzi-lo novamente em OOP. (Sim, eu fiz isso; eu tinha que ter algo para pendurar minha saia. Chapéu. Tanto faz.)
Pensamentos finais...
Você pode encontrar muitas informações on-line sobre o FP, naturalmente. O principal é entender os conceitos básicos e aprender a aplicá-los. Por exemplo, aprenda sobre imutabilidade e por que é importante / útil para o FP. Eu recomendo aprender um pouco de teoria para acompanhar tudo, como o FP puro pode ser muito mais passível de prova formal. Esta foi uma força motriz por trás do progenitor do F #, ML. YMMV, é claro, você pode ser alguém entediado às lágrimas; nesse caso, muitos exemplos, muitas tentativas e erros para ver exatamente por que as técnicas usadas são o que são, o ajudarão a ter esse 'Aha!' momento da lâmpada.
Então, vou deixar por agora. Espero que isso seja útil para alguém. Eu queria me aprofundar um pouco mais em coisas específicas, mas estou sem tempo no momento. Espero encontrar algum tempo para voltar logo, embora pareça uma semana longa para mim, então provavelmente será pelo menos o fim de semana.
<3 "Apresentando o GRUEBOL, uma piada; apenas até o SnozzML terminar. Deve ser em breve; tenho um comitê enorme me ajudando desta vez." - Grace Hopperwit Egghead, Últimas Palavras Famosas, XX97 GUE <3
fonte