Todo cientista precisa saber um pouco sobre estatística: o que significa correlação, o que é um intervalo de confiança e assim por diante. Da mesma forma, todo cientista deve saber um pouco sobre computação: a questão é: o que? O que é razoável esperar que todo cientista que trabalha saiba sobre construção e uso de software? Nossa lista de habilidades básicas - o que as pessoas devem saber antes de enfrentar qualquer coisa com "nuvem" ou "peta" em seu nome - é:
programação básica (loops, condicionais, listas, funções e E / S de arquivo)
o script shell / shell básico
quanto testar programas
Há muita coisa que não está nessa lista: programação matricial (MATLAB, NumPy e similares), planilhas quando bem utilizadas, são tão poderosas quanto a maioria das linguagens de programação, ferramentas de automação de tarefas como Make e assim por diante.
Então: o que há na sua lista? O que você acha justo esperar que todo cientista saiba hoje em dia? E o que você retiraria da lista acima para abrir espaço para isso? Ninguém tem tempo suficiente para aprender tudo.
Ótima pergunta! Mas não estou claro sobre uma coisa: o que você quer dizer com cientista computacional? Algum cientista que usa computação? Ou o MUITO menor grupo de pessoas que consideraria seu título profissional "cientista computacional"?
Faça uma pergunta da lista não é boa no formato Stack Exchange. Nós realmente temos que passar por isso em todos os sites?
O Wiki da Comunidade @Dan não é uma desculpa para permitir perguntas que não pertencem ao site. Eu também gostaria de encorajar aqueles que responder para dar um exemplo de Jed e pelo menos tentar explicar por que você precisa de certas habilidades ou fazer outros não precisam
@ IvoFlipse: Esta é uma pergunta que pertence ao site de alguma forma. Talvez não como atualmente declarado; talvez precise ser cortado em perguntas menores e reformulado, mas a questão da má engenharia de software na ciência da computação é extremamente importante, principalmente porque a ciência da computação como disciplina ainda está em seus estágios formativos. Este artigo na natureza indica o porquê. Greg está prestando um ótimo serviço à comunidade de ciências computacionais através de seu site.
Não concordo que esta questão seja encerrada. Por favor, veja (e vote) meta.scicomp.stackexchange.com/questions/179/…
O "Cientista Computacional" é um tanto amplo, pois inclui pessoas que fazem análises numéricas com implementações em papel / LaTeX e prova de conceito, pessoas que escrevem bibliotecas de uso geral e pessoas que desenvolvem aplicativos que resolvem certas classes de problemas e usuários finais que as utilizam. formulários. As habilidades necessárias para esses grupos são diferentes, mas há uma grande vantagem em se familiarizar com o "full stack". Descreverei quais são as partes críticas dessa pilha; as pessoas que trabalham nesse nível devem, obviamente, ter um conhecimento mais profundo.
Conhecimento do domínio (por exemplo, formação em física e engenharia)
Todos devem saber o básico da classe de problemas que estão resolvendo. Se você trabalha com PDEs, isso significa alguma familiaridade geral com algumas classes de PDE (por exemplo, Poisson, elasticidade e Navier-Stokes incompressível e compressível), especialmente quais propriedades são importantes para capturar "exatamente" e o que pode ser discretizado erro (informa a seleção do método referente à conservação local e aos integradores simpléticos). Você deve conhecer alguns funcionais e os tipos de análise de interesse para os aplicativos (otimização de elevação e arrasto, previsão de falha, inversão de parâmetros etc.).
Todos devem ter alguma familiaridade geral com classes de métodos relevantes para o domínio do problema. Isso inclui características básicas de álgebra linear esparsa versus densa, disponibilidade de "métodos rápidos", propriedades de técnicas de discretização espacial e temporal e como avaliar quais propriedades de um problema físico são necessárias para que uma técnica de discretização seja adequada. Se você é principalmente um usuário final, esse conhecimento pode ser de nível muito alto.
Engenharia de software e bibliotecas
Alguma familiaridade com as técnicas de abstração e o design da biblioteca é útil para quase todos na ciência da computação. Se você trabalhar com métodos de prova de conceito, isso melhorará a organização do seu código (facilitando a tradução de outra pessoa para uma implementação robusta). Se você trabalha em aplicativos científicos, isso tornará seu software mais extensível e facilitará a interface com as bibliotecas. Seja defensivo ao desenvolver código, para que os erros sejam detectados o mais cedo possível e as mensagens de erro sejam o mais informativas possível.
Trabalhar com software é uma parte importante da ciência computacional. A proficiência no idioma escolhido, o suporte ao editor (por exemplo, tags, análise estática) e ferramentas de depuração (depurador, valgrind) aumentam bastante a eficiência do desenvolvimento. Se você trabalha em ambientes em lote, deve saber como enviar tarefas e obter sessões interativas. Se você trabalha com código compilado, um conhecimento prático de compiladores, vinculadores e ferramentas de criação como o Make economizará muito tempo. O controle de versão é essencial para todos, mesmo se você trabalha sozinho. Aprenda Git ou Mercurial e use-o para todos os projetos. Se você desenvolver bibliotecas, deverá conhecer os padrões de linguagem razoavelmente completamente, para que quase sempre escreva códigos portáteis na primeira vez, caso contrário, você será enterrado em solicitações de suporte ao usuário quando seu código não for construído em seu ambiente desagradável.
O LaTeX é o padrão de fato para publicação e colaboração científica. A proficiência no LaTeX é importante para poder comunicar seus resultados, colaborar com propostas etc. O uso de scripts para criação de figuras também é importante para a reprodutibilidade e a proveniência dos dados.
Eu concordo com o Jed. LaTeX é absolutamente necessário! :)
Eu mudaria "Física e engenharia" para a experiência no assunto. Afinal, não somos todos físicos ou engenheiros. O espírito dessa parte da resposta está no lugar certo, mas há uma suposição bastante flagrante.
— Fomite 02/02/12
Obrigado @EpiGrad, mudei para "conhecimento de domínio", com os exemplos.
Boa lista. Um entendimento básico dos problemas de desempenho também deve estar lá. Eu conheci muitas pessoas que não entendem o conceito simples de criar código de perfil. NB: desempenho deve ser entendido como significando não apenas problemas de velocidade, mas também uso de memória.
Erros de digitação: "probelms" e "enterrado". O SE não me deixou corrigi-los - uma edição muito pequena.
Minha formação é em Ciência da Computação, portanto minhas opiniões podem ser um pouco tendenciosas. Dito isto, adicionaria "algoritmos básicos e estruturas de dados" à lista. O que quero dizer com noções básicas é essencialmente pesquisa e classificação lineares e estruturas de dados como árvores balanceadas, pilhas e / ou tabelas de hash.
Por quê? Bem, na maioria dos algoritmos computacionais, você acaba gastando uma quantidade extraordinária de tempo e esforço trocando dados e não computando nada. Já implementou um código de elemento finito? Isso representa cerca de 90% da organização de dados. A diferença entre fazer e fazer bem pode ser uma ordem de magnitude na eficiência computacional.
Um pequeno ponto relacionado à Ciência da Computação que eu também acrescentaria é uma breve introdução sobre como um processador realmente funciona e em que ele é bom e o que não é. Por exemplo:
Adição e multiplicação são rápidas, funções de divisão ou transcendentais não. Eu já vi homens adultos substituindo uma operação de raiz quadrada por algo que exigia três divisões e acho que eles fizeram algo excelente (divisão e raiz quadrada são igualmente caras).
Os caches de nível 3 estão ficando maiores a cada ano, sim, mas o cache de nível 0, ou seja, o mais rápido, ainda tem apenas alguns kilobytes.
Compiladores não são mágicos. Eles podem desenrolar pequenos loops ou vetorizar operações extremamente diretas, mas não transformarão essas bolhas em uma classificação rápida.
Chamar métodos em objetos polimórficos com herança múltipla em seu loop mais interno pode ser conceitualmente interessante, mas fará com que sua CPU queira se matar.
Isso é muito chato, mas leva apenas alguns minutos para explicar, e manter isso em mente permitirá escrever um bom código desde o início ou projetar algoritmos que não dependem de recursos de hardware inexistentes.
Quanto ao que remover da lista, acho que o SQL é um pouco demais para os cientistas computacionais. Além disso, o teste de software é importante, mas é uma ciência em si. O teste de unidade e os tipos de dados abstratos corretos são algo que deve ser ensinado com programação básica e não requer um programa de mestrado de dois anos.
Não é chato. Eu faria um curso como esse, se estivesse em oferta. :-)
Eu poderia acrescentar isso mais tarde, mas, para começar, retiro o "shell scripting" e o substituo especificamente por "Python scripting". O Python é muito mais portátil que o script de shell e mais legível que as linguagens de script e shell comparáveis. Sua grande biblioteca padrão e popularidade nas ciências (com a possível exceção da biologia, que também usa Perl) a torna uma ótima língua franca computacional , sem mencionar uma boa primeira língua para aprender programação. Agora é a primeira língua ensinada aos alunos da EECS no MIT e é popular no mercado de trabalho, particularmente na computação científica. Sua documentação on-line é extensa e também há vários textos de programação baseados em Python disponíveis on-line.
Usando o Python, você pode ensinar construções básicas de programação, bem como scripts. Além disso, o Python possui excelente suporte para testes de unidade, portanto, o Python também pode ser usado para ensinar testes de unidade. O Python também possui uma extensa API de banco de dados (que pode substituir ou aumentar a necessidade de aprender SQL) e alguns utilitários de compilação que oferecem funcionalidade semelhante a Make. Pessoalmente, prefiro SCons do que Make, porque acho o Python mais fácil de documentar e testar do que os scripts de shell.
Por fim, o princípio motivador por trás do meu flagrante xelim para Python é a eficiência. É muito mais fácil otimizar seu fluxo de trabalho se você puder fazer a maior parte do seu trabalho em um idioma ou em uma ferramenta, especialmente quando essa ferramenta for uma linguagem de script expressiva. Claro, eu poderia fazer tudo em C, mas meu programa seria 5 vezes maior e as chances são de que eu não preciso da velocidade. Em vez disso, posso usar o Python para importar dados de um arquivo de texto, plotá-lo, chamar rotinas de otimização, gerar variáveis ​​aleatórias, plotar meus resultados, gravar resultados em um arquivo de texto e testar meu código de unidade. Se o Python estiver muito lento, é possível agrupar o Python em torno do código C, C ++ ou Fortran que cuida de tarefas computacionalmente intensivas. Python é, para mim, um balcão único para a maioria das minhas necessidades de computação científica.
Python ainda não é exatamente o MATLAB; SciPy e NumPy ainda têm um caminho a percorrer em termos de funcionalidade, mas em termos de utilidade geral, uso o Python para uma variedade maior de tarefas que o MATLAB.
Não posso deixar de discordar completamente disso. Python é uma dor de cabeça para os mantenedores de sistemas, já que é um alvo em movimento. Os cientistas da computação devem ter um entendimento básico de bash ou csh para a colagem mais rudimentar de coisas e a execução de trabalhos nos sistemas que eles provavelmente usarão. O Python é ótimo, e eu apoio você a defender que o pessoal da computação o aprenda, mas não à custa de um shell rudimentar.
@ BillBarth: Eu acho que todo cientista computacional precisa aprender bash ou csh básico para scripts muito, muito básicos. A razão pela qual defendo o uso do Python para scripts de shell além dessas tarefas básicas é porque eu herdei um script bash de mil linhas que basicamente executa um programa . Ele passa os arquivos para frente e para trás como semáforos, invoca repetidamente o PBS, e não há como testá-lo. O script do shell é ótimo para pequenas tarefas, mas não para grandes, e esse pesadelo com fita adesiva e chiclete custou alguns anos da minha tese, e é por isso que sou insistente.
Como eu disse, não discordo que "aprender python" possa ser apropriado para a lista. Eu só não quero fazer isso à custa do "shell scripting". Ambos são importantes e ninguém permitirá que você execute o ipython como seu shell; portanto, o script de shell é extremamente importante.
@ BillBarth: Em nenhum lugar estou sugerindo que o Python substitua o shell. Estou apenas sugerindo que o Python substitua o bash por scripts; Acredito que, se você aprender o bash básico, sabe o suficiente para escrever scripts sem estruturas de controle; portanto, não há necessidade de se aprofundar no "script de bash". Assim que você quiser incluir uma estrutura de controle, mude para um idioma diferente, pois a programação no bash é uma dor de cabeça para os mantenedores de software e biblioteca.
+1. Python é minha principal linguagem de programação há algum tempo. Não é perfeito, mas serve até que alguém invente a linguagem de programação perfeita.
Matemática de ponto flutuante. A maioria das ciências lida com valores do mundo real, e os valores do mundo real são frequentemente representados como ponto flutuante no mundo da computação. Existem muitas dicas em potencial com carros alegóricos que podem causar estragos na significância dos resultados.
A referência favorita para este tópico parece ser "O que todo cientista da computação deve saber sobre aritmética de ponto flutuante (1991)", de David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768
Este documento foi mencionado muitas vezes em fóruns online. Mas é um artigo muito longo e denso, e não tenho certeza de quantas pessoas conseguiram tirar algo útil disso.
Um cientista computacional deve ter familiaridade suficiente em ciência da computação, matemática e um campo de aplicação em ciência / engenharia. Eu incluiria habilidades em cada uma das seguintes áreas:
Equações diferenciais ordinárias, parciais e / ou estocásticas
Estatística e / ou Probabilidade
Teoria Inversa
Programação Paralela (MPI, OpenMP, CUDA, etc.)
Usando um ambiente Linux
Ciência / Engenharia - depende da aplicação em que você deseja se especializar. No meu caso particular (engenharia), eu adicionaria coisas como mecânica contínua, transferência de calor, dinâmica de fluidos, método de elementos finitos etc. Eu diria que quanto mais familiaridade como você tem vários campos da ciência, mais versátil você é como cientista computacional.
Você pode elaborar sobre "Teoria Inversa"?
@FaheemMitha: Tradicionalmente, definimos os parâmetros de um modelo primeiro (por exemplo, uma equação diferencial parcial) e depois observamos o comportamento do sistema. Um "problema inverso" está fazendo o inverso. Começamos com as observações da saída do sistema e tentamos determinar os parâmetros do modelo que produz essas observações. A teoria inversa descreve métodos para realizar esta tarefa.
Obrigada pelo esclarecimento. Você tem um bom link / referência para este tópico?
en.wikipedia.org/wiki/Inverse_problem é um bom lugar para começar. O space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf também possui uma boa visão geral. Mas, para um entendimento mais aprofundado, eu recomendaria um livro como amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Ótima pergunta seguida de respostas fascinantes! Gostaria de me intrometer com apenas uma pequena adição. Tanto quanto eu experimentei (eu mesmo e indiretamente), uma ferramenta All-in-One é geralmente muito boa de se saber. Essa ferramenta pode ser MATLAB, Octave ou até Python (com bibliotecas). Sempre que houver um problema em sua "zona de conforto", uma boa idéia (até onde eu saiba e penso) seria tentar usar uma ferramenta da Multifuncional. Você pode tentar escrever seus próprios códigos mais tarde. A beleza de tais pacotes é que a programação não interfere no entendimento do que você está fazendo.
Veja um exemplo de computação gráfica. Escrever um código para conversão, rotação ou redimensionamento de uma figura tem 10 linhas de código no MATLAB (no alto), mas pode ser executado em páginas em C. Não estou dizendo que C não é bom. Tudo o que estou dizendo é que, se você não tiver um bom motivo para escrever códigos em C, o MATLAB seria uma saída mais simples, melhor e mais intuitiva.
Alguns podem discordar e afirmar que a programação tipo C é uma ótima maneira de criar intuição. Talvez seja. Mas quando você não precisa lidar com um problema por mais de algumas vezes, dificilmente é necessário sentar e escrever seus próprios códigos em um idioma como C.
Bom senso e pressentimento ... Este último só vem com o tempo e depois de ter "sobrevivido" a algumas experiências vergonhosas no grande mundo ruim.
Não sei se "pressentimento" é realmente uma habilidade. É mais apenas uma reação instintiva à experiência anterior.