Her hesaplamalı bilim insanının hangi temel becerileri olmalı? [kapalı]


52

Her bilim insanının istatistik hakkında biraz bilgisi olması gerekir: Ne korelasyonun anlamı, güven aralığının ne olduğu vb. Benzer şekilde, her bilim adamı bilgisayar hakkında biraz bilgi sahibi olmalıdır: soru şu, ne? Çalışan tüm bilim insanlarının yazılım oluşturma ve kullanma hakkında bilgi sahibi olmalarını beklemek makul olan nedir? Temel beceriler listemiz — insanların adında "bulut" veya "peta" olan herhangi bir şeyle mücadele etmeden önce bilmeleri gerekenler ---

  • temel programlama (döngüler, şartlamalar, listeler, işlevler ve dosya G / Ç)
  • kabuk / temel kabuk komut dosyası
  • sürüm kontrolü
  • programları test etmek için ne kadar
  • temel SQL

Bu listede olmayan bir çok şey var : matris programlama (MATLAB, NumPy ve benzerleri), iyi kullanıldığında elektronik tablolar, çoğu programlama dili kadar güçlüler), Make gibi otomasyon araçları vb.

Peki , listenizde ne var ? Her bilim insanının bugünlerde bilmesini beklemenin ne kadar adil olduğunu düşünüyorsun? Ve buna yer açmak için yukarıdaki listeden ne çıkarırsınız? Kimse her şeyi öğrenmek için yeterli zamana sahip değil.


1
Harika soru! Ama bir konuda net değilim: Hesaplamalı bilim insanı ile ne demek istiyorsun? Hesaplama kullanan herhangi bir bilim adamı var mı? Ya da mesleki unvanını "hesaplamalı bilim insanı" olarak kabul eden daha küçük bir grup insan mı?
David Ketcheson

9
Yığın Exchange biçiminde bir liste sorusu yapmak iyi değil . Gerçekten her sitede bunun üzerinden gitmek zorunda mıyız?
dmckee

4
@Dan Topluluğu Wiki, siteye ait olmayan sorulara izin vermek için bir bahane değil. Ayrıca Jed’den bir örnek almaya cevap verenleri cesaretlendirmek ve en azından neden belirli becerilere ihtiyaç duyacağınızı ya da başkalarına ihtiyaç duymayacağınızı açıklamayı denemek isterim
Ivo Flipse

5
@IvoFlipse: Bu, siteye bir şekilde ait olan bir soru. Belki şu anda belirtildiği gibi değil; belki de daha küçük sorulara hapsolması ve yeniden sorgulanması gerekir, ancak bilgisayar bilimlerindeki zayıf yazılım mühendisliği konusu, özellikle de bir disiplin olarak bilgisayar bilimi hala biçimlendirici aşamada olduğundan, çok önemli bir konudur. Doğadaki bu makale nedenini gösteriyor. Greg, websitesi üzerinden hesaplamalı bilim camiasına harika bir servis yapıyor.
Geoff Oxberry,

5
Bu sorunun kapatılmasına katılmıyorum. Lütfen bakınız (ve oy verin) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson

Yanıtlar:


46

"Hesaplamalı Bilim İnsanı", kağıt / LaTeX ile sayısal analiz yapan ve kavram kanıtı uygulamaları ile sayısal analiz yapan insanları, genel amaçlı kütüphaneleri yazan kişileri ve belirli problem sınıflarını çözen uygulamalar geliştirenleri ve bunları kullanan son kullanıcıları içerdiğinden biraz geniştir. uygulamalar. Bu gruplar için ihtiyaç duyulan beceriler farklıdır, ancak "tam yığına" aşina olmak konusunda büyük bir avantaj vardır. Bu yığının kritik parçaları olduğunu düşündüğüm şeyi açıklayacağım, bu seviyede çalışan insanlar elbette daha derin bilgiye sahip olmalıdır.

Alan bilgisi (örneğin fizik ve mühendislik geçmişi)

Herkes çözdüğü problem sınıfının temellerini bilmelidir. PDE'ler üzerinde çalışıyorsanız, bu birkaç PDE sınıfına (örneğin Poisson, esneklik ve sıkıştırılamaz ve sıkıştırılabilir Navier-Stokes) bazı genel aşinalık, özellikle de "tam olarak" yakalamak için hangi özelliklerin ve ayrıklaştırmanın ne kadar önemli olacağı anlamına gelir. Hata (bu, yerel koruma ve sempatik bütünleştiriciler ile ilgili yöntem seçimini bildirir). Uygulamalara ilgi duyan bazı fonksiyoneller ve analiz türleri hakkında bilgi sahibi olmalısınız (kaldırma ve sürüklemenin optimizasyonu, başarısızlık tahmini, parametre inversiyonu, vb.).

