Pierwszy krok w podróż dookoła świata

Czy opłaca Ci się rozpoczynać naukę programowania?

Pytanie absolutnie fundamentalne, na które odpowiedź nasuwa się sama: pewnie! Same korzyści. Możliwość pracy z dowolnego miejsca na świecie, niezależność, prestiż, n-krotność średniej krajowej, praca (subiektywnie) bardzo ciekawa, rozwojowa, itd. itp...

Byłaby to jednak odpowiedź z mojego punktu widzenia. A tysiące godzin konsultacji programistycznych nauczyć mogą, że rzeczy nie zawsze wyglądają tak samo z każdej strony...

Albowiem bez jakiejkolwiek styczności, na temat programowania nie będziemy wiedzieć zbyt wiele. Na domiar złego, jest to dyscyplina, która wymaga pewnej inwestycji czasu.

Wstkutek powyższych faktów istnieje - w mojej ocenie - zbyt duża grupa ludzi zniechęcających się przedwcześnie, np. na widok przytłaczającej ilości technikaliów w ich pierwszym tutorialu. A może nawet nie spróbowawszy praktyki w ogóle.

Wyciągam zatem pomocną dłoń i pokazuję na czym tak naprawdę polega programowanie. W sposób możliwie najbardziej rzetelny oraz przystępny i przyjazny początkującym.

Czy nadaję się do programowania

To pytanie interpretuję mniej więcej jako: czy dam radę. Nie rozwodziłbym się tutaj zbyt długo, stwierdzając, drogi czytelniku, że istnieje bardzo duże prawdopodobieństwo, że dasz. Już sama twoja obecność na niniejszym blogu może na to wskazywać.

Być może błędem byłoby ogólnikowe stwierdzenie, że każdy sie nadaje. Zaryzykowałbym jednak tezę, że:

Nadaje się każdy, kogo programowanie zainteresuje

I nawet mimo, że całe życie się słyszało, że np. jest się humanistą1. To nasze powszechne polskie stwierdzenie, skutecznie zniechęcające do rozumienia matematyki, a które powinno się tępić, mówiąc niedelikatnie. Na marginesie na równi z tym, że pewne duże zwierzę z trąbą na coś komuś nadepnęło.

Coach mode on
Prawda jest taka, że nie ważne co Ci mówią. Ważne co czujesz Ty. Jeżeli Cię coś intryguje i wydaje się perspektywiczne, to nie wahaj się i spróbuj. Nawet jeżeli trudno jest przełamać schematy. Wyjdzie, nie wyjdzie, przynajmniej się spróbowało. Jest się bogatszym o to doświadczenie.

Dla każdego coś dobrego

Ale do rzeczy. Różnorodność w tematach okołoinformatycznych sprawia, że szanse na odnalezienie czegoś dla siebie są naprawdę duże.

Nawet jeżeli nie będziemy pogromcami algorytmów czy naukowcami zajmującymi się złożonością obliczeniową problemów spełnialności dla pewnych rozszerzeń logik. Nie musimy też od razu dostać się do zespołu odpowiedzialnego za organizację komercyjnych lotów w kosmos.

Może fajna wyda się grafika (w niektórych odsłonach wymagająca sporo matematyki), różnego rodzaju design (modne słowo), administracja, UX, tworzenie oprogramowania bardziej lub mniej inteligentnego.

Nie samym programowaniem

W tym miejscu trzeba przede wszystkim zaznaczyć, że programowanie to baardzo szeroka dziedzina. Już w samym wytwarzaniu oprogramowania jest cały ogrom możliwości.

Nawet jeżeli się nie chce programować na pełen etat, to posiadanie zaplecza technicznego znakomicie pomoże nam w roli project/product ↔ ownera/managera. Do tego dobry angielski i wszystkie drzwi stoją przed nami otworem.

Przyrzekam, że nie są to bajki. Na przykład w całym ekosystemie w mojej firmie (Klarna!) równolegle ma miejsce wiele inicjatyw. Bardziej lub mniej strategicznych. Bardziej lub mniej skomplikowanych i czasochłonnych.

Niektóre z nich rozciągają się na wiele komponentów i zespołów, które do pewnego stopnia zarówno same, jak i między sobą się organizują. Poza samym zaprogramowaniem, ktoś musi zadbać o research i zdefiniowanie wymagań oraz koordynację, dotrzymanie terminów, zaplanowanie dodatkowych testów, komunikację z naszymi klientami np. w sprawie ustalenia kiedy co ma zostać uruchomione na produkcji.

