A programação funcional é uma besta estranha para mim. Eu aprendi F # e Haskell, escrevi alguns programas simples e adoro usá-los, mas nunca tive o "flash de revelação" de que algumas pessoas falam. Mas, lentamente, notei que cada vez mais eu escrevia um código que deveria ser imutável, dividindo tarefas em mais funções menores e tentando usar muito mais os delegados. É algo que, se você gosta, entra no seu trabalho porque o valor dessas técnicas é evidente.
Agora, mais praticamente para treinamento: acho que dois conceitos realmente clicam em Programação Funcional como um estilo para mim.
Primeiro, o estilo FP é baseado na estrutura dos dados, não na composição como no OOP. Eu olhei para algo como List em C # como sendo um truque inteligente para gerar listas seguras para tipos, algo que compôs o tipo (string) no outro tipo (lista). Depois de aprender FP, olho para os genéricos mais como as Mônadas agora. List é uma forma estruturada que o código pode assumir e decora as strings.
Segundo, e talvez mais útil para programadores de C # / ASP, é a idéia de que o FP trabalha com recursão e repetição, enquanto o OOP trabalha com mutabilidade e loop. Eu costumo pensar no ciclo de vida da página ASP como um tipo de FP agora: cada solicitação é processada do zero durante todo o ciclo de vida; portanto, a página inteira é, na verdade, um grande programa que se repete lentamente. Se você pode restringir essa noção, terá uma idéia melhor de como um programa imperativo pode ser estruturado em torno de loops de funções que capturam dados, operam sobre eles e retornam novos dados em vez de modificar os antigos.
O obstáculo mais difícil, pelo menos para mim, a superar com essa abordagem é a sensação de que você está desperdiçando toneladas de recursos ao usar objetos mutáveis, economizando uma tonelada de memória. No GC, confiamos, e eu apenas tive que aprender a deixar de lado as preocupações com desempenho até que eu realmente vi o programa ser executado e verificado se havia algum, e se sim, usar um criador de perfil para ver exatamente onde estavam os problemas.