Critérios para selecionar o idioma para o primeiro curso de programação


35

Como educador de CS em nível universitário, a questão de qual linguagem de programação ensinar no primeiro curso de programação geralmente é discutida. Existem milhares de idiomas para escolher e muita febre religiosa (ou fevour) apoiando um campo de idiomas em detrimento de outro. Todo esse viés subjetivo em torno de cada linguagem de programação torna muito difícil para um educador escolher uma.

Minha pergunta é:

Quais critérios objetivos um educador pode usar para selecionar uma linguagem de programação a ser usada como base para um curso de programação universitária no primeiro ano? Qual é a base para esses critérios?

Nota : Eu não quero ver uma lista de linguagens de programação e por que elas são as melhores para usar. A pergunta não é sobre o melhor idioma, é sobre os critérios para selecionar um idioma . As respostas podem, no entanto, usar linguagens de programação para ilustrar pontos específicos.


Essa pergunta foi inspirada em outra questão considerada fora do tópico: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


11
Inaugurado fio meta sobre se esta questão é on-ou off-topic: meta.cs.stackexchange.com/questions/362/...
Dave Clarke

7
<Pega pipoca> Parafraseando Otto Neugebauer : Nenhuma primeira linguagem de programação conhecida pelo homem é capaz de arruinar todos.
JeffE

3
@Raphael: Eu acho que a resposta de Dijkstra provavelmente seria " Toda primeira linguagem de programação conhecida pelo homem é capaz de arruinar todo mundo".
JeffE

2
@ edA-qamort-ora-y, sim, eles devem ser expostos a vários paradigmas de programação. Não, isso não pode ser feito no primeiro curso.
22413 vonbrand

3
Tínhamos SMLsimplesmente porque é improvável que qualquer aluno conheça esse idioma de antemão. Isso equilibrou todos os alunos mais ou menos no mesmo nível para iniciar o curso.
Markus Malkusch

Respostas:


14

Vou jogar meus dois centavos, embora acredite que esse assunto seja um poço sem fundo. Não me interpretem mal, acho que é uma pergunta fascinante, mas provavelmente não vamos resolver aqui para satisfação de todos.

Em poucas palavras, eu diria que o idioma deve fazer o que você deseja , de uma maneira simples e inequívoca possível, e não mais .

Minha própria experiência vem do ensino de várias gerações de alunos do primeiro e do segundo ano com a linguagem de programação Oberon . Pessoas que conhecem esse idioma reconhecerão sua influência em minhas opiniões. Observe que esse idioma foi usado para ensinar "Algoritmos e estruturas de dados". Na época (naquela época), programação funcional e design orientado a objetos eram ministrados em cursos separados a partir do segundo ano.

Importante : Antes de abordar as especificidades de qualquer idioma, gostaria de enfatizar que o mais importante é ser absolutamente claro, para você e seus alunos, quais são os objetivos do seu curso. Você está ensinando programação em si ? Ou algoritmos e estruturas de dados? Ou engenharia de software? Antes de escolher um idioma, vale a pena pensar um pouco sobre onde você está indo com ele. Diferenças neste nível (objetivos) é o que provavelmente, na minha opinião, leva à maioria das divergências sobre esse tópico.

Os pontos que considero importantes podem se sobrepor a várias coisas que já foram ditas, mas acredito que a maioria acaba sendo subconjuntos de um dos quatro seguintes:

  • Simplicidade : Geralmente, os alunos aprendem programação, algoritmos e estruturas de dados, e não os recursos e complexidades de qualquer linguagem de programação específica. Wirth usou a citação de Einstein "Torne o mais simples possível, mas não mais simples" como um princípio norteador no design de Oberon, e existem várias outras línguas por aí que fazem o mesmo. Sua linguagem de programação de escolha deve ser capaz de implementar todos os conceitos exigidos em sua palestra, mas deve fazer isso com o menor conjunto possível de recursos / detalhes. A linguagem de programação geralmente é apenas a ferramenta, não o objetivo.

  • Sem ambiguidade : um irmão próximo da simplicidade, deve haver uma construção para cada conceito, com o mínimo de sobreposição possível. Pense nisso como se houvesse apenas uma maneira "correta" de implementar todos os conceitos. Três tipos diferentes de loops que semanticamente todos fazem a mesma coisa? Ou quinze maneiras diferentes de incrementar uma variável? Não é bom. Isso também faz corrigir a lição de casa ou geralmente apenas a compreensão de código dos seus alunos um monte mais fácil. Seus assistentes de ensino irão apreciá-lo.

  • Portabilidade : os alunos irão às aulas com máquinas Linux, Windows e OSX, e o ambiente de programação deve ser o mais semelhante (idêntico) possível nos três. Os resultados de qualquer programa também devem ser idênticos. Esse é outro ponto que os assistentes de ensino, responsáveis ​​por marcar os trabalhos de casa e lidar com perguntas / problemas, apreciarão muito.

  • Preferência do setor : Sério, devemos começar a nos preocupar com isso apenas se o próprio "setor" decidir a linguagem de programação que mais lhe agrada. Desde a invenção dos computadores, esse tem sido um alvo em constante movimento. No momento, se seus alunos realmente aprenderem a programar, isso não dependerá do idioma. Existem, no entanto, algumas áreas em que a indústria consegue concordar com um padrão, por exemplo, VHDL para design de circuitos ou SQL para consultas de banco de dados, portanto esse ainda é um ponto válido.

