Nauka programowania

0

Witam. Chciałbym się zapytać czy dobrze myślę wybierając swoją przyszłość w kierunku programowania. Za dzieciaka liznąłem trochę Pascal'a, później nastał czas na C++. W sumie w C++ zatrzymałem się na dziale wskaźniki i nie mogłem tego zrozumieć, po co tak na prawdę są te wskaźniki i do czego one są nam potrzebne w dzisiejszych czasach. Później padł pomysł, żeby nauczyć się Pythona lub Ruby. Głównie chodziło mi o ogólne zastosowanie 1 języka do kilku zadań. Chcę pisać skrypty, ale także w tym samym języku strony www. Takie podejście wydaje mi się dobre, ponieważ ucząc się Ruby lub Pythona mamy dostęp do pełno obiektowych języków, które stają się coraz bardziej popularne i można dzięki nim tworzyć różne rzeczy. Problem w tym, że chyba mam jakieś zaległości, bo czytając kursy Ruby/ Python wielu rzeczy nie rozumiem, a w książkach tak to jest tłumaczone jakby książka była napisana dla kogoś kto już programował w innych języku i wie o co kaman. Czy dobrym podejściem byłoby jakbym najpierw zabrał się za C, później C++, a po tym chciałbym zrozumieć Objective-C, ze względu na to, że niedługo zmieniam sprzęt na Mac Book'a i chciałbym pisać również aplikacje pod Mac OS X oraz IPhon'a. A może nie bawić się w C tylko od razu przejść na C++?. Są jakieś różnice oprócz tego, że do C++ dochodzi programowanie obiektowe?. Po tym jak zrozumiem ogólne działanie języków mógłbym wtedy przejść do Python/Ruby. Po prostu teraz wydaje mi się, że czytając książkę o nowych języku nie mam podstaw programowania, żeby wszystko zrozumieć. A jak to się mówi, że jak zrozumie się logikę jednego języka, to nauka drugiego języka to tylko przeczytanie składni i dopasowanie się do nowych "słów", które trzeba wpisać w edytor i skompilować lub nie. Ale nie wiem czy jest to dobre podejście, czy po prostu zamówić sobie jakąś książkę w języku Polskim do interesującego mnie języka. Teraz czytam angielskie ebook'i, ale sami wiecie, że różnie jest jak człowiek sobie sam przetłumaczy podpierając się translatorami itp. Niestety nie posiadam dużego zakresu słownictwa jeżeli chodzi o język techniczny. Z góry dziękuję za porady.

0
godzio89 napisał(a)

A jak to się mówi, że jak zrozumie się logikę jednego języka, to nauka drugiego języka to tylko przeczytanie składni i dopasowanie się do nowych "słów", które trzeba wpisać w edytor i skompilować lub nie.

To zdecydowanie źle się mówi. Język programowania to nie składnia.

http://mitpress.mit.edu/sicp/full-text/book/book.html - zacznij od tego, nie znam lepszej książki na początek.

0

OK, na pewno ją przeczytam:).

0

Generalnie prawdą jest, że gdy ogarnie się jeden język, to potem nauka kolejnych jest znacznie łatwiejsza. Składnia to ważny element języka. Języki takie jak C++, Java, Objective C, czy nawet PHP pod względem składni wywodzą się z C (głównie: rozszerzają C). Akurat Ruby i Python mają innych przodków.

Prócz samej składni bardzo ważne jest ogarnięcie biblioteki standardowej języka. Czyli np. w JavaScripcie wywołanie funkcji getElementById na obiekcie document można zapisać tak: document.getElementById('abc');. W przypadku C++, mogłoby to wyglądać ciut inaczej, np. document->getElementById("abc");. Zauważ różnice w składni: użycie -> zamiast kropki (przy założeniu, że document to wskaźnik) i cudzysłowów zamiast apostrofów. To różnice, jakie mogą pojawić się w wywołaniu funkcji. Ale trzeba jeszcze wiedzieć, jakie funkcje oraz obiekty zdefiniowane są w używanej przez nas bibliotece. W szczególności: w bibliotece standardowej języka. To nie taka mała rzecz, bo biblioteki standardowe mogą zawierać i tysiące elementów.

