Doskonalenie się w sztuce programowania.

Sztuka programowania staje się trudniejsza z każdym dniem. Prawie codziennie słychać o nowym frameworku (AngularJS, ReactJS i innych), nowym narzędziu budowy (jak Webpack, Rollup). Nawet nowe wersje JavaScript (ECMAScript 2015, 2016, 2017) są wydawane co roku!
 

Inne obszary programowania są równie dynamiczne, na przykład aplikacje mobilne. 2 lata temu Apple ujawnił nowy język programowania Swift. System operacyjny iOS jest odnawiany co roku, jak również API i jego możliwości. Tak szybki postęp, choć jest dobrą wiadomością, jest jednak uciążliwy dla deweloperów.

Choć ludzkie zdolności intelektualne są ogromne, są też ograniczone. Nie jest to możliwe (a nawet nie jest potrzebne), aby znać wszystkie frameworki i narzędzia.

Jak ma w takim razie radzić sobie deweloper? Najbardziej efektywną strategią będzie skupienie się na podstawach. “Fundament” programowania składa się z algorytmów, struktur danych oraz znajomości języka programowania.

Żeby zostać profesjonalnym deweloperem, własne umiejętności trzeba bez wątpienia rozwijać, zwłaszcza w zakresie najnowszych technologii (takich jak React, Redux, Angular), a w międzyczasie poświęcać tyle samo sił na nauczenie się podstaw takich jak algorytmy, struktury danych, zasady tworzenia i skalowania czystego kodu.

W tym artykule chciałem przedstawić w skrócie własne pomysły na to, jak poradzić w skomplikowanym świecie developmentu. Chciałem również podzielić się różnymi podejściami do rozwoju umiejętności programisty, które nazywam fazami, ustrukturyzowanymi w kształtach obróconego trójkąta, prostokąta i trójkąta.

 

1. Koncepcje.


Algorytmy.

Ważną częścią podstaw programowania są algorytmy. Algorytm krok po kroku opisuje operację, która musi zostać wykonana, aby osiągnąć zamierzony wynik. Algorytmy są zapisywane komputerowo za pomocą języka programowania. Najczęściej używanymi językami są JavaScript, w przypadku aplikacji mobilnych na iOS - Swift (albo Objective-C).

Najważniejsze algorytmy są pogrupowane w następujące kategorie:

  • Algorytmy sortujące: sortownie bąbelkowe, sortowanie przez wstawianie, sortowanie szybkie. 
  • Algorytmy wyszukiwania: wyszukiwanie binarne, przeszukiwanie wszerz, przeszukiwanie w głąb.
  • Algorytmy najkrótszej ścieżki: algorytm Bellmana–Forda, algorytm Dijkstra's.
  • Algorytmy matematyczne: ciąg Fibonacciego, sekwencje liczbowe, największy wspólny mianownik, najmniejszy wspólny mnożnik, etc.

Liczba istniejących algorytmów jest ogromna. Wiele z tych algorytmów leżą u podstaw tworzenia oprogramowania i sieci.


Kiedy jest mowa o nauce algorytmów, najpopularniejszym mitem jest to, że deweloper nie musi dokładnie wiedzieć, jak działa konkretny algorytm. Można myśleć, że wszystkie istniejące algorytmy już są zaimplementowane, przetestowane i włączone do bibliotek standardowych. Może jednak nigdy nie mieliście do czynienia z algorytmem Bellmana-Forda w JavaScript.

Ta wymówka nie jest dobra, jeśli waszym celem jest zostanie profesjonalnym deweloperem. Znajomość algorytmów jest niezbędną, aby tworzyć wysokiej jakości skomplikowane aplikacje.

Oczywiście, algorytmy są włączane do standardowych bibliotek i deweloperzy nie mają potrzeby ręcznego ich pisania. Jednak brak doświadczenia może utrudnić rozwiązanie ewentualnego problemu w najbardziej optymalny i elegancki sposób. Biblioteki algorytmów istnieją, ale mniej doświadczony w pracy z algorytmami deweloper może przeoczyć chwilę, w której będą użyteczne.

