Nasza strona używa cookies. Dowiedz się więcej o celu ich używania i zmianie ustawień w przeglądarce. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Jak doskonalić się w sztuce programowania?

D.Pavlutin Web & mobile iOS developer. / https://rainsoft.io/
Algorytmy, języki i frameworki znać musisz, jeśli ekspertem w programowaniu chcesz zostać - Mistrz Yoda.
Jak doskonalić się w sztuce programowania?

Sztuka programowania staje się trudniejsza z każdym dniem. Prawie codziennie słychać o nowym frameworku (React, Vue.js i innych), nowym narzędziu do budowania (jak Webpack, Parcel). Każdego roku są wydawane także nowe wersje JavaScript (ECMAScript 2016, 2017, 2018). Inne obszary programowania są równie dynamiczne, np. aplikacje mobilne. Swift na dobre zagościł w świecie iOS, a Kotlin w Androidzie. Dużą popularność zdobywają też rozwiązania wieloplatformowe takie jak React Native czy Google Flutter. Co roku dostajemy nową wersję iOS i Androida. Znajomość wszystkich frameworków i narzędzi nie jest ani możliwa, ani nawet potrzebna.

Przedstawię w skrócie własne pomysły na to, jak poradzić sobie w skomplikowanym świecie developmentu. Chciałbym 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 i prostokąta.

Co będzie najbardziej efektywną strategią? Skupienie się na podstawach programowania. Fundamencie, który składa się z algorytmów, struktur danych, znajomości języka, zasad tworzenia i skalowania czystego kodu.

 

1. Koncepcje

Algorytmy

Ważna część podstaw programowania, zapisywana komputerowo za pomocą języka programowania. Algorytmy krok po kroku opisują operację, która musi zostać wykonana, aby osiągnąć zamierzony wynik. Najważniejsze z nich są pogrupowane w następujące kategorie:

  • Algorytmy sortujące: sortowanie bąbelkowe, sortowanie przez wstawianie, sortowanie szybkie
  • Algorytmy wyszukiwania: wyszukiwanie binarne, przeszukiwanie wszerz, przeszukiwanie wgłą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.


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. Liczba istniejących algorytmów jest ogromna. Wiele z nich leży u podstaw tworzenia oprogramowania i sieci.

Najpopularniejszym mitem jest to, że developer nie musi dokładnie wiedzieć, jak konkretny algorytm działa. Ta wymówka nie jest dobra, jeśli waszym celem jest zostanie profesjonalnym deweloperem. Znajomość algorytmów jest niezbędna, aby tworzyć skomplikowane aplikacje wysokiej jakości.

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. A rozwinięta intuicja jest wyznacznikiem naprawdę dobrego dewelopera. Oczywiście w połączeniu z doświadczeniem i dyscypliną.

Struktury danych

Jakość kodu składa się z efektywnego algorytmu oraz wygodnej struktury danych - równie ważnego aspektu. 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. 

2. Odwrócony trójkąt dla początkującego

Podzielmy umiejętność programowania według uproszczonego schematu, aby wizualizacja była prostsza:

  • Podstawy: 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), składni, operatorów, zmiennych
  • Framework: wszystko dotyczące frameworków (AngularJS, ReactJS, Cocoa Touch) oraz platform (Przeglądarka, Node.js)


Pierwszy poziom biegłości w tworzeniu oprogramowania jest przedstawiony za pomocą odwróconego trójkąta. Każdy programista, łącznie ze mną, zaczynał od bazowego 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. Taki developer zna język JavaScript na poziomie minimalnym, wystarczającym do kodowania w ReactJS. Dobrze radzi sobie z definicją zmiennych, funkcjami, modułami ES2015 i komponentami ReactJS. Ma jednak problemy z głębszymi konceptami JavaScript, takimi jak sposób działania this, dziedziczenie prototypowe, windowanie i event loop. Znajomość algorytmów i struktur danych u takiej osoby jest bardzo ograniczona. Brak głębokiej wiedzy o języku negatywnie wpływa na sposób, w jaki komponenty są w JavaScript kodowane. Zazwyczaj haki i dziwne obejścia problemu są używanie do tego, aby w ogóle wprawić wszystko w ruch. 

W przypadkach, kiedy część aplikacji może zyskać na zastosowaniu dobrze znanego algorytmu, deweloper może zobaczyć całą sytuację i ponownie „wynaleźć koło”. A takie „koła” wynalezione na nowo są najczęściej niskiej jakości i można traktować je jak stratę czasu. Większość używanych struktur danych to tablice, zwykłe obiekty JavaScript, ale nic poza tym.

3. Profesjonalista: prostokąt

Następny poziom profesjonalizmu dewelopera to prostokąt. Mam nadzieję, że sam jestem juz na tym etapie!

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 tablicę z wieloma elementami. Jeśli tablica jest rzadko zmieniana, deweloper wnioskuje, że rozsądne będzie ją posortować. W momencie, kiedy potrzebne jest wyszukiwanie, zastosuje wyszukiwanie binarne - w tej sytuacji bardzo wydajne. 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. Przedstawię to jako trójkąt o dużej, solidnej podstawie.

Ekspert potrafi widzieć korzyści z 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ż język programowania to narzędzie, za pomocą którego wyrażane są algorytmy, nie jest ważne, w jakim języku pisze developer. Ekspert potrafi używać kilku: JavaScript i Ruby czy C++ i Java.

5. Rekomendacje

Najbardziej popularne frameworki, a nawet języki prędzej czy później znikną i zostaną zastąpione nowszymi, lepszymi narzędziami - to nieodwracalny kierunek ewolucji. Jedyne, co możemy zrobić, to skupić nasz wysiłek na podstawach. Oczywiście, podstawy są trudne do przyswojenia. Wiele algorytmów nie jest łatwa ani do zapamiętania, ani do zrozumienia. Radzę się po po prostu przy tym dobrze bawić - możesz czytać skomplikowane algorytmy wielokrotnie. Możesz myśleć o korzyściach, jakie może przynieść konkretna struktura danych. Staraj się być coraz lepszym.

Podstawy są trudne do przyswojenia, mają jednak jedną dużą zaletę: nie zmieniają się szybko. Można powiedzieć, że od lat siedemdziesiątych nie utworzony żadnych nowych, znaczących algorytmów lub struktur danych. Można więc nauczyć się podstaw, 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 uwzględnia 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 i zauważających, że firmy te szukają niewłaściwych umiejętności, bo programista w rzeczywistej pracy nie ma tak naprawdę do czynienia z algorytmami sortującymi czy równoważeniem drzewa. 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 był stracony. Absolutna większość jest przekonana o dużym znaczeniu podstaw.
Osobiście jestem zwolennikiem podobnych rozmów kwalifikacyjnych. Obszar programowania rozwija się na tyle szybko, że firmy potrzebują developerów z solidną znajomością podstaw. Taki developer z jednej strony 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, my odpowiadamy: Żaden problem. Bierzemy kredkę, rozwiązujemy zadanie. Wszyscy są pod wrażeniem. 

Na drodze do profesjonalizmu nie ma skrótów. To właśnie nauka i praktyka sprawiają, ze stajemy się lepsi. A poruszać się możesz w trzech kierunkach jednocześnie. Podstawy, języki i frameworki sa równie ważne.

Specjalista od JavaScript może zacząć od:


Po przyswojeniu podstaw przechodzimy na kolejny poziom:

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 130 tysiącami naszych czytelników

Dowiedz się więcej