Matematik

Herkes kendi problem alanı ile ilgili yöntem sınıfları hakkında genel bir bilgi sahibi olmalıdır. Bu, seyrek ve yoğun doğrusal cebirin temel özelliklerini, "hızlı yöntemlerin" kullanılabilirliğini, mekansal ve zamansal ayrıklaştırma tekniklerinin özelliklerini ve bir ayrıklaştırma tekniğinin uygun olması için fiziksel bir sorunun hangi özelliklerinin gerekli olduğunu nasıl değerlendireceğini içerir. Çoğunlukla son kullanıcıysanız, bu bilgi çok yüksek olabilir.

Yazılım mühendisliği ve kütüphaneler

Soyutlama teknikleri ve kütüphane tasarımı ile ilgili biraz bilgi sahibi olmak, bilişim bilimindeki hemen hemen herkes için yararlıdır. Kavram kanıtlama yöntemleri üzerinde çalışıyorsanız, bu kodunuzun düzenini iyileştirecektir (başka birinin daha sağlam bir uygulamaya dönüştürmesini "kolaylaştırır). Bilimsel uygulamalar üzerinde çalışıyorsanız, bu yazılımınızı daha da genişletilebilir hale getirecek ve kütüphanelerle etkileşimi kolaylaştıracaktır. Kod geliştirirken, hataların olabildiğince erken tespit edilebildiği ve hata mesajlarının olabildiğince bilgilendirici olacağı durumlarda savunuculukta olun.

Araçlar

Yazılımla çalışmak, hesaplama biliminin önemli bir parçasıdır. Seçtiğiniz dilde, editör desteğinde (örneğin etiketler, statik analiz) ve hata ayıklama araçlarında (hata ayıklayıcı, valgrind) yeterlilik, geliştirme verimliliğinizi büyük ölçüde artırır. Toplu ortamlarda çalışıyorsanız, iş göndermeyi ve etkileşimli oturumlar almayı bilmelisiniz. Derlenmiş kodlarla çalışıyorsanız derleyiciler, bağlayıcılar ve Make gibi derleme araçlarının çalışma bilgisi çok zaman kazandıracaktır. Sürüm kontrolü, yalnız çalışsanız bile herkes için önemlidir. Git veya Mercurial'ı öğrenin ve her proje için kullanın. Kütüphaneleri geliştirirseniz, dil standartlarını makul bir şekilde tamamen bilmelisiniz, böylece ilk kez her zaman taşınabilir kod yazarsınız, aksi halde kodunuz korkak ortamlarında kurulmadığında kullanıcı destek taleplerine gömülürsünüz.

Lateks

LaTeX, bilimsel yayın ve işbirliği için fiili bir standarttır. LaTeX ile yeterlilik, sonuçlarınızı iletebilmeniz, teklifler üzerinde işbirliği yapabilmeniz vb. İçin önemlidir. Rakamların oluşturulmasını yazmak, yeniden üretilebilirlik ve veri sunumu için de önemlidir.


7
Jed ile aynı fikirdeyim. LaTeX kesinlikle gerekli! :)
Paul

1
"Fizik ve Mühendislik" i konu uzmanlığı olarak değiştirirdim. Sonuçta, hepimiz fizikçi ya da mühendis değiliz. Cevabın o kısmının ruhu doğru yerde, ancak göze batan bir varsayım var.
Fomite

Thanks @ EpiGrad, ben örnek olarak "etki alanı bilgisi" olarak değiştirdim.
Jed Brown

İyi liste. Performans sorunlarının temel bir anlayışı da orada olmalıdır. Profil kodunun basit kavramını anlamayan çok fazla insanla tanıştım. Not: Performans sadece hızlı meseleleri değil aynı zamanda hafıza kullanımı anlamına da gelmelidir.
Faheem Mitha

Yazım hatası: "probelms" ve "gömülü". SE onları düzeltmeme izin vermedi - çok küçük bir düzenleme.
Faheem Mitha

26

