Jakiego języka programowania się nauczyć? – część 2

Matthew @ 2010-09-15 — Kategorie: Programowanie, Techblog

Poprzednim razem pisałem dla tych, którzy marzą, że po nauczeniu się jakiegoś języka programowania, szybko zapełnią swój garaż nowymi modelami Ferrari, Astona Martina czy Lamborghini. Tym razem postaram się skupić bardziej na odpowiedzeniu na pytanie ludziom, którzy wyżej stawiają sobie własny rozwój niż ciągnący się za nimi tłum piszczących nastolatek. Źle. Kto widział żeby za programistami ganiały nastolatki? W każdym razie wiecie o co chodzi.

Początek

Problem wyboru języka którego chcemy się nauczyć można podzielić na dwa przypadki: nasz pierwszy język i dowolnie następny. Od razu uprzedzam, nie napiszę nic o językach które miałyby (bezpośrednio) służyć do robienia stron internetowych. Nie zajmuję się tym, nie znam się (jakbym się na wszystkim znał to bym został jakimś guru albo założył własną religię), są lepsi ode mnie w tej materii. Jeżeli z jakiegoś powodu nie lubisz zajmować się dostosowywania CSSa pod różne przeglądarki. Poziom Twojej wrażliwości artystycznej nie pozwala Ci na rozróżnienie bohomazów przedszkolaka od współczesnej sztuki abstrakcyjnej. Czy po prostu kręci Cie bliskość z procesorem, jednak nigdy wcześniej nie programowałeś i chcesz wiedzieć od czego zacząć? Odpowiedź jest prosta: algorytmy!

Jednak je trzeba w czymś zaprogramować. Tutaj odpowiedź jest jeszcze prostsza. C! Nie Java/C#/Python/cokolwiek innego. C++, ze względu na swą kompatybilność z C jeszcze się nada. Czemu C? Z kilku powodów. Jest popularny, więc nie będzie problemem znalezienie materiałów do nauki. W językach programowania jest nad assemblerem, więc masz ten komfort i wygodę że nie musisz grzebać kodzie maszynowym procesora. Jednocześnie dzięki byciu niskopoziomowym językiem programowania jest na tyle prosty (i co za tym idzie – szybkim), że możesz zobaczyć jak to działa. Nie jesteś także zależny od tony ułatwiających narzędzi, które mogą być przydatne jeżeli chcesz szybko zrobić program dla klienta, ale w gruncie rzeczy prowadzą do „ogłupienia”. W końcu chcesz się nauczyć jak programować komputery, prawda? C właśnie Ci daje tą możliwość. Zapoznanie się z arytmetyką wskaźników (uproszczone adresowanie pamięci), zrozumieniem i implementacją zaawansowanych struktur danych. Lista nie tworzy się magicznie a zmienne nie istnieją w komputerze i wystarczy je wziąć sobie. Pamięć nie jest nieskończona i można ją dowolnie zapychać. Może się okazać, że jak już będziesz kilka lat pracował jako zawodowy programista, to w ogóle nie będziesz musiał się takimi rzeczami przejmować. Ale po to się należy wysilić na początku, żeby później było łatwiej. W nauce nie ma drogi na skróty. Jeżeli ktoś Ci mówi, żeby od razu zacząć się uczyć Javy czy C#, to mówi głupoty i jedyne co chce to zaspokoić swoje ego wmawiając sobie że jego ulubiony język programowania jest najlepszy na świecie i nadaje się do wszystkiego. Nie, nie nadaje się. Podejrzewam że osoba która tak mówi nawet 5 minut nie poświeciła na zastanowienie się co za tym wszystkim stoi i dlaczego jeszcze długo (w domyśle: nigdy) nie będzie mogła się okrzyknąć królem programistów. Ale cóż, niech dalej sobie żyje w swoim wyimaginowanym świecie. ;)

Co dalej?

