Nauczenie siebie, jako fizyka, bycia lepszym programistą [zamknięte]


17

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?


12
Pytanie: Skąd wiesz, że Twój kod jest wydajny?
Matsemann,

Widziałem wiele osób odmawiających C ++ jako pierwszego języka OO. Uczę się java i znalazłem samouczki wideo Marka Dextera tutaj eclipsetutorial.sourceforge.net/totalbeginner.html , są całkiem dobre i nauczą cię w sposób TDD. Zobacz także Head First Java, jest całkiem niezły w ukrywaniu Java w sposób OO.
Garv,

4
@DeveloperDon, obliczenia były centralną częścią fizyki jeszcze przed pojawieniem się komputerów elektronicznych. Obliczenia wykonano ręcznie lub na kalkulatorach mechanicznych. Od czasu II wojny światowej fizycy są głęboko zaangażowani w oprogramowanie. Jeśli obliczasz powrót komety, symulujesz wytwarzanie neutronów w reakcji łańcuchowej w jądrze lub analizujesz gigabajty danych szukających oznak bozonu Higgsa, musisz wykonać wiele chrupnięć. W 1974 roku pierwsza połowa mojego pierwszego roku laboratorium fizyki była poświęcona nauczaniu FORTRAN.
Charles E. Grant,

1
@DeveloperDon Kiedy np. Fizycy z CERN-u otrzymują dane, otrzymują dane z milionów zderzeń cząstek. Potrzebujesz komputera do obsługi tej ilości informacji. Weź również pod uwagę obszar taki jak fizyka ciała stałego, w którym próbujesz zrozumieć makroskopowe właściwości materiału na podstawie mikroskopijnych oddziaływań atomów. W takim systemie pojedynczy elektron odczuwa odpychanie / przyciąganie od miliardów jąder i elektronów - a do dokładnego opisania takiego układu potrzebny jest szybki komputer i wydajne algorytmy (oraz kilka dobrych aproksymacji do podstawowych równań).
user787267,

1
Może powinieneś zmienić język z C / C ++ na Python, aby mieć więcej czasu? Python jest często używany przez naukowców , istnieją moduły takie jak NumPy - pakiet do obliczeń naukowych w Pythonie lub SciPy . Jeśli potrzebujesz prędkości C / C ++ w Pythonie, a następnie użyj Cython , pozwala to na używanie typów i struktur C / C ++, dzięki czemu uzyskujesz prędkość podobną do C / C ++, można również łatwo zintegrować z istniejącymi bibliotekami C / C ++ za pomocą Cython.
Czarek Tomczak

Odpowiedzi:


20

Pamiętaj, że nie mam czasu na przeczytanie kilku 1000 stronicowych tomów na temat programowania abstrakcyjnego.

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 .


Dzięki za linki, przyjrzę się temu. Wiem, że nie zostanę guru kodowania w weekend, jednak spodziewam się stopniowej poprawy z czasem - szczególnie jeśli szukam inspiracji poza fizyką (jako, że wielu fizyków, których znam, nie może mniej dbać o dobre praktyki kodowania).
user787267,

1
Dodałbym Pythona w narzędziach jako czytelną liczbę
Xavier Combelle

2
+1 za sugerowanie ukończenia kodu. To naprawdę najlepsza rzecz, jaką operator może przeczytać, aby rozwiązać dany problem.
JW01,

9

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.


MentorNet wygląda bardzo interesująco - przyjrzę się temu. Czy przejście od fizyka do inżyniera oprogramowania było trudne?
user787267,

@ user787267 Ponieważ byłem zainteresowany programowaniem (i byłem już programistą hobbystycznym), byłem zmotywowany do przejścia, ponieważ wygląda na to, że jesteś, więc nie miałem trudności ze stroną techniczną. To, co zajęło mi dłużej, to opanowanie mokrego oprogramowania: zrozumienie mojego miejsca w większym zespole projektowym i kto był ekspertem w tej wielkiej zmianie od kodowania „samotnego wilka”, który robiłem wcześniej.

5

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:

„Muszę spędzać czas na fizyce”

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ą:

  • Aplikacja ze sprzętem, systemami osadzonymi.
  • Istniejący projekt, który chcesz jako punkty początkowe.

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?


4

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.


Dzięki za linki! Na pewno się tym zajmę (ale nie sądzę, żebym miał czas na przeczytanie kilku książek - chociaż w pewnym momencie przeczytałem przyspieszone C ++ w szkole średniej). Pracuję w środowisku uniksowym (używam Vima jako edytora i podoba mi się), i używam make i Valgrind. Włączyłem także opcję -edantic w gcc i -Wall, ponieważ bardzo pomaga. Może powinienem wspomnieć, że wykonuję obliczenia o wysokiej wydajności (z biblioteką MPI do programowania równoległego) na superkomputerze uniwersytetu.
user787267,