Kendi geçmişim Bilgisayar Bilimleri konusunda doğru bir fikirdir, bu yüzden görüşlerim biraz yanlı olabilir. Bunu söylerken listeye "temel algoritmalar ve veri yapıları" ekleyeceğim. Temelleri kastettiğim, esasen doğrusal arama ve sıralama ve dengeli ağaçlar, yığınlar veya karma tablolar gibi veri yapılarıdır.

Neden? Pek çok hesaplama algoritmasında, veriyi değiştirmek için olağanüstü bir zaman ve çaba harcıyorsunuz, aslında hiçbir şeyi hesaplamıyorsunuz. Hiç bir Sonlu Eleman kodu uyguladınız mı? Bu yaklaşık% 90 veri organizasyonu. Bunu başarmak ve iyi yapmak arasında fark, hesaplama verimliliğinde bir büyüklük sırası olabilir.

Ayrıca ekleyeceğim küçük bir Bilgisayar Bilimi ile ilgili nokta, bir işlemcinin gerçekte nasıl çalıştığı ve neyin iyi olduğu ve neyin iyi olmadığı konusunda kısa bir giriş. Örneğin:

  • Toplama ve çarpma hızlı, bölme veya aşkın işlevler değildir. Yetişkin erkeklerin karekök operasyonunu üç bölüm gerektiren bir şeyle değiştirdiğini ve harika bir şey yaptıklarını düşündüklerini gördüm (bölme ve karekök aynı derecede pahalı).
  • Seviye 3 önbellekleri her yıl daha da büyüyor, evet, ancak Seviye 0 önbelleği, yani gerçekten hızlı olanı hala sadece birkaç kilobayt.
  • Derleyiciler sihir değil. Küçük döngüleri açabilir veya son derece yalındır işlemleri vektörlendirebilirler, ancak bu bubblesortu bir hızlı bağlantıya dönüştürmezler.
  • En içteki döngünüzde birden fazla kalıtım içeren polimorfik nesneler üzerinde arama yöntemleri kavramsal olarak tatlı olabilir, ancak CPU'nuzun kendini öldürmek istemesini sağlayacaktır.

Bu nitty-gritty sıkıcı şeyler, ama açıklamak için sadece birkaç dakika sürer ve akılda tutulması, başlangıçtan itibaren iyi bir kod yazmanıza ya da olmayan donanım özelliklerine dayanmayan tasarım algoritmaları yazmanıza izin verecektir.

Listeden ne çıkarılacağı konusunda SQL, Hesaplamalı Bilim adamları için biraz fazla olduğunu düşünüyorum. Ayrıca, Yazılım testi önemlidir, ancak başlı başına bir bilimdir. Birim testi ve doğru soyut veri türleri, temel programlama ile öğretilmesi gereken ve iki yıllık bir yüksek lisans programı gerektirmeyen bir şeydir.


2
Hiç sıkıcı değil. Eğer teklif edilseydi böyle bir kursa katılırdım. :-)
Faheem Mitha

18

