Java o C ++ para cursos universitarios de CS?

11

Estoy a punto de inscribirme en la escuela para obtener un título de CS. La escuela que estoy viendo en realidad ofrece tanto Java como C ++ para los cursos introductorios de desarrollo de software (programación orientada a objetos, patrones de diseño, ese tipo de cosas). Es la elección del alumno qué pista seguir, pero solo hay tiempo para seguir una.

Sabiendo lo que sabe ahora, si tuviera la opción, ¿establecería su base de currículum CS en Java o C ++?

Mi debate actual actualmente se ve así:

Un buen amigo (que tiene un doctorado en IA) está promocionando Java como la mejor opción, independientemente de lo que haga, aunque solo sea para abrir más oportunidades de trabajo más tarde, aunque podría ser parcial ya que todo su trabajo ha estado en Java (él a él le encanta). Vivo en el área de Boston, MA, EE. UU. Y veo una cantidad igual de trabajo en Java y C.

Por otro lado, aunque todavía no me he decidido por completo sobre lo que quiero hacer con el título cuando termine, mi preferencia sería desarrollar para Mac, lo que estoy haciendo ahora, aunque de manera limitada. Con ese fin, ya estoy recibiendo una exposición limitada a C ++, pero no he tenido ninguno con Java, y mirando mis proyectos en mi trabajo diario no veo la necesidad de usarlo en el corto plazo, "pronto" medido por al menos dos años.

Probablemente debería tener en cuenta que soy un adulto que regresa a la escuela después de 20 años (actualmente no tengo ningún título de ningún tipo), así que estoy buscando maximizar la oportunidad y el tiempo que pasé lo mejor que pude. Me estoy inclinando hacia C ++, pero sigo siendo ambivalente, y algunos consejos externos ayudarían aquí.

O podría estar pensando demasiado en ello.

ACTUALIZACIÓN: Resulta que la selección de idioma no fue tan clara como supuse originalmente. Mientras que un par de cursos básicos se centraron en Java, algunos de los otros cursos básicos funcionan principalmente en C y Java, pero también en algunos otros que se incluyen en buena medida. De hecho, el resto de mi semestre estará en Objective-C después de pasar tiempo en Java y Javascript. El último semestre fue C, Javascript y PHP, además de algunos otros lanzados como tareas requeridas. Dado que las cosas se dividieron en el medio en general, y todavía estoy recibiendo respuestas a esto, ahora estoy tratando de trabajar mi plan de estudios de manera que cumpla con todos los requisitos para el título, pero absorba tantos idiomas como pueda manejar razonablemente . Hasta ahora, mis calificaciones no han sufrido tratando de hacer esto.

Philip Regan
fuente
1
Todos en el entorno de investigación académica están promocionando Java en este momento. Además, independientemente del idioma, debe aprender de la universidad cómo aprender nuevos idiomas. C ++ es igual que Java, pero no hay afirmación de que lo serán en 5 años. Siempre vienen nuevos idiomas / tecnología, por lo que debe estar preparado para aprenderlos y convertirse en experto rápidamente.
Chris
1
@ Chris: Por eso, mi recomendación sería aprender algo que facilite un mayor aprendizaje, en lugar de algo que sea popular ahora. Recomiendo C ++ o Python en lugar de Java (obviamente por diferentes razones).
David Thornley el
No es ese idioma lo que importa. Es el concepto abstracto. Obtenga el concepto correcto, para que los estudiantes puedan aprender fácilmente cualquier cosa más adelante en su vida.
J-16 SDiZ
1
Estoy en una situación (extrañamente) similar: volver a la escuela para CS después de 20 años fuera de la escuela. Mi escuela también tiene una pista dividida Java / C ++. Después de leer todo aquí, e incluso de dar +1 a la respuesta principal, todavía voy a ir con Java, y he aquí por qué, en caso de que sea útil para usted: vengo del desarrollo web (Javascript, PHP, Python) , por lo que el soporte de las bibliotecas Java es una ventaja. Suponiendo que también me tome el tiempo para capturar realmente los principios de OOP, no creo que pasar a C ++ (si es necesario) sea tan difícil. Java es el punto medio entre las secuencias de comandos y la compilación.
be hollenbeck
2
Creo que no estoy de acuerdo con cada respuesta. Realmente no importa . Aprenderá conceptos similares en ambos idiomas, y aprenderá el otro idioma que no eligió y otros también a través de sus estudios y carrera.
Matsemann

