Que idioma devo usar ao ministrar um curso de graduação em programação de computadores?


22

Vai ensinar aos alunos do nível de graduação um curso intitulado Introdução à Programação de Computadores. Estou um pouco confuso. Em Física Computacional, os cientistas usam C / C ++ ou Python ou Fortran, CUDA etc ..... é hora de construir sua base. O que devo usar? Eu sei que você pode aprender uma nova linguagem de programação a qualquer momento da sua vida, mas que é uma escolha mais sábia para eu elaborá-los todos os conceitos básicos de programação e OOP posteriormente.


9
@ k20: Espero que sua sugestão tenha sido explícita; caso contrário, seria uma grave violação da ética acadêmica.
Christian Clason

6
@ k20: Tudo isso é fora de tópico, mas escolher software baseado em propinas (de qualquer tipo) para o professor e não no conteúdo a ser ensinado é definitivamente antiético. (Apenas para deixar claro, é o "swag" a que me oponho.) O que geralmente é feito é que as empresas disponibilizam software a um custo significativamente reduzido (ou de graça).
Christian Clason

3
@ k20: Lembre-se também de que a motivação da empresa de software não é totalmente altruísta: seus alunos podem obter o software gratuitamente agora, mas também é provável que precisem comprar o software mais tarde na vida (ou aprender um novo Programas).
Wrzlprmft

3
@ k20 O Matlab e o Mathematica não são muito usados ​​para computação científica séria. São ferramentas mais exploratórias para experimentar idéias. Se o objetivo do curso é ensinar algoritmos básicos, eles podem ser adequados (especialmente o Matlab), mas se for programação geral, convém usar uma linguagem de programação mais geral, como Python de C ++.
Truman Ellis

2
O MATLAB tem um design (se eu não fosse diplomático, eu diria falho :)) que requer o que em outras línguas são práticas ruins. Muitas outras coisas são diferentes de qualquer outra coisa, então "sair" pode ser difícil. O Mathematica tem, na minha opinião, um design bonito, mas não é nada parecido com qualquer outro idioma (exceto talvez o Lisp, mas não é usado na ciência), então o que você aprendeu é quase inútil para aprender outro idioma. OTOH, usar C <-> Python é muito mais fácil.
27414 Davidmh

Respostas:


32

Primeiro, se seus alunos de graduação são como os nossos e não tiveram introdução prévia aos computadores, espere gastar algum tempo ensinando-os a usar coisas básicas, como usar um editor adequado (por exemplo, não o MS Word), a linha de comando etc.

Eu acho que a resposta depende um pouco de onde você define o foco do seu curso (ou o que você é obrigado a ensinar). Por exemplo: Qual a relevância do funcionamento interno do computador? Você precisa de classes e outras estruturas avançadas de POO? Deseja ensiná-los a produzir programas eficientes ou fica feliz se eles produzem algum programa de trabalho? Além disso, não esqueça que você provavelmente precisará de tutores capazes.

Mas agora tenho algumas vantagens e desvantagens das linguagens, estou familiarizado. Observe que isso se deve principalmente à minha experiência como físico computacional e parte disso pode depender do campo, grupo de trabalho, universidade, etc.

Python

Geralmente recomendo usar o Numpy quase desde o início e suponho que seja usado a seguir.

Vantagens:

  • É fácil aprender e também ler o código de outras pessoas (por exemplo, seu código de exemplo, mas também o código dos alunos para os tutores).
  • A entrada e a saída (que não devem ser o foco do seu curso) podem ser totalmente cobertas pelo printNumpy savetxte loadtxt, e talvez sys.argv. Pode ser introduzido em tempo real e não consome muito tempo de programação.
  • Você não precisa lidar ou precisa lidar pouco com detalhes como representação numérica, gerenciamento de memória e tipos de dados. Assim, é rápido programar e você pode se concentrar nos algoritmos reais.
  • Não é uma linguagem compilada. Isso tem duas vantagens: os alunos não precisam lidar com um compilador e podem testar coisas diretamente no console sem precisar compilar, reiniciar e executar o programa novamente. De maneira semelhante, a depuração é mais fácil.
  • Existem bibliotecas fáceis de usar para quase tudo.
  • Você não precisa aprender linguagens de script adicionais, como shell scripts, Make, Gnuplot e assim por diante - tudo isso pode ser feito no Python.
  • Existem muitos bons tutoriais (de graça).