Novamente, como um idioma se encaixa nessa lista depende fortemente do que você está tentando ensinar!


4
Na verdade, há uma divisão no design do circuito entre VHDL e Verilog.
Avakar

@avakar: Ah, merda. Vou corrigir isso na minha resposta, obrigado por apontar!
Pedro

Caramba, leia isso e achei um dos meus palestrantes. +1 para Oberon, desde que a opção de usar palavras-chave em minúsculas seja ativada automaticamente; tão doloroso para escrever WHILE expr DO stmts ENDetc.
Callum Rogers

3
+1 em "quais são os objetivos do seu curso?" e uma observação adicional, um dos objetivos mais comuns, mesmo que não esteja escrito, é fornecer o básico para outras coisas (cursos e estágios) que têm programação como pré-requisito.
AProgrammer

Um ponto importante (pelo menos hoje) é que ele permite que os alunos criem programas visualmente atraentes em breve e sem problemas. Eles estão expostos a tantos aplicativos e jogos com muitos gráficos que, naturalmente, pensam que é assim que os computadores devem interagir com as pessoas.
22613 vonbrand

13
  • Desenvolver o pensamento algorítmico para resolver problemas como objetivo principal: uma coisa ruim sobre o uso de um paradigma orientado a objetos no primeiro curso é que atrair novos alunos para coisas como herança, polimorfismo etc., distrai-os do objetivo principal acima mencionado. De fato, a introdução de quaisquer considerações secundárias além desse objetivo principal, como engenharia de software, portabilidade, utilidade da indústria etc., é contraproducente, pelo motivo exposto.

  • Não é uma linguagem orientada a objetos: Atualmente, a maioria das universidades começa a ensinar programação com uma linguagem orientada a objetos. Eu acho que isso é um erro. Existem coisas no mundo que podem ser verdadeiramente entendidas apenas em contraste com o seu oposto. Sem ser exposto a um paradigma processual de programação (dados e funções como dois aspectos separados do programa), a idéia básica de orientação a objetos (dados e comportamento vistos como intrinsecamente ligados) pode ser esquecida por muitos. E porque a programação orientada a objetos é tão importante, perder a ideia básica não é uma coisa pequena. Além disso, como provavelmente em cursos mais altos os estudantes de CS programam principalmente em OO, eles também precisam ser expostos ao lado processual das coisas.

Então, no final, eu iria para uma linguagem processual, evitando recursos avançados, focando no desenvolvimento do pensamento algorítmico. Mas, evitando recursos avançados, não quero dizer evitar problemas desafiadores. Quero dizer, que mesmo problemas desafiadores, os alunos devem ser obrigados a resolvê-lo usando os primeiros princípios, ferramentas simples.


Você pode facilmente começar com um subconjunto de, digamos, Java primeiro para mostrar o estilo processual. Então você abre a caixa de Pandora e mostra como as mesmas coisas se parecem com OOP.
Raphael

3
@ Rafael: É impossível evitar public static void main()em Java, que deve estar dentro do contexto de alguma classe. Isso torna o Java menos do que o ideal como primeira linguagem, embora, obviamente, o obstáculo não seja muito grande.
Dave Clarke

Um bom IDE pode adiar public static void main()por muito tempo. O BlueJ é um bom exemplo de IDE que permite que os alunos escrevam programas sem um único mainlugar nele.
Barry Brown

2
O problema com a POO é que, para a variedade de problemas com brinquedos abordados no primeiro ano ou mais de programação, ela apenas atrapalha, sem nenhuma vantagem clara. OOP se torna importante (e é apreciado) quando seus programas têm mais ou menos mil linhas. "Java sem OOP" é horrível, muitas coisas completamente opacas que "precisam ser escritas dessa maneira" são contrárias às pessoas que aprendem , e não ao papagaio.
22613 vonbrand

11

Como estamos falando do primeiro curso de programação em um programa de Ciência da Computação, eu diria que o aspecto mais importante seria quais conceitos fundamentais de CS ele ensinará aos seus alunos. Como não há linguagem que possa ensinar todos os conceitos de uma só vez, é necessário considerar quais conceitos serão necessários mais adiante.

Não concordo com a noção de @ Kaveh de que a relevância do setor é importante; pode ser um bônus, mas é de menor importância aqui. Com uma base sólida nos princípios de CS, aprender um idioma "industrial" em cursos posteriores será relativamente fácil.

Como observação lateral, independentemente do idioma escolhido para ser o primeiro, é importante sujeitar seus alunos a outro idioma radicalmente diferente o mais rápido possível.


11
A relevância da indústria pode ser considerada secundária, mas não acho que seja uma questão menor. Como esta é uma introdução ao curso de programação, não vejo por que alguém gostaria de ensinar todos os conceitos nele; geralmente há um segundo curso de programação e outro curso sobre o tema da linguagem de programação, onde são discutidas várias linguagens e muitas outras. cursos concentrou-se em áreas de aplicação específicas, por exemplo, de programação para web, etc.
Kaveh

@ Kaveh: Isso soa como o currículo de uma universidade técnica para mim.
Raphael

