Priorytety w uczeniu się metod obliczeniowych, kiedy powinienem napisać własny kod, a nie używać bibliotek jako początkujących doktorantów?

10

Zaczynam studia podyplomowe z inżynierii i będę pracował nad projektami z zakresu obliczeń naukowych. Zauważyłem, że dyskutowano o zaletach i wadach implementacji własnych algorytmów tutaj . Czy analiza kosztów i korzyści związanych z wdrażaniem własnych algorytmów w porównaniu do korzystania z bibliotek różni się w przypadku początkujących studentów?

Godric Seer
źródło
2
Miałem długą odpowiedź, ale po dyskusji z innym modem zdecydowałem się go usunąć i poprosić o wyjaśnienie twojego pytania. Jaki jest główny punkt twojego pytania? Czy to „gdzie mam podkreślać moją naukę?”, „Jak zaleciłbyś nadanie priorytetu uczeniu się a postępom w modelowaniu?”, „Czy wybranie bibliotek zamiast samorealizujących się kodów zależy od rozwiązanych problemów?” Czy „Jakie są korzyści / wady kodowania własnych algorytmów na znacznie wcześniejszym etapie mojej kariery? ”. Moja odpowiedź była zbyt szeroka i lepiej dać ci skoncentrowaną odpowiedź na bardziej szczegółowe pytanie.
Geoff Oxberry
Dodałem pogrubioną sekcję, aby wyjaśnić dokładnie to, o co prosiłem, ale resztę pozostawiłem nietkniętą. Jeśli uważasz, że którąkolwiek z pozostałych części należy usunąć, nie krępuj się.
Godric Seer,
Dziękuję Ci. Wprowadzę kilka zmian, aby skoncentrować się na pytaniu, a następnie opublikuję odpowiedź.
Geoff Oxberry

Odpowiedzi:

10

Moim zdaniem, jako początkujący student nie zmienia odpowiedź David Ketcheson tutaj do kwestii związanej już w swoim poście.

Koduj minimalne wersje algorytmów, których chcesz się nauczyć. Następnie odłóż je na bok. Kodowanie własnych algorytmów jest najbardziej przydatne do nauki, ale do kodu badawczego (lub produkcyjnego), chyba że twoim celem badawczym jest napisanie oprogramowania, które ulepszy najnowocześniejsze biblioteki (jeśli w ogóle istnieją), „ lepiej skorzystać z bibliotek. Biblioteki będą prawdopodobnie lepiej udokumentowane, skalowalne i bardziej niezawodne niż to, co sam kodujesz, chyba że jesteś (lub staniesz się) naprawdę dobry w kodowaniu. Ponadto biblioteki prawdopodobnie zostaną dla Ciebie przetestowane i debugowane (choć oczywiście zależy to od tego, kto napisał bibliotekę ...). Będziesz odpowiedzialny za obsługę, debugowanie i testowanie kodu napisanego na potrzeby pracy magisterskiej, a aby zaoszczędzić czas, pomaga to zminimalizować ilość kodu, który musisz napisać.

Jedyne inne scenariusze, które mogę wymyślić (tzn. Mogą istnieć inne) to:

  • Nie ma żadnych bibliotek zapewniających potrzebne funkcje. Zastanów się, czy nie wnieść wkładu w istniejące biblioteki typu open source lub napisać własną bibliotekę typu open source, aby inni mogli skorzystać.
  • Potrzebujesz dodatkowej wydajności i możesz wykorzystać specjalną strukturę problemu, aby ją uzyskać. Następnie udokumentuj i zmodyfikuj istniejącą bibliotekę lub sam napisz implementację o wyższej wydajności.
  • Przełożony nalega, aby stworzyć własne oprogramowanie. Cóż, jesteś tam sam, ale proponuję poruszyć powyższe punkty, aby przekonać ich, że lepiej byłoby korzystać z bibliotek (jeśli w ogóle jest to możliwe w twojej sytuacji).
Geoff Oxberry
źródło
10

Chciałbym rozszerzyć rozważną odpowiedź Geoffa . W szczególności chcę dać ci nieco więcej spojrzenia na wartość twoich wysiłków programistycznych w porównaniu do wysiłków badawczych we wczesnej karierze akademickiej.

Przekonasz się, że umiejętność pisania oprogramowania wspomagającego twoje badania naukowe uczyni cię cennym członkiem niemal każdego zespołu badawczego. Jednak ten czas niekoniecznie zostanie uznany za „cenny” przez twoich rówieśników akademickich lub tych, którzy zatrudniają na stanowiska akademickie.

Z ankiety badawczej z 2011 r. Przeprowadzonej w Princeton, „A Survey of the Computational Science” :

Naukowcy spędzają dużo czasu na programowaniu. Średnio naukowcy szacują, że 35% czasu badań poświęcają na programowanie / tworzenie oprogramowania. Chociaż początkowo trochę czasu poświęca się na pisanie kodu, znaczna część czasu jest poświęcana na wiele żmudnych czynności. Na przykład badacze z zakresu polityki i socjologii, którzy używali R / Stata, musieli przeprowadzić znaczne programowanie, aby zmodernizować dane spisu powszechnego w formatach zrozumiałych dla poszczególnych pakietów w R / Stata. Niektórzy badacze inżynierii chemicznej musieli opracować kod źródłowy, który nie był dokumentem, który przeprowadził symulację płomienia, długo po ukończeniu studiów przez oryginalnych autorów, aby dostosować kod do nowszych paliw ... Mimo to zdecydowana większość badaczy uznała, że ​​„ spędzać więcej czasu na programowaniu, niż powinni ”

