Java funciona en muchas plataformas de PC. Cuando lo escribas una vez, se ejecutará en todas las PC. ¿Cuáles son algunos de los programas creados en Java? ¿Por qué las personas se dirigen a C ++, C # y Visual Basic? ¿Por qué algunos programadores odian Java?

Otra razón por la que la gente odia a Java es el hecho de que se ha convertido en parte de The Establishment del mundo de la informática, y mucha gente siempre odia a The Establishment.

Pero desde mi perspectiva como alguien que enseña Java a principiantes, veo algunas otras deficiencias que otros no han señalado. Básicamente, Java comenzó como una versión más simple de C ++, pero aún es demasiado complejo; hay demasiados “bordes afilados”. Aquí hay algunas de las cosas que me molestan a mí y a muchos de mis estudiantes (todas son pequeñas, la mayoría no son exclusivas de Java, pero aún así suman una gran cantidad de complejidad innecesaria):

Los tipos primitivos no son clases y las operaciones primitivas no son métodos. Java insiste en que los operadores trabajan solo en tipos primitivos y los métodos funcionan solo en objetos. Bueno, excepto + trabaja en cuerdas. Pero aparte de eso, debes usar métodos para trabajar en objetos. Por ejemplo, usas .equals para comparar dos objetos para la igualdad. Bueno, excepto que usas == para comparar objetos a cero. Esto también significa que Java necesita clases de envoltura, ya que necesita un lugar para definir operaciones en tipos como enteros y caracteres. Por lo tanto, si desea obtener una representación de cadena de cualquier cosa, envíe un mensaje toString sin argumentos. Por ejemplo, para convertir una variable x en una cadena, debes hacer x.toString (). Excepto si es un tipo primitivo, entonces tiene que usar el método estático toString en la clase envoltura correspondiente, por ejemplo, Double.toString (x). Cada tipo primitivo tiene una clase envoltura correspondiente con el mismo nombre, pero en mayúscula. Excepto por int y char, cuyas clases de envoltura se llaman Integer y Character, sin ninguna buena razón que pueda imaginar.

Arrays . Algunos de los mismos problemas afectan a las matrices, por ejemplo, no tienen métodos. Bueno, excepto por la longitud. Es como un método para matrices, excepto que no tiene paréntesis. Así que supongo que es una variable de instancia, excepto que no se le puede asignar.

Métodos estáticos. Java intenta ser un lenguaje estrictamente OO (pero falla; vea los puntos anteriores), por lo que cada método debe ser parte de alguna clase y cada mensaje debe enviarse a algún objeto. Pero, ¿y si realmente no hay ningún objeto para enviar el mensaje? Entonces el método debería ser estático, lo que realmente significa que no está orientado a objetos en absoluto, es básicamente un procedimiento. Los estudiantes a menudo crean instancias de una clase sin datos para que puedan enviar mensajes, cuando realmente quieren un método estático.

Esta. Cada otro dato que pase a un método tiene un nombre de parámetro formal que puede usar para acceder a él. ¿Por qué no hacer lo mismo con el objeto que recibe el mensaje, en lugar de crear la necesidad de una palabra clave especial ‘this’? Los estudiantes también se confunden de que una expresión foo es equivalente a this.foo (refiriéndose a la variable de instancia foo), excepto si también hay una variable local o parámetro llamado foo, en cuyo caso foo se refiere a eso.

Fugas de privacidad. Si su clase tiene una variable de instancia de tipo primitivo, puede hacerla privada y asegurarse de que ninguna otra clase puede modificar ese valor sin pasar por sus métodos; Tu clase tiene el control. Pero si la variable de instancia contiene un objeto, hacerlo privado no es suficiente. Si su clase pasa ese objeto a un método en otra clase, o lo devuelve como resultado de un método (por ejemplo, un descriptor de acceso), o almacena un objeto recibido de otra clase en esa variable de instancia, entonces el código fuera de su clase puede modificar ese objeto, evitando cualquier protección que su código implemente. El libro de texto que uso, Absolute Java, de Savitch, llama a esto una fuga de privacidad. Paso una buena media hora cada semestre explicando este problema y cómo evitarlo, y todavía una fracción significativa de mis alumnos no lo entienden.

Implementación de Java de genéricos. Los genéricos son geniales, pero la implementación de Java elimina la información de parámetros de tipo en tiempo de compilación, por lo que ciertas operaciones significativas y útiles simplemente no funcionan. Por ejemplo, no puede crear una matriz de objetos del tipo paramétrico de la forma que esperaría; Tienes que hacer algunas operaciones extrañas que involucran la reflexión.

Nulo. El error de mil millones de dólares de Tony Hoare. Debe verificar todo para asegurarse de que no sea nulo antes de enviar un mensaje o acceder a sus variables de instancia. Esto es a menudo descuidado. Pero incluso si pone los cheques, solo exponen el hecho de que un valor es nulo cuando no debería haber sido, no de dónde vino realmente el valor nulo.

Métodos estándar no genéricos. El método equals es una molestia de implementar, y debe implementarse por separado para cada tipo. E incluso si se implementa correctamente, los errores de tipo solo se detectan en tiempo de ejecución. Lo que es más, no hay error si se usa sin ser implementado adecuadamente; simplemente hace lo incorrectamente. Como señaló Marco Faella, compareTo es ahora un método genérico, por lo que la comprobación de tipos es mejor (pero aún debe implementarlo usted mismo, sin ayuda del lenguaje).

Copiar constructores contra el método de clonación. ¿Cuál es la forma correcta de hacer una copia de un objeto? Resulta que, tampoco está del todo bien. Y nuevamente, si no implementas cuidadosamente el clon para tu clase, se puede usar pero no funcionará correctamente.

Guía de Java

Videos paso a paso de Java – YouTube

No es un lenguaje terrible, pero tampoco es genial. Hay tantos mejores idiomas por ahí. Si quieres trabajar estrechamente con el hardware o administrar la memoria, querrás usar C. Si quieres un lenguaje de nivel superior, tienes Clojure o Haskell o Python. El número de casos de uso en los que un científico informático serio preferiría Java como herramienta de acceso es distinto de cero pero muy pequeño. Tienes que estirar tu cerebro para llegar a uno. ¿Con qué frecuencia una persona desea ejecutar en la JVM (o en cualquier máquina virtual recolectada con basura) pero no usa un lenguaje de alto nivel? Casi nunca.