6
"é importante sujeitar seus alunos a outro idioma radicalmente diferente o mais rápido possível." -- absolutamente correto. Definimos os mais novos que pensam que podem programar corretamente, introduzindo a programação funcional primeiro: quase todos são novos nesse paradigma, e quanto mais C (++) você foi exposto, mais difícil é aparentemente.
Raphael

3
@Kaveh: idiomas projetados para fazer as coisas no mundo real não são necessariamente ideais para o ensino de conceitos ou o desenvolvimento de habilidades. Os objetivos são muito diferentes.
JeffE

11
@ Kaveh: Eu nunca escrevi que o conhecimento das línguas usadas na indústria não seja importante. O que quero dizer é que, dada uma primeira linguagem de programação sólida, os cursos posteriores não terão problemas em ensinar aos alunos algo sobre o que eles realmente farão quando se formarem. Tendo participado de vários cursos introdutórios (como AT), eu diria que as habilidades que você aprende não são parecidas com as necessárias na indústria (há muito pouco tempo para isso). Se for esse o caso, acho melhor fornecer a eles conceitos sólidos para que eles se tornem melhores programadores, não apenas $ LANGUAGE-programadores.
Evilcandybag

8

Minha principal preocupação é a universalidade , no sentido de que aprender essa linguagem de programação deve tornar o aluno capaz de lidar com a maioria das linguagens de programação.

Por mais que eu me arrependa, esse critério exclui linguagens funcionais puras. Também se aplica ao curso que não deve usar recursos exóticos do idioma.

... mas isso é apenas senso comum.


11
Com mônadas como em Haskell, é discutível que esse critério não seja mais aplicável a linguagens funcionais puras.
21812 Dave Clarke

@DaveClarke: mônadas são uma maneira muito agradável de fazer coisas não funcionais. Mas não é muito arriscado primeiro aprender essas coisas com a mônada em vez de diretamente? (Talvez não seja, eu não sei!)
Jmad

2
@jdam: Você provavelmente está certo. O problema não está nas mônadas, por si só, mas na generalidade e na dificuldade em apresentar boas mensagens de erro ao programador. A variante Haskell Helium aborda esses problemas e foi usada com sucesso com os alunos do primeiro ano.
Dave Clarke

@ DaveClarke: uau, eu não ouvi falar disso. Isso é muito legal! Infelizmente, embora isso seja muito útil para o aprendizado do Haskell, isso não resolve o problema de não ajudar no aprendizado de outros idiomas.
Jmad

4
@ Ben: meu sentimento é que o gerenciamento manual de memória é algo que hoje em dia é específico para algumas linguagens (e que você aprende nesses casos específicos) mais do que uma coisa fundamental da programação. Se você não concorda com isso, acho que aponta para C (ou C ++).
Jmad

8

Ao escolher uma primeira linguagem de programação, há muitos problemas que precisam ser considerados. Muitos deles foram considerados nas respostas acima. Incluo mais 3, pois estas foram parte da minha resposta à pergunta encerrada ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) que originalmente inspirou essa pergunta . Copiei minha resposta aqui (e a modifiquei) com base na política atual de exclusão de perguntas fechadas.

Aqui estão três pontos a serem considerados, usando algumas linguagens de programação como exemplos.

Programação no grande vs programação no pequeno

Quando você aprende a programar pela primeira vez, é preciso aprender a programar nos pequenos , antes de passar a aprender mecanismos para ajudar a programar nos grandes .

Ao programar em tamanho pequeno, quero dizer escrever programas com menos de 100 linhas. Esses programas envolverão algoritmos que manipulam estruturas simples de dados, possuem um fluxo de controle simples e resolvem problemas simples. Em geral, eles não serão considerados como aplicativos .

Ao programar em geral, quero dizer escrever grandes programas criados a partir de muitos componentes / classes, construindo sobre uma API, com uma GUI, um banco de dados, possivelmente em uma configuração cliente-servidor.

As coisas em que um programador precisa pensar quando programar em pequenas são muito diferentes de quando programar em grandes. A programação em geral exige que o programador pense em modularidade, boas interfaces, bom design, reutilização e muitos outros problemas. As linguagens de programação modernas fornecem muitas construções para ajudar a programar em geral. Essas construções incluem classes, módulos, interfaces, ocultação de informações, etc. Ao programar em pequenas dimensões, esses problemas são muito menos importantes.

Uma linguagem de programação como o C ++ possui muitos recursos para ajudar na programação em geral, mas é mais difícil sentar e começar a escrever um programa muito simples. Java é semelhante.

Por outro lado, uma linguagem como Python, Ruby, Scheme ou Haskell facilita muito a gravação direta de um programa.

Alto nível vs baixo nível

Idiomas como C ++ e C são de nível bastante inferior. Eles permitem que o programador manipule as referências diretamente na memória. Embora isso permita escrever códigos muito eficientes, os detalhes de baixo nível podem ser difíceis para um primeiro programador aprender o idioma. Alguns argumentam que esses detalhes de baixo nível atrapalham a escrita da lógica para resolver o problema.

Uma linguagem de nível superior como o Python facilita a expressão de conceitos mais diretamente em termos do domínio do problema.

Tipo estático vs Tipo dinâmico

