Edição: Esta questão no início parece bashing Java, e acho que neste momento é um pouco. No entanto, o ponto mais importante que estou tentando destacar é por que qualquer idioma único é escolhido como o único fim, tudo solução para todos os problemas. Por acaso, o Java é o que é usado, por isso tive de bater aqui, mas não sou intencional: rasgar o Java por um novo :)
Eu não gosto de Java na maioria das configurações acadêmicas. Não estou dizendo que o idioma em si seja ruim - ele tem vários aspectos extremamente desejáveis, o mais importante é a capacidade de executar sem recompilação na maioria das plataformas. Não há nada errado em usar o idioma para o seu próximo aplicativo ^ TM. (Não é algo que eu faria pessoalmente, mas é mais porque tenho menos experiência com isso, em vez de ser ruim no design)
Eu acho que é um desperdício que cursos de CS de alto nível sejam ministrados usando Java como linguagem. Muitos dos meus colegas não conseguem programar nada, porque não sabem como trabalhar em um mundo sem coleta de lixo. Eles não entendem fundamentalmente as máquinas para as quais estão programando. Quando alguém pode trabalhar fora de um mundo coletado de lixo, ele pode trabalhar dentro de um, mas não vice-versa. GC é uma ferramenta, não uma muleta. Mas a maneira como é usada para ensinar estudantes de ciência da computação é uma muleta.
A ciência da computação não deve ensinar um conjunto completo de cursos adaptados a um único idioma. Os alunos partem da ideia de que todo bom design é um design Java idiomático e que o Design Orientado a Objetos é a ÚNICA MANEIRA VERDADEIRA DE QUE É A ÚNICA MANEIRA QUE AS COISAS PODEM SER FEITAS. Outras línguas, pelo menos uma delas não sendo uma coleta de lixo, devem ser usadas no ensino, a fim de dar ao graduado uma melhor compreensão das máquinas.
É uma vergonha que alguém com um PHD em CS de uma instituição respeitada não consiga programar o caminho para sair de um saco de papel.
O pior é que, quando converso com os professores de CS que realmente entendem como as coisas funcionam, eles compartilham sentimentos como este, que estamos fazendo um desserviço aos nossos alunos, fazendo tudo em Java. (Observe que o acima seria o mesmo se eu o substituísse por qualquer outra linguagem, geralmente usando um único idioma é o problema, não o próprio Java)
No total, sinto que não posso mais respeitar nenhum tipo de diploma - quando não consigo ver os que estão ao meu redor capazes de programar a saída de problemas de zumbido.
Por que / como foi assim?
fonte
Respostas:
Este não é um problema de Java, é um problema de ensino. Não saber programar não é uma falha de idiomas, é uma falha dos alunos. O mesmo vale para todos os seus problemas, GC, conhecimento básico de máquinas, como as coisas funcionam "sob o capô", por assim dizer.
Sua queixa principal sobre a coleta de lixo me deixa levemente. A menos que você esteja fazendo uma coleta de lixo em C ou C ++, normalmente é muito bom e não é um problema. Você prefere que todos aprendam montagem? Idiomas de nível superior que são rigorosos são muito úteis para o ensino. Ele oferece a flexibilidade de bibliotecas, pacotes e outros detalhes quando você precisar, sem a linguagem confusa "sugar" presente na maioria das outras linguagens de nível superior (PHP, Ruby, Python, Perl).
fonte
As universidades estão realmente fazendo isso? Ou isso é apenas uma percepção que as pessoas têm quando obtêm um candidato ruim para uma entrevista de emprego?
Eu me formei em CS há 4 anos e, embora o Java fosse usado nas aulas de introdução, ele não foi particularmente enfatizado depois disso. Em primeiro lugar, os principais cursos exigidos exigiam que você aprendesse Java, C, C ++, SML (linguagem de programação funcional), assembly, matlab e CAST (linguagem de descrição de circuitos). Isso não leva em consideração todos os cursos teóricos e matemáticos de CS e, é claro, a meia dúzia de cursos eletivos de CS que o teriam exposto a muito mais. Conversando com amigos em várias universidades diferentes, não parecia que o que eles estavam fazendo era muito diferente.
Se há universidades ensinando apenas Java, isso é realmente uma tragédia. Não porque Java é ruim, mas porque é apenas uma ferramenta de muitas que deve estar disponível para um programador. Um desenvolvedor que conhece apenas Java é equivalente a um carpinteiro que sabe apenas usar um martelo. No entanto, tenho dificuldade em acreditar que esse seja realmente o caso, pelo menos para as universidades respeitadas. Eu suspeito que essa é apenas a percepção de ver candidatos ruins e culpar a escola pela incompetência dos candidatos, e não pela falta de motivação / motivação / curiosidade / profissionalismo / etc.
fonte
Estou realmente surpreso que esta seja a situação de muitas escolas. Quando me formei em CS, tive uma série de cursos de idiomas que incluíam todos os idiomas populares do dia (quase 40 anos atrás): assembler (Univac 1108 e MIX), FORTRAN IV, SNOBOL4, COBOL, Lisp e Algol 68. Não consigo imaginar ter apenas um idioma sendo ensinado. Ou como eu poderia apreciar o que os compiladores tinham que fazer sem ter escrito alguns programas assembler.
Usamos Algol e FORTRAN na maioria dos cursos de dados e algoritmos. Eu gostaria de ter passado mais tempo com o Lisp - em vez disso, tivemos apenas uma introdução e agora estou tentando reaprender alguns dos conceitos. Usamos o SNOBOL4 para escrever analisadores - e sua correspondência de padrões com o backtracking criou uma boa base para o trabalho posterior das bibliotecas regex incluídas em muitas linguagens modernas.
Essa introdução a meia dúzia de idiomas despertou em mim um interesse que continua desde então.
fonte
Para entender o motivo real, você teria que perguntar às pessoas que administram essas instituições (e mesmo assim, elas podem não lhe contar).
Várias razões possíveis (e não estou defendendo nem acusando ninguém aqui, apenas supondo):
Você pode fazer as coisas em Java
Java é uma linguagem de uso geral e, como tal, pode ser usada para resolver muitos problemas.
Muitos professores entendem Java
É difícil ensinar um idioma que você não entende
Java é popular
O que significa que existem muitos recursos Java - livros, uma comunidade ativa, bibliotecas de códigos etc.
Java é fácil
Você não precisa entender muitas coisas ou teoria de baixo nível para fazer Java. Você pode não fazê-lo bem , mas pelo menos pode fazer as coisas.
Java é difundido
Você pode executá-lo em mais ou menos qualquer coisa.
Existem trabalhos para programadores Java
Existem muitos trabalhos que precisam de Java - os professores devem preparar os alunos para o mundo real.
O tempo é limitado
Em muitos cursos, não há tempo para ensinar vários idiomas, teorias, conceitos de baixo nível etc.
É o que os alunos querem
Muitos estudantes já ouviram falar (e até usaram) de Java. Eles gostam porque é familiar.
fonte
Foi isso que a indústria pediu. Havia uma escassez de desenvolvedores Java, então as escolas começaram a criá-los. As empresas têm desenvolvedores que podem começar a trabalhar assim que atravessam a porta.
De qualquer forma, o idioma não importa. Eles podiam ensinar uma linguagem que não fosse o GC e ainda produzir programadores ruins. O uso das escolas de idiomas é um detalhe de implementação. As escolas devem ensinar conceitos. Se não for esse o caso, é a escola que é o problema, não o idioma com o qual ensinam. Só porque alguém não sabe o que é um ponteiro não significa que não pode ser um programador eficaz.
GC é o caminho do futuro de qualquer maneira.
fonte
Preguiça e motivo de lucro. Java leva a maioria das pessoas 80% do caminho, com 20% do esforço. No entanto, isso geralmente produz codificadores de vodu "macaco vê macaco fazer" que não têm um entendimento profundo do que está acontecendo e são incapazes de se aprofundar mais do que as ferramentas de alto nível.
Ensinar C / C ++ corretamente é difícil. Mesmo quando bem feito, poucos não entenderão completamente os conceitos de baixo nível, como ponteiros (existem estudos sobre isso). Além disso, não parece imediatamente relevante no mercado de trabalho.
fonte
Eu concordo principalmente, mas até certo ponto.
Se você deseja ensinar o CS Cource focado em estruturas de dados ou algoritmos. Tirar a maior parte do material desnecessário do caminho é uma coisa boa. Você não quer que os alunos lidem com coisas de baixo nível ao aprender conceitos de alto nível.
Por outro lado, coisas de baixo nível também devem ser ensinadas. Só assim temos mais programadores completos.
fonte
Como sempre, é uma questão do que você deseja ensinar e quanto tempo você tem para fazê-lo.
Fazer coisas em Java significa que você não precisa lidar com ponteiros perdidos e free / malloc. Isso significa muito menos erros difíceis de encontrar.
Isso não significa que você não deva aprender sobre a máquina subjacente - que deve ser boa no comércio -, mas que talvez deva escolher a ferramenta certa para o trabalho. Algoritmos de alto nível talvez não sejam o melhor tópico para o curso de montador.
fonte
É pedir demais que eles aprendam algo sobre como os computadores realmente funcionam? Não faz sentido para mim que qualquer esquema de curso de CS não inclua algo de sistemas operacionais e arquitetura de computadores. Não estou dizendo que você deve criar um computador na parte de trás de um envelope, mas uma visão geral coloca todos os idiomas em perspectiva. Quero dizer, Java roda em uma máquina virtual!
fonte
Com toda a honestidade, não acho que você deva perder o respeito por todos os graus e, especialmente, pelo CS, porque a única linguagem ensinada é o Java.
Qualquer comp decente. O aluno de ciência da computação entende que seu diploma em CS nada mais é do que um pedaço de papel e que o conhecimento real virá de projetos e estudos pessoais. Eu gostaria de pensar que os bons alunos sabem que precisam conhecer C e aprender como fazer as coisas no Linux / Unix e aprender como NÃO ter a mão nas linguagens modernas.
fonte
Não vejo problema em usar Java. O maior problema (como você mencionou) é quando as universidades ensinam programação imperativa como a melhor e única maneira de resolver todos os seus problemas. Isso é muito longe da verdade. Por exemplo, em vez de usar três linguagens imperativas (ou pior ainda a mesma linguagem) para três cursos diferentes, eles devem usar três paradigmas de programação diferentes. Um exemplo é Java (imperativo), Prolog (declarativo) e Haskell (funcional).
Quanto a isso, acho que é uma combinação de (1) política - os presidentes não têm a mente aberta ou têm benefícios / patrocinadores pessoais e (2) preguiça - os professores já foram estudantes e ensinam o que sabem ou gostam.
fonte
Calvin College em Grand Rapids Mi. Depois que eles mudaram de Java para Python para aulas de programação introdutórias, o professor, incrédulo, mencionou um grupo de nós perto do final de seu semestre: "Muitos deles podem realmente programar, é incrível". Seu espanto contrasta com as experiências anteriores com Java. Isso não faz do Java uma linguagem ruim, apenas difícil de entender do zero. Eu argumentaria a mesma coisa sobre C, C ++ ou qualquer linguagem que exija conhecimento íntimo de esquemas ou tipos de alocação de memória.
fonte
Eu me formei em engenharia de sistemas de computadores, então estudei montagem, microprocessadores, VHDL, quais são as portas lógicas e como criar um flip-flop a partir delas, estudei circuitos elétricos, amplificadores operacionais, filtros passa-baixa, amplitude modulação, construiu um circuito em um laboratório que soaria como um teclado telefônico, mexeu com um analisador lógico, teve algumas aulas de física. No lado do Linux - recompilei um kernel antes, escrevi um pequeno driver de dispositivo e um sistema de arquivos para trabalhos de casa.
Mas então percebi que gosto muito mais de coisas de alto nível. Prefiro Python a C. Eu gosto de C # e amo o coletor de lixo. Gosto de matemática, algoritmos e estruturas de dados, mas não sou fã de indicadores - posso mexer com eles; Eu apenas não quero.
Então, você acha que a universidade deveria ensinar mais C, menos Java. Alguém pensa que deveria ensinar tudo no Scheme. Spolsky vai levar os dois.
Sim, é verdade que um diploma universitário é apenas um pedaço de papel, mas "não deixe que a escolaridade atrapalhe sua educação". Sempre há Wikipedia, Stack Overflow, Coursera.org, etc. Parece que as universidades tradicionais se tornarão menos importantes.
Se eu pudesse fazer graduação em todo o mundo, então eu teria estudado em uma escola diferente, não teria estudado nada sobre engenharia elétrica, mas sim matemática, matemática e física menor em física e francês. Scratch French; Eu deveria ter estudado no exterior na Suíça e aprendido 5 línguas naturais. Eu também voltaria e encontraria uma pessoa que me convenceu de que devo absolutamente fazer uma introdução às aulas de economia na faculdade para sobreviver no mundo real e dar um tapa na cabeça dele com minha coleção de livros de Milton Friedman (os únicos poucos livros sobre economia que li que não são ruins). Também não pagaria dinheiro pelo livro Freakonomics 1 ou por um livro sobre a linguagem Perl.
Em uma retrospectiva, eu teria feito muitas coisas de maneira diferente. Tudo o que posso fazer agora, e recomendo isso para você, é escolher sua própria aventura: http://www.codinghorror.com/blog/2008/03/choosing-your-own-adventure.html
Em retrospecto, eu já teria feito 100 bilhões de dólares na bolsa de valores e teria investido em pesquisas sobre o câncer; teria contratado cientistas para livrar o mundo do lixo plástico; Eu teria doado dinheiro suficiente para a campanha de Ron Paul, para que a guerra no Oriente Médio fosse mais de três anos atrás.
Reconheça agora que você nunca terá seu tempo de volta, então tente gastá-lo com sabedoria.
fonte
Alguns anos atrás, li em algum lugar que, no Reino Unido, a decisão Java foi tomada para atrair mais estudantes para a programação. Aparentemente, foi mais fácil para o cérebro por causa da falta de indicadores desagradáveis e gerenciamento de memória, etc. Eu acho que essa é a razão pela qual o Python está sendo rapidamente adotado como a nova 'ferramenta de aprendizado'. Eu seria da opinião de que seu curso típico da universidade não fará de você um programador. Tudo o que se pretende fazer é armá-lo com uma certa quantidade de conhecimento e prepará-lo para a programação. O dia em que alguém pode se chamar um programador geralmente passa um bom tempo depois da universidade e, quando esse momento chegar, indicadores, coleta de lixo e paradigmas de programação que não sejam OOP, não devem ser um problema.
fonte
Por que o Java é usado?
Três razões:
Java usa sintaxe no estilo C. Muitos programadores estão familiarizados com isso, o que reduz a curva de aprendizado.
O dinheiro foi gasto para comercializar o Java como moderno e legal. Mas comparado ao lisp, o java está vivendo na idade da pedra.
A JVM. JVM é a única coisa legal sobre o java que é legítima, não apenas o hype do marketing. Embora a JVM deva ser elogiada como uma plataforma para a execução de programas, ela não merece por si só a existência da linguagem Java. Você pode compilar teoricamente e praticamente muitos idiomas diferentes para a JVM.
fonte
Sua pergunta está apoiando as descobertas de outra pessoa que escreveu um artigo dizendo que Java é tão legal, mas não pesado o suficiente para a computação científica. Eu acho que ele deveria usar o Big Decimal com todas as suas precisão, NANs, etc. e seguir em frente.
Eu quero viver apenas em um mundo automático de coleta de lixo. Sua estética, mais limpa, organizada e saudável, evita o desperdício de dinheiro em despesas de saúde, é mais desejável - não precisa marcar algo como indesejável - simplesmente desmarcando-o ou definindo-o como nulo ou quando saio do escopo, o item fica automaticamente marcado para coleta de lixo ..
Ok, agora estou falando apenas sobre Java, mas seria muito útil se isso também funcionar no cenário de lixo real. O Java é uma vez executado em qualquer lugar, o que é bom o suficiente para ser usado como linguagem nas escolas. Nenhum vazamento de memória e ser apreciado por programadores felizes que não querem gastar tempo etiquetando todos os objetos que usam e parando de usar são uma boa lógica em nome do Java.
Java tem ponteiros - bem, nós os chamamos de referências .. String s1 = "Hello"; String s2 = "Olá"; String s3 = new String ("Olá");
s1 e s2 apontam para o mesmo objeto String - que é por referência s1 == s2, s1.equals (s3), mas s1 == s3 é falso porque s3 é um novo objeto de referência - essa é a aritmética java de referências e eu entendo tudo isso tão desculpe, não desejo ser rotulado como alguém que não entende as complexidades subjacentes da aritmética de ponteiros de C ou C ++.
fonte