Nauka algorytmów to cenne doświadczenie. Ich studiowanie i praktyka rozwijają intuicję, która pomaga w rozwiązywaniu trudnych problemów. Rozwinięta intuicja jest wyznacznikiem naprawdę dobrego dewelopera, połączona oczywiście z doświadczeniem i dyscypliną.

Struktury danych.

Struktury danych są równie ważnym aspektem. Nauka tego obszaru uczy właściwego sposobu przedstawiania informacji w aplikacji. Dobrze dobrana struktura danych ma spore zalety. Sprawia, że kod, który zarządza danymi, staje się prostszy i łatwiejszy w utrzymaniu. Operacje manipulacji danymi, przechowywanie, definicja zapytań stają się łatwiejsze w implementacji. Jakość kodu składa się z efektywnego algorytmu oraz wygodnej struktury danych.


2. Początkujący: trójkąt obrócony do góry nogami


Dla prostszej wizualizacji podziemy umiejętność programowania według następującego uproszczonego schematu:

  • Podstawy: to wszystko, co jest związane z algorytmami, strukturą danych, pytaniami z zakresu computer science, zasadami projektowania aplikacji (SOLID, KISS, DRY, SoC), skalowalnością.
  • Język: wszystko, co dotyczy języków programowania (JavaScript, Swift, Java), syntaksu, operatorów, zmiennych.
  • Framework: wszystko dotyczące frameworków (AngularJS, ReactJS, Cocoa Touch) oraz platform (Browser, NodeJS).

Pierwszy poziom biegłości w budowie oprogramowania to początkujący, który jest przedstawiony za pomocą obróconego do góry nogami trójkąta.

Każdy programista, łącznie ze mną, zaczynał od tego poziomu.

Początkujący deweloper najczęściej szczególnie interesuje się konkretnym frameworkiem, na przykład ReactJS. Przejrzał tutoriale na ten temat i dosyć dobrze go rozumie.

Język JavaScript taki deweloper zna na poziomie minimalnym, wystarczającym do kodowania w ReactJS. Dobrze sobie radzi z definicją zmiennych, funkcjami, modułami ES2015 i komponentami ReactJS. Ma jednak problemy z głębszymi konceptami JavaScript, takimi jak słowa kluczowe, dziedziczenie prototypowe, justowanie i pętla wydarzeń. Brak głębokiej wiedzy o języku negatywnie wpływa na sposób, w jaki komponenty są kodowane w JavaScript. Zazwyczaj tricki i obejścia są używanie do tego, aby w ogóle wprawić wszystko w ruch. Znajomość algorytmów i struktur danych u takiej osoby jest bardzo ograniczona.

W przypadkach, kiedy część aplikacji może zyskać na doświadczeniu algorytmizacji, deweloper może zobaczyć całą sytuację i ponownie “wynaleźć koło”, a takie “koła” wynalezione na nowo najczęściej są niskiej jakości i stratą czasu. Większość używanych struktur danych to obszary, płaskie obiekty JavaScript, ale nic poza tym.

 

3. Profesjonalista: prostokąt


Następny poziom profesjonalizmu dewelopera to prostokąt. (mam nadzieję, że sam jestem w tym obszarze!).

Profesjonalny deweloper doskonale wyćwiczył framework ReactJS i język JavaScript. Liczba błędów w jego kodzie jest minimalna. Widzi sytuacje, kiedy pewna struktura danych albo algorytm sprawiają, że kod staje się bardziej wydajny, jednak tylko do pewnego ograniczonego momentu.


Wytłumaczę to na przykładzie aplikacji mającej komponent, który ciągle przeszukuje obszar z wieloma elementami. Jeśli obszar jest rzadko zmieniany, deweloper wnioskuje, że rozsądne będzie, aby dokonać sortowania w tym obszarze. W momencie, kiedy potrzebne jest wyszukiwanie, wykorzysta binarny algorytm wyszukiwania, który w tej sytuacji będzie bardzo wydajny. “Prostokątny” deweloper umie tworzyć wysokiej jakości aplikacje, jednak nie zawsze w najbardziej efektywny sposób.

 

4. Ekspert: trójkąt


Najwyższy poziom rozwoju to ekspert, który doskonali się w każdym z trzech kierunków: podstawy, język i framework. Przedstawiamy go jako trójkąt o dużej solidnej podstawie.

 