Desvantagens:

  • Não é compilado. Portanto, os programas Python podem ser drasticamente mais lentos que os programas compilados em alguns casos relevantes para a física computacional. Em outros casos, no entanto, as bibliotecas (especialmente o Numpy) podem gerar um desempenho comparável. Outra maneira de obter bons desempenhos com o Python é escrever os trechos de código relevantes em outro idioma como C¹. Obviamente, você precisa aprender esse idioma para isso, mas isso pode ser feito mais tarde e seu tempo aprendendo Python não é desperdiçado.
  • É mais difícil ensinar detalhes como representação numérica, gerenciamento de memória, tipos de dados e suas armadilhas, pois são um tanto ofuscados.

C / C ++

Vantagens:

  • É compilado e, portanto, é mais fácil produzir código eficiente.
  • Você está lidando diretamente com representação numérica, gerenciamento de memória, tipos de dados e, portanto, é mais intuitivo ensiná-los - seus alunos se aproximarão do que realmente está acontecendo no computador.
  • Existem bibliotecas para basicamente tudo, mas entender e usar uma biblioteca exige algum trabalho.
  • Existe uma quantidade relevante de código existente no C / C ++ e, portanto, os alunos precisam aprender o idioma se quiserem trabalhar com esse código.
  • Se você já conhece C / C ++, pode aprender Python (por exemplo) muito rápido.

Desvantagens:

  • É compilado e seus alunos precisam lidar com o compilador, o pré-processador, cabeçalhos e assim por diante. Você ficaria surpreso com o quanto os alunos falham nessa etapa, mesmo no final do semestre.
  • É mais lento para aprender e leva mais tempo para produzir código funcional.
  • Lidar com coisas marginais, como entrada e saída, leva algum tempo tanto no ensino quanto na programação. No C ++, há uma sintaxe extra para entrada e saída.
  • Dependências do compilador e do sistema operacional.
  • Você precisa lidar com a confusão de C / C ++.
  • A leitura do código de outras pessoas, especialmente em C ++, pode ser bastante difícil devido à grande quantidade de recursos de sintaxe.

As principais vantagens do C ++ sobre o C (classes, modelos) não devem ser relevantes para o seu curso e estão se tornando relevantes apenas para projetos maiores. Portanto, eu escolheria C dos dois, pois é mais conciso.

Outras

Alguns comentários nos outros idiomas:

  • Fortran: Isso ainda é usado por muitos grupos e existe muito código legado, mas você não consegue lidar com os antigos padrões e suas enormes limitações e armadilhas (muitas pessoas ainda estão trabalhando com o Fortran 77). Além disso, será muito mais difícil encontrar tutoriais, ajuda na Internet e assim por diante.
  • Matlab / Mathematica: Todos os problemas do software proprietário. Considere, em particular, que seus alunos provavelmente colaborarão com pessoas que não têm acesso a este software e aos problemas resultantes.
  • Cuda: Isso é relevante apenas para certos problemas, se o desempenho importa. Além disso, depois de tudo o que sei, você não quer aprender a programar dessa maneira.

¹ Qual é o fluxo de trabalho padrão, pelo menos em nosso grupo.


Resposta muito precisa
Afnan Bashir 8/14

1
Eu também gostaria de dizer que um dos bônus não mencionados do Python é que existem várias distribuições científicas (Anaconda / Enthought / PythonXY / SAGE) que realmente facilitam o processo de colocar todos na mesma página de computação. Além disso, ainda mais interessantes são as abordagens baseadas na Web (Wakari e SAGE) que fornecem tudo isso através de um navegador conhecido como 0 software instalado. O ensino de graduação em c ++ ou Fortran resultará em mais tempo perdido lutando contra um compilador do que o tempo ganho em velocidade de código.
meawoppl

Existe um ecossistema incrível em python para a física computacional. Numpy, scipy por fornecer infraestrutura básica, mayavi, tvtk para visualizações. Python é bastante maduro na comunidade de computação científica. Eu uso C ++ na produção, mas não importa o que é difícil de usar.
Sai Venkat

