Jakie podstawowe umiejętności powinien posiadać każdy naukowiec? [Zamknięte]

52

Każdy naukowiec musi się trochę dowiedzieć o statystykach: co oznacza korelacja, jaki jest przedział ufności i tak dalej. Podobnie każdy naukowiec powinien wiedzieć trochę o informatyce: pytanie brzmi: co? Czego można oczekiwać od każdego pracującego naukowca, który wie o tworzeniu i korzystaniu z oprogramowania? Nasza lista podstawowych umiejętności --- rzeczy, które ludzie powinni wiedzieć, zanim zmierzą się z „chmurą” lub „peta” w nazwie --- to:

  • podstawowe programowanie (pętle, warunki, listy, funkcje i operacje wejścia / wyjścia pliku)
  • Skrypty powłoki / podstawowe powłoki
  • kontrola wersji
  • ile testować programy
  • podstawowy SQL

Jest wiele rzeczy, których nie ma na tej liście: programowanie macierzy (MATLAB, NumPy i tym podobne), arkusze kalkulacyjne, jeśli są dobrze używane, są tak potężne jak większość języków programowania), narzędzia do automatyzacji zadań, takie jak Make i tak dalej.

Więc: co jest na twojej liście? Jak myślisz, co jest sprawiedliwe, aby oczekiwać, że każdy naukowiec będzie wiedział w tych dniach? A co byś wyjął z powyższej listy, aby zrobić na to miejsce? Nikt nie ma czasu na naukę wszystkiego.

Greg Wilson
źródło
1
Świetne pytanie! Ale nie mam jasności co do jednej rzeczy: co rozumiesz przez naukowca obliczeniowego? Każdy naukowiec, który korzysta z obliczeń? Czy DUŻO mniejsza grupa ludzi, którzy uważają swój tytuł zawodowy za „naukowca obliczeniowego”?
David Ketcheson
9
Spraw, aby pytanie z listy nie było dobre w formacie Stack Exchange. Czy naprawdę musimy przejść przez to na każdej stronie?
dmckee
4
Wiki @Dan Community Wiki nie usprawiedliwia dopuszczania pytań, które nie należą do witryny. Chciałbym również zachęcić tych, którzy odpowiedzą, by wzięli przykład z Jeda i przynajmniej spróbowali wyjaśnić, dlaczego potrzebujesz pewnych umiejętności, a innych nie potrzebujesz
Ivo Flipse
5
@IvoFlipse: To pytanie należy do witryny w jakiejś formie. Może nie tak jak obecnie; być może trzeba go przerobić na mniejsze pytania i przeredagować, ale problem słabej inżynierii oprogramowania w nauce obliczeniowej jest niezwykle ważny, zwłaszcza że nauka obliczeniowa jako dyscyplina jest wciąż w fazie formacyjnej. Ten artykuł w Nature wskazuje dlaczego. Greg wykonuje wspaniałą usługę dla społeczności nauk obliczeniowych za pośrednictwem swojej strony internetowej.
Geoff Oxberry
5
Nie zgadzam się z zamknięciem tego pytania. Proszę zobaczyć (i głosować na) meta.scicomp.stackexchange.com/questions/179/…
David Ketcheson

Odpowiedzi:

46

„Computational Scientist” jest dość szeroki, ponieważ obejmuje osoby, które wykonują analizy numeryczne przy użyciu papierowych / LaTeX i wdrożeń typu proof-of-concept, osoby piszące biblioteki ogólnego przeznaczenia oraz osoby opracowujące aplikacje, które rozwiązują określone klasy problemów, oraz użytkownicy końcowi, którzy je wykorzystują Aplikacje. Umiejętności potrzebne tym grupom są różne, ale znajomość „pełnego stosu” ma dużą zaletę. Opiszę, co uważam za kluczowe części tego stosu, ludzie, którzy pracują na tym poziomie, powinni oczywiście mieć głębszą wiedzę.

Wiedza w dziedzinie (np. Podstawy fizyki i inżynierii)

