Introducir programación funcional en su entorno de desarrollo [cerrado]

15

Esta es una larga historia, pero intentaré resumirla lo mejor que pueda. Somos una tienda .NET que escribe software para una variedad de diferentes tipos de fondos. Por ejemplo, escribimos software de administración de reclamos de salud, software de administración de pensiones, software 401 (k) y algunas otras cosas de tipo financiero.

Ahora estamos entrando en un nuevo reino: derivados y análisis de tipo cuantitativo de trabajo, lo que parece muy emocionante. Esto es algo que se reducirá en los próximos 8-12 meses, me han dicho.

Ahora, he aprendido algo de programación funcional por mi cuenta, principalmente solo miradas superficiales a varios idiomas a través de este libro, pero nunca lo he profundizado. Ahora, dado que somos una tienda .NET, pensé que F # podría ser una buena opción, ya que podríamos aprovechar algunas bibliotecas .NET y el conocimiento existente posiblemente.

Mi pregunta es, ¿por dónde empezar? Estoy teniendo un momento extremadamente difícil tratando de averiguar si debo ir con Haskell, Erlang, Scala, F #, etc. Todos parecen muy interesantes y capaces y, francamente, esta podría ser una buena oportunidad para dejar de depender tanto de Microsoft.

¿Alguien ha tenido una situación similar? Si es así, ¿cuál fue su experiencia haciendo el salto a funcional y qué eligió y por qué? Sé que esta es una gran pregunta, pero no conozco a ningún desarrollador que esté utilizando métodos funcionales en este momento, así que no tengo otro lugar al que recurrir sin buscar en Google y encontrar guerras de fuego en todas partes en el mejor lenguaje funcional.

Nodey The Node Guy
fuente
lectura recomendada: por dónde empezar
mosquito

Respuestas:

14

Prototipo, prototipo, prototipo! Tome un poco de funcionalidad empresarial que cree que requiere programación funcional y pruebe los distintos idiomas y vea si realmente le brindan los beneficios y la interoperabilidad que está buscando.

Martijn Verburg
fuente
Un buen consejo y lo tendré en cuenta, de hecho, estoy haciendo una instalación de Erlang ahora mismo para intentarlo.
Nodey The Node Guy
10

La primera pregunta que realmente necesita responder con sinceridad es por qué está considerando usar un lenguaje funcional. Si no puede justificar una razón comercial para el cambio, entonces no debe hacerlo. En otras palabras, querer introducir un nuevo marco, lenguaje u otra tecnología nueva en su entorno de trabajo solo porque quiere aprenderlo o porque parece que la próxima cosa "genial" es definitivamente un error. Por lo tanto, primero debe preguntarse sinceramente cuál es la motivación.

Si realmente siente que necesita un lenguaje funcional para resolver un problema en particular, y suponiendo que la mayoría de los lenguajes funcionales convencionales cumplan con sus requisitos, entonces elegiría el más maduro y el que tenga la mayor comunidad de usuarios. Erlang es una buena opción y cumple ambos requisitos, sin embargo, en un entorno puramente ms / .NET, puedo entender el uso de F #.

ennuikiller
fuente
2
@ennukiller: definitivamente puedo ver que la programación funcional sería una buena opción para nosotros y no voy a mentir, también me encantaría usarla solo por la pura estimulación intelectual que proporcionará. Vamos a hacer grandes cantidades de cálculos y quiero aprovechar los múltiples núcleos. Además, es imperativo que cada función matemática se pruebe correcta, entiendo que puede ser más fácil con funcional.
Nodey The Node Guy
2
Si necesita pruebas, la programación funcional pura es la mejor. Algunas sugerencias aquí son para complementos funcionales a lenguajes imperativos: pueden ser más familiares, pero no le proporcionarán un código probablemente correcto. En presencia de efectos secundarios, no puede usar el hecho de que x = x ('transparencia referencial'), y tiene que demostrar que la x más adelante en el código todavía tiene el mismo valor que antes. En algunos idiomas, por ejemplo, puede suceder que x:=3; y:=10; x:=add(x,x);resulte en un xque no sea 6 y yque no sea 10. Probar sus funciones correctas en este contexto no es práctico.
AndrewC
9

Estoy totalmente de acuerdo con F # para una tienda con una base de código .Net existente, al igual que estoy totalmente de acuerdo con Scala para una tienda con una base de código Java existente.

