Quais linguagens de programação todos os estudantes de ciências da computação devem aprender?

13

Quais idiomas (ou classes (como nos paradigmas) das linguagens de programação, mais um idioma recomendado para essa classe) todos os estudantes de ciências da computação devem ser ensinados na faculdade, de acordo com você? Motive suas respostas; por que esse idioma? Que utilidade terá disso? Que conceitos ele ensina (melhor que o idioma X)?

Nota / esclarecimento : Esta pergunta é sobre ciência da computação, com forte foco em engenharia de software, não pura ciência da computação. Ainda é o ensino da ciência da computação e não o ensino da engenharia de software que é o foco.

Anto
fonte
13
O código psuedo deve ser suficiente para CS.
Jé Queue
12
@Xepoch - discordo. Não é particularmente natural expressar semântica de avaliação ansiosa versus preguiçosa, covariância / contravariância em assinaturas de tipos, teoria de categorias etc. usando pseudo-código. O pseudo-código é ótimo para descrever algoritmos e estruturas de dados, mas há muito mais no CS do que isso.
Aidan Cully
6
Além disso, a grande maioria dos estudantes de CS espera conseguir um emprego não acadêmico após a formatura. O pseudocódigo não valerá muito em um mercado de trabalho competitivo. Eu não acho que um diploma de CS deva ser primariamente treinamento de emprego, mas ele precisa fazer alguma acomodação nessa direção.
Adam Crossland
2
TODOS ELES . Se o tempo for limitado, comece pelas letras do alfabeto. A +, B, C, C #, D, E, F #, J, K, Q, R, T ... Na verdade, não é uma lista ruim.
Jesse Millikan
6
Parabéns por descobrir mais uma versão do "Qual idioma?" questão. Mal posso esperar para ler todas as opiniões. Não esqueça a referência ao SICP. Oh espera, aí está.
Corbin março

Respostas:

21

Vou dar uma lista:

  • Assembléia (um dialeto relativamente simples): É importante entender pelo menos um pouco dos fundamentos
  • C: linguagem processual, usada em muitos lugares. Não sobrecarrega os novos alunos com conceitos totalmente novos como OOD de uma só vez.
  • Java / C # / Eiffel / C ++: Algo Orientado a Objetos é bom, qualquer um deles atingiria o objetivo de ensinar aos alunos OOD e, depois que eles entenderem uma dessas linguagens, deverão aprender as outras. Existem muitas boas línguas, listei Eiffel porque também possui design por contrato.
  • LISP e Prolog: ensina aos alunos uma maneira totalmente nova de pensar, o que é importante, mesmo que eles nunca usem nenhum deles "no mundo real".
  • SQL e XML: apresenta novas maneiras de pensar sobre os dados e como recuperá-los e gerenciá-los.

Os estudantes devem ser expostos a todos esses paradigmas, no mínimo. Não é apenas um ou dois.

Suponho que muitas pessoas sugeram que o Python cubra o estilo processual, o estilo OOP e talvez outros, mas eu não tenho experiência pessoal suficiente com o Python para poder recomendá-lo com confiança.

FrustratedWithFormsDesigner
fonte
Eu realmente queria que minha escola tivesse entrado em mais detalhes sobre XML e SQL, tivemos uma turma que entrou nas duas e foi terrível.
Eu adicionaria modernas linguagens dinâmicas, como Lua, Python, Javascript, etc
Javier
4
ah, também alguma incondicional funcionais, como Haskell e Erlang são muito educativo
Javier
1
+1 para listar SQL. Pelo menos você está pensando em álgebra relacional.
Jé Queue
1
Eu também separaria OO gerenciado de OO não gerenciado, C ++ e Java. Embora eu nunca usei C ++ desde a uni sem aprender sobre malloc, heap e stack, você nunca entenderá o OO tão bem.
markmnl
45

Pessoalmente, acho um pouco triste que as linguagens funcionais não sejam ensinadas predominantemente como costumavam ser. Penso que, no mínimo, os alunos de ciências sociais devem ser expostos a uma linguagem de todos os principais paradigmas: processual, orientado a objetos, funcional e dinâmico.