Każdy powinien znać podstawy klasy problemów, które rozwiązuje. Jeśli pracujesz na PDE, oznaczałoby to pewną ogólną znajomość kilku klas PDE (np. Poissona, elastyczności oraz nieściśliwego i ściśliwego Naviera-Stokesa), w szczególności jakie właściwości są ważne, aby uchwycić „dokładnie” i co może zależeć od dyskretyzacji błąd (informuje o wyborze metody dotyczącej lokalnej ochrony i integratorów symplektycznych). Powinieneś wiedzieć o niektórych funkcjach i typach analiz interesujących aplikacje (optymalizacja siły nośnej i przeciągania, przewidywanie awarii, inwersja parametrów itp.).

Matematyka

Każdy powinien mieć pewną ogólną znajomość klas metod odpowiednich dla ich problematycznej dziedziny. Obejmuje to podstawowe cechy rzadkiej i gęstej algebry liniowej, dostępność „szybkich metod”, właściwości technik dyskretyzacji przestrzennej i czasowej oraz sposób oceny, jakie właściwości problemu fizycznego są potrzebne, aby technika dyskretyzacji była odpowiednia. Jeśli jesteś głównie użytkownikiem końcowym, ta wiedza może być bardzo wysoka.

Inżynieria oprogramowania i biblioteki

Znajomość technik abstrakcyjnych i projektowania bibliotek jest przydatna dla prawie wszystkich osób w dziedzinie obliczeń. Jeśli pracujesz nad metodami weryfikacji koncepcji, poprawi to organizację twojego kodu (ułatwiając komuś innemu „przetłumaczenie” go na solidną implementację). Jeśli pracujesz nad aplikacjami naukowymi, sprawi to, że twoje oprogramowanie będzie bardziej rozszerzalne i ułatwi interfejs z bibliotekami. Zachowaj ostrożność podczas opracowywania kodu, aby błędy były wykrywane tak wcześnie, jak to możliwe, a komunikaty o błędach były jak najbardziej pouczające.

Przybory

Praca z oprogramowaniem jest ważną częścią nauki obliczeniowej. Biegłość w wybranym języku, obsługa edytora (np. Tagi, analiza statyczna) oraz narzędzia do debugowania (debugger, valgrind) znacznie poprawiają efektywność programowania. Jeśli pracujesz w środowisku wsadowym, powinieneś wiedzieć, jak przesyłać zadania i uzyskiwać interaktywne sesje. Jeśli pracujesz ze skompilowanym kodem, praktyczna znajomość kompilatorów, linkerów i narzędzi do budowania, takich jak Make, zaoszczędzi dużo czasu. Kontrola wersji jest niezbędna dla każdego, nawet jeśli pracujesz sam. Naucz się Git lub Mercurial i używaj go do każdego projektu. Jeśli tworzysz biblioteki, powinieneś znać standardy językowe w miarę rozsądnie, aby prawie zawsze pisać przenośny kod za pierwszym razem, w przeciwnym razie zostaniesz pochowany w prośbach o wsparcie użytkownika, gdy Twój kod nie zbuduje się w ich funky środowisku.

Lateks

LaTeX jest de facto standardem publikacji naukowych i współpracy. Biegła znajomość LaTeX jest ważna, aby móc komunikować swoje wyniki, współpracować nad propozycjami itp. Skrypty tworzenia liczb są również ważne dla odtwarzalności i pozyskiwania danych.

Jed Brown
źródło
7
Zgadzam się z Jedem. LaTeX jest absolutnie konieczny! :)
Paweł
1
Zmieniłbym „Fizykę i inżynierię” na wiedzę merytoryczną. W końcu nie wszyscy jesteśmy fizykami lub inżynierami. Duch tej części odpowiedzi jest na właściwym miejscu, ale istnieje dość rażące założenie.
Fomite
Dzięki @EpiGrad zmieniłem go na „wiedzę o domenie”, używając tych przykładów.
Jed Brown
Dobra lista Tam też powinna być podstawowa znajomość problemów z wydajnością. Spotkałem zbyt wielu ludzi, którzy nie rozumieją prostej koncepcji profilowania kodu. Uwaga: wydajność należy rozumieć nie tylko ze względu na problemy z prędkością, ale także zużycie pamięci.
Faheem Mitha
Literówki: „probelms” i „burried”. SE nie pozwoliłoby mi ich naprawić - zbyt mała edycja.
Faheem Mitha
26

