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.
Odpowiedzi:
„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.
źródło
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:
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.
źródło
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.
źródło
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
źródło
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:
Informatyka:
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.
źródło
Ś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.
źródło
Zdrowy rozsądek i przeczucie ... To ostatnie przychodzi dopiero z czasem i po „przeżyciu” kilku haniebnych doświadczeń w wielkim złym świecie.
źródło