Michael Brown
fonte
2
+1 A minha aula de linguagens de programação foi facilmente a aula mais valiosa que eu participei.
24911 HappyCodeMonkey
1
Como estudante de TI, eu definitivamente concordo. Tenho o benefício de trabalhar em período integral no mundo real enquanto vou para a escola como desenvolvedor de aplicativos web de nível júnior, mas sinto que, mesmo se eu tivesse um diploma completo de CS, estaria perdendo muita cobertura das diferentes paradigmas.
24711 Ken
1
Um pouco relacionado: youtube.com/watch?v=Ps8jOj7diA0 Stanford tem suas palestras completas sobre os Paradigmas de Programação 2008 no YouTube.
Inaimathi
4
Adicione declarativo à lista (Prolog). Além disso, alguns idiomas são explicitamente paralelos (Occam). Ensinar aos alunos como o paralelismo funciona seria bom (ninguém entende direito).
Martin York
1
@ Martin York: Prolog é uma linguagem de programação lógica , que é um tipo de linguagem declarativa. (Digo isto como linguagens de programação funcionais são também declarativa, de um modo geral.)
mipadi
33

Eu acho que um estudante de CS bem equilibrado deve aprender uma linguagem em cada um dos quatro tipos de linguagem de programação:

Funcional - Lisp / Haskell / PostScript. Não tenho muita experiência com Haskell, mas ouvi outros programadores que se entusiasmam com isso. Compreender as construções da programação funcional e por que elas são úteis em muitas situações ajudará o programador a melhorar a organização de algoritmos em outros idiomas também.

Orientado a objetos - faça a sua escolha. C # / Java / Python / Ruby / yadda yadda yadda. Esse tipo precisa ser ensinado simplesmente porque é isso que as empresas modernas desejam.

Imperativo - C / Fortran / Pascal. Estes são menos comuns atualmente, mas ainda devem ser aprendidos de uma perspectiva prática / histórica. Os métodos que eles empregam ainda têm praticidade, porque em todas as línguas tudo se resume a uma instrução. E linguagens imperativas são muito boas em listar e seguir instruções.

Lógico - ProLog. Nunca encontrei um bom uso prático para nenhuma dessas linguagens, mas encontrei alguns dos conceitos por trás das linguagens lógicas úteis ao tentar descobrir como escrever alguns dos meus métodos em linguagens mais orientadas a objetos. Não consegui me concentrar muito nas linguagens lógicas durante meus anos de faculdade, e acho que um foco mais forte por lá poderia ter me ajudado bastante.

Joel Etherton
fonte
6
Convém adicionar protótipos a essa lista - por exemplo, JavaScript.
stusmith
@stusmith - O prototípico merece uma menção, mas é realmente um subconjunto de linguagens orientadas a objetos, e o javascript é um exemplo limitado, na melhor das hipóteses. Eu consideraria talvez uma tarefa de casa em um curso de linguagens de programação, mas não um foco.
Joel Etherton
1
+1 para o Prolog. Vi seu uso prático e uso regularmente para prototipar algoritmos.
Fred Foo
@ Larsmans - Eu estaria interessado em ouvir sobre o seu uso dele. Eu não o toquei há vários anos, por isso estou confuso em boas aplicações práticas dele. Você possui links para whitepapers ou artigos semelhantes?
Joel Etherton
Confira o ECLiPSe ( eclipseclp.org ), um dialeto Prolog de código aberto usado industrialmente por várias grandes empresas européias (junto à empresa ferroviária francesa SNCF, se bem me lembro; tentarei encontrar uma referência).
Fred Foo
6

O idioma nº 1 que todo graduado em CS deve conhecer é aquele que maximiza seu potencial para conseguir um ótimo emprego. Isso mudará com o tempo, mudará com base na definição individual de ótimo trabalho e variará por região geográfica.

Por enquanto, direi que o inglês é o idioma número 1 que todo especialista em CS deve conhecer (isso, é claro, varia de acordo com a região).

oosterwal
fonte
Um ótimo trabalho é um efeito colateral de um diploma de CS. Um diploma de CS é justamente isso, conhecimento da teoria computacional. Eu poderia facilmente ter conseguido um emprego melhor na educação profissional, em vez de ficar sem cabeça em matemática e matemática por todos esses anos.
Jé Queue
2
+1 para inglês. Linguagens de computador são detalhes de implementação.
Wyatt Barnett
+1. Se alguém aprender inglês bem, poderá aprender bem os manuais. Eu conhecia bem o ingles Não tive problemas em aprender nenhum idioma.
Shiplu Mokaddim 26/10/12
4