La programación funcional es una herramienta como cualquier otra. Si se usa bien y está integrado con la forma en que ya está desarrollando el código, puede hacerlo más productivo al hacer más fácil razonar sobre lo que está haciendo su código. Sin embargo, cambiar de idioma está lejos de ser gratuito, por lo que su mejor opción es una solución que le permita utilizar la mayor cantidad posible de su código existente durante el mayor tiempo posible en la transición. La forma más segura de no introducir un nuevo idioma en su entorno, después de todo, será decirles a sus compañeros de trabajo que tienen que reescribir todo lo que tienen hasta ahora para ver los beneficios de un cambio que, en este momento, todavía estás tratando de venderlos.

jimwise
fuente
7

Recomendaría comenzar la programación funcional sin también aprender un nuevo lenguaje de inmediato. Simplemente lo hace más difícil si estás tratando de aprender un nuevo paradigma cuando también estás tratando de familiarizarte con la sintaxis de un nuevo lenguaje.

Por supuesto, los lenguajes que se han desarrollado específicamente para la programación funcional tendrán algunas ventajas (como tener construcciones específicas, como las comprensiones y hacer que las estructuras de datos sean inmutables por defecto), pero en general el mayor paso a seguir es cambiar su pensamiento a un funcional estilo. C # es genial para hacer eso.

Básicamente, simplemente deja de cambiar el estado de su código. He hecho esto usando Java y es aún más fácil con C # porque tienes lambdas. Una vez que domines ese estilo y sientas para qué es bueno, será muy fácil elegir un lenguaje funcional (independientemente de si es F # que elijas o Erlang) y ser inmensamente productivo con él.

