Java ou C ++ para cursos universitários de CS?

11

Estou no meio de me matricular na escola para obter um diploma de CS. A escola que estou estudando oferece, na verdade, Java e C ++ para os cursos introdutórios de desenvolvimento de software (programação orientada a objetos, padrões de design, esse tipo de coisa). A escolha do aluno é qual faixa seguir, mas só há tempo para seguir uma.

Sabendo o que você sabe agora, se tivesse a opção, estabeleceria sua base de currículo de CS em Java ou C ++?

Atualmente, meu debate atual é assim:

Um bom amigo (que tem um doutorado em IA) está promovendo Java como a melhor escolha, independentemente do que eu faça, apenas para abrir mais oportunidades de emprego mais tarde, embora possa ser tendencioso, pois todo o seu trabalho foi em Java (ele Amo isso). Eu moro na área de Boston, MA, EUA e vejo uma quantidade igual de trabalho em Java e C.

Por outro lado, embora ainda não tenha decidido totalmente o que quero fazer com o diploma quando terminar, minha preferência seria desenvolver para o Mac, o que estou fazendo agora, embora em uma capacidade limitada. Para esse fim, já estou tendo uma exposição limitada ao C ++, mas não tenho nenhum com Java e, olhando para meus projetos no meu dia de trabalho, não vejo necessidade de usá-lo tão cedo, "medido em breve" por pelo menos dois anos.

Provavelmente, devo observar que sou um adulto voltando à escola depois de 20 anos (atualmente não tenho nenhum diploma), por isso estou procurando maximizar a oportunidade e o tempo gasto da melhor maneira possível. Estou meio inclinado a C ++, mas ainda sou ambivalente e alguns conselhos objetivos e externos ajudariam aqui.

Ou eu poderia estar pensando muito sobre isso.

ATUALIZAÇÃO: Acontece que a seleção de idioma não foi tão clara como eu supunha. Enquanto alguns dos principais cursos se concentram em Java, alguns dos outros cursos principais trabalham principalmente em C e Java, mas também em alguns outros. De fato, meu restante do semestre será no Objective-C depois de passar um tempo em Java e Javascript. O último semestre foi em C, Javascript e PHP, além de alguns outros, conforme as tarefas exigidas. Como as coisas estavam praticamente divididas no meio, e ainda estou recebendo respostas para isso, agora estou tentando trabalhar meu currículo para atender a todos os requisitos do curso, mas para absorver o maior número de idiomas possível. . Até agora, minhas notas não sofreram ao tentar fazer isso.

Philip Regan
fonte
1
Todos no ambiente de pesquisa acadêmica estão divulgando o java no momento. Além disso, independentemente do idioma, você precisa aprender com a universidade como aprender novos idiomas. O C ++ está presente como o java, mas não há afirmação de que eles estarão em 5 anos. Novas linguagens / tecnologias estão sempre chegando; portanto, você precisa estar preparado para buscá-las e se familiarizar rapidamente.
Chris
1
@ Chris: É por isso que minha recomendação seria aprender algo que facilite o aprendizado, em vez de algo popular agora. Eu recomendaria C ++ ou Python em vez de Java (obviamente por razões diferentes).
precisa
Não é essa linguagem que importa. É o conceito abstrato. Entenda o conceito corretamente, para que os alunos possam aprender facilmente qualquer coisa mais tarde na vida.
J-16 SDiZ
1
Estou em uma situação (assustadoramente) semelhante: voltar à escola para CS após 20 anos fora da escola. Minha escola também possui uma faixa dividida em Java / C ++. Depois de ler tudo aqui e até dar +1 à resposta principal, ainda vou usar o Java, e aqui está o porquê, caso seja útil: Estou vindo de desenvolvimento web (Javascript, PHP, Python) , portanto, o suporte das bibliotecas Java é uma vantagem. Supondo que eu também reserve um tempo para realmente capturar os princípios de POO, não acho que mudar para C ++ (se necessário) seja tão difícil. Java é o meio termo entre scripts e compilação.
ser Hollenbeck
2
Acho que discordo de todas as respostas. Realmente não importa . Você aprenderá conceitos semelhantes nos dois idiomas e aprenderá o outro idioma que não escolheu e outros através de seus estudos e carreira.
Matsemann

