pprogramowanie;

// blog o programowaniu i branży IT

rss

Jak nauczyć się programowania?

22 listopada 2015, kategoria: Studia i praca
nauka-programowania

Być może od dawna zastanawiasz się jak zabrać się za naukę programowania? Po przeczytaniu tego krótkiego artykułu sytuacja będzie dla Ciebie o wiele jaśniejsza. Wyjaśnię czym jest programowanie oraz jak najlepiej zabrać się za jego naukę, gdzie szukać najlepszych materiałów i jak długo zajmie Ci nauczenie się programowania. Opiszę kwestię wyboru języka programowania, co jest problemowe dla wielu początkujących.

Czym jest programowanie?

Inżynieria Oprogramowania jest jedną z głównych dziedzin współczesnej informatyki. Opisuje ona proces wytwarzania systemów informatycznych. Programowanie jest jednym z działów Inżynierii Oprogramowania i zajmuje się ściśle produkowaniem i utrzymywaniem aplikacji (programów).

Programowanie daje niesamowite możliwości i pełną elastyczność jeśli chodzi o świat cyfrowy. Jest ściśle związane z elektroniką i przetwarzaniem sygnałów. Prawie każde urządzenie elektryczne w Twoim otoczeniu musiało zostać w jakiś sposób zaprogramowane przez człowieka. Dotyczy to przede wszystkim urządzeń wyposażonych w interfejsy użytkownika, wchodzących w interakcję z użytkownikiem. Może to być np. pralka, telefon komórkowy, elektrycznie sterowana brama wjazdowa, samochód z komputerem. Ponieważ zostały zaprogramowane, zostały wyposażone w program, który wykonuje jakąś logikę i przetwarza informacje.

Najprostszym przykładem może być automat na monety. Może on być sterowany dwojako: albo jako system mechaniczny zbudowany z wielu skomplikowanych przekładni albo jako system cyfrowy wyposażony w program. Kolejnym przykładem jest bankomat, ten już z całą pewnością jest systemem czysto cyfrowym. W bankomacie musi istnieć zapisany program, który po pierwsze przetwarza informacje (pobiera od użytownika PIN) oraz wykonuje logikę.

Informacje zawarte w tym artykule nie nauczą Cię programować, ani nie pokażą Ci prostej drogi do celu. Możliwe, że znajdziesz tu odpowiedź na kilka nurtujących Cię pytań, jednak ostatecznie i tak wszystko leży w Twoich rękach.

Kim jest programista?

Programista to osoba, która pisze programy mające na celu rozwiązanie danego problemu. Narzędziem programisty jest rzecz jasna komputer oraz język programowania, którym programista porozumiewa się z komputerem. Ujmując rzecz ściślej, język programowania pozwala tworzyć logikę w postaci kodu programu, która zostanie przetworzona przez procesor komputera.

Charakterystyczną cechą dla programistów jest omylność. Systemy komputerowe naszpikowane są błędami, stąd wszelkie włamania, wycieki danych i inne wielkie cyfrowe afery. Chociaż komputery działają zawsze dobrze i nieomylnie, zawsze słabym ogniwem jest człowiek, który musi ten komputer zaprogramować.

Podział na front-end i back-end

Od dawna istnieją dwa zróżnicowane nurty jeśli chodzi o programowanie. Pierwszy z nich - front-end - nastawiony jest na końcową fazę procesu wytwarzania oprogramowania. Back-end odpowiada za wnętrze i logikę działania aplikacji. To w jakim kierunku zaczniesz się rozwijać będzie miało znaczący wpływ na Twoją późniejszą karierę (szczególnie na jej początek).

Sytuacją idealną dla każdego programisty jest dobre opanowanie front i back-endu. Zapewni Ci do szerokie spojrzenie na każdy projekt i wszelkie problemy. Jednak opanowanie w stopniu dobrym kilku technologii z jednej jak i drugiej strony, wiąże się z wieloma latami nauki i nabieraniem doświadczenia.

Nie ma sensu udowadniać co jest lepsze. Zarówno jedni jak i drudzy programiści są potrzebni a ich zarobki praktycznie wcale się od siebie nie różnią.

Front-end aplikacji

Jest to warstwa, która jest odpowiedzialna za:

Kilka lat temu front-end był bardzo ubogi jeśli chodzi o możliwości. W przypadku aplikacji internetowych podstawowym narzędziem pracy programisty była znajomość HTML & CSS oraz JavaScriptu. Zawsze mile widziane jest aby osoba odpowiedzialna za front-end miała także zmysł graficzny, umiała dopasować do siebie różne elementy systemu i zaprojektować widoki.

W ostatnich kilku latach sytuacja radykalnie się zmieniła. Z powodu rozwoju i ciągle rosnącej popularności sieci internetowej, technologie webowe przeżywają bardzo szybki rozwój. Na rynku w krótkim czasie pojawiło się dziesiątki nowych frameworków JavaScriptowych, które nie przypominają już starego nudnego JavaScripta. Sam język JavaScript także bardzo ewoluował. Dawniej spostrzegany był na stronach jako coś negatywnego, teraz stanowi numer jeden w budowie interfejsu użytkownika.

Z tego powodu podział na front-endowców i back-endowców jest silniejszy niż kiedykolwiek. Obecnie na rynku mało jest osób, które podołałyby elastycznemu przeskakiwaniu raz na jedną raz na drugą stronę. Firmy skupiają się raczej na zatrudnieniu osobnych programistów do interfejsu aplikacji i osobnych do jej wnętrza.

Warto dodać, że front-end sam w sobie niczym nie przypomina już klepania HTMLowych znaczników. Frameworki takie jak AngularJS mają bardzo rozbudowane możliwości, pozwalają na używanie wielu skomplikowanych mechanizmów oraz na dzielenie kodu na moduły. W rozbudowanych projektach front-end nie ustępuje objętością kodu back-endowi. Odzwierciedlenie rozwoju tej warstwy aplikacji widać bardzo dobrze w proponowanych widełkach finansowych w ogłoszeniach.

Back-end aplikacji

Jest to warstwa, która skupia system w jedną całość. Jest odpowiedzialna za przetwarzania informacji i całą logikę. Poza tym, back-end odpowiada za komunikację z bazą danych oraz z wszelkimi innymi serwisami używanymi w projekcie.

Dominacja back-endu na rynku (czyli wszelkich języków kompilowalnych działających bezpośrednio na systemie operacyjnym) trochę spadła, przez dynamiczny rozwój front-endu. Nie jest to jakaś szczególnie zauważalna różnica, jednak przez rozwój internetu odchodzi się od aplikacji ściśle desktopowych. Wszelkie duże systemy do zarządzania firmami, aplikacje bankowe, systemy ERP itp. zmierzają w stronę sieci WEB i działają w sieci internetowej bądź intranetowej.

Zamiast tworzyć oprogramowanie dedykowane np. dla systemu Windows, które będzie komunikować się z serwerem głównym i łączyć z nim za pomocą bibliotek, producenci często decydują się na stworzenie aplikacji internetowej dostępnej dla każdego urządzania z poziomu przeglądarki za pomocą protokołu HTTP. Niesie to ze sobą szereg konsekwencji pozytywnych i negatywnych.

Przypadkiem skrajnym są mało zaawansowane aplikacje, gdzie serwer (czyli back-end) tworzy jedynie pomost komunikacyjny pomiędzy front-endem a bazą danych, jest stricte odpowiedzialny za dostarczanie danych w jedną i drugą stronę.

Nie chcę aby bardziej doświadczeni czytelnicy mojego bloga przyczepili się do tego akapitu. Jest on napisany jedynie poglądowo językiem przystępnym dla osoby początkującej, aby rozumiała ten podział. Nie da się udowodnić wyższości jednej warstwy nad drugą.

Od czego zacząć naukę programowania

W najlepszej sytuacji są osoby, które czują pociąg do programowania i po prostu ich to interesuje. Nauka programowania przypomina trochę rozwiązywanie zadań np. z matematyki. Musisz poznać kilka dostępnych mechanizmów i nauczyć się je ze sobą łączyć. Rozwiązanie wielu podobnych do siebie problemów da Ci zrozumienie problemów bardziej złożonych.

W odróżnieniu do innych dziedzin nauki, które są teoretycznie skończone, programowania można uczyć się przez wiele długich lat. Różnorodność języków programowania i frameworków jest tak szeroka, że nie sposób wszystkiego ogarnąć.

Znalezienie w sobie odpowiedniej motywacji do poświęcenia pewnej ilości czasu dziennie jest chyba największym wyzwaniem. Wielu ludzi poddaje się po kilku dniach lub tygodniach, ponieważ przytłacza ich ogrom informacji.

