Od zera do kodera. Czyli jak nauczyłem się programować?
Raz na jakiś czas do mainstreamowych mediów przebija się historia o „genialnym” nastolatku, który to ucząc się wieczorami programowania stworzył aplikację na której zarobił miliony. Od razu po tego typu publikacji pojawia się niezliczona ilość materiałów o tym jak to szybko i bezboleśnie nauczyć się kodować, zmienić branżę i zwiększyć swoje zarobki. Swoje robią też różnego rodzaju „szkoły” programowania, które również podsycają sporo mitów na ten temat. Każdy ciągnie w swoją stronę w zależności od tego jaki ma w tym interes. Konkluzja jest taka, że żeby dostać przysłowiowe 10k netto miesięcznie to wystarczy skończyć taki, a taki kurs i już! Można podbijać rynek.
Warto jednak dodać, że ucząc się programowania na różnego rodzaju kursach czy to płatnych lub też finansowanych przez samorząd/firmę etc. tak naprawdę nie uczymy się programować ale kodować. Różni się to tym, że programista w przeciwieństwie do kodera (jak zwał tak zwał) poza znajomością danej technologii czyli języka programowania ma również rozległą wiedzę na temat algorytmiki oraz matematyki. Oczywiście pracując w różnego rodzaju „Janusz softach” takie umiejętności raczej nigdy wam się nie przydadzą. Ale tutaj pojawiają się dwa pytania – pierwsze – czy rzeczywiście chcecie pracować w takich firmach, drugie – ile w takim przedsiębiorstwie jesteście w stanie zarobić, bo na pewno nie będzie to 10k. Nikt za proste strony www czy inne aplikacje tyle nie płaci. Sprowadza się to wszystko do tego, że żeby porządnie opanować tajniki wiedzy jaka może się przydać w długiej karierze zawodowej nie wystarczą dwa lub trzy tygodnie, ba nie wystarczy miesiąc czy też dwa. Potrzeba na to kilku lat pracy, zwłaszcza jeśli startujemy od totalnego zera, a przedmioty ścisłe nie były naszą mocną stroną. Krótkie kursy programowania mogą być całkiem w porządku dla absolwentów kierunków ścisłych, takich jak matmatyka czy też fizyka ale tutaj znowu pojawia się pytanie czy dla takich osób jest sens przekwalifikowywania się?
Jeśli macie mityczne 30 lat i rodzinę na utrzymaniu to raczej będzie wam ciężko zamienić swój obecny zawód i przenieść się do IT. Od kilku lat rynek ten jest naprawdę nasycony „juniorami” oraz różnego rodzaju osobami po wszelakich kursach, których w ostatnim czasie pojawiła się cała masa. Problemy ze znalezieniem pracy mają nawet absolwenci informatyki, a co dopiero kursanci jakiejś szkoły programowania. Zdecydowana większość ogłoszeń o pracę w IT skierowana jest do senior developerów bądź też regular developerów. Takich specjalistów na rynku naprawdę brakuje i to właśnie oni mogą liczyć na te przysłowiowe 10k netto miesięcznie. Tyle tylko, że żeby dojść do takiego poziomu od totalnego zera jest naprawdę trudno. Jeśli oczywiście mówimy o osobie, która nie ma za sobą wykształcenia na kierunku ścisłym, a do IT trafiła po ukończeniu jakiegoś kursu programistycznego. Po prostu od pewnego momentu zacznie wam brakować wiedzy odnośnie algorytmów czy też stricte matematyki – tutaj właśnie kłania się na przykład matematyka dyskretna, a dokładniej teoria grafów, teoria języków i automatów i innego tego typu dziedziny dość szeroko wykorzystywane w bardziej złożonych i wymagających projektach.
Tyle tytułem wstępu, a teraz chciałbym Wam przedstawić moją krótką historię wraz z myślę, że cennymi wskazówkami odnośnie tego jak ja zaczynałem swoją przygodę z programowaniem. Dodam na początku, że moja ścieżka edukacyjna od liceum poprzez studia była związana ściśle z informatką oraz matematyką. W szkole średniej uczęszczałem do klasy o profilu „matematyczno-informatycznym”, a studiowałem (i w sumie dalej studiuję na II stopniu) informatykę na wydziale matematyki i informatyki. Jednak swoje pierwsze kroki jeśli chodzi o programowanie stawiałem dużo wcześniej bo już w gimnazjum i to właśnie ten początkowy okres nauki jest chyba najbardziej ekscytujący.
1. W internecie nie ma żadnych sensownych materiałów
Zacznijmy może od tego, że bardzo szybko zorientowałem się, że tak naprawdę w internecie – przynajmniej w tamtym czasie, ale tak jest też obecnie teraz – nie ma żadnych sensownych i darmowych materiałów edukacyjnych. Większość tutoriali niestety charakteryzuje się taką przypadłością, że ostatecznie po uruchomieniu całego kodu coś nie działa i nie wiadomo co z tym fantem zrobić. Tak na marginesie dodam, że to właśnie wtedy narodził się pomysł na stworzenie tego bloga, ale to już zupełni inna historia.
Problem ten rozwiązałem dość sprawnie, po prostu za odłożone pieniądze kupowałem interesujące mnie książki programistyczne. Zaczynałem wtedy od dość archaicznego jak na dzisiejsze czasy języka „Pascal”, o którym zresztą napisałem kilka artykułów (możecie je znaleźć tutaj). Dzisiaj raczej odpuścił bym naukę tej technologii bowiem z tego co zauważyłem to już nawet odchodzi się od wykorzystywania składni Pascala do zapisywania pseudokodu w książkach poświęconych algorytmom. A to jeszcze do niedawna było standardem. Na taki „pierwszy” język programistyczny polecałbym na przykład Javę, C# lub Pythona, który jest chyba najprostszy z tej trójki, a dodatkowo mnogość różnego rodzaju bibliotek powoduje, że większość aplikacji to 2-3 linijki (i to należy rozumieć dosłownie).
Kolejnym moim etapem, kiedy to po paru miesiącach odpuściłem Pascala i pozbyłem się z komputera słynnego i dość archaicznego IDE były technologie frontendowe. Wynikało to z tego, że chciałem w końcu wystartować z moim blogiem, a że potrzeba matką wynalazków no to nie pozostało nic innego jak poszukać jakiś książek na temat HTML’a i CSS’a. Trafiłem wtedy na pozycję pt. „Tworzenie stron WWW. Biblia.„. Książka ta jest co prawda dość stara, a część rzeczy uległa już przedawnieniu. Przykładowo już w zasadzie na porządku dziennym stało się używanie HTML 5 i CSS 3, podczas lektury technologie te przedstawione są jako ciekawostka. Jednak większa jej część moim zdaniem jest ponad-czasowa dlatego też, jeśli jesteście na początku swojej kariery programistycznej i interesuje was tematyka tworzenia stron WWW to mogę ją z czystym sumieniem polecić.
Frontend to jedno ale po jakimś czasie doszedłem do wniosku, że czas stworzyć coś bardziej elastycznego niż tylko statyczną stronę WWW. Tak właśnie wróciłem do korzeni czyli początków mojej nauki i trafiłem na PHP. Tutaj gigantyczną rolę w moim rozwoju odegrała seria książek „Head First” (pl. Rusz główą). Są to pozycje, które zresztą do dzisiaj zbierają naprawdę bardzo dobre recenzje na całym świecie. Jeśli stawiacie swoje pierwsze kroki lub jesteście na początku swojej kariery programistycznej to naprawdę lepiej nie wydacie swoich pieniędzy jak właśnie na książki z tej serii (jeśli mogę wam jeszcze doradzić to nie kupujcie e-booków, tylko papier – to są dosłownie „kolorowanki”, a ciężko raczej korzystać z czegoś takiego na czytniku e-booków). Moją karierę backend developera rozpocząłem od książki autorstwa Micheal’a Morrison’a pod jak, że wymownym tytułem „Head First. PHP & MySQL„. Jak pewnie już się domyśliliście od razu liznąłem też tematykę baz danych i to właśnie wtedy napisałem swoje pierwsze zapytania SQL oraz poznałem całą strukturę danych w bazach MySQL. Wiedza ta później bardzo przydała mi się na studiach gdzie zresztą nauczyłem się znacznie więcej na ten temat. Dzięki temu, że dużo rzeczy już umiałem było mi też znacznie prościej na zajęciach (a nie były one łatwe).
Tak więc od Pascala, którym zainteresowałem się w gimnazjum poprzez HTML’a, CSS’a doszedłem do PHP oraz baz danych. Równolegle z poznawaniem PHP zainteresowałem się .NET’em czyli C#, który to w przeciwieństwo do PHP jest językiem kompilowanym. Czyli w skrócie aby uzyskać działający program, kod który napiszemy musi zostać skompilowany do postaci kodu maszynowego. C# oferował też bardzo dobre wsparcie dla idei programowania zorientowanego obiektowo (obecnie w PHP też chyba jest całkiem w porządku, ale już dawno nic nie pisałem w tej technologii więc nie chce się wypowiadać). Poza tym już na początku moich studiów bawiłem się trochę Javą, JavaScriptem oraz Pythonem, aż w końcu zainteresowałem się bardziej technologiami mobilnymi, a dokładniej Androidem.
Będąc oczywiści studentem i to na wydziale matematyki i informatyki główną rzeczą jaką się robi to poznaje różnego rodzaju algorytmy, struktury danych oraz zagadnienia stricte matematyczne. Jeśli chodzi o algorytmikę to nieodzowną pozycją jest oczywiście książka autorstwa Thomasa H. Cormena pod tytułem „Wprowadzenie do algorytmów„. Ja się nawet śmieję, że na jej podstawie zostało opracowanych kilka przedmiotów na które chodziłem jako student (Programowanie, Metody programowania, Abstrakcyjne Struktury danych i algorytmy, Rachunek prawdopodobieństwa i statystyka, Matematyka dyskretna, Teoria języków i automatów). Jest więc naprawdę spory potencjał.
2. Doświadczenie i jeszcze raz doświadczenie
Oczywiście równolegle w parze z rosnącą wiedzą zawsze miałem świadomość tego, że nigdzie na nauczę się tyle co podczas pracy nad komercyjnymi projektami wraz z doświadczonym zespołem programistów. Tak więc swoją pierwszą pracę powiązaną z programowaniem zacząłem zaraz po maturze i trafiłem na staż do jednego z krakowskich software house’ów. Jak już zresztą pisałem na początku tego artykułu – na rynku mamy deficyt specjalistów, a nadpodaż stażystów – po zdobytych pierwszych doświadczeniach w IT, które mogłem wpisać w CV oraz tym, że prowadzę dev-bloga potem było już z górki. Praktycznie co wakacje, a nawet i dłużej pracowałem w różnych firmach gdzie zdobywałem cenne umiejętności.
To właśnie podczas mojego stażu (zaraz po maturze) miałem pierwszy kontakt z systemem kontroli wersji Git oraz pracą zespołową. Już nie pisałem samodzielnie swoich aplikacji, ale pracowałem w zespole z nieco bardziej doświadczonymi kolegami. Tak się złożyło, że byłem najmłodszy i w zasadzie z najmniejszą wiedzą. Swoją drogą to właśnie wtedy zorientowanie się, że tak naprawdę jeszcze nic nie umiem, a to paradoksalnie jest kolejnym etapem nauki programowania.
Jeśli miałbym dawać wam jakieś rady to naprawdę jak najwcześniej zacznijcie szukać firmy, która potrzebuje stażystów. Czasem decyduje po prostu szczęście bo akurat trafił się nowy projekt, a tu sezon urlopowy. Pamiętajcie, że nigdzie nie nauczycie się tyle co podczas pracy przy komercyjnych projektach. Nawet na studiach nie zdobędziecie takich umiejętności. Dlatego też część absolwentów informatyki ma „problemy” ze znalezieniem pracy. Oczywiście pewnie 99% z Was chciała by tak czy owak być w takiej sytuacji, bo musimy pamiętać, że przecież cały czas w IT jest deficyt pracowników, miesiąc, dwa, a może trzy i każdy taki „ogarnięty” absolwent w końcu znajdzie zatrudnienie w swoim zawodzie. Nie popadajmy w histerię.
3. Era własnych projektów
Jeśli chcesz się nauczyć pisać musisz po prostu pisać. Identycznie jest z programowaniem, jeśli chcesz się nauczyć programować musisz po prostu programować. Nie wystarczy o tym czytać.
Tak moi drodzy wygląda zwykła szara rzeczywistość programisty. Można oczywiście przeczytać milion pięćset sto dziewięćset książek o programowaniu, wkuć na pamięć 1300 stron bibli algorytmicznej Thomasa Cormena ale to wszystko nie podniesie naszego skila. Zawsze odkąd pamiętam poza nauką totalnych podstaw danej technologii pracowałem nad różnego rodzaju projektami programistycznymi, a napotkane problemy próbowałem rozwiązywać właśnie dzięki wiedzy zdobytej z książek, wyszukiwarki Google oraz różnego rodzaju forów dla programistów. Żeby uzupełnić cały kontekst historii jaką opisałem w tym artykule muszę jeszcze dodać jeden kluczowy akapit, któty powinien nosić tytuł „praktyka”.
Dla mnie jest to oczywiste i pewnie dla większości z Was również, ale są jeszcze osoby, które podchodzą do nauki programowania na zasadzie – otwieram dokumentację – wkuwam na pamięć nazwy wszystkich bardziej przydatnych klas, metod itd. i potem coś próbuję stworzyć. No nie. Jak uczyliśmy się pisać, to nie wkuwaliśmy wszystkich słów ze słownika zanim cokolwiek przelaliśmy na kartkę papieru. Tak też jest z programowaniem. Na każdym etapie mojej nauki realizowałem mniejsze lub większe projekty i uczyłem się poprzez rozwiązywanie problemów na jakie natrafiłem w trakcie mojej pracy. Prawdę mówiąc, nawet nie jestem w stanie napisać wam teraz co to były za aplikacje większość z nich, tak ok. 90% już w zasadzie „zaorałem” ale taki właśnie był ich cel. Były to miliony crud’ów, CMS’y, webserwisy, aplikacje wyświetlające pogodę itd. do tego dochodzi masa różnego rodzaju projektów na studiach, które na przykład pisałem, żeby zrozumieć jak działa dany wzorzec projektowy czy też jakaś biblioteka bądź framework. Mniejcie swiadomość tego, że dużo rzeczy była zrobiona po prostu źle, tak żeby tylko działała ale to właśnie praktyka i jeszcze raz praktyka doprowadzi Was do perfekcji.
W każdej szanującej się firmie IT zanim dana zmiana w kodzie zostanie scalona do brancha głównego, kod taki przechodzi review. Zazwyczaj realizowane jest to przez jednego programistę, a czasami przez większą liczbę osób. Wszystko w zależności od wagi projektu. Do tego dochodzi cała seria testów oraz koniec końców weryfikacja po stronie „biznesu”. Jak widzicie proces ten jest naprawdę złożony, a mówimy tutaj o profesjonalistach. Osobach, które przez 8h dziennie pięć dni w tygodniu zawodowo zajmują się programowaniem. Jeżeli na takim poziomie wszystko sprawdza się po kilka razy i dalej natrafia się na błędy to i Wy na początku swojej kariery czy podczas nauki naprawdę nie flustrujcie się, że coś nie wyszło.
Jeśli już doszliśmy do tematyki „czystego kodu” no to pozwolę sobie Wam polecić jeszcze jedną pozycję tym razem autorstwa pewnie znanego niektórym „wujka Boba” czyli Roberta C. Martina. W swojej ksiżące „Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów” opisuje on własnie dobre praktyki kodowania z którymi warto się na pewno zaznajomić.
Mam nadzieję, że pomogłem i lektura tego artykułu da Wam obraz tego jak wygląda droga od zera do „kodera”, a właściwie to programisty – ale słowo „koder” bardziej pasuje do rymu ;-). Pamietajcie, że jest to moja subiektywna opinia i historia, która niekoniecznie jest idealna. Jeśli macie jakieś swoje rady, przemyślenia bądź uwagi to tradycyjnie sekcję „komentarze” zostawiam do Waszej dyspozyji.
PS: Wszystkie linki do wymienionych przeze mnie książek, są odnośnikami z programu partnerskiego wydawnictwa Helion. Jeśli więc planujecie jakieś zakupy to miło mi będzie jeśli uczynicie to korzystając właśnie z zamieszczonych w tym artykule linków. Was to nic nie kosztuje, a ja otrzymam niewielki procent z Waszych transakcji. Dzięki temu będę mógł dalej rozwijać bloga i tworzyć dla Was darmowe i wartościowe treści.
W internecie można znaleźć sporo informacji dla edukacji. Ale wiadomo, że w kursach oraz książkach to systematyzowane. :)
Nie zgodzę się ze w internecie nie można znaleźć wartościowych kursów. Ja sam zamierzam przestudiować kilka/kilkanaście np. o html i css tak samo jak również o innych językach. Na samych kursach nie zamierzam oczywiście poprzestać
Doprecyzuję, że chodzi mi o darmowe materiały. Dodatkowo jeśli mówimy o czymś tak prostym jak HTML i CSS to tutaj nawet i za darmo znajdziesz sporo ciekawych rzeczy. Jednak tym dalej w las tym trudniej.
Chętnie bym się nauczył jakiegoś nowoczesnego języka programowania jak Rust, ale na helionie nie ma nawet dobrej książki do niego. Swift też fajny nowoczesny, ale nie ma do niego dobrego ide na inne systemy. Teraz uczyć się Javy raczej już się nie opłaca.
Hej, faktycznie jak chce się coś z wąskiej specjalności to trudno znaleźć dobrą książkę albo ogólnie cokolwiek. Sam się już na to złapałem. Może warto by takie rzeczy nagłośnić lub wysyłać e-maile do wydawnictwa? Sprawa do rozważenia.
Nie chodzi mi o wąską specjalność, ale o nowoczesny język programowania po 2010 roku który nie ma wskaźników, ma odśmiecanie pamięci, jest kompilowany, nie ma kaczego typowania i wyzbył się nulla. To wszystko spełnia Crystal, tyle że ma składnię podobną do Ruby.
Witaj Łukaszu :) Cieszę się, że poruszyłeś temat wątpliwej jakości źródeł dostępnych w internecie. Tutaj pewnie przydałaby się większa edukacja młodego pokolenia, jak na pierwszy rzut oka rozróżniać wartościowe materiały od tych mniej.
Chciałbym jednak zwrócić uwagę na wartość doświadczenia i znajomości teorii. Nie chciałbym zanegować nauki przez doświadczenie, czy tworzenie projektów. Praktyka czyni mistrza prawda ? :-) Moim zdaniem jednak nie negować wartości teorii w it. Jeśli pomija się zdobywanie i systematyzowanie swojej wiedzy te projekty mimo że powstają, to są wątpliwej jakości. Brakuje świadomości, że każdy problem można rozwiązać na wiele sposobów, a dobór rozwiązania jest kluczowy, Po pierwsze jednak trzeba znać te możliwości, a o tym trzeba przeczytać i się nauczyć. Dlatego często, gdy ktoś prosi mnie o pomoc w nauce programowania zawsze widzę 3 pierwsze kroki (oczywiście, gdy ktoś już wie, czego chce się uczyć):
1. Nauka podstaw niezbędnych do tworzenia algorytmów i struktur do większości projektów składnia języka, jakieś połączenie z DB, podstawowe wzorce (bardzo podstawowe)
2. Realizacja projektu, może kilku.
3. Przeczytanie „cegły”, czyli książki, bądź kliku książek, które mocno usystematyzują wiedzę. Dzięki pierwszemu doświadczeniu projektowemu, większość wiedzy będzie można odnieść to swoich wcześniejszych problemów. Pewnie nie raz taki czytelnik złapie się za głowę mówiąc „Ale to głupio zrobiłem, a jest takie świetne rozwiązanie!”.
Po takim początku jest i wiedza i świadomość wielu zagadnień i problemów branży oraz można płynąć na głęboką wodę.
Co sądzisz o takim podejściu?
Cześć!
Dzięki za Twój komentarz. Myślę, że nauka programowania na zasadzie praktyki jest ok i dużo daje, ale trzeba też pamiętać o poznawaniu nowych rzeczy i systematyzowaniu już zdobytej wiedzy. Łatwo jest używać w kodzie przykładowo funkcji equals() nie wiedząc jak ona do końca działa „pod spodem”, a ta wiedza może być w niektórych sytuacjach kluczowa. Oczywiście w większości projektów nie będzie miało znaczenia czy dany algorytm jest efektywny czy też nie no bo i tak operujemy na tak małej liczbie danych, że jest to pomijalne, ale moim zdaniem od początku warto wyrabiać sobie dobre nawyki i „drążyć” temat – oczywiście w granicach rozsądku. Dobra literatura znanych i cenionych autorów zawsze jest ok. Dobrym przykładem jest też używanie wzorców projektowych. Można ich nie stosować, ale wtedy z upływem czasu coraz mniej chętnie chce nam się pracować przy takim projekcie podczas gdy stosując wzorce było by znacznie lepiej mimo tego, że w obu przypadkach efekt jest ten sam – wszystko działa.
Ja zaczynałem od anglojęzycznych książek o C i C++ dzięki czemu uczyłem się jednocześnie języka programowania i języka angielskiego. Wtedy jeszcze nie miałem dostępu do internetu a potrzebne narzędzia: IDE, Kompilatory, itd. miałem z dyskietek pożyczanych z firmy w której pracował mój ojciec, później pojawiły się płyty CD dołączane do magazynów o tematyce IT. Nie miałem za wiele możliwości zdobywania wiedzy na inne sposoby, ale za to pracowałem z każdą książką dokładnie, od deski do deski przez co zdobywałem wiedzę kompletną, nie „po łebkach”.
W dzisiejszych czasach mamy internet i dużą dostępność wszelakich materiałów edukacyjnych. Z jednej strony to dobrze, bo możliwości edukacji są dużo większe, z drugiej strony nadmiar informacji wcale nie przekłada się na zdobywanie specjalistycznej wiedzy i umiejętności. Na pewno internet ma tą przewagę nad książkami, że informacje są aktualizowane na bieżąco. Ja na chwilę obecną uczę się nowych rzeczy w taki sposób, że czytam o nich ogólne informacje w sieci i jeśli czuję że dane zagadnienie jest dla mnie, szukam dobrej książki na ten temat, gdy nabędę wiedzę teoretyczną testuję rozwiązania w praktyce, oczywiście czasami też przeplatam naukę teorii z praktyką.
Dodam jeszcze na koniec, że nie ma lepszej nauki programowania niż tworzenie własnych projektów i ich rozwijanie, promowanie, zdobywanie audiencji. Ja przeważnie mam poza pracą zawodową 2-3 takie projekty, którym daję rok, jeśli w tym czasie nie uda się ich rozwinąć to je sprzedaję albo chowam do szuflady, umiejętności nabyte przy takich projektach zostają :)
Można też trudniej:
1. Wyrzuć wszelkie książki, to zbędna makulatura.
2. Weź się za implementację dowolnego protokołu, polecam IndieAuth lub stare OpenID.
3. Po kilkunastu miesiącach zdobędziesz podstawy podstaw kodowania backendu. Pamiętaj, by korzystać tylko i wyłącznie z internetu i forów.
4. Teraz sprawdzacze kodu, grupowanie zapytań SQL, nauka podstaw MVC i pierwsze ostrzeżenia o niepełnej wiedzy.
5. Czas na frontend. Stwórz aplikację mobilną oraz stronę internetową do czytania wpisów pobranych z WordPressa.
6. Po heroicznej walce z wyskakującymi błędami i własnymi słabościami zostaje już tylko najważniejszy szczegół; to wszystko na nic jeśli nie umiesz jasno formułować swoich myśli i zadawać odpowiednich pytań.
7. Najpierw plan na papierze, później robienie listy niezrozumiałych terminów i dopiero na końcu komputer. Z każdej niezrozumiałej rzeczy rób notatki + przykłady ale dopiero po stworzeniu planu co chcesz osiągnąć.
Może się to wydawać ekstremalne ale właśnie w ten sposób przeskoczyłem w pół roku z prostego HTML/CSS do podstaw programowania obiektowego i skupienia się na tym co chcę osiągnąć zamiast zastanawiania się jak to działa. Kiedyś marnowałem na to po kilka tygodni.