Respostas:

51

Eu pessoalmente utilizaria o C ++, pois ele fornece informações sobre como partes do Java funcionam sob o capô (ponteiros, por exemplo). Mudar para Java a partir do C ++ é bastante trivial, enquanto mudar o sentido inverso é sem dúvida mais difícil.

A coisa realmente difícil sobre o ecossistema Java é o grande número de estruturas, bibliotecas etc. - é improvável que cubram tudo isso na Universidade.

No final do dia não vai importar que tanto o idioma que você escolher, contanto que você aprender os princípios.

Meu JUG vai me matar por endossar C ++ ;-)

Martijn Verburg
fonte
1
+1 para um excelente ponto sobre o tamanho do Java Eco System e a explicação da transição.
Jas
1
O problema de aprender um grande ecossistema em uma universidade é que isso não será útil ao longo de sua carreira profissional. É melhor aprender menos bibliotecas e aprender conceitos ou se familiarizar com os recursos reais do idioma.
precisa
2
Outro ponto de partida para o C ++ é que você pode executar o C ++ gerenciado no .NET Framework, fornecendo uma orientação para aprender C #, F # e qualquer outro idioma nesse tempo de execução. O Java também tem um ótimo lead-in para a JVM e linguagens como Scala, mas não há nenhuma JVM C ++ que eu conheça.
CodexArcanum
Como alguém que gosta de pensar que é bastante decente em C ++ (e Java), não acho que nenhum curso introdutório de programação moderno deva ser em C ++. É simplesmente muito difícil. Se a universidade não ensina C ++, siga em frente, claro, mas para uma introdução, eu usaria algo mais simples e mais bonito, como Java. Talvez se eu não achasse que todos são maus, eu poderia até recomendar uma linguagem de tipo dinâmico.
Dukeling
Em alguns de nossos dias anteriores ao Java, não tínhamos essa opção e todos aprendemos C ++, então não vejo nenhum problema com as pessoas que ainda aprendem C ++ primeiro. Eu acho que a introdução em Java é melhor do que a introdução no Turbo Pascal.
Bratch
18

Eu tenho que discordar da maioria das pessoas que defendem o Java aqui. Aprender C ++, mesmo que você não tenha estudado a arquitetura de computadores e microprocessadores, oferece muitas informações valiosas sobre o modo como os programas de computador funcionam e operam.