Przez cały czas odkąd mam styczność z programowaniem zawsze trafiam na rzeczy, których nie rozumiem. Było tak 6 lat temu gdy napisałem swój pierwszy program, było tak 3 lata temu gdy uczyłem się do matury i jest tak teraz gdy pracuję już jako zawodowy programista. Świat informatyki jest bardzo rozległy i nie można się przez to zniechęcać.

Jaki język programowania wybrać?

To jaki język programowania będzie najlepszy na początek jest głównym pytaniem pojawiającym się w głowie każdego początkującego programisty. Dodatkowo warto wspomnieć, że jest to typowy problem nierozwiązalny. Nie da się wybrać czegoś najlepszego, każdy wybór będzie obarczony jakimiś wadami i zaletami. Wynika to po prostu ze specyfikacji platform i różnego wykorzystania poszczególnych języków i technologii.

Po pierwsze zastanów się, czy chcesz kierować się w stronę back czy front-endu? Front-end to przede wszystkim języki skryptowe. Kiedyś będziesz w stanie szybko przeskoczyć z front do back-endu i na odwrót, jednak będzie to możliwe dopiero po nabraniu pewnego doświadczenia.

Jedną z ważniejszych kwestii na którą proponuję zwrócić uwagę są trendy rynkowe. Uważam, że nie ma sensu uczyć się Pascala, którego tak namiętnie ćwiczy się w liceach. Oczywiście, jeżeli od niego zaczniesz, na pewno wiele się nauczysz. Problem jest tylko w tym, że nie wykorzystasz go zawodowo.