Ekspert potrafi widzieć efektywność poszczególnych algorytmów i używać ich w praktyce, kiedy mogą zwiększyć wydajność kodu. Korzysta z wyboru najbardziej optymalnych struktur danych, upraszczając manipulacje nimi. Prawdziwym wyzwaniem jest wybór najbardziej efektywnego w danej sytuacji algorytmu spośród wszystkich dostępnych. Ten proces polega na uzyskaniu równowagi, która pomoże osiągnąć najlepszą wydajność.

Ponieważ programowanie to narzędzIe, za pomocą którego wyrażane są algorytmy, nie jest ważne, w jakim języku pisze deweloper. Ekspert potrafi używać kilku: JavaScript i Ruby czy C++ i Java.


5. Rekomendacje


Najbardziej popularne frameworki - nawet języki - prędzej czy później znikną, zostaną zastąpione nowszymi lepszymi narzędziami: to jest nieodwracalny kierunek ewolucji. Jedyne, co możemy zrobić, to skupić nasz wysiłek na podstawach. Oczywiście, podstawy są trudne do przyswojenia, algorytmy nie są łatwe do zapamiętania.

Moja rada jest taka: aby czerpać przyjemność z ich nauki, patrz na algorytmy od innej strony. Czytając skomplikowany algorytm wiele razy, warto się zastanowić, jakie korzyści mogą przynieść konkretne struktury danych.

Postaw sobie cel, aby zostać doświadczonym ekspertem developerem.

Choć podstawy są trudne do przyswojenia, mają one jedną dużą zaletę: nie zmieniają się zbyt szybko. Od lat osiemdziesiątych, a nawet siedemdziesiątych, nie zostały stworzone żadne znaczące, nowe algorytmy albo struktury danych. Można więc się nauczyć podstaw raz, od czasu do czasu robić powtórkę materiału, i zawsze pozostawać na wysokim poziomie profesjonalizmu.


Rozmowa rekrutacyjna


Duże korporacje programistyczne, takie jak Google, Apple czy Microsoft poważnie podchodzą do algorytmów i struktur danych. Rozmowa kwalifikacyjna w tych firmach zawiera sporo pytań z zakresu inżynierii komputerowej, kodowania na sucho, równoważenia drzew i tak dalej.

Przeczytałem wiele postów krytykujących podobne podejście, twierdzących, że te firmy szukają niewłaściwych umiejętności. Piszą, że developer nie ma do czynienia z algorytmami sortującymi czy równoważeniem drzewa w rzeczywistym programowaniu.

Takie argumenty można łatwo obalić: nigdy nie spotkacie programisty, który poświęcił czas na poznawanie algorytmów i struktur danych, i uważał by ten czas za stracony. Absolutna większość z nich jest przekonana o dużym znaczeniu co do znaczenia podstaw.

Osobiście jestem zwolennikiem podobnych rozmów kwalifikacyjnych, ponieważ obszar oprogramowania rozwija się na tyle szybko, że firmy potrzebują deweloperów, którzy mają solidną znajomość podstaw. Z jednej strony taki deweloper potrafi efektywnie rozwiązywać skomplikowane problemy. Z drugiej, może równie dobrze przyswajać kolejne języki i frameworki, dostosowując się do tempa rozwoju technologii.

No i na koniec, bycie profesjonalistą to przyjemność. Kiedy proszą nas o rozwiązanie problemu “z wykorzystaniem algorytmu Dijkstra”, i odpowiadamy “Żaden problem!” Bierzemy kredkę, rozwiązujemy zadanie, wszyscy są pod wrażeniem.

Nie ma skrótów na drodze do profesjonalizmu. To właśnie nauka i praktyka sprawiają, że stajemy się lepsi. Możesz się poruszać w trzech kierunkach na raz. Podstawy, języki i frameworki są równie ważne.

Specjalista od JavaScript może zacząć od:

 

Po przyswojeniu podstaw przechodzImy na kolejny poziom:


Jaka jest wasza opinia o sztuce tworzenia oprogramowania? Nie wahajcie się podzielić nią w komentarzach!