Jeżeli już przebrnąłeś przez C (czy C++… chociaż tacy to pewnie jeszcze długo nie będą mogli powiedzieć że znają ten język) i zastanawiasz się co dalej? Odpowiedź jest równie prosta, co poprzednio: to zależy. Zarówno od platformy sprzętowej i systemowej, jak również od tego co dany projekt ma robić. Chociaż nawet jeżeli się nauczycie jakiegoś języka z zamiarem wejścia na konkretny rynek z konkretnym projektem to pewnie po drodze i tak odkryjecie tuzin innych zastosowań. Bardzo ogólnie można powiedzieć, że będąc fanem produktów Apple należałoby wybrać Objective C, dla Windowsa będzie to C#, dla Linuksa C/C++. Z podziałem na kategorie projektów: dla gier – C/C++, systemy pisane do obsługi firm – przeważnie Java/C#, urządzenia wbudowane czy tam gdzie liczy się wydajność (nie koniecznie przy małych zasobach) – asm/C/C++. A jeszcze są języki o niszowych zastosowaniach. Co gorsze, obszary wykorzystania różnych języków przeważnie nakładają się na siebie. Trzeba sobie odpowiedzieć na pytanie co chce się dalej robić i dążyć w tym kierunku. Chociaż zawsze można próbować poznać kilka języków, dla różnych zastosowań i wybrać to co się lubi najbardziej. Na pewno nie należy wierzyć ludziom którzy mówią, że teraz warto się uczyć X, bo ma takie a takie zastosowanie i jest wg. nich najlepszy. Tyle że te osoby zapominają, że to zastosowanie nie jest jedynym. Tak samo z językiem, na pewno istnieje dla niego alternatywa w danej dziedzinie.

Prawdziwa zabawa zaczyna się w momencie, kiedy już wybrałeś na co chcesz programować, znasz jeden czy dwa główne języki programowania dla tej dziedziny. I jako język mam tutaj na myśli również jego bibliotekę standardową. Przeglądamy oferty pracy a tam nagle pojawiają się wymagania odnośnie toolkitów czy frameworków. Ostatnio bardzo wyraźnie to widać w przypadku C++ i Qt, który niemalże szturmem zdobywa rynek urządzeń wbudowanych. Z mobilnymi trochę gorzej, ze względu na to, że Nokia przespała boom smartphone’ów, ale nowym Symbianem oraz pierwszymi telefonami z MeeGo Nokii może uda się wrócić do łask. Ale już nauczyliśmy się tych wszystkich dodatkowych bibliotek, wysyłamy CV, rozmowa kwalifikacyjna, uścisk szefa z okazji nowo przyjętego do pracy i… kolejna nauka. W tej chwili większość firm posiada swoje wewnętrzne toolkity lub frameworki w których piszą swoje produkty. Przez co znowu będzie trzeba się czegoś nauczyć. Można pracować w wielu firmach, na tych samych stanowiskach, teoretycznie robiąc to samo, a za każdym razem poznawać coś nowego.

Problem w programowaniu to nie jakiego języka się nauczyć, ale umiejętność rozwiązywania problemów przy pomocy dostarczonych narzędzi. Właśnie te wszystkie języki programowania, biblioteki, toolkity i frameworki są Twoimi narzędziami. Tylko wbrew temu co mówią niektórzy, że każdego narzędzia można się nauczyć. Nawet najlepszy chirurg, ze swoim skalpelem, nie musi być dobrym rzeźbiarzem czy malarzem. Trzeba po prostu znaleźć sobie interesujące zajęcia które można wykonywać ulubionymi narzędziami.

Komentarze:

Nic ująć, nie przychodzi mi też nic na myśl co dodać. Bardzo dobry wpis, +1.

Jeżeli chodzi o zaczynanie programowania (jako samej czynności) to nie wiem nad czym się tu rozwodzić. Pisząc w CZYMKOLWIEK (pomijając Brainfuck czy języki programowania w logice, etc.) możemy złapać podstawy. Potem wchodząc trochę głębiej możemy myśleć czy bardziej przemawiają do nas wcięcia czy klamry, albo jakikolwiek inne kryteria wyboru.

Myślę, że zaczęcie od C jest dobrym pomysłem.

Jak ktoś chce się uczyć obiektowości, to odpowiem: wszystko tylko nie C++ i inne języki, które pozwalają na to: http://en.wikipedia.org/wiki/Diamond_problem
Oczywiście, ktoś powie, że nie można sobie z tym poradzić (chociażby zliniaryzować diagram), ale ja o tym wiem, Wy o tym wiecie, a ktoś kto zaczyna, nie musi… Dlatego C++ moim zdaniem uczy złych nawyków i dlatego go nie polecam, chociaż sam w nim piszę całkiem dobre (mój dyplom jest właśnie pisany w C++).

Pozdrawiam,
daimyo