Deckard
fuente
1
+1: Estoy de acuerdo contigo. También comencé a codificar en un estilo más funcional en Java y C ++ (usando más variables finales y constantes, rompiendo operaciones complejas usando composición de funciones, etc.). Creo que esto definitivamente ha mejorado mi estilo de programación en Java y C ++. Después de un tiempo, cuando uno se siente listo para ir más allá, puede probar un lenguaje funcional (Haskell, Ocaml, SML, Lisp, Scala, F #, etc.)
Giorgio
1

Si todo lo que quiere es aprender y comprender la programación funcional, simplemente instale IronPython y concéntrese en las funciones funcionales de Python. En el peor de los casos, aprenderá una herramienta que se puede integrar con C # para reducir la cantidad de líneas de código en una aplicación y ayudarlo a entregar más productos libres de errores antes de lo programado.

Eche un vistazo a las presentaciones de DaBeaz sobre generadores para ver un ejemplo de cómo los enfoques funcionales en Python pueden simplificar cosas complejas http://www.dabeaz.com/generators/

Aparte de eso, creo que sería prudente invertir algo de tiempo con Scala. Se ejecuta en .NET en modo beta, por lo que puede instalarlo y usarlo hoy para fines de aprendizaje, y para el otoño, estará en modo de lanzamiento para .NET. Esto significa que puede escribir código en Scala que sea portátil en JVM y .NET. Y, dado que Scala se basa en actores y mensajes que pasan, es muy, muy fácil construir una aplicación hecha de varios programas separados que se ejecutan en varias máquinas separadas. Cuando agrega la portabilidad .NET / JVM a la mezcla, entonces hay otro aspecto a considerar. Podría tener una aplicación que aproveche tanto las bibliotecas Java de terceros como las bibliotecas .NET de terceros sin perder el tiempo con el desarrollo de protocolos para que se comuniquen. Ambos procesos se escribirían en Scala, y usaría la mensajería remota de Scala (actores remotos) para comunicarse. Echa un vistazo a la biblioteca Akka, que parece que eventualmente se convertirá en parte de la biblioteca estándar de Scala a juzgar por lo que Typesafe.com está haciendo.

Michael Dillon
fuente
+1: por mencionar a Scala y su disponibilidad en diferentes plataformas. Pregunta: ¿reemplazará akka la implementación actual del actor en Scala? ¿O los dos existirán uno al lado del otro?
Giorgio
No estoy seguro de si Akka reemplazará a los actores actuales de Scala en el corto plazo, pero el creador de Scala, Martin Odersky, se ha unido al creador de Akka, Jonas Boner, en la compañía Typesafe. Están promoviendo fuertemente Scala con Akka y ahora con el marco Play. Por lo tanto, es probable que el enfoque del desarrollo se centre en Akka. Si solo está aprendiendo actores con Scala, sería mejor centrarse primero en Akka.
Michael Dillon
¡Muchas gracias por la información! Eché un vistazo a los actores en Scala, pero solo uno muy superficial hasta ahora.
Giorgio
-1

Ciertamente, estoy de acuerdo con el objetivo principal de la respuesta aceptada, y dado que básicamente te estás sumergiendo en las cosas al intentar Erlang, parece que probablemente tienes una buena comprensión de cómo aprendes y solo necesitas un pequeño empujón en la derecha dirección, así que claramente fue una buena respuesta para usted ... Pero, creo que abordaría la pregunta un poco diferente, ya que veo que esta respuesta no me habría ayudado mucho; ¡Siempre codifico para aprender! Entonces, aquí están mis pensamientos ...

(Por cierto, tiendo a continuar con detalles más adecuados para, por ejemplo, capítulos en un libro, y estoy seguro de que no puedo sofocar mis instintos por completo aquí, pero voy a intentar una táctica diferente; estoy voy a resumir mis pensamientos aquí, y en caso de que alguien quiera más detalles sobre algo, o piense que algo que digo es engañoso en este formato, haré todo lo posible para recordar leer los recordatorios de respuesta ...)

Para tratar de mantenerme concentrado en la tarea, aquí tengo mi comprensión de las preguntas clave formuladas en el OP; Mantendré el margen al mínimo según sea necesario para explicar ...

Primero las respuestas rápidas:

¿Estaba en una situación similar? Era al menos similar; Estaba en una posición de liderazgo haciendo muchos proyectos variados que, sin embargo, estaban relacionados ... (CRM / Web / DB / Data Integration / etc.)

¿Cómo / por qué di el salto a funcional? " . Vi algunos ejemplos de LINQ y, aunque definitivamente había soñado con algún tipo de lenguaje de consulta integrado, tipado estáticamente [ya que había usado principalmente lenguajes tipados estáticamente (principalmente C ++ y luego C # )] a lo largo de mi carrera ... Pero, era un entorno bastante rápido en el que me encontraba, y aunque a menudo había logrado ver lo que venía en el pasado, nunca lo había pensado realmente, así que nunca preví que podría / permitiría operaciones en Objetos antiguos simples (¡jaja!) con la misma facilidad; cuando lo vi supe que tenía que tenerlo ... así que ese es el por qué y el comienzo del cómo: me concentré en aprender a entender LINQ .

Cuatro pensamientos ... errr, no, eso no está bien ... Pensamientos previos

Cuando leo la respuesta de Martijn Verburg , la mención de la funcionalidad comercial me hace pensar de inmediato en comenzar a implementar código para lo que sea que esté trabajando ... Dependiendo de cuán superficial sea la experimentación inicial, podría responder de manera diferente, pero suponiendo que fuera solo sumergiendo el dedo gordo del pie, no estoy seguro de tener algo directamente por trabajo (o que pronto se convierta en trabajo) que me haya proporcionado la emoción / pasión que creo que probablemente deberías tener por los primeros problemas que empiezas a enfrentar ...

Me basé casi por completo en lenguajes tipados estáticamente + metáforas y patrones de OOP + lo que sea que terminé envolviendo mi cerebro accidentalmente mientras resolvía mis problemas reales a lo largo de los años ... Señale que, si es como soy, Es probable que tengas mucho cerebro dedicado a cosas que no te ayudarán tanto con LINQ / FP.

Creo que es algo así como la programación pura de procedimiento versus OO: hay muchas cosas de procedimiento que terminarás usando en OOP, pero aquellos que vienen a C ++ desde C sin que sea una prioridad grok / ken / "get" OO terminar siendo muy muy malo en C ++. De hecho, he entrevistado a muchísimos (más de 15) desarrolladores de firmware y controladores de dispositivos que creían conocer C ++, pero que, a lo sumo , tenían una comprensión terriblemente básica / de libros de texto de C ++, prácticamente sin entender o experiencia en OOP, porque en realidad nunca hicieron OOP ... Escribieron clases multipropósito singleton con miembros estáticos y funciones estáticas con cierta cantidad de clases no estáticas / no singleton que se usaron como estructuras.

Y FP tiene algunos conceptos igualmente alucinantes (para aquellos que no están formados en el paradigma) y otras cosas que lo acompañan, y (aunque he encontrado que la hibridación de muchas técnicas es ideal para mí) entiendo más y más a medida que pasa el tiempo exactamente cuán limitado era mi pensamiento antes de obtener habilidades funcionales reales en mi conjunto de herramientas; Me las arreglé para implementar muchas cosas en el pasado de una manera que era un poco más creativa que la mayoría de los programadores de OO, pero a medida que uso los conceptos de lo atrofiado que era mi pensamiento antes ... Hay clases enteras de problemas que pueden resolverse en unas pocas líneas que solían ser muy retorcidas en C ++ / C #.

de repente te encuentras ...

En una publicación "demasiado larga"

Estás en un laberinto de retorcidos "no leídos", todos iguales.

Ves una teleconferencia en el futuro cercano, que se acerca rápidamente.
> conciso
UH Huh. Seguro. Bien, diremos que el modo "conciso" está "activado".

Ves una teleconferencia en el futuro cercano, que se acerca rápidamente.
> ¿Qué se supone que significa eso?
Sólo digo'. ¿No tenías que hacer algo esta mañana?

Ves una teleconferencia en el futuro cercano, que se acerca rápidamente. 
> hey, ¿eso es una porquería detrás de ti?
¿¡Qué!? ¡¿DÓNDE?! [huye gritando]

> Lo siento, no entendí ¿QUÉ DÓNDE, reformular?
[continuó corriendo y gritando, sarcasmo inadvertido]

Entonces ... ¿Qué debo aprender, querido PSE, querido PSE?

Yo personalmente comencé en C # con LINQ. Me permitió introducir algunos conceptos a la vez, y mientras leía constantemente sobre FP y sus conceptos, y más LINQ, y la relación entre los dos, me dio un camino a seguir mientras seguía haciendo un trabajo productivo. Agregué algunas cosas a la vez, las consultas de datos se convirtieron rápidamente en una herramienta útil para mí sin tener que entender mucho.

Ahora, mirando hacia atrás, ojalá hubiera podido hacer mi próximo proyecto (abordado aproximadamente un año después) primero; Me familiaricé moderadamente con F # (que, por cierto, me dio una gran ventaja para aprender ML (metalenguaje) y sus otros derivados (por ejemplo, OCaml también).

Básicamente, creo que una respuesta decente a 'qué' depende de encontrar un buen emparejamiento de algún problema de programación que le interese, pero por supuesto debe emparejarse con un poco de FP que desea aprender ... (y puede enjuagar / repetir / hacer espuma después de eliminar algo de la lista ...) Y, por supuesto, siempre terminas aprendiendo un poco más de lo que te propusiste hacer; Al principio tomé algunos pasos pequeños, pero luego terminé haciendo cosas más grandes y dejando que las cosas más pequeñas se acomodaran mientras las hacía.

Primero, ¿qué flota tu bote? Especialmente al principio, es mejor tener algo divertido y emocionante (para usted) y que mantenga su interés lo suficiente como para que valga la pena. Entonces, IOW problemas para trabajar y técnicas que abordan esos problemas ... LINQ y consultas de datos en línea para mí al principio. La recursión fue otra para mí, incluida la recursividad de la cola, cavo el GodelEscherBach-ness de ella; y había estado leyendo sobre la recursión de la cola. Alrededor de este tiempo, las cosas en las que estaba trabajando se suspendieron, y terminé teniendo un gran bloque de tiempo, por lo que pude mantenerlo durante mucho tiempo. Fue más fácil con menos interrupciones, pero debido a que elegí cosas que pensé que eran divertidas, no fue tan difícil incluso con la interrupción del trabajo. :)