Java es la lengua franca de la programación mediocre corporativa. (Eso no quiere decir que todo lo que se hace en Java sea basura corporativa. La gente elige los idiomas según múltiples criterios y hay algunos casos en los que Java gana, como el desarrollo de Android). Sin embargo, hay muchos gerentes que insisten en solo permitir Java en producción, y muchos programadores mediocres a mierda que se niegan a aprender otro idioma, y ​​ambos conjuntos de malhechores se habilitan mutuamente en un ouroboros de Stupid.

Las decisiones en la JVM también han fomentado el Culto de los Estúpidos. Vea, la Filosofía de Unix surgió en los Laboratorios Bell y, si bien no está bien en todo y en todos los casos, el principio de que los programas deben ser pequeños y hacer una cosa bien es acertado. La relación programador-a-programa debe ser uno a muchos, no muchos a uno Con esto último, obtienes una política corporativa y una idiotez, y un código alarmantemente malo con las tonterías de FactoryVisitorFactory que hacen que una persona sensata quiera vomitar. Lectura adicional: Java Shop Politics.

La comunidad de Java parece, en general, tener una profunda falta de gusto como resultado de su uso en la programación corporativa de bajo nivel. Eso no es culpa de la JVM o de Sun. De hecho, Scala y Clojure se ejecutan en la JVM y tienen mejores comunidades (en el caso de Clojure, sustancialmente mejores) que Java.

Hay muchas, muchas razones por las que te puede gustar un idioma. Aquí hay algunos que me vinieron a la mente mientras escribía esta publicación:

  • Es expresivo : puedes escribir solo un pequeño código que hace muchas cosas útiles.
  • Es legible : el código que escribes generalmente es fácil de entender más tarde.
  • Es seguro : es difícil escribir un código incorrecto en el idioma.
  • Es flexible : te permite hacer lo que quieras, por lo que eres libre de hacer cosas inteligentes.
  • Es simple : presenta solo unos pocos conceptos y luego los usa una y otra vez de manera poderosa.
  • Es liviano : el código escrito en el lenguaje se ejecuta casi tan eficientemente como el código de ensamblaje perfectamente optimizado.
  • Es nativo : proporciona un fácil acceso a las API de la plataforma en la que se está ejecutando, de modo que su programa puede aprovechar fácilmente las características especiales de la plataforma y ser un “buen ciudadano” de la misma. *
  • Es independiente de la plataforma : abstrae los detalles de la computadora en la que se ejecuta, por lo que puede escribir para una computadora ideal “bien diseñada”, no cualquier sistema extravagante en el que finalmente termine su código.

Muchas de estas cualidades están en tensión con otras; por ejemplo, los lenguajes seguros son difíciles de hacer flexibles (que la flexibilidad podría ir mal), ligeros (los controles de seguridad dificultarán la eficiencia), los nativos (algunas API de la plataforma pueden requerir construcciones inseguras como punteros) o simples Por lo general, necesito conceptos adicionales para expresar qué operaciones son seguras y cuáles no. No es que sea imposible tener un lenguaje que sea seguro y flexible a la vez, sino que la forma más sencilla de obtener uno afectará al otro, por lo que los diseñadores de idiomas tendrán que sopesarlos cuidadosamente y, en ocasiones, obtener una poco inteligentes para que puedan tener ambos a la vez.

El problema con Java es básicamente que solo es realmente bueno en la independencia de la plataforma, y ​​eso no es realmente tan importante para la mayoría de los programas. Por lo general, tiene una idea del tipo de computadora en la que se ejecutará su programa **, por lo que muchos programadores elegirán un lenguaje que sea lo suficientemente independiente de la plataforma para satisfacer sus requisitos mientras que (en su opinión) son superiores en otras cualidades.


* Vale la pena tener en cuenta que algunas plataformas, sobre todo Android, utilizan un dialecto de Java como idioma nativo. Sin embargo, eso no significa que sus aplicaciones de Android se ejecutarán en cualquier lugar, usualmente utilizan API específicas para Android que no estarían presentes en una PC con Windows, una computadora portátil Mac o un servidor Unix.

** Y, fatalmente para Java, cuando no sabes en qué plataforma estarás ejecutando en el siglo XXI, normalmente escribes una aplicación web, lo que te obliga a usar HTML, CSS y Javascript. Como complemento, y a menudo plagado de problemas de seguridad, Java realmente no tiene mucho lugar en el lado del cliente de la web moderna.

Hay muchas quejas buenas aquí ya. Estoy particularmente de acuerdo con que Java sea detallado, y que su máquina virtual de gran peso sea lenta para iniciar.

Otra razón por la que la gente odia a Java es el hecho de que se ha convertido en parte de The Establishment del mundo de la informática, y mucha gente siempre odia a The Establishment.