C ++, Haskell, Java e muitas outras linguagens são tipicamente estaticamente. Isso significa que o compilador encontra automaticamente locais onde ocorrem erros em potencial com base nos tipos de valores esperados em cada local no código. Há um pouco de guerra religiosa sobre se a digitação estática é boa ou não, mas vou me afastar disso. Um problema com a digitação estática para novos programadores é que as mensagens de erro relatadas pelo compilador geralmente são difíceis de entender. Esse é especialmente o caso dos modelos C ++ e dos programas Haskell em geral.

Python, Ruby e Scheme são digitados dinamicamente. Isso significa que erros são detectados enquanto o programa está sendo executado. Pode-se argumentar que é tarde demais para detectar os erros (mas também se pode usar o teste para evitar tais erros). Mais uma vez, evitando o argumento religioso, a vantagem do tipo de erro encontrado ao escrever programas simples em uma linguagem de programação dinamicamente tipificada é do tipo que esse objeto não sabe como fazer essa operação . No contexto de um pequeno programa, esses erros são fáceis de entender e rastrear.

Idiomas como C têm digitação fraca, o que significa que, embora o compilador ajude com alguns erros, o tempo de execução falha em interceptar outros que ocorrem, como acessos de memória inválidos. Como resultado, a mensagem de erro retornada ao programador é semelhante a "Programa com falha". Uma linguagem digitada dinamicamente interceptaria esses erros e os converteria em uma mensagem de erro mais compreensível.

Outras

Para outros idiomas, diferentes considerações podem entrar em jogo, como o suporte fornecido pelo ambiente de programação, as APIs disponíveis, a qualidade dos livros e os tutoriais on-line, etc.


Concordo de coração.
22613 vonbrand

11
Também tenho minhas próprias preferências sobre a contenção "tipos estático versus dinâmico". No entanto, em um programa geral de CS, desde que ambos sejam ensinados até certo ponto, acredito que a ordem não importa tanto. Se apenas um lado da moeda for apresentado, no entanto, isso é um grande problema para mim.
chi

8

Como observação introdutória, considere a possibilidade de apresentar mais de um idioma (em um curso). No meu primeiro mandato, mostramos SML e Java. O contraste tinha sua mensagem própria e importante: escolha a ferramenta certa para o trabalho.

Mas agora para critérios, em ordem arbitrária.

A dificuldade de aprender é uma questão subjetiva, mas importante: você não quer que seu aluno perca tempo aprendendo o idioma, mas fazendo coisas com ele. Indiscutivelmente, linguagens dinâmicas como Ruby podem ganhar nessa frente: você pode alimentá-las com qualquer coisa e existem excelentes tutoriais "fictícios" na web. Se bem me lembro, também existem estudos que mostram que os alunos que não haviam programado antes obtêm melhores resultados com linguagens funcionais do que com outros.

Riqueza : os idiomas devem ser ricos o suficiente para todos os conceitos que você deseja ensinar. Por exemplo, se você deseja discutir funções de ordem superior, precisa de um idioma em que funções sejam valores, como linguagens funcionais ou Scala.

Escalabilidade : é provável que seus alunos não aprendam mais idiomas por conta própria do que aqueles que você lhes mostra. Portanto, você deseja que o (s) idioma (s) escolhido (s) sejam escalonados ao longo dos estudos: eles precisam escrever seus exercícios para animais de estimação agora, mas também podem atacar um projeto de tamanho médio posteriormente. Java e linguagens com ecosfera semelhante são boas escolhas aqui.

Suporte de ferramenta : está relacionado à escalabilidade. Se você espera / quer que seus alunos sejam produtivos com o idioma, então existem bons IDEs, gerentes de criação e bibliotecas. Cascas interativas (Ruby, Scala) também são boas, especialmente para iniciantes. As ferramentas também precisam funcionar em todas as principais plataformas.

Documentação : Você provavelmente não quer realmente ensinar o idioma, mas peça aos alunos que se ensinem com a sua orientação (abstrata). Portanto, uma boa documentação é importante. Indiscutível, quanto mais popular e estabelecida uma linguagem, melhor a documentação. Por exemplo, a documentação do Scala é bastante pobre (mas está melhorando). Ferramentas como o Hoogle são uma vantagem.

Disponibilidade : Na verdade, existem pessoas que ensinam usando o Matlab ou o Visual C ++. Considere que nem todo mundo pode ter uma licença ou uma máquina que possa executar os programas necessários. Você provavelmente deve preferir idiomas gratuitos que são executados em uma variedade de plataformas.

Limpeza : Você provavelmente quer moldar a maneira como seus alunos pensam. Quanto mais bagunçada a linguagem, mais bagunçada elas vão pensar; Eu nunca proporia PHP em um curso. As linguagens dinâmicas em geral têm desvantagens aqui: elas permitem, às vezes até promovem, maus hábitos.

Quais critérios são mais importantes para você do que outros também dependem do que você deseja ensinar. Isso é literalmente um curso de programação? É um curso de algoritmos e estruturas de dados? É um curso que introduz conceitos de linguagens de programação em diferentes paradigmas? É um curso sobre desenvolvimento de software em grande escala?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... ou C ou Pascal, que tiveram indicadores de função praticamente para sempre. Praticamente a única linguagem (mainstream) que esse critério realmente exclui é o Java.
Mason Wheeler