Nie oznacza to, że nie jest dobrym pomysłem wdrożenie lub przeprojektowanie podstawowej biblioteki lub aplikacji, ale jeśli zamierzasz zaangażować się w poważne opracowanie oprogramowania (ponad 25% czasu pracujesz z kodem), zachowaj te trzy myśli w myślach.

  • Złożoność i ryzyko rosną wykładniczo wraz z wielkością projektu i liczbą programistów. Dopóki nie napiszesz ani nie pracujesz z większymi programami lub zespołami programistów, które wykraczają poza twoje laboratorium, trudno będzie ci dobrze docenić ten i właściwie przewidzieć wysiłek.

  • Musisz być dobry. Pisanie przydatnego oprogramowania wymaga pewnej dojrzałości, zarówno jako programista, jak i naukowiec aplikacji. Musisz wiedzieć, jakie są ważne funkcje, gdzie są ryzyka numeryczne, i umieć prognozować wysiłki programistyczne dla danego zestawu funkcji i niezawodności. Oczywiście jedynym sposobem na osiągnięcie dobrego jest poświęcenie czasu na projekty, na których nie jesteś wiodącym lub które mogą bezpiecznie zawieść lub zostać opóźnione, co prowadzi mnie do mojej ostatniej kwestii.

  • Chociaż wiele laboratoriów badawczych i stanowisk przemysłowych wysoko ceni doświadczenie w programowaniu, programowanie naukowe może stanowić potencjalną szkodę dla kariery naukowej, nawet jeśli oprogramowanie przynosi korzyści naukowe bardziej niż dokumenty. Cały ten czas poświęcasz na naukę dobrego programowania, programowania, dokumentowania swojego kodu i uczynienia go solidnym, co przekłada się na prace, które nie są pisane. Doradca nie zawsze będzie miał na względzie dobro swojego ucznia, ponieważ jest to jeden z tych przypadków, w których uczeń może zapewnić pracę, która jest korzystna dla grupy doradcy bez korzyści dla liczby cytowań ucznia. Znajdź jednego lub więcej zaufanych mentorów w dziedzinie, którą jesteś zainteresowany i upewnij się, że dobrze rozumiesz, jakie wkłady są uważane za wartościowe. academia.stackexchange.com jest doskonałym miejscem do zadawania dalszych pytań w tej sprawie.


Jako przypis: liczba projektów wysiłkowych jednoosobowych, które znacznie przyspieszają dowolne pole obliczeniowe, stale maleje, niezależnie od tego, czy jest to obszar zastosowania, czy coś bardziej technicznego, takiego jak gęsta algebra liniowa. Rosnąca liczba pakietów oprogramowania tworzących „chleb powszedni” badań obliczeniowych ma 10 lat lub więcej. Kod naukowy, który nie osiągnął tego poziomu dojrzałości, zwykle zawiera więcej błędów, mniej funkcji i rzadką dokumentację. Staraj się unikać pracy z niedojrzałym kodem, który nie jest aktywnie obsługiwany, niezależnie od tego, ile ma lat.

Aron Ahmadia
źródło
Martwiłem się już o liczbę moich papierów. Ponieważ będę studentem obliczeń dla dużej grupy studentów eksperymentalnych, prawdopodobnie będę miał wiele 2. i 3. autorstwa. Możliwe też, że na początku będę łączyć różne programy (kod 0D z mojego laboratorium, kod 2D z innej uczelni, oprogramowanie Meshing z innego laboratorium na mojej uczelni). Zdecydowanie dużo do przemyślenia.
Godric Seer,
6

Myślę, że analiza kosztów i korzyści zależy od pożądanej wiedzy naukowej w zakresie informatyki, którą chcesz osiągnąć podczas studiów.

Dla większości naukowców, którzy pracują z komputerami biegłymi w obliczeniach naukowych, to wymaga: wysokiego poziomu (abstrakcyjnego) zrozumienia głównych stosowanych algorytmów i umiejętności programowania, które pozwalają efektywnie korzystać z bibliotek oprogramowania (budowanie oprogramowania, łączenie, używanie listy mailingowe).

Natomiast jeśli planujesz zostać ekspertem w dziedzinie naukowej informatyki, będziesz potrzebować głębokiego zrozumienia metod numerycznych, arytmetyki zmiennoprzecinkowej i technologii komputerowej. Teorii tych tematów możesz nauczyć się z książek, jednak doświadczenie i praktyka są potrzebne do budowania i utrzymywania zaawansowanych umiejętności. Dlatego dobrym pomysłem może być zaprogramowanie wszystkiego, czego używasz podczas nauki (np. Jeśli chcesz gotować jak szef kuchni: uczysz się, jedząc to, co gotujesz, i często gotując!)

Jaki jest odpowiedni poziom biegłości, zależy od twojej kariery. Zobacz, jakiego poziomu umiejętności używają ludzie pracujący w Twojej dziedzinie.

fcruz
źródło