Eu acho que muda com o tempo, mas idealmente - 3 idiomas de 3 perspectivas muito diferentes. Na minha época, era processual, OO e funcional - Pascal, C ++ e LISP. Eu não sou tão tão vendido particularmente nesses três. Mas quando entrevisto, procuro:

  • Algum nível de experiência com um idioma em que você deve prestar atenção ao gerenciamento de memória (C / C ++ e muitos outros)
  • Algum nível de experiência com uma linguagem orientada a objetos com expectativas sobre o uso da API e as várias abstrações disponíveis (C ++ / Java)
  • Uma linguagem "esticada" - algo estranho, difícil e desafiador. Não vou contratar porque alguém conhece LISP, assembly ou alguma outra linguagem desafiadora, mas quero ver que o engenheiro enfrentou algum tipo de desafio que envolvia a solução de problemas sérios e muitos "que diabos é isso?" momentos.

Como outro negócio - acho que os programas de CS precisam treinar os alunos em idiomas de destaque no mercado. A qualquer momento, acho que 2-3 idiomas têm um destaque importante para a maioria dos empregos. Eu acho que uma escola deve aos alunos oferecer a oportunidade de aprender 2 em cada 3 desses idiomas com uma profundidade de treinamento disponível em pelo menos um.

bethlakshmi
fonte
4

Para um estudante de CS, procure por linguagens de programação que sejam mapeadas de perto para os conceitos de CS que estão sendo discutidos. Eu sugiro:

  • Esquema, para entender melhor o cálculo lambda
  • Erlang, para entender o modelo de ator
  • Prolog, para lógica de predicado e sistemas de prova
  • Haskell, para a teoria de tipos / categorias, e porque a avaliação preguiçosa é tão completamente expressa na linguagem
  • pelo menos uma linguagem assembly - se você quiser contá-la nesse banner, eu também lançaria uma linguagem de código de bytes, como os códigos de bytes Java ou CLR e o LLVM IR
  • provavelmente uma linguagem de definição de hardware, como Verilog ou VHDL
  • Bisonte para uma classe de construção de compilador
  • algo com um sistema de tipos dinâmicos (Ruby vem à mente) ...

A lista poderia continuar dessa maneira, mas a idéia fundamental é bem simples: ensine aos alunos a linguagem de programação que melhor se adequa à maneira como você deseja ensinar os conceitos.

Aidan Cully
fonte
3

yacc

para ter uma idéia do que está acontecendo nos bastidores, qualquer que seja a linguagem de programação que você esteja usando. ajuda a compreender conceitos básicos como código morto e vários tipos de otimizações que um (bom) compilador poderá fazer por você.

mariotomo
fonte
2

Lisp (com CLOS para OOP) e Haskell. Esta questão não se restringe aos estudantes. Novas linguagens de programação sofisticadas emprestaram (copiadas, roubadas? ... não, não é ruim) muitos recursos desses dois. Você pode se preparar para o futuro. Atualmente, a programação funcional (estilo) é mais importante e é introduzida em linguagens de programação imperativas como C # (LINQ) ou C ++ (lambda) e muito mais. É uma pena que alguns alunos estejam aprendendo apenas Java.

knivil
fonte
1
Embora eu concorde com os dois, convém escrever alguns argumentos (também observarei que não seria particularmente útil conhecê-los como seus únicos idiomas).
Inaimathi
2

Eu acho que a linguagem não é tão importante quanto as pessoas acreditam.

Sim, você precisa saber como programar, etc., mas muitos grandes programadores são autodidatas, aproveitando suas experiências do mundo real que os ajudam no desenvolvimento.

Os alunos poderiam aprender algumas lições sobre como programar no mundo real e não apenas os métodos do livro, isso os tornaria mais "arredondados" e, na minha opção, melhores desenvolvedores / graduados.

Aprendi mais sobre programação e desenvolvimento de software depois que saí da universidade e comecei a trabalhar!

user18041
fonte
2

REALMENTE IMPORTA?

Normalmente, a coceira por trás dessa pergunta é "Que palavras de ordem posso colocar no meu currículo que me proporcionarão os trabalhos mais lucrativos / interessantes / desafiadores / fáceis?". Embora a questão tenha méritos, a maioria dos currículos é examinada pela primeira vez por pessoas de RH que não entendem o que estão procurando. mas é muito superficial, pois depois de passar pelos portões, você precisa entregar a mercadoria.

Não são as linguagens que você conhece que o tornam um programador bom ou ruim, é como você pode usá-lo. Para isso, existem basicamente duas categorias de programadores:

  1. Os que se concentram no aprendizado de um idioma são essenciais. O mais importante é o idioma e como usá-lo. Em extremos, eles tendem a otimizar super cada pequeno pedaço de código e geralmente usam recursos obscuros apenas porque podem.

  2. Depois, há quem queira aprender sobre técnicas e paradigmas. O idioma que eles usam realmente não importa, desde que ele possa expressar sua imagem mental com elegância. Em extremos, eles tenderão a usar UML ou outros sistemas, esperando que outros façam o trabalho pesado de codificá-lo.

