Pytanie:
Modele najlepszych praktyk dla kodu „badawczego”?
Ben
2014-05-21 23:08:42 UTC
view on stackexchange narkive permalink

Od wielu lat jestem profesjonalnym programistą, jestem także badaczem akademickim - a moje badania obejmowały wiele prac związanych z rozwojem oprogramowania.

Czasami mam wrażenie, że moje doświadczenie w branży była przeszkodą w moich badaniach, ponieważ cele pisania oprogramowania w kontekście badawczym wydają się sprzeczne z celami w przemyśle.

W przemyśle kod powinien być (najlepiej): możliwy do utrzymania, wolny od błędów, refaktoryzowany , dobrze udokumentowane, rygorystycznie przetestowane - dobra jakość - najlepsze praktyki mówią, że te rzeczy są warte czasu (zgadzam się).

W środowisku akademickim celem jest napisanie jak największej liczby wysokiej jakości artykułów naukowych w możliwie najkrótszym czasie czas. W tym kontekście kod jest napisany w celu uruchomienia eksperymentu i może już nigdy nie zostać sprawdzony (jesteśmy oceniani na podstawie naszych prac, a nie naszego kodu). Wydaje się, że nie ma motywacji do pisania przetestowanego, możliwego do utrzymania, udokumentowanego kodu - po prostu muszę go uruchomić i jak najszybciej uzyskać wynik w mojej pracy lub czymkolwiek. W konsekwencji, napisany przeze mnie kod „akademicki” jest słabej jakości - z punktu widzenia inżynierii oprogramowania.

Problem polega na tym, że spędzam zbyt dużo czasu na tworzeniu (niepotrzebnie) dostarczania mojego kodu „badawczego” do przemysłu. jakości lub publikuję prace w oparciu o kod „złej jakości” i czuję się jak oszust.

Postęp w mojej karierze zależy od tego, czy piszę „zły” kod !?

„rzemiosło” tworzenia oprogramowania to ogromny temat - ale gdzie jest najlepsza praktyka w badaniach akademickich? Nikt nie pisze testów jednostkowych dla kodu papierowego konferencji!

Czy ktoś znajduje ich w podobnej sytuacji? Czy ktoś zna formalne metodologie dla kodu „badawczego”?