Czasem sam jestem zdziwiony jak szybko i dynamicznie to wszystko się dzieje, niczym operacja na żywym organiźmie. I jak dużo szybkiego myślenia on-line wymaga. Będąc porywającym i jednocześnie ciężkim do wytłumaczenia/zrozumienia dla kogoś spoza branży2.

No ale znowu odpływam w off-topic. Aha! Jak to zwykle bywa, oczywiście nie wszędzie jest tak kolorowo.

Odpowiedź na wszystko się znajdzie

Long story short, patrzymy na poniższy obrazek. Po kliknięciu flagi piłka powinna zacząć się ruszać. Próbujemy za nią nadążyć z zieloną paletką przy pomocy klawiszy oraz

A teraz krótka piłka. To co widzimy, to baza dla Twojego zadania. Pozwoli ona oszczędzić trochę czasu potrzebnego na rozpoczęcie projektu od nowa. Tutaj na zasadzie analogii będzie można rozkminić co i jak trzeba zaprogramować dalej.

Idziemy zatem do strony projektu Simple Pong. Napisany jest on w Scratchu – bardzo fajnym swoją drogą językiem na początki programowania.

Teraz klikamy See Inside. Zobaczymy planszę oraz mnóstwo kolorowych klocków. Te klocki to nasz program. Otóż każdy element-obrazek na planszy ma swój kod, opisujący jego zachowanie.

Jeżeli program jest dla Ciebie z grubsza zrozumiały, to kontynuuj czytanie. W przeciwnym razie zajrzyj do ostatniego paragrafu.

Zadanie

Dla wygodny zalecam zrobienie remiksu tego projektu i założenie swojego konta w Scratchu w celu zapisania projektu na tymże koncie. Powinno pójść bardzo szybko. A teraz do dyspozycji masz poniższe zadanie:

Zadanie nr 1
Dodanie nowego gracza, sterującego paletką u góry ekranu przy pomocy dwóch wybranych klawiszy (np. a i d). Pamiętaj, że piłka powinna się prawidłowo odbijać od jego paletki (tj. w dół), a gra winna się zakończyć w przypadku niezłapania piłki.

Zatem do dzieła! Należy się pozytywnie nastawić i spróbować znaleźć w tej aktywności choć odrobinę zabawy. Pomocny może być następujący wykres interpretacji wartości liczbowej kierunku w Scratchu:


Teraz możemy spokojnie zasiąść do Scratcha, zostawiając lekturę na później.

Dodatkowe wyzwania

W razie gdyby poszło zbyt łatwo, mam propozycje następujące:

  • Możliwość wychodzenia do siatki dla obu graczy ograniczona do połowy planszy
  • Wprowadzenie licznika odbić
  • Klawisz natychmiastowego zwolnienia prędkości piłki dla każdego z graczy, aktywowany po każdych n odbiciach
  • Podobnie klawisz czasowego zwiększenia prędkości piłki po następnym odbiciu, również aktywowany po każdych n odbiciach
  • Wprowadzenie realistycznych odbić piłki od paletek zamiast ustalania losowego kierunku

Starczy na pewno na dobrych kilka godzin. Dodam na marginesie, że miałem przyjemność zorganizować tego typu sesję w zaprzyjaźnionym gronie. Jeszcze w czasie, gdy niniejszy wpis był w trakcie edycji. Było mega! Zadanie bazowe i pierwsze z listy dodatkowych ochoczo wykonali wszyscy, wykazując duże zainteresowanie tematem.

Interpretacja wyników

Dla mnie interpretacja krótka i węzłowata. Jeżeli tylko zadanie Cię zainteresowało, to znaczy że wynik sprawdzianu jest pozytywny. Jeżeli obudziło w Tobie zmysł inżyniera, to jeszcze lepiej.

Nie jest istotne ile czasu to zajęło czy inne tego typu rywalizacyjne rzeczy. Tutaj nie ma wyścigu, ważne że się spróbowało. Każdy na początku ma swoje tempo i tylko od niego zależy czy będzie chciał się doskonalić czy nie.

Dodam także, że aktywność posiada cechy prawdziwego, spotykanego na co dzień w pracy programisty zadania. Rzadzko implementuje się (albowiem kiedyś bywało tak częściej) aplikację, produkt czy komponent od początku do końca naraz. Powszechnie odbywa się to w sposób iteracyjny – tzw. zwinny. I tak to też miało miejsce u nas.

Dla kogo ten eksperyment

Eksperyment, mam nadzieję, będzie użyteczny dla wszystkich, którym choć raz przeszło przez myśl:

Co to właściwie jest to całe programowanie?