Biblioteki standardowe poszczególnych języków generalnie nie muszą mieć ze sobą nic wspólnego. Nie trzeba znać na pamięć wszystkich standardowych funkcji czy obiektów, ale warto te najważniejsze. Tutaj nauka jednego języka niewiele pomaga przy nauce drugiego...

...a może i nie? Bardzo ważną umiejętnością jest umiejętność szperania po specyfikacji biblioteki standardowej. Trzeba umieć znajdywać interesujące nas funkcje, a potem trzeba rozumieć ich opis i użycie. Gdy ktoś opanuje to dla jednego języka, to prawdopodobnie bardzo szybko nauczy się poruszać po specyfikacji innego języka. I nie będzie wchodził z płaczem na forum przy każdej okazji, gdy nie wie, jak nazywa się funkcja, która robi X lub Y. Dobre umiejętności googlowania też okażą się uniwersalne i przydatne.

Głęboka (dla przeciętnego zjadacza chleba!) znajomość syntaktyki (składni) języków potrafi też mocno pomóc. Wiele języków ma podobne elementy składniowe, takie jak instrukcje czy wyrażenia. Często są one zdefiniowane w podobny sposób. Gdy to ogarniesz, niestraszne ci będą nawet pozornie zaawansowane konstrukcje. Niektórzy mają problemy z prostymi w gruncie rzeczy zapisami. Np. takie coś jest dla nich jasne:

if (a + b == 4) {
...
}

A z takim czymś mogliby już mieć problemy:

if ( (foo(x - z) + bar(y % 5)) * baz() == 8) {
...
}

Tak naprawdę to składniowo nie dzieje się tu nic zaawansowanego, ale ludzie bez doświadczenia i znajomości syntaktyki mogą nie wiedzieć o co chodzi i mogą nie mieć pewności, co można umieścić w instrukcji warunkowej, a co nie.

Co do kupowania książek po polsku, to polecałbym to zrobić. Ja kupuję mnóstwo książek po polsku. Lubię czytać papierowe książki, ale i tak praktycznie nigdy nie kupuję wydań angielskich. Nie dlatego, że mam jakiekolwiek trudności z czytaniem -- nie mam najmniejszych. Raczej chodzi właśnie o kwestie słownictwa technicznego w ojczystym języku. Zdarza się, że ludzie na forum popełniają błędy, mówiąc np. o "wyrażeniu if", podczas gdy to nie wyrażenie, tylko instrukcja. Porozumiewanie się pomiędzy programistami (i nie tylko -- jeszcze np. z PM-ami) uważam za rzecz ważną i lubię robić to w miarę poprawnie, bez zbytniego nasycenia języka obcymi wyrazami.

Tak na marginesie, a propos składni, apostrofów, języków itp. Polecam Ci zapoznać się z zasadami użycia apostrofu w języku polskim ;). Jakimś cudem udało Ci się popełnić błąd przy bodaj każdym jednym użyciu w poście. Nie Pascal'a, tylko Pascala. Nie Mac Book'a, tylko MacBooka. I nie IPhon'a, tylko iPhone'a ;).

0
bswierczynski napisał(a)

Generalnie prawdą jest, że gdy ogarnie się jeden język, to potem nauka kolejnych jest znacznie łatwiejsza. Składnia to ważny element języka. Języki takie jak C++, Java, Objective C, czy nawet PHP pod względem składni wywodzą się z C (głównie: rozszerzają C).

Widzisz, składnia jest ważna, ale czy nie ważniejsza jest filozofia języka? Powołałeś się potem na JS, całkiem różny od większości wymienionych. Poza innymi formami ECMAScript tylko bodaj LUA i Perl (z bardziej popularnych języków) korzystają z dziedziczenia prototypowego, do tego JS kładzie nacisk na programowanie funkcyjne - prawdziwe, dobrze zrealizowane closures (Python dopiero od jakiegoś czasu ma je sensownie zrobione, Ruby miał z tym problemy jeszcze w 1.8.6), wszędobylskie funkcje anonimowe, funkcje wyższego rzędu (map

 w standardzie od 1.6)... Podejście typu 'inna składnia' jest dobre dla ludzi chcących się zamknąć w typowym programowaniu imperatywnym (w jego prymitywniejszych formach) i tylko zmieniać klamerki na <code noframe>begin

/end

.

