Introduzindo programação funcional em seu ambiente de desenvolvimento [fechado]

15

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.

Nodey, o cara do nó
fonte
leitura recomendada: Por onde começar
gnat

Respostas:

14

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.

Martijn Verburg
fonte
Bons conselhos e vou prestar atenção, na verdade, estou fazendo uma instalação do Erlang agora para tentar.
Nodey The Node Guy
10

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 #.

ennuikiller
fonte
2
@ennukiller - Definitivamente, posso ver que a programação funcional seria uma boa escolha para nós e não vou mentir - também adoraria usá-la apenas pela pura estimulação intelectual que ela fornecerá. Vamos fazer grandes quantidades de cálculos e quero tirar proveito do multi-core. Além disso, é imperativo que todas as funções matemáticas sejam comprovadas corretas, eu entendo que pode ser mais fácil com a funcional.
Nodey The Node Guy
2
Se você precisar de provas, a melhor programação funcional é a melhor. Algumas sugestões aqui são para complementos funcionais para idiomas imperativos - eles podem ser mais familiares, mas não fornecerão o código comprovadamente correto. Na presença de efeitos colaterais, você não pode usar o fato de que x = x ('transparência referencial') e precisa provar que o x mais adiante no código ainda possui o mesmo valor que anteriormente. Em alguns idiomas, por exemplo, pode acontecer que x:=3; y:=10; x:=add(x,x);resulte em um xque não seja 6 e um yque não seja 10. Provar que suas funções estão corretas nesse contexto é impraticável.
AndrewC
9

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.

jimwise
fonte
7

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.

Deckard
fonte
1
+1: eu concordo com você. Também comecei a codificar em um estilo mais funcional em Java e C ++ (usando mais variáveis ​​finais e const, interrompendo operações complexas usando a composição de funções e assim por diante). Eu acho que isso definitivamente melhorou meu estilo de programação em Java e C ++. Depois de um tempo, quando se sente pronto para ir mais longe, pode-se experimentar uma linguagem funcional (Haskell, OCaml, SML, Lisp, Scala, F #, etc.)
Giorgio
1

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.

Michael Dillon
fonte
+1: por mencionar o Scala e sua disponibilidade em diferentes plataformas. Pergunta: akka substituirá a implementação atual do ator no Scala? Ou os dois existirão lado a lado?
Giorgio
Não tenho certeza se a Akka substituirá os atuais atores do Scala em breve, mas o criador do Scala, Martin Odersky, se juntou ao criador do Akka, Jonas Boner, na empresa Typesafe. Eles estão promovendo fortemente o Scala com Akka e agora com o framework Play. Portanto, é provável que o foco do desenvolvimento esteja na Akka. Se você está apenas aprendendo atores com Scala, seria melhor se concentrar primeiro no Akka.
Michael Dillon
Muito obrigado pela informação! Dei uma olhada nos atores de Scala, mas apenas um muito superficial até agora.
Giorgio
-1

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"

Você está em um labirinto de "não lidos" sinuosos, todos iguais.

Você vê uma teleconferência em um futuro próximo, se aproximando rapidamente.
> conciso
Uhhuh. Certo. Ok, diremos que o modo "conciso" está "ativado".

Você vê uma teleconferência em um futuro próximo, se aproximando rapidamente.
> o que isso quer dizer?
Apenas dizendo'. Você não teve que fazer algo esta manhã?

Você vê uma teleconferência em um futuro próximo, se aproximando rapidamente. 
> ei, isso é uma tristeza atrás de você?
O que!? ONDE?! [foge gritando]

> Desculpe, eu não entendi O QUE ONDE, reformular?
[continuou correndo e gritando, sarcasmo despercebido]

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...

Meu Deus, parece que você está perdendo sua capacidade de pensar em sua assinatura inteligente
títulos de seção. Que pena.

A teleconferência ainda está se aproximando rapidamente. Parece muito maior agora.
> sim, sim, bem .. conciso e tudo. Eu vejo que você conseguiu perder essa tristeza.
 por um triz, que ... bem, sim, eu estou sendo ... OH NÃO VOLTA!
AAAAAAAHHHHHH !! [foge gritando, mais uma vez]

A teleconferência ainda está se aproximando rapidamente.
De alguma forma, lembra Sir Lancyjohn Cleezewiz.
Está quase em cima de você.
> ei, volte depressa! Eu tenho um experimento para tentar com você! (e um po-ta-to)

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

shelleybutterfly
fonte
o que é "querido SO"?
Gnat
era caro estouro de pilha; deveria coincidir com a cadência da música 'Há um buraco no balde' xD
shelleybutterfly
quando fora de lançamento SO, este parece fazer os seus pontos mais difícil de entender - considere editar ing a conta para que
mosquito
derp! sim, de fato, ter feito. tyvm. :)
shelleybutterfly
se alguém tiver sugestões de como melhorar minha resposta, eu agradeceria .. foi de mau humor? ou um conselho ruim? na verdade, é com base na minha experiência, por isso fico feliz em alterá-la se puder torná-la mais útil. Graças;)
shelleybutterfly