Tentar ensinar aos novatos uma mistura de diferentes sintaxes e conceitos subjacentes é apenas uma confusão mental.
22613 vonbrand

6

Questão fascinante; Eu gosto da sua ênfase em critérios objetivos. Queremos que os calouros aprendam:

conceitos de programação : A primeira linguagem de programação deve suportar: chamadas de função, iteração, recursão

idéias fundamentais : A primeira linguagem de programação deve suportar matrizes (para os primeiros passos de uma introdução suave a como a memória realmente funciona e como os ponteiros funcionam)

habilidades práticas de programação : como usar o depurador, como usar o criador de perfil, como resolver problemas grandes (uma linguagem de alto nível), como montar sistemas grandes, como decompor problemas (decomposição de problemas), como evitar a escrita código complicado, como comunicar aos seres humanos a intenção por trás de uma série (muitas vezes enigmática) de instruções executáveis.

o fato de existirem bibliotecas pré-escritas para coisas como sort () e como usá-las - ou seja, o fato de que não é necessário escrever tudo do zero.

Outros critérios para um primeiro idioma :

interpretado (feedback rápido ajuda no processo de aprendizagem).

um ambiente interativo que acelera o aprendizado, o teste e a depuração.

código-fonte de alta qualidade está disponível para os alunos lerem nesse idioma

"fácil de ler", "sintaxe que se aproxima da linguagem natural" (para facilitar a leitura e a classificação do SourceCode)

portátil (roda em Mac OS, Windows, Unix). Pelo menos uma implementação de software livre da linguagem.

rápido para ensinar, "poucas dicas" - por exemplo, "[Pode] ser mais rápido ensinar primeiro para iniciantes Python e depois para Java, em vez de Java como o primeiro OOPL". - "Comparação de linguagens de programação orientada a objetos" e TelescopeRule

Matthias Felleisen desenvolveu uma linguagem de programação com mensagens de erro personalizadas para um público iniciante. Ele enfatiza que a escolha de um idioma específico não é tão importante quanto ensinar uma boa metodologia de design. De fato, ele vê o primeiro curso de CS como uma aula de artes liberais, ensinando pensamento crítico, resolução de problemas e atenção aos detalhes.

critérios para uma segunda linguagem de programação

Coisas que queremos que os alunos aprendam, mas talvez isso possa esperar pela segunda linguagem de programação:

uma linguagem "relevante" que "não seja muito esotérica"; algo "popular na indústria"

Teoria da complexidade: como reconhecer tarefas impossíveis com a tecnologia atual.

coisas de nível superior: como escolher a ferramenta certa para o trabalho , como usar um compilador, estruturas, programação orientada a objetos, programação funcional, programação lógica, programação lógica, design do compilador, funções de composição e manipulação (no sentido Lisp / ML), programação concorrente e distribuída,

coisas de baixo nível: aritmética de ponteiros, arquitetura de computadores. gerenciamento de memória, quadros de pilha, programação de montagem, arquitetura da máquina, drivers de dispositivo e design do sistema operacional (para que a máquina não "pareça uma caixa preta assustadora que não pode penetrar")

EDIT: Acho decepcionante que postar um resumo de algo que escrevi, em colaboração com muitos outros, "possa não ser um post legal".

Portanto, estou adicionando uma citação mais formal ao meu link informal anterior, tentando cumprir com o uso justo e outras questões de direitos autorais do wiki.

Esta resposta é um resumo da Primeira Língua do Calouro (Anon 2011) no Repositório de Padrões de Portland.

(Anon 2011) Muitos autores anônimos e vários outros. "Primeira língua de Freshmans". Repositório de Padrões de Portland. 27 de setembro de 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


Você verificou com os autores originais se tem permissão para reproduzir o conteúdo deles? A fonte é um site corporativo e não foi possível encontrar uma declaração de que o conteúdo era gratuito; portanto, isso pode não ser um post legal!
Raphael

11
@ Rafael A fonte é um wiki (então, potencialmente, tem muitos autores diferentes). Se o autor (qualquer co-autor) deste material não quiser que ele seja incluído aqui, ele deve enviar um aviso de remoção da DMCA para o [endereço de contato listado na parte inferior desta página] (mailto: team+cs@stackexchange.com) . Além disso, as informações não são cobertas por direitos autorais, apenas da maneira como são expressas. Um pouco de refatoração e RemovingWordsRunTogetherWikiWikiStyle melhoraria esta resposta e removeria qualquer risco de violação de direitos autorais.
Gilles 'SO- stop be evil'

11
+ Boa resposta, mas eu tenho um nit para escolher - profilers. Não há teoria por trás deles - apenas "conhecimento comum". Geralmente, não é apreciado entre os acadêmicos que existem muitos problemas que eles não encontram e outra técnica o faz. Verifique este link.
precisa saber é o seguinte

5

Penso que simplicidade e facilidade de aprendizado são um dos principais critérios. Em um curso introdutório de programação, gostaríamos de evitar obstáculos desnecessários à programação e focar o máximo possível nos princípios de programação e resolução de problemas algorítmicos. No primeiro ano, os alunos geralmente não têm a capacidade de pensar algoritmicamente sobre problemas, de modo que o curso também ensina o pensamento algorítmico.