Moje własne doświadczenie w informatyce jest właściwe, więc moje opinie mogą być nieco stronnicze. Powiedziawszy to, dodałbym do listy „podstawowe algorytmy i struktury danych”. To, co mam na myśli, to zasadniczo liniowe wyszukiwanie i sortowanie oraz struktury danych, takie jak zrównoważone drzewa, hałdy i tabele skrótów.

Dlaczego? Cóż, w przypadku większości algorytmów obliczeniowych spędzasz wyjątkowo dużo czasu i wysiłku, przesuwając dane i nie obliczając niczego. Czy kiedykolwiek zaimplementowałeś kod elementu skończonego? To około 90% organizacji danych. Różnica między zrobieniem tego a dobrym wykonaniem może być rzędu wielkości pod względem wydajności obliczeniowej.

Jednym drobnym punktem związanym z informatyką, który chciałbym również dodać, jest krótkie wprowadzenie na temat tego, jak procesor faktycznie działa, w czym jest dobry, a co nie. Na przykład:

  • Dodawanie i rozmnażanie są szybkie, funkcje dzielenia lub transcendentalne nie. Widziałem, jak dorośli mężczyźni zastępują pierwiastek kwadratowy czymś, co wymagało trzech podziałów, i myślę, że zrobili coś wspaniałego (podział i pierwiastek kwadratowy są równie drogie).
  • Pamięć podręczna poziomu 3 rośnie z każdym rokiem, tak, ale pamięć podręczna poziomu 0, czyli naprawdę szybka, wciąż ma tylko kilka kilobajtów.
  • Kompilatory nie są magiczne. Mogą rozwijać małe pętle lub wektoryzować wyjątkowo proste operacje, ale nie zamieniają tego bąbelkowego w szybki.
  • Wywoływanie metod na obiektach polimorficznych o wielokrotnym dziedziczeniu w wewnętrznej pętli może być koncepcyjnie słodkie, ale sprawi, że Twój procesor będzie chciał się zabić.

To bardzo nudne, nudne rzeczy, ale wyjaśnienie zajmuje tylko kilka minut, a pamiętając o tym, możesz napisać dobry kod od samego początku lub zaprojektować algorytmy, które nie opierają się na nieistniejących funkcjach sprzętowych.

Jeśli chodzi o to, co należy usunąć z listy, myślę, że SQL to trochę dla naukowców zajmujących się obliczeniami. Testowanie oprogramowania jest również ważne, ale samo w sobie jest nauką. Testowanie jednostkowe i poprawne abstrakcyjne typy danych są czymś, czego należy nauczyć się programowania podstawowego i nie wymaga dwuletniego programu magisterskiego.

Pedro
źródło
2
Wcale nie nudne. Wybrałbym taki kurs, gdyby był w ofercie. :-)
Faheem Mitha
18

Mogę dodać do tego później, ale na początek wyjmę „skryptowanie powłoki” i zastąpię go konkretnie „skryptowaniem w języku Python”. Python jest znacznie bardziej przenośny niż skrypt powłoki i bardziej czytelny niż porównywalne języki powłoki i skryptów. Jego duża standardowa biblioteka i popularność w naukach ścisłych (z możliwym wyjątkiem biologii, która wykorzystuje również Perla) sprawia, że ​​jest to świetna lingua franca obliczeniowa , nie wspominając już o dobrym pierwszym języku do nauki programowania. Jest to obecnie pierwszy język wykładany na głównych kierunkach EECS na MIT i jest popularny na rynku pracy, szczególnie w informatyce naukowej. Jego dokumentacja online jest obszerna, a także wiele tekstów programistycznych opartych na Pythonie dostępnych online.

Za pomocą Pythona możesz uczyć podstawowych konstrukcji programistycznych, a także skryptów. Ponadto Python ma doskonałą obsługę testów jednostkowych, więc można go również używać do uczenia testów jednostkowych. Python ma również rozbudowane API bazy danych (które może zastąpić lub rozszerzyć konieczność uczenia się SQL) oraz kilka narzędzi do budowania, które oferują funkcjonalność podobną do Make. Osobiście wolę SCony niż Make, ponieważ uważam, że Python jest łatwiejszy do dokumentowania i testowania niż skrypty powłoki.

