ti-enxame.com

Quais são algumas boas práticas ao tentar ensinar programação declarativa para programadores imperativos?

Eu me ofereci para fazer um pequeno treinamento em F # na minha empresa e eles pareceram mostrar algum interesse. Eles geralmente são programadores VB6 e C # que não seguem a programação com muita paixão. Dito isso, sinto que é mais fácil escrever código correto quando você pensa em uma questão funcional, então eles definitivamente deveriam obter algum benefício disso.

Alguém pode oferecer algum conselho sobre como devo abordar isso?

Idéias

  • Não se concentre na sintaxe, em vez disso concentre-se em como essa linguagem e os idiomas que ela promove podem ser usados.
  • Tente pensar em exemplos que são difíceis de escrever de uma forma imperativa, mas que se traduzem em código elegante quando escritos de forma declarativa.
13
ChaosPandion

A programação funcional é uma besta estranha para mim. Aprendi F # e Haskell, escrevi alguns programas simples e adoro usá-los, mas nunca tive o "lampejo de revelação" de que falam algumas pessoas. Mas, lentamente, percebi que mais e mais eu estava escrevendo um código que deveria ser imutável, dividindo as tarefas em mais funções menores e tentando usar delegados muito mais. É uma coisa que, se você gosta, se insinua em seu trabalho porque o valor dessas técnicas é evidente.

Agora, de forma mais prática, para o treinamento: acho que dois conceitos realmente fazem parte da Programação Funcional como um estilo para mim.

Primeiro, FP é baseado na estrutura de dados, não na composição como em OOP. Eu olhei para algo como List em C # como um truque inteligente para gerar listas seguras de tipo, algo que compôs o digite (string) no outro tipo (lista). Depois de aprender FP, vejo os genéricos mais parecidos com Mônadas agora. Lista é uma forma estruturada que o código pode assumir e decora as strings.

Em segundo lugar, e talvez mais útil para programadores C #/ASP, é a ideia de que FP funciona em recursão e repetição, enquanto OOP funciona em mutabilidade e loop. tendem a pensar no ASP ciclo de vida da página como uma espécie de FP agora: cada solicitação é processada do zero ao longo de todo o ciclo de vida, portanto, toda a página é, na verdade, um grande programa de recorrência lenta. Se você puder restringir essa noção, terá uma ideia melhor de como um programa imperativo pode ser estruturado em torno de loops de funções que recebem dados, operam sobre eles e retornam novos dados em vez de modificar o antigo.

O obstáculo mais complicado, pelo menos para mim, a ser superado com essa abordagem é a sensação de que você está desperdiçando toneladas de recursos ao usar objetos mutáveis ​​economizaria uma tonelada de memória. Em GC nós confiamos, e eu apenas tive que aprender a deixar de lado as preocupações com o desempenho até que eu realmente vi o programa rodar e verificasse se havia algum, e se sim, usar um profiler para ver exatamente onde estavam os problemas.

5
CodexArcanum

Eu recomendaria:

1
Jonas

Muitas linguagens de programação imperativas (Ada, C/C++, Turbo Pascal, FoxPro) têm a capacidade de definir o ponteiro para funções ou literais de nome de procedimento que podem ser avaliados (e os procedimentos nomeados após o literal invocado) em tempo de execução.

O exemplo tradicional é qsort em C. Baseie-se na noção de que você pode definir algoritmos que executam outros algoritmos em estruturas de dados. Obviamente, isso é apenas uma fração do que é programação funcional. Mas descobri que esse é um bom ponto de partida para que a ideia seja assimilada.

Assim que entender, você pode começar a mergulhar em outras coisas (imutabilidade, não compartilhar nada, etc.)

1
luis.espinal

Alguém pode oferecer alguns conselhos sobre como devo abordar isso?

Certo:

  • Escolha seus exemplos com cuidado para que seu código F # não apenas resolva um problema com elegância, mas também muito mais elegantemente do que é possível com C #/VB. A correspondência de padrões e a inferência de tipos são seus amigos aqui.

  • Use um exemplo para destacar os benefícios do novo recurso encontrado no F #, por exemplo, fluxos de trabalho assíncronos, padrões ativos.

  • Não tenha medo de dar exemplos impuros usando estruturas de dados mutáveis ​​quando apropriado. F # é impuro por um motivo.

  • Não apresente o F # como uma panacéia. Descreva os aplicativos para os quais o F # não é adequado, bem como aqueles para os quais é muito mais adequado do que outras linguagens .NET.

  • Aponte para amostras de brinquedos que eles podem estudar, bem como projetos bem-sucedidos do mundo real que usaram F # (Bing AdCenter, Halo 3 etc.).

  • Explique tudo em termos de como o F # pode ajudá-los a resolver problemas com mais facilidade. Evite debates religiosos. Mantenha-se positivo sobre o F #, não negativo sobre outras línguas. Arme-os com fatos e evidências, mas deixe-os tirar suas próprias conclusões.

1
Jon Harrop