@meawoppl: “O ensino de graduação em c ++ ou Fortran resultará em mais tempo perdido lutando contra um compilador do que o tempo ganho em velocidade de código.” - Não é a velocidade de código dos exercícios para o curso que importa (os programas serão muito rápidos de qualquer maneira, a menos que os exercícios sejam feitos especificamente para não serem), mas a velocidade do código dos programas que eles escreverão para a vida real ou similar. E há algumas coisas que simplesmente não podem ser feitas com eficiência apenas em Python.
precisa saber é o seguinte

1
Eu diria que a CUDA está fora de questão para um curso de propósito geral, pois exige hardware que nem todo mundo possui. E se você tiver apenas um laptop sem ele, quase não há como instalar um.
Davidmh

22

Em 2014, eu teria dito Python. Em 2017, acredito sinceramente que o idioma para ensinar alunos de graduação é Julia.

Ensinar é sempre uma troca. Por um lado, você deseja escolher algo que seja simples o suficiente para ser fácil de entender. Mas, em segundo lugar, você quer ensinar algo que tem poder de permanência, isto é, algo que pode crescer com você. As linguagens dinâmicas comuns (Python / MATLAB / R) se enquadram facilmente na categoria 1 devido ao código clichê inexistente e à facilidade de abrir um intérprete e cuspir código, enquanto o C / C ++ / Fortran se enquadra na segunda categoria como as linguagens com as quais foram escritos os principais softwares de alto desempenho do mundo de hoje.

Mas há problemas com o uso de um idioma que não captura completamente a outra categoria. Ao usar uma linguagem como Python, ela abstrai coisas como tipos e excesso de números inteiros. Isso é bom para ensinar computação no primeiro semestre, mas, como você quer se aprofundar cada vez mais em como as coisas estão realmente funcionando, a linguagem do Python está muito abstrata do metal subjacente para ser uma boa ferramenta de ensino. Mas C / C ++ / Fortran (ou Java ... eu aprendi Java primeiro ...) todos têm um custo de inicialização tão grande que a coisa mais difícil de aprender é apenas como configurar e maincompilar os cabeçalhos , o que impede que você realmente aprenda a programar .

Digite Julia. Quando você usa Julia pela primeira vez, pode abstrair toda a ideia de tipos e usá-la como MATLAB ou Python. Mas, como você deseja aprender mais, há uma "toca de coelho" de profundidade no idioma. Como é realmente uma camada de abstração baseada em um sistema de tipos + despacho múltiplo sobre o LLVM, é essencialmente "uma maneira fácil de escrever código compilado estaticamente" (e funções estáveis ​​ao tipo podem realmente ser compiladas estaticamente). O que isso significa é que os detalhes do C / C ++ também estão acessíveis. Você pode aprender a escrever loops e funções simples sem o código padrão e, em seguida, pesquisar os ponteiros de função. Os recursos de metaprogramação de Julia permitem acessar diretamente o AST, e existem macros que mostram todas as partes da cadeia de compilação. Além disso, como um Lisp, é passível de estilos de programação funcionais. E possui muitos recursos de computação paralela. Ideias como tipografia paramétrica e estabilidade de tipo são bastante únicas e profundas em Julia.

Se você quiser estudar as linguagens de programação, poderá aprender as etapas de como a compilação funciona usando @code_loweredpara ver o que é a redução, consulte o AST digitado com @code_typed, consulte LLVM IR com@code_llvm e, finalmente, o código de montagem nativo com @code_native. Isso pode ser usado para mostrar qual é o custo das variáveis ​​dinâmicas e exatamente como o "boxe variável" funciona, e este post do blog mostra como essas ferramentas de introspecção podem ser usadas para ensinar como as otimizações do compilador podem / não podem ocorrer.

Não há apenas idéias de ciência da computação e engenharia de software a serem exploradas, mas também idéias matemáticas ricas. Como as principais bibliotecas de Julia são escritas com a digitação genérica, é trivial criar operadores sem matriz e usar o IterativeSolvers.jl para executar o GMRES usando-os. Você pode usar ferramentas de introspecção como@which para mostrar exatamente como tudo foi implementado. Por exemplo, como \funciona?