Nota bene, NÃO estou defendendo que você não deva aprender Java (melhor ainda, C #) porque esses são langs modernos e rápidos de desenvolvimento de aplicativos e enormes estruturas foram construídas em torno deles, dando a você acesso a muitas funcionalidades "gratuitas", como acesso a arquivos abstratos e similares, no entanto, um verdadeiro engenheiro de software deve conhecer pelo menos algum C ++, C ou pelo menos assembler, porque é isso que o separa dos tipos de script-kiddie.

Uma vez que você esteja razoavelmente proficiente em C ++, confiante em gerenciamento de memória e STL, escolher Java / C # deve ser fácil.

Jas
fonte
Concordo, tenho certeza de que aprender Java se você já é proficiente em C ++ será muito, muito mais fácil do que aprender C ++ se você já é proficiente em Java.
precisa saber é o seguinte
O problema de se tornar "razoavelmente competente em C ++" é que levará anos e você ainda aprenderá apenas um pequeno subconjunto de OOP.
Henry
Java não é uma linguagem de desenvolvimento rápido de aplicativos. Pode ter um nível um pouco mais alto que o C ++, mas não chega nem perto do nível de abstração do Python, Ruby, Perl ou Visual Basic.
Evan Kroske
@Evan - Sim, Java é uma linguagem de desenvolvimento "rápida", se nada mais for para suas vastas bibliotecas (é comum dizer que qualquer desenvolvedor Java possui documentos da API Java abertos durante o trabalho), além de não precisar gerenciar a memória manualmente. E o homem que projetou o Java, o projetou porque não estava chegando a lugar algum usando C ++. Além disso, o grande número de aplicativos Java implantados hoje (barreira de entrada mais baixa) é outro argumento para sua "rapidez".
Jas
9

Escolas e estudiosos que defendem o Java como a primeira opção devem ter suas cabeças examinadas (ou simplesmente conseguir um emprego de verdade por aí). Estou dizendo isso como uma pessoa que fez desenvolvimento de aplicativos e sistemas em Java nos últimos 12 anos. Java é uma linguagem atroz para o ensino.

O motivo é o seguinte: exceto os talentosos, a maioria dos estudantes pode (e provavelmente nunca) entenderá a orientação a objetos sem entender a programação modular. E eles não conseguem entender a programação modular sem antes entender a programação estruturada em uma linguagem processual. Claro e simples. Um testemunho disso (entre outras coisas) é que, apesar de conhecermos OO há 3-4 décadas, as pessoas ainda escrevem hiper-espaguete na prática.

Além disso, uma pessoa que depende apenas de uma linguagem baseada em gc (seja Java ou .NET) nunca pode realmente se aproximar do hardware. A menos que sua ambição seja criar páginas da web dinâmicas, adivinhem? Você precisa se sentir confortável em se aproximar do idioma.

Você estuda em uma escola de ciências da computação para se tornar um cientista da computação e programador completo (espero que com algumas horas de crédito praticando programação prática em muitas linguagens de programação). Se você tudo que você conhece é Java (ou .NET ou C ou Seja qual for o Python), você é um "programador Java" (não um programador que possa trabalhar em Java, mas um "programador Java"). E isso faz tanto sentido quanto dizer que você é um "carpinteiro de martelo" ou "mecânico de chave de fenda Phillip", não é?

Uma boa escola irá expô-lo ao C (ou alguma outra linguagem processual como Pascal ou Ada), depois ao C ++ e a um assembly, permitindo que você aprenda Java por conta própria ao prosseguir com os cursos de projeto no seu primeiro ano. Além disso, ele deve fornecer exposição a linguagens funcionais para que você entenda o conceito de passar blocos computacionais como argumentos, cálculos livres de efeitos colaterais, transparência de localização e similares (que têm aplicações práticas reais, mesmo na Web).

Você precisa saber o que é um segfault. Você precisa saber o que paginação, memória virtual e toda essa porcaria significam. Você precisa saber como decompor problemas em módulos (sejam eles processuais e baseados em OO). Você precisa saber como os sistemas OO são realmente implementados sob o capô (para que você saiba o custo.) Você precisa saber onde a abstração do OO quebra (e ocorre porque o mundo e os problemas complexos não são necessariamente orientados a objetos).

Você precisa conhecer todas essas coisas para se tornar um cientista da computação completo capaz de trabalhar na empresa ou em um nível muito baixo, implementando coisas no nível do sistema, tanto para o setor comercial quanto para o setor público, tanto em grande como em pequena escala escala.

Os acadêmicos que têm pressionado o Java como a única linguagem a governá-los todos são completamente ignorantes quanto ao que a indústria realmente precisa. Sem noção. Imperdoável sem noção. É o que acontece quando eles trabalham em torres de marfim olhando para o setor à distância.

Eles transformaram os departamentos de Ciência da Computação em caras escolas profissionais de quatro anos, produzindo pôneis com truques de linguagem de programação. E isso poderia ser perdoado se eles pudessem ao menos ensinar aos alunos habilidades básicas de negócios / empresa / organização (ou seja, abandonar a fachada do CS e adotar um currículo MIS). Mas eles nem fazem isso, o que eu acho que é um grande desserviço para a indústria, a economia e, finalmente, os estudantes.

Eu sugiro que você leia a peça de Joel Spolsky em "Java Schools".

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

Em resumo, se eles não ensinam uma linguagem de programação procedural (seja uma industrial como C ou Ada ou boa o suficiente para ensinar como Pascal), e eles fornecem se C ++ (se você tiver sorte) ou Java / C # (se você tiver azar), eu procuraria outra escola. Puro e simples, de um cara que usa Java para viver no mundo real há um bom tempo.

luis.espinal
fonte
De alguém que sabe Java, C e C ++ muito bem e que não se formou muito tempo atrás, eu vou ter que discordar. C (ou C ++) VS Java - Java é muito mais fácil. Talvez se eu comecei com C ++ (o que eu acho incrível (mas não fácil) btw) (em vez de (Delphi (eww) +) Java), é perfeitamente possível que eu teria me desmotivado, desistido e não me tornado um programador (embora talvez tenhamos tido um mau professor de C ++). Mas sim, aprender C ++ a entender os aspectos internos do Java foi absolutamente inestimável. E eu acho que cerca de 95% dos programadores hoje em dia "nunca se aproximam muito do hardware".
Dukeling
" C (ou C ++) VS Java - Java é muito 'mais fácil' " - bem, isso é um dado bem conhecido. Eu não tenho certeza o que isso tem a ver com o meu post, embora (?????)
luis.espinal
Mais fácil de entender, mais fácil de ensinar, mais fácil de aprender, discordo que "Java é uma linguagem atroz para o ensino" e que você deve aprender C primeiro (talvez uma linguagem processual mais fácil seja adequada). Também estou dizendo que C ou C ++ é bom saber, mas não para começar, porque nesse caso é provável que você afaste todos os programadores mais hardcore, porque tenho certeza de que é isso que sobreviverá a uma introdução a programação via C ++. Não que eu me importe com um mundo de programadores hardcore, mas outras pessoas podem. Sim, você está dizendo ser bem-arredondado, mas digo chumbo com Java ou similar.
Dukeling 13/05
Mais fácil de entender e ensinar não se traduz necessariamente em ser uma linguagem adequada para fins pedagógicos. Após 12 anos trabalhando com Java, estou convencido disso. Uma linguagem pedagógica muito melhor e mais fácil que C ou C ++ seria Python, por exemplo ... ou qualquer linguagem que não force todos os métodos a estar em uma classe, ou seja, uma linguagem verdadeiramente multiparadigma em oposição a Java onde tudo é "supostamente" um objeto, onde não há boas alternativas para o escopo além de classes e pacotes, e assim por diante. Limita a capacidade de ensinar modelagem adequada.
Luis.espinal
Java, forçando você a aprender a programar em um modo tudo como objeto, orientado a substantivos, fornece metáforas de modelagem ruins para outros paradigmas mais adequados para a modelagem mundial real. Um desenvolvedor profissional das trincheiras pode contornar essa limitação. Os alunos não perdoam, e me perdoam, mas pouquíssimos professores universitários têm experiência nas trincheiras para saber a distinção. Eu escolheria Python ou Ruby (ou realmente Lisp ou BASIC) sobre Java se o C / C ++ fosse muito pesado.
Luis.espinal
4

Eu acho que depende muito da sua personalidade. Pelo menos da minha perspectiva, Java e C ++ têm orientações radicalmente diferentes que atraem tipos de pessoas substancialmente diferentes.

Quando você se dedica a isso, o Java é na verdade uma grande biblioteca de classes, com uma linguagem suficiente para instanciar objetos e chamar métodos dessa biblioteca. "Aprender Java" consiste, em grande parte, em memorizar (ou pelo menos tomar conhecimento) do que está na biblioteca e como está organizado, para que você possa encontrar o que deseja quando quiser.

O C ++ enfatiza muito menos o fornecimento de código pré-escrito. Embora inclua uma biblioteca (STL 1 ), essa biblioteca é menos sobre o código incluído do que sobre um estilo e conjunto de princípios. É perfeitamente possível escrever um código que seja clara e facilmente reconhecível como código "STL", mesmo que ele use pouco ou nenhum código pré-escrito.

Há também uma diferença bastante substancial na maneira como os idiomas são usados. Java enfatizou fortemente a manutenção da linguagem simples. Isso facilita a construção de ferramentas que manipulam o código Java de várias maneiras (por exemplo, para refatoração). Isso também significa que você tende a precisar de ferramentas que o façam, porque a refatoração geralmente envolve alterações bastante substanciais em grandes quantidades de código.

C ++ é uma linguagem muito mais complexa, o que significa (entre outras coisas) que a construção de ferramentas para manipular o código-fonte C ++ é tremendamente mais difícil do que para Java. O equilíbrio é que é muito menos necessário - uma tarefa de refatoração que pode envolver centenas de alterações em dezenas de arquivos em Java pode ser realizada alterando (por exemplo) um único parâmetro de modelo em C ++.

Java coloca muito mais ênfase em ser fácil de aprender. O C ++ enfatiza muito mais a facilidade de uso - mas (infelizmente) somente se você realmente sabe o que está fazendo.

Não vou advogar por um ou outro. Minha opinião sobre os idiomas é muito menos relevante do que você ter uma idéia do que esperar de cada um e dar uma olhada honesta em si mesmo para descobrir qual é o melhor para você.

1 Sim, eu sei que isso não é realmente preciso, mas estou tentando impedir que isso se transforme em um livro ...

Jerry Coffin
fonte
3

Não acredito que as pessoas estão defendendo C ++ como primeira língua! Você passará a maior parte do tempo escrevendo caldeiras e tentando contornar as limitações e os anzóis do idioma do que realmente aprendendo a programar.

Java é uma linguagem muito mais simples e não atrapalha o seu aprendizado.

Se você precisar aprender C ++, aprenda os conceitos com Java e, em seguida, vá para C ++, ou melhor ainda, OBJ-C, se desejar escrever um software para Mac. Java e OBJ-C não são muito diferentes.

Para sua informação, passei 10 anos como desenvolvedor comercial de C ++.

Henry
fonte
Esta não será minha primeira língua. Eu sou um programador agora voltando para a escola para realmente me formar. Minha experiência com C ++ e Java é limitada, mas tenho experiência com C e Objective-C. Mas obrigado por reservar um tempo para responder.
Philip Regan
3
Java vai ficar no caminho de sua aprendizagem. Ele ensinará a você não-verdades totais sobre conceitos independentes da linguagem.
11132 DeadMG
2

Eu recomendaria C ++. Tive algumas aulas em Java e outras em C ++ na faculdade, e as habilidades específicas de idiomas que aprendi com C ++ me ajudaram mais ao aprender outras linguagens posteriormente. Além disso, embora eu veja muito mais vagas de trabalho Java do que C ++, a maioria está procurando uma pilha Java completa, como:

  • EJB 1.x / 2.0, JNDI, JMS, JTA / JTS, RMI, JDBC, Servlets, JSP, SAX / DOM, Serviços da 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

E é provável que um currículo baseado em Java não o prepare muito melhor do que um currículo baseado em C ++ faria contra uma lista como essa.

Chris
fonte
1
Eu acrescentaria que (pelo menos na minha área) os trabalhos em C ++ também pagam um pouco melhor que os trabalhos em Java (objetivo) e são geralmente mais interessantes (subjetivos).
Cercerilla
2

É difícil porque Java é inegavelmente mais fácil de aprender. Você estará fazendo mais cedo com Java.

C ++ é uma linguagem muito mais difícil de se trabalhar. Ponteiros e gerenciamento de memória são conceitualmente e praticamente difíceis de trabalhar. O C ++ não oferece redes de segurança.

A longo prazo, seria útil entender todas as coisas que o C ++ ensina. Além disso, a transição de C ++ para Java é muito mais fácil do que a outra direção.

Mas eu me pergunto se, ao iniciar e durante muitos projetos de graduação, a sobrecarga extra e a depuração que você precisa fazer para conseguir que algo funcione em C ++ tornaria seus projetos mais difíceis, seus prazos mais difíceis de cumprir e sua vida muito mais frustrante. . Para conseguir o mesmo em C ++ e Java, eu diria que, em quase todos os casos, você faria o trabalho mais rapidamente em Java e enfrentaria menos problemas irritantes. Isso pode ser realmente importante quando você está no final de um semestre e tem cinco cursos que precisam do projeto de final de curso no mesmo dia.

O outro lado disso é que, se esses testes não fizerem com que você jogue a toalha completamente, eles o tornarão um programador melhor se você tiver dominado o C ++. E se sua carreira for em C # ou Java ou python e você nunca precisar tocar em outro indicador de sua vida, apreciará muito mais ...

glenatron
fonte
2

C ++ é o mais flexível e oferece uma compreensão mais profunda. Inquestionavelmente, você obterá mais do C ++ do que do Java. C ++ também é mais difícil, porque é mais complexo.

Dito isto, os trabalhos em C ++ não são tão comuns quanto os trabalhos em Java.

Java e seu descendente, C #, são as soluções padrão para o espaço de codificação de empresas de grande porte. Eu recomendo fortemente que você aprenda um dos dois no seu segundo ano e fique muito confortável com ele quando terminar o curso. Isso permitirá que você obtenha trabalhos muito mais fáceis. Isso não significa que eu acho que esses empregos tenham um interesse intelectual significativo, em média. Eu passei recentemente por trabalhos de software craigslist nas Montanhas Rochosas e a maioria dos trabalhos eram em C # / Java e relacionados ao que é chamado de software " CRUD "; OMI é muito chato.

Paul Nathan
fonte
1

Tendo ensinado C ++ e Java no nível da faculdade, eu recomendaria fortemente Java .

O Java auxilia no processo de aprendizado e incentiva o bom comportamento da programação. As bibliotecas integradas para Java são úteis e facilmente disponíveis em todas as instalações. Ser capaz de criar um aplicativo GUI em uma frase, usando as bibliotecas internas disponíveis em todas as instalações Java e que correspondam a todos os tutoriais que os alunos encontram em uma pesquisa no Google, é crucial para ajudar os alunos a ir além do idioma e começar a entender os conceitos de programação .

Os IDEs para Java fornecem suporte para alunos iniciantes e continuantes. Trazer ferramentas poderosas de refatoração para a conversa mais cedo (ao discutir OOP, por exemplo) ajudará os alunos a aprender a escrever código de manutenção.

Embora o C ++ seja uma linguagem útil para se conhecer, os conceitos adicionais aprendidos no C ++ não valem realmente o esforço extra da linguagem como um todo. Há um grande conjunto extra de "truques" que devem ser ensinados e que podem ser introduzidos posteriormente (problemas de gerenciamento de memória e estouros de buffer para citar alguns). Exigir que os alunos os entendam antes de passar para conceitos como complexidade e herança algorítmica diminui a velocidade, da mesma maneira que exigir que o motorista entenda a pressão dos pneus antes de dirigir desacelerará o Ed do motorista. Claro, você precisa saber disso. Mas você só precisa conhecê-lo como algo que você errará algum dia, não como um componente de um conceito maior.

Alex Feinman
fonte
2
Se você tiver problemas sérios com estouros de buffer e gerenciamento de memória, estará ensinando C ++ errado. Qual dos contêineres padrão pode transbordar como um buffer?
precisa
Matrizes? Na verdade, posso estar ensinando C ++ errado; isso foi há mais de uma década.
Alex Feinman
0

Penso que a pergunta mais importante é se você quer ser um bom programador ou se concentrar em ciência da computação. Se CS é seu objetivo e você deseja estar em uma rota PHD, talvez Java seja o caminho a seguir. Java fornece as classes de coleções Java, que possuem muitas estruturas de dados e algoritmos pré-fabricados. A vantagem disso é dupla: primeiro, é possível brincar com as estruturas e algoritmos de dados para ver o que eles fazem antes de se preocupar com a forma como foram construídos. Segundo, isso oferece aos professores mais oportunidade de ensinar princípios de CS que usam estruturas de dados sem ter que se preocupar com o âmago da questão. Mais tarde, eles podem voltar e pedir aos alunos que criem as estruturas do zero.

C ++, por outro lado, é uma linguagem de nível inferior. Obriga você a considerar indicadores e coleta de lixo. A curva de aprendizado é um pouco mais íngreme, mas no final, quando você se encontra programando com estruturas externas, sentirá menos como se estivesse apenas confiando na magia oculta. Além disso, muitas empresas maiores ainda estão usando C ++. É mais difícil ir de Java para C ++ do que C ++ para Java.

Kavet Kerek
fonte
No momento, meu objetivo é apenas entrar no desenvolvimento de software, para me tornar um programador melhor. Neste momento, tenho pouco interesse em atividades acadêmicas de longo alcance.
Philip Regan