Ostatecznie zasadą motywującą moje rażące szylingi dla Pythona jest wydajność. Znacznie łatwiej jest usprawnić przepływ pracy, jeśli możesz wykonać większość pracy w jednym języku lub jednym narzędziu, szczególnie gdy to narzędzie jest ekspresyjnym językiem skryptowym. Jasne, mógłbym zrobić wszystko w C, ale mój program byłby 5 razy dłuższy, a są szanse, że nie potrzebuję prędkości. Zamiast tego mogę używać Pythona do importowania danych z pliku tekstowego, kreślenia go, rutynowych optymalizacji, generowania losowych zmiennych, kreślenia moich wyników, zapisywania wyników w pliku tekstowym i testowania jednostki. Jeśli Python jest zbyt wolny, możliwe jest owinięcie go w kodzie C, C ++ lub Fortran, który zajmuje się intensywnymi obliczeniowo zadaniami. Python jest dla mnie jednym okiem dla większości moich potrzeb naukowych.

Python nie jest jeszcze dokładnie MATLAB; SciPy i NumPy wciąż mają wiele do zrobienia pod względem funkcjonalności, ale pod względem ogólnej użyteczności używam Pythona do szerszej gamy zadań niż MATLAB.

Geoff Oxberry
źródło
7
Nie mogę pomóc, ale całkowicie się z tym nie zgadzam. Python jest problemem dla opiekunów systemów, ponieważ jest trochę ruchomym celem. Naukowcy zajmujący się obliczeniami powinni mieć podstawową wiedzę na temat bash lub csh w celu jak najprostszego sklejenia rzeczy i wykonywania zadań w systemach, z których prawdopodobnie będą korzystać. Python jest świetny i popieram was, abyście poparli ludzi obliczeniowych, abyście się go uczyli, ale nie kosztem jakiejś podstawowej powłoki.
Bill Barth
7
@BillBarth: Myślę, że każdy naukowiec od obliczeń musi nauczyć się podstawowego bash lub csh dla bardzo, bardzo podstawowych skryptów. Powodem, dla którego zalecam używanie Pythona do wykonywania skryptów powłoki poza tymi podstawowymi zadaniami, jest to, że odziedziczyłem tysiąc-liniowy skrypt bash, który zasadniczo uruchamia program . Przesyła pliki tam iz powrotem jako semafory, wielokrotnie wywołuje PBS i nie ma możliwości, aby to sprawdzić. Skrypty powłoki świetnie nadają się do małych zadań, ale nie do dużych zadań, a ten koszmar z taśmą klejącą i gumą do żucia kosztował mnie kilka lat mojej pracy dyplomowej, dlatego nalegam.
Geoff Oxberry
2
Tak jak powiedziałem, nie zgadzam się, że „uczenie się pytona” może być odpowiednie dla listy. Po prostu nie chcę tego robić kosztem „skryptowania powłoki”. Oba są ważne i nikt nie pozwoli ci uruchomić ipython jako powłoki, więc skrypty powłoki są niezwykle ważne.
Bill Barth,
3
@BillBarth: Nigdzie nie sugeruję, aby Python zastąpił powłokę. Sugeruję jedynie, aby Python zastąpił bash dla skryptów; Wierzę, że jeśli nauczysz się podstawowej bash, wiesz wystarczająco dużo, aby pisać skrypty bez struktur kontrolnych, więc nie ma potrzeby zagłębiania się w „bash scripting”. Jak tylko chcesz dołączyć strukturę kontrolną, powinieneś przełączyć się na inny język, ponieważ programowanie w bash stanowi problem dla opiekunów oprogramowania i bibliotek.
Geoff Oxberry
1
+1. Python od pewnego czasu jest moim głównym językiem programowania. Nie jest idealny, ale będzie działał, dopóki ktoś nie wymyśli idealnego języka programowania.
Faheem Mitha
14

Matematyka zmiennoprzecinkowa. Większość nauki dotyczy wartości ze świata rzeczywistego, a wartości ze świata rzeczywistego są często przedstawiane jako zmiennoprzecinkowe w świecie komputerowym. Istnieje wiele potencjalnych problemów z pływakami, które mogą siać spustoszenie w sensie wyników.

Ulubionym odniesieniem do tego tematu wydaje się być „Co każdy informatyk powinien wiedzieć o arytmetyki zmiennoprzecinkowej (1991)” Davida Goldberga http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768