Pero desde mi perspectiva como alguien que enseña Java a principiantes, veo algunas otras deficiencias que otros no han señalado. Básicamente, Java comenzó como una versión más simple de C ++, pero aún es demasiado complejo; hay demasiados “bordes afilados”. Aquí hay algunas de las cosas que me molestan a mí y a muchos de mis estudiantes (todas son pequeñas, la mayoría no son exclusivas de Java, pero aún así suman una gran cantidad de complejidad innecesaria):

  • Los tipos primitivos no son clases y las operaciones primitivas no son métodos. Java insiste en que los operadores trabajan solo en tipos primitivos y los métodos funcionan solo en objetos. Bueno, excepto + trabaja en cuerdas. Pero aparte de eso, debes usar métodos para trabajar en objetos. Por ejemplo, usas .equals para comparar dos objetos para la igualdad. Bueno, excepto que usas == para comparar objetos a cero. Esto también significa que Java necesita clases de envoltura, ya que necesita un lugar para definir operaciones en tipos como enteros y caracteres. Por lo tanto, si desea obtener una representación de cadena de cualquier cosa, envíe un mensaje toString sin argumentos. Por ejemplo, para convertir una variable x en una cadena, debes hacer x.toString (). Excepto si es un tipo primitivo, entonces tiene que usar el método estático toString en la clase envoltura correspondiente, por ejemplo, Double.toString (x). Cada tipo primitivo tiene una clase envoltura correspondiente con el mismo nombre, pero en mayúscula. Excepto por int y char, cuyas clases de envoltura se llaman Integer y Character, sin ninguna buena razón que pueda imaginar.
  • Arrays. Algunos de los mismos problemas afectan a las matrices, por ejemplo, no tienen métodos. Bueno, excepto por la longitud. Es como un método para matrices, excepto que no tiene paréntesis. Así que supongo que es una variable de instancia, excepto que no se le puede asignar.
  • Métodos estáticos. Java intenta ser un lenguaje estrictamente OO (pero falla; vea los puntos anteriores), por lo que cada método debe ser parte de alguna clase y cada mensaje debe enviarse a algún objeto. Pero, ¿y si realmente no hay ningún objeto para enviar el mensaje? Entonces el método debería ser estático, lo que realmente significa que no está orientado a objetos en absoluto, es básicamente un procedimiento. Los estudiantes a menudo crean instancias de una clase sin datos para que puedan enviar mensajes, cuando realmente quieren un método estático.
  • Esta. Cada otro dato que pase a un método tiene un nombre de parámetro formal que puede usar para acceder a él. ¿Por qué no hacer lo mismo con el objeto que recibe el mensaje, en lugar de crear la necesidad de una palabra clave especial ‘this’? Los estudiantes también se confunden de que una expresión foo es equivalente a this.foo (refiriéndose a la variable de instancia foo), excepto si también hay una variable local o parámetro llamado foo, en cuyo caso foo se refiere a eso.
  • Fugas de privacidad. Si su clase tiene una variable de instancia de tipo primitivo, puede hacerla privada y asegurarse de que ninguna otra clase puede modificar ese valor sin pasar por sus métodos; Tu clase tiene el control. Pero si la variable de instancia contiene un objeto, hacerlo privado no es suficiente. Si su clase pasa ese objeto a un método en otra clase, o lo devuelve como resultado de un método (por ejemplo, un descriptor de acceso), o almacena un objeto recibido de otra clase en esa variable de instancia, entonces el código fuera de su clase puede modificar ese objeto, evitando cualquier protección que su código implemente. El libro de texto que uso, Absolute Java , de Savitch, llama a esto una fuga de privacidad . Paso una buena media hora cada semestre explicando este problema y cómo evitarlo, y todavía una fracción significativa de mis alumnos no lo entienden.
  • Implementación de Java de genéricos. Los genéricos son geniales, pero la implementación de Java elimina la información de parámetros de tipo en tiempo de compilación, por lo que ciertas operaciones significativas y útiles simplemente no funcionan. Por ejemplo, no puede crear una matriz de objetos del tipo paramétrico de la forma que esperaría; Tienes que hacer algunas operaciones extrañas que involucran la reflexión.
  • Nulo. El error de mil millones de dólares de Tony Hoare. Debe verificar todo para asegurarse de que no sea nulo antes de enviar un mensaje o acceder a sus variables de instancia. Esto es a menudo descuidado. Pero incluso si pone los cheques, solo exponen el hecho de que un valor es nulo cuando no debería haber sido, no de dónde vino realmente el valor nulo.
  • Métodos estándar no genéricos. El método equals es una molestia de implementar, y debe implementarse por separado para cada tipo. E incluso si se implementa correctamente, los errores de tipo solo se detectan en tiempo de ejecución. Lo que es más, no hay error si se usa sin ser implementado adecuadamente; simplemente hace lo incorrectamente. Como señaló Marco Faella, compareTo es ahora un método genérico, por lo que la comprobación de tipos es mejor (pero aún debe implementarlo usted mismo, sin ayuda del lenguaje).
  • Copiar constructores contra el método de clonación. ¿Cuál es la forma correcta de hacer una copia de un objeto? Resulta que, tampoco está del todo bien. Y nuevamente, si no implementas cuidadosamente el clon para tu clase, se puede usar pero no funcionará correctamente.

Dos razones principales:

  • Es un lenguaje heredado que no ha sido extremadamente bien diseñado en sus primeras versiones, pero que ha apuntado desde el principio a un nivel muy alto de compatibilidad hacia atrás. Esta combinación hace que sea un lenguaje muy complejo, complicado y peculiar en la actualidad. No es tan malo como C ++, pero no es tan delgado como C # o Scala.

    Ej. Siga las discusiones sobre cómo se introdujeron los métodos genéricos o predeterminados … Definitivamente no cómo se habrían diseñado si se hubieran diseñado en un nuevo idioma.

  • Es un lenguaje increíblemente popular . La gente odia todo lo que es popular (MongoDB, MySQL, Java, Windows, Eclipse, presidentes de países, actores, grandes corporaciones, etc.). Verás, si eres un enemigo, quieres una audiencia. Y no obtienes una audiencia cuando odias algo extremadamente nicho. Como el lenguaje del olmo, por ejemplo. Así que es mejor que odies algo popular.

Respecto a tus preguntas: Hay que distinguir entre:

  • Personas que aman otros idiomas (son)
  • Personas que se dirigen a otros idiomas (no lo son)

Para poner las cosas en perspectiva, yo también soy un amante de Java. Java proporciona muchas cosas buenas. Independencia de la plataforma, orientación a objetos, paradigma maduro, patrones de diseño y muchos más.
Sin embargo, no siempre quieres eso. A veces buscas algo más. Tal vez estás renderizando algo en la pantalla y solo quieres que sea más rápido. Tal vez algo que no quieres ser independiente de la plataforma. En su lugar, desea que hable directamente a los niveles inferiores. Quieres hacer cosas más poderosas. Quieres hacer las cosas a un nivel diferente.
Por otro lado, es posible que desee que algo sea más polimórfico que Java. Tal vez usted quiera facilidad de desarrollo. Comprobación de reglas menos estricta, comportamiento más dinámico.
Tal vez lo que quieres hacer es mucho más específico. No es solo construir un software. Es probable que requiera que hagas algo con la minería de datos, por lo que necesitas un lenguaje creado para eso. Tal vez necesitas algo funcional y no procesal.
Finalmente, otra razón podría ser que tal vez lo que quieres construir necesita la coordinación de otra cosa que es otro idioma y también tiene más sentido que te adaptes. Tal vez lo que usted está construyendo será utilizado por otra persona para hacer su trabajo y no entienden Java.
A la pregunta de si algunas personas odian Java, bueno, a veces es una cuestión de nivel de comodidad. A alguien que haya hecho C ++ en todo su nivel no le gustará Java simplemente porque a nadie le gusta el cambio. Otra razón que se suele mencionar es que Java es demasiado detallado y las tareas simples requieren muchas líneas de código. Puedo o no estar de acuerdo con todo eso. Pero admito que viene con un poco de equipaje en términos de líneas de código para simplemente comenzar, tiempo de ejecución, tiempo de compilación, etc. y no es adecuado para aplicaciones muy pequeñas.

A mi científico informático interno le gusta Java porque la sintaxis es elegante y expresiva, y porque resuelve muchos de los problemas de C / C ++.