Bunu daha sonra ekleyebilirim, ancak yeni başlayanlar için "kabuk komut dosyası" çıkardım ve özellikle "Python komut dosyası" ile değiştirdim. Python, kabuk betiklemeden çok daha taşınabilir ve benzer kabuk ve betik dillerinden daha okunaklıdır. Geniş standart kütüphanesi ve bilimdeki popülerliği (Perl'i de kullanan muhtemel biyoloji hariç) öğrenme programlaması için iyi bir ilk dilden bahsetmemek için harika bir hesaplama dili . Şimdi, EITS ana dallarına MIT'de öğretilen ilk dildir ve iş piyasasında, özellikle de bilimsel hesaplamada popülerdir. Çevrimiçi dokümantasyonu kapsamlıdır ve çevrimiçi olarak bulabileceğiniz Python'a dayanan bir dizi programlama metni de bulunmaktadır.

Python'u kullanarak, temel programlama yapılarını ve komut dosyalarını öğretebilirsiniz. Ek olarak, Python ünite testi için mükemmel bir desteğe sahip olduğundan, Python ünite testini öğretmek için de kullanılabilir. Python'da ayrıca (SQL öğrenmek zorunda olanların yerini alabilen veya artırabilen) geniş bir veritabanı API'si ve Make-like işlevselliği sunan bir çift oluşturma programı bulunmaktadır. Kişisel olarak SCons for Make'i tercih ediyorum çünkü Python'u belgelendirmek ve test etmek için kabuk betiklerinden daha kolay buluyorum.

Nihayetinde Python için bariz bir şekilde sarsılmamın arkasındaki motive edici ilke verimliliktir. Çalışmanızın çoğunu tek bir dilde veya tek bir araçta, özellikle de bu araç anlamlı bir komut dosyası dili olduğunda, iş akışınızı kolaylaştırmak çok daha kolaydır. Tabii ki, C'deki her şeyi yapabilirdim, ancak programım 5 kat daha uzun olacak ve olasılıklar hıza ihtiyacım yok. Bunun yerine, bir metin dosyasından veri almak, onu çizmek, optimizasyon yordamlarını çağırmak, rasgele değişkenler oluşturmak, sonuçlarımı çizmek, sonuçları bir metin dosyasına yazmak ve kodumu test etmek için Python'u kullanabilirim. Python çok yavaşsa, Python'u C, C ++ veya Fortran kodunun etrafına yoğun olarak hesaplanması yoğun işlerle ilgilenir. Python, benim için, bilimsel bilgi işlem ihtiyaçlarımın çoğu için tek bir yerden.

Python henüz tam olarak MATLAB değil; SciPy ve NumPy'nin işlevsellik açısından hala bir yolu var, fakat genel fayda açısından Python'u MATLAB'dan daha geniş çeşitlilikte işler için kullanıyorum.


7
Yardım edemem ama buna tamamen katılmıyorum. Python, biraz hareketli bir hedef olduğundan sistem koruyucuları için bir baş ağrısıdır. Hesaplamalı bilim adamları, malzemelerin en basitçe yapıştırılması ve işlerin muhtemelen kullanması muhtemel olan sistemlerdeki çalışması için temel bir bash veya csh anlayışına sahip olmalıdır. Python harika, ve sizleri hesaplamalı kişilerin öğrenmesini savunmanızı destekliyorum, ancak bazı ilkel kabukların pahasına değil.
Bill Barth

7
@ BillBarth: Her hesaplamalı bilim adamının, çok, çok basit senaryolar için temel bash veya csh öğrenmek zorunda olduğunu düşünüyorum. Bu temel görevlerin ötesinde kabuk komut dosyası yazmak için Python'u kullanmayı savunmamın nedeni, temelde bir programı çalıştıran binlerce satırlık bir bash betiğini miras almamdı . Dosyaları semafor olarak ileri geri iletir, defalarca PBS'yi çağırır ve bunu test etmenin bir yolu yoktur. Shell komut dosyası yazmak küçük işler için harikadır, ancak büyük işler için değildir ve bu koli bandı ve balonlu kabus kabusu bana tezimin birkaç yılına mal oldu, bu yüzden ısrarcıyım.
Geoff Oxberry

2
Dediğim gibi, "python öğrenmek" listesinin için uygun olabileceği konusunda hemfikir değilim. Sadece "kabuk komut dosyası" pahasına yapmak istemiyorum. Her ikisi de önemlidir ve hiç kimse ipython'u kabuğunuz olarak çalıştırmanıza izin vermeyecektir, bu yüzden kabuk komut dosyası yazmak çok önemlidir.
Bill Barth

3
@BillBarth: Hiçbir yerde Python'un kabuğunu değiştirmesini öneriyorum. Ben sadece Python'un betik için bash'ın yerini almasını öneriyorum; Temel bash bilgisini öğrenirseniz, kontrol yapıları olmadan senaryo yazabilecek kadar bilginiz olduğunu ve bu nedenle "bash komut yazıcılığına" ihtiyaç duymayacağınıza inanıyorum. Bir kontrol yapısı eklemek istediğinizde, farklı bir dile geçmelisiniz, çünkü bash içinde programlama, yazılım ve kütüphane sorumluları için bir baş ağrısıdır.
Geoff Oxberry

1
+1. Python bir süredir ana programlama dilimdi. Mükemmel değil, ama biri mükemmel programlama dilini icat edene kadar yapacağız.
Faheem Mitha

14

Kayan nokta matematik Çoğu bilim gerçek dünya değerleri ile ilgilenir ve gerçek dünya değerleri genellikle bilgisayar dünyasında kayan nokta olarak gösterilir. Sonuçların anlamlılığına zarar verebilecek, yüzdürücülere sahip birçok potansiyel yakalama var.

Bu konu için favori referans David Goldberg tarafından "Her Bilgisayar Mühendisi Noktası Aritmetik (1991) Yüzer Hakkında Bilmeniz Gerekenler" gibi görünüyor http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768


1
Bu döküman çevrimiçi forumlarda defalarca dile getirildi. Ancak bu çok uzun ve yoğun bir makale ve kaç kişinin gerçekten bundan yararlı bir şeyler alabildiğinden emin değilim.
johngreen

12

Hesaplamalı bir bilim insanı, bilgisayar bilimi, matematik ve fen / mühendislik alanındaki bir uygulama alanı hakkında yeterli bilgiye sahip olmalıdır. Aşağıdaki alanların her birine yeteneklerimi eklerdim:

Matematik:

  1. Sayısal analiz
  2. Lineer Cebir
  3. Adi, Kısmi ve / veya Stokastik Diferansiyel Denklemler
  4. Optimizasyon
  5. İstatistikler ve / veya Olasılık
  6. Ters Teori

Bilgisayar Bilimi:

  1. Algoritmalar
  2. Veri Yapıları
  3. Paralel Programlama (MPI, OpenMP, CUDA, vb.)
  4. Bilimsel Görselleştirme
  5. Bilgisayar Mimarisi
  6. Linux Ortamı Kullanma

Bilim / Mühendislik - uzmanlaşmak istediğiniz uygulamaya bağlıdır. Özel durumumda (mühendislik), süreklilik mekaniği, ısı transferi, akışkanlar dinamiği, sonlu elemanlar metodu, vb. Gibi şeyler eklerim. Çok sayıda bilim dalına sahipseniz, çok yönlü bir hesaplama bilimcisi olursunuz.


"Ters Teori" hakkında ayrıntılı bilgi verebilir misiniz?
Faheem Mitha

1
@FaheemMitha: Geleneksel olarak, önce bir modelin parametrelerini belirleriz (örneğin kısmi bir diferansiyel denklem), sonra sistemin davranışını gözlemleriz. Bir "ters problem" tersini yapıyor. Sistem çıktısının gözlemleriyle başlıyoruz ve bu gözlemleri üreten modelin parametrelerini belirlemeye çalışıyoruz. Ters teori, bu görevi başarma yöntemlerini açıklar.
Paul

Açıklama için teşekkürler. Bu konuyla ilgili iyi bir bağlantınız / referansınız var mı?
Faheem Mitha

2
en.wikipedia.org/wiki/Inverse_problem başlamak için iyi bir yer. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf de güzel bir genel bakışa sahip. Ama daha derinlemesine bir anlayış için, amazon.com/Parameter-Estimation- Inverse
Paul

4

Büyük soru büyüleyici cevaplar izledi! Sadece küçük bir ilaveye izin vermek istiyorum. Yaşadığım kadarıyla (kendim ve açıkça), Hepsi Bir Arada araç genellikle bilmek gerçekten iyidir. Böyle bir araç MATLAB, Octave veya hatta Python (kütüphaneli) olabilir. “Konfor bölgesi” nizde ne zaman bir problem yaşarsanız, iyi bir fikir (bildiğim kadarıyla düşündüğüm kadarıyla) elinizi All-in-One aletinde denemek olacaktır. Daha sonra kendi kodlarınızı yazmayı deneyebilirsiniz. Bu tür paketlerin güzelliği, programlamanın yaptığınız şeyin anlaşılmasını engellememesidir.

Computer Graphics örneğini ele alalım. Bir rakamın çevrilmesi, döndürülmesi veya ölçeklendirilmesi için bir kod yazmak, MATLAB (üstler) 'te 10 satır koddur, ancak C'deki sayfalar için çalıştırılabilir. C'nin iyi olmadığını söylemiyorum. Tek söylediğim, C'ye kod yazmak için iyi bir nedeniniz yoksa, MATLAB'ın daha basit, daha iyi ve daha sezgisel bir yol olacağı.

Bazıları, C-benzeri programlamanın, bina sezgisinin harika bir yolu olduğunu kabul etmeyebilir. Belki de öyle. Ancak bir sorunla birkaç defadan fazla uğraşmanız gerekmediğinde, kendi kodlarınızı C gibi bir dilde yazmanız ve yazmanız zor değildir.


-1

Sağduyu ve bağırsak hissi ... İkincisi sadece zamanla ve büyük kötü dünyada bir kaç utanç verici deneyimin "hayatta kalmasından" sonra gelir.


3
"Bağırsak hissi" nin gerçekten bir yetenek olup olmadığını bilmiyorum. Daha önceki deneyime karşı sadece içgüdüsel bir tepki.
naught101
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.