Cómo aprender un nuevo lenguaje de programación como Scala mientras se mantiene productivo

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.

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.

Todo se reduce a la pasión. Aprendes a hacer tiempo para aprender nuevos idiomas al tomar parte de tu tiempo personal para eso. Si no tiene la pasión de renunciar a parte de su tiempo de recuperación, el único otro medio sería dejar que su trabajo sufra (lo que puede permitir su empleador si lo piensa en términos de “capacitación”).

Por lo general, aunque (especialmente con la programación) se asume que usted mejorará su “educación” y / o conocimiento por su cuenta, excepto si su trabajo requiere algunas habilidades especializadas que no se consideran necesariamente un requisito previo para obtener el trabajo.

Si eres tu “jefe”, mira la primera declaración. Solo que aquí también se aplica a cuánto tiempo crees que eres capaz de sacrificar de tu trabajo productivo.

Personalmente, reservé un poco de mi propio tiempo (al menos al principio) hasta que entendí esta palabra “funky” FP “zumbido”. Especialmente si no tengo muchas pruebas de que pagará dividendos en el futuro, y ni yo (ni nadie más) que le diga que FP es “excelente” significa casi nada: solo la experiencia de primera mano puede decirle realmente si es parejo. Útil en tu escenario (no importa si es necesario). Entonces, solo una vez que vea alguna influencia positiva, comenzaré a dejar que penetre en mi tiempo productivo (si es empleado por mi cuenta) o empezar a insinuar al jefe sobre tal o cual cosa.

Realmente no hay razón para hacerlo. Utilice lo que se requiere para el proyecto por aquellos que determinan las especificaciones y los requisitos. La programación funcional es más lenta y menos robusta, ya que puede optimizarse y no es posible detectar y responder a las condiciones de error también. La programación funcional nunca es la primera opción, y siempre es dictada por los requisitos o por la necesidad de manipulación remota. Si lo necesitas, lo aprendes según sea necesario.

C ++ es compatible con todo tipo de paradigma de programación imaginable hoy. Python puede hacer lo mismo, así como JavaScript, supongo.

Si realmente quieres probar un lenguaje puramente funcional, sería mejor utilizar SML o Haskell.