@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805

Isso me aponta diretamente para a definição de \ . Ele é implementado em Julia, para que alguém que conheça Julia possa aprender o algoritmo e como ele funciona através da identificação de subtipos de matriz e especialização quando possível (voltando à eliminação gaussiana). Como o código de Julia é licenciado pelo MIT (e quase todos os pacotes são licenciados pelo MIT), os alunos são livres para usar essas idéias em seu próprio código (com atribuição) (quando o código é licenciado pela GPL, como é o caso da maioria dos pacotes MATLAB e R, eles precisam ter cuidado com os problemas de licenciamento!).

Como o núcleo da linguagem é construído com uma comunidade de código aberto muito ativa, também há um recurso rico na história do desenvolvimento da linguagem: seus problemas no Github . Entendendo questões de linguagem, como o que realmente é uma transposição de matriz? pode ser muito esclarecedor para entender esses objetos matemáticos com mais detalhes.

Mas, finalmente, no final, você quer ensinar seus alunos a criar. Infelizmente, aprender Python ou R não significa necessariamente que você tem o que é necessário para "desenvolver Python / R", já que a maioria dos pacotes amplamente utilizados e otimizados possui uma quantidade substancial de código C / C ++ / Fortran neles, para para obter desempenho. Assim, para que esses alunos possam contribuir com os ecossistemas científicos dessas línguas, eles terão que aprender outra língua em algum momento. Embora isso não seja totalmente horrível, é subótimo agora que Julia existe. Como Julia estável ao tipo é capaz de atingir a velocidade do C / Fortran, a maioria dos pacotes no ecossistema Julia é puro código Julia. Aprender Julia significa que aprendemos a desenvolver Julia. E como o Base Julia também é principalmente o código de Julia (apenas algumas primitivas e o analisador não),

Dito isto, existem algumas desvantagens na escolha de Julia. Por um lado, é muito mais recente que esses outros idiomas e, portanto, é um pouco mais escasso em recursos. Você terá que criar muitas ferramentas de ensino por conta própria ou obter recursos da Web listados no site da Julia . Além disso, os detalhes do idioma não estão completamente definidos, embora a versão 1.0 seja lançada em breve (até o final de 2017). E também é bem provável que você, o potencial professor de um curso em Julia, não tenha muita experiência com o idioma. No entanto, esses são os tipos de problemas que desaparecem com o tempo, enquanto os benefícios de Julia que mencionei acima são muito mais essenciais para os próprios idiomas.


Pergunto-me se o uso de uma linguagem pouco usada faz sentido, pois o conhecimento da sintaxe provavelmente será perdido e não é garantido que os alunos aprendam várias línguas. Talvez nesse ponto de vista, python ainda seja uma boa ideia.
Xavier Combelle

1
É por isso que eu nunca disse Julia antes, mas agora que é bastante comum você poder usá-lo.
Chris Rackauckas

Eu acho que Julia ainda é nova demais. Na indústria, espera-se que os alunos conheçam Python, C ++, (ew) MATLAB e R. Acho que é melhor como uma segunda ou terceira língua aprender, como uma experiência enriquecedora. É improvável que os alunos usem Julia novamente em um futuro próximo.
Mateen Ulhaq

2
Os alunos devem aprender habilidades transferíveis, não um modelo para copiar e colar. Nesse sentido, o Python / MATLAB / R abstrai muito do computador para ser uma boa ferramenta de ensino além da programação mais simples, mas o C ++ é muito baixo para ser uma boa ferramenta de ensino. Claro, se você quiser ter um idioma paralelo em um curso de análise numérica, faça o que usará porque o curso não é sobre programação. Mas se trata de conceitos de programação, Julia é praticamente a única linguagem simples que realmente tem a maioria dos conceitos em seu design.
22917 Chris Rackauckas

2

Falando como um graduado não muito distante, e supondo que você não esteja ensinando no departamento de CS, acho que seria um desastre apresentar aos alunos a programação de computadores com algo como C, C ++ ou Fortran (ou Deus não permita) CUDA), embora outros tenham apontado que provavelmente são o status quo da computação científica.