Mi administrador de sistemas interno odia a Java porque la promesa de escribir una vez, ejecutar en cualquier lugar no se materializa, al menos para aplicaciones científicas y de big data a gran escala. Además, el recolector de basura no siempre se ejecuta durante las tareas que requieren un uso intensivo de la CPU, lo que provoca pérdidas de memoria que no estaban en el código. Y, por último, tuve que hackear una JVM la última vez que intenté usar Java para hacer algo. como acceso simple a un puerto serie (aunque han pasado algunos años desde que lo intenté, por lo que podría ser mejor ahora).

Cuando estaba ejecutando un laboratorio de computación para estudiantes graduados en ingeniería (EE y aeroespacial), era común que tuviera hasta cuatro JVM pirateadas diferentes en el sistema para proporcionar compatibilidad de error por error y requisitos especiales para que mis investigadores y sus estudiantes podrían en realidad intentar trabajar un poco.

En general, pasé muchas horas hackeando JVM para hacer tareas básicas, horas de mi vida que nunca volveré a recuperar, porque el sistema de ejecución de Java es muy complejo.

Me gusta leer / escribir código Java. Pero ejecutar Java en la práctica, y en escala, puede volverse feo. Sin embargo, es mucho más fácil cuando el que escribió la aplicación está dispuesto a solucionarlo casi en tiempo real, por lo que estos problemas son menos graves en un entorno de devops.

No creo que Java sea un mal lenguaje. Si bien no es mi idioma favorito, tiene muy buenos casos de uso, resuelve problemas importantes y el sistema ecológico es increíble. En el mundo de los negocios no encontrará nada tan frecuente (a pesar de que, aparentemente, el código base de COBOL es aún más grande). Sin embargo, definitivamente tiene debilidades.

Ya mencionó la (no) portabilidad que no resulta ser tan grande en realidad (versiones, fabricantes, sistemas operativos). Luego está el hecho de que a menudo se escribe una gran cantidad de códigos de placas de calderas, por ejemplo, procesadores y fijadores que debe poner al frente (resuelto mejor en PyHO).

Java está destinado a liberarte de la administración de la memoria, pero luego crea sus propios dolores de cabeza. El consumo suele ser significativamente más alto que, por ejemplo, C, C ++, C #. GC es un poco impredecible y tiene el potencial de congelar tu aplicación por segundos. He hablado con mucha gente en las compañías java heavy, algunas incluso en mercados verticales de software de bolsa / finanzas, y todas tienen formas ingeniosas de evitarlo, desde reescribir el gc, apagarlo, cargar memoria en la máquina y reiniciarlo Una vez al día, forzándolo cuando pueden pagarlo, parcheando algo que es similar a un malloc, etc.

La creación de GUI, especialmente con una apariencia nativa, fue y, a veces, es una pita. Hay todo un zoológico de tecnologías para crearlas y, por lo general, son una combinación de difícil de usar, poco documentadas y de aspecto feo. Ha mejorado con JavaFX, solo desearía que hubiera estado allí unos años antes.

También hay una gran cantidad de código Java malo por ahí, lo que le da al lenguaje un representante mediocre. Esto se debe en parte al hecho de que es un lenguaje bastante fácil de aprender y que las universidades lo han adoptado como un idioma de enseñanza común, por lo que muchas personas de todos los niveles lo saben y todas producen código. Compara esto con Haskell, por ejemplo, y lo entenderás. Por otro lado, tampoco te obliga exactamente a escribir código bonito.

Recuerda que estas son solo algunas de las razones por las que a la gente no le gusta, seguro que tiene cualidades de rediseño y no, no considero ninguno de los tres idiomas que mencionas universalmente mejor … Dejándote con esto, me dirijo a hackear una aplicación Java. …

Sé que es un tema viejo, ¿aún puedo opinar?

Permítanme aclarar que he hecho años de Delphi, .NET y desarrollo web. Había usado Java ocasionalmente antes, pero en el último mes fui el único que construyó un servicio REST en Java.

Honestamente esperaba ser pan comido porque he realizado numerosos servicios web con C #; Sin embargo, nunca he estado tan mal.

Java, como lenguaje, es fundamentalmente el mismo para todos los demás idiomas; Sin embargo, no me gusta como lenguaje porque

– No hay conversión de nombres. Nunca se puede decir qué es una interfaz.

– usa la interfaz como acceso directo para acceder a la clase estática interna

– Tipo de interfaz especial con un “@”

esos son solo cosméticos, la parte más molesta de usar Java es: el ecosistema.

No puedo expresar cuánto lo odio.

Hay varias implementaciones de servidor, cuando se mezclan, las cosas son muy confusas. Para empeorar las cosas, a cada biblioteca no le importa lo que piensen otras bibliotecas, la diferencia en tal vez solo una versión menor arruinará todo el sistema.

Aquí hay un sitio web de ejemplos sobre el uso de JavaEE. Oh, estás usando TomEE 1.x, ninguno de esos ejemplos funciona, porque usan 6. Aquí hay un ejemplo de cómo hacer una cosa, ahora agrega 10 dependencias de Maven a tu proyecto. Una pequeña diferencia no importa, se construirá, pero también arrojará una excepción de tiempo de ejecución, que no le da ninguna pista de lo que está sucediendo.

Simplemente no entiendo por qué diablos no pueden decidirse a consolidar la documentación y la guía de integración.

Finalmente, es la comunidad de Java.

Realmente creo que hay muchas personas inteligentes en la comunidad de Java; desafortunadamente, no parecen ser un buen comunicador. Muchos tutoriales o blogs de Java nunca son lo suficientemente claros para decirte 3 cosas:

– qué sistema (servidor) utiliza este ejemplo

– Qué archivos de configuración son

– que biblioteca esta usando

Simplemente lanzan un código, o tal vez una línea de configuración, ¿esperan que todos los demás lo entiendan?

En .NET, no hay nada malo con la tecnología heredada. Si desea utilizar WinForm, una gran cantidad de materiales que encuentre en línea hoy todavía funcionará. Si quieres escribir SOAP WCF, no encontrarás demasiada sorpresa. El servidor lo acomodará muy bien. El sistema ecológico es claro y directo. Pero en Java, no, no puede simplemente conectar lo que quiera a una implementación de servidor. Y hay cientos de archivos de configuración diferentes.

No estoy en contra del lenguaje, estoy totalmente en contra del ecosistema. ¿Cómo puede alguien confiar en lo que sucederá en la implementación con semejante desorden?

Desde una perspectiva operativa –

Pasó mucho, mucho tiempo antes de que Java estuviera a la altura de la tripa de marketing de “escribir una vez, compilar en todas partes”. De hecho, fue “escribir una vez, depurar en todas partes” en las palabras de alguien cuyo nombre no puedo recordar. Java fue una plataforma para desarrollar aplicaciones que apestaban sin importar en qué las ejecutas. La ironía de la demanda de Sun contra Microsoft fue que MS estaba intentando que Java fuera realmente útil para al menos algunas personas.