Y aunque no se me ocurrió nada interesante que pueda contarte, como el Programa Crab consciente de sí mismo, logré ser bastante bueno en eso.

Y ... ¿Con qué lo aprenderé, querido PSE, querido PSE, con qué?

Para esto, utilicé varios algoritmos que me interesaban de todos modos, además de varias cosas que me preguntaba si podría hacer en F #, y cuando me quedara sin ideas abordaría cosas como 99 botellas de cerveza y el Proyecto Euler problemas ...

Estoy seguro de que puede encontrar muchas cosas que le interesan para las cuales FP es relevante; ofrece de todo, desde mejoras hasta POO que lo ayudan a expresar las cosas un poco más sucintamente hasta torcer la forma en que lo habría pensado antes en una forma que no reconoce y que probablemente ni siquiera tenía el modelo mental para expresar antes de.

Pero ... Hay un agujero en mi modelo, querido PSE, un agujero ...

Y es por eso que es importante que, especialmente al principio, pero realmente a lo largo de tu tiempo de aprendizaje (¿y no es siempre cierto cuando estás aprendiendo algo?) Al menos te tomas un poco de tiempo entre problemas para leer cosas no relacionadas pero todavía FP y tiempo para leer el código fuente escrito por expertos, preferiblemente resolviendo el mismo problema o problemas similares; así como sus explicaciones de las cosas ...