Inny przykład: gdzieś w Newbie wisi jeszcze wątek z kodem w Pythonie. Pierwszy raz zwątpiłem naprawdę w swoje umiejętności przy próbie pracy z czymś napisanym w tym języku - nadmiarowe zmienne sterujące, ciągłe wymuszanie typów, wyjątki łapane wyłącznie w celu ustawiania flag błędów testowanych potem oddzielnie ifami... Po prostu C wciśnięte w nową składnię, razem ze statycznym typowaniem i masą innych typowych dla tego języka konstrukcji. 

Różnica pomiędzy typowaniami czy paradygmatami często stanowi realną przepaść, składnia jest wtedy najmniej ważnym czynnikiem.

 > ##### bswierczynski napisał(a)
> Zdarza się, że ludzie na forum popełniają błędy, mówiąc np. o "wyrażeniu if", podczas gdy to nie wyrażenie, tylko instrukcja.

Jako ciekawostka - <code noframe>if

w (Common) Lispie to special form, zaś 'kompletny', z argumentami, jak najbardziej jest wyrażeniem (symbolicznym) ;)

0
deus napisał(a)

Widzisz, składnia jest ważna, ale czy nie ważniejsza jest filozofia języka?

Trudno powiedzieć. Filozofii języka raczej się nie będzie miało ogarniętej bez pewnej wiedzy na temat składni. Nie potrafię powiedzieć, czy lepiej byłoby podejść do takiego JavaScriptu wcześniej ucząc się tylko PHP, czy tylko powiedzmy OCamla, gdzie programowanie funkcyjne to jedna z najważniejszych technik. Chociaż to porównanie i tak wydaje mi się niefortunne.

Pewne jest, że jeśli zna się standardowe, "prymitywne" programowanie imperatywne i składnię podobną do javy czy C, to wtedy doświadczenie w jakimś języku funkcyjnym szalenie się w JavaScripcie przydaje i jest IMO nawet ważniejsze niż doświadczenie w języku z programowaniem prototypowym.

Tak czy siak, na pewno prawdą jest, że większość ludzi programuje w JavaScripcie słabo lub bardzo słabo w sporej części dlatego, że nie potrafią wykorzystać nietypowych, ale bardzo potężnych i ważnych cech tego języka.

Na pewno też, jeśli mówimy o znajomości języka programowania na profesjonalnym poziomie, to po prostu TRZEBA znać zarówno składnię (i to tak dosyć dokładnie, a podstawy trzeba mieć w małym paluszku) jak i używane paradygmaty i techniki.

deus napisał(a)

Jako ciekawostka - if w (Common) Lispie to special form, zaś 'kompletny', z argumentami, jak najbardziej jest wyrażeniem (symbolicznym)

Tak jak ja to rozumiem, to twórcy języka mają sporą swobodę w określaniu, co jest wyrażeniem, co instrukcją, a co jeszcze czymś innym. Zwykle jednak ich wybór ma jakiś sens i w popularnych językach są to pojęcia w miarę uniwersalne. Mi chodziło oczywiście o konkretne przypadku, gdzie w języku X konstrukcję K nazywamy instrukcją, a ktoś mówi o niej jak o wyrażeniu, lub -- o zgrozo! -- o funkcji. Dotyczy to różnych języków. Nawet w przypadku CSS ludzie nie rozróżniają podstawowych elementów typu selektor, reguła, deklaracja. Utrudnia to komunikację.

W niektórych przypadkach wystarczy trochę uwagi przy czytaniu specyfikacji lub innych materiałów dostępnych po angielsku. Np. expression to wyrażenie, a selector to selektor ;). Czasem jednak nie jest tak łatwo. I taka instrukcja po angielsku określana jest jako statement. Mniej popularne elementy też mogą rodzić trudności z tłumaczeniem.

Domyślam się, że mało komu się chce szukać na własną rękę tłumaczeń takich terminów, gdy czyta jakieś artykuły anglojęzyczne. I tutaj pomaga oczytanie w polskich wydaniach książek.

0
deus napisał(a)
godzio89 napisał(a)

A jak to się mówi, że jak zrozumie się logikę jednego języka, to nauka drugiego języka to tylko przeczytanie składni i dopasowanie się do nowych "słów", które trzeba wpisać w edytor i skompilować lub nie.

