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
- controle de versão
- quanto testar programas
- SQL básico
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.
Respostas:
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.).
Matemática
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.
Ferramentas
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.
Látex
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.
fonte
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:
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.
fonte
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.
fonte
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
fonte
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:
Matemática:
Ciência da Computação:
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.
fonte
Ó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.
fonte
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.
fonte