Así que Java se ganó una muy mala reputación desde el principio.

Ahora el problema es un código malo. Mucho y mucho código mal. Los costosos y conocidos proveedores de SaaS mantienen disponibles las versiones anteriores de JRE para sus clientes porque a pesar de que Java es totalmente compatible con versiones anteriores, eso solo funciona cuando el código es sólido. He tenido que instalar versiones de JRE de 3 años en máquinas para hacer que las cosas funcionen.

Para mí, el prejuicio no es tanto contra las aplicaciones Java. Es más una preferencia por verdaderas aplicaciones independientes de hardware, por lo que no tengo que preocuparme por los problemas de compatibilidad del cliente.

Una aplicación Java probablemente no será la más rápida, ni la más eficiente, ni la más rica en funciones. Pero si se hace bien, soluciona el problema de la implementación en múltiples entornos de clientes.

Grandes respuestas. Me gustaría agregar que aún puede ser difícil sentir la adquisición de Sun por Oracle en 2009, finalizada en 2011.

Lo que sigue es mi opinión personal, basada en décadas de experiencia como DBA y programador. No interprete esto como un hecho.

Bajo Scott McNealy, Sun Microsystems llegó a simbolizar la libertad del bloqueo de los proveedores y los mercados abiertos. El software de escritura para computadoras Sun significaba que era fácilmente portátil. Sun incluso vendió / regaló una alternativa popular al software propietario de Microsoft Office que podría ejecutar en cualquier caso, StarOffice / OpenOffice. Fueron buenos tiempos. El sol animaba la competición. Que gane la mejor computadora y software.

Desafortunadamente para Sun, aunque tenían un buen software y hardware, no eran tan expertos en el mundo de las ventas de computadoras y software.

En lo que respecta a los sistemas propietarios, Oracle personificó la filosofía del monopolio. Eran lo suficientemente grandes para encontrar otras formas de aplastar la competencia que los productos de buena calidad. El trabajo realizado para crear, mantener, implementar Oracle DBMS fue de poca utilidad cuando se configuraron otros DBMS. La fuente y los métodos de Oracle fueron completamente cerrados. Llegaron tan lejos como para hacerse cargo de los DBMS de código abierto más exitosos, mySQL.

Para muchos, Oracle era el lado oscuro de la informática, y ahora eran propietarios de Java.

Alguien a quien respeto profundamente, alguien dijo que “Java tomó todas las características de C ++ que no necesito, y ninguna de las características que hago”. Tengo que decir, estoy de acuerdo con este 100%.

Hay muchas cosas en Java que simplemente no tienen sentido. Una de ellas es que todo se determina en tiempo de ejecución: ¿cuál es el tipo de este objeto? ¿Cómo se debería llamar cuando ejecuto este método? ¿Cuánto dura esta matriz? ¿Qué plantilla utiliza esta clase?

Esas cosas hacen que Java sea realmente ineficiente en comparación con C ++, y con frecuencia hace que las cosas en Java sean totalmente imposibles. Tomemos el sistema genérico de Java. Si tengo una clase de plantilla, ¿cómo puedo especificar una implementación predeterminada para un tipo específico? Dado que las plantillas se generan en tiempo de ejecución, en lugar de en tiempo de compilación, simplemente no hay forma.

Otra cosa que echo de menos en Java en comparación con C ++ es el soporte para Unions y bitfields. No dudo que pueda darse cuenta de por qué son importantes sin mucha explicación: hacen que el almacenamiento de datos que se determina dinámicamente sea mucho más sencillo.

No es que Java sea un mal lenguaje. Es simplemente que en muchos casos no es lo suficientemente bueno.

de https://www.whyihatejava.com