Peter Recore
źródło
1
Ten dokument był wielokrotnie wymieniany na forach internetowych. Ale jest to bardzo długi i gęsty artykuł i nie jestem pewien, ile osób faktycznie mogło zabrać z tego coś pożytecznego.
johngreen
12

Informatyk musi posiadać wystarczającą znajomość informatyki, matematyki i dziedziny zastosowań w nauce / inżynierii. Umieściłbym umiejętności w każdym z następujących obszarów:

Matematyka:

  1. Analiza numeryczna
  2. Algebra liniowa
  3. Równania różniczkowe zwyczajne, częściowe i / lub stochastyczne
  4. Optymalizacja
  5. Statystyka i / lub prawdopodobieństwo
  6. Teoria odwrotna

Informatyka:

  1. Algorytmy
  2. Struktury danych
  3. Programowanie równoległe (MPI, OpenMP, CUDA itp.)
  4. Wizualizacja naukowa
  5. Architektura komputerowa
  6. Korzystanie ze środowiska Linux

Nauka / Inżynieria - zależy od aplikacji, w której chcesz się specjalizować. W moim konkretnym przypadku (inżynieria) dodałbym takie rzeczy, jak mechanika ciągłości, wymiana ciepła, dynamika płynów, metoda elementów skończonych itp. Powiedziałbym, że im więcej znajomości masz wiele dziedzin nauki, tym bardziej wszechstronny jesteś jako naukowiec obliczeniowy.

Paul
źródło
Czy potrafisz rozwinąć „Teorię odwrotną”?
Faheem Mitha
1
@FaheemMitha: Tradycyjnie najpierw ustawiamy parametry modelu (np. Równanie różniczkowe cząstkowe), a następnie obserwujemy zachowanie systemu. „Odwrotnym problemem” jest odwrotna sytuacja. Zaczynamy od obserwacji danych wyjściowych systemu i próbujemy określić parametry modelu, które generują te obserwacje. Teoria odwrotna opisuje metody wykonania tego zadania.
Paweł
Dziękuję za wyjaśnienie. Czy masz dobry link / odniesienie do tego tematu?
Faheem Mitha
2
en.wikipedia.org/wiki/Inverse_problem to dobre miejsce na rozpoczęcie. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf ma również ładny przegląd. Ale dla lepszego zrozumienia zaleciłbym książkę taką jak amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul
4

Świetne pytanie, a następnie fascynujące odpowiedzi! Chciałbym się przyłączyć tylko jednym małym dodatkiem. O ile doświadczyłem (siebie i zastępczo), narzędzie All-in-One zazwyczaj jest naprawdę bardzo dobre. Takim narzędziem może być MATLAB, Octave, a nawet Python (z bibliotekami). Ilekroć masz problem w swojej „strefie komfortu”, dobrym pomysłem (o ile wiem i myślę) byłoby wypróbowanie swoich sił w narzędziu All-in-One. Możesz spróbować napisać własne kody później. Piękno takich pakietów polega na tym, że programowanie nie zakłóca zrozumienia tego, co robisz.

Weź przykład grafiki komputerowej. Pisanie kodu do tłumaczenia, obrotu lub skalowania figury to 10 wierszy kodu w MATLAB (u góry), ale może działać na stronach w C. Nie mówię, że C nie jest dobre. Mówię tylko, że jeśli nie masz dobrego powodu, aby pisać kody w C, MATLAB byłby prostszym, lepszym i bardziej intuicyjnym wyjściem.

Niektórzy mogą się nie zgadzać i twierdzić, że programowanie typu C to świetny sposób budowania intuicji. Może to jest. Ale kiedy nie musisz zajmować się problemem więcej niż kilka razy, nie ma uzasadnienia, aby siedzieć i pisać własne kody w języku takim jak C.

Śledztwo
źródło
-1

Zdrowy rozsądek i przeczucie ... To ostatnie przychodzi dopiero z czasem i po „przeżyciu” kilku haniebnych doświadczeń w wielkim złym świecie.

GertVdE
źródło
3
Nie wiem, czy „przeczucie” jest naprawdę umiejętnością. To bardziej instynktowna reakcja na poprzednie doświadczenia.
naught101