Śmiało i z całą odpowiedzialnością mogę powiedzieć, że przykład wybrałem odpowiednio reprezentatywny. To co tam trzeba było zrobić – to pozamienianie i dodanie nowych klocków, to w pewnym przybliżeniu coś co robię na co dzień. Z tym, że mam przed oczami dużo bardziej elastyczny i ekspresyjny tekst zamiast gotowych bloków.

Główną motywacją dla tego wpisu była próba dostarczenia zasobów pomocnych w decyzji do rozpoczęciu nauki programownia. Zakładając po trochu, że dotyczy to osób z branży innej niż IT.

Decyzja o zmianie branży czy kierunku studiów wiąże się z koniecznością inwestycji i ryzykiem. Czy to ma sens? Czy mi się to spodoba i zainteresuje? Warto dowiedzieć się jak najwięcej.

Jak się do tego kroku zabrać?

Tutaj już tylko tradycyjne sypnięcie kilkoma radami z rękawa – lista poniżej. Być może temat zasłuży kiedyś na osobny artykuł. A w razie trudności z wyborem konkretnego języka programowania polecam jeden z moich wcześniejszych wpisów.

  1. Iść na studia warto:
    • lepiej jest trenować w grupie niż w samemu
    • warto czasem dowiedzieć się czego się nie wie
    • można też się paru rzeczy dowiedzieć i potem już je wiedzieć ;)
    • brak studiów może być przeszkodą przy pierwszej pracy – i tu ciekawostka: sam dyplom nie zawsze jest niezbędny, fakt bycia na n-tym roku studiów często załatwia sprawę
  2. Iść na studia trzeba jak się jest dopiero co po liceum
  3. Angielski to pozycja obowiązkowa
  4. Jak się jest z innej branży, to można zniwelować próg wejścia:
    • wstępnie ucząc się programować po godzinach
    • książki, blogi, tutoriale i różnorakie internetowe akademie
    • dołączając do projektów open source będąc już na trochę wyższym poziomie
    • można rozważyć studia wieczorowe lub zaoczne
    • wszelkie krótkoterminowe kursy traktować raczej jako dodatek
  5. Niektórzy rozpoczynają od aplikacji mobilnych – Android/iOS
    • być może jest tam względnie niższy próg wejścia – żeby zacząć doświadczony programista musi nauczyć się mniej więcej podobnych rzeczy co ktoś z trochę mniejszym doświadczeniem
    • można stworzyć portfolio programując kilka mniejszych aplikacji
  6. Powyższe nie musi być regułą, można równie dobrze napisać np. aplikację webową
  7. Warto spróbować dostać się w miarę możliwośći nawet na średniopłatne praktyki, a na stanowisko juniora próbować kiedy umie się już trochę więcej
Disclaimer: lista powyższa dostarczana jest ,,taką jaką jest" bez jakichkolwiek gwarancji jawnych ani domniemanych, w tym między innymi gwarancji przydatności.

Jak długo trzeba się uczyć?

Jak już kiedyś wspominałem w tym artykule uczyć trzeba się cały czas. I to nie tylko dlatego, że absolutna perfekcja jest nieosiągalna.

Także dlatego że branża ta jest bardzo dynamiczna. Choć otuchą jest fakt, że sztuka programowania, a szczególnie jego teoretyczne podstawy są ponadczasowe i raz naumiane, starczą nam na długo.

Ale wracając do ważnego pytania. Ile czasu muszę zainwestować żeby to się zaczęło zwracać? Jest ono zupełnie właściwe i trudne do odpowiedzenia zarazem.

Występuje tu bardzo dużo zmiennych. Jaki język, jaki poziom uznajemy za docelowy. Na ile możemy sobie pozwolić na pewne teoretyczne braki. Na ile zależy nam zwyczajnie na komercyjnym kodowaniu, które przecież nie wymaga doktoratu.

W ramach ciekawostki powiem, że prezydent Obama wie, że sortowanie bąbelkowe nie należy do najszybszych.

Spotkałem się natomiast z programistami z wieloletnim stażem, którzy nie orientowali się w sposób konkretny w temacie. Oczywiście wypadałoby, ale ich przykład pokazuje, że nie trzeba.

Ważnym jest także z jakiego poziomu startujemy. Czy jesteśmy zaznajomieni z komputerami. Czy używaliśmy kiedykolwiek Linuksa.

Można się już zatem powoli zacząć gubić: o co właściwie pytamy? I niestety pytanie w każdym przypadku jest trochę inne. W każdym przypadku będzie także inna odpowiedź.

