Tengo 6 años de experiencia profesional en Java y Objective-C. Encuentro a Scala extremadamente difícil de aprender. ¿Es normal? ¿Qué tengo que hacer?

Es normal.

Hay varias cosas que puedes hacer. Leer un libro, por supuesto. En la actualidad, el libro de Odersky está bastante desactualizado (no refleja 2.11), pero hay otros libros que cubren al menos 2.10. Uno de mis favoritos es la programación funcional en Scala por Chiusano y Bjarnason. Realmente te ayudará a comprender los patrones de programación funcional, aunque no será una lectura fácil. Y no le ayudará si desea buscar una sintaxis particular mucho.

Luego, por supuesto, está el ciclo simple de intentarlo y ver. Tan pronto como reciba un error de compilación (por ejemplo, un pequeño garabato rojo en Eclipse), si no puede resolverlo rellenando toda la información de tipo que conoce (o espera), o experimentando con el REPL, luego busque el error en Stack Overflow (o en otro lugar). Encontrará que muchas personas han encontrado su problema antes que usted.

Una vez que tenga algo de compilación, generalmente hará lo que espera (al menos más que en muchos otros idiomas).

De acuerdo con mi experiencia, no tengo muchos años de experiencia en programación, aunque he aprendido (muy poco) sobre Java, Objective-C y algo similar a Scala (en algunos lados de la vista) – OCalm. Así que lo aclararé y espero que puedan encontrar útiles mis consejos, aunque sea un poco.

Eres un programador experimentado. Por supuesto que sabía demasiado bien cómo abordar un nuevo idioma, ¿no es así? Pero después de intentarlo, todavía le resulta difícil aprender, creo que la razón podría ser la siguiente.

C, C ++, Objective-C, Java, … así como muchos lenguajes (que es muy probable que se usen en la programación comercial, de manera interesante) son lenguajes funcionales . Cuando trabajas con ellos, has desarrollado una forma de pensar / resolver así: “Debo GUIAR al equipo para que construya mis cosas”.

Scala, OCalm y muchos, muchos idiomas que casi cualquiera sorprenderá al escuchar su nombre (y luego preguntarse si existen), son idiomas declarativos . Al igual que trabajar con un cuchillo es necesario tener su asa, aprender estos idiomas también modificó su mentalidad central para convertirse en “Debo DESCRIBIR en la computadora lo que quiero que construya”.

Y debido a esta razón principal, si un programador alguna vez tuvo un nivel más alto en el uso de un lenguaje funcional, ¡es muy probable que le resulte más difícil aprender un lenguaje declarativo!

En realidad, tiene sentido, de hecho: cuando estés demasiado familiarizado con el calor, tu adaptación al frío disminuirá; cuando te gusta actuar rápido, es difícil forzarte a hacer las cosas con lentitud y calma … Así es como funciona la naturaleza.

Entonces, lo que debe hacer es olvidarse completamente de lo que ha aprendido, quiero decir, qué soluciones y estrategias en la programación funcional que ha aprendido.

Olvídalos a todos, y comienza de nuevo las cosas. Deje que los tutoriales más sencillos de Scala le muestren cómo realizar tareas estúpidamente simples como: más 2 números, más 3 números más N números, ordenar una matriz de 2 elementos, ordenar una matriz de 3 elementos, ordenar una matriz de N elementos, … Y debes hacerlo con entusiasmo, curiosidad, como tomar tus primeras lecciones sobre programación. Se paciente. Hace como 6 años, cuando todavía no te has convertido en un programador demasiado bueno en esos lenguajes funcionales: Java y Objective-C.

Eso es lo que me enseñó mi profesor de CS cuando tomamos el curso de OCalm hace 2 años.

Sí, es normal, al igual que aprender otro idioma como el alemán o el español es difícil.

La buena noticia es que para hablar un idioma, no es necesario hablarlo con fluidez. Solo necesitas lo suficiente para sobrevivir. No necesita conocer todos los detalles de la programación funcional para aprender Scala, solo necesita saber cómo hacer un método y ejecutar el flujo de control, y poder captar cosas a medida que usa el lenguaje.

IntelliJ IDEA con el complemento de Scala lo hace muy fácil. Aprendí Scala escribiendo código Java, luego convirtiéndolo a Scala en IntelliJ usando Ctrl-Alt-G, incluso si estaba completamente atascado con cosas aparentemente obvias (¿cómo hago una instancia de? ¿Cómo puedo elegir a una clase?) retrocede a Java y usa la conversión para ver lo que hizo.

En estos días, usar el complemento de Scala es aún más fácil, ya que detectará patrones comunes y sugerirá el idioma de Scala para convertir (es decir, map / getOrElse sugerirá pliegue). Esta es una buena manera de obtener pequeños consejos aquí y allá hasta que se sienta más cómodo con el lenguaje en general.

Creo que es completamente normal.

He estado desarrollando bajo un enfoque de procedimiento y orientado a objetos durante 20 años, principalmente utilizando Java, VB y C #. Mi mente de inmediato descompone los problemas en objetos, y piensa en términos de cómo representar y manipular el estado como parte de una clase / objeto. Esto casi me hizo “más difícil” aprender a usar Scala como un lenguaje funcional.

Cuando aprendo un nuevo idioma, tiendo a crear una calculadora RPN [Notación polaca inversa] para permitirme aprender el idioma.

Creé una calculadora RPN varias veces con Scala [https://github.com/jasonray/RPN-…]. He revisado esto varias veces a lo largo de los años. Lo que noté es que la primera vez que re-creé la calculadora RPN en un enfoque muy OO, casi un puerto directo desde Java. Después de tomar un curso en línea de Scala [https://www.coursera.org/course/…], aprendí sobre la mecánica de Scala y volví a visitar la calculadora RPN, actualizándola para aprovechar la naturaleza concisa del lenguaje. . Unos años más tarde, retomé la clase y finalmente comencé a comprender el concepto de un lenguaje funcional, y finalmente lo actualicé para reflejar un enfoque funcional.

El punto es que me tomó varios años de juego para finalmente comprender por qué este lenguaje era más que una sintaxis diferente en la parte superior de la JVM. Y todavía no tengo idea de cómo haría muchas aplicaciones de tipo empresarial que hago fácilmente en Java.

Es normal. Todos tenemos talentos y si uno tiene talento para lenguajes como Java o Objective-C, no es necesario que tenga el mismo talento en un lenguaje muy diferente, como APL o Scala mencionado.
¿Qué debes hacer? Si quieres aprender un nuevo lenguaje de programación y Scala parece demasiado difícil, cambia el idioma. Su tiempo es valioso, así que lo gasta en algo que valga la pena.