2010-11-20 21 views
40

Soy un gran admirador de Scala desde el punto de vista estético, y de gran parte del trabajo conceptual puesto en cosas como su sistema de tipeo y bibliotecas.¿Ser un programador de scala competente requiere que seas un programador competente de Java?

Sin embargo, como he empezado a jugar con Scala (y he visto a algunos de mis compañeros de trabajo juguetear con él) me encuentro teniendo que buscar más y más conocimiento de Java (especialmente en el camino de las bibliotecas).

Esto me presenta algunos problemas:

  • Como nunca ha habido un programador de Java, no estoy familiarizado o cómodo con la biblioteca estándar de Java, o bibliotecas populares adicionales (como Apache Commons).
  • Mi google-fu en Java-sphere es débil. Es difícil saber qué buscar, un problema que se ve exacerbado por la gran cantidad de tutoriales java irrelevantes o rudimentarios para programar a los novatos.

En este momento, no estoy seguro de si debo ir al grano y tratar de encontrar la ruta más rápida y completa a través de Java para ponerme al día con los 20 años de desarrollos Java, o si es razonable Continúo tratando de parchear gradualmente mi conocimiento mientras deambulo por Scala.

Cualquier sabiduría que scala heads entre nosotros podría ofrecer sería muy apreciada.

P.S. No tengo dudas sobre mi capacidad para familiarizarme con la sintaxis de Scala, y me siento perfectamente cómodo y satisfecho con la programación funcional y los paradigmas en la comunidad scala. Pero la competencia de un programador no se basa únicamente en la capacidad de uno mismo para aprender, sino también en la capacidad de aprender y adoptar herramientas y habilidades de otras personas.

+5

* No *, me imagino que se podría aprender/usar/escribir Scala sin tocar Java en absoluto, pero ... hay cosas que puedo pensar por qué sería bueno "saber" Java: 1) Cómo crear objetos "utilizables" desde Java (si es necesario) 2) Aprovechar la API de Java sin una interfaz o reemplazo específico de Scala (pero un javadoc lo ayudará a superar esto) 3) Detalles más precisos de la semántica de bloqueo de JVM 4) Aunque cada vez es menos, cómo trabajar con las herramientas del "Ecosistema Java" como Ant/Maven/etc. - entonces ** solo hazlo ya **: p http://scala-lang.org enumera una cantidad de publicaciones. –

+0

Seguro que ayuda. –

+1

La primera vez que leí una publicación en SO con grandes palabras en inglés. :) –

Respuesta

26

Debe tomar un enfoque lazy para aprender Java. Aprende cuando lo necesites.

En mi opinión, gran parte del conocimiento antiguo de Java está desactualizado, muchos de los nuevos tutoriales son redundantes. Ciertamente no quiere molestarse con el anticuado Collections de Java, por ejemplo. Muchos marcos basados ​​en Java se pueden ignorar de forma segura. Y la pila pesada de JavaEE se puede evitar de forma segura hasta que se haya visto obligado a usar una parte de ella.

Muchos patrones comunes en Java son mucho más simples en Scala, con el primero cargando con muchos códigos repetitivos. La lógica central siempre debe implementarse en Scala. Creo que puede hacer la mayor parte de su trabajo directamente en Scala y solo necesita profundizar en Java cuando crea cosas como Swing o integrarse con Spring, etc.

Con respecto a la elección y uso de bibliotecas Java, mis directrices personales son:

  1. Si la primavera puede hacerlo, utilice la primavera
  2. Si la primavera es demasiado pesado, utilizar lo que utiliza Spring.
  3. Si la primavera no puede hacerlo, compruebe github proyecta
  4. Si no hay nada en github, comprobar Apache proyecta
  5. Si no hay nada de Apache, comprobar SourceForge (t).
  6. Finalmente, Google aleatoriamente o simplemente contruya usted mismo.

Eso es un poco exagerado, pero es la impresión que tengo sobre la madurez y la estabilidad de las bibliotecas de terceros después de haber hecho Java durante los últimos 12 años.

+8

No estoy seguro de por qué coloreas las 'Colecciones' de Java como" anticuadas ". Son estructuras de datos fundamentales, y aún se actualizan cuando es necesario (lo que no debería ser frecuente). 'Vector' y' Stack' otoh podrían llamarse anticuados. – erjiang

+2

¿Por qué buscar github primero? Buscaría Apache primero, ya que han sido los "padres" de construir bibliotecas/proyectos en Java. Muchas bibliotecas constan, al menos, de 1 biblioteca Apache. –

+1

@TEG es suficiente! Es solo mi opinión. @erijiang Los llamo anticuados porque tienen solo una fracción de la utilidad de las colecciones de Scala. De hecho, para mí, la programación con las colecciones de Scala fue un nuevo paradigma maravilloso para mí (y para muchos otros también, sospecho). – Synesso