Se você espera ensinar aos alunos computação científica e apresentá-los à programação no mesmo curso, aposto que isso é demais para cobrir em um semestre, a menos que você se atenha a uma linguagem interpretada como matlab ou python. Na minha experiência, a maioria das aulas de computação científica no nível de graduação é ministrada em uma dessas duas formas, e o python está se tornando cada vez mais útil como uma linguagem de nível de produção todos os dias, por isso ainda tem alguma utilidade como habilidade prática ( além de apenas ensinar noções básicas de programação, quero dizer).

Apenas meus dois centavos.


4
Desastre é uma palavra muito forte para ser usada para descrever os alunos que ensinam C, C ++ ou Fortran. Qualquer uma dessas linguagens (C, C ++, Fortran ou Python) pode ser adequada para o ensino de programação e computação científica, dependendo de como você o faz.
Bill Barth

1
Da minha experiência em uma classe do departamento de CS (C ++) e em uma classe para astrônomos (Fortran 77), o C / C ++ / Fortran não fornece ajuda suficiente em comparação com o python para programadores completamente novos (segfaults x exceções). O uso de C / C ++ / Fortran implica aprender como usar um depurador (ou o uso de um IDE), enquanto o python pode ser usado por si só.
James Tocknell

0

C, C ++ e Fortran (listados em nenhuma ordem específica) são as três principais linguagens de programação usadas para matemática / física computacional, se você deseja resolver grandes problemas em supercomputadores. Acho que o CUDA é considerado uma biblioteca usada em conjunto com outros idiomas para a computação acelerada da GPU. É ótimo aprender Matlab e python para executar diagnósticos de saída e criar modelos de protótipo. Eles também são mais fáceis de aprender e podem ser melhores para um curso em que você deseja conhecer os versículos de algoritmos que aprendem a programar.

Portanto, se seu curso é puramente sobre programação, eu escolheria C ++ ou, se essa for a primeira vez que os alunos programarem, Python. Ambas as línguas têm alta utilidade fora do mundo da computação científica. Se o curso é centrado no aprendizado de algoritmos para resolver problemas baseados na física, acho que o Matlab é sem dúvida o vencedor.


0

resumido: leve em consideração que a computação científica é complicada por si só. Você realmente quer que a linguagem de programação entre em jogo?

A matemática usa a abstração para resolver problemas que não podem ser resolvidos pela intuição. Portanto, os conceitos tendem a ser abstratos. É por isso que não é trivial entender quais conceitos encapsular. Na computação científica, os exemplos usuais para aulas como "Animal" "Veículo" são bastante inúteis. Isso é verdade para a programação orientada a objetos, mas acredito que reproduzir conceitos abstratos em um computador também não é trivial na programação imperativa.

É por isso que acredito que aqui estamos lidando com dois esforços diferentes: programação, por um lado, e computação científica, por outro. No nível de graduação, onde os alunos são de origens heterogêneas, você pode acabar ensinando duas coisas diferentes ao mesmo tempo.

Se seu objetivo é ensinar computação científica, acho que isso já é bastante difícil. Ter uma barreira adicional como a linguagem de programação (todos concordamos que o C ++ requer treinamento) desmotivaria uma boa parte dos alunos; é por isso que sugiro usar o python.

Se o seu curso for "Introdução ao SC", acredito que o python tenha a melhor relação resultado / esforço.

PS: agora temos computadores bastante bons, não precisamos realmente procurar eficácia em nível de graduação.


Em relação ao seu PS: Por que o desempenho não importa apenas para estudantes de graduação? Além do fato de ser fácil conceber tarefas para estudantes de graduação em que o desempenho importa, não são essas tarefas para as quais eles estão aprendendo o desempenho, mas a vida real. Além disso, a velocidade do computador pode ter aumentado, mas nossas expectativas também.
Wrzlprmft

Desculpe, eu estava muito afiada. Deixe-me reformulá-lo em "os alunos podem executar grandes aplicativos satisfatórios com uma linguagem interpretada, antes de pesquisar na otimização do código e depois passar para uma linguagem compilada".
Nicola Cavallini
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.