Outro critério é a utilidade do idioma na indústria. Não gostaríamos de ensinar um idioma que não seja útil no setor. Uma clara maioria dos estudantes trabalha no setor, portanto, deve-se observar o que está sendo usado (e será usado quando os estudantes se formarem) no setor.

O terceiro critério seria os cursos que os alunos farão nos próximos anos. Os cursos, principalmente os exigidos, não são projetados por si mesmos, mas em coordenação com outros cursos.

O último em que consigo pensar agora é o mesmo que a resposta do jmad, o idioma deve facilitar o aprendizado de outros idiomas importantes. Deve ser rico o suficiente e aprender as línguas importantes posteriores seria fácil (aqui, meios importantes são importantes da perspectiva dos alunos).

Eu acho que muitas universidades mudaram sua introdução principal ao curso de programação de Java / C ++ / C para Python, embora possam fornecer introdução à programação em outras linguagens de tempos em tempos (geralmente para cursos de ciências não relacionadas à computação, por exemplo, C para cursos de engenharia elétrica) embora possam mostrar flexibilidade se o instrutor quiser experimentar o ensino de outro idioma de vez em quando.


3
Eu não classificaria terrivelmente a utilidade na indústria em um curso introdutório de programação. Um programador de sucesso na natureza provavelmente terá que aprender várias línguas durante sua carreira, algumas delas "no trabalho"; portanto, a capacidade de aprender e aprender novas línguas é uma habilidade essencial que precisa ser ensinada. Consequentemente, eu não esperaria que a primeira língua a ser ensinada em um curso universitário seja necessariamente a mais forte quando se formarem.
Ben

11
@ Ben: A utilidade na indústria é especialmente importante se os estudantes não vão se formar em CS. De onde eu venho, muitas pessoas vão trabalhar em biologia ou outras ciências e, dado que não têm tempo para aprender muitas línguas, aprender algo comum em seu ecossistema como Python provavelmente será mais útil que ML, Java ou C.
hugomg

11
Falando como alguém da indústria (uma indústria em particular, não necessariamente representativa), não acho que a relevância da indústria seja um fator quando se trata de futuros programadores de nível 1. A exposição a múltiplos paradigmas cria melhores programadores, mesmo que no meu domínio (programação incorporada) usemos principalmente C. Os detalhes de uma linguagem podem ser aprendidos em um manual, e os conceitos gerais são melhor ensinados na escola. Para programadores incidentais (por exemplo, cientistas), as prioridades são diferentes - mas focar demais no Fortran pode fazer as pessoas ignorarem o Numpy quando é isso que elas devem usar.
Gilles 'SO- stop be evil'

5

Então, eu vou dispensar minha reação instantânea imediatamente, que é que todos devem aprender a programar via SICP, porque Lisp é a coisa certa.

Já existem muitos bons critérios para a seleção de um idioma ... a simplicidade e a portabilidade estão entre as mais importantes. No entanto, também acho vital que os alunos iniciantes em programação não tenham a idéia errada (ou não têm idéia) sobre o que está acontecendo nos bastidores com as linguagens modernas.

Embora algumas dessas postagens tenham oferecido excelentes critérios, eu gostaria de usar um idioma específico para ilustrar a aparência de 'atender aos critérios'.

Algumas dessas preocupações foram abordadas (muito melhor do que eu poderia tentar) na postagem de Joel Spolsky, The Perils of JavaSchools . A escolha de linguagens como Java ou Python fecha mais de dois dos conceitos mais difíceis (e mais vitais) do CS; ou seja, ponteiros e recursão.

Obviamente, ensinar um curso introdutório em C será incrivelmente denso, além de provavelmente perder muitos conceitos importantes relacionados à recursão. Da mesma forma, um curso ministrado no Lisp terá que abordar indicadores sob as capas, care cdrimplicar conceitos importantes relacionados a listas vinculadas, enquanto deixa o idioma lidar com os detalhes.

Basicamente, o que estou falando é que os alunos precisam entender os fundamentos das estruturas e algoritmos de dados, bem como a implementação prática.

Também discordo da sugestão de não usar uma linguagem orientada a objetos. Eu acho que a utilidade das linguagens orientadas a objetos para modelar o mundo real é um ativo positivo para os novos programadores, desde que a incompatibilidade de impedâncias seja esclarecida e que as linguagens orientadas a objetos sejam um paradigma entre muitos.

Eu proporia que Ruby (sugerido como uma possibilidade por outro post também) exemplifique muitas qualidades para procurar em uma linguagem para usar em uma introdução ao curso de programação.

Justificarei momentaneamente essa afirmação, mas primeiro quero comentar sobre uma tendência que me perturba nos cursos introdutórios de CS. Eu trabalho em uma universidade que, como muitas escolas, recentemente mudou para o Python em seus cursos de introdução. Acredito firmemente que Python é o novo BASIC, e a tendência da linguagem é escolher amizade nova em vez de poder e expressividade, como argumentei recentemente em outro lugar . Isso é um desserviço, e precisamos pensar nos programadores em que eles se tornarão, e não nas novidades que são no momento.