Na minha opinião, você precisa de ambos. O número 1 fornecerá habilidades de curto prazo e, quando escolhido com sabedoria, facilitará você através dos portões de RH, mas o número 2 permanecerá com você toda a sua carreira e o definirá como programador.

O nº 2 fornecerá orientação e organizará sua linha de pensamento em direção a uma solução que funcione para o problema em questão, mas sem 1 isso permanece uma idéia, sempre flutuando nos limbos do paraíso dos vapores (ou inferno, dependendo de onde você olha).

O número 1 lhe dará os meios para implementar idéias em sistemas de trabalho reais, mas sem o sistema 2, eles tenderão a monstros disformes e cancerosos.

Newtopian
fonte
Sim, isso importa. O primeiro idioma que você aprende molda seu cérebro a respeito de como você olhará para os idiomas futuros.
1

Eu acredito que você respondeu parcialmente a sua pergunta.

De real importância é dar aos alunos a oportunidade de entrar em contato com vários paradigmas, os idiomas reais não devem importar.

Obviamente, é importante ensinar principalmente os paradigmas que oferecem a maioria das oportunidades de trabalho (provavelmente OOP neste momento). Portanto, também é melhor ensinar uma linguagem amplamente usada para esse paradigma, pois isso é mais útil do que aprender algo que você provavelmente nunca usará. Portanto, eu também odiava ter que escrever pseudo-código nos meus exames. O pseudocódigo é bom, desde que não tenha uma sintaxe 'fixa'. Você deve ser capaz de transmitir conceitos.

Tão concretamente:

OOP: .NET ou Java

Pelo menos 1 paradigma de programação adicional, para conscientizar o aluno sobre outras abordagens.

Funcional: Lisp?

Steven Jeuris
fonte
funcional, não, por favor, não LISP. sim: haskell.
Mariotomo
1

Linguagem de montagem e microcódigo. Um estudante de CS deve entender todas as camadas básicas de abstração entre máquinas de estado booleanas e os mais recentes funcionais de alto nível / OOP / etc. paradigma da linguagem de programação.

Básico ou Logo ou Squeak (et.al.), se eles quiserem entender como ensinar às crianças pequenas algum conhecimento em informática.

Fortran, Cobol e Lisp, se eles querem entender a história das linguagens de programação e quais são os problemas reais corrigidos pelas práticas modernas.

hotpaw2
fonte
E C, para entender 90% de todo o código-fonte aberto que você pode estudar.
rightfold 28/02
1

Escolher 3 ou mais idiomas de diferentes paradigmas não é tão difícil, muitas boas respostas foram dadas. Mas se eu tivesse que escolher apenas um idioma, iria para o Scala, porque é funcional e orientado a objetos. Você pode explicar e comparar diferentes abordagens no mesmo idioma.

Sean Patrick Floyd
fonte
1

Não se esqueça das linguagens orientadas a pilha / concatenativas! Eles podem ser verdadeiros dobradores de mente. Eles enfatizam a complexidade da construção usando primitivas pequenas e fáceis de entender. Você pode usá-los para escrever código sem ponto (ou tácito) que parece tão limpo.

A linguagem clássica é a quarta , mas o meu objetivo atualmente é o fator . Também vale a pena conferir o Joy and Cat . Não perca o wiki da linguagem concatenativa . É mais divertido do que uma sacola cheia de martelos!

Roger escasso
fonte
0

Algo funcional, Haskell ou Lisp, seria minha primeira escolha, mas talvez Erlang. Linguagens funcionais realmente ensinam como criar abstrações de uma maneira muito poderosa.

Zachary K
fonte
Mas os estudantes devem se limitar a um paradigma? E as linguagens funcionais de POO como o Scala?
Anto
1
Não, claro que não, eu estava assumindo que outras pessoas se interessariam por elas!
Zachary K
0

Apesar de sua falta de integração, acho que D, especificamente a versão 2, fornece algumas lições interessantes que não podem ser facilmente aprendidas em outros lugares. Ele faz uma tentativa mais séria do que qualquer outra linguagem em que eu possa obter uma programação imperativa / procedural, orientada a objetos e funcional para se comportar bem uns com os outros e permitir a programação em um nível muito baixo (indicadores, gerenciamento manual de memória, inline). linguagem assembly) e um nível muito alto (programação genérica e generativa) na mesma linguagem.