Ja właśnie bym polecał C++, sam od tego języka zacząłem się uczyć. Może i jest skomplikowany, ale na początku nie musimy poznawać przecież wszystkich zawiłości. Uczy również programowania wieloparydgmatowego, uczy arytmetyki wskaźników.

@daimyo: nie można zrzucać odpowiedzialności za złe nawyki programistów na język. W każdym języku da się odwalać takie czy inne kwiatki. To nie C++ uczy złych nawyków, bo język daje tylko możliwości. Jeżeli ktoś się uczy to powinien korzystać z takich materiałów które mu powiedzą wprost co jest złe a co nie. Język jest narzędziem, to jak z nożem, możesz go użyć do zrobienia pysznej kolacji albo do zrobienia komuś krzywdy. Przecież nikt nie stoi Ci nad głową z siekierą i grozi że jak nie zrobisz diamentu to Cie zabije.

Z resztą mówienie żeby nie uczyć się C++ (w sensie kategorycznym: nikt nie ma prawa się uczyć) jest głupie, bo raz że mamy kod który trzeba utrzymać, dwa nie mamy zastępstwa dla C++.

Czy dobrego programistę nie poznaje się po tym, że nie robi głupot?

Ogólnie rozgraniczmy dwie grupy ludzi:
– osoba, które chcą być power users z prawdziwego zdarzenia, ogarniać wszystko co kiedykolwiek zostało napisane i być, nazwijmy to: świadomych programistą
– czy może ktoś chce po prostu programować, żeby być lepszym w swojej dziedzinie (jak mój ojciec, który z zawodem informatyka ma nie tak wiele wspólnego, ale swego czasu programował jakieś zjawiska chemiczne, bo tak było łatwiej)

W takiej sytuacji, pierwsza grupa (moim zdaniem) powinna zacząć od C. Potem mamy dwie drogi. Albo lubimy M$ i piszemy w C# (macie tam chyba arytmetykę wskaźników jeśli się nie mylę i brak wielokrotnego dziedziczenia… W ogóle to taki ulepszony C++ trochę…). Jak ktoś nie lubi M$ to pisze w Java, potem C++. Następnie obie podgrupy biorą się za ASM i inne (dziwno)paradygmatowe języki, żeby dopełnić dzieła zniszczenia.

Druga grupa może swobodnie pisać w MatLab (tak niedocenianym na polskich uczelniach moim zdaniem). Pisze się miło, debuguje łatwo, choć tylko małe fragmenty kodu. Każdy chemik/fizyk/mechanik czy matematyk znajdzie tam jakiś plugin dla siebie.

daimyo

Według tego, to ja miałem całkiem spapraną drogę do obiektowego C++.

ActionScript2[strukturalny]
[wreszcie mam internet]
C
[zmiana systemu na linuks]
Asembler[ten normalny od Intela, od AT&T to jakiś joke?!][po 20 linijkach się poddałem]
Bash[minimum]
C++[strukturalny]
C[na mikro-kontrolery AVR/PIC]
Qt4[tak wiem że to nie język]
Python[strukturalny]
C++[trochę obiekowy]
php[minimum]/JS[minimum[IE to jakiś koszmar ;) uciekam stąd]]
ActionScript3[pełni obiektowy]/C++[pełni obiektowy]/Qt4[pełni obiektowy]

Tak dobrze widzicie, na powyższej liście czasowej nie ma Javy.

Ale ponieważ jestem bardzo dobry w projektowaniu algorytmów[16kiB losowych danych zmieścić w 7KiB razem z dekompresorem], to właściwie język nie ma znaczenia.
Chociaż przyjemnie jest pracując, w swoim ulubionym C++[Qt4]/AS3 ;]

Przemysław Serkowski @ 16 września 2010 o 08:01:

Ja nie lubie utrudniać sobie życia jakimiś bzdurnymi ideologiami ludzi którzy się na C czy asmie wychowali. Od początku nauki ucze się głównie C# i nie zawracam sobie głowy starociami gdzie często trzeba wymyślać koło od początku. 3 lata po technikum biore 3 tyś. na ręke ale przymierzam się do zmiany roboty bo w obecnej wieje ch… i nudą.