Powinienem również wspomnieć, że Python nie jest tak naprawdę opcją, ponieważ mój kod musi być bardzo szybki - chociaż podoba mi się to na przykład podczas drukowania. Bardzo często korzystałem z Matlaba.
user787267,

Dość często używam Pythona jako front-end do rozmowy z procedurami zaimplementowanymi w moim własnym C ++. Dzięki Boost jest to naprawdę łatwe i zyskujesz pełną elastyczność Pythona (np. Do przetwarzania danych do wydruku). Ponadto Python jest całkiem fajny do prototypowania. Kiedy wiem, że coś staje się kluczowe, zawsze mogę przenieść go do C ++. Ponieważ wspominasz o MPI, polecam spędzić wieczór z IPython, który tworzy przyjemny interfejs dla przetwarzania rozproszonego.
Benjamin Bannier

@ user787267 Nie jest już prawdą, że Python działa wolno - spójrz na przykład na youtube.com/watch?v=Iw9-GckD-gQ . Kluczem jest to, że możesz użyć Pythona, aby szybciej napisać działający kod, który możesz następnie przyspieszyć o 1) za pomocą numpy / scipy 2) za pomocą Cython lub shedskin oraz 3) umieszczając tylko główny algorytm w module C / C ++ lub FORTRAN, jeśli naprawdę potrzebujesz tej ostatniej 5% poprawy. Pamiętaj też, że czas poświęcony na kodowanie to czas, w którym kod jeszcze nie działa, więc czasami może być bardziej efektywne, aby napisać kod o wydajności 80% w połowie czasu
Tobias Kienzler

Zwykle wykonuję prototypy w Matlabie, aby przetestować proste rzeczy, ale chciałem na chwilę przejść na Python. Rzucę na to okiem. Z powodu dużej części mojego kodu napisanego już w C ++ nie chcę jednak zmieniać języka w połowie. Chociaż prawdą jest, że musisz również wziąć pod uwagę rzeczywisty czas programowania (i uwierz mi, tak robię), nie sądzę, że powinno to być usprawiedliwieniem, aby nie doskonalić swoich umiejętności programowania (stopniowo).
user787267,

4

Jak ocenić, czy moja praca jest dobra z perspektywy programisty?

  • 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.


3

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.


Czytanie i uczestnictwo w projektach open source jest w rzeczywistości bardzo dobrym pomysłem - ale coś, co musiałbym robić w wolnym czasie (ale ponieważ lubię programować, nie powinno to stanowić większego problemu). Jednym z powodów, dla których chcę zostać lepszym programistą, jest to, że nie jestem pewien, czy zostanę w środowisku akademickim. Kiedy mój doktorat jest skończony Mogę po prostu dostać pracę w branży - i tutaj wykwalifikowany programista powinien być bardzo poszukiwany. Innym powodem jest satysfakcja intelektualna z tworzenia czegoś eleganckiego / pięknego - na przykład rozwiązanie naprawdę trudnego równania różniczkowego.
user787267,

Niestety przemysł wymaga umiejętności, których zwykle nie zdobywasz w ramach rozwoju akademickiego. Rzeczy, które napiszesz podczas badań akademickich, to zwykle mniej niż 5% kodu źródłowego aplikacji komercyjnej.
Andrzej Bobak,

3

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:

  • Czy łatwo będzie to zmienić?
  • Czy to łatwo przetestować?
  • Czy mogę to uprościć? Czy mogę to łatwo zrozumieć, gdy zobaczę to ponownie za 3 miesiące?

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.


2

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,


1
Ale C jest jeszcze bardziej niezarządzany niż C ++. W C ++ jest co najmniej RAII.
Benjamin Bannier,

Lubię kodować, więc chcę zostać lepszym programistą. Po pierwsze jestem fizykiem, a po drugie programistą, ale to nie znaczy, że nie powinienem doskonalić swoich umiejętności programistycznych - w końcu, jeśli zdecyduję się opublikować mój kod wraz z wynikami naukowymi, lepiej mieć fajne, czytelny kod.
user787267,

2

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.


Sporo czasu spędzam na Stack Exchange - to dla mnie nieocenione źródło w mojej codziennej pracy. Często korzystałem z Matlaba, ale bardzo łatwo jest rozwinąć złe nawyki, takie jak nieprzydzielanie tablic, ponieważ jest to bardzo wybaczające.
user787267,

+1 za python @ user787267 Naprawdę nie rozumiem, dlaczego nie przydzielanie tablicy jest złym nawykiem
Xavier Combelle

2

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.


Chociaż fizyka jest potencjalnie bogatym źródłem metafor, celem XP jest znalezienie metafory, która ułatwia komunikację z klientem na miejscu i innymi członkami zespołu, więc zwykle wybierają metafory, które są bardziej zrozumiałe.
Pete Kirkham

2

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 .


-5

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ć.


Mam pojęcie, dlaczego ta odpowiedź została odrzucona, ale może przyda się, jeśli downvoters powie dlaczego?
Pierre Arlaud
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.