it-swarm-es.com

¿Cuáles son algunas buenas prácticas cuando se intenta enseñar programación declarativa a programadores imperativos?

Me ofrecí a hacer un poco de formación en F # en mi empresa y parecieron mostrar cierto interés. Generalmente son programadores de VB6 y C # que no siguen la programación con demasiada pasión. Dicho esto, siento que es más fácil escribir código correcto cuando se piensa en un asunto funcional, por lo que definitivamente deberían obtener algún beneficio de él.

¿Alguien puede ofrecer algún consejo sobre cómo debería abordar esto?

Ideas

  • No se centre en la sintaxis, en su lugar concéntrese en cómo se puede utilizar este lenguaje y los modismos que promueve.
  • Intente pensar en ejemplos que son difíciles de escribir de manera imperativa pero que se traducen en un código elegante cuando se escriben de manera declarativa.
13
ChaosPandion

La programación funcional es una bestia extraña para mí. Aprendí F # y Haskell, escribí algunos programas simples y me encanta usarlos, pero nunca tuve el "destello de revelación" del que hablan algunas personas. Pero lentamente, me di cuenta de que cada vez más escribía código que debía ser inmutable, dividía las tareas en más funciones más pequeñas y trataba de usar a los delegados mucho más. Es algo que, si te gusta, se cuela en tu trabajo porque el valor de esas técnicas es evidente.

Ahora, de manera más práctica para la capacitación: encuentro que dos conceptos realmente encajan en Programación funcional como un estilo para mí.

Primero, FP el estilo se basa en la estructura de los datos, no en la composición como en OOP. Miré algo como List en C # como un truco inteligente para generar listas de tipo seguro, algo que componía el escriba (cadena) en el otro tipo (lista). Después de aprender FP, ahora veo genéricos más como Monads. La lista es una forma estructurada que el código puede tomar y decora las cadenas.

En segundo lugar, y quizás más útil para los programadores de C #/ASP, es la idea de que FP funciona en recursividad y repetición, mientras que OOP funciona en mutabilidad y bucle). tienden a pensar en el ciclo de vida de la página ASP como una especie de FP ahora: cada solicitud se procesa desde cero durante todo el ciclo de vida, por lo que toda la página es, en efecto, un gran programa que se recupera lentamente. Si puede reducir esa noción, tendrá una mejor idea de cómo un programa imperativo puede estructurarse alrededor de ciclos de funciones que toman datos, operan sobre ellos y devuelven nuevos datos en lugar de modificar el antiguo.

El obstáculo más complicado, al menos para mí, de superar con este enfoque es esa sensación de hundimiento de que estás desperdiciando toneladas de recursos al usar objetos mutables que ahorraría una tonelada de memoria. En GC confiamos, y tuve que aprender a dejar de lado las preocupaciones sobre el rendimiento hasta que realmente vi el programa ejecutarse y verifiqué si había alguno y, de ser así, usar un generador de perfiles para ver exactamente dónde estaban los problemas.

5
CodexArcanum

Yo recomendaria:

1
Jonas

Muchos lenguajes de programación imperativos (Ada, C/C++, Turbo Pascal, FoxPro) tienen la capacidad de definir punteros a funciones o literales de nombre de procedimiento que se pueden evaluar (y los procedimientos nombrados después del literal invocado) en tiempo de ejecución.

El ejemplo tradicional es qsort en C. Aproveche la noción de que puede definir algoritmos que ejecuten otros algoritmos en estructuras de datos. Obviamente, esto es solo una fracción de lo que es la programación funcional. Pero he descubierto que este es un buen punto de partida para que la idea se asimile.

Una vez que lo asimile, podrá comenzar a profundizar en otras cosas (inmutabilidad, no compartir nada, etc.)

1
luis.espinal

¿Alguien puede ofrecer algún consejo sobre cómo debería abordar esto?

Por supuesto:

  • Elija sus ejemplos con cuidado para que su código F # no solo resuelva un problema con elegancia sino también mucho más elegante de lo que es posible con C #/VB. La coincidencia de patrones y la inferencia de tipos son tus amigos aquí.

  • Use un ejemplo para resaltar los beneficios de la nueva característica que se encuentra en F #, p. Ej. flujos de trabajo asincrónicos, patrones activos.

  • No tenga miedo de dar ejemplos impuros utilizando estructuras de datos mutables cuando sea apropiado. F # es impuro por una razón.

  • No presente F # como una panacea. Describa las aplicaciones para las que F # no es adecuado, así como aquellas para las que es mucho más adecuado que otros lenguajes .NET.

  • Señale muestras de juguetes que pueden estudiar, así como proyectos exitosos del mundo real que utilizan F # (Bing AdCenter, Halo 3, etc.).

  • Explique todo en términos de cómo F # puede ayudarlos a resolver problemas más fácilmente. Evite los debates religiosos. Sea positivo sobre F #, no negativo sobre otros idiomas. Ármeles con hechos y pruebas, pero déjelos sacar sus propias conclusiones.

1
Jon Harrop