8

Depende completamente de su definición de "Programador competente de Java".

Una buena comprensión del modelo de memoria de Java y las estrategias de recolección de basura ayudarán. Al igual que la experiencia con una amplia gama de bibliotecas de 3ra parte.

Por otro lado ... si está profundamente adoctrinado en la inyección de dependencia getter/setter usada por bibliotecas como Spring, entonces tendrá que desaprender muchos malos hábitos antes de poder manejar la inmutabilidad En este caso, la exposición previa a Java probablemente lo obstaculizará en el aprendizaje de Scala.

13

Si quieres aprender español, comienza a aprender español, no en latín. Lo mismo para lenguajes de programación. Hay dos cosas de Java que es bueno saber:

Lo primero son las API. Pero solo necesita una descripción general de lo que existe. Incluso los programadores de Java de mucho tiempo no conocen todos los detalles. Y encontrar la API o lib adecuada para un problema suele ser fácil, ya que Java es muy común, e incluso con Google Fu débil, no debería haber ningún problema.

Lo segundo que necesita saber son algunos principios básicos y limitaciones de Java y la JVM (que incluyen cómo construir y ejecutar), que lo ayudan a comprender algunos de los problemas y decisiones de diseño de Scala. Un ejemplo típico sería "borrado de tipo": si no entiende esta limitación de los genéricos de Java, tendrá problemas al usar genéricos en Scala.

Como puede ver, las cosas que realmente necesita saber son limitadas. Todo lo demás puede ser recogido en el camino.

+0

Irónicamente, tomé latín en la escuela secundaria, así que tal vez esa no sea la mejor analogía, en eso creo que saber latín ha sido útil para mi vida en una variedad de formas. ;) Dicho esto, he estado convencido de que debería seguir avanzando en Scala en lugar de desviarme a través de Java. Aún tengo curiosidad por lo que la gente piensa que es necesario saber de Java. (Buscaré borrado de tipo) Gracias :) – knowtheory

8

Hay un montón de gente que viene a Scala y clojure de rubí/Python, Lisp/esquema, C#, que tienen que recoger en:

primitivas, autoboxing opciones de inicio

JVM, cómo hotspot obras , 32 vs. 64 bit, usa openJDK?

puntos de referencia, creación de perfiles, cómo leer stacktraces;

trillones de pruebas de prueba para cada necesidad concebible.

java.util.concurrent

llamadas API Swing; Classpath; Maven, hormiga; Hudson, Interfaces

espacios de nombres/packages/distribución de directorios, y todas las otras cosas automatizados por:

IntelliJ, NetBean o eclipsar


http://news.ycombinator.com/item?id=1508609

http://www.mired.org/home/mwm/papers/simple-clojure.html

+ UseConcMarkSweepGC -XX: + CMSIncrementalMode -XX :, EscapeAnalysis, etc. http://groups.google.com/group/clojure/browse_frm/thread/c8f69037b26e2856#

comprimido vaya, http://blog.juma.me.uk/2009/10/26/new-jvm-options-and-scala-iteration-performance/

http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

http://groups.google.com/group/jvm-languages/topics

Java for Clojure users

Learning Clojure - What should I know about Java and more

http://copperthoughts.com/p/clojurists-guide-to-java/

+2

Ah, esto es útil. Entonces, ¿por qué debería saber java.util.concurrent sobre scala's actor libs? El conocimiento de la JVM es algo que trato de entender, y todas las opciones de magia y arranque de classpath. Por último, soy absolutamente alérgico a IDEs complicados. Si no puedo entender lo que hace al cargarlo en un REPL y pincharlo con un stick, o escribir pruebas de script aisladas, me preocupo. – knowtheory

+1

@knowtheory, creo que si está trabajando en aplicaciones de mensajería o de subprocesos, debería estar familiarizado con los actores scala y akka, j.u.c, STM en clojure y haskell, procesos de erlang y zeroMQ. Y cómo está evolucionando el marco asincrónico C#/F # (del que no sé mucho) y node.js, solo para el heckuvit. –

+0

@knowtheory: IDE no le exige que use ninguna característica, solo la que comprenda/me guste. Para IDEA, al menos, es posible que tenga que volver a configurar el montón y el permgen (arriba, obviamente) y posiblemente voltear a la JVM de 32 bits para que ejecute repo grande como la elevación, pero funciona bastante bien. Y hay una gran cantidad de blogs y actividades de la lista: http://www.delicious.com/tag/scala+intellij; http://dir.gmane.org/gmane.comp.lang.scala.tools –

Cuestiones relacionadas