De qualquer forma, justificando Ruby como uma linguagem introdutória ...

  • Ruby, embora não seja otimizado para chamada de cauda, ​​faz recursão bastante bem. Então tem isso.
  • Ruby é multi-paradigma. Embora seja uma linguagem pura e orientada a objetos, ela também abrange a programação funcional, além de ter algumas rodas de treinamento imperativas derivadas de C. Compare isso com o Python, que é uma linguagem processual com algumas OOs aderidas (embora os parafusos estejam aparecendo) e alguns elementos funcionais (que o BDFL do Python tentou repetidamente eliminar ).
  • O CRuby (também conhecido como MRI ou 'Ruby Classic') é escrito e estendido em C. Você pode ensinar os alunos sobre ponteiros, gerenciamento de memória e o deus do pavor malloc()ensinando-os a estender o idioma em C.
  • Mesmo que seja uma linguagem dinâmica e de alto nível, você pode ensinar muito sobre estruturas de dados, tipos, etc .; existem bibliotecas (gemas) para qualquer coisa que você possa imaginar, de árvores vermelho-pretas a coisas estranhas com a digitação de patos.

De qualquer forma, não há substituto para o aprendizado de muitas línguas, de muitos paradigmas, independentemente de você ser profissional ou não. Basicamente, acho que todos deveriam entender , se não usar , C e Lisp. Ruby é o melhor compromisso que posso pensar para um semestre introdutório.

De qualquer forma ... esse é o meu US $ .02. Não estou tentando convencê-lo a usar Ruby, lembre-se ... apenas use-o como um exemplo de qualidades para procurar em um idioma para ensinar um curso introdutório.


2
"Acredito firmemente que Python é o novo BASIC" - copie isso. "dois dos conceitos mais difíceis (e mais vitais) em CS; ponteiros e recursão" - nunca aprendi uma linguagem que lide explicitamente com ponteiros e nunca perdi nada. Quando aprendi como os compiladores funcionam, os indicadores eram explicados com bastante rapidez.
Raphael

Concordo que uma linguagem multiparadigma tem seu charme (embora ensinar duas a três línguas "puras" possa ser melhor), mas não escolherei Ruby por esse motivo. Outros idiomas para um trabalho melhor, em particular no que diz respeito à biblioteca básica. Scala, por exemplo, tem uma biblioteca inteira de coleções imutáveis.
Raphael

3
Eu também acredito que Python é o novo BASIC. Mas por que isso é um argumento contra o Python?
JeffE

11
@Raphael, os ponteiros são difíceis apenas quando você inicia com C, o que o força a ser exposto a ponteiros quando muitas coisas não são resolvidas e onde eles têm um relacionamento confuso com matrizes. Ponteiros não foram difíceis para mim quando eu me autodidata Pascal. Os ponteiros não eram difíceis para as pessoas da minha classe que os ensinavam em Algol 68 (elas são referências nomeadas lá, mas são ponteiros com outro nome, assim como em Java; o que é difícil em Algol 68 são as regras de desreferência automática), ponteiros não é nem um pouco difícil com C ++ se você não começar ensinando o subconjunto C.
AProgrammer

11
@ DaveClarke: recua com espaço em branco, o que mais do que compensa isso.
Raphael

5

Minha primeira linguagem de programação foi uma linguagem de montagem de brinquedos. O segundo foi Fortran. No meio, aprendi uma notação de "algoritmos", que era aproximadamente o Algol 60. Acabei bem. Na verdade, acho que o que me ensinaram foi praticamente perfeito.

Quando olhei pela primeira vez para a programação funcional, em trabalhos de pesquisa, embora não em uma linguagem implementada, fiquei "uau, isso é completamente diferente. É bastante matemático!" A maioria das pessoas que aprendem programação funcional ainda tem o mesmo tipo de experiência "uau". Eu acho ótimo.

Eu acho que programação imperativa e programação funcional são duas maneiras completamente diferentes de ver o mundo. Desassistiríamos nossos alunos se lhes roubássemos essa experiência diversificada.

A melhor primeira linguagem de programação deve ser o mais simples e clara possível, para que os alunos possam se concentrar em como pensar com clareza. Infelizmente, a simplicidade e a clareza do assembly, Fortran e Algol 60 são incomparáveis ​​com a maioria das linguagens de programação modernas. Haskell é uma boa exceção. Mas, Haskell seria minha segunda linguagem de programação ideal, não a primeira. Eiffel ou Oberon talvez pudessem se encaixar.


5

Na Escola de Ciências e Matemática da Carolina do Norte , apresentamos o Python aos alunos desde 2004. Nós o usamos para ensinar programação procedural, porque achamos que a capacidade de escrever procedimentos curtos e corretos é vital para progredir mais tarde com ferramentas mais pesadas, incluindo OO programação.