@Przemysław Serkowski: dziwne, bo jakoś programiści C/C++ nie wymyślają koła od początku, tylko mają je gotowe (chyba że biblioteka standardowa nie do tego służy). Szkoda tylko że jesteś tak krótkowzroczny i nie widzisz że gdyby nie Ci co wychowali się na C i asmie teraz, zamiast zarabiać tych 3k, to być gnój w polu przerzucał… w sumie 3k to też nie jest żadna rewelacja w 3 lata po szkole. Znam człowieka, który w 5 lat (gdzie nawet szkoły nie skończył) zarabia 5 razy tyle co Ty.

Przemysław Serkowski:

no właśnie… nuda.

Programuje W C/C++. Od tego języka (konkretnie C++, dzięki Jurek! (Grębosz)) zaczynałem i od razu stał się moim ulubionym. Programuje jednak też w Javie, C# i od potrzeby w JS, PHP, bashu, pythonie.

Język to tylko język. Służy do wyrażania tego co się ma w głowie w techniczny sposób. Jednak wg mnie dobrze, że zacząłem właśnie od C++. Uczyłem się go raczej powoli. Praktycznie przez 3 lata programowałem w C++ tylko strukturalnie. To całkowicie mi wystarczyło, by startować w konkursach algorytmicznych. Potem poznałem potęge programowania obiektowego, a potem przyszedł czas na życie.

I nagle się okazało, że muszę coś zaprogramować w Javie. Ok.. krótka analiza… hmm… to taki C++, tylko nie trzeba martwić się pamięcią. Potem C#. O, to taki C++, tylko że tutaj piszę sie dużo szybciej, bo Visual ma dużo lepsze wsparcie intelisenca dla niego, no i ma więcej lukru składniowego. Potem PHP. Deklaracje zmiennych? Tutaj możesz to olać. Itd… i tak niemal z każdym językiem.

C++ jest językiem o dużych możliwościach. Da się w nim zrobić niemal wszystko. Kolejnych języków uczyłem się przez analogię. Pracodawca zatrudniając mnie jako developera C/C++ po dwóch miesiącach kazał mi pisać w Javie. Nie pytał się, czy umiem, on to wiedział.

Programista C++, by pisać w nowym języku (nie wliczając języków innych paradymatów: lisp, prolog itd, itd) potrzebuje doszkolenia, nie nauki. Niemal z marszu jest w stanie zacząć dłubać. Za parę dni coś sensownego jest w stanie stworzyć.

nie wiem, czy jakikolwiek inny język daje możliwość tak łatwej migracji do innych języków.

no i zapomniałem napisać o tej nudzie.

Koleżanka zatrudniła się jako programistka PHP. Bardzo szybko stwierdziła, że ją to nudzi. „Ileż można klepać te formularze?”.

Ja w C++ non stop piszę coś nowego… i jeszcze nigdy się nie nudziłem ;)

„o taki C++, tylko nie trzeba martwić się pamięcią” – no, i ja potem muszę po takich co się „o pamięć nie martwią” poprawiać wycieki pamięci;)

A może warto pouczyć się trochę języka polskiego? ;) Ortografię sprawdzi słownik ale co z interpunkcją i umiejętnym budowaniem zdań?

Pozdrawiam.

@brsc: a może warto się odwalić? Nie podoba Ci się, to nie wchodź. Nikt Ciebie nie zmusza do czytania mojego bloga. A jak chcesz napisać coś bardziej konstruktywnego niż czepialski komentarz, to po prostu podeślij listę błędów (wraz z poprawkami).

@brsc:

jeżeli już zwracasz komuś uwagę, to przynajmniej rób to w sposób konstruktywny. Możesz zawsze wysłać autorowi posta wiadomość o błędach wskazując je. Staraj się trzymać zasady „chwal publicznie, gań na osobności”. Takie działania przynoszą najwięcej dobrego i są najlepsze dla społeczności :)

@Matthew:
chill out ;) Jak komentarz wg Ciebie jest nic nie wnoszący, zawsze możesz go skasować ;) Jeżeli faktycznie Twój post zawiera jakieś błędy (ja ich nie zauważyłem, ale „orłem” z j.polskiego nie jestem), to powinieneś nawet podziękować za sugestie. Co prawda jej forma pozostawia trochę do życzenia, ale swoją odpowiedzią raczej niczego konstruktywnego też tutaj nie wnosisz ;)

spokojnie chłopaki… wiadomo, że temat o wyborze języka programowania może być burzliwy… ale nie ulegajmy emocjom ;)