Respuestas:

51

Yo personalmente iría con C ++, ya que te dará información sobre cómo funcionan partes de Java bajo el capó (punteros, por ejemplo). Moverse a Java desde C ++ es bastante trivial, mientras que moverse al revés es posiblemente más difícil.

Lo verdaderamente difícil del ecosistema Java es su gran cantidad de marcos, bibliotecas, etc. De todos modos, es poco probable que cubran todo eso en la Universidad.

Al final del día no va a importar que tanto el idioma que elija, siempre y cuando se aprende los principios.

Mi JUG me va a matar por respaldar C ++ ;-)

Martijn Verburg
fuente
1
+1 para un excelente punto sobre el tamaño del ecosistema Java y la explicación de la transición.
Jas
1
El problema con el aprendizaje de un gran ecosistema en una universidad es que eso no será útil a lo largo de su carrera profesional. Es mejor aprender menos bibliotecas y conceptos de aprendizaje o familiarizarse con las características del lenguaje real.
David Thornley el
2
Un salto adicional para C ++ es que luego podría hacer C ++ administrado en .NET Framework, lo que le dará la oportunidad de aprender C #, F # y cualquier otro lenguaje en ese tiempo de ejecución. Java también tiene una gran ventaja para JVM y lenguajes como Scala, pero no conozco JVM C ++.
CodexArcanum
Como alguien a quien le gusta pensar que es bastante decente en C ++ (y Java), no creo que ningún curso moderno de programación introductoria deba estar en C ++. Es simplemente demasiado difícil. Si la universidad no enseña C ++ en absoluto, avance, claro, pero para una introducción, iría con algo más simple y bonito como Java. Tal vez si no pensara que todos son malvados, incluso podría haber recomendado un lenguaje escrito dinámicamente.
Dukeling
En algunos de nuestros días antes de Java, no teníamos esta opción y todos aprendimos C ++, por lo que no veo ningún problema con las personas que aún aprenden C ++ primero. Supongo que la introducción en Java es mejor que la introducción en Turbo Pascal.
Bratch
18

Tengo que estar en desacuerdo con la mayoría de las personas que defienden Java aquí. Aprender C ++, incluso si no ha estudiado la arquitectura de la computadora y el microprocesador, le brinda tantos conocimientos invaluables sobre la forma en que funcionan y operan los programas de computadora.