Isso é valioso porque, em vez de ver paradigmas isolados, como se existissem em universos diferentes, você vê a floresta através das árvores. Você vê os pontos fortes e fracos de cada paradigma em um nível mais refinado, enquanto os mistura em seus programas. Você vê como os principais aspectos dos paradigmas podem ser implementados nas bibliotecas em termos de código de nível inferior. O módulo de biblioteca padrão std.algorithm implementa importantes primitivas de programação funcional, mas é um código D simples e direto, sem mágica. Da mesma forma, std.rangeimplementa uma avaliação lenta, mas novamente é um código D bastante simples. Você entende os custos envolvidos nas primitivas de cada paradigma, porque os recursos próximos ao metal de D tornam o que realmente está acontecendo sob o capô relativamente transparente. Você pode até escrever algo de baixo nível que se parece com C e, em seguida, criar uma interface bonita e de alto nível, no mesmo idioma, sem que camadas de cola mágica atrapalhem.

dsimcha
fonte
0

Pseudo-código.

As pessoas no campo devem ser capazes de explicar suas idéias de maneira coerente e estruturada, sem jargões específicos de estrutura ou sintaxe. Eu não deveria ter que saber a diferença entre seus colchetes e chaves para entender seu algoritmo. Eu não precisava saber o que ??significa ou quais grepsão as opções.

Escreva em linguagem simples, mas estruture e formate-o como código. Qualquer um pode implementá-lo no idioma que desejar.

edit: Esta resposta é parcialmente motivada pela incapacidade de alguns programadores de escrever pseudocódigo.

"Basta escrever o algoritmo no pseudocódigo"

"O que é isso?"

Os benefícios do pseudocódigo é que as partes interessadas que não fazem parte da programação podem entendê-lo. Não estou sugerindo que você queira BAs e usuários revisando seu código, no entanto, isso pode ajudar quando um não programador entender o algoritmo necessário. O Psuedocode remove a necessidade de explicar for (int i = 0; i < j; i++)e o que é essencialmente o jargão padrão.

Kirk Broadhurst
fonte
Muitas linguagens de programação são poderosas o suficiente para haver pouca diferença entre o código real e o pseudo-código. Quais elementos de sintaxe das linguagens de programação reais você se opõe?
Kevin cline
@ Kevin Cline - Eu estou confortável com os elementos de sintaxe que eu saiba - é os que eu não sei de que eu poderia opor-se. Claro que eu sou capaz de decifrá-los, mas o ponto é que pseudocódigo não deveria ter essas questões (ainda estou para ver um linguagem de programação que realmente se parece pseudocódigo)
Kirk Broadhurst
0

C.

  • Primeiro de tudo, ele ainda é usado (amplamente utilizado!), E não apenas para kernels. Atualmente, estou mantendo um aplicativo de negócios codificado em C. Portanto, mesmo com C puro e simples, você ainda pode conseguir um emprego. Nas grandes empresas, na indústria, em quase todos os lugares (exceto no web dev).
  • Se você estiver trabalhando em um ambiente Unix / Linux, não conhecer pelo menos um pouco de C é como ir às compras e não conseguir ler os preços nas tags.
  • Ponteiros! Todos devem entender os ponteiros (cf. Joel Spolsky ). Além disso, depois de entender o conceito malloc, você sabe exatamente que tipo de coisa acontece quando você digita um "novo" descuidadamente em um idioma OOP.
  • A maioria das sintaxes de "idiomas populares" deriva de C.
  • Sim, nem sempre é claro. Sim, é difícil de aprender. Sim, as cordas são um pesadelo para os iniciantes. Mas a programação nem sempre é clara e é difícil de aprender, e você realmente entenderá o que é ótimo no OOP quando, depois de estudar C, tentar o C ++ e descobrir o std :: string.

Obviamente, deve-se conhecer mais de um idioma, e não apenas um antigo idioma processual. Mas se eu tivesse que ir a uma ilha deserta com apenas um compilador, iria com meu bom e velho gcc. Você pode entender a programação de alto nível se souber sobre programação de baixo nível. Eu acho que não é verdade o contrário.

Raveline
fonte
0

Algumas das linguagens de programação aplicadas para adquirir habilidades gerais de resolução de problemas e conceitos de programação são Logo e Karel, elas devem ser ensinadas antes de C / C ++ / Java / Lisp / PERL / Assembly / qualquer paradigma de programação.

Os alunos recebem uma introdução muito prática à programação.

umlcat
fonte
-1

Qualquer coisa com objetos. Apenas certifique-se de que eles aprendam bem.

Eu contrataria um ótimo programador java para c # a qualquer momento, mas teria muitas dúvidas em contratar alguém que nunca escreveu código real

Eric
fonte