@noisy: nie lubię kasować postów bo później mi ktoś zarzuca cenzurę… i nie lubię też jak ktoś się głupio czepia więc reaguję ostrzej niż zwykle.

@noisy:
Pewnie masz rację ale lista błędów stylistycznych byłaby dość spora. Ja jestem trochę uczulony na kaleczenie języka i mimo, że post mi się podobał jakoś nie mogłem nie wbić tej szpilki ;)

@Matthew:
To był przytyk z przymrużeniem oka. Nie chciałem Cię obrazić czy zdenerwować. Nic do Ciebie nie miałem i nadal nie mam nawet po tej „ostrzejszej niż zwykle reakcji”. Jednak z Twojej rady dotyczącej nie czytania Twojego bloga chyba faktycznie skorzystam :)

Gustavo Barreto @ 8 października 2010 o 16:56:

Pozwolę sobie napisać w języku polskim, aby sądzić, że tłumaczenia z Polskiego na Portugalski są dobre. To samo odnosi się w odwrotnej kolejności.

Zgadzam się ze wszystkim powiedział. Ale chcę zrobić to opowieść o zaczynając od C: Ludzie myślą, że język „C” jest tylko dla trybu tekstowego i aplikacje, które nie może zrobić rzeczy graficzne. To dlatego, że wielu ludzi nie może zrozumieć, że „C” jest język i nie ma bibliotek i ram i „Java”, na przykład, nie wydaje się tak: Język i bibliotek / ram wydaje się wyjątkowy. Przynajmniej tak to w jaki sposób „Java” pojawia się na uczelniach w Brazylii.

Nadzieję, że ktoś zrozumiał coś:)

@Gustavo Barreto: zrozumieliśmy :) masz rację ;)

co do wstępu ;d to jak programista jest przystojny, młody to i nastolatki się fajne znajdą heh ;)

Chciałbym również podzielić się swoją historią początków programowania. Może komuś się to przyda:

Zacząłem od C++, gdyż znalazłem kurs w formie programu nazwany „Kurs C++ od zera do hackera” na płycie dołączonej do jakiejś gazety, być może do PC Worlda. Po przebrnięciu przez ten kurs czułem, że umiem programować, ale… nie wszystko rozumiałem. Ściślej nie mogłem pojąć wskaźników. Uzyskałem połączenie z internetem i nauczyłem się HTML/CSS. Denerwowało mnie to, że do każdej podstrony muszę „doczepiać” menu, nagłówek itp, więc szukałem rozwiązań, które zrobią to za mnie. JS mnie nie satysfakcjonował, więc wziąłem się za PHP. Zdziwiła mnie tutaj jedna rzecz: brak deklaracji zmiennych. Ale bardzo szybko pojąłem PHP i zacząłem w nim pisać swój własny CMS. Nauczyłem się w PHP również obiektowości, gdyż była tu dosyć uproszczona (ale wystarczająca). W liceum zaczęli nas przymuszać do poznania Pascala, w którym w końcu zrozumiałem ideę wskaźników i zacząłem z nich korzystać. Wróciłem do C++ w którym zacząłem w pełni wykorzystywać obiektowość. Któregoś dnia postanowiłem zrobić pierwszą aplikację okienkową. Przeraziło mnie WinApi, więc szukałem alternatywy. Trafiłem na Qt, spodobało mi się i korzystam z niego do dziś.

Ogólnie zajmuję się tworzeniem stron WWW, różnych programów, oraz łączenia jednego z drugim (głównie poprzez bazę danych, ale nie tylko). Na stronach WWW używam JS, chociaż nie powiedziałbym, że JS znam. Po prostu potrafię bardzo szybko odnaleźć potrzebne do wykonania czegoś funkcje (głównie zawarte w jQuery) i zrobić za ich pomocą to, czego mi aktualnie potrzeba.

Jak widać na mojej drodze nauki nie ma Javy i chyba nigdy nie będzie. Jakoś nie lubię Javy, gdyż taką samą przenośność mogę uzyskać w Qt, tyle że muszę kompilować dla każdego systemu osobno. Nie widzę więc potrzeby poznawania Javy :)

Jeszcze nikt nie wymienił języka Ada95 :) mało popularny język i dość trudny jak ktoś najpierw pisał w C++ (tak było w moim przypadku) ale za to można nim zrobić wiele.

Dodaj komentarz:

 

Subscribe without commenting