Jaki język programowania na początek?

12 may 2022
Jakub Rojek Jakub Rojek
Zdjęcie autorstwa Clément Hélardot na Unsplash (https://unsplash.com/photos/95YRwf6CNw8)
Categories: Programming, IT fundamentals

Dzisiaj omówimy temat bardzo istotny, a jednocześnie często poruszany w rozmowach wśród znajomych lub w mediach społecznościowych. "Programowanie" jest terminem towarzyszącym nam od dawna, a jednak nadal potrafi elektryzować coraz więcej ludzi i dotyczyć szerszej gamy branż. Widziałem już nawet stwierdzenie, że umiejętność pisania programów jest obecnie podstawowym rzemiosłem nowoczesnego człowieka. Trudno mi się w pełni z tym zgodzić, jednak nie da się ukryć, że bardzo wiele osób, skuszone szerokimi perspektywami w branży IT, chce przekwalifikować się na zawód programisty. Pamiętajmy też, że nadal, jak w wielu profesjach, mamy tutaj duży procent osób wchodzących w ten świat w młodym wieku, z pasji, czasami ogarnięte wizją tworzenia gier wideo (do tego grona zalicza się niżej podpisany). Jeszcze inni próbują swoich sił na zasadzie uskuteczniania hobby z możliwością napisania skryptów czy narzędzi ułatwiających swoją "normalną" pracę.

I z tych powodów często słyszy się pytanie - od jakiego języka programowania powinienem/-nam zacząć? Często ta wątpliwość jest wypowiadana z nadzieją, że istnieje jedna uniwersalna odpowiedź otwierająca bramy niezmierzonych możliwości. Czy tak jest w istocie?

Cóż, sprawdźmy.

Dlaczego ludzie chcą nauczyć się programować?

Na to pytanie poniekąd odpowiedziałem już we wstępie, jednak warto rozwinąć ten wątek. Jeszcze kilkanaście lat temu najczęstszym powodem chęci nauki programowania była po prostu ciekawość i zainteresowania związane z komputerami u młodych ludzi. Takim osobom (właśnie szczególnie na szkolnym etapie życia) łatwiej jest chłonąć nowinki i "zachłysnąć" się tematem, w efekcie czego wiele z nich zaczyna wykorzystywać swoje umiejętności i wiedzę już komercyjnie, nierzadko osiągając znakomite rezultaty, natomiast zdając sobie też sprawę z tego, że w tej branży takich jak oni jest mnóstwo.

W ostatnich latach coraz wyraźniej widać też osoby, które chcą się przebranżowić - traktują rynek IT jako typowe nowe miejsce swojej drogi zawodowej. Nie oznacza to, że podchodzą do programowania bez emocji - te historie są bardzo różne. Czasami jest to ukryte marzenie z młodości, aby zająć się tym na poważnie, czemu na drodze stanęła zwykła proza życia. W każdym razie, różnica pomiędzy takimi osobami, a omawianymi wcześniej "młodzianami" polega na tym, że w tym przypadku mamy do czynienia z dojrzałymi ludźmi, którzy dobrze wiedzą, czego chcą i w jakiej dziedzinie widzą swoją przyszłość. Nie będą rzucać się na każdą nowość z czystej pasji, ale dobrze selekcjonują swoją drogę początkującego programisty. O ile wiedzą jak.

Warto jeszcze wspomnieć o osobach, które programowania chcą nauczyć się z ciekawości lub z chęci wsparcia swojej pracy, np. na uczelni. W tym przypadku można powiedzieć, że jest to połączenie pierwszej grupy z drugą - w wolnych chwilach stopniowo uczą się nowych rzeczy, próbują i kombinują, aby dojść do poziomu pozwalającego im napisać konkretną aplikację. Można to przyrównać do majsterkowania, które wypełnia czas i uspokaja (taaak, jakby tylko programowanie mogło uspokajać...), a jednocześnie wynika z niego coś pożytecznego.

Oczywiście, powody mogą być jeszcze inne - każdy człowiek ma swoje pobudki, motywację i potrzeby w tym zakresie. Nie ma co wszystkich wrzucać do jednego lub nawet kilku worków. Między innymi dlatego tak trudno jest uniwersalnie doradzić w sprawie początku przygody z programowaniem.

Czy język programowania ma znaczenie?

Źródło: olia danilevich (https://www.pexels.com/pl-pl/zdjecie/mezczyzna-osoba-biurko-laptop-4974915/)

To pytanie może wydać się zabawne, ale czasami spotykamy się ze stwierdzeniem, że "język programowania jest nieistotny, liczy się sama umiejętność programowania i myślenia jak programista". Nawiązuje to do faktu, że tak naprawdę pisanie kodu to umiejętność planowania, logicznego rozumowania, umiejętności wykorzystania różnych technik wspólnych dla wielu języków, a dopiero na końcu znajomość konkretnych reguł związanych z danym językiem. To podejście sugeruje, że dobry programista poradzi sobie z każdym (lub większością) języków i szybko przyswoi sobie tajniki nowej technologii. I w dużej mierze jest to prawda, tylko że dotyczy doświadczonych specjalistów - a co z początkującymi?

Moja odpowiedź brzmi: dla nich wybór języka zdecydowanie ma znaczenie. Gdybyśmy potraktowali ich jak doświadczonych koderów, to oznaczałoby, że powinni nauczyć się teorii pisania programów, podstawowych pojęć i paradygmatów, a to wszystko w oderwaniu od pisania jakiegokolwiek programu (lub korzystając z pseudokodu zapisywanego na kartce papieru). Owszem, to wszystko powinni poznać, ale w swoim czasie i przy okazji uczenia się danego języka oraz przygotowywania prostych aplikacji. Inaczej taka początkująca osoba szybko się zniechęci, a przecież uczenie się czegoś, co nam się podoba, jest niezmiernie istotne. Można to porównać do uczenia się języka obcego, w którym najpierw poznajemy całą gramatykę, czasy i konstrukcje językowe, ale wszystko bez słówek. To szybko skończyłoby się obrzydzeniem do koncepcji przyswajania sobie takiej mowy - zamiast tego lepiej łączyć to ze słówkami lub nawet zdecydować się na początek na podejście z Duolingo, w którym reguły gramatyczne poznajemy przy okazji.

Wybór języka programowania ma też duże znaczenie, ponieważ mają inne przeznaczenie i popularność - bez sugestii od doświadczonego kolegi lub koleżanki, początkujący może przypadkiem wybrać nie tylko mało używaną technologię, dla której nie znajdzie wielu porad w sieci (np. Pascal, bo "coś o nim słyszałem i nawet znalazłem na półce książkę z 1999 roku"), ale też taką, która zupełnie nie będzie korespondować z typem aplikacji, do którego aspiruje dana osoba.

To kolejny czynnik pokazujący, że dobry wybór języka na początku może być startem przyjemniej przygody, a nie męczarni na zasadzie "nie lubię tego, ale wiem, że muszę". Na wstępie początkujący powinien przemyśleć sprawę i określić, w jakim typie aplikacji chce spróbować swoich sił (webowe, mobilne, gry itd. - jeszcze wrócimy do tego tematu) oraz czy chce wkroczyć na rynek komercyjny, a jeśli tak, to w jakim zakresie - ze swoją działalnością, do mniejszej lub średniej wielkości software house'u czy korporacji. Oczywiście, to nie jest tak, że od początku trzeba znać odpowiedzi na te pytania, ale nie da się ukryć, że tak, jak w przypadku oprogramowania, dobre sprecyzowanie wymagań pozwoli zwiększyć prawdopodobieństwo dobrego poprowadzenia drogi do sukcesu.

Od jakiego języka programowania zacząć?

W końcu dochodzimy do odpowiedzi na to pytanie. Jak już zdążyłem wspomnieć, ten wybór zależy od wielu wytycznych, ale dobrze wiemy, że zawsze znajdzie się grupa osób, która albo jeszcze nie jest w stanie określić swoich oczekiwań, albo po prostu potrzebuje impulsu w postaci jednej nazwy, która ich popchnie do dalszego szukania materiałów. Dlatego na początku napiszę, który język programowania można moim zdaniem w ciemno polecić na początek, nie znając kontekstu. A tym językiem jest:

JavaScript

Głównym argumentem jest to, że przez lata stał się językiem ogólnego przeznaczenia. Oczywiście, najbardziej kojarzony jest z aplikacjami webowymi (zarówno prostymi stronami internetowymi, jak i całkiem skomplikowanymi portalami), ale jak najbardziej można nim się posłużyć także przy pisaniu aplikacji mobilnych (co sami wykorzystujemy za sprawą Apache Cordovy i Ionica), a także aplikacji desktopowych (Electron). Dzięki rozwojowi Node.js i różnych frameworków, JS może być podstawą nie tylko dla frontendu, ale też backendu. Z tego powodu na rynku jest popyt na specjalistów w tej technologii (aczkolwiek zdecydowanie dominuje tutaj frontend), także nie będzie to wybór zmarnowany w pespektywie przebranżowania się.

Także pod kątem poziomu trudności jest to bardzo przystępny język, choć krążą o nim (niepozbawione słuszności) legendy o dziwnym zachowaniu w pewnych sytuacjach. Ma też składnię zbieżną z większością języków programowania w powszechnym użyciu, co oznacza, że poznanie innej technologii nie będzie utrudnione poprzez przyzwyczajenie się do innego sposobu pisania kodu (z tego powodu nie jestem zwolennikiem polecania Pythona na początku, choć ten język również nadaje się na start). Dodatkowo, pisanie w JS-ie nie wymaga instalowania specjalistycznych i trudnych w zrozumieniu narzędzi - do podstawowej nauki wystarczy zwykły notatnik (choć polecam Visual Studio Code, ew. Notepad++) i XAMPP, aby móc uruchomić stronę internetową zawierającą skrypt napisany w JavaScripcie. Nieco inaczej wygląda sprawa w przypadku Node.js (a więc m.in. TypeScripta, umożliwiającego pisanie np. w Angularze czy w frameworku React), jednak również to nie jest specjalnie skomplikowane.

Na pewno nie jest to język idealny, jednak takiego nie ma, a JavaScript spełnia wiele punktów, które mogą być wartościowe dla początkującego adepta sztuki programowania - to technologia stosowana bardzo powszechnie, nietrudna w zrozumieniu, wybaczająca dużo błędów, uniwersalna i od dawna obecna w branży IT. Oczywiście, wymagająca wsparcia HTML5 i CSS, jednak w tym tekście zajmujemy się typowo językami programowania, podczas gdy wszechobecny w sieci i stosunkowo prosty HTML jest językiem znaczników. Także naukowcy mogą znaleźć w JS-ie komponenty, które będą im potrzebne do pracy (np. do uczenia maszynowego czy wykresów), choć w tym przypadku lepiej sprawdzi się Python lub inne, bardziej wyspecjalizowane środowiska.

Wiemy już zatem, jaki język mógłby zostać polecony na zasadzie "strzału w ciemno". Jednak zauważmy, że w zależności od preferencji osoby i jego planu na rozwój programistyczny, warto znać inne możliwości, które mogą być lepszym lub gorszym wyborem w różnych sytuacjach. Zróbmy zatem taki przegląd.

Źródło: Sharon McCutcheon (https://www.pexels.com/pl-pl/zdjecie/fotografia-z-wykorzystaniem-obiektywu-tilt-shift-pieciu-roznych-warzyw-1196516/)

Jeśli w centrum zainteresowania są aplikacje webowe, to mamy bardzo szerokie spektrum języków - jest nielubiany przez wielu PHP, wykorzystywana w korporacjach Java (ew. C#) oraz Python. To tutaj też największe triumfy święci JavaScript, zwłaszcza po stronie frontendu. I w tym przypadku należy doprecyzować, czy daną osobę bardziej interesuje praca nad częścią widoczną w przeglądarce i interfejsem (wówczas należy skupić się na JS, HTML5 oraz CSS), czy backendzie, a więc logice działania aplikacji na serwerze i operowanie na danych. PHP ma złą sławę (choć nieco na wyrost - w przyszłości wrócimy do tego tematu), ale szczególnie dobrze sprawdzi się w przypadku mniejszych stronek (co nie oznacza, że nie posłuży do napisania potężnych aplikacji - sami jesteśmy tego przykładem). Java jest z kolei bardzo związana ze środowiskiem korporacyjnym i polecałbym tę technologię tylko w przypadku, kiedy początkujący kieruje swe oczy właśnie w kierunku jak najszybszego znalezienia pracy w tym sektorze.

W przypadku aplikacji mobilnych należy uszczegółowić tę kwestię i określić system operacyjny. Na rynku istnieją bowiem specjaliści od Androida oraz iOS-a i raczej trudno łączyć te dwie funkcje z uwagi na różne technologie, które są z nimi związane. W przypadku systemu wspieranego przez Google'a zdecydowanie należy zająć się Javą i/lub Kotlinem, choć warto pamiętać, że są to dwa zbliżone do siebie wybory. Z kolei osoby zainteresowane urządzeniami Apple'a powinni zainteresować się Swiftem (niegdyś istniał jeszcze Objective-C, jednak od dawna to Swift jest oficjalną technologią iOS). Oczywiście, także w tym przypadku nadal istnieje możliwość pisania aplikacji w JavaScript, wykorzystując rozwiązania w postaci Apache Cordova czy Ionic. Nie wolno również zapominać o Flutterze, jednak w tym przypadku nie polecałbym go początkującym ze względu na dużą specyficzność i stosunkowo małą popularność.

W wielu przypadkach bezpośrednim motywatorem może być chęć pisania gier wideo i w tym przypadku przez długi czas wybór był właściwie jeden - należało uczyć się C++ jako technologii proponującej najlepszy kompromis pomiędzy wygodą a wydajnością, która jest tak istotna dla tego segmentu. Przez lata spektrum możliwych technologii stopniowo się poszerzało, jednak nadal C++ jest królem w tej kategorii. Aczkolwiek warto nadmienić, że w przypadku gier być może warto zacząć od wyboru nie języka, a silnika. Ten temat zostanie jeszcze poruszony w dalszej części tekstu.

Osoby pragnące nauczyć się programować ze względu na pracę naukową bądź zastosowanie metod uczenia maszynowego, powinny zainteresować się Pythonem. Jest to język o ogólnym przeznaczeniu i przez wielu uważany za bardzo łatwy do nauczenia się ze względu na przyjazną składnię. Tutaj jednak warto nadmienić, że może to być zarówno zaletą, jak i wadą, gdyż przejście z Pythona do innego języka, wykorzystującego "klamerki", może być bolesne. Natomiast ta technologia wyróżnia się ogromem bibliotek, także właśnie do zastosowań naukowych. Nie jest to jedyny wybór - równie interesująca jest Java, a nawet wspomniany już wielokrotnie Node.js (czyli JavaScript), choćby z bibliotekami Brain.js lub Tensorflow.js. Zerknijcie do tego artykułu.

Na koniec warto przyjrzeć się wyborom w przypadku osób mających skłonności do programowania różnorakiego sprzętu lub systemów. Niestety, tutaj wybór bardziej podyktowany jest specyficznym środowiskiem, do którego początkujący się przymierza, ale chyba bezpiecznie można wskazać C, C++ oraz Python - ten ostatni jest zdecydowanie najwygodniejszy z wymienionych i dobrze współpracuje z popularnym Raspberry Pi. Natomiast do bardziej niskopoziomowych zastosowań warto zaprzyjaźnić się z dwoma wcześniej wymienionymi językami. Istnieją też urządzenia, w których dostępne są biblioteki dla Javy (np. drukarki) - to tylko pokazuje, jak bardzo zróżnicowana jest ta branża.

Oczywiście, jak wszystko w IT, także dostępne i rozważane technologie ulegają zmianie, podobnie jak zastosowania i oczekiwania od aplikacji. Dlatego warto śledzić zestawienia najbardziej popularnych technologii w danym roku, jak np. te od Stack Overflow czy GitHuba. Ale nie tylko - szerszy opis możecie znaleźć także w zestawieniach związanych z edukacją, jak np. w tym serwisie uniwersyteckim lub tym powiązanym z Berkeley. Natomiast należy wiedzieć, na co patrzeć i nie ulegać każdemu zestawieniu - pierwsze miejsce w rankingu najpopularniejszych języków nie jest wcale powodem do nauczenia się danego "dialektu", gdyż zależy to od zbyt wielu czynników. Zawsze warto dopytać osobę bardziej doświadczoną od nas - jest duża szansa, że skieruje do materiałów odpowiednich dla naszego poziomu zaawansowania. To zresztą również rada dla programistów, którzy już są zaznajomieni z tematem - nie zawsze "rzucanie się" na każdą nową technologię jest najrozsądniejszym krokiem.

Czy warto zaczynać od frameworka?

Frameworki są gotowymi modułami napisanymi w danym języku programowania, które ułatwiają pisanie konkretnego typu aplikacji, w efekcie czego programista może bardziej skupić się na samej logice biznesowej niż pisaniu fundamentów działania np. strony internetowej. Skoro jest to ułatwienie, a w ofertach pracy podawane są konkretne nazwy, to być może warto zacząć nie od samego języka, tylko właśnie frameworka i poznawać jednocześnie jedno i drugie? Odpowiedź nie jest taka oczywista.

W pewnych przypadkach rzeczywiście jest to słuszne rozwiązanie - mam tutaj na myśli szczególnie świat gier wideo, w którym programiści tworzą produkcje korzystając z gotowych silników gier czy grafiki i budują aplikacje składające się z klocków, doprawiając je kodem. Tutaj jest to naturalne rozwiązanie, gdyż w ostateczności można stworzyć program nie umiejąc kodować lub robiąc to w bardzo ograniczony sposób.

Jednak w ogólności skupienie się na jednym frameworku może być o tyle problematyczne, że początkujący będzie miał problem z rozróżnieniem, co jest elementem języka, a co danego narzędzia. Czasami spotykałem się z programistami, którzy deklarowali, iż mają pewne doświadczenie w frameworku React, po czym trafiali do projektu z Angularem i... zachowywali się jak dzieci we mgle. Oba silniki korzystają z jednego języka (JavaScript, a konkretnie TypeScript), jednak dla osoby, która typowo uczyła się Reacta, a nie JS-a, nie było jasne, które "zachowania" może przenieść do bliźniaczej technologii. Dodatkowo, frameworki często wymagają już pewnej ogólnej wiedzy programistycznej, która pozwala wykorzystać udostępnione "klocki" w odpowiedni sposób, a tej orientacji, z oczywistych względów, nie posiada początkujący.

Dlatego nie jestem zwolennnikiem rozpoczynania nauki od konkretnego frameworka - polecałbym na początek zaznajomienie się z językiem, jego składnią i włączenie wybranego silnika nieco później. Chyba że traktujemy naukę programowania jako typowe szkolenie do starania się o daną pracę z konkretnymi wymaganiami lub mamy jasny pomysł na aplikację - wówczas wybór staje się prostszy, aczkolwiek warto pamiętać o tym, aby poznać różnicę pomiędzy składnią charakterystyczną dla danego frameworka, a ogólną dla języka.

Osobną kwestią są CMS-y takie jak Wordpress czy Drupal - to także narzędzia umożliwiające tworzenie stron WWW bez wiedzy (lub z minimalną) o programowaniu. Jest również zapotrzebowanie na takich specjalistów na rynku, choć warto wspomnieć o tym, że CMS-y są związane często z tworzeniem prostych, wręcz seryjnych stron i wiele osób powie, że nie jest to "prawdziwe" programowanie.

Jak nauczyć się programować?

Dzięki Internetowi potencjalny adept sztuki programowania ma praktycznie nieograniczone możliwości wyboru drogi, którą chce podążać. Jest to jednak również przekleństwo - opcji jest tyle, że trudno wybrać jedną, właściwą.

Oczywistą ścieżką są tutoriale dostępne w Internecie, które umożliwiają start i zapoznanie się z podstawami języka czy technologii. W przypadku JavaScriptu można podać choćby JavaScript.info, Tutorials Point, a nawet coś, co wielu ekspertów by odradziło ze względu na mnogość błędów i zaszłości, czyli W3Schools. Materiałów jest naprawdę dużo i jest z czego wybierać.

Istnieją również inne drogi - wideotutoriale oraz książki (jednak nie zawsze jest to dobry wybór). W tym miejscu należy też wspomnieć o płatnych szkoleniach i bootcampach, od których wiele osób zaczyna swoją ścieżkę ku komercyjnemu programowaniu. Jest to jak najbardziej opcja do rozważenia, jednak zauważmy, że dość droga - moim zdaniem warto na początku spróbować samemu zmierzyć się z programowaniem poprzez przerobienie wybranego tutorialu i zobaczyć, czy rzeczywiście jest to coś, w czym chcemy pogłębiać swoją wiedzę oraz wiązać z tym przyszłość. Wówczas bootcamp jak najbardziej jest ewentualnością do rozważenia, choć istnieje możliwość, że podążanie za dobrym tutorialem będzie wystarczające.

A jeśli patrzycie dużo szerzej i chcecie znać całą (przykładową) drogę do zostania specjalistą w danej dziedzinie programowania, to polecam roadmapy zebrane w tym repozytorium.

Podsumowanie

Mam nadzieję, że udało mi się w tym tekście odpowiedzieć na pytanie, który język programowania powinien wybrać początkujący. Nie jest to łatwy wybór i nie jest też proste określenie znaczenia tego wyboru - programowanie to ciągła nauka i w którymś momencie zorientujemy się, że w miarę swobodnie przełączamy się pomiędzy różnymi technologiami. To również dobra ścieżka kariery, jednak warto pamiętać, że w dużej mierze to też zabawa i forma nowoczesnego majsterkowania - nie bez powodu wielu programistów po pracy (szczególnie pasjonatów) uczy się w domu nowych rzeczy i programuje swoje aplikacje, dochodząc do bardzo pomyślnych rezultatów oraz spełniając się przy tym intelektualnie.

Życzę powodzenia wszystkim, którzy chcą uczyć się programować - trzymam kciuki za Waszą determinację i chęć samorozwoju :)

Pozdrawiam i dziękuję - Jakub Rojek.

We can do quite a bit and what is more, our skills and resources are at your disposal. Take a peek at what we can offer you.

About author

Jakub Rojek

Lead programmer and co-owner of Wilda Software, with many years of experience in software creation and development, but also in writing texts for various blogs. A trained analyst and IT systems architect. At the same time he is a graduate of Poznan University of Technology and occasionally teaches at this university. In his free time, he enjoys playing video games (mainly card games), reading books, watching american football and e-sport, discovering heavier music, and pointing out other people's language mistakes.

Jakub Rojek