Nota bene, NO estoy abogando por que no debas aprender Java (mejor aún, C #) porque estos son langs modernos y rápidos de desarrollo de aplicaciones y se han construido grandes marcos alrededor de ellos que te dan acceso a una gran cantidad de funcionalidades "gratuitas", como acceso a archivos abstractos y similares, sin embargo, un verdadero ingeniero de software debería conocer al menos algo de C ++, C o al menos ensamblador, porque eso es lo que lo separa de los tipos de script-kiddie.

Una vez que sea razonablemente competente con C ++, confiado en la administración de memoria y STL, adquirir Java / C # debería ser muy fácil.

Jas
fuente
Estoy de acuerdo, estoy seguro de que aprender Java si ya dominas C ++ será mucho, mucho más fácil que aprender C ++ si ya dominas Java.
Carson63000
El problema para llegar a ser "razonablemente competente con C ++" es que tomará años y todavía solo aprenderá un pequeño subconjunto de OOP.
Henry
Java no es un lenguaje de desarrollo de aplicaciones rápido. Puede tener un nivel ligeramente más alto que C ++, pero no se acerca al nivel de abstracción de Python, Ruby, Perl o Visual Basic.
Evan Kroske
@Evan: Sí, Java es un lenguaje de desarrollo "rápido" si no es por sus vastas bibliotecas (comúnmente se dice que cualquier desarrollador de Java tiene documentos de API Java abiertos mientras trabaja), además de no tener que hacer una gestión manual de la memoria. Y el hombre que diseñó Java, lo diseñó porque no estaba llegando a ninguna parte usando C ++. Además, la gran cantidad de aplicaciones Java implementadas hoy (barrera de entrada inferior) es otro argumento para su "rapidez".
Jas
9

Las escuelas y los académicos que abogan por Java como la primera opción deberían examinar sus cabezas (o simplemente conseguir un trabajo real ahí fuera). Lo digo como una persona que ha realizado el desarrollo de aplicaciones y sistemas en Java durante los últimos 12 años. Java es un lenguaje atroz para la enseñanza.

La razón es la siguiente: salvo los superdotados, la mayoría de los estudiantes pueden (y probablemente nunca lo harán) comprender la orientación de los objetos sin comprender la programación modular. Y no pueden entender la programación modular sin primero entender la programación estructurada en un lenguaje de procedimiento. Llano y simple. El testamento de esto (entre otras cosas) es que a pesar de que hemos conocido OO durante 3-4 décadas, la gente todavía escribe hiper-spaghetti en la práctica.

Además, una persona que solo confía en un lenguaje basado en gc (ya sea Java o .NET) nunca puede acercarse realmente al hardware. A menos que su ambición sea crear páginas web dinámicas, ¿adivina qué? Debe sentirse cómodo acercándose al idioma.

Vas a una escuela de CS para convertirte en un experto en informática y programador (con suerte con bastantes horas de crédito de práctica práctica de programación en muchos lenguajes de programación). Si todo lo que sabes es Java (o .NET o C o Python lo que sea) entonces eres un "programador de Java" (no un programador que puede trabajar en Java, sino un "programador de Java"). Y eso tiene tanto sentido como decir que eres un "carpintero de martillo" o un "mecánico de destornilladores Phillip", ¿no es así?

Una buena escuela lo expondrá a C (o algún otro lenguaje de procedimiento como Pascal o Ada), luego a C ++ y a una asamblea, dejándolo para que aprenda Java por su cuenta mientras realiza los cursos finales del proyecto en su año junior / senior. Además, debería proporcionarle exposición a lenguajes funcionales para que entienda el concepto de pasar bloques computacionales como argumentos, cálculos sin efectos secundarios, transparencia de ubicación y similares (que tienen aplicaciones prácticas reales, incluso en la web).

Necesita saber qué es un segfault. Necesita saber qué significan la paginación, la memoria virtual y toda esa basura. Debe saber cómo descomponer los problemas en los módulos (ya sean de procedimiento y basados ​​en OO). Necesita saber cómo se implementan realmente los sistemas OO (para que sepa el costo). Debe saber dónde se interrumpe la abstracción OO (y lo hacen porque el mundo y los problemas complejos no están necesariamente orientados a objetos).

Necesitas saber todo eso para convertirte en un experto en computación capaz de trabajar en la empresa o en un nivel muy bajo implementando cosas de nivel de sistema, ya sea para el sector comercial o público, tanto a gran escala como a pequeña escala. escala.

Los académicos que han estado presionando para que Java sea el único lenguaje para gobernarlos a todos no tienen ni idea de lo que realmente necesita la industria. Despistado. Imperdonable despistado. Eso es lo que sucede cuando trabajan en torres de marfil mirando a la industria a distancia.

Han convertido los departamentos de Informática en costosas escuelas vocacionales de 4 años que producen ponis de un solo lenguaje de programación. Y eso podría ser perdonable si al menos pudieran enseñar a los estudiantes habilidades básicas de negocios / empresa / organización (es decir, abandonar la fachada de CS y adoptar un plan de estudios MIS). Pero ni siquiera hacen eso, lo que creo que es un gran mal servicio a la industria, la economía y, en última instancia, a los estudiantes.

Te sugiero que leas el artículo de Joel Spolsky sobre "Escuelas de Java".

http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html

En resumen, si no te enseñan un lenguaje de programación procesal (ya sea industrial como C o Ada o uno lo suficientemente bueno para enseñar como Pascal), y te dan si C ++ (si tienes suerte) o Java / C # (si no tienes suerte), buscaría otra escuela. Claro y simple, de un tipo que ha estado utilizando Java para ganarse la vida en el mundo real durante bastante tiempo.

luis.espinal
fuente
De alguien que sabe de Java, C y C ++ bastante bien y que no se graduaron también hace mucho tiempo, voy a tener que estar en desacuerdo. C (o C ++) VS Java: Java es mucho más fácil. Tal vez si comencé con C ++ (que creo que es bastante impresionante (pero no fácil) por cierto) (en lugar de (Delphi (eww) +) Java) es completamente posible que me hubiera desmotivado, abandonado y no convertido en un programador (aunque tal vez solo tuvimos un mal profesor de C ++). Pero sí, aprender C ++ para comprender los aspectos internos de Java fue absolutamente invaluable. Y supongo que alrededor del 95% de los programadores en estos días "realmente nunca se acercan al hardware".
Dukeling
" C (o C ++) VS Java: Java es mucho más fácil ", bueno, eso es algo muy conocido. Sin embargo, no estoy seguro de qué tiene que ver eso con mi publicación (?????)
luis.espinal
Más fácil de entender, más fácil de enseñar, más fácil de aprender, por lo tanto, no estoy de acuerdo con que "Java es un lenguaje atroz para la enseñanza" y que primero debe aprender C (quizás un lenguaje de procedimiento más fácil está bien). También digo que es bueno saber C o C ++, pero no para empezar, porque en este caso es probable que ahuyentes a todos menos a los programadores más duros, porque estoy seguro de que eso es todo lo que sobrevivirá a una introducción a programación a través de C ++. No es que me importe un mundo de programadores hardcore, pero a otras personas sí. Sí, usted está diciendo ser bien redondeado, pero yo digo plomo con Java o similar.
Dukeling
Más fácil de entender y enseñar no necesariamente se traduce en ser un lenguaje adecuado para fines pedagógicos. Después de 12 años de trabajar con Java, estoy convencido de esto. Un lenguaje pedagógico mucho mejor que es más fácil que C o C ++ sería Python, por ejemplo ... o cualquier lenguaje que no obligue a todos los métodos a estar en una clase, es decir, un lenguaje que sea realmente multi-paradigma en lugar de Java, donde todo es "supuestamente" un objeto, donde no hay buenas alternativas al alcance más allá de las clases y paquetes, y así sucesivamente. Limita la capacidad de enseñar un modelado adecuado.
luis.espinal
Java, al forzarlo a aprender programación en un modo orientado a sustantivos, todo como objeto, proporciona metáforas de modelado deficientes para otros paradigmas que son más adecuados para el modelado del mundo real. Un desarrollador profesional de las trincheras puede evitar esa limitación. Los estudiantes no lo hacen, y me perdonan, pero muy pocos profesores universitarios tienen experiencia desde las trincheras para conocer la distinción. Elegiría Python o Ruby (o en realidad Lisp o BASIC) sobre Java si C / C ++ es demasiado duro.
luis.espinal
4

Creo que mucho depende de tu personalidad. Al menos desde mi perspectiva, Java y C ++ tienen orientaciones radicalmente diferentes que atraen a tipos de personas sustancialmente diferentes.

Cuando te pones a ello, Java es realmente una biblioteca de gran clase, con suficiente lenguaje para poder instanciar objetos e invocar métodos desde esa biblioteca. "Aprender Java" consiste, en gran parte, en memorizar (o al menos darse cuenta) de lo que hay en la biblioteca y cómo está organizado, para que pueda encontrar las cosas que desea cuando las quiere.

C ++ pone mucho menos énfasis en proporcionar código preescrito. Si bien incluye una biblioteca (STL 1 ), esa biblioteca tiene menos que ver con el código que se incluye que con un estilo y un conjunto de principios. Es completamente posible escribir código que sea claramente y fácilmente reconocible como código "STL", a pesar de que usa poco o nada del código escrito previamente.

También hay una diferencia bastante sustancial en cómo se usan los idiomas. Java ha puesto un gran énfasis en mantener el lenguaje simple. Esto facilita la creación de herramientas que manipulan el código Java de varias maneras (por ejemplo, para refactorizar). También significa que tiende a necesitar herramientas que puedan hacerlo, porque la refactorización a menudo implica cambios bastante sustanciales en grandes cantidades de código.

C ++ es un lenguaje mucho más complejo, lo que significa (entre otras cosas) que crear herramientas para manipular el código fuente de C ++ es tremendamente más difícil que para Java. El balance es que es mucho menos necesario: un trabajo de refactorización que podría implicar cientos de cambios en docenas de archivos en Java podría lograrse (por ejemplo) cambiando un solo parámetro de plantilla en C ++.

Java pone mucho más énfasis en ser fácil de aprender. C ++ pone mucho más énfasis en ser fácil de usar, pero (desafortunadamente) solo si realmente sabe lo que está haciendo.

No voy a abogar por uno u otro. Mi opinión sobre los idiomas es mucho menos relevante que tener una idea de qué esperar de cada uno y echar un vistazo honesto a sí mismo para descubrir cuál es el que más le conviene.

1 Sí, sé que eso no es realmente exacto, pero estoy tratando de evitar que esto se convierta en un libro ...

Jerry Coffin
fuente
3

¡No puedo creer que la gente defienda C ++ como primer idioma! Pasará la mayor parte de su tiempo escribiendo calderas y tratando de sortear las limitaciones y anzuelos en el idioma que realmente aprender a programar.

Java es un lenguaje mucho más simple y no obstaculizará tu aprendizaje.

Si debe aprender C ++, aprenda los conceptos con Java y luego vaya a C ++, o mejor aún, OBJ-C si desea escribir software para Mac. Java y OBJ-C no son muy diferentes.

FYI He pasado 10 años como desarrollador comercial de C ++.

Enrique
fuente
Este no será mi primer idioma. Soy programador y ahora regreso a la escuela para obtener un título. Mi experiencia con C ++ y Java es limitada, pero tengo experiencia con C y Objective-C. Pero gracias por tomarse el tiempo de responder.
Philip Regan el
3
Java se interpondrá en el camino de su aprendizaje. Te enseñará total no verdades sobre conceptos independientes del lenguaje.
DeadMG
2

Yo recomendaría C ++. Tuve algunas clases en Java, y algunas en C ++ en la universidad, y las habilidades específicas de lenguaje que aprendí de C ++ me ayudaron más cuando aprendí idiomas adicionales más adelante. Además, aunque veo mucho más Java que vacantes de trabajo en C ++, la mayoría está buscando una pila Java completa, como:

  • EJB 1.x / 2.0, JNDI, JMS, JTA / JTS, RMI, JDBC, Servlets, JSP, SAX / DOM, Servicios web, SOAP, WSDL, UDDI, JAXB, JavaMail, WAP, WML, HTML
  • Tomcat, Apache Xalan, Apache Xerces, Jserv, JRun, JBuilder, TogetherJ, Web Logic 5.x / 6.x, Websphere 3.5 / 4

Y lo más probable es que un plan de estudios basado en Java no lo prepare mucho mejor que uno basado en C ++ en una lista como esa.

Chris
fuente
1
Agregaría que (al menos en mi área) los trabajos de C ++ también pagan bastante mejor que los trabajos de Java (objetivo) y generalmente son más interesantes (subjetivos).
Cercerilla
2

Es difícil porque Java es indudablemente más fácil de aprender. Lo hará más pronto con Java.

C ++ es un lenguaje mucho más difícil de trabajar. Los punteros y la administración de memoria son conceptualmente y prácticamente difíciles de trabajar. C ++ no le ofrece redes de seguridad.

A largo plazo, sería útil comprender todas las cosas que te enseña C ++. Además, la transición de C ++ a Java es mucho más fácil que en la otra dirección.

Pero me pregunto si al comenzar y durante muchos proyectos de grado, la sobrecarga y la depuración adicionales que tiene que hacer para que algo funcione en C ++ realmente haría que sus proyectos sean más difíciles, sus plazos más difíciles de cumplir y su vida mucho más frustrante . Para lograr lo mismo en C ++ y Java, diría que en casi todos los casos harías el trabajo más rápido en Java y tendrías menos problemas molestos. Eso podría ser realmente un gran problema cuando estás al final de un semestre y tienes cinco cursos que necesitan su proyecto de fin de curso el mismo día.

El otro lado de eso es que si esas pruebas no te hacen tirar la toalla por completo, te convertirán en un mejor programador si dominas C ++. Y si su carrera es con C # o Java o Python y nunca tiene que tocar otro puntero en su vida, lo apreciará mucho más ...

glenatron
fuente
2

C ++ es el más flexible y ofrece una comprensión más profunda. Indudablemente, obtendrá más de C ++ que de Java. C ++ también es más difícil, porque es más complejo.

Dicho esto, los trabajos de C ++ no son tan comunes como los trabajos de Java.

Java y su descendiente, C #, son las soluciones estándar para el espacio de codificación de hierro grande empresarial / corporativo. Recomiendo aprender uno de los dos en su segundo año y sentirse muy cómodo con eso para cuando termine su título. Le permitirá obtener trabajos mucho más fácil. Eso no significa que piense que esos trabajos tienen un interés intelectual significativo en promedio. Recientemente realicé trabajos de software de craigslist en las Montañas Rocosas y la mayoría de los trabajos eran C # / Java y estaban relacionados con lo que se denomina software " CRUD "; OMI eso es muy aburrido.

Paul Nathan
fuente
1

Habiendo enseñado tanto C ++ como Java a nivel universitario, recomendaría encarecidamente Java .

Java ayuda en el proceso de aprendizaje y fomenta un buen comportamiento de programación. Las bibliotecas integradas para Java son útiles y están fácilmente disponibles en cada instalación. Poder crear una aplicación GUI en una oración, usando las bibliotecas integradas disponibles en cada instalación de Java y que coincidan con todos los tutoriales que los estudiantes encuentran en una búsqueda en Google, es crucial para ayudar a los estudiantes a ir más allá del lenguaje y comenzar a comprender los conceptos de programación. .

Los IDEs para Java brindan soporte para estudiantes principiantes y continuos. Traer herramientas poderosas de refactorización a la conversación temprano (mientras se discute sobre POO, por ejemplo) ayudará a los estudiantes a aprender a escribir código que se pueda mantener.

Si bien C ++ es un lenguaje útil para conocer, los conceptos adicionales aprendidos en C ++ realmente no valen el esfuerzo adicional del lenguaje en su conjunto. Hay un gran conjunto adicional de "trucos" que deben enseñarse y que pueden introducirse más adelante (problemas de administración de memoria y desbordamientos de búfer para nombrar un par). Exigir que los estudiantes comprendan esto antes de pasar a conceptos como la complejidad algorítmica y la herencia lo ralentiza, la forma en que requeriría que un conductor entendiera la presión de los neumáticos antes de conducir reduciría la velocidad del conductor. Claro, necesitas saberlo. Pero solo necesita saberlo como algo que se equivocará algún día, no como un componente básico de un concepto más amplio.

Alex Feinman
fuente
2
Si se encuentra con problemas serios con desbordamientos de búfer y administración de memoria, está enseñando mal a C ++. ¿Cuál de los contenedores estándar puede desbordarse como un búfer?
David Thornley el
Matrices? De hecho, puedo haber estado enseñando mal a C ++; Esto fue hace más de una década.
Alex Feinman el
0

Creo que la pregunta más importante que debes hacerte es si quieres ser un buen programador o enfocarte en informática. Si CS es su objetivo y quiere estar en una ruta PHD, entonces quizás Java sea el camino a seguir. Java proporciona las clases de colecciones de Java, que tienen muchas estructuras de datos y algoritmos prefabricados. La ventaja de esto es doble: en primer lugar, puedes jugar con las estructuras de datos y los algoritmos para ver qué hacen antes de preocuparte por cómo se construyeron. En segundo lugar, esto brinda a los profesores más oportunidades para enseñar los principios de CS que usan estructuras de datos sin tener que preocuparse por lo esencial. Más tarde pueden regresar y hacer que sus estudiantes creen las estructuras desde cero.

C ++ por otro lado es un lenguaje de nivel inferior. Te obliga a considerar los punteros y la recolección de basura. La curva de aprendizaje es un poco más pronunciada, pero al final, cuando te encuentres en la programación del camino con marcos externos, sentirás menos que solo estás confiando en la magia oculta. Además, muchas compañías más grandes todavía usan C ++. Es más difícil pasar de Java a C ++ que de C ++ a Java.

Kavet Kerek
fuente
En este momento, mi objetivo es entrar en el desarrollo de software, así que ser un mejor programador. Tengo poco interés en actividades académicas de gran alcance en este momento.
Philip Regan el