To zdecydowanie źle się mówi. Język programowania to nie składnia.

http://mitpress.mit.edu/sicp/full-text/book/book.html - zacznij od tego, nie znam lepszej książki na początek.

Potwierdzam, dobra książka, właśnie brnę przez nią, aczkolwiek jest to trudne z powodu obcego języka w jakim ta książka jest napisana, a jakim ja kiepsko władam. Dzisiaj poszukując coś na temat Teorii Sygnałów w katalogu biblioteki uczelnianej znalazłem pewne coś co mnie bardzo zdziwiło. Nie wiem Deus czy nie wiedziałeś o tym, czy uważasz to tłumaczenie za kiepskie czy jesteś wcieleniem zła i każesz ludziom czytać angielskie książki, lub chcesz podnieść nasze umiejętności lingwistyczne jednak istnieje takie coś :

http://www.wnt.com.pl/product[...]=0&prod_id=1127&hot=1

Co sądzisz o tym ? Jak tylko wrócę z Tai-chi zabieram się za czytanie i zobaczę czy tłumaczenie jest w miarę rozsądne, aczkolwiek moja opinia na temat tłumaczeń, może nie być nie prawidłowa a na pewno całkowicie nie fachowa.

@godzio89
Naprawdę polecam tą książkę ( nie wypowiadam się w sprawie tłumaczenie, ponieważ nie mogę jeszcze nic powiedzieć na ten temat). Nie wiem, czy faktycznie znasz C i C++. Polecam naprawdę dobrze poznać te języki. Niektóre rzeczy zaczną denerwować a niektóre się przydadzą. Cały czas rozwijam się w tym zakresie i powiem, że znajomość C i C++ jest bardzo pożyteczna. Wczoraj zostałem brutalnie zmuszony do pisania w Javie. Nie uśmiechało mi się to, ze względu, że chciałem skupić się na C który można powiedzieć opanowałem bardzo dobrze i chciałem doskonalić się z zakresu samej struktury programów, stylu, algorytmów czy rozwiązań. Jakiś czas temu zainteresowałem się funkcyjnym paradygmatem, a tutaj uczelnia wciska mi Javę na dokładkę. Nic, idę na laborkę, siadam i klepie znów program rozwiązujący wielomiany, obliczyć szereg czy zakodować algorytm Hofstadter'a. Co ciekawe nie uczyłem się javy bo na tym poziomie jest zgodne z C++ ( owszem różnica w tym, że mamy główną klasę i inne biblioteki). Jeśli będę pisał kolejne ćwiczenia znając już te C++ wystarczy ze spojrzę do helpa czy dokumentacji i wiem że muszę użyć tego czy tego. Obok siedział student który nie miał pojęcia jak zakodować rozwiązywanie wielomianu 3 stopnia. Czy to wina braku wiedzy o składni ? Nie bo parę semestrów przecież klepał w c++ - brak umiejętności myślenia programistycznego. Programista odwala robotę inżynieria budownictwa czy architekta ,a przy tym po godzinach dorabia jako murarz. Sam widzisz, że murarz nie zaprojektuje domu, a inżynier po jakieś tam praktyce już potrafi sypać żwir do betoniary (czasami jakiegoś magistra znajdzie się na budowie ;p). Oczywiście doświadczenie w C czy C++ pomaga w językach o podobnej składni, a na pewno w paradygmacie imperatywnym. Sama znajomość składni i doświadczenie w C nie pomoże zbyt wiele w nauce ASM'a dla przykładu, chociaż programista C przynajmniej mniej więcej wie jak wygląda pamięć.

Można tutaj gadać i gadać, a ja proponuję, znajdź sobie wyzwanie. Jakiś duży projekt sobie wymyśl i spróbuj go zakodować. Wtedy dopiero wychodzą braki w jakiejś dziedzinie i można na bieżąco je korygować, lub spisać sobie listę TO DO. Moim zdaniem takie coś pomaga bardziej niż nauka kolejnego języka. Od tego jest dokumentacja, żeby rzucić okiem i na bieżąco przez praktykę uczyć się składni. Naprawdę nie czaje kumpli z roku którzy wertują książki i zakuwają słowa kluczowe i strukturę instrukcji ( np switch case ) lub ślęczą i zapamiętują "algorytm" programu z laborek - co ogranicza się do zapamiętania jakie po kolei były pisane instrukcje ... całkowicie bezmyślne postępowanie. Lepiej przez praktykę wyrobić sobie instynkt programisty, przy okazji ucząc się znajdować błędy a składnia przyjdzie sama. Jałowe mielenie kartek i pamięciówa powoduje kod typu :