Gdybym miał mówić z własnego doświadczenia, to wyszłoby, że programowałem niekomercyjnie przez okres około 6-7 lat zanim zostałem przyjęty na praktyki. Z tym, że tylko połowę tego intensywnie. Resztę pewnie nie więcej niż średnio 1 godzinę dziennie.

Mam jednak znajomych, którzy rozpoczęli programowanie dopiero na studiach, a podobne praktyki, rozpoczęli zdaje się na 4. roku. No ale wtedy kodowali bardzo dużo, spędzając większość czasu na zadaniach z różnorakich list.

Myślisz o zwrocie w karierze?

Z drugiej strony faktem jest, że studia te bywały miejscami mocno teoretyczne. Być może rozsądnie wybierając co jest komu do szczęścia potrzebne, a co nie, da się znacząco skrócić ten proces.

No i tutaj niestety dość łatwo się zagalopować. Nierozważne optymalizowanie ilości czasu spędzonego na naukę szybko poskutkuje słabym efektem końcowym. A przecież nie chcemy być programistami byle jakimi.

Bądź co bądź, wymaga to sporej ilości wysiłku. Nie opieraj się na pozornie łatwych ścieżkach na skróty. Plan powinien być  oparty na realistycznych założeniach czasowych, liczonych raczej w miesiącach i latach niż tygodniach. Stosownie do bazowej wiedzy i doświadczenia.

Gorąco jednak zachęcam wszystkich do spróbowania. Chociażby do rozwiązania Scratchowego zadania. Jak się spodoba, to następnego. I tak dalej. Przy odpowiedniej determinacji oraz zdrowych oczekiwaniach z pewnością się to opłaci.

Ciekaw jestem jak czasowe statystyki wyglądają u innych programistów. Szczególnie tych, którzy są samoukami3. Zachęcam do podzielenia się swoimi doświadczeniami!

Dziękuję za uwagę i do przeczytania wkrótce

Suplement

Opis kodu piłki. Komentarze w kolorze szarym nad linijkami, których dotyczą:

  when FLAG clicked
  // ustawienie kierunku lotu piłki
  point in direction 160
  // ustawienie samej piłki na planszy
  go to x: 0 y: 50
  // w pętli w nieskończoność wykonuj
  forever
    // jeżeli piłka dotyka paletki
    if touching Paddle? then
      // ustaw kierunek lotu piłki losowo pomiędzy -60 i 60
      point in direction pick random -60 to 60
    // w przeciwnym wypadku
    else
      // jeżeli piłka przekroczyła linię paletki (-120 u nas)
      if y position < -120 then
        // wyświetl chmurkę z podanym napisem
        say "Game Over" for 5 secs
        // zatrzymaj wszystkie skrypty (piłki i paletki)
        stop all
      // w przeciwnym przypadku
      else
        // odbij piłkę jeżeli jest na krawędzi planszy
        if on edge, bounce
    // tutaj przesuwamy piłkę 10 kroków zgodnie z jej kierunkiem
    move 10 steps

Jak widzimy działanie piłki polega na nieskończonej pętli, w której wykrywamy i reagujemy na zdarzenia: odbicie piłki paletką, przegranie, odbicie od krawędzi.

Niezależnie tego piłka porusza się zgodnie z jej kierunkiem 10 kroków w każdym cyklu. Dla łatwiejszego zrozumienia polecam spróbować zwiększyć lub zmniejszyć tę liczbę.

Podobnie kod paletki:

  when FLAG clicked
    goto x: 0 y: -120
    forever
      // jeżeli strzałka w prawo kliknięta
      if key right arrow pressed? then
        // przesuń paletkę o 10 wzdłuż osi x
        change x by 10
      // jeżeli strzałka w lewo kliknięta
      if key left arrow pressed? then
        // przesuń paletkę o -10 wzdłuż osi x
        change x by -10

W razie trudności w określeniu jak interpretować te liczby, polecam zapoznać się z planszą, przesuwając po niej kursor. Powinniśmy widzieć wtedy aktualne koordynaty.

  1. Choć to często niepoprawnie używane stwierdzenie. Humanistą bowiem może być bardziej biolog czy matematyk niż pisarz i dziennikarz. 

  2. Już sama liczba potrzebnych angielskich słów sprawia, że nie opowiadam o tego typu wydarzeniach podczas niedzielnego obiadu. 

  3. Nie wiedzieć czemu słowo to brzmi dla mnie jakby negatywnie. Osobiście jestem gitarowym samoukiem i dobrze mi z tym. Pewnie jest za bardzo podobne do słowa nieuk

Komentarze