Nós gostamos por estas razões.

  1. Python não é uma linguagem de formato livre. Obriga os alunos a escrever seu código em blocos usando indentação. (Como uma nota técnica, usamos o editor de texto do vim e colocamos [ set tabstop=4 set et] no .vimrc para eliminar problemas irritantes e para que o recuo do código seja perceptível, mas não para causar um desvio horizontal excessivo e feio). Nossos alunos se acostumam a ver a estrutura hierárquica dos programas delimitados por espaços em branco. Como resultado, seus hábitos de formatação tendem a ser muito bons quando programam em outros idiomas.

  2. A simplicidade sintática do Python o torna fácil para iniciantes. Programas simples podem ser escritos com um mínimo de palavras-chave misteriosas e encantamentos mágicos. Queremos estudantes que normalmente não pensam em programação para experimentá-lo. Observe a adorável simplicidade do Python hello.py; é claro o que está acontecendo.

  3. Python é digitado dinamicamente e digitado pato. Isso facilita a introdução de variáveis. Eu digo aos meus alunos que variáveis ​​são apenas etiquetas. Eles apontam para objetos. Você envia uma mensagem para um objeto usando o nome da variável, assim como alguém envia uma mensagem chamando você no telefone.

  4. Python é uma ferramenta que estudantes ambiciosos não superam. Possui bibliotecas sofisticadas que fazem hosts de coisas úteis. É uma ferramenta criativa poderosa que é acessível para iniciantes.

  5. O Python é gratuito e é executado em todas as principais plataformas. Nossa escola é um ambiente heterogêneo de sistema operacional com todos os tipos de máquinas. Não precisamos nos preocupar com dores de cabeça, como problemas de compatibilidade. Ele será executado em praticamente qualquer computador.

  6. Python tem excelente documentação. Incentivamos nossos alunos a explorar, mexer e colorir fora das linhas. Eles aprendem sobre o uso da documentação do Python cedo e geralmente acabam explorando coisas legais fora da classe.

Estamos muito satisfeitos com o Python.


11
Bem vinda! Este é um bom estudo de caso, mas pouco faz para responder à pergunta após critérios de seleção, imho. Ler seus itens de trás para frente pode meio que fazer isso, mas não tenho certeza se você pretendeu dessa maneira.
Raphael

Nenhuma ordem específica foi planejada. É um "e".
Ncmathsadist

3

Eu diria que o idioma (com algumas limitações) não importa tanto quanto o que você faz com o idioma. Você pode aprender o mesmo sobre desenvolvimento de software, algoritmos, programação orientada a objetos, hardware de computadores e assim por diante na maioria dos idiomas. A chave é desenvolver algo interessante, que utiliza todos esses conceitos.

(resposta migrada de https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language/ )


1

TL; DR: Não há comoresponder objetivamente a isso, porque não hábase objetiva para os critérios por trás disso. É tão arbitrário quanto tentar discutir se o azul é, objetivamente , uma cor "melhor" que o vermelho, ou se o sorvete de baunilha é objetivamente "mais saboroso" que o chocolate.


Acho que já existem alguns posts maravilhosos, mas vou adicionar meus próprios 2 centavos.

Quais critérios objetivos um educador pode usar para selecionar uma linguagem de programação a ser usada como base para um curso de programação universitária no primeiro ano?

Essa pergunta é semelhante a perguntar se há uma maneira de escolher objetivamente o primeiro sabor de sorvete que alguém deve experimentar ao visitar um local de sorvete pela primeira vez. Não, não existe uma maneira objetiva de escolher algo que seja inerentemente subjetivo .

Por quê? Porque mesmo quando analisamos os critérios razoáveis ​​mencionados na resposta de Pedro , todos ainda terão uma visão subjetiva de como cada fator "se mantém" contra as opiniões de outra pessoa.

Por exemplo, Ruby é objetivamente "mais simples" que Python? Mais simples em que sentido? Com relação a quê? O que significa "mais simples" para você ? Isso significa "menos linhas de código"? Significa "mais fácil de ler e entender"? E os outros? Por que alguém deveria concordar com alguma seleção específica aqui? Não acho que possamos responder a essa pergunta objetivamente .

Isso leva à próxima pergunta.

Qual é a base para esses critérios?

Por mais razoáveis ​​que sejam alguns critérios, acho que isso se baseia mais na preferência subjetiva do que em qualquer outra coisa. Por exemplo, não há razão para que eu deva aceitar os critérios de simplicidade , inequívoca , portabilidade e preferência do setor de Pedro - independentemente de quão razoáveis ​​alguns possam pensar que seja. De fato, a preferência da indústria é subjetiva por definição e simplesmente levaria a um círculo vicioso. (Todo mundo é treinado nele, então todo mundo o usa na indústria, e é por isso que todo mundo é treinado nele ...)

Por exemplo, por que não

  • Eficiência: os tempos de execução e a pegada de memória podem realmente ser medidos.
  • Tamanho: o menor número possível de palavras reservadas tornaria o idioma mais fácil de aprender.
  • Conjunto de recursos: um conjunto mais amplo de recursos suportados (por exemplo, lambdas, genéricos, orientação a objetos, sobrecarga de operadores etc.) permitiria que você ensinasse mais conceitos sem precisar alternar idiomas e voltar à estaca zero.
  • Interoperabilidade: uma linguagem que facilita o trabalho com outras linguagens e sistemas nativos (por exemplo, API Win32 de C # ou Python, etc.) pode ser gerada como um melhor investimento a longo prazo, etc.

O ponto é que, embora eu possa criar um conjunto diferente de critérios de avaliação e ainda ser considerado razoável, não podemos afirmar que é objetivamente superior / inferior ao de outra pessoa.

Em conclusão, não há base objetiva para os critérios. É tão arbitrário quanto tentar discutir se o azul é, objetivamente , uma cor "melhor" que o vermelho, ou se o sorvete de baunilha é objetivamente mais saboroso que o chocolate.

Isso não quer dizer que você não possa ter boas razões para justificar suas preferências, mas no final do dia, elas são apenas suas preferências.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.