Zawsze lubiłem fizykę i zawsze lubiłem kodować, więc kiedy dostałem ofertę pracy doktorskiej zajmującej się fizyką numeryczną (szczegóły nie są istotne, to głównie programowanie równoległe dla klastra) na uniwersytecie, było to nie -mózg dla mnie.
Jednak, jak większość fizyków, jestem samoukiem. Nie mam szerokiej wiedzy na temat tego, jak kodować w sposób obiektowy, ani nazwy tego konkretnego algorytmu, który optymalizuje wyszukiwanie w jakimś drzewie kD.
Ponieważ wszystkie moje dotychczasowe prace bardziej dotyczyły fizyki i wyników naukowych, niewątpliwie mam złe nawyki - tym bardziej, że moje kodowanie jest moje, a nie praca zespołowa. Najczęściej używałem C, ponieważ jest to bardzo proste, a „to, co piszesz, to to, co dostajesz” - nie potrzeba fantazyjnych abstrakcji. Jednak ostatnio przerzuciłem się na C ++, ponieważ chciałbym dowiedzieć się więcej o mocy pochodzącej z abstrakcji i jest dość podobny do C (przynajmniej pod względem składniowym).
Jak nauczyć się kodować w dobry, abstrakcyjny sposób, jak absolwent informatyki?
Wiem, że mój kod jest wydajny, ale chcę, aby był również elegancki i czytelny. Pamiętaj, że nie mam czasu na przeczytanie kilku 1000 stronicowych tomów na temat programowania abstrakcyjnego. Muszę spędzać czas na rzeczywistych badaniach związanych z fizyką (mój przełożony śmiałby się ze mnie, gdyby wiedział, że spędziłem czas, zastanawiając się, jak programować elegancko). Jak ocenić, czy moja praca jest dobra z perspektywy programisty?
źródło
Odpowiedzi:
Czy więc prosisz kogoś, aby dał ci pięciostopniową listę kontrolną, dzięki której staniesz się wykwalifikowanym programistą? To się nie stanie !
Podobnie jak w przypadku każdej innej dyscypliny, jeśli chcesz być dobry w programowaniu, musisz poświęcić czas i wysiłek na ćwiczenia i naukę. Nauczysz się pisać przejrzysty, elegancki kod, pisząc dużo kodu i uważnie czytając kod innej osoby. Niektóre z tych 1000 stronicowych stron zaoszczędzą Twój czas, podsumowując trudne lekcje, których nauczyli się inni ludzie. Myśl, że możesz zostać wykwalifikowanym programistą jako bezbolesny efekt uboczny uzyskania doktoratu z fizyki, to złudzenie. Nie jest tak, że nie możesz wyjść z doktoratu z fizyki. z szalonymi umiejętnościami programowania, po prostu będzie cię to kosztować czas i kłopoty.
Code Complete to dobre wprowadzenie do mechaniki tworzenia oprogramowania, w tym porady dotyczące pisania i tworzenia przejrzystego, łatwego do utrzymania kodu. Tak, to ogromny tom, ale z pewnością nie tak gęsty, jak powiedzmy, „Zasady mechaniki kwantowej” Diraca lub „Grawitacja” MTW. Code Complete jest tak blisko, jak tylko dojdziesz do pięciostopniowej listy kontrolnej do pisania lepszego oprogramowania.
Matlab, VIM, C, MPI i Valgrind to doskonałe narzędzia do poznania. Nie wspominasz o użyciu systemu kontroli wersji. Jeśli przez jakiegoś fuksa nie korzystasz jeszcze z systemu kontroli wersji, musisz natychmiast zacząć go używać. Kontrola wersji jest także godnym posłaniem do napisania pracy magisterskiej. Inne podstawowe narzędzia, które powinieneś znać, to debugger, profiler wykonywania, środowisko rejestrowania i środowisko testowania jednostkowego. Nie musisz czytać książki 1000 stron dla każdego z nich. Zapoznaj się z samouczkami online, aby uzyskać podstawy, a następnie zacznij z nimi pracować. Zagłęb się w dokumentację, gdy Twoje potrzeby staną się bardziej wyrafinowane.
Doradztwo w nauce podstaw informatyki (w przeciwieństwie do podstaw budowy oprogramowania) jest trudniejsze. Nie określasz, nad którym problemem pracujesz, niezależnie od tego, czy opracowujesz nowe algorytmy, czy stosujesz istniejące algorytmy. W zależności od problemu badawczego pomocne może być badanie podstawowych struktur danych i standardowych algorytmów. Inne problemy skorzystałyby bardziej na solidnym tle analizy numerycznej. Jeśli chcesz nauczyć się podstaw analizy algorytmów, przeczytaj kilka dobrych tekstów. Przypomina sobie Podręcznik projektowania algorytmów i wprowadzenie do algorytmów . Istnieje również kilka dobrych kursów wprowadzających dostępnych online: Projektowanie i analiza algorytmów oraz Algorytmy .
źródło
Moje pochodzenie jest trochę podobne do twojego - byłem absolwentem fizyki, który samoukiem programował. Po ukończeniu studiów podjąłem się kilku prac informatycznych i ostatecznie zostałem inżynierem oprogramowania; w tym trochę czasu na pracę nad OpenGDA (oprogramowanie do przeprowadzania eksperymentów w różnych witrynach synchrotronowych).
Najważniejszą rzeczą, której nauczyłem się o twoich pytaniach, kiedy tu dotarłem, jest to, że o wiele łatwiej jest zdobyć te umiejętności od innych ludzi niż sam je podnieść. Doświadczony mentor może z łatwością pomóc Ci określić, gdzie twój kod jest słaby lub gdzie mogą pomóc ci wspólne wzorce i praktyki. Podczas gdy sam nauczyłem się pisać C i Objective-C, nie wiedziałem dokładnie tego, czego nie wiedziałem (jeśli rozumiesz, co mam na myśli), dopóki nie pracowałem z innymi ludźmi na tym samym kodzie. To, że prosisz tutaj o radę, oznacza, że radzisz sobie lepiej niż ja :-).
Gdzie teraz znajdujesz oswojonego inżyniera oprogramowania? Niedawno dołączyłem do MentorNet , systemu, w którym partnerzy doświadczali programistów z protegowanymi.
Ale nie musisz wybierać takiego formalnego systemu. Znalezienie lokalnej grupy programistów (lub działu inżynierii oprogramowania na uczelni po pracy w piątek) to świetne miejsce na rozpoczęcie.
źródło
Brak Royal Road to Software
W czasach starożytnych Euclid zadawał takie same pytania jak jego uczeń, król Ptolemeusz. Jego odpowiedź: „Nie ma królewskiej drogi do geometrii”.
Wspominasz, że twój przełożony śmiałby się, gdyby wiedział, ile czasu spędzasz na pisaniu kodu jak profesjonalny programista. Inni odpowiedzieli na twoje pytania, przedstawiając listę rzeczy do nauczenia, od kontroli źródła po projektowanie i analizę algorytmów.
Nie spełniają twojego celu:
Koncert pianista czy zespół One Man?
Świat porusza się zbyt szybko, aby ludzie mogli się nim bawić. Jeśli chcesz zostać pianistą koncertowym, nie marnuj czasu na naukę instrumentów, aby stać się zespołem jednoosobowym.
Moja koncepcja roli doktora w dziedzinie fizyki w średnich i dużych projektach jest liderem idei w zakresie definicji systemu, ekspertem w teorii, ekspertem w temacie podczas tworzenia przypadków użycia oraz użytkownikiem końcowym / oceniającym wyniki generowane przez artefakty oprogramowania. Współpracuj ściśle z najlepszymi inżynierami oprogramowania, jak możesz.
Jak ocenić, czy moja praca jest dobra z perspektywy programisty?
Jeśli chcesz ustawić poprzeczkę wysoko, zacznij tutaj:
Architektura oprogramowania w praktyce, Len Bass, Paul Clements, Rick Kazman
Poszukaj rozdziału „Zrozumienie atrybutów jakości”. Poza kodem bierze pod uwagę użyteczność, modyfikowalność, wydajność, bezpieczeństwo, dostępność, niezawodność, testowalność, łatwość konserwacji i przenośność (nie możesz go przenieść, ale możesz przenieść projekt z jednej platformy na drugą). Wszyscy potrzebują konkretnych mierzalnych celów. Podobne odniesienia obejmują:
http://msdn.microsoft.com/en-us/library/ee658094.aspx
http://www.sei.cmu.edu/reports/95tr021.pdf
Twoje cele vs. C i C ++
Podobnie jak FORTRAN, są to twarde i stare języki. Pozytywne wskaźniki dla C / C ++ obejmują:
Wiele osób zajmuje się tworzeniem stron internetowych, wizualizacją danych i big data. Wielu jest zmotywowanych do znalezienia lub stworzenia innych języków. Na przykład fizyk Sir Tim Berners-Lee odniósł sukces w HTML (ale niewiele wiadomo na temat fizyki). Oceń swój cel w stosunku do języka programowania.
Rozważ użycie Matlaba
Matlab ma świetnie zainstalowaną bazę, specjalizuje się w matematyce i naukach ścisłych. Posiada narzędzia do wizualizacji danych. Umożliwia naukowcom i matematykom wyrażanie problemów w dziedzinie problemów, a nie w dziedzinie rozwiązań. Matlab tworzy zestaw narzędzi do przetwarzania równoległego i produkty rozproszonego serwera obliczeniowego.
Oczekuję, że sukces Matlaba wynika z korzystania z multidyscyplinarnych zespołów z ludźmi, którzy są ekspertami w dziedzinie fizyki, matematyki, elektroniki i oprzyrządowania, systemów operacyjnych, języków programowania, rozwoju oprogramowania, testowania oprogramowania, architektury i projektowania oprogramowania. Analogia może być długa, ale dlaczego miałbyś postawić się tam sam, zaczynając od młotka, dłuta i tarnika, aby zrobić coś, gdy masz dostępną drukarkę 3D? Jak mógłby zapytać Newton, dlaczego nie stanąć na czyichś barkach?
źródło
Będziesz mógł przejść długą drogę w fizyce, nie wiedząc nic o „profesjonalnym” stylu (mówiąc z doświadczenia). Ale widziałem, jak wielu ludzi marnuje nieskończony czas, ponieważ stracili świadomość tego, co robili lub po kilku latach rozwijania swojego kodu, po prostu zatracili się w jego złożoności (nawet w środowisku akademickim nie ma kodu „wyrzucania”, ale rzeczy trzymać się znacznie dłużej, niż początkowo myślisz).
Sugerowałbym, abyś miał przewagę w algorytmach i strukturach danych, np. Dzięki temu kursowi . Następnie powinieneś być w stanie myśleć o wydajności na bardziej produktywnym poziomie i być w stanie śledzić np. Artykuły na Wikipedii.
Następnie przyzwyczaj się do tego, co jest dostępne w rdzeniu twojego języka, np. Dla C ++ cppreference.com . Gorąco polecam również przeczytanie serii Effective C ++ autorstwa Scotta Meyersa i Accelerated C ++ autorstwa Koeniga i Moe. Przynajmniej dla C ++ da ci to solidne podstawy po stronie językowej.
Równolegle powinieneś starać się dobrze poznać swoje narzędzia. Nie jest mało prawdopodobne, że będziesz rozwijał swój kod pod Linuksem, więc spróbuj dowiedzieć się, jak uzyskać więcej diagnostyki (ostrzeżeń) od kompilatorów (przynajmniej gcc i clang). Dowiedzieć się również o statycznych narzędzi analitycznych, takich jak cppcheck lub scan-build dzyń za . Dowiedz się, jak uczynić te narzędzia integralną częścią procesu programowania, np. Integrując je z konfiguracją kompilacji (tak, powinieneś używać przynajmniej GNU make, a nawet lepiej czegoś takiego jak GNU autotools / cmake / ...). Powinieneś również dodać narzędzia profilujące do swojego zestawu narzędzi. W przypadku C ++ zdecydowanie zalecam zapoznanie się ze wszystkim, co możesz na temat valgrind, które mogą profilować na bardzo niskim poziomie (może to również pomóc w wykrywaniu wycieków zasobów).
Wszystko to pomoże Ci skoncentrować się na tym, na czym ci najbardziej zależy (na twoich badaniach), zamiast tracić czas na szukanie błędów lub robienie bezużytecznych optymalizacji. Oczywiście jest prawie niemożliwe, aby sprzedać doradcy, ale oni (i ty) będą pod wrażeniem, ale szybkość, z jaką będziesz w stanie uzyskać wiarygodne wyniki.
Wspomniałeś o C i C ++, ale do obliczeń numerycznych nie mogę polecić Pythona z wystarczająco numpy i scipy . Pozwala pisać w czystym, dość czystym języku na bardzo wysokim poziomie (możesz nawet pracować interaktywnie), jednocześnie korzystając z wyjątkowo zoptymalizowanych procedur zaimplementowanych w C, C ++ i FORTRAN. Ponadto, łączenie własnego kodu C lub C ++ z Pythonem jest prawie banalne.
źródło
Czy to jest poprawne? Czy zapewnia prawidłowe wyniki we wszystkich przypadkach?
Czy inne osoby są w stanie odczytać i łatwo zrozumieć Twój kod?
Kiedy twój przełożony mówi „Świetnie, teraz zrób też X ...”, czy musisz przepisać dużo kodu?
Czy po napisaniu programu staje się ono narzędziem, którego można używać w kółko, czy też można go użyć raz i wyrzucić?
Jeśli potrafisz odpowiedzieć tak, tak, nie i „tak, staram się tworzyć narzędzia zamiast jednorazowych obliczeń”, oznacza to, że już dobrze sobie radzisz. Duża część tego, co robimy jako programiści, ma na celu pomóc w rzeczach wymienionych powyżej.
źródło
Twoje programy będą się zupełnie różnić od komercyjnego kodu źródłowego, dlatego wiele dobrych praktyk i podejść nie będzie miało zastosowania w codziennym tworzeniu kodu źródłowego. Ale jest dobry sposób, aby nauczyć się kilku porad i wskazówek.
Niech jakiś dobry programista przejrzy kod i zoptymalizuje go razem. To da ci znacznie więcej doświadczenia i nauczy dobrych praktyk. Przejrzyj także kod źródłowy napisany przez inne osoby. Wyszukaj projekty open source na sourceforge lub github i przeczytaj ich kod źródłowy.
Ale przede wszystkim zastanów się, czy naprawdę musisz nauczyć się czegoś nowego, aby osiągnąć swoje cele. Robienie niepotrzebnych rzeczy tylko po to, aby kod wyglądał ładniej, nie doda żadnej wartości twoim aplikacjom.
źródło
Jeśli chodzi o bycie lepszym programistą, nie ma magicznej kuli. Jeśli jesteś samoukiem, kluczem jest samoświadomość, co brzmi jak masz. Jednak dobra znajomość kodowania sprowadza się głównie do czytania i ćwiczenia.
Krytycyzm wobec własnego kodu jest jednym z najlepszych sposobów na poprawę. Zawsze zadawaj sobie pytanie:
Inną moją sugestią byłoby nie zamykanie się w C / C ++. Chociaż są to dobre języki, które są używane z jakiegoś powodu, wymagają od ciebie robienia wielu rzeczy, które nie są związane z tematyką. Spójrz na Matlaba, byłbym zaskoczony, gdyby uniwersytet nie miał tego dla ciebie. Rozważmy język skryptowy taki jak Python. Zdecydowanie rozważ wybranie funkcjonalnego języka, takiego jak Haskell - ten paradygmat ma bardzo matematyczny charakter i prawdopodobnie pasowałby do twoich problemów jak rękawiczka. W skrócie poznaj inne języki / paradygmaty. Nawet jeśli nie staną się trwałym narzędziem w twoim pasie, uczynią cię lepszym programistą.
Możesz także przyjrzeć się projektowi algorytmu. Podejrzewam, że dostałem pracę, jesteś już dość pochopny, ale algorytmy są niezwykle ważne przy analizie numerycznej. Podejrzewam, że istnieją zasoby specjalnie ukierunkowane na algorytmy analizy numerycznej.
Nigdy nie trać z oczu głównego celu pisania kodu. Musisz załatwić sprawę. Stanie się lepszym programistą to jedna z metod, aby to zrobić. Kolejnym jest wybranie odpowiednich narzędzi do pracy.
źródło
Po pierwsze, „elegancki” jest terminem względnym. Abstrakcja może wydawać się dla ciebie elegancka, ale dla innego miłośnika może wydawać się niepotrzebna. W każdym razie, aby odpowiedzieć na twoje pytanie, powinieneś spróbować opublikować swój kod do recenzji na http://codereview.stackexchange.com .
Odchodząc od tematu, kilka niezamówionych porad opartych na moich własnych doświadczeniach. Jeśli możesz wykonać całą pracę za pomocą samego C, to dlaczego chcesz go kodować w abstrakcyjny sposób? Czy w ten sposób chcesz umożliwić innym użytkownikom ponowne użycie Twojego kodu? Jeśli naprawdę masz solidne powody, aby przejść na C ++, skorzystaj z abstrakcji i nauki pojęć C ++ i OO. W przeciwnym razie upuść pomysł. Moim skromnym zdaniem, czy nie powinieneś dążyć do tego, aby twój kod był bardziej czytelny, a wyniki naukowe były odtwarzalne niż nadawanie mu abstrakcyjnych wersji? Ja sam miałem taką obsesję na punkcie nauki OOPS i kodowania „elegancko” ly. Ale opanowanie języka C ++ zajmie trochę czasu. Będziesz musiał nauczyć się zarządzania pamięcią, ponieważ w C ++ zbieranie śmieci nie jest automatyczne. Posłuchaj mojej rady, ponieważ sam pracowałem w laboratorium badawczym i straciłem dużo czasu na naukę C ++ i OO,
źródło
Biorąc pod uwagę Twoją wzmiankę o braku czasu na studiowanie teorii.
Jeśli po kilku miesiącach spojrzałeś na swój stary kod i zastanawiałeś się, „jaki idiota napisał ten kod”, robisz postępy.
Jak poszedłeś? Widząc lepszy kod napisany przez innych. Osoba nigdy nie zna wartości „elegancji” lub „dobrego” kodu, chyba że widzi, że wnosi wartość dodaną do swojej pracy. Zamiast czytać teorię, zachęcam do pozostawania otwartymi na kod napisany przez innych w twojej dziedzinie pracy. Miej oczy otwarte na koncepcje omawiane podczas stackoverflow (tag C ++). Poświęcenie zaledwie piętnastu minut dziennie na takie wyszukiwanie może losowo narazić Cię na koncepcje, które mogą ci pomóc. Może pokazać ci kod, który jest lepiej napisany niż twój kod. Wtedy śledzisz Wikipedię i dowiadujesz się więcej na jej temat. Nauka, która rodzi się z ciekawości, będzie dla ciebie o wiele trwalsza i przydatna niż teoria, o której zapomnisz, gdy obudzisz się następnego dnia.
Rozważ także wypróbowanie języków takich jak MATLAB lub Python.
źródło
Jako fizyk, który sam zostałem programistą, uważam, że moje podstawy fizyki są najbardziej pomocne w tworzeniu odpowiednich metafor dla zrozumienia koncepcji oprogramowania. Ta perspektywa sprawiła, że nauka programowania była dla mnie przyjemniejsza i pomogła mi rozwinąć poczucie „elegancji” w oprogramowaniu, do którego dążysz.
Opisałem ważną i niedocenianą rolę metafor i analogii w oprogramowaniu w kolumnie CUJ „Wzorce myślenia - imiona, metafory, lepsze programowanie i polityka języka” . Na przykład koncepcje OO dziedziczenia klas często porównuje się z przekazywaniem cech od rodziców do potomstwa w rodzinie. To niepoprawna analogia. Prawidłową analogią dla dziedziczenia klas jest biologiczna klasyfikacja organizmów (np. Klasa RedRose jest rodzajem kwiatu, a kwiat jest rodzajem rośliny).
Lub weźmy na przykład koncepcję oprogramowania hierarchicznej maszyny stanów. Dobrą metaforą jest tutaj koncepcja związanego układu kwantowego, takiego jak atom wodoru. Jak pamiętacie, stany atomu są ponumerowane trzema liczbami kwantowymi | n, l, m>, dokładnie dlatego, że są „zagnieżdżone” (hierarchicznie). Ta metafora pokazuje, jak zrozumieć, że stany zagnieżdżają się w stanach (podobnie jak stany pędu kątowego (l) zagnieżdżają się w stanach energetycznych (n)), a także od razu widać, że zagnieżdżanie stanów jest zawsze odzwierciedleniem pewnej symetrii układu.
Inną interesującą analogią z fizyki jest „model obliczeniowy aktora”, który ostatnio został ponownie odkryty z powodu wielordzeniowych procesorów i przetwarzania rozproszonego w „chmurze”. Uznałem, że pomocne i przyjemne jest myślenie o zdarzeniach wymienianych przez aktorów będących stanami (aka aktywnych obiektów) jako wirtualnych bozonów, takich jak fotony w QED lub gluony w QCD. Ta metafora wyjaśnia podstawową asynchroniczną naturę komunikacji, przetwarzanie zdarzeń typu run-to-complete (skok kwantowy) oraz ścisłe enkapsulowanie obiektów aktywnych, które mogą oddziaływać tylko ze sobą poprzez wyraźne pośrednie artefakty.
W każdym razie opracowanie metafory systemu jest zalecaną praktyką w XP (eXtreme Programming), a jako fizyk będziesz mieć przewagę w wymyślaniu dobrych metafor. Zyskasz również poczucie „elegancji”, ponieważ twoje oprogramowanie odziedziczy integralność pojęciową z dobrych zastosowanych przez ciebie metafor.
źródło
Mogę powiedzieć, że największe korzyści, jakie osiągnąłem pod względem podejścia do rozwiązywania problemów, zostały osiągnięte poprzez naukę funkcjonalnych języków i analizatorów składni. Oba odkrycia zostały dokonane przypadkowo. Mówię więc teraz, że jeśli naprawdę poważnie myślisz o zostaniu lepszym programistą, musisz nauczyć się różnych technik pisania kompilatora, np. Parserów i generatorów parserów, i musisz nauczyć się, jak tworzyć obliczenia wyższego rzędu Funkcje.
Doskonałym źródłem informacji o parserze i kompilatorze jest PL101: Utwórz własny język programowania . Nadal nie znalazłem dobrego wstępu do programowania funkcjonalnego, ale słyszę naprawdę dobre rzeczy o SICP .
źródło
Absolwent informatyki nie umie dobrze kodować po ukończeniu studiów; nie są tak bardzo poszukiwane, kiedy opuszczają uniwersytet. Tylko jeśli zdobędą doświadczenie.
Odpowiedź na twoje pytanie brzmi: musisz nauczyć się wzorców projektowych. Programowałem w Javie, .NET, a teraz pracuję jako programista PHP, JavaScript i MySQL. Nawiasem mówiąc. .NET ma bardzo duży poziom abstrakcji, np. ASP.NET. Oznacza to, że możesz pominąć naukę abstrakcji. Języki takie jak Perl, PHP itp. Mają niski poziom abstrakcji.
Przeczytaj Head First Design Patterns, to dobra książka. To dość obszerna książka. To wszystko, czego będziesz potrzebować.
źródło