En esta respuesta me centraré en el aspecto de pasar a un lenguaje funcional y sentirme cómodo con los diferentes estilos de programación. Mi forma personal fue a través de Groovy. Lo explicaré más adelante y obtendré algunos consejos prácticos que me ayudaron, pero primero un poco de historia.
De vuelta en la universidad, había tomado un curso sobre programación funcional donde Haskell era el idioma principal que se enseñaba. Pero en ese momento lo encontré demasiado abstracto y no tuve la experiencia como programador para emitir juicios sobre los beneficios declarados de productividad, corrección, concisión, etc.
Después de trabajar profesionalmente como ingeniero de software durante tres años, todos con programación imperativa, principalmente Java, y habiendo leído muchos de los libros clásicos de mejores prácticas (tío Bob, etc.), había desarrollado un estilo de codificación que favorecía enormemente la inmutabilidad y la reducción de los efectos secundarios a la menor cantidad de lugares posibles porque la literatura y la experiencia me han demostrado los beneficios evidentes de seguir ese estilo.
Esto fue cuando las características funcionales de Java 8 comenzaron a ser realmente promocionadas. Y para mí, se sentían tan hinchados como el resto de la lengua. Al mismo tiempo, comencé a leer mucho sobre Groovy, que tenía la mayoría de las mismas características funcionales por un tiempo, aunque por supuesto con las diferencias en las que incurriría la naturaleza dinámica del lenguaje.
- ¿Cuáles son algunas técnicas para el aprendizaje efectivo en la mediana edad?
- ¿Qué deben saber todos sobre la semiótica?
- ¿Puede una persona con bastante tiempo libre aprender matemáticas de la escuela secundaria de geometría a cálculo en 6 meses?
- ¿Cuál es la mejor manera de enseñarte rock piano?
- ¿Cómo afinar una guitarra para soltar c?
Más tarde, ese mismo año, me asignaron un proyecto de campo verde en el que se nos alentó a utilizar Groovy como idioma principal, por lo que tuve la oportunidad de familiarizarme con las funciones funcionales.
Al aprender programación funcional, me pareció muy valioso tener la libertad de elegir y elegir las características del lenguaje. Cuando la presión del tiempo era baja, podía tomarme un tiempo adicional para explorar soluciones funcionales para mis problemas. Cuando la presión del tiempo era alta, siempre podía recurrir a cualquier enfoque que conociera bien y sentí que haría el trabajo de manera oportuna. De esta manera me mantuve productivo mientras seguía aprendiendo.
Por lo tanto, si desea ser bueno en la programación funcional sin dejar de ser productivo, le recomendaría:
- Elija un idioma en el que pueda aprender rápidamente o ya sepa cómo resolver la mayoría de los problemas, donde tenga una buena comprensión de las bibliotecas de idiomas y las API, y donde pueda agregar usos del estilo funcional gradualmente en lugares donde vea inmediatamente un beneficio y obtenga cómodo con el tiempo
- Comenzando con el uso de algunas de las funciones simples de orden superior como mapear y fold (llamada inyectar en Groovy). Conócelos bastante bien, y de repente comenzarás a anticipar instintivamente algunas de sus funciones familiares de orden superior.
El resto de la historia:
Después de haber usado Groovy en un estilo funcional durante algunos meses, tuve ganas de volver a aprender Haskell de manera adecuada y, lo que es más importante, de comprender qué es una mónada.
Así que empecé a tomar el Learn You a Haskell for Great Good! Tutorial online en mi tiempo libre. Y después de un par de semanas, podría anunciar con orgullo a mis colegas que ahora realmente sabía qué es una mónada. Y un funtor.
Cambié de trabajo hace unos cuatro meses. Me contrataron para mis habilidades de Java, pero mi actividad principal sería el desarrollo de Scala. Así que, naturalmente, tuve la oportunidad de aprender Scala, y para mi gran sorpresa, en muchos sentidos, la sintaxis y la estructura, para mí, era como si Groovy y Haskell se hubieran fusionado (en realidad sé que es Java en lugar de Groovy).
Me siento como en casa en Scala. Como lenguaje orientado a objetos, puede ser más elegante y flexible que Java, tiene colecciones realmente agradables que siempre parecen tener métodos de “utilidad” convenientes para hacer cosas comunes como reducir a una cadena o encontrar entradas únicas en una lista, para que usted pueda No hay que reinventar el plato hondo. Algo así como Groovy, pero estáticamente tipado. Y tiene muchas mónadas, funciones de orden superior, comparación de patrones y otras bondades funcionales de Haskell. No puedes ser tan abstracto en Scala, pero me encuentro dispuesto a renunciar a eso para obtener las fortalezas de composición y reutilización orientadas a objetos.
Así que en conclusión, da pequeños pasos y ve si te gusta el camino en el que te encuentras. Sé que lo hice.