EDITAR: Esta pregunta al principio parece estar afectando a Java, y supongo que en este punto es un poco. Sin embargo, el punto más importante que estoy tratando de aclarar es por qué se elige un solo idioma como el único fin, todo será una solución a todos los problemas. Java es el que se usa, así que ese es el que tuve que superar aquí, pero no estoy intencionalmente arrancando Java uno nuevo :)
No me gusta Java en la mayoría de los entornos académicos. No estoy diciendo que el lenguaje en sí sea malo: tiene varios aspectos extremadamente deseables, lo más importante es la capacidad de ejecutarse sin recompilación en la mayoría de las plataformas. No tiene nada de malo usar el idioma para su próxima aplicación ^ TM. (No es algo que haría personalmente, pero eso es más porque tengo menos experiencia con él, en lugar de que su diseño sea pobre)
Creo que es un desperdicio que los cursos de CS de alto nivel se enseñen utilizando Java como lenguaje. Demasiados de mis compañeros no pueden programar nada, porque no saben cómo trabajar en un mundo no recolectado. No entienden fundamentalmente las máquinas para las que están programando. Cuando alguien puede trabajar fuera de un mundo de recolección de basura, puede trabajar dentro de uno, pero no al revés. GC es una herramienta, no una muleta. Pero la forma en que se usa para enseñar a los estudiantes de informática es como una muleta.
La informática no debe enseñar un conjunto completo de cursos adaptados a un solo idioma. Los estudiantes parten con la idea de que todo buen diseño es un diseño idiomático de Java, y que el Diseño Orientado a Objetos es la ÚNICA FORMA QUE ES LA ÚNICA MANERA QUE SE PUEDEN HACER. Otros idiomas, al menos uno de ellos que no sea un idioma recolectado como basura, deben usarse en la enseñanza, para que el graduado comprenda mejor las máquinas.
Es una vergüenza que alguien con un doctorado en CS de una institución respetada no pueda programar su salida de una bolsa de papel.
Lo que es peor, es que cuando hablo con esos profesores de CS que realmente entienden cómo funcionan las cosas, comparten sentimientos como este, que estamos perjudicando a nuestros estudiantes al hacer todo en Java. (Tenga en cuenta que lo anterior sería lo mismo si lo reemplazara con cualquier otro idioma, generalmente el problema es usar un solo idioma, no el propio Java)
En total, siento que ya no puedo respetar ningún tipo de título, cuando no puedo ver a los que están a mi alrededor capaces de salir de problemas de fizzbuzz.
¿Por qué / cómo llegó a ser así?
fuente
Respuestas:
Este no es un problema de Java, es un problema de enseñanza. No saber programar no es una falla de idiomas, es culpa de los estudiantes. Lo mismo ocurre con todos sus problemas, GC, conocimiento básico de la máquina, cómo funcionan las cosas "bajo el capó", por así decirlo.
Su mayor queja sobre la recolección de basura me arroja un poco. A menos que esté haciendo la recolección de basura C o C ++, generalmente es muy bueno y no es un problema. ¿Prefieres que todos aprendan asamblea? Los lenguajes de nivel superior que son estrictos son muy útiles para la enseñanza. Le brinda la flexibilidad de bibliotecas, paquetes y otros detalles cuando lo necesita, sin ninguno de los confusos "azúcar" del lenguaje presentes en la mayoría de los otros lenguajes de nivel superior (PHP, Ruby, Python, Perl).
fuente
¿Las universidades realmente están haciendo esto? ¿O es solo una percepción que las personas obtienen cuando obtienen un mal candidato para una entrevista de trabajo?
Obtuve mi título de CS hace 4 años y aunque Java se usó en las clases de introducción, no se enfatizó particularmente después de eso. Fuera de mi cabeza, los cursos básicos requeridos requieren que aprendas Java, C, C ++, SML (lenguaje de programación funcional), ensamblaje, matlab y CAST (lenguaje de descripción de circuito). Esto no tiene en cuenta todos los cursos de CS teóricos y matemáticos y, por supuesto, la media docena de cursos de CS optativos que te habrían expuesto a un montón más. Al hablar con amigos en varias universidades diferentes, no parecía que lo que estaban haciendo fuera muy diferente.
Si hay universidades que solo enseñan Java, entonces eso es realmente una tragedia. No porque Java sea malo, sino porque es solo una de las muchas herramientas que debería estar disponible para un programador. Un desarrollador que solo conoce Java es equivalente a un carpintero que solo sabe cómo usar un martillo. Sin embargo, me cuesta creer que ese sea realmente el caso, al menos para las universidades respetadas. Sospecho que esto es solo la percepción de ver malos candidatos y culpar a la escuela por la incompetencia de los candidatos en lugar de la falta de impulso / motivación / curiosidad / profesionalismo / etc. del candidato.
fuente
Estoy realmente sorprendido de que esta sea la situación en muchas escuelas. Cuando obtuve mi título de CS, tuve una serie de cursos de idiomas que incluían todos los idiomas populares del día (esto fue hace casi 40 años): ensamblador (Univac 1108 y MIX), FORTRAN IV, SNOBOL4, COBOL, Lisp y Algol 68. No puedo imaginar que solo se enseñe un idioma. O cómo podría apreciar lo que los compiladores tenían que hacer sin haber escrito algunos programas ensambladores.
Usamos Algol y FORTRAN para la mayoría de los cursos de datos y algoritmos. Me hubiera gustado pasar más tiempo con Lisp; en cambio, solo tuvimos una introducción y ahora estoy tratando de volver a aprender algunos de los conceptos. Utilizamos SNOBOL4 para escribir analizadores sintácticos, y su coincidencia de patrones con retroceso creó una buena base para el trabajo posterior de las bibliotecas de expresiones regulares incluidas en muchos idiomas modernos.
Esta introducción a media docena de idiomas despertó un interés en mí que ha continuado desde entonces.
fuente
Para obtener la verdadera razón, tendrías que preguntar a las personas que dirigen esas instituciones (e incluso entonces, es posible que no te lo digan).
Varias razones posibles (y no estoy defendiendo ni acusando a nadie aquí, solo adivinando):
Puedes hacer cosas en Java
Java es un lenguaje de propósito general y, como tal, se puede utilizar para resolver muchos problemas.
Muchos profesores entienden Java
Es difícil enseñar un idioma que no entiendes
Java es popular
Lo que significa que hay muchos recursos de Java: libros, una comunidad activa, bibliotecas de códigos, etc.
Java es fácil
No tienes que entender muchas cosas de bajo nivel o teoría para hacer Java. Es posible que no lo haga bien , pero al menos puede hacer las cosas.
Java es dominante
Puede ejecutarlo en más o menos cualquier cosa.
Hay trabajos para programadores Java
Hay muchos trabajos que necesitan Java: se supone que los maestros están preparando a los estudiantes para el mundo real.
Hay tiempo limitado
En muchos cursos, no hay tiempo para enseñar múltiples idiomas, teorías, conceptos de bajo nivel, etc.
Es lo que quieren los estudiantes
Muchos estudiantes ya han oído hablar (e incluso han usado) Java. Les gusta porque les es familiar.
fuente
Eso es lo que pidió la industria. Había una escasez de desarrolladores de Java, por lo que las escuelas comenzaron a crearlos. Las empresas obtuvieron desarrolladores que pueden comenzar a trabajar tan pronto como cruzaron la puerta.
De todos modos, el idioma no importa. Podrían enseñar un lenguaje que no sea GC y seguir produciendo malos programadores. El uso de las escuelas de idiomas es un detalle de implementación. Las escuelas deben enseñar conceptos. Si este no es el caso, entonces es la escuela el problema, no el idioma con el que enseñan. El hecho de que alguien no sepa qué es un puntero no significa que no pueda ser un programador efectivo.
GC es el camino del futuro de todos modos.
fuente
Pereza y lucro. Java atrae a la mayoría de las personas el 80% del camino, con el 20% del esfuerzo. Sin embargo, esto a menudo produce codificadores de vudú "mono ver mono hacer" que no tienen una comprensión profunda de lo que está sucediendo y no pueden profundizar más que las herramientas de alto nivel.
Enseñar C / C ++ correctamente es difícil. Incluso cuando se hace bien, bastantes no entenderán completamente los conceptos de bajo nivel como los punteros (hay estudios sobre esto). Además, no parece inmediatamente relevante en el mercado laboral.
fuente
Principalmente estoy de acuerdo, pero hasta cierto punto.
Si va a enseñar CS cource centrado en estructuras de datos o algoritmos. Obtener la mayoría de las cosas innecesarias fuera del camino es algo bueno. No quiere que los estudiantes lidien con cosas de bajo nivel cuando aprenden conceptos de alto nivel.
Por otro lado, también se deben enseñar cosas de bajo nivel. Solo para que tengamos más programadores versátiles.
fuente
Como siempre, se trata de lo que quieres enseñar y de cuánto tiempo tienes para hacerlo.
Hacer cosas en Java significa que no tienes que lidiar con punteros extraviados y free / malloc. Eso significa muchos menos errores difíciles de encontrar.
Esto no significa que no deba aprender sobre la máquina subyacente, que debe ser buena en el comercio, sino que quizás deba elegir la herramienta adecuada para el trabajo. Los algoritmos de alto nivel quizás no sean el mejor tema para el curso de ensamblador.
fuente
¿Es demasiado pedir que se les enseñe algo sobre cómo funcionan realmente las computadoras ? No tiene sentido para mí que cualquier resumen de un curso de CS no incluya algo de sistemas operativos y arquitectura de computadoras. No estoy diciendo que deba poder diseñar una computadora en el reverso de un sobre, pero una descripción general pone todos los idiomas en perspectiva. Quiero decir, ¡Java se ejecuta en una máquina virtual!
fuente
Honestamente, no creo que debas perder el respeto por todos los títulos y, especialmente, no CS porque el único idioma que se enseña es Java.
Cualquier comp decente. El estudiante de ciencias comprende que su título de CS no es más que una hoja de papel y que el conocimiento real provendrá de proyectos personales y estudios personales. Me gustaría pensar que los buenos estudiantes saben que necesitan saber C y aprender cómo hacer las cosas en Linux / Unix y aprender a NO tener la mano en los lenguajes modernos.
fuente
No veo un problema con el uso de Java. El mayor problema (como mencionó) es cuando las universidades enseñan la programación imperativa como la mejor y única forma de resolver todos sus problemas. Esto está muy lejos de la verdad. Por ejemplo, en lugar de usar tres lenguajes imperativos (o incluso el peor idioma) para tres cursos diferentes, deberían usar tres paradigmas de programación diferentes. Un ejemplo es Java (imperativo), Prolog (declarativo) y Haskell (funcional).
En cuanto a por qué sucede esto, creo que es una combinación de (1) política: los presidentes no son de mente abierta o tienen beneficios / patrocinadores personales, y (2) pereza: los profesores fueron una vez estudiantes y enseñan lo que saben o les gusta.
fuente
Colegio Calvin en Grand Rapids Mi. Una vez que cambiaron de Java a Python para clases introductorias de programación, el profesor, incrédulo, mencionó a un grupo de nosotros cerca del final de su semestre: "Muchos de ellos pueden programar, es increíble". Su asombro contrastaba con las experiencias anteriores con Java. Esto no hace que Java sea un mal lenguaje, solo difícil de aprender desde cero. Yo diría lo mismo sobre C, C ++ o cualquier lenguaje que requiera un conocimiento íntimo de los esquemas o tipos de asignación de memoria.
fuente
Obtuve un título en ingeniería de sistemas informáticos, así que estudié ensamblaje, microprocesadores, VHDL, cuáles son las puertas lógicas y cómo crear un flip-flop a partir de ellas, estudié circuitos eléctricos, amplificadores operacionales, filtros de paso bajo, amplitud modulación, construyó un circuito en un laboratorio que sonaría como un teclado telefónico, en mal estado con un analizador lógico, tomó algunas clases de física. En el lado de Linux: antes recompilé un núcleo, escribí un pequeño controlador de dispositivo y un sistema de archivos de tareas.
Pero luego me di cuenta de que me gustan mucho más las cosas de alto nivel. Prefiero Python sobre C. Me gusta C # y me encanta el recolector de basura. Me gustan las matemáticas y los algoritmos y las estructuras de datos, pero no soy un fanático particular de los punteros: puedo meterme con ellos; Solo no quiero.
Entonces, piensas que la universidad debería enseñar más C, menos Java. Alguien más piensa que deberían enseñar todo en Scheme. Spolsky tomará ambos.
Sí, es cierto que un título universitario es simplemente una hoja de papel, pero "no dejes que la educación interfiera con tu educación". Siempre hay Wikipedia, Stack Overflow, Coursera.org, etc. Parece que las universidades tradicionales serán menos importantes.
Si pudiera hacer una licenciatura por todas partes, entonces habría ido a una escuela diferente, no habría estudiado ninguna de las cosas de ingeniería eléctrica, sino más bien Matemáticas, CS + en física y francés. Scratch French; Debería haber estudiado en el extranjero en Suiza y aprendí 5 idiomas naturales mientras lo hacía. También regresaría y encontraría a una persona que me convenció de que debo tomar una introducción a las clases de economía en la universidad para poder sobrevivir en el mundo real y golpearlo en la cabeza con mi colección de libros de Milton Friedman (los únicos libros sobre el tema de economía que leí que no apestan). Tampoco pagaría dinero por el libro Freakonomics 1 o un libro sobre el lenguaje Perl.
En retrospectiva, habría hecho muchas cosas de manera diferente. Todo lo que puedo hacer ahora, y te recomiendo esto, es elegir tu propia aventura: http://www.codinghorror.com/blog/2008/03/choosing-your-own-adventure.html
En retrospectiva, ya habría ganado 100 mil millones de dólares en el mercado de valores, y lo habría invertido en la investigación del cáncer, habría contratado científicos para eliminar los desechos plásticos del mundo; Habría donado suficiente dinero en efectivo a la campaña de Ron Paul para que la guerra en el Medio Oriente durara más de 3 años.
Reconoce ahora que nunca recuperarás tu tiempo, así que intenta gastarlo sabiamente.
fuente
Hace unos años leí en alguna parte que, en el Reino Unido, se tomó la decisión de Java de atraer a más estudiantes a la programación. Aparentemente fue más fácil para el cerebro debido a la falta de punteros desagradables y administración de memoria, etc. Supongo que esta es la razón por la cual Python se está adoptando rápidamente como la nueva 'herramienta de aprendizaje'. Sería de la opinión de que tu curso típico de universidad no te convertirá en un programador. Todo lo que debe hacer es armarte con una cierta cantidad de conocimiento y prepararte para la programación. El día en que uno puede llamarse a sí mismo programador generalmente pasa bastante tiempo después de la universidad y cuando llega ese momento, los indicadores, la recolección de basura y los paradigmas de programación distintos de OOP no deberían ser un problema.
fuente
¿Por qué se usa Java?
Tres razones:
Java usa la sintaxis de estilo C. Muchos programadores están familiarizados con él, por lo que reduce la curva de aprendizaje.
Se gastó dinero para comercializar Java como genial y moderno. Pero en comparación con el ceceo, Java está viviendo en la edad de piedra.
La JVM JVM es lo mejor de Java que es legítimo, no solo el marketing publicitario. Aunque la JVM debe ser elogiada como una plataforma para ejecutar programas, no merece por sí misma la existencia del lenguaje Java. Teóricamente y prácticamente puedes compilar muchos lenguajes diferentes para la JVM.
fuente
Su pregunta respalda los hallazgos de otra persona que escribió un artículo diciendo que Java es tan genial pero no lo suficientemente pesado para la computación científica. Creo que debería usar Big Decimal con todas sus precisiones finas, NAN, etc. y seguir adelante.
Quiero vivir solo en un mundo automático de recolección de basura. Su aspecto más saludable, limpio, ordenado, estético, evita el desperdicio de dinero en gastos de salud, es más deseable, no tiene que etiquetar algo como no deseado, simplemente al desreferenciarlo o configurarlo como nulo o cuando me muevo fuera del alcance, el artículo se pone automáticamente etiquetado para recolección de basura ..
Ok, ahora solo estoy hablando de Java, pero sería más útil si esto también funciona en el escenario de basura real. Java es escribir una vez ejecutado en cualquier lugar, lo cual es lo suficientemente bueno para mí como para ser utilizado como idioma en las escuelas. No hay pérdidas de memoria y el gusto de los programadores felices que no quieren pasar tiempo etiquetando cada objeto que usan y dejan de usarlo es una buena lógica en nombre de Java.
Java tiene punteros, bueno, los llamamos referencias. String s1 = "Hola"; Cadena s2 = "Hola"; Cadena s3 = nueva Cadena ("Hola");
s1 y s2 apuntarán al mismo objeto String, que es por referencia s1 == s2, s1.equals (s3) pero s1 == s3 es falso porque s3 es un nuevo objeto de referencia; esta es la aritmética de referencias de Java e I entiendo todo esto, lo siento, no deseo ser etiquetado como alguien que no comprende las complejidades subyacentes de la aritmética de puntero de C o C ++.
fuente