Powiązane: [Dlaczego wielu utalentowanych naukowców pisze okropne oprogramowanie?] (Http://academia.stackexchange.com/questions/17781/why-do-many-talented-scientists-write-horrible-software)
@Ben Odpowiadasz na swoje pytanie (jeśli chodzi o jakość kodu i zachęty), prawda?
Jest też powiązane pytanie dotyczące SO: [Jak napisać dobry „kod badawczy”?] (Http://stackoverflow.com/questions/2685227/how-can-i-write-good-research-code)
I (także w SO): [Dobre strategie tworzenia kodu jednorazowego użytku?] (Http://stackoverflow.com/questions/1373980/good-strategies-for-developing-throwaway-code)
Myślę, że moją prawdziwą frustracją jest to, że bez sformalizowania nieco podejścia do „badań” trudno jest nauczyć się od innych dyscypliny pisania „kodu badawczego” i szerszego rzemiosła w tym kontekście. Nie ma blogów, książek, dobrych praktyk, sposobu na naukę i doskonalenie!
Dobry kod w środowisku akademickim to dokładnie to samo, co dobry kod w przemyśle. Zasadniczo są więc te same książki, blogi, najlepsze praktyki i miejsca do nauki, które powinny działać. W wielu miejscach naukowcy się go uczą, zaczynają używać języków ogólnego przeznaczenia i współpracują nad kodem w ramach VCS. Ale dopóki są opłacani i promowani za papiery (nawet z zamkniętym dostępem), a nie kod (nawet open source), kod będzie narzędziem, a nie priorytetem (niestety).
@PiotrMigdal Dobry kod robi to, co jest wymagane. Nie mniej, ale na pewno nie więcej. Jeśli budujesz jednorazowy demonstrator na konferencję przy użyciu TDD ze 100% pokryciem testów, ciągłą integracją, ścisłym śledzeniem problemów i zarządzaniem wydaniami, jesteś przesadny. Nie cały kod musi być możliwy do utrzymania, a wiele prototypów badawczych z pewnością nie musi.
Jest tu kwestia etyczna. Jeśli przedstawię wyniki w artykule i nie mam pełnego zakresu testów (kto to robi w tym kontekście?), Kod najprawdopodobniej zawiera błędy - co oznacza, że ​​wyniki, które przedstawiam, mogą być błędne i wiem, że są w błędzie - a ja nadal publikuję artykuł. Myślę, że to część niepisanej kultury. Nie mam na myśli twierdzenia, że ​​bije najnowocześniejsze rozwiązania, mówię o małych rozbieżnościach wydajności, bardziej ogólnie - pokrycie testu nie jest uważane za konieczne do eksperymentowania w "dobrej wierze" w CS? Przypuszczam, że zależy to od zgłoszonego wkładu.
@Ben Tak, to zależy od tego, co twierdzisz i jak wyglądałyby Twoje testy. Jeśli budujesz, powiedzmy, algorytm uczenia maszynowego i jesteś w stanie uzyskać lepsze wyniki klasyfikacji na standardowym zestawie danych niż najnowocześniejszy, wierzę ci, nawet jeśli nie masz ani jednego testu jednostkowego (ponieważ błąd jest bardzo mało prawdopodobny sklasyfikować * lepiej * niż oczekiwano).
@xLeitix Niewiele artykułów zawierających wyniki liczbowe jest powiązane z ich kodem. W przypadku symulacji numerycznych nie zawsze twierdzisz, że radzisz sobie lepiej niż oczekiwano, ale np. stwierdzić, że w takim a takim modelu parametr X jest wyższy niż w innym modelu.
@xLeitix - naprawdę dobra uwaga, całkowicie się zgadzam. Ostateczna wygrana lub ostateczne pokazanie, że technika X jest kiepska dla problemu Y - jest na miękkim podłożu.
@Ben: To zdecydowanie zależy od wniesionego wkładu. W wielu przypadkach badań CS to nie prototyp generuje wyniki w eksperymencie, ale użytkownik, który używa tego prototypu. Błędy prawdopodobnie będą obecne, ale nie mogę sobie wyobrazić żadnej sytuacji, w której mogłyby one nieuczciwie wpłynąć na wynik (zamiast być wyraźnie zarejestrowanym w eksperymencie, ponieważ „zadanie nie może zostać rozwiązane z powodu czynników zewnętrznych i nie powinno być liczone”), mniej w pozytywny sposób.
(a) Jeśli stosujesz paradygmat Agile, Twój kod „branżowy” może być znacznie bliższy kodowi „badawczemu”. Bezbłędność i dokumentacja mają, ahem, niezbyt * wysoki priorytet. (b) Open source kod badawczy (myślę konkretnie o pakietach R na CRAN) przynajmniej muszę przejść * niektóre * testy i mam większe zaufanie do "głównego" pakietów CRAN niż do niektórych (* kaszel, kaszel *) kod „branży”. Podsumowując: nie wszystko jest czarno-białe.
W wielu obszarach, jeśli kod jest twoimi rzeczywistymi badaniami (w przeciwieństwie do dowodu / obliczeń dla niektórych hipotez), to nie może być tak naprawdę źle - część * ewaluacyjna * kodu jest malutka i trywialna w porównaniu z resztą tego i można je odpowiednio przetestować; a jeśli reszta kodu zawiera błędy, cóż, nie uzyskasz dobrych wyników; a jeśli daje wymiernie dobre wyniki optymalizacji, to nawet jeśli spowodowały to jakieś dziwne i nieoczekiwane rzeczy w kodzie, to są to funkcje, a nie błędy.
_W środowisku akademickim celem jest napisanie jak największej liczby wysokiej jakości artykułów naukowych w jak najkrótszym czasie._ - [potrzebne źródło]
Istnieje * silna * motywacja do pisania przetestowanego kodu - nie chcesz zyskać reputacji osoby piszącej niepotrzebne dokumenty, ponieważ Twój błędny kod dał fałszywe wyniki!
@xLeitix: Istnieje ważny (i z mojego doświadczenia nie tak rzadki) typ „błędu”, który prowadzi do ładnie wyglądających, fałszywych wyników algorytmów uczenia maszynowego: wycieki danych między szkoleniami a przypadkami testowymi. Na przykład. z powodu pomyłki z indeksowaniem
Kolega odesłał mnie do artykułu na ten temat: http://www.plosbiology.org/article/info%3Adoi%2F10.1371%2Fjournal.pbio.1001745
@superbest +1 to pierwsza lektura wymagana dla wszystkich nowych członków mojej grupy. Od pierwszego szkicu w 2012 roku. Cytowanie: Wilson G, Aruliah DA, Brown CT, Chue Hong NP, Davis M, et al. (2014) Best Practices for Scientific Computing. PLoS Biol 12 (1): e1001745. doi: 10.1371 / journal.pbio.1001745
@David i superbest: powinieneś uczynić to odpowiedzią.
„Wydaje się, że nie ma motywacji do pisania przetestowanego, możliwego do utrzymania i udokumentowanego kodu - po prostu muszę go uruchomić i jak najszybciej uzyskać wynik w mojej pracy lub czymkolwiek innym”. Jest motywacja - chodzi o to, że badania mają być powtarzalne. Gdybyś zgłosił, że woda wyparowuje szybciej niż z powodu dziury w wiadrze, twoje odkrycia nie byłyby powtarzalne. To samo dotyczy kodu. Jeśli ktoś ponownie zaimplementuje opisane przez ciebie algorytmy i uzyska inne wyniki, to przynajmniej jeden z was złamał kod i wynik nie jest wystarczająco odtwarzalny.
Organizacja Software Carpentry może Cię zainteresować - jej celem jest szkolenie naukowców w zakresie dobrych praktyk w zakresie tworzenia oprogramowania (a także zachęcanie do kodowania jako obiektu cytowalnego w celu poprawy odtwarzalności w nauce) http://software-carpentry.org /
„W środowisku akademickim celem jest napisanie jak największej liczby wysokiej jakości artykułów naukowych w jak najkrótszym czasie”. nie jest to cytując cel, celem powinno być pisanie artykułów, które będą miały największy wpływ na dziedzinę badań, biorąc pod uwagę dostępne zasoby. Pisanie kodu, który zachęca innych do korzystania z Twoich metod, jest cennym sposobem zachęcania innych do korzystania z Twoich badań. Nie ma sensu pisać wysokiej jakości artykułów, o których nikt nie cytuje.
Jeśli napiszesz dobry kod i udostępnisz go, zwiększa to szansę na użycie go przez inne osoby (na przykład dla porównania), a tym samym potencjalnie zwiększa liczbę cytowań. I oczywiście poprawia powtarzalność twojej pracy. Wszystkie dobre powody, aby zrobić to właściwie ....
Jako zabawny kontrprzykład, istnieją projekty badawcze dotyczące oprogramowania, które nie tylko mają siłę przemysłową, ale są szeroko stosowane w przemyśle, np.LLVM, Scala, Haskell.Oczywiście w takich przypadkach można by argumentować, że jakość oprogramowania była _ częścią_ samego problemu badawczego.
Dziesięć odpowiedzi:
xLeitix
2014-05-22 00:39:03 UTC
view on stackexchange narkive permalink

Myślę, że kluczem do zrozumienia kodu badawczego dla inżynierów oprogramowania przemysłowego jest zaakceptowanie tego, że zazwyczaj nie tworzysz produktu . Nie masz klientów jako takich. Tworzysz oprogramowanie, aby udowodnić swoją rację.

W związku z tym większość kodu, który piszesz jako badacz, jest bardziej zbliżona do jednorazowych prototypów i makiet, które często piszesz (w branży) w wczesne fazy projektu. Jak z pewnością wiesz, nawet w przemyśle te makiety mają zupełnie inne właściwości niż ostateczne oprogramowanie. Przede wszystkim muszą:

  • Mieć dokładnie te funkcje, które chcesz pokazać klientowi. Nie więcej, nie mniej. Zwykle wszystkie nudne standardowe funkcje domeny są pomijane.
  • Trzeba zrobić szybko . Zarówno Ty, jak i klient wiecie, że prototyp i tak zostanie wyrzucony, więc nie ma znaczenia, czy kod jest możliwy do utrzymania.
  • Musi być łatwy w rozbudowie i adaptacji, optymalnie na żywo podczas demonstracji.

Zasadniczo te same właściwości są również przydatne dla większości jednorazowego kodu badawczego. Nie chcesz tworzyć funkcji, których nie potrzebujesz. Nie chcesz tracić czasu na pisanie np. Łatwego w utrzymaniu kodu, jeśli wiesz, że nie będzie on utrzymywany. Chcesz użyć środowiska, które zmniejsza ilość gotowego kodu i konfiguracji, i które być może automatycznie generuje dla Ciebie dużo kodu, który jest „wystarczająco dobry” dla Twojego demonstratora (Ruby on Rails i jego przychodzą mi na myśl funkcje rusztowania).

Postęp w mojej karierze zależy od tego, czy napiszę „zły” kod !?

Nie, to zależy od tego, czy napiszesz kod odpowiedni do celu. Tak jak w przemyśle. W przemyśle i środowisku akademickim nikt nie pochwala oprogramowania, które nie jest potrzebne. Spróbuj ponownie przemyśleć, jaki jest punkt kodu, który piszesz. Jeśli planujesz wydać swój kod jako oprogramowanie typu open source i oczekujesz, że zostanie on odebrany przez inne osoby na całym świecie, to zwariuj - wykorzystaj wszystkie techniki inżynieryjne, które wykorzystałeś również w przemyśle, aby zbudować najlepszy produkt, jaki możesz. Jeśli Twoim celem jest ocena tego jednego algorytmu lub zasady na potrzeby konferencji, a następnie wyrzucenie kodu, możesz również żyć szczęśliwie bez pisania ani jednego testu jednostkowego, nie czując się w ogóle jak oszust.

EDYCJA: oczywiście nie oznacza to, że można pisać kod tam, gdzie nie ma się pewności, czy zaimplementowałeś wspomniany algorytm poprawnie . Upewnienie się, że to, co rzeczywiście pokazałeś, to, co twierdzisz, że pokazałeś, jest obowiązkowe , szczególnie w kodzie badawczym.

W przypadku kodu badawczego może być tak niechlujny i źle zaprojektowany, jak chcesz, o ile nie zamierzasz go później używać, udostępniać publicznie jako open source lub utrzymywać w przyszłości. Ale * szczególnie * dla badań, powiedziałbym, że ** testy jednostkowe ** są prawdopodobnie jednym z twoich najlepszych przyjaciół - ponieważ w przypadku, gdy ktoś chce sprawdzić poprawność samego kodu, faktycznie działa * zgodnie z przeznaczeniem * (nawet jeśli wyniki badań są prawidłowe), wtedy testy jednostkowe będą dla Ciebie wsparciem. Są również przydatne w rozwoju opartym na testach, co moim zdaniem całkiem dobrze pasuje do dziedziny badań.
Fraza kluczowa: „pisanie kodu dopasowanego do celu”. Doskonała odpowiedź.
Superbest
2014-05-22 06:37:50 UTC
view on stackexchange narkive permalink

Jestem badaczem i programistą-samoukiem. Robiłem duże projekty, które opierały się głównie na oprogramowaniu. Chociaż moja praca jest daleka od najbardziej „hardkorowych” rzeczy, które istnieją pod względem złożoności i skali, projekty były na tyle duże, że naiwne błędy (np. Brak kontroli wersji lub słabo dokumentujący kod) były bardzo bolesne. Skończyło się na tym, że nauczyłem się kilku „najlepszych praktyk” metodą prób i błędów.

Byłem również na końcu „nieobsługiwanego kodu przekazywanego innym badaczom”:

enter image description here

Moje doświadczenie w przemyśle stanowi przeszkodę w moich badaniach

Nie, w zasadzie pochodzisz z cywilizowanego środowiska, które rozwiązało te problemy dziesiątki lat temu taki, który utknął w epoce kamienia łupanego pod względem higieny tworzenia oprogramowania. Naukowcy nadal kodują jak w latach 60. Oczywiście czujesz konflikt, ale wina nie leży po twojej stronie.

W przemyśle kod musi być (idealnie): możliwy do utrzymania, wolny od błędów, refaktoryzowany, dobrze udokumentowany, rygorystycznie przetestowany

Powiedzmy, że prelegent na konferencji naukowej, opisując część obliczeniową swoich badań, powiedział jedno z następujących:

Kod, który napisałem ponieważ te badania są, trzeba przyznać, ... "

  • ... nie do utrzymania (i powodzenia w budowaniu moich badań!)
  • ... pełne błędy (i nie mam pojęcia, czy wynik jest poprawny!)
  • ... nieczytelne spagetti (i nawet nie wiem, jak to działa, nie mówiąc już o poprawności!)
  • ... nieudokumentowane (a wszystkie błędy są zaciemniane przez recenzentów!)
  • ... nie testowane (więc Bóg wie, czy robi to, co mówię / myślę, że robi!)

Czy spodziewasz się, że publiczność zareaguje czymś innym niż pogardą i oburzeniem? Gdybym coś takiego usłyszał, nie uwierzyłbym w nic, co ta osoba kiedykolwiek opublikował.

W środowisku akademickim celem jest (...) w jak najkrótszym czasie.

Tak, ale „ nie krócej ”. Nie pomijasz ważnych eksperymentów kontrolnych, ponieważ „kontrole wymagają czasu”. Nie możesz oszczędzać na jakości kodu z bardzo podobnych powodów.

Wydaje się, że nie ma motywacji do pisania [dobrego kodu]

Ponieważ jest to endemiczny problem środowiska akademickiego. Chociaż komputery są wykorzystywane w nauce od dziesięcioleci, wydaje się, że algorytmy stały się ważną częścią badań dopiero w ostatniej dekadzie (być może z powodu „dużych zbiorów danych”). Kiedy opierasz swoje badania na kodzie, kod ten musi być dobrej jakości. Nie wystarczy po prostu uruchomić jakiś błędny skrypt tylko do zapisu i nazwać go dniem. Społeczność programistów wymyśliła to wszystko dawno temu, ale środowisko akademickie jeszcze się nie zorientowało - myślę, że powodem jest to, że większość naukowców nie ma formalnego doświadczenia w tworzeniu oprogramowania i nie było wystarczająco dużo skandali w badaniach, przez złe praktyki programistyczne (np. kluczowe wyniki głośnego artykułu okazują się artefaktami spowodowanymi błędami).

Zastanów się, jak w wielu dyscyplinach recenzenci nie będą nawet pytać o kod źródłowy twojego papier ciężki obliczeniowo. Jak więc mogą ocenić ważność twoich wyników? Nie mogą i jest to porażka modelu wzajemnej oceny, który obecnie istnieje.

Przepraszam, że kontynuuję rantowanie, ale zasadniczo wygląda to tak: Jak wiesz, istnieją bardzo dobre powody do pisania kod jakości, nawet jeśli nikt nie patrzy Ci przez ramię. W nauce obecnie tak się dzieje, że nikogo nie obchodzi, czy Twój kod jest dobry, czy nie. Ale to nie powinien być powód, dla którego i tak nie powinieneś pisać dobrego kodu - powody pisania dobrego kodu w branży wciąż w dużej mierze dotyczą nauki.

Niestety, możesz nie otrzymać wynagrodzenia za dodatkową pracę. Możesz nawet zostać ukarany, ponieważ, jak mówisz, dobry kod trwa dłużej, a inni mogą nie patrzeć poza to. Twój PI lub koledzy mogą nie rozumieć, dlaczego jesteś o wiele wolniejszy. Najlepsze, co możesz zrobić, to wyjaśnić im potrzebę dobrych praktyk.

Oczywiście są wyjątki. Na przykład możesz nie martwić się o przenośność lub kompatybilność wsteczną ze starymi wersjami systemu operacyjnego dla kodu, który ma działać na dedykowanym komputerze laboratoryjnym (chociaż niepożądane jest pisanie kodu w taki sposób, że działa on tylko w bardzo egzotycznym środowisko, którego inni naukowcy nie będą w stanie łatwo zrekonstruować). Ale ogólnie rzecz biorąc, uważam, że praktyki branżowe nadal obowiązują, a wyjątki można łatwo wykryć, stosując odrobinę krytycznej myśli. To powiedziawszy, istnieje również pomocna publikacja „ Best Practices for Scientific Computing ”, która szczegółowo analizuje tę kwestię.

Ostatecznie jest to etyczna decyzja, którą musisz podjąć. Czy zależy ci przede wszystkim na robieniu dobrej nauki? Postępuj zgodnie z najlepszymi praktykami. Chcesz iść na skróty, których nie powinieneś (w sensie etycznym), zaoszczędzić czas lub uniknąć tarć ze współpracownikami? Z zasady nie mógłbym ci tego polecić. Ale oczywiście wielu ludzi to robi i być może w praktyce niektórzy naukowcy są do tego zmuszani - chociaż z drugiej strony, czy niezdolność do uprawiania dobrej nauki przez okoliczności nie usprawiedliwia złej nauki?

Ponadto, jak powiedziałem, ja Myślę, że część problemu polega na tym, że nie było żadnych wielkich skandali. Jeśli oszczędzisz na jakości kodu, jest szansa, że ​​cię dogoni. Możesz nawet skończyć jako jeden z tych wielkich skandali. Trzeba przyznać, że ryzyko jest prawdopodobnie niewielkie ... Ale myślę, że rozumiesz, o co mi chodzi.

„Gdybym coś takiego usłyszał, nie uwierzyłbym w nic, co ta osoba kiedykolwiek opublikował” - stąd tak naprawdę nikt nie publikuje kodu.
Brak formalnych testów nie oznacza, że ​​nie wiem, czy to działa. Zwykle, kiedy piszę funkcję, sprawdzam, czy jest poprawna, ale nie poświęcam czasu na napisanie pełnej struktury unittest. Oznacza to, że jestem całkiem pewien, że będzie działać, dopóki go nie refaktoryzuję. Również wrzucenie kilku potwierdzeń do kodu pomaga w poprawności.
@Davidmh Masz rację, że niesprawdzona funkcja niekoniecznie jest niepoprawna. Ale myślę, że testy są tego dowodem.
„Zastanów się, w jaki sposób w wielu dyscyplinach recenzenci nie będą nawet pytać o kod źródłowy twojego ciężkiego obliczeniowo artykułu. Jak więc mogą ocenić ważność twoich wyników? Nie mogą, a to jest porażka modelu recenzowania w obecnym stanie. ”Jest to problem dla wszystkich badań naukowych - badacz rozwija swoją karierę, stawiając punkt, a jego metody rzadko są podwójnie sprawdzane (prawie nigdy przed podjęciem decyzji o kolejnym przyznaniu grantu lub zatrudnieniu). Istnieje ogromna zachęta, by iść na skróty i wypełnić luki bzdurami.
@adam.r Ale jest duża różnica. W przypadku eksperymentów na stole należy bardzo szczegółowo określić, gdzie uzyskano odczynniki i jak przeprowadzono eksperymenty, do tego stopnia, że ​​ktoś mógłby powtórzyć eksperyment, czytając artykuł. Jasne, niektórzy recenzenci nie wykonują dobrej pracy, w wyniku czego pojawiają się artykuły z bardzo ogólnikowymi sekcjami dotyczącymi metod, ale metodologia pisania jest akceptowana jako odpowiedzialność recenzenta / autora. Jednak publikowanie lub przeglądanie kodu źródłowego w wielu przypadkach nie jest traktowane jako taka odpowiedzialność.
+1 dobra, uczciwa odpowiedź. Niektóre inne odpowiedzi mówią po prostu: „zaakceptuj to i napisz słabej jakości kod - to środowisko akademickie, a nie przemysł”.
Alexandros
2014-05-21 23:42:26 UTC
view on stackexchange narkive permalink

Spędzam zbyt dużo czasu na tworzeniu (niepotrzebnie), aby mój kod „badawczy” był na poziomie przemysłowym

Nie. Zrób to jak najlepiej w sugerowanych ramach czasowych. Dążenie do 100% perfekcji, która wymaga podwójnego czasu, nie jest tego warte. W tym sensie badania są dokładnie takie same, jak w przemyśle.

W rezultacie napisany przeze mnie kod „akademicki” jest słabej jakości.

To nie wszystko kod akademicki jest niskiej jakości. Jeśli przejrzysz artykuły na temat konferencji algorytmów lub systemów przetwarzania równoległego, zobaczysz, że programiści pomyśleli nawet o dręczących szczegółach, takich jak zmiana kolejności danych w celu zmniejszenia liczby braków w pamięci podręcznej, SIMD, programowanie GPU, pamięć SSD itp. Zazwyczaj zaawansowane badania nad algorytmami CS trwają kilka lat. przodują w przyjmowaniu nowych metod, technik sprzętowych, zanim którakolwiek z tych technik faktycznie trafi do branży. Z drugiej strony, w bardziej teoretycznych konferencjach CS kod jest głównie narzędziem i jako taki nie musi być nowatorski. Tak więc jakość jest związana z odbiorcami kodu produktu (dokładnie tak, jak w branży).

Czy ktoś zna formalne metodologie kodu „badawczego”?

Nigdy nie słyszałem o metodach specjalnie dostosowanych do kodu badawczego. Mimo to możesz wykorzystać praktyki z Twojej branży (kiedy faktycznie przyspieszają one proces pisania oprogramowania). Na przykład system wersjonowania przyspiesza rozwój i minimalizuje błędy / straty danych. Z drugiej strony testy UNIT zajmują dużo czasu, którego możesz nie mieć. Nieformalna wiki dotycząca błędów, dokumentacji, funkcji może być warta dodatkowego czasu, ponieważ przyspiesza również pisanie właściwej pracy naukowej. Wręcz przeciwnie, pełna baza danych błędów (bugzilla) może nie być warta dodatkowego czasu i wysiłku.

Tak więc, trzymaj się tych metod branżowych, technik, które znasz, pozwolą Ci zaoszczędzić czas na dłuższą metę i ulepszą oprogramowanie, ale bez zajmowania całego czasu. Znalezienie kompromisu jest zawsze najlepszym rozwiązaniem.

_Z drugiej strony, w bardziej teoretycznych konferencjach CS kod jest głównie narzędziem_ - Dokładniej, na bardziej teoretycznych konferencjach CS kod w ogóle nie istnieje.
* „Z drugiej strony testy UNIT zajmują dużo czasu, czego możesz nie mieć”. * Niekoniecznie. Ponadto czas spędzony na formułowaniu testów jednostkowych często pomaga w projektowaniu (wymusza modułowość, tworzy częściową specyfikację projektu), skraca czas poświęcony na debugowanie i może być wykorzystany do udowodnienia, że ​​wyniki badań są dokładne. Może nie być konieczne przeprowadzanie testów jednostkowych wszystkiego, ale w przypadkach, w których przeprowadzenie testów jednostkowych nie jest zbyt trudne, korzyści są warte inwestycji.
@JeffE: Czy masz na myśli, że kod komputerowy nie jest używany, czy po prostu nie jest omawiany na konferencjach? To pierwsze wydaje mi się nieprawdopodobne; na przykład osoba badająca teorię złożoności geometrycznej może z powodzeniem użyć kodu komputerowego do obliczenia współczynników Littlewooda-Richardsona i innych niezmienników związanych z teorią reprezentacji.
Mam na myśli, że kod nie jest nawet napisany, a tym bardziej używany. Przez ponad 20 lat jako informatyk-teoretyk napisałem tylko jedną pracę, która wymagała jakiegokolwiek kodu. (Niektórzy z moich kolegów uważają, że powinienem się wstydzić tego małża, ale nie jestem.)
O. Informatyka, co? A co z psychologiem piszącym kod SAS? A co z socjologami piszącymi kod SPSS (który nie jest nawet nazywany kodem, w SPSS nazywany jest „składnią”)? Ile artykułów na tej konferencji miałoby dobry kod? Ilu psychologów / socjologów miałoby tylko jeden kurs informatyki? Ilu z nich wiedziałoby o kontroli wersji, nie mówiąc już o testach jednostkowych? To jest witryna akademicka, a nie informatyczna. Prosimy o bardziej inkluzywne myślenie.
dmckee --- ex-moderator kitten
2014-05-22 00:16:23 UTC
view on stackexchange narkive permalink

tl; dr Niektóre części „najlepszych praktyk” branżowych dobrze pasują, a inne są nieefektywne w środowisku badawczym. Zachowaj to, co działa dobrze w tym środowisku.


Jestem eksperymentalnym fizykiem cząstek elementarnych i piszemy dużo kodu, a większość z nich to duże projekty napisane przez wielu , rozproszeni programiści.

Część zwykłego zestawu narzędzi branżowych, którego używamy entuzjastycznie.

  • Kontrola wersji
  • Śledzenie błędów
  • Zautomatyzowane systemy budowania i testowania

Inne części są albo wolniejsze, albo mniej cenione, w tym

  • Formalny proces (z duże „P”) z regularnymi spotkaniami dotyczącymi planowania, listą kontrolną wydania i tak dalej. Pojawiają się one, gdy projekty stają się większe (zwykle w odpowiedzi na całkowity brak kontroli jakości lub długie opóźnienia w wydaniu). Oznacza to, że używamy ich, gdy potrzebujemy ich.

  • Systemy generowania dokumentacji są dość powszechne, ale rzadko używane, dopóki projekt nie stanie się duży, gdy ludzie, którzy są zmuszeni dekodować niektóre bity często dostarczają trochę więcej dokumentacji.

  • Testy jednostkowe są rzadkie i zwykle koncentrują się na niższych warstwach systemów, ale testy regresji są bardziej powszechne.

  • Większość projektów ma standardy kodowania, ale generalnie są one luźno określone i słabo egzekwowane.

Inne proste rzeczy nie pojawiają się często.

  • Planowanie funkcji jest dość trudne, gdy nie wiesz, jakie sprytne pomysły ma absolwent w przyszłym tygodniu , aby rozwiązać problem, jeszcze nawet nie zauważyłeś.

  • Kiedyś było prawdą, że ścisła kontrola zaewidencjonowania przeszkadzała w rozprzestrzenianiu eksperymentalnych segmentów kodu i po prostu od czasu do czasu zamrażaliśmy nowe check-iny, aby wydać błogosławioną wersję renderowane HEAD / trunk / cokolwiek jako propozycja „używaj na własne ryzyko”). Wraz z pojawieniem się rozproszonej kontroli wersji zaczyna być coraz większe zaangażowanie w kontrolę odprawy dla oficjalnego łącza.

  • Refaktoryzacja zwykle ma miejsce tylko gdy nowa osoba zaczyna pracować z jakimś starym kodem i czuje, że potrzebuje zmian lub rozszerzeń. To, co nie jest zepsute, pozostaje w spokoju.


Na podstawie twojego pytania podejrzewam, że kodujesz samodzielnie lub w małej grupie . W tym ustawieniu szczegóły się zmieniają, ale ton pozostaje ten sam. Po prostu zachowaj te części swojej praktyki branżowej, które działają, i zrezygnuj z części, które mają najgorszy stosunek kosztów do korzyści pod względem czasu / wyników.

Zostaw ciężką refaktoryzację do czasu wiedzieć z dowodów, że określona część twojego kodu zostanie ponownie wykorzystana. Podobnie, zadowalaj się przybliżoną dokumentacją, chyba że okaże się, że kod ma ciągłe życie. I tak dalej.

Re: Formalna weryfikacja. Zauważyłem tylko, że w wielu grupach badacz, który tworzy oprogramowanie, ma znacznie większe doświadczenie i wiedzę niż kierownik - dlatego też kierownikowi trudno jest skutecznie monitorować postępy; podczas gdy w branży zawsze jest starszy programista, który ma odpowiednie umiejętności.
Cóż, w środowisku fizyki cząstek elementarnych są starsi fizycy kodujący z oboma niezbędnymi umiejętnościami. Wprawdzie na każdym projekcie jest ich kilka, ale można je znaleźć.
Marc Claesen
2014-05-21 23:26:49 UTC
view on stackexchange narkive permalink

Główną cechą kodu badawczego (bardziej niż typowych programów) jest to, że trudniej go zaplanować. Badania z definicji sięgają w nieznane, co przekłada się również na struktury programowe. Jako badacz często nie masz czasu na refaktoryzację, gdy twoje badania idą w innym kierunku, co powinno przełożyć się na inną strukturę oprogramowania.

W typowej inżynierii oprogramowania (powinieneś) mieć dość dobry pomysł ostatecznej funkcjonalności przed napisaniem pojedynczej linii kodu. W badaniach często tak nie jest. Programowanie do celów badawczych polega głównie na szybkim prototypowaniu, które jest zwykle wykonywane inaczej niż programowanie do długotrwałego użytku (np. Mało testów jednostkowych lub brak testów jednostkowych, użycie różnych języków, ...). Główną mantrą jest uzyskanie wyników szybko, a nie optymalnych z punktu widzenia inżynierii oprogramowania.

Wreszcie, właściwa inżynieria oprogramowania to sztuka, która jest bardzo trudna do opanowania. Nawet w środowisku przemysłowym jest mnóstwo brzydkiego oprogramowania (napisanego przez profesjonalistów!). Przeciętny badacz nie ma formalnego wykształcenia w zakresie pisania oprogramowania.

Postęp w mojej karierze zależy od tego, czy piszę „zły” kod !?

Jako badacz, nie dostajesz wynagrodzenia za tworzenie oprogramowania (niestety). Jako idealista lubię wierzyć, że to się zmieni z czasem, ale na razie źródła finansowania zajmują się tylko papierami.

„Rzemiosło” tworzenia oprogramowania to ogromny temat - ale gdzie jest najlepsza praktyka w badaniach naukowych? Nikt nie pisze testów jednostkowych dla papierowego kodu konferencji!

Testy jednostkowe służą dwóm głównym celom: (i) stwierdzenie, że kod działa poprawnie oraz (ii) szybkie znajdowanie i debugowanie problemów, szczególnie po zmianach strukturalnych i refaktoryzacji (długoterminowe korzyści dla dużych infrastruktur). Ponieważ oprogramowanie badawcze jest zwykle dość małe, pierwsza zaleta jest jedyną, która jest naprawdę istotna. Wygląda na to, że ta przewaga jest albo zbyt mała, albo niedoceniana (jeszcze raz przypomnijmy, że większość badaczy nie jest inżynierami oprogramowania).

Czy ktoś znajduje ich w podobnych sytuacja? Czy ktoś zna formalne metodologie kodu „badawczego”?

Jeśli chcesz zmienić świat, zacznij od siebie. Osobiście staram się dostarczać oprogramowanie wraz z manuskryptem, gdy jest to uzasadnione. Jako recenzent konsekwentnie proszę o kod, choć wydaje się to rzadkie.

Wydaje się, że jest to odpowiedź na pytanie [Dlaczego wielu utalentowanych naukowców pisze okropne oprogramowanie?] (Http://academia.stackexchange.com/questions/17781/why-do-many-talented-scientists-write-horrible-software), a nie do aktualnego pytania o najlepsze praktyki.
@ff524 w toku :)
Keith
2014-05-22 10:56:14 UTC
view on stackexchange narkive permalink

Myślę, że Twoim problemem jest postrzeganie jakości jako binarnych.

Niezależnie od tego, czy w przemyśle, czy w środowisku akademickim musimy dokonywać wyborów dotyczących określonych celów jakościowych. Oprogramowanie „przemysłowe” może mieć krytyczne znaczenie dla bezpieczeństwa i wymagać najwyższego osiągalnego poziomu jakości lub może być narzędziem programistycznym używanym wewnętrznie.

Cele jakościowe mogą obejmować:

  • Dostępność
    • Prawdopodobnie nie dotyczy Ciebie
  • Solidność
    • Czy będziesz musiał korzystać z wielu różnych zestawów danych, czy jest to jednorazowe?
  • Możliwość ponownego użycia
    • Czy przetwarzanie zostanie włączone do następnego problemu, nad którym będziesz pracować?
  • Możliwość weryfikacji
    • Czy działa tak, jak powinno do? Co by to oznaczało, gdybyś opublikował, a to nie była prawda?
  • Możliwość weryfikacji
    • Czy daje właściwą odpowiedź? [Miejmy nadzieję, że to ma znaczenie. ]
    • Inny sposób sprawdzenia poprawności odpowiedzi może oznaczać, że nie ma znaczenia, czy logika jest błędna.
  • Musi być utrzymywalna autor:
    • Ja
    • Inny ekspert
    • Jakiś przypadkowy student
    • Lub na pewno jest wyrzucony.
  • Odpowiednie do upublicznienia do użytku przez innych w celu sprawdzenia lub ponownego wykorzystania Twojej pracy.
  • Etc.

Po sformułowaniu celów jakościowych, Twój rozwój a system budowania powinien być wystarczający, aby osiągnąć te cele i nic więcej. Zauważ, że może się to różnić w zależności od projektu.

Raphael
2014-05-22 14:57:18 UTC
view on stackexchange narkive permalink

Zamiast mówić o różnicach w tworzeniu oprogramowania branżowego (z czym nie mam doświadczenia), chciałbym porozmawiać o rzeczach, które powinieneś robić w środowisku akademickim. Zakładam, że twój kod nie istnieje sam w sobie, ale jest dołączony do pewnego stwierdzenia naukowego, takiego jak „E. coli dzieli genom foo z ludźmi” lub „Algorytm A przewyższa algorytm B w scenariuszu Z”.

  • Najlepszy wysiłek

    Chociaż Twoim celem nie jest produktywne wykorzystanie i związane z nim przychody, powinieneś mieć uzasadnioną pewność, że Twój kod nie co twierdzisz i które mogą być zrozumiane (recenzowane!) przez zainteresowane strony. Oznacza to, że napisz jasny kod, skomentuj i udokumentuj. I test (jednostkowy).

    Jeśli nic więcej, pamiętaj, że Ty być może będziesz musiał ponownie odwiedzić swój własny kod jakiś czas później. Budujesz prototyp, ale następny może ponownie wykorzystać jego części. Lub chcesz, aby uczniowie go rozszerzyli.

  • Dostępność

    Aby wesprzeć naukową ocenę Twojej pracy (falsyfikowalność, odtwarzalności) inni badacze muszą być w stanie skompilować i uruchomić twoje programy.

    Dlatego powinieneś zapewnić źródła, pliki / instrukcje kompilacji i wszelkie dane wejściowe, których użyłeś w swoim praca. Należy pamiętać, że ktoś może chcieć zbudować Twój program lata po pierwszej publikacji, więc upewnij się, że źródła wciąż są dostępne, a proces / instrukcje kompilacji są wystarczająco solidne w czasie (wspomnij o wersjach bibliotek). Interfejs użytkownika nie jest zbyt ważny, ale tutaj też obowiązuje zasada „najlepszych starań”.

    Rozważ umieszczenie kodu na Github lub podobnej platformie (np. własnej ). W ten sposób możesz łatwo publikować aktualizacje i zbierać błędy. Zobacz także tutaj i tutaj.

  • Licencjonowanie

    Powinieneś coś powiedzieć o tym, co inni (w szczególności koledzy badacze) mogą, a czego nie mogą zrobić z Twoim kodem. Możesz użyć dowolnej licencji (uważam, że powinna ona zezwalać przynajmniej na swobody GPL). Warto zajrzeć do CRAPL.

  • Rzetelna ocena

    Jeśli Twój algorytm / kod to artefakt, który proponujesz (jako lepszy), musisz porównać go z istniejącymi rozwiązaniami. Upewnij się, że używasz porównywalnych danych wejściowych, powtórz eksperyment w celu znalezienia alternatyw i postępuj zgodnie z podstawowymi najlepszymi praktykami eksperymentalnymi (sprawdź na przykład pracę McGeocha). Upewnij się, że twoje porównanie zawiera akceptowany standard (y) twojej dziedziny, jeśli takie istnieją; jeśli twoje podejście daje różne wyniki, musisz wyjaśnić dlaczego (to w porządku / poprawne / lepsze).

Dostępność jest prawdopodobnie najważniejszą kwestią. Kod badawczy musi zostać udostępniony. Myślę, że nie można tego wystarczająco podkreślić i jest to jeden z głównych problemów w całej nauce obliczeniowej. Oprócz, powiedzmy, fizyki, mamy możliwość łatwego udostępniania i odtwarzania (większości) konfiguracji eksperymentalnej - musimy to wykorzystać.

Osobiście nie rozumiem, dlaczego jakikolwiek artykuł jego twierdzenia dotyczące obliczeń, których recenzenci (i inne strony) nie mogą powielać, mają prawo do publikacji.


Jedno przypomnienie dla wszystkich typów teorii:

Uważaj na błędy w powyższym kodzie; Tylko udowodniłem, że to prawda, a nie próbowałem.
Donald E. Knuth

„Najlepszy wysiłek” oznaczał, że jeśli nie masz wiedzy programistycznej, o której możesz mówić, * nie rób tego *. Zatrudnij osobę, która to zrobi.
Mam nadzieję, że nie polecasz poważnie licencji CRAPL, co jest farsą. Przykład: „Czytając to zdanie, zgadzasz się z warunkami niniejszej Licencji”. Gdyby licencje działały w ten sposób, wszyscy mielibyśmy poważne kłopoty!
@wjl: Myślę, że warto zajrzeć, jak już powiedziałem. Zawiera kilka interesujących myśli, imho.
To jedyna odpowiedź, która mówi o * odtwarzalności *. Czy to nie ma być kamieniem węgielnym nauki? Jeśli Twój kod nie działa lub nie może być użyty w inny sposób, Twoje tak zwane „badania” nie są odtwarzalne i nie powinny być publikowane w pierwszej kolejności.
SeF
2018-11-17 17:17:46 UTC
view on stackexchange narkive permalink

Gdybym mógł dodać krótką wersję dokładniejszych odpowiedzi powyżej, powiedziałbym:

  • Academia -> prototypy.
  • Przemysł -> produkty.

Produkty i prototypy nie mogą być traktowane zgodnie z tymi samymi standardami.

Prototypy mogą mieć krótszą dokumentację i ich wdrożenie może wymagać pewnego wysiłku. Mogą być również używane w pojedynczym systemie operacyjnym z bardzo określonymi wymaganiami, takimi jak te, w których kod został początkowo opracowany.

Niemniej jednak prototypy dobrej jakości powinny być testowane, kontrolowane przez wersje, mieć stabilną gałąź i nie może zawierać nieaktualnej dokumentacji. W przeciwnym razie są to tylko prototypy złej jakości.

---- Edytuj

Postęp w mojej karierze zależy od tego, czy napiszę „zły” kod !?

Odejście ze środowiska akademickiego przypomniało mi, że istnieje coś innego niż metoda pracy zorientowana na papier, do której szkoleni są doktoranci (a której wyniki często mają mniejszą liczbę czytelników niż liczba współautorów).

Może nie ma to miejsca w każdym środowisku akademickim, chociaż z mojego doświadczenia wynika, że ​​badania z kryteriami naukowymi są prowadzone w sektorze prywatnym.

Poza tym nie jest to tylko problem związany z kodowaniem!

Niektórzy badacze pracujący w wilgotnych laboratoriach powiedzieli mi, że mają dokładnie ten sam problem. Wykonywanie eksperymentów mokrego laboratorium dokumentujące pełną procedurę, kalibracja narzędzi do najwyższych standardów, ocena składu chemicznego materiału zakupionego przez osoby trzecie jest spójna w czasie, dzięki czemu każdy krok jest w pełni odtwarzalny przez innego badacza ... te podstawowe praktyki zaowocowały zbyt wolna produkcja artykułów naukowych.

Tony Hopkinson
2014-07-08 14:27:52 UTC
view on stackexchange narkive permalink

Zostałem skierowany do tego pytania przez gościa w odpowiedzi na moją prośbę o wyjaśnienie „Dlaczego używali typu float jako klucza do hasha”. Otóż, nie wydawało mi się to dobrym pomysłem. Po kilku chwilach pytający skierował mnie tutaj jako powód, dla którego to zrobili.

To było interesujące, podobnie jak samo pytanie.

Czy jesteś przekonany do napisania złego kodu, aby osiągnąć określone cele akademickie? Tak, nawet na kursach CS mogę dodać. Przynajmniej źle pod względem zrozumiałości. Jednakże, jak wszyscy jesteśmy zbyt przerażająco świadomi, zostaliśmy „przekonani” do napisania równie złego kodu w środowisku komercyjnym lub nasi panowie i mistrzowie zostali przekonani, że napisali dla nich kiepski kod .... > Pomijając trywialne implementacje algorytmów. Na przykład, czy powinieneś używać i i j jako zmiennych pętli w algorytmie sortowania bąbelkowego, czy też w ogóle powinieneś używać sortowania bąbelkowego. Moja odpowiedź na twoje pytanie byłaby inna. W jaki sposób dobre zasady inżynierii oprogramowania pomagają osiągnąć cele?

Czy, powiedzmy, dobre nazewnictwo, SOLIDNE zasady, spójność i sprzężenie itp. Pomogą Ci skuteczniej osiągnąć cel? Moja odpowiedź byłaby prawie na pewno. Są przeznaczone do tego w każdym nietrywialnym oprogramowaniu. Po to są, zostały stworzone w celu uzyskania oprogramowania, które można zmienić mniejszym kosztem. Nie ma znaczenia, że ​​nie jesteś (lub przynajmniej nie możesz przewidzieć) wersji drugiej, implementacja nie wyskakuje z twojego umysłu, więc to się zmieni.

Jeśli tak nie jest Jeśli masz pewność, jaki kod musisz napisać, coś takiego jak TDD również pomogłoby, biorąc pod uwagę gotowe środowisko do testów jednostkowych. Nawet bez tego „luksusowego” pisania testowalnego kodu będzie.

Masz ogromną przewagę nad kolegami, którzy nie mają doświadczenia w inżynierii oprogramowania, powinieneś być w stanie szybciej usunąć ten irytujący binarny fragment ćwiczenia, dotrzeć do celu przy mniejszym wysiłku a potem być w stanie włożyć więcej wysiłku w osiągnięcie prawdziwego celu.

Kiedyś rozmawiałem z typem posiadającym kwalifikacje akademickie, który powiedział mi, że re-factoring to po prostu majstrowanie przez estetów oprogramowania i że powinienem był napisać oprogramowanie poprawnie. Nie trzeba dodawać, że mój szacunek dla tej osoby spadł o jeden stopień lub dwa, co było dla niego niefortunne, ponieważ nie zarobił tak dużo.

Podsumowując, powiedziałbym, że rozsądną opcją byłoby użycie dobrych praktyk inżynierii oprogramowania we wszystkich swoich wysiłkach. Żeby było jasne, że pisanie dobrego kodu, którego nie potrzebujesz, nie jest dobrą praktyką inżynierii oprogramowania ...

Parafrazując Gandalfa: „Uprość to, zachowaj bezpieczeństwo”

Jeśli chodzi o to, czy jako klucz do hashowania należy używać float, aby zaoszczędzić czas. Jeśli bez wątpienia wiesz, wybierając ten kompromis projektowy, że problemy z tym nie spowodują problemu, to być może. Ale ilość wysiłku potrzebnego do uniknięcia tego kompromisu jest dość trywialna i po prostu spędziłeś czas na pytaniu, jak rozwiązać problem z użyciem pływaka jako klucza. Odpoczywam

W każdym środowisku komercyjnym lub akademickim wybór niższej jakości jest zarówno korzyścią, jak i kosztem, zbadaj oba ....

Victor Mataré
2016-07-13 05:44:44 UTC
view on stackexchange narkive permalink

Mam problem z przesłanką pytania:

W środowisku akademickim celem jest napisanie jak największej liczby wysokiej jakości artykułów naukowych w jak najkrótszym czasie.

Wydaje się, że nie ma motywacji do pisania przetestowanego, możliwego do utrzymania, udokumentowanego kodu - wystarczy go uruchomić i jak najszybciej uzyskać wynik w mojej pracy lub czymkolwiek innym

Obecnie mam do czynienia z dużym kod źródłowy napisany przez ludzi, którzy najwyraźniej też tak myśleli. Wcześniej przyzwyczaiłem się do innego standardu kodowania akademickiego - takiego, w którym kod jest prosty, elegancki, nowoczesny, dobrze przetestowany i dobrze utrzymany przez wiele lat.

I wierzę, że ludzie, którzy będą mieli Wpływ w tej erze informacji niekoniecznie to ci, którzy mają największe zasługi naukowe, ale ci, którzy mogą coś zrobić ze swoich fajnych pomysłów naukowych.

Jeśli jednak w twojej domenie fajne rzeczy, które możesz zrobić, nie W ogóle nie zależy od kodu, który napiszesz (np. tylko nudnego filtrowania danych), wtedy naprawdę nie musisz przejmować się jego jakością.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...