if(a=0)

Polecam rozwinąć sobie umiejętność pisania kodu w imię zasad KISS i DRY, oraz kodować kilkukrotnie te same rzeczy w inny sposób. Zauważysz co jest lepsze i wyrobisz sobie styl który pozwoli tworzyć wydajne, zrozumiałe programy zawierające jak najmniejszą ilość błędów. Trzeba wypośrodkować czytelność kodu i jego obszerność. Czasami jest to nie możliwe, ale zawsze znajdzie się sposób zapisać kod krócej a przy tym bardziej zrozumiało, dla osoby która przyjdzie po tobie to poprawić czy inaczej wykorzystać. Czasy szalonych programistów tworzących systemy w bezsenną noc minęły bezpowrotnie już ... a właściwie to chyba w ogóle ich nie było ;p

0

Czyli chyba najlepiej będzie jak zacznę się uczyć C. Polecacie jakąś książkę lub kurs dla totalnie zielonego w programowaniu?;p. Potem przeczytam kurs programowania gier Xion'a, ale tutaj jest już C++. A może od razu przeskoczyć do C++?. Jak sądzicie?

0

Potwierdzam, dobra książka, właśnie brnę przez nią, aczkolwiek jest to trudne z powodu obcego języka w jakim ta książka jest napisana

Wszyscy się uwzięli na tą książkę? Ja przedwczoraj ją znalazłem (thx to google.pl) szukając jakiegoś dobrego tutoriala do scheme i również zacząłem czytać. Zapowiada się nieźle.

Nie wiem Deus czy nie wiedziałeś o tym, czy uważasz to tłumaczenie za kiepskie czy jesteś wcieleniem zła i każesz ludziom czytać angielskie książki, lub chcesz podnieść nasze umiejętności lingwistyczne jednak istnieje takie coś :

http://www.wnt.com.pl/product[...]=0&prod_id=1127&hot=1 napisał(a)

76.50 zł

Czyli chyba najlepiej będzie jak zacznę się uczyć C. Polecacie jakąś książkę lub kurs dla totalnie zielonego w programowaniu?;p. Potem przeczytam kurs programowania gier Xion'a, ale tutaj jest już C++. A może od razu przeskoczyć do C++?. Jak sądzicie?

Każdy na tym forum ma inne zdanie na temat tego jak należy zacząć. W sumie nie wiem co tu napisać żeby nie zacząć flamewaru więc się nie wypowiem ;-P.

0

Wiesz MSM wiedza kosztuje, nawet jeśli płacimy za wydruk jedynie - dla przykładu Real World Haskell kosztuje na Polskim rynku ponad 200zł. Wiem, niektórzy są kiepsko zarabiającymi studentami jeszcze ( np. ja ;p ), ale od tego są biblioteki. Biblioteka PWr jest naprawdę imponująca i można znaleźć tam bardzo fajne rzeczy i bardzo kosztowne. Obecnie mam na półce książki z biblioteki które w sklepie kupić można za ponad 1000zł, co nie oznacza, że zapłaciłem, a wypożyczyłem. Fakt nie jest to moja książka, jednak 6miesięcy to długo, poza tym można oddać i za 4h znów wypożyczyć na kolejne 6 miesięcy.

Co do C czy C++ - wszystko co dostarczy ci doświadczeń jest dobre. Tylko nie ucz się dziwnych rzeczy jak Logo czy Cobol bo to chyba strata czasu ( aczkolwiek ostatnio widziałem parę ofert pracy dla Cobolowców o_0 ) .Sklejanie programów z gotowych idiomów i algorytmów jest o wiele bardziej rozwijające niż pisanie hallo world w 145 języku jaki się uczymy. Składnia ma być prosta żeby jak najmniej przeszkadzała w programowaniu, ona powinna w pewnym momencie zniknąć, a zanim zniknie wspomagać się helpem i tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0