Basado en unos pocos días de programación en java.

  • cada vez que un método lanza una excepción, es necesario decorar el nombre del método con una cláusula Excepción
  • no var
  • no File.ReadAllText
  • no Path.ChangeExtension
  • no importa como [http://stackoverflow.com/questio…]
  • sin retorno de rendimiento [http://stackoverflow.com/questio…]
  • sin propiedades [http://stackoverflow.com/questio…]
  • no hay clase estática [http://stackoverflow.com/questions/1844355/java-static-class]
  • sin palabras clave de referencia y de salida [http://stackoverflow.com/questio…]
  • sin delegados [http://stackoverflow.com/questio…]
  • no hay métodos de extensión [Java equivalente a los métodos de extensión C #]
  • no LINQ [¿Cuál es el equivalente de Java para LINQ?]
  • no hay eventos
  • no es compatible con cadenas textuales de estilo C # que comiencen con @ [http://stackoverflow.com/questions/2673855/java-equivalent-of-cs-verbatim-strings-with]
  • no puede tener un método estático en una clase interna no estática [http://stackoverflow.com/questio…]
  • Los genéricos son una broma completa en comparación con C # [por ejemplo, obtener el tipo genérico de clase en tiempo de ejecución]
  • no es compatible con cadenas multilínea [cadena multilínea Java]
  • Buggy herramientas y ecosistema [por ejemplo, comportamiento de mediación de dependencia de Maven inesperado]
  • Esta es una página javadoc típica: BasicAWSCredentials (AWS SDK para Java

No tiene referencias ni detalles del artefacto que necesita para usar esta clase. Ahora compárelo con una página de documentación de C #: https://msdn.microsoft.com/en-us

En realidad, le indica qué biblioteca necesita para usar esta clase (Microsoft.WindowsAzure.Storage.dll).

El tema general que he sentido al usar Java y su ecosistema es que “obtienes lo que pagas” . Empeora porque no tiene que pagar para usar otro lenguaje de programación como C # que ahora también funciona con * nix y está a años luz de Java.

Creo que debido a que Java estaba tan bien diseñado y era fácil de aprender, ha estado plagado de estúpidos profesionales de software dogmático a los que les gusta llamarse programadores. Es equivalente a por qué M $ Windows está plagado de virus y OS X está relativamente libre de virus, es accesible y popular, por lo que obtiene una mala reputación porque es el más lento en la programación escuchada.

Java también ha sido la peor de los 14 años de dogmáticos “mejores prácticas” y marcos. Me mantuve alejado de la basura como EJBs, JAAS, bibliotecas de etiquetas, lenguajes de plantilla, ORM entidad-relación-infierno, y actualmente estoy evitando la broma que es OSGi. Estas son las atrocidades que le han dado a Java un mal nombre a lo largo de los años, pero tienen y finalmente morirán la muerte que merecen.

Java continuará. Java no necesita ser detallado, o lento si sabes cómo usarlo. Hay grandes frameworks de Java como Spring, Maven y JPA que compiten con cualquier otra característica del host de lenguajes de moda. La diferencia es que Java tiene los cimientos, las herramientas y la base de desarrolladores para superar estos otros lenguajes. Solo debe ser exigente al contratar programadores de Java y esperar rechazar el 9/10 en las entrevistas.

Realmente no es productivo odiar un lenguaje de programación, los que no desaparecen tienen algún motivo para existir, independientemente de cómo te sientas con respecto a ellos, y creo que objetar su uso por razones emocionales es una pérdida de tiempo.

Habiendo dicho eso, Java es en gran parte inútil para mí porque es una herramienta que te ayuda a escribir programas lentos, y más a menudo necesito herramientas para escribir programas rápidamente. Los pasos de la máquina virtual en el camino del control detallado del hardware (es por eso que existe), la administración automática de la memoria hace que sea difícil dar garantías de rendimiento, y pensé que el modelo de multihilo era algo torpe la última vez que lo probé.

A veces uso Java para escribir utilidades sin restricciones de rendimiento, cuando es conveniente aprovechar su colección masiva de bibliotecas. Está bien para eso, aunque tal vez un poco SyntaxProperty.setVerbosity(SyntaxProperty.Constants.ELABORATE) en la notación.

Cuando es necesario estimar con una precisión razonable qué porción del hardware disponible se usa para el cálculo significativo, necesita idiomas que lo expongan en lugar de ocultarlo en nombre de la portabilidad. Principalmente uso C para este propósito, pero cualquier cosa que permita una llamada a la función del sistema nativo servirá.

Sin embargo, no es realmente productivo amar a un lenguaje de programación, los que pierden su razón de existir desaparecen independientemente de cómo se sienten con respecto a ellos, y creo que abogar por su uso por razones emocionales es una pérdida de tiempo.

No odio Java el lenguaje + librería estándar. Contrariamente a lo que algunos creen, en cualquier aplicación que tenga un uso extenso de E / S, que requiera un cierto nivel de concurrencia y que no implique tareas de “uso intensivo de cálculo” (es decir, si desea multiplicar dos matrices juntas, Java probablemente no es lo que debe usar directamente), pero puede requerir muchas situaciones de persecución de punteros (arrastrarse a través de árboles, listas vinculadas, etc.), Java es simplemente GRANDE, y tan rápido como C ++ en las mismas situaciones. Debido a que la distribución regular de Java no ofrece garantías con respecto a la ejecución en tiempo real, está claro que realmente no puede escribir software de muy bajo nivel, pero está bien, porque no fue realmente diseñado para eso.
Mi único rencor con Java en sí es que puede ser muy detallado a veces (pero ha hecho muchos progresos a este respecto en los últimos 10 años).

Si todo está correctamente instalado para el programador de Java (servidor de aplicaciones, módulos, complementos, etc.), entonces Java no es mejor ni peor que otros entornos / lenguajes de programación.

Sin embargo, odio el ecosistema de Java y, en general, las herramientas “empresariales” que se crearon para él.

El truco “Escribir una vez, ejecutar en todas partes” es válido para programas triviales y un subconjunto de programas complejos. Tengo un fallo muy reciente con una pieza de software muy popular (es decir, hace 4 horas), Hadoop, donde la cosa se basa correctamente en sabores específicos de Linux pero no en otros (y sí, qué JVM usas, aunque solo uso oficialmente aprobados, puede importar).

Mi rencor con el entorno de desarrollo de Java es en realidad más sobre la necesidad de usar Ant (al principio), luego Maven (que puede estar llamando a Ant detrás de la escena), y luego sea cual sea el nuevo marco de compilación que necesitemos, el uso abrumador de XML para todo Básicamente, se requiere el uso de herramientas de terceros (o al menos un IDE como Eclipse o NetBeans) para configurar todo correctamente, mientras que muchos otros marcos proporcionan formas más simples de hacer lo mismo. El entorno de herramientas de Java se vuelve tan complejo muy rápidamente que tiene que usar herramientas automáticas y hambrientas de memoria para hacer incluso cosas simples.

La gente odia a Java por la misma razón por la que la gente odia a las Mac, es porque han decidido que esa es su opinión, y mientras más personas tienen una opinión, más emocionalmente conectados están con ella.

Creo que hay buenas razones para no gustar Java, a saber:

1) Las interfaces de usuario son difíciles de hacer que parezcan nativas en Mac. En realidad, es difícil hacer que se vean nativos en cualquier cosa, pero solo a los usuarios de Mac les importa. No digo que, como disidente para los usuarios de Mac o Windows, se puede ver desde el punto de vista que los usuarios de Windows no tienen ojo para el diseño, o se puede ver desde un punto de vista que los usuarios de Mac solo ven forma. , no funciona. De cualquier manera, a los usuarios de Mac no les gustan las IU no nativas.

2) Las herramientas de construcción son tremendamente complicadas, Gradle, Ant, ese tipo de cosas, son programas caóticos, histéricos, todo está mal. Han hecho algo simple en aproximadamente un millón de líneas de código, y logran casi nada.

3) La gente todavía piensa que Java es lento, palos de barro.

Pero también puedes amar a Java:

1) Si no eres un fanático de la UI, puedes crear aplicaciones que realmente se ejecuten en muchas plataformas diferentes.

2) El lenguaje es de primer nivel, está arriba con C #, es un lenguaje brillante. Las herramientas que lo rodean pueden ser dudosas, pero el lenguaje está entre los mejores.

3) JavaFX y FXML son excelentes, es una pena que no se vea de forma nativa en la Mac, o sería totalmente imbatible.

4) Es una forma fácil de programar en plataformas duras. El hecho de que Java esté disponible para mainframes de IBM, OS / 400, Solaris, cosas así, significa que puede escribir software empresarial sin sumergirse en lenguajes en los que no esté tan interesado, piense en PL / M, RPG o C.

Si solo quieres escribir para Windows, seguiría con C #, pero para las plataformas de servidores, Java es increíble, y si no estás preocupado por las interfaces de usuario nativas, también es genial.

Para el software escrito en Java, creo que el escritorio de Minecraft fue escrito en Java, aunque espero que eso cambie realmente rápido ahora que Microsoft lo posee.

Gracias por hacer una muy buena pregunta: al final del día, los idiomas son herramientas para que las personas puedan hacer su trabajo. Java es una herramienta que ayuda a muchas personas a realizar su trabajo (como la mayoría de los otros idiomas)

Cuando discutimos sobre cuál es bueno / malo / mediocre, discutimos sobre lo que valoramos (o lo que debería ser más valorado) en nuestras herramientas. Es evidente que siente que escribir una vez que se ejecuta en cualquier lugar es importante, pero para muchos de nosotros, eso no importa demasiado, ya que diseñamos software destinado a ejecutarse en una plataforma o en otra (en mi caso, Linux o Mac OS).

Por lo tanto, si no es tan importante escribir una vez, correr en cualquier lugar (o “escribir una vez, depurar en todas partes” como solíamos llamarlo), entonces otros factores entran en juego: cuán productivo puede ser en un idioma. Es en ese frente que la gente como yo comienza a encontrar Java en su mayoría como una herramienta mediocre, porque otras herramientas me ayudan a expresar mi intención de una manera mejor, más rápida, confiable y más creativa. (Vea otras respuestas como: ¿Por qué se considera aburrido Java? ¿Cuáles son las características de un lenguaje de programación divertido?)

Mi disgusto por Java se deriva del hecho de que no se está utilizando para lo que fue diseñado originalmente y es popular solo porque mucha gente “se subió al carro de Java” cuando fue sobrevalorada en los años 90. Al contrario de lo que dicen otros carteles (no fue diseñado como un mejor reemplazo para C ++), fue originalmente diseñado por Sun Microsystems en los años 90 para que * solo * fuera un lenguaje de sistemas incrustado que se ejecutara en procesadores Sun que tenían una forma de JVM incorporada en los chips del procesador (evidencia: DOS fue el primer O / S en el momento de la introducción de Java: ¿alguna vez escuché de un compilador de Java para DOS de ese período de tiempo? No lo he hecho). La prueba de que esta idea fracasó estrepitosamente es el hecho de que casi nadie ha oído hablar de estos “procesadores Java” (y nunca supe si los chips llegaron a la producción), y tampoco habría oído hablar de ellos si hubiera no estuve en una Conferencia de Sistemas Embebidos en los años 90 visitando el stand de Sun donde estaban presentando Java (y donde también recogí algunas tazas de café Sun Java). Me quedé con el desarrollo integrado, pero obviamente Java no lo hizo y finalmente encontró un hogar como un lenguaje para la web, un uso para el que no estaba destinado originalmente (la web se creó poco después de esto, por lo que no pudo han sido a lo que se dirigió Java). Java nunca tuvo una oportunidad contra C como el lenguaje principal para sistemas embebidos, un uso para el cual Java todavía es completamente inadecuado. Cuando leo las respuestas de otros carteles, tengo la sensación de que Java todavía se siente como un lenguaje que fue reutilizado en lugar de estar bien diseñado desde el principio, porque eso es exactamente lo que es.

Aquí hay 15 quejas sobre el lenguaje de escritura única, ejecución en su mayoría en todas partes en que Java se ha convertido

  1. Nombres largos de CamelCase
    La idea de pegar oraciones largas en nombres de variables con mayúsculas en las primeras letras se vuelve vieja rápidamente. No hay duda de que agrega un poco de autodocumentación al código, pero ¿no sería más fácil leer una línea que decía:

    i // holds the interest rate before taxes as per regulation 43

    en lugar de:

    interestRateHoldingVariableAdjusted ForTaxesAsDefinedByRegulation43

  2. Puntuación
    Si hay una diferencia importante entre Java y los recién llegados, es la puntuación. Los programas Java están llenos de llaves, puntos y comas y paréntesis que otros lenguajes como Groovy o Ruby hacen bien, no es que los amantes de la puntuación no tengan una carne legítima con lenguajes como Python que usan reglas arcanas de espacios en blanco para indicar las mismas separaciones. Entre expresiones y bloques que hace la puntuación en Java.
    Aún así, la mayoría de los programadores no pueden soportar la puntuación. Lo ven como un ruido visual, y una oportunidad para que el compilador regañe y regañe nuevamente.
  3. Confusión de código abierto
    ¿Es Java de código abierto o no? ¿Qué bibliotecas son de código abierto? Maldito si puedo estar seguro incluso después de la larga escaramuza de Google con Oracle. En su mayor parte, los programadores de Java no tienen que preocuparse porque los JRE y los JDK están disponibles de forma gratuita. Pero en el fondo de nuestras mentes, siempre existe la sensación de miedo de que algún abogado salte de la nada y diga “¡Para!” De alguna manera, parece que el estado legal nos convierte en peones en las batallas entre IBM, Oracle y Google.
  4. La granja de cerdos hilo de Java
    Cuando apareció Java, los hilos eran ligeros en comparación con muchas de las otras soluciones. Eran una forma fácil de combinar múltiples tareas con el mismo espacio de memoria. Ahora, las personas que usan Node.js siempre se quedan en la plataforma del servidor Java y sugieren que la fábrica de subprocesos de Java es una gran granja de cerdos que agrega 2MB de grasa al perfil de RAM del servidor cada vez que alguien hace clic en un enlace web. De alguna manera, usar el modelo de subproceso de Java nunca es tan ligero como solía ser. (Por supuesto, los que seguimos programando en Java tampoco lo somos, pero eso no hace que sea más fácil vivir con ellos).
  5. Tiempos de arranque intolerablemente lentos
    Cualquiera que haya intentado crear una aplicación de Android utilizando Java sabe cuán lentamente se ejecuta el código del simulador en su escritorio. Ese es el ejemplo más extremo de cómo poner en marcha un programa Java es tan difícil como hacer que un adolescente se levante temprano el sábado para limpiar su habitación. Si bien las aplicaciones Java pueden ejecutarse bastante bien una vez que se ponen en marcha, se inician más lentamente que un camión de 18 ruedas con exceso de luz en un semáforo en rojo en una carretera cuesta arriba.
  6. Comprobación sin fin de punteros nulos
    ¿Hay algo a esta queja? Déjame comprobar si es nulo antes de escribir más – parece estar bien. Ahora permítame verificar si mi teclado está presente y no ha sido reemplazado por un elemento nulo. Todavía está aquí. Ahora moveré mis dedos y te diré por qué la prueba nula es un dolor.
    Java requiere infinitas instrucciones para probar si las variables terminaron en nulo; de lo contrario, los subprocesos completos se bloquean con NullPointerExceptions. Los desarrolladores de Smart-Ass dicen que es mi culpa no haber verificado la entrada al principio, pero eso no siempre es posible al crear bibliotecas. Si alguien selecciona este archivo de clase en el futuro, será mejor que revise todas las variables una vez más, no tiene idea de cómo lo reutilizarán.
  7. Sobrecarga de creación de objetos
    Lanzar todo en un objeto parece una forma limpia de programar hasta que te das cuenta de lo lento que puede ser crear un objeto Java. Todos los que realmente intentan rediseñar el código para acelerarlo, comienzan a tirar lo más posible el modelo orientado a objetos. La creación de objetos es relativamente costosa, y es una gran razón por la que algunos códigos Java se ejecutan tan lentamente.
  8. Envoltorios primitivos para utilizar estructuras de datos.
    Las clases de Colecciones Java y otras estructuras de datos son agradables, pero requieren que envuelvas tus valores básicos en objetos para usarlos. Eso significa que un byte de cuatro bytes se convierte en un objeto grande y grueso con todo el peso y el tiempo de creación de un objeto. Algunos programadores han escrito sus propias estructuras de datos con primitivas básicas para evitar este problema, pero probablemente sea demasiado tarde para la corriente principal de Java. Nos limitamos a hacer la distinción entre un int de cuatro bytes y un objeto Integer.
  9. Las cuerdas son grandes, necesitan gastos generales y son definitivas
    Las cuerdas son otro objeto, pero no se pueden cambiar. Será mejor que los consigas bien la primera vez. Si desea cambiar un byte, debe crear un objeto completamente nuevo y copiarlo por completo. Además, agregan una sobrecarga, lo que está bien para lanzar grandes bloques de texto, pero es una verdadera molestia para las cadenas pequeñas. ¿Tienes una opción? No Solo esté feliz de que la sobrecarga con los puntos de inicio y parada es útil cuando está cortando y concatenando. Las cadenas son otro objeto más, pero no se pueden cambiar. Será mejor que los consigas bien la primera vez. Si desea cambiar un byte, debe crear un objeto completamente nuevo y copiarlo por completo. Además, agregan una sobrecarga, lo que está bien para lanzar grandes bloques de texto, pero es una verdadera molestia para las cadenas pequeñas. ¿Tienes una opción? No Solo esté feliz de que la sobrecarga con los puntos de inicio y parada es útil cuando está cortando y concatenando.
  10. No hay variables globales
    Es un poco falso que los programadores se quejen de la falta de variables globales en Java porque también están bastante dispuestos a quejarse de los peligros de las variables globales en otros lenguajes como PHP. Aún así, nos vemos obligados a saltar a través de aros extraños para hacer mucho de lo que las variables globales nos darán. Algunas personas crean una clase global y la llenan con variables estáticas. Otros construyen objetos singleton completos con una rutina de obtención que siempre devolverá el objeto. Esto podría ser tolerable si la creación de objetos singleton no estuviese tan cargada de condiciones de carrera y problemas de eficiencia.
  11. Fallas de seguridad
    Algunos dicen que no es justo culpar a Java por el hecho de que es un gran objetivo. Otros dicen que las otras plataformas tienen aún más agujeros de seguridad y al menos los ingenieros de Java intentaron construir una caja de arena decente. Otros dicen que se esperan problemas de seguridad, y al menos Oracle anuncia públicamente correcciones de errores, a menudo en grandes lotes como las 42 correcciones de seguridad que anunció el año pasado.
    Todos estos son puntos justos, pero no hacen que vivir con Java sea más fácil. La popularidad de Java significa que muchos hackers apuntarán a la JVM. El modelo de seguridad de Java significa que muchos programadores confiarán en la JVM cuando quizás no deberían confiar tan ciegamente. Si tan solo pudiéramos creer que el software era perfecto.
  12. Cargadores de carga JVM
    Muchos lenguajes ahora se compilan en el código de bytes de Java, por lo que pueden ejecutarse en cualquier JVM. ¿Qué mejor manera de redactar detrás del trabajo duro que realiza el equipo de Java para garantizar la compatibilidad y garantizar que su código pueda ejecutarse en una variedad de plataformas? Clojure, Scala, JRuby, Rhino – la lista sigue y sigue.
    Esto puede ser una ventaja para la integración, por ejemplo, de Ruby con Java, pero inevitablemente se convierte en una molestia. De repente, no es suficiente asegurarse de que el código de Java se compile con las bibliotecas que tiene. Ahora tiene que preocuparse de que N lenguajes se ejecuten pacíficamente en la misma JVM. Cuando funciona, es un testimonio del poder de la pila de Java, pero puede ser un generador de dolor de cabeza para todos.
  13. Revisionismo
    La superación personal suele ser una ocasión para celebrar, pero en el mundo de la pila de Java, también puede traer confusión y dolores de cabeza. ¿Debo usar la clase newerStringBuilder o el StringBuffer anterior? ¿O es StringBuilder el más antiguo? ¿No son lo mismo? Al menos es más fácil recordar que las nuevas clases de IO, NIO, son más nuevas que las antiguas. Hay docenas de ejemplos de técnicas nuevas y mejoradas que tal vez quieras usar, si puedes mantener todo en orden. Siguen mejorando la pila de Java, pero esto solo significa que necesitamos volver a aprender tantos de los modismos que antes estaban grabados en nuestro cerebro.
  14. Inmensidad insondable
    La enorme colección de API de Java oficiales y paquetes de código abierto no tan oficiales de grupos como Apache hacen de Java un entorno fértil para pararse sobre los hombros de gigantes. El único problema es que no puedes pararte sobre los hombros si no sabes que existen. Puede llevar días trabajar a través de las distintas API para descubrir cuál es realmente el mejor para lo que estás tratando de hacer. Entonces, el chico en el otro cubículo siempre parece saber algo mejor, un hecho que siempre se presenta con la menor cantidad de snark en la reunión de revisión de código.
  15. Java está en todas partes
    Java está en todas partes, dicen. Se encuentra en teléfonos celulares, discos Blu-ray, nubes Hadoop y computadoras de escritorio. ¿No debería ser una causa para celebrar? ¿No significa eso que todos lo aman? ¡Por supuesto! Pero también hace que sea más fácil odiar porque todo ese éxito hace que sea mucho más difícil controlarlo todo. Es un trabajo de tiempo completo simplemente viendo cómo evoluciona el mundo Java.
    Rápido, ¿qué necesita arreglar cuando actualiza de 1.6 a 1.7? ¿Qué versión de Apache Commons es lo suficientemente buena? Ya no es posible ser un experto en Java, y eso es una revelación difícil para aquellos que podrían ser expertos en Java cuando apareció el lenguaje.

– Por Peter Wayner , InfoWorld

A menudo me meto en discusiones con otros para esto.
Las verdaderas molestias son los puntos 1, 2, 3, 8, 9, 10.

ESPECIALMENTE PUNTO 1 en el texto anterior.