C++ należy do języków niższego poziomu (w porównaniu do C# i Javy), daje bardzo zaawansowane możliwości i jest bardzo dobrym wyborem. Jest najczęściej wykorzystywany w firmach zajmujących się rozwiązaniami elektronicznymi, komunikacyjnymi oraz wszędzie tam gdzie istnieje połączenie z mikrokontrolerami. C++ daje dobre pojęcie o programowaniu oraz uczy działania programowania. Nie wyręcza programisty w dbaniu o porządek w pamięci jak robią to języki wyższych poziomów. Programując w C++ można nabrać wiele dobrych nawyków.

C# i Java są językami stosunkowo nowymi, dającymi możliwość szybkiego wytwarzania aplikacji. Są obudowane setkami gotowych klas, interfejsów, rozwiązań i mechanizmów. Są bardzo często spotykane w firmach nastawionych na szybkie tworzenie aplikacji dla wielu klientów. Są wyposażone w wiele współpracujących z nimi frameworków. To bardzo ułatwia sprawę i zamienia te technologie w prawdziwe kombajny. Można posunąć się do stwierdzenia, że są używane wszędzie tam gdzie nad wydajność i szybkość działania stawia się szybkość wytwarzania oprogramowania.

Wybierając jakikolwiek język skryptowy np. JavaScript lub PHP na pewno zachwyci Cię ich prostota. Brak jest w nich silnego typowania i kilku innych zaawansowanych mechanizmów. Mimo tego nauka podstaw (zmienne, tablice, pętle, instrukcje warunkowe, funkcje) jest możliwa.

To co wybierzesz na pewno zaowocuje i przyniesie korzyści.

Skąd brać materiały do nauki programowania?

Istnieje wiele źródeł, z których można czerpać wiedzę. Podstawowym źródłem danych jest na pewno internet. Jest tu wiele darmowych i płatnych kursów, opisujących przeróżne języki programowania. Miej na uwadze serwisy anglojęzyczne ponieważ to one są największą skarbnicą wiedzy. Język angielski jest naturalnym językiem każdego programisty, dlatego to właśnie po angielsku można znaleźć wszystko co nas interesuję.

Bardzo dobrym źródłem wiedzy są serwisy i blogi specjalistyczne, wyczerpujące kompletnie dane zagadnienia. Przykładem takiego serwisu jest np. codeproject.com. Jest to portal, który nie jest prowadzony w formie kursu. Są tam setki artykułów nie ułożonych według żadnej kolejności.

Źródłem nauki, które polecam najbardziej są książki. Argumentem za tym jest fakt, że są one idealnie ułożone tematycznie. Uczysz się odpowiednich rzeczy w odpowiedniej kolejności, a w przypadku początkujących programistów jest to niezwykle ważne. Renomowane książki w mojej opinii zapewniają największą skuteczność i są popularne nie bez powodu.

Przykładami takich książek, które gorąco polecam są:

Nie jest to z mojej żadna reklama, są to powszechnie znane dzieła uważane przez wielu za najlepsze. Sam przeczytałem obie książki i obydwoma byłem zachwycony.

Pisanie własnych projektów

Niezależnie na jakim etapie nauki programowania jesteś, zawsze staraj się prowadzić mniejsze lub większe projekty. Tematyka, język i sposób wykonania nie mają żadnego znaczenia. Dzięki temu nauczysz się wykorzystywać mechanizmy, o których przeczytałeś w kursach. Utrwalisz swoją wiedzę a dodatkowo natrafisz na problemy, których rozwiązanie pociągnie za sobą szereg korzyści.

Wszystkie projekty zapisuj i archiwizuj. Po kilku miesiącach nauki będziesz widział jakie postępy w programowaniu zrobiłeś. Przekonasz się jakich sposobów używałeś kiedyś a jakich użyłbyś dziś.

Bardzo wskazane jest aby z czasem poddawać swój stary kod refaktoryzacji. Jest to proces zmian w kodzie programu mający na celu poprawienie jego jakości. Refaktoryzacja nie jest zjawiskiem negatywnym, można się z tego naprawdę wiele nauczyć. Będzie Ci ona towarzyszyła w całym życiu zawodowym.

Uczestnictwo w konferencjach i kołach naukowych

Jeżeli masz możliwość to oczywiście warto zapisać się do koła naukowego. Spotkania wyglądają przeważnie tak, że jakaś osoba deklaruje chęć przygotowania referatu na dany temat. Reszta zgromadzonych osób słucha i zadaje ewentualne pytania. Korzyści są obustronne. Oczywiście na początku będziemy jedynie biernymi słuchaczami, ale z czasem warto jak najwięcej prezentować, ponieważ ucząc innych uczymy się z podwójną skutecznością. Zawsze trafiamy wtedy na przypadki, których nie wymyślilibyśmy sami.

Osobiście mam bardzo sceptyczne podejście do konferencji naukowych. Koło naukowe tworzy określona, mała liczba słuchaczy, więc każdy z łatwością może coś dodać lub zapytać. Dodatkowo spotkania koła są luźne, często pracuje się na komputerach. W przypadku konferencji IT jest typowa masówka. Większość prelekcji wygłaszana jest pokazując fragmenty kodu na rzutniku. Zwykle trwają dość długo i mamy ogromne szczęście, jeżeli chociaż połowa pokrywa się z naszymi zainteresowaniami.

Byłem na kilku konferencjach informatycznych i zawsze, niestety, miałem poczucie zmarnowanego czasu. Przez pół dnia byłbym w stanie nauczyć się naprawdę bardzo wiele na własną rękę. To, że ktoś czyta coś z kartki i przewija fragmenty kodu na slajdach rzutnika kompletnie nie trafiło w mój sposób rozwoju.

Sytuacją totalnie najgorszą jest gdy wykładowca na konferencji ma zły styl przekazywania wiedzy. Zamiast przedstawić daną technologię posługując się naukowymi faktami, zaczyna opowiadać za dużo kawałów i rzucać określenia charakterystyczne dla trenerów personalnych w stylu “dasz radę!”, “najważniejsze to uwierzyć w siebie wtedy się uda!”.

Jak długo zajmie nauczenie się programowania?

Podstaw programowania można nauczyć się w kilka dni lub kilka tygodni. Wystarczy, że poznasz kilka konstrukcji programistycznych a będziesz w stanie rozwiązywać proste problemy algorytmiczne oraz manipulować wyjściem/wejściem przetwarzając informacje w prosty sposób. Po kilku tygodniach będziesz umiał rozwiązywać proste problemy maturalne oraz poradzisz sobie z zadaniami na studiach.

Dany język programowania można opanować w zależności od umiejętności w kilka dni, kilka tygodni lub w przypadku początkujących kilka miesięcy. Zależy to też oczywiście od stopnia złożoności danego języka programowania. Do języków najprostszych zaliczane były te z rodziny Basic. Są one bardzo rzadko spotykane, częściej wykorzystywane jako języki do krokowego programowania robotów.

Jeżeli będziesz programistą z pewnym stażem, poznanie kolejnego języka przeważnie jest niezwykłe proste. Mechanizmy w programowaniu są bardzo podobne, różnią się tylko sposoby ich zapisu w poszczególnych językach. W przypadku dobrego rozumienia programowania, poznanie nowego języka skupia się na poznaniu jego syntaksy.

Generalnie rzecz biorąc, nauka programowania się nie kończy. Brzmi to dość dziwnie i dość zniechęcająco, ale jest prawdą. Na rynku pracy nie ma osoby, która umie wszystko. W większości przypadków każdy jest specem od innej technologii i innego języka. Jeżeli umiesz kilka języków stajesz się bardzo wartościowy dla każdego pracodawcy.

Nierealna natomiast wydaje się sytuacja, aby ktoś umiał wszystko. Hipotetycznie próbując uczyć się każdego języka i każdej technologii po kolei, zanim ukończysz naukę języka X w tym samym czasie powstanie już Y i Z. Świat informatyki rozwija się niezwykle szybko, mimo że nowe języki nie pojawiają się z roku na rok, to niestety frameworki stanowiące o ich sile już tak, jedne powstają, inne są rozwijane, inne są zamykane.

Podsumowując akapit, nie da się bezpośrednio na te pytanie odpowiedzieć. Najważniejsze to uczyć się, ćwiczyć i rozwijać w jakimś kierunku.

Umiejętności zawodowego programisty

Dobry programista kojarzy mi się z osobą, która tworzy nieskazitelnie dobry i czysty kod. W przypadku osób zaawansowanych, znanie jakiegoś języka programowania to żadna zasługa. Obrazując przykład: kowal nie powinien chwalić się tym, że umie machać młotkiem, a pokazać jak dobre przedmioty umie wykonać. Język programowania jest tylko narzędziem, tak jak narzędziem jest młotek w ręku kowala.

Tworzenie oprogramowania to umiejętność zorganizowania projektu, znajomość wzorców projektowych i umiejętność ich zastosowania, dbanie o czysty i poprawny kod.

Najgorszą cechą programisty w mojej opinii jest niechlujstwo. Jest to cecha o wiele gorsza niż lenistwo. Leniwy programista po prostu pracuje wolno, a niechlujny programista wcześniej czy później spowolni pracę całego zespołu, tworząc kod przypominający spagetti, w którym nikt nie będzie umiał się połapać. Skutkiem tego zawsze jest konieczność przymusowej refaktoryzacji, a w gorszym wypadku nawet napisanie funkcjonalności od nowa. Innym czarnym scenariuszem jest brnięcie w to co najgorsze i nieodwracalne czyli dopisywanie kodu do istniejącego dziadostwa. Gdy ktoś stworzy złe fundamenty, cokolwiek byśmy nie dopisali i jak dobre by to nie było, cała konstrukcja i tak spisana będzie na zawalenie.

Aby nabrać dobrych nawyków potrzebne jest doświadczenie i uczenie się na własnych błędach (a jeszcze lepiej na cudzych). Tworząc swoje projekty nie raz i nie dwa zrobisz coś tak głupiego, że próba rozwoju okaże się niemożliwa. Stwierdzisz wtedy, że droga którą obrałeś była zła. Dzięki temu nie powtórzysz wpadki w przyszłości.

Takimi zagadnieniami i planowaniem zajmuje się cała inżynieria oprogramowania. Skuteczną bronią mogą okazać się wzorce projektowe, pisanie testów jednostkowych, stosowanie zasad SOLID itd. Warta polecenia może być w tym momencie książka “Pragmatyczny programista” oraz “Czysty kod”. Istnieje szansa, że są nawet reklamowane w menu na tym blogu.

Nauka programowania dla dzieci

Informatyka jest prężnie rozwijającym się rynkiem, któremu ciągle brakuje pracowników. Nic więc dziwnego, że rynek odpowiedział i pojawiły się na nim narzędzia pozwalające uczyć programowania dzieci już od najmłodszych lat. Jest to oczywiście nauka poprzez zabawę, w mojej opinii może dać dziecku niezłą zajawkę na przyszłość.

Strony udostępniające naukę programowania dla dzieci to np. code.org oraz tynker.com. Jeżeli nie umiesz programować a jesteś ciekawy jak to wygląda, spróbuj sam rozwiązać kilka zadań znajdujących się na dwóch wspomnianych wcześniej stronach. Przekonasz się jakie to proste!