Y todo el tiempo, tienes que esforzarte para entenderlo todo, no desde tu antigua perspectiva sino desde dentro de la propia PF ... En algún momento para mí, hizo clic y ... lo que mejor puedo relacionarlo to se está volviendo más o menos fluido en holandés; en algún momento logré ponerme lo suficientemente en la mentalidad (lo hice por inmersión, que es básicamente lo que he descrito aquí; sumergiéndome en la PF en lugar de tratar de aprenderlo únicamente a través de "larnin de libro" ...

Y, finalmente lo hice; Me las arreglé para internalizar todo y girar mi cerebro hasta que comenzó a aparecer FP / LINQ sin siquiera tener que hacer un esfuerzo para traducirlo de nuevo a OOP. (Sí, hice eso; tenía que tener algo para colgar mi falda. Sombrero. Lo que sea.)

Pensamientos finales...

Dios mío, parece que estás perdiendo tu capacidad de pensar en tu firma inteligente
títulos de la sección Qué lástima.

La teleconferencia todavía se acerca rápidamente. Parece mucho más grande ahora.
> sí, sí, bueno ... conciso y todo. Veo que lograste perder esa tristeza.
 llamada cerrada, eso ... bueno, sí, estoy siendo ter ... OH NO ESTÁ DE VUELTA!
AAAAAAAHHHHHH !! [huye gritando, una vez más]

La teleconferencia todavía se acerca rápidamente.
De alguna manera se parece a Sir Lancyjohn Cleezewiz.
Ya casi está sobre ti.
> hey, date prisa! Tengo un experimento para probar contigo! (y un po-ta-to)

Puede encontrar una gran cantidad de información en línea sobre FP, naturalmente. Lo principal es comprender los conceptos básicos y luego aprender a aplicarlos. Por ejemplo, aprenda sobre la inmutabilidad y por qué es importante / útil para FP. Recomiendo aprender un poco de teoría para acompañar todo, como cómo la PF pura puede ser mucho más susceptible a la prueba formal. Esta fue una fuerza impulsora detrás del progenitor de F #, ML. YMMV, por supuesto, puede ser alguien aburrido hasta las lágrimas, en cuyo caso, muchos ejemplos, muchos ensayos y errores para ver exactamente por qué las técnicas utilizadas son lo que son, lo ayudarán a tener ese '¡Ajá!' momento de bombilla.

Entonces, lo dejaré así por ahora. Espero que esto sea de alguna utilidad para alguien. Quería aprender un poco más sobre cosas específicas para aprender, pero por el momento no tengo tiempo. Espero encontrar algo de tiempo para volver pronto, aunque parece ser una semana larga para mí, por lo que probablemente será al menos el fin de semana.

<3 "Presentamos GRUEBOL, un recurso provisional; solo hasta que SnozzML haya terminado. Debería ser pronto; un gran comité me ayudó esta vez". --Grace Hopperwit Egghead, Famosas últimas palabras , XX97 GUE <3

shelleybutterfly
fuente
¿Qué es "querido SO"?
mosquito
fue querido desbordamiento de pila; se supone que coincide con la cadencia de la canción 'Hay un agujero en el cubo' xD
shelleybutterfly
cuando se publica fuera de SO, esto parece hacer que sus puntos sean más difíciles de entender; considere editar para tener en cuenta eso
mosquito
derp! Sí, de hecho, lo he hecho. tyvm. :)
shelleybutterfly
si alguien tiene sugerencias sobre cómo mejorar mi respuesta, lo agradecería ... ¿fue de mal humor? o mal consejo? en realidad está basado en mi experiencia, así que me complace modificarlo si puedo hacerlo más útil. gracias;)
shelleybutterfly