Вы находитесь на странице: 1из 75

Warsztat Juniora

pymasters.pl 1
Warsztat Juniora

Spis treści
Wstęp��������������������������������������������� 4
Umiejętności twarde������������������������������� 5
1. Znajomość języków programowania. �������������������� 5
Kod “Pythonic”? �������������������������������������������������� 5
Kluczowe elementy kodu “Pythonic” �������������������������������� 6
2. Rozumienie Algorytmów i Struktur Danych 
�������������� 9
3. Podstawowe Struktury Danych w Pythonie �������������� 9
1. Listy���������������������������������������������������������� 9
2. Krotki (Tuples)����������������������������������������������� 10
3. Słowniki (Dictionaries)��������������������������������������� 10
4. Zbiory (Sets)������������������������������������������������� 11
5. Łańcuchy Znaków (Strings)������������������������������������� 11
6. Kolejki (Queues) ��������������������������������������������� 12

Złożoność Algorytmu������������������������������ 13
1. Złożoność czasowa 
����������������������������������� 13
2. Złożoność przestrzenna ����������������������������� 13
3. Notacja złożoności ��������������������������������� 13
Przykłady ������������������������������������������������������� 14
Gdzie się tego nauczyć? ������������������������������� 16
A jak się tym pochwalić? 
������������������������������� 18
Architektura Oprogramowania���������������������� 20
Git oraz GitHub���������������������������������� 26
Czym jest Git? 
����������������������������������������� 26
Czym jest GitHub? ������������������������������������� 29
Kluczowe funkcje i aspekty GitHuba������������������������������� 29
Jak pracować z Gitem i GitHubem: GitFlow 
��������������� 31
Kluczowe Gałęzie w Git Flow ������������������������������������� 31
Przepływ Pracy w Git Flow ��������������������������������������� 34
Jak ćwiczyć? 
������������������������������������������� 35
Debugowanie, czyli identyfikacja
i naprawianie błędów.���������������������������� 36

pymasters.pl 2
Warsztat Juniora

1. Analiza Komunikatów o Błędach 


����������������������� 36
Zacznijmy od wykorzystania Google.������������������������������� 40
Wykorzystanie AI. ����������������������������������������������� 41
2. Użycie Instrukcji Wypisujących ��������������������� 48
3. Podstawowe Zrozumienie Kodu 
������������������������� 57
4. Testowanie i Weryfikacja ��������������������������� 57
5. Cierpliwość i systematyczność 
����������������������� 61
6. Dokumentowanie postępów 
����������������������������� 62
Język Angielski���������������������������������� 63
Jak się uczyć angielskiego? ��������������������������� 63
Umiejętności miękkie.���������������������������� 65
Jak przejść rozmowę kwalifikacyjną?�������������� 68
A co na rozmowie? ������������������������������������� 70
Jak ćwiczyć rozmowy rekrutacyjne? ��������������������� 71
Podpowiedzi od rekruterów ����������������������������� 72
Zakończenie.������������������������������������� 75

pymasters.pl 3
Warsztat Juniora

Wstęp
Witaj w krótkim przewodniku po kluczowych umiejętnościach, które każdy
początkujący programista Pythona (i nie tylko) powinien opanować.

Nazywam się Jacek Ostański i w Pythonie programuje od 15 lat. Dodatkowo


prowadzę bloga akademiait.com.pl oraz społeczność programistów
Pymasters.pl.

Chcę przekazać Ci wiedzę, która pomoże Ci stawiać pierwsze kroki w pro-


gramowaniu. Porozmawiamy sobie o umiejętnościach twardych, takich jak
pisanie semantycznego kodu, rozumienie struktur danych, złożoność algo-
rytmów, debugowanie, Git, GithHub, Gitflow oraz wiele innych.

Pokażę jak wykorzystać AI do pomocy przy pisaniu kodu i szukaniu błędów,


a nawet przeprowadzenia symulacji rozmowy o pracę.

Omówię również umiejętności miękkie, takie jak komunikacja, słuchanie,


otwartość, kreatywność i krytyczne myślenie. Umiejętności te potrafią prze-
ważyć rozmowę kwalifikacyjną na Twoją korzyść, nawet jeśli konkurujesz
z bardziej doświadczonymi, gburowatymi, programistami.

Na koniec podzielę się z Tobą wskazówkami z ponad 50 rozmów z rekrute-


rami, które przeprowadziłem w ostatnich tygodniach.

Zapraszam do lektury.

pymasters.pl 4
Warsztat Juniora

Umiejętności twarde
W świecie programowania, gdzie zmiany technologiczne są szybkie i nie-
ustające, zachowanie konkurencyjności na rynku pracy wymaga nie tylko
zrozumienia aktualnych technologii, ale także ciągłego doskonalenia umie-
jętności i adaptacji do nowości. Tworzenie oprogramowania wymaga szeregu
specyficznych, “twardych” umiejętności, które są konieczne do skutecznego
projektowania, implementowania i testowania kodu. Poniżej omówimy kil-
ka fundamentalnych twardych umiejętności, które każdy programista powi-
nien opanować.

1. Znajomość języków
programowania.
“Good Code Is Easily Read and Understood, in Part and in Whole”
(Ref: www.toptal.com/software/six-commandments-of-good-code).

Zrozumienie języka programowania to podstawa. Programista nie tylko musi


umieć pisać kod. Ten kod powinien być czysty, pokazywać dogłębną znajo-
mość języka, stosowanych w nim konwencji, struktur danych i algorytmów.
Dobry kod musi być łatwy do przeczytania i zrozumienia. Zarówno przez
Twoich współpracowników, jak i Ciebie z przyszłości, kiedy wrócisz do kodu
za rok.

Kod “Pythonic”?

Przeglądając zasoby internetu, StackOverflow czy innych portali, na których


toczą się dyskusje i porady programistyczne, można natknąć się na określe-
nie “Pythonic”.

Termin “Pythonic” odnosi się do kodu, który nie tylko działa poprawnie w ję-
zyku Python, ale także wykorzystuje jego najlepsze praktyki i zalecenia do-
tyczące stylu i konwencji. Kod jest uważany za “Pythonic”, gdy jest zgodny

pymasters.pl 5
Warsztat Juniora

z filozofią języka Python i jest napisany w sposób, który jest charakterystycz-


ny i zalecany dla tego języka.

Kluczowe elementy kodu “Pythonic”:

1. Zgodność z PEP 8
PEP 8 to dokument, który zawiera wytyczne i konwencje dotyczące stylu
kodowania w Pythonie. Kod “Pythonic” powinien przestrzegać tych wy-
tycznych, aby być czytelnym i spójnym.

2. Czytelność
“Kod jest czytany dużo częściej, niż jest pisany” - to jedno z kluczowych prze-
słań zawartych w „The Zen of Python”. Kod powinien być łatwy do zrozu-
mienia.

3. Wykorzystanie idiomów Pythona


Kod “Pythonic” skorzysta z idiomów i konstrukcji językowych charaktery-
stycznych dla Pythona, np. list comprehensions czy wyrażeń generatoro-
wych.

4. “Flat is better than nested”


Minimalizowanie zagnieżdżeń i utrzymywanie płaskiej struktury, aby
zwiększyć czytelność, jest ważnym elementem stylu “Pythonic”.

5. Wykorzystanie standardowej biblioteki


Python posiada bogatą standardową bibliotekę, która jest szeroko uzna-
wana. Kod “Pythonic” powinien korzystać z tych narzędzi, zamiast wynaj-
dować koło na nowo.

6. “Explicit is better than implicit”


W stylu kodowania “Pythonic” zaleca się pisanie kodu w sposób jawny
i klarowny, unikając zakładania, że czytelnik będzie wiedział, o co chodzi,
i unikając stosowania niejasnych konwencji.

pymasters.pl 6
Warsztat Juniora

Przykład

Nie jest bardzo “Pythonic”:

def get_squares(l):
s = []
for i in l:
s.append(i*i)
return s

Jest bardziej “Pythonic”:

def get_squares(lst):
return [x*x for x in lst]

Obie funkcje robią to samo. Druga jest bardziej zwięzła, czytelna i wykorzy-
stuje idiom Pythona (list comprehension), co jest zgodne stylem kodowania
“Pythonic”.

Kod Pythonowy powinien być zwięzły, czytelny, korzystać z udogodnień, ja-


kie daje Python oraz być sformatowany zgodnie ze standardami języka.

Formatowanie i zgodność z PEP8 można uzyskać za pomocą narzędzi takich


jak Black. Black może być zainstalowany w wielu edytorach black.readthe-
docs.io/en/stable/integrations/editors.html. W Visual Studio Code Black jest
uruchamiany przy każdym zapisie pliku *.py i wtedy formatuje kod.

# Non formatted code


variable = {
”ala”: 1,
”ma”: 2,
”kota”: 3
}

pymasters.pl 7
Warsztat Juniora

# After Black
variable = {”ala”: 1, ”ma”: 2, ”kota”: 3}

Co to daje? Pozwala się skupić na pisaniu kodu. Jego wygląd będzie już ład-
nie “ogarnięty” przez automat. Co więcej, u każdego członka zespołu kod
będzie formatowany wg tych samych zasad. To pozwala uniknąć bałaganu
i problemów przy Code Review.

Żeby zobrazować problem, wyobraźmy sobie następującą sytuację. Jest ze-


spół 3 programistów. Jeden z nich używa formattera kodu w postaci Black,
pozostała dwójka pisze jak im się podoba. W zespole jest używane central-
ne repozytorium Gita. Programista, który używa formattera kodu, jest po-
proszony o małą poprawkę w pliku nad krórym pracował kolega - niech to
będzie literówka w zwracanym komunikacie błędu. Bardzo drobna zmiana.
Programista otwiera plik, poprawia literówkę i zapisuje plik. W tym momen-
cie uruchamia się Black. Okazuje się nagle, że w pliku jest, na przykład, 50
zmodyfikowanych linii:
• przeformatowane słowniki (jak w przykładzie powyżej)
• dodane spacje przed znakami +, -, =
• pousuwane zbędne spacje z konców wierszy
• i wiele innych
Nasz programista tylko zmienił jedną literkę, a jeśli zrobi commita ze zmia-
nami Blacka, historia pliku będzie wskazywać, że on jest autorem większości
zmian. Powoduje to, że historia Gita staje się bezużyteczna. Co więcej, code
review zamiast trwać 10 sekund, będzie trwało… 10 minut (co najmniej) - bo
trzeba ustalić co się stało i skąd te wszystkie zmiany. Gdyby wszyscy człon-
kowie zespołu używali formattera kodu, problem by nie wystąpił.

pymasters.pl 8
Warsztat Juniora

2. Rozumienie Algorytmów
i Struktur Danych
Zrozumienie algorytmów i struktur danych jest kluczowe do tworzenia efek-
tywnego oprogramowania. To nie tylko pomaga w rozwiązywaniu proble-
mów i optymalizacji kodu, ale również ułatwia wybór najodpowiedniejszych
rozwiązań pod kątem wydajności i złożoności.

3. Podstawowe
Struktury Danych w Pythonie
Programowanie w Pythonie wymaga znajomości pewnych podstawowych
struktur danych, które umożliwiają efektywne przechowywanie i organizo-
wanie danych w programie. Oto niektóre z nich:

1. Listy

• Definicja:
Dynamiczna tablica, która może przechowywać elementy różnych typów.

• Zastosowania:
Używane, gdy potrzebujesz kolekcji elementów, które mogą być zmieniane.

• Operacje:
append(), remove(), insert(), pop(), sort() itp.

my_list = [1, 2, 3, ”Python”]


my_list.append(4) # Dodanie elementu do listy
my_list.remove(1) # Usunięcie elementu z listy

pymasters.pl 9
Warsztat Juniora

2. Krotki (Tuples)

• Definicja:
Uporządkowana, niemodyfikowalna kolekcja elementów.

• Zastosowania:
Używane, gdy wartości nie powinny być zmieniane po inicjalizacji.

• Operacje:
Indeksowanie, count(), index().

my_tuple = (1, 2, 3, ”Python”)


first_element = my_tuple[0] # Indeksowanie krotek

3. Słowniki (Dictionaries)

• Definicja:
Nieuporządkowana kolekcja danych w formie par klucz-wartość.

• Zastosowania:
Używane, gdy dane są zmapowane na unikalny identyfikator lub “klucz”.

• Operacje:
keys(), values(), items(), get(), pop(), update().

my_dict = {”key1”: ”value1”, ”key2”: ”value2”}


my_dict[”key3”] = ”value3” # Dodanie nowej pary klucz-wartość
del my_dict[”key1”] # Usunięcie pary klucz-wartość

pymasters.pl 10
Warsztat Juniora

4. Zbiory (Sets)

• Definicja:
Nieuporządkowana kolekcja unikalnych elementów.

• Zastosowania:
Używane, gdy konieczne jest unikanie duplikatów i szybkie sprawdzanie
przynależności elementów.

• Operacje:
add(), remove(), union(), intersection(), difference().

my_set = {1, 2, 3, 4}
my_set.add(5) # Dodanie elementu do zbioru
my_set.remove(2) # Usunięcie elementu ze zbioru

5. Łańcuchy Znaków (Strings)

• Definicja:
Kolekcja znaków ujęta w pojedyncze lub podwójne cudzysłowy.

• Zastosowania:
Przechowywanie i manipulowanie tekstem.

• Operacje:
split(), replace(), upper(), lower(), strip().

my_string = ”Hello, Python!”


new_string = my_string.replace(”Hello”, ”Hi”) # Zmiana frag-
mentu łańcucha znaków

pymasters.pl 11
Warsztat Juniora

6. Kolejki (Queues)

• Definicja:
Struktura danych typu FIFO (First In, First Out).

• Zastosowania:
Używane, gdy konieczne jest organizowanie danych w sposób sekwen-
cyjny.

• Operacje:
enqueue, dequeue.

from queue import Queue


my_queue = Queue()
my_queue.put(1) # Dodanie elementu do kolejki
my_queue.get() # Pobranie elementu z kolejki

Te struktury danych są podstawą większości algorytmów i są używane w co-


dziennej pracy programistów Pythona. Właściwe dobranie struktury danych
do problemu może być kluczowe dla wydajności danego algorytmu.

pymasters.pl 12
Warsztat Juniora

Złożoność Algorytmu
Złożoność algorytmu odnosi się do ilości zasobów (takich jak czas oblicze-
niowy i pamięć), które są potrzebne do jego wykonania. Analiza złożoności
algorytmu pomaga ocenić, jak szybko wzrasta ilość zasobów potrzebnych
do przetworzenia danych w miarę wzrostu ich rozmiaru.

1. Złożoność czasowa
• Definicja:
Jak czas wykonania algorytmu zmienia się w miarę zmiany rozmiaru da-
nych wejściowych.

2. Złożoność przestrzenna
• Definicja:
Jak ilość używanej pamięci zmienia się w zależności od wielkości da-
nych wejściowych.

3. Notacja złożoności
• Często używa się notacji „Big 0”, np. 0(1), 0(n), 0(log n), 0(n^2) itp.
• 0(1) oznacza złożoność stałą. Zasoby potrzebne do wykonania algorytmu
nie są zależne od ilości danych wejściowych (przykład poniżej).
• 0(n) oznacza złożoność liniową. Potrzebne zasoby rosną liniowo wraz ze
wzrostem rozmiaru danych wejściowych. Przykład: 1 litera to 1 bajt, 2 li-
tery to 2 bajty, itp.

pymasters.pl 13
Warsztat Juniora

• 0(log n) to złożoność logarytmiczna. Zasoby rosną w zależności lo-


garytmicznej o podstawie 10, np. dla 100 elementów 0(log n) wynosi
0(log 100), czyli ok. 2 x zasoby dla pojedynczego elementu. Algorytm o tej
złożoności jest zdecydowanie mniej zasobożerny od 0(n)
• 0(n^2) lub 0(n2) powinien być już dość oczywisty. “Zasobożerność” algo-
rytmu rośnie wraz z kwadratem ilości danych wejściowych, np. 10 ele-
mentów potrzebuje 100 razy więcej zasobów niż 1 element (102).
• 0(n^3) lub 0(n3) - podobnie jak wyżej, złożoność rośnie wraz z 3 potęgą
ilości elementów wejściowych.
• i wiele innych zapisów, np. 0(n log n). Zainteresowanym polecam www.al-
gorytm.edu.pl/matura-informatyka/zlozonosc-algorytmu oraz inne źró-
dła online.

Przykłady

Jednym z prostych przykładów algorytmu 0(1) w Pythonie jest dostęp do


określonego elementu w liście (lub innej strukturze danych o dostępie loso-
wym jak tablica) poprzez jego indeks. Czas potrzebny na dostęp do elemen-
tu jest stały i nie zmienia się niezależnie od rozmiaru listy.

def access_element(arr, index):


return arr[index]

# Przykład użycia
arr = [10, 20, 30, 40, 50]
index = 3
print(access_element(arr, index)) # Wynik: 40

Sortowanie bąbelkowe jest klasycznym przykładem algorytmu sortującego,


który jest często używany głównie ze względów edukacyjnych zamiast w prak-
tycznych aplikacjach ze względu na jego niską wydajność. Niemniej jednak
można pokazać pewne optymalizacje, które mogą wpłynąć na jego wydajność.

pymasters.pl 14
Warsztat Juniora

Standardowy algorytm sortowania bąbelkowego (mniej wydajny):

def bubble_sort_basic(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr

• Złożoność czasowa: 0(n^2)


• Uwagi: Algorytm wykonywany jest do końca, nie bierze pod uwagę sy-
tuacji, gdy lista jest już posortowana lub zostaje posortowana w trakcie
wykonywania. Nawet jeśli nie zachodzi potrzeba więcej zamian, algorytm
nadal wykonuje wszystkie iteracje.
Zoptymalizowany algorytm sortowania bąbelkowego (bardziej wydajny).

def bubble_sort_optimized(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
return arr

• Złożoność czasowa: 0(n^2) w najgorszym przypadku, ale 0(n) w najlep-


szym przypadku.
• Uwagi: Wersja ta jest optymalizowana w taki sposób, że przerywa swo-
je działanie, gdy w trakcie całej iteracji przez listę nie dokonuje ani jed-
nej zamiany. Oznacza to, że jeśli lista jest już posortowana (lub zostaje

pymasters.pl 15
Warsztat Juniora

posortowana w trakcie wykonywania), algorytm kończy swoje działanie


przedwcześnie, co sprawia, że jest bardziej wydajny niż wersja podsta-
wowa.
Podsumowując, obie wersje algorytmu mają zasadniczo tę samą złożoność
obliczeniową w najgorszym przypadku, ale różnią się znacząco pod wzglę-
dem wydajności w praktycznych scenariuszach, szczególnie gdy dane są
częściowo lub całkowicie posortowane. To ukazuje, jak istotne może być
dostosowywanie algorytmu do konkretnego przypadku użycia.

Dla programisty na poziomie Juniora moim zdaniem, wystarczy trzymanie


się zasady znanej z PEP8: “Flat is better than nested”: unikanie zagnieżdżo-
nych pętli for.

Gdzie się tego nauczyć?


Poniżej przedstawiam listę popularnych serwisów internetowych, które
umożliwiają ćwiczenie umiejętności algorytmicznych poprzez rozwiązywanie
różnorodnych zadań i wyzwań programistycznych. Niektóre z nich są płat-
ne.

1. LeetCode to popularna platforma do przygotowywania się do rozmów


kwalifikacyjnych w dziedzinie IT, oferująca wiele zadań z zakresu struk-
tur danych i algorytmów.
2. HackerRank to platforma z szerokim zakresem kategorii zadań, nie tylko
z algorytmów, ale również z SQL, sztucznej inteligencji i wielu innych.

3. CodeSignal to serwis umożliwiający naukę przez rozwiązywanie interak-


tywnych zadań i śledzenie postępów.

4. Exercism dostarcza wiele ćwiczeń do rozwiązania w różnych językach


programowania, z możliwością otrzymywania opinii od mentorów.

5. Kaggle to platforma skupiająca się głównie na data science, ale oferująca


także wiele zadań algorytmicznych.

pymasters.pl 16
Warsztat Juniora

6. CodeChef to indyjska platforma do nauki programowania poprzez kon-


kursy online i zadania do rozwiązania.

7. Codewars umożliwia naukę poprzez rozwiązywanie zadań, które nazy-


wane są “kata”, oraz kreowanie własnych wyzwań.

8. Sphere Online Judge (SPOJ) to klasyczna platforma oferująca mnóstwo


problemów do rozwiązania w różnych językach programowania.

9. Project Euler skupia się na matematycznych problemach, które wymaga-


ją więcej niż tylko matematycznej wiedzy, a także umiejętności progra-
mistycznych.
10.GeeksforGeeks oferuje szeroką gamę problemów algorytmicznych i teo-
retycznych zasobów do nauki.

11.Checkio.org nauka pythona lub typescriptu od podstaw. Utrzymana


w konwencji gry.

Każda z tych platform oferuje unikalne wyzwania i sposoby nauki, więc war-
to eksplorować różne serwisy i znaleźć te, które najbardziej odpowiadają
Twoim potrzebom i stylowi nauki. Niektóre skupiają się na konkretnej dzie-
dzinie (np. algorytmy, sztuczna inteligencja, analiza danych), inne oferują
szeroki zakres tematów. Korzystanie z tych platform to nie tylko rozwiązy-
wanie zadań. Zawsze możesz porównać swoje rozwiązanie z innymi użyt-
kownikami i dzięki temu również poszerzyć swoją wiedzę. Niektóre z nich są
wykorzystywane w zadaniach technicznych przez rekruterów.

Warto również dołączyć do społeczności programistycznej, na przykład pro-


wadzonej przeze mnie Pymasters.pl, gdzie można brać udział w wyzwaniach,
tworzyć własne, a rozwiązania zadań konsultować z innymi członkami grupy.

pymasters.pl 17
Warsztat Juniora

A jak się tym pochwalić?


Rozwiązujesz zadania uporem maniaka, codziennie lub co tydzień jedno.
Twój ranking na stronie rośnie, uczysz się nowych rzeczy. Dobrze by było
pochwalić się tą całą pracą przed rekruterami.

Mam dla Ciebie rozwiązanie!

Repozytorium na Githubie!

Generalnie tworzenie sobie repozytorium na Githubie i trzymanie w nim


notatek (tylko ustaw to repozytorium jako prywatne!), to jest bardzo dobry
pomysł. Uczysz się organizacji dokumentów oraz korzystania z najpopular-
niejszego obecnie systemu kontroli wersji, jakim jest Git. Do Gita jeszcze
zresztą wrócimy.

Moja propozycja jest taka:

1. Utwórz sobie repozytorium na GitHub, nazwij je code-kata. Ma być pu-


bliczne.

2. Napisz krótkie Readme.md w którym wyjaśniasz co to za repozytorium.


3. W repozytorium utwórz sobie katalog dla każdego serwisu, z jakiego ko-
rzystasz w celu nauki Code Kata.

4. Kiedy rozpoczynasz prace nad code kata na stronie, np. CodeWars, two-
rzysz nowy plik w katalogu “codewars”. Do tego pliku wklejasz w komen-
tarzu link do zadania, opis w komentarzu, a potem swoje rozwiązanie.
5. Powtarzasz to za każdym razem, kiedy robisz Code Kata.

6. Podajesz to repozytorium w CV ile razy wspomnisz o Code Kata.

pymasters.pl 18
Warsztat Juniora

Masz czas? Ćwicz codziennie. Wyznacz sobie blok czasu, na przykład godzi-
nę, codziennie, na code kata. Jeśli rozwiążesz je szybciej - super - masz czas
na kawę. Jeśli czasu zabrakło - odstaw, wrócisz jutro. Jeśli totalnie utkną-
łeś - możesz podejrzeć rozwiązania innych lub poszukać pomocy w interne-
cie. Stackoverflow ma bardzo ciekawe dyskusje dotyczące niektórych zadań
z Codewars. Ok, nie zrobiłeś tego zadania sam. Zdarza się. Wiedzę jednak
nabyłeś, czy to pisząc kod samemu, czy też analizując rozwiązania innych.
Celem była nauka więc cel jest osiągnięty, prawda?

Po roku będziesz mieć około 300 plików z rozwiązaniami. Masz mniej cza-
su? Rób jedno tygodniowo. Kontynuuj, jak już dostaniesz tą pierwszą, drugą,
trzecią pracę. Rekruter zobaczy kilka rzeczy:
• Ogromną ilość pracy włożoną w code kata. Każde z nich podnosi
Twoje umiejętności.
• Konsekwentne działanie. Żeby przebiec maraton trzeba trenować kilka
miesięcy, w upale, deszczu, mrozie, wietrze (o głowie nawet nie wspomi-
nam). A tutaj widzimy regularnie dodawane rozwiązania kolejnych zadań.
Regularnie wracasz na sale i podnosisz sztangę. Kontynuuj.
Mów o tym, co robisz, pokazuj tę pracę. Możesz z każdego code kata screena
wrzucić na swojego instagrama. Napisz na linkedin za każdym razem, kiedy
Twój poziom na platformie wzrośnie.

pymasters.pl 19
Warsztat Juniora

Architektura
Oprogramowania
Architektura oprogramowania to planowanie struktury i organizacji opro-
gramowania komputerowego. Ma na celu zapewnienie, że oprogramowa-
nie będzie działać sprawnie, zgodnie z wymaganiami użytkowników i będzie
łatwe do zarządzania. Kluczowe koncepcje:

1. Modularyzacja: Oznacza podział oprogramowania na mniejsze części,


które nazywamy modułami. Każdy moduł ma swoją odpowiedzialność
i wykonuje określone zadanie. To pomaga w organizacji kodu źródłowe-
go, ułatwiając jego zrozumienie i utrzymanie.

Przykład:

W Django modułem będzie aplikacja, a projekt jest zbiorem aplikacji. Weźmy


sklep internetowy. Moduły:
• katalog produktów (kategorie, produkty, ceny, wyświetlanie na stronie, itp)
• koszyk zakupów (dodawanie i usuwanie produktów, przeliczanie po zmia-
nach, przechowywanie stanu koszyka przy przejściu np. z telefonu na
komputer, itp.)
• użytkownicy (rejestracja, aktualizacja danych, logowanie do sklepu, za-
rządzanie kontami, itp.)
• płatności (obsługa integracji z zewnętrznymi dostawcami płatności, na
rynku polskim stripe i inne)
• obsługa dostaw (integracja z dostawcami, wygenerowanie etykiety adre-
sowej, kodu, itp.)
Modułowość Django pozwala na skopiowanie aplikacji z jednego projektu
do drugiego i uruchomienie jej w tym drugim projekcie poprzez zmianę kil-
ku plików.

pymasters.pl 20
Warsztat Juniora

2. Architektura warstwowa: Wiele programów jest zorganizowanych w hie-


rarchiczne warstwy. W aplikacjach internetowych mamy część odpowie-
dzialną za interfejs użytkownika, część obsługującą logikę biznesową
i część zajmującą się dostępem do danych. To pomaga w separacji funk-
cji i ułatwia rozwijanie oprogramowania.

Przykład:

Django ma architekturę warstwową w postaci MVT, czyli model, widok (view),


szablon (template). Model odpowiada za sposób przechowywania danych
w bazie. Widok obsługuje logikę pobierającą dane z modelu i przekazuje je
do szablonu. Można go również wykorzystać do gromadzenia danych od
użytkownika i wysyłania ich do modelu w celu zapisu. Tutaj również będzie
następować komunikacja z zewnętrznymi serwisami, np. dostawcami płat-
ności, dostaw, czyli logika biznesowa. Szablon z kolei to dokument napisany
w języku szablonów Django (docs.djangoproject.com/en/4.2/ref/templates/
language), odpowiada za wyświetlanie danych w przeglądarce użytkownika.

3. Model klient-serwer: Klient jest odpowiedzialny za interakcję z użytkow-


nikiem, podczas gdy serwer dostarcza dane lub usługi. To umożliwia ska-
lowanie i zarządzanie oprogramowaniem.

Przykład:

Wszystkie aplikacje mobilne, np Facebook. Klientem jest aplikacja w Twoim


telefonie lub przeglądarce. Kiedy przeglądasz Facebooka, żądasz dostępu
do treści i interakcji ze znajomymi. Twoje żądania są przesyłane do serwe-
rów Facebooka, gdzie przechowywane są wszystkie posty i dane użytkowni-
ków. Serwery te przetwarzają twoje żądania i dostarczają ci aktualne posty,
komentarze i wiadomości, które wyświetlają się na ekranie twojego kompu-
tera lub telefonu.

pymasters.pl 21
Warsztat Juniora

4. Mikrousługi: Mikrousługi to podejście w projektowaniu oprogramowa-


nia, w którym duży system jest dzielony na małe, niezależne części. Każda
mikrousługa ma jedną konkretną funkcję lub zadanie do wykonania. Myśl
o nich jak o specjalistach ds. jednego konkretnego zadania w dużym pro-
jekcie.

Przykład:

Wróćmy do sklepu internetowego. Zamiast tworzyć ogromną aplikację


e-commerce, projektanci decydują się na rozwiązanie oparte o mikrousługi.
• Koszyk zakupowy (Mikrousługa 1): Jedna mikrousługa jest odpowie-
dzialna tylko za obsługę koszyka zakupowego. Kiedy dodajesz pro-
dukty do koszyka, ta mikrousługa zajmuje się przechowywaniem
tych produktów.
• Zarządzanie zamówieniami (Mikrousługa 2): Kiedy klikasz “Kup teraz”,
ta mikrousługa przetwarza zamówienie, generuje potwierdzenie i ob-
sługuje płatności.
• Zarządzanie produktami (Mikrousługa 3): Przechowuje informacje
o produktach dostępnych w sklepie. Kiedy przeglądasz produkty lub
szukasz czegoś, ta mikrousługa dostarcza te informacje.
• Rekomendacje produktów (Mikrousługa 4): Analizuje twoje wcześniej-
sze zakupy i rekomenduje nowe produkty, które mogą ci się podobać.
• Autoryzacja użytkowników (Mikrousługa 5): Zarządza kontami użyt-
kowników, ich logowaniem i zabezpieczeniami.
• Opinie i recenzje (Mikrousługa 6): Przechowuje opinie i recenzje pro-
duktów od klientów.
Każda z tych mikrousług działa niezależnie, ale współpracuje z innymi, gdy
jest to potrzebne. To sprawia, że system jest bardziej elastyczny i łatwiejszy
do zarządzania, ponieważ poszczególne usługi można aktualizować i rozwi-
jać niezależnie od siebie. Jeśli chcesz dodać nową funkcję do aplikacji, nie
musisz zmieniać całego systemu - po prostu modyfikuj odpowiednią mikro-
usługę.

pymasters.pl 22
Warsztat Juniora

W świecie chmur obliczeniowych (AWS, Azure, Google) każda z tych usług


może pracować na oddzielnych zasobach (maszynach) całkowicie niezależ-
nie od innych. Jeśli np. modyfikujemy zarządzanie produktami, to tylko ta
usługa wymaga aktualizacji w chmurze, zamiast całej aplikacji.

Dodatkowo mikrousługi ułatwiają skalowanie aplikacji. Na przykład w skle-


pie jest promocja na książki i obłożenie sklepu wzrosło o 1000%. Usługa
chmurowa sama dopasuje swoją przepustowość na tyle, by obsłużyć zwięk-
szoną ilość żądań, i to tylko na tych usługach, które tego wymagają.

5. Baza danych: Przechowywanie danych jest ważnym elementem archi-


tektury oprogramowania. Decyzje dotyczące wyboru bazy danych, jej
struktury i zarządzania danymi mają kluczowe znaczenie dla wydajności
i integralności oprogramowania.

Na poziomie Juniora warto znać podstawowe informacje na temat baz danych.

• Różnice między rodzajami baz danych, takimi jak relacyjne (np. MySQL,
PostgreSQL), NoSQL (np. MongoDB, Redis). Warto znać podstawowe
cechy każdego rodzaju i wiedzieć, kiedy stosować dany typ bazy da-
nych w zależności od konkretnych wymagań projektu.
• Relacje i normalizacja: Zrozumienie, czym są relacje w bazach danych
i jak normalizować dane jest kluczowe. Warto wiedzieć, jak projekto-
wać bazy danych, aby uniknąć redundancji i zapewnić integralność da-
nych.
• Język zapytań SQL: Podstawowa wiedza z zakresu języka zapytań SQL
(Structured Query Language) jest niezbędna. Musisz umieć tworzyć
proste zapytania, takie jak SELECT, INSERT, UPDATE i DELETE, oraz ro-
zumieć, jak działa filtrowanie i sortowanie danych. Django tutaj bar-
dzo pomaga, bo pozwala “podejrzeć” zapytanie, jakie wysyła do bazy
(docs.djangoproject.com/en/4.2/faq/models/#how-can-i-see-the-
-raw-sql-queries-django-is-running oraz każdy Queryset ma atrybut
query print(MyModel.objects.filter(name=”my name”).query)).

pymasters.pl 23
Warsztat Juniora

• Indeksy: Trzeba wiedzieć jak indeksy w bazie danych wpływają na wy-


dajność operacji zapisu i odczytu danych. W skrócie - ułatwiają i przy-
śpieszają odczyt, mogą wydłużyć zapis.
• Transakcje: Zrozumienie pojęcia transakcji i jakie operacje można
traktować jako atomowe jest istotne. Jak zarządzać transakcjami
w bazie danych, aby uniknąć problemów z integralnością danych?
Podpowiedź dla Django: docs.djangoproject.com/en/4.2/topics/db/
transactions/#tying-transactions-to-http-requests
• Zarządzanie bazą danych: Podstawowa wiedza na temat zarządzania
bazą danych, takie jak tworzenie i usuwanie tabel, indeksów, tworze-
nie kopii zapasowych (backupów) i przywracania danych.
• Bezpieczeństwo danych: Zrozumienie podstawowych zasad zabezpie-
czania danych w bazie, takich jak autoryzacja, uwierzytelnianie i kon-
trola dostępu. Warto wiedzieć, jakie są domyślne role użytkowników
i znać podstawy zarządzania nimi.
• NoSQL i inne podejścia: Choćby podstawowe pojęcie o różnych rodza-
jach NoSQL baz danych (klucz-wartość, dokumentowe, kolumnowe,
grafowe) oraz ich zastosowaniach jest przydatne, nawet jeśli głównie
pracuje się z bazami relacyjnymi.
• ORM (Object-Relational Mapping): Zrozumienie, czym jest ORM i ja-
kie korzyści może przynieść w programowaniu bazodanowym. Warto
znać ORM wykorzystywany w Django lub podstawy SQLAlchemy.

6. Bezpieczeństwo: Bezpieczeństwo jest integralną częścią architektury


oprogramowania. Obejmuje to zarządzanie dostępem do systemu i da-
nych, uwierzytelnianie użytkowników oraz zabezpieczenia przed atakami
i zagrożeniami. Warto tutaj znać popularne metody autoryzacji i auten-
tykacji użytkowników, na przykład JWT, czy to, jak działa obsługa sesji
użytkownika. Oraz znać teoretyczne podstawy ataku z wykorzystaniem
tych metod.

7. Rozszerzalność i skalowalność: Oprogramowanie powinno być projek-


towane z myślą o tym, że będzie musiało ewoluować i dostosowywać się
do zmieniających się potrzeb. To oznacza, że musi być elastyczne i łatwe
do rozbudowy i skalowania.

pymasters.pl 24
Warsztat Juniora

Przykład:

Wyobraź sobie, że tworzysz prostą grę komputerową. Jeśli twoja gra jest
rozszerzalna, to łatwo możesz dodać nowe poziomy, postacie lub funkcje
rozgrywki, nie niszcząc istniejącej rozgrywki. To oznacza, że gracze mogą
cieszyć się nowymi elementami rozgrywki bez konieczności pobierania całej
gry od nowa.

Jeśli twoja gra jest skalowalna, to nawet jeśli pojawi się dużo graczy jedno-
cześnie, na przykład podczas popularnego turnieju, to serwer gry nie zwolni
i nadal zapewni dobrą jakość rozgrywki wszystkim graczom.

pymasters.pl 25
Warsztat Juniora

Git oraz GitHub


Pracuję z początkującymi programistami od ponad roku. Ogromnym zasko-
czeniem dla mnie jest to, jak duży problem stwarza ludziom korzystanie
z gita oraz Githuba. Pamiętaj, git jest narzędziem i takim “przyjacielem” któ-
ry siedzi sobie obok jak piszesz, zapisuje każdy Twój krok, i w razie wpadki
pomoże wrócić do bezpiecznego miejsca.

Zacznijmy od podstaw.

Czym jest Git?


Git to rozproszony system kontroli wersji, który umożliwia śledzenie zmian
w kodzie źródłowym podczas pracy nad oprogramowaniem. Jego głównym
celem jest ułatwienie współpracy między programistami. Git został stworzo-
ny przez Linusa Torvaldsa w 2005 roku, aby wspomóc rozwój jądra Linuxa.

Oto kilka kluczowych koncepcji i funkcji Gita:

1. Repozytorium (Repository):
Repozytorium to miejsce, w którym Git przechowuje wszystkie pliki i ich
historię. Możesz mieć repozytorium lokalne na swoim komputerze oraz
repozytorium zdalne na serwerze (na przykład na GitHubie czy GitLabie)
do współpracy z innymi. Tak, to prawda - do pracy z Gitem nie potrzebu-
jesz konta na GitHub - możesz korzystać ze wszystkich funkcji Gita lokal-
nie na swoim komputerze.

Jeśli zdecydujesz się korzystać z GitHuba, to każda osoba która pobierze


repozytorium z GitHuba dysponuje jego pełną kopią. Tak - całą historią.
Jeśli więc coś się stanie z Twoją lokalną kopią - nie ma żadnego problemu.
Co więcej, nawet jeśli coś się wydarzy na serwerze (np. zostanie wysła-
ny błędny kod) to też nie ma problemu, bo jest dostępna pełna historia.
Zawsze można wrócić do dowolnego commita.

pymasters.pl 26
Warsztat Juniora

2. Clone:
„Clone” tworzy lokalną kopię zdalnego repozytorium.

3. Commit:
Commit to zapisanie stanu swojego projektu w danym momencie. Każdy
commit zawiera unikatowy identyfikator (SHA-1 hash), listę zmienionych
plików, komentarz od autora oraz wskaźnik na poprzedni commit. Jeśli
chcesz prześledzić historię zmian, po prostu przeglądasz listę commi-
tów. Możesz też każdy commit “wyciągnąć” z historii i uruchomić, żeby
zobaczyć jak projekt działał w tamtym czasie. Powoduje to że historia
gita jest całkowicie przejrzysta, można prześledzić historię każdej zmiany
i dojść do tego, dlaczego została zrobiona. Tak, można też dojść do tego
ze Franek wysłał babola na produkcje - ale w normalnych firmach nikt ni-
komu za coś takiego głowy nie urwie. Chyba że jest to już kolejny babol
w danym tygodniu wysłany przez Franka.

Commity warto robić często, ponieważ commit to jest taki “save w grze”.
Przywołam tutaj jedną z zasad SOLID, mianowicie SRP - Single Responsi-
bility Principle - Zasada Jednej Odpowiedzialności. W SOLID określa ona,
że nigdy nie powinno być więcej niż jednego powodu do istnienia klasy
bądź metody. Przy tworzeniu commitów również warto się tego trzymać:
nigdy nie powinno być więcej niż jednego powodu do istnienia commita.

Przykład:

Źle:
• Commit: Adding registration form and fixing typos in footer

Dobrze:
• Commit: Adding registration form
• Commit: Fixing typos in footer

Plusem takiego podejścia jest zdecydowanie czytelniejsza historia zmian


i łatwość wyizolowania konkretnej zmiany.

pymasters.pl 27
Warsztat Juniora

4. Gałąź (Branch):
Gałąź w Gitcie pozwala na równoległą pracę nad różnymi funkcjami lub
naprawami błędów w projekcie. Główną gałęzią jest zazwyczaj „master”
lub „main”, ale możesz tworzyć nowe gałęzie dla każdego zadania, nad
którym pracujesz. Przykładami często stosowanych rodzajów branchy są:

• dev lub develop: gałąź na pracę bieżącą programistów. W takim przy-


padku gałąź master (main) zawiera kod produkcyjny - czyli ten który
jest wystawiony dla świata na serwerze.
• feature/{nazwa funkcjonalności} - stosowane do dodawania nowych
funkcjonalności w projekcie
• hotfix/{nazwa} - gałąź wykorzystywana do szybkiego naprawienia błę-
du na produkcji
• release/{nazwa} - gałąź wykorzystywana do przygotowania kodu do pu-
blikacji na produkcji. To tutaj zazwyczaj odbywają się wszystkie testy.

Oczywiście różnych sposobów nazewnictwa gałęzi jest tyle, ile zespołów.


Sposoby wykorzystania tych gałęzi są różne. Git jest narzędziem, nie ist-
nieje jedna “właściwa” ścieżka jego wykorzystania. Każdy zespół dostoso-
wuje ją do siebie.

5. Merge:
Scalanie (merge) pozwala na połączenie zmian z różnych gałęzi. Przykła-
dem będzie scalenie gałęzi feature/registration-form z gałęzią master.
Po tej operacji wszystkie zmiany z gałęzi feature/registration-form będą
widoczne na master.

6. Konflikt:
Konflikt występuje, gdy dwie osoby wprowadzają zmiany w tym samym
miejscu pliku. Git nie jest w stanie automatycznie rozstrzygnąć, która
wersja jest poprawna, więc osoba scalająca gałęzie musi ręcznie rozwią-
zać konflikt.

pymasters.pl 28
Warsztat Juniora

Co bardzo ważne, kluczowe jest tutaj stwierdzenie ”w tym samym miej-


scu pliku”. Git jest na tyle cwany, że jeśli dwie osoby edytują ten sam plik,
jedna początek, a druga koniec, to sobie z tym spokojnie poradzi.

Konflikty to temat na oddzielną publikację. Dość powiedzieć, że rozwią-


zywanie ich jest trudne. W każdym edytorze wygląda też inaczej. Jeśli już
zdarzy się konflikt, najlepiej usiąść do tematu z drugą osobą i rozwią-
zywać go razem. Pamiętać też należy, że z Gitem zawsze można wrócić
do dowolnego miejsca w historii. Nawet jeśli coś namieszasz w rozwią-
zywaniu konfliktu, to można to spokojnie cofnąć i prześledzić historię.
Niemniej, zawsze warto zadbać o drugą parę oczu, przynajmniej na po-
czątku Twojej drogi.

7. Checkout:
Polecenie „checkout” w Gitcie pozwala na przełączanie się między różny-
mi gałęziami w repozytorium.

Czym jest GitHub?


GitHub to platforma internetowa służąca do przechowywania projektów
programistycznych, które wykorzystują system kontroli wersji Git. Umoż-
liwia ona programistom na całym świecie współpracę nad kodem, dzielenie
się nim oraz śledzenie zmian w projekcie. GitHub został założony w 2008
roku i szybko stał się jedną z najpopularniejszych platform dla deweloperów.

Kluczowe funkcje i aspekty GitHuba

1. Repozytoria Git
GitHub pozwala użytkownikom na tworzenie repozytoriów Git, które są
miejscem przechowywania ich projektów programistycznych. Repozytoria
mogą być publiczne (dostępne dla wszystkich) lub prywatne (dostępne
tylko dla wybranych użytkowników).

pymasters.pl 29
Warsztat Juniora

2. Współpraca
Deweloperzy mogą współpracować nad projektem, pracując na wspól-
nym repozytorium lub forking (klonowanie) repozytorium i proponowa-
nie zmian poprzez pull requesty.

3. Pull Requesty
To funkcja, która pozwala użytkownikom na proponowanie zmian w ko-
dzie. Deweloperzy mogą przeglądać proponowane zmiany, komentować
je, sugerować zmiany i usprawnienia. Ostatecznie decydować, czy chcą
te zmiany zaakceptować, czy odrzucić.

4. Issues
GitHub posiada system zgłaszania błędów (issues), który umożliwia śle-
dzenie problemów, zadawanie pytań, czy proponowanie nowych funkcji
w projekcie.

5. GitHub Actions
To narzędzie do automatyzacji, CI/CD (Continuous Integration/Conti-
nuous Deployment), które pozwala na automatyzację testów, budowa-
nie projektu, publikację aplikacji i wiele innych, bezpośrednio z pozio-
mu GitHuba.

6. GitHub Pages
Serwis umożliwiający hosting statycznych stron internetowych bezpo-
średnio z repozytorium GitHub.

7. Forking i Cloning
Użytkownicy mogą „sklonować” repozytorium na swój komputer (cloning)
lub utworzyć jego kopię na swoim koncie GitHub (forking), co pozwala
na pracę nad projektem i proponowanie zmian bez wpływu na oryginal-
ne repozytorium.

8. Integracje
GitHub oferuje szeroką gamę integracji z innymi narzędziami i usługami,
co umożliwia rozszerzenie jego funkcjonalności.

pymasters.pl 30
Warsztat Juniora

9. Społeczność
GitHub jest nie tylko narzędziem dla programistów, ale także społeczno-
ścią, w której deweloperzy mogą dzielić się swoją wiedzą, uczestniczyć
w projektach open-source i uczyć się od siebie nawzajem.

Podsumowując, Git to narzędzie do kontroli wersji, które działa lokalnie na


komputerze programisty, a GitHub to platforma internetowa, która ułatwia
współpracę między programistami, korzystając z repozytoriów Git. GitHub
rozszerza funkcjonalność Gita, oferując dodatkowe narzędzia i usługi. Warto
dobrze zapamiętać to rozróżnienie, by nie pomylić tych dwóch nazw na roz-
mowie kwalifikacyjnej.

Jak pracować z Gitem


i GitHubem: GitFlow
Git Flow to strategia organizacji pracy w repozytorium Git, stworzona przez
Vincenta Driessena, która ma na celu uporządkowanie procesu tworzenia
oprogramowania, wydawania nowych wersji i zarządzania hotfixami(szyb-
kimi poprawkami).

Kluczowe Gałęzie w Git Flow

1. master (lub main)

• Aktualnie działająca wersja oprogramowania.


• Tagi oznaczają wersje produkcyjne, czyli te, które zostały wystawione
dla świata na serwerach.

2. develop

• Główna gałąź do rozwoju, dodawania nowych funkcji i poprawek.


• Po zakończeniu etapu prac, scala się z master.

pymasters.pl 31
Warsztat Juniora

Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

3. Gałęzie Funkcji (feature branches)

• Służą do opracowywania nowych funkcji.


• Tworzone z develop, scala się z powrotem do develop, poprzez
pull request.

Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

4. Gałęzie Wydań (release branches)

• Przygotowywanie nowej wersji produktu.


• Tworzone z develop, po zakończeniu prac scala się z master i develop,
poprzez pull request.
• master jest tagowany numerem wersji.

pymasters.pl 32
Warsztat Juniora

Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

5. Gałęzie Naprawcze (hotfix branches)

• Szybkie naprawianie błędów w wersjach produkcyjnych.


• Tworzone z master, scala się z master i develop, poprzez pull requesty.
• master jest tagowany nowym numerem wersji.

Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

pymasters.pl 33
Warsztat Juniora

Przepływ Pracy w Git Flow

1. Rozwój Funkcji: Praca nad nowymi funkcjonalnościami na gałęziach fe-


ature, tworzonych z develop.

2. Integracja Funkcji: Scalenie (merge) feature z develop, gdy funkcjonal-


ność jest gotowa.

Tutaj tworzony jest pull request. Jest to moment, kiedy można przedys-
kutować zmiany i zasugerować usprawnienia. Proces ten nazywany jest
code review i kończy się albo zażądaniem zmian, albo akceptacją pull requ-
esta.

Code review jest sztuką samą w sobie. Komentarze, czy też żądania zmian
w kodzie powinny być konstruktywne, np. “to można zrobić tak, to bym
zmienił tak, zobacz ten artykuł.”. Uwagi w stylu “Co to jest?” lub “To brzyd-
kie jest” są po prostu agresywne i bezużyteczne.

3. Przygotowanie Wydania: Tworzenie gałęzi release z develop, wykonanie


testów i dokonywanie ostatnich poprawek.

4. Wydanie: Scalenie (merge) release z master i tagowanie wersji. Scala tak-


że z develop.

5. Hotfix: Tworzenie gałęzi hotfix z master w przypadku błędów. Po na-


prawie scala się z master i develop. Tagowanie master nowym nume-
rem wersji.

Oczywiście, to tylko ogólne wskazówki dotyczące pracy z Gitem i GitHubem.


Każdy zespół może i nawet powinien dostosować te zasady do swojego sty-
lu pracy.

pymasters.pl 34
Warsztat Juniora

Jak ćwiczyć?
1. Korzystać z Git Flow i pull requestów we własnych projektach. Tak, pracu-
jąc samemu. Na przykład, kiedy dodajesz do projektu stronę z formula-
rzem kontaktowym, robisz branch feature/contact-form. Po skończeniu
pracy robisz pull request na GitHub. Teraz możesz przejrzeć swoją pracę,
zobaczyć, czy nie wysyłasz jakichś śmieci: zbędnych komentarzy, stare-
go, nie używanego kodu, itp. Jeśli trzeba, sprzątasz. Jak wszystko jest ok,
mergujesz.

2. Zajrzyj na learngitbranching.js.org/?locale=pl. To interaktywny kurs Gita,


w przeglądarce, po polsku. Poćwicz, zobacz jak działają różne komendy.

3. Dołącz do grupowego projektu i pracuj z innymi. To najlepsza metoda.


Nic nie ma takiego przełożenia jak praca z prawdzimymi ludzmi, w praw-
dziwym środowisku. Może być to projekt open source, może być to pro-
jekt robiony w ramach społeczności programistycznej. Możesz dołączyć
do społeczności prowadzonej przeze mnie: pymasters.pl.

pymasters.pl 35
Warsztat Juniora

Debugowanie, czyli
identyfikacja i napra-
wianie błędów.
Junior Developer powinien posiadać podstawowe umiejętności debugowa-
nia, które pomogą mu efektywnie identyfikować i rozwiązywać problemy
w kodzie. Należą do nich:

1. Analiza Komunikatów o Błędach


• Odczytywanie i Rozumienie: Umiejętność czytania i rozumienia komu-
nikatów o błędach oraz stosów wywołań.
Python oraz Django mają bardzo rozbudowane komunikaty o błędach.
Ich czytelność jest duża i bardzo często wystarczy przeczytać komunikat
o błędzie, żeby go rozwiązać. Po prostu, trzeba się zatrzymać i popa-
trzeć, co program zwrócił w terminalu i/lub na stronie.

» ./manage.py runserver
Traceback (most recent call last):
File ”/Users/jacek/Workspace/akademiaIT/Dshop/Dshop/./mana-
ge.py”, line 22, in <module>
main()
File ”/Users/jacek/Workspace/akademiaIT/Dshop/Dshop/./mana-
ge.py”, line 18, in main
execute_from_command_line(sys.argv)
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/django/
core/management/__init__.py”, line 442, in execute_from_com-
mand_line
utility.execute()
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/django/

pymasters.pl 36
Warsztat Juniora

core/management/__init__.py”, line 382, in execute


settings.INSTALLED_APPS
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/django/
conf/__init__.py”, line 102, in __getattr__
self._setup(name)
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/django/
conf/__init__.py”, line 89, in _setup
self._wrapped = Settings(settings_module)
^^^^^^^^^^^^^^^^^^^^^^^^^
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/django/
conf/__init__.py”, line 217, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ”/usr/local/Cellar/python@3.11/3.11.4_1/Frameworks/
Python.framework/Versions/3.11/lib/python3.11/importlib/__
init__.py”, line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, le-
vel)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ”<frozen importlib._bootstrap>”, line 1204, in _gcd_
import
File ”<frozen importlib._bootstrap>”, line 1176, in _find_
and_load
File ”<frozen importlib._bootstrap>”, line 1147, in _find_
and_load_unlocked
File ”<frozen importlib._bootstrap>”, line 690, in _load_
unlocked
File ”<frozen importlib._bootstrap_external>”, line 940, in
exec_module
File ”<frozen importlib._bootstrap>”, line 241, in _call_
with_frames_removed
File ”/Users/jacek/Workspace/akademiaIT/Dshop/Dshop/Dshop/
settings.py”, line 160, in <module>
STRIPE_PUBLISHABLE_KEY = config(”STRIPE_PUBLISHABLE_KEY”)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/

pymasters.pl 37
Warsztat Juniora

dshop--875GFOx-py3.11/lib/python3.11/site-packages/decouple.
py”, line 248, in __call__
return self.config(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/decouple.
py”, line 107, in __call__
return self.get(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^
File ”/Users/jacek/Library/Caches/pypoetry/virtualenvs/
dshop--875GFOx-py3.11/lib/python3.11/site-packages/decouple.
py”, line 92, in get
raise UndefinedValueError('{} not found. Declare it as
envvar or define a default value.'.format(option))
decouple.UndefinedValueError: STRIPE_PUBLISHABLE_KEY not fo-
und. Declare it as envvar or define a default value.

Powyżej jest wklejony komunikat błędu otrzymany z Django. Na pierw-


szy rzut oka jest dość onieśmielający. Zdradzę Ci sekret. Czytaj od końca.
Przejdźmy to razem.

1. decouple.UndefinedValueError: STRIPE_PUBLISHABLE_KEY not fo-


und. Declare it as envvar or define a default value. - jest problem ze
STRIPE_PUBLISHABLE_KEY. Jeszcze nie wiem gdzie.
2. Idę po kolei, coraz wyżej, linia po linii, szukam STRIPE_PUBLISHABLE_
KEY.

3. Jest kolejne:

File ”/Users/jacek/Workspace/akademiaIT/Dshop/Dshop/Dshop/
settings.py”, line 160, in <module>
STRIPE_PUBLISHABLE_KEY = config(”STRIPE_PUBLISHABLE_KEY”)

pymasters.pl 38
Warsztat Juniora

No to już wyraźnie wskazuje na linie 160 w settings.py. Patrzę do settin-


gs.py a tam STRIPE_PUBLISHABLE_KEY = config(”STRIPE_PUBLISHABLE_
KEY”). Wynika z tego, że config(”STRIPE_PUBLISHABLE_KEY”) zwraca
None, czyli nie istnieje.

4. Szukam STRIPE_PUBLISHABLE_KEY w całym projekcie. Znajduje go


w pliku env-template: STRIPE_PUBLISHABLE_KEY = stripe_publisha-
ble_key. Teraz z pomocą przychodzi znajomość projektu i Readme.

Czyli trzeba dodać STRIPE_PUBLISHABLE_KEY = stripe_publishable_key


do mojego pliku .env. O, działa!

Prawda, że to nie takie trudne?

• Szukanie Rozwiązań: Umiejętność korzystania z zasobów internetowych,


takich jak Stack Overflow, do szukania rozwiązań znanych problemów. Nie
da się przecenić mocy StackOverflow. To ogromna baza wiedzy, z której
można czerpać garściami.
Jednakże istnieje nie tylko ten serwis. Jest jeszcze reddit, czy też masa blo-
gów które zwraca Google kiedy zadasz mu pytanie. Czasem ciężko zna-
leźć wartościową odpowiedź na dane pytanie, zwłaszcza jeśli wpadniesz
w wir czytania postów blogowych czy innego bełkotu marketingowego.

Szukanie rozwiązań podzieliłbym więc na kilka części:

1. Umiejętność zadawania pytań i wyszukiwania informacji za pomo-


cą Google.

2. Umiejętność odsiania nieprzydatnych odpowiedzi.

3. Wykorzystanie AI.

pymasters.pl 39
Warsztat Juniora

Zacznijmy od wykorzystania Google.

Pisałem już wcześniej, że StackOverflow ma nieprzebrane zasoby wiedzy.


Niemniej jak zadasz pytanie Google, np. Jak zainstalować pythona dostaniesz
mase reklam oraz linków, z których niektóre będą przydatne. Po pierwsze
warto przejść na agielski. Przecież to język, z którego będziesz korzystać na
co dzień w pracy, warto więc go ćwiczyć przy każdej okazji. Pytanie zmienia
się więc na How to install python. O, teraz lepiej! Dużo mniej linków spon-
sorowanych, pierwszy wynik u mnie prowadzi do python.org - dobre źródło.
Widać więc język to podstawa. Bez obaw, jeśli instrukcje znalezione w ten
sposób będą zbyt trudne do zrozumienia na Twoim poziomie języka, pomo-
że translator, też od Googla.

No dobra, a co z mniej popularnymi pytaniami? Powiedzmy: “Jak wykorzystać


pole email do logowania w Django”(Django domyślnie używa username).
Oczywiście przechodzimy na angielski: “How to make Django use email
field for logging in”? Dostajemy znowu masę odpowiedzi, klikamy pierwszą
z brzegu… i coś tu jest dziwnego. Pierwszą rzeczą, zawsze do sprawdzenia,
jest data publikacji takiego materiału. Nasz świat rozwija się błyskawicznie,
treści z 2015 roku są już w dużej mierze nieaktualne. Dotyczy to zwłaszcza
pythona - przecież mamy już wersje 3.1x, totalnie niezgodną z 2.x… Więc
sprawdzaj date materiału, który czytasz. Czasem pomaga dopisanie roku
do zapytania “How to make Django use email field for logging in 2024”.

Dobra, ale ja bym chciał tylko odpowiedzi ze StackOverflow. A nie ma pro-


blemu: zapytanie Google: “site: stackoverflow.com How to make Django use
email field for logging in”. Dodanie “site:nazwastrony” zawęża wyniki wyszu-
kiwania Googla tylko do tej strony. Google ma jeszcze całą masę trikow, jeśli
np. chcesz znaleźć konkretną frazę, “użyj apostrofów”. Poczytać o tym moż-
na więcej tutaj: www.beebom.com/google-tricks-tips/. A jak chcesz samemu
poznać zaawansowane zapytania to idź do google.com i na dole po prawej
stronie kliknij “ustawienia” -> “Szukanie zaawansowane”. Zobaczysz skom-
plikowany formularz. Eksperymentuj. Każde zapytanie otworzy “normalną”
stronę wyszukiwarki, gdzie w pasku adresu będzie twoje zapytanie. Zapisuj,
zapamiętuj, korzystaj.

pymasters.pl 40
Warsztat Juniora

Umiejętność odsiania nieprzydatnych informacji właściwie sprowadza się do:

• sprawdzenia daty posta, który czytasz - czy to jeszcze ma w ogóle szan-


se być aktualne?
• dopisania aktualnego roku, np. 2024, na końcu zapytania w Google.
• sprawdzania rozwiązania w praktyce. Czasem dopiero po uruchomie-
niu okazuje się, że kod nie działa.

Wykorzystanie AI.

O to jest petarda. Znasz chat.openai.com? Nie? To najwyższy czas poznać.


Oto jak sam się przedstawia.
Jestem programem komputerowym stworzonym przez OpenAI, opartym na ar-
chitekturze GPT-4. Mój główny cel to generowanie tekstów w naturalnym języku
na podstawie wprowadzonych do mnie danych. Można mnie używać do różnych
celów, takich jak odpowiadanie na pytania, pisanie tekstów, tłumaczenie języ-
ków, generowanie pomysłów, a także do wielu innych zastosowań związanych
z przetwarzaniem języka naturalnego.
Nie jestem świadomy ani nie posiadam uczuć, po prostu analizuję wprowadzone
dane i na ich podstawie generuję odpowiedzi. Moja wiedza jest ograniczona do
informacji, które były dostępne w internecie do kwietnia 2023 roku, co oznacza,
że nie znam wydarzeń ani nowości, które miały miejsce po tej dacie.
To akurat wersja płatna, GTPT-4. Wersja GPT-3 jest trochę bardziej okrojona,
ma dane do listopada 2021 oraz jest bezpłatna. Teraz, jak to może pomóc?

Wyjaśnienia działania kodu. Weźmy sobie zadanie z codewars.com. Google


znalazł mi takie coś: github.com/Automedon/Codewars/blob/master/3-kyu/
Sudoku%20Solver.js. Nawet nie zamierzam czytać wprowadzenia. Zapytam
czata co to robi - tak, piszę do niego po Polsku:

pymasters.pl 41
Warsztat Juniora

Wyjaśnij co robi ten kod:

function sudoku(puzzle) {
while (puzzle.some( l => l.some( p => p===0 ) ))
for (let y=0; y<9; y++)
for (let x=0; x<9; x++)
if (puzzle[y][x]===0) {
let p = [true,true,true,true,true,
true,true,true,true,true];
for (let i = 0; i<9; i++) {
p[puzzle[y][i]] = false;
p[puzzle[i][x]] = false;
}
for (let i=3*~~(x/3); i<3*(~~(x/3)+1); i++)
for (let j=3*~~(y/3); j<3*(~~(y/3)+1); j++)
p[puzzle[j][i]] = false;
if (p.reduce( (p,c) => p+(c?1:0) ) === 1)
puzzle[y][x] = p.indexOf(true);
}
return puzzle;
}

Odpowiedź:
Kod ten implementuje algorytm rozwiązujący łamigłówkę Sudoku. Sudoku to po-
pularna łamigłówka liczbowo-logiczna, w której celem jest uzupełnienie planszy
9x9 liczbami od 1 do 9 tak, aby w każdym wierszu, kolumnie i każdym z dziewię-
ciu mniejszych kwadratów 3x3, każda liczba od > 1 do 9 pojawiła się dokład-
nie raz.
Oto jak działa ten kod:
1. W funkcji `sudoku`, przyjmowany jest jeden argument `puzzle`, który jest
dwuwymiarową tablicą reprezentującą planszę Sudoku. Liczba 0 w tablicy ozna-
cza puste pole, które należy uzupełnić.
2. Pętla `while` działa tak długo, jak długo w tablicy `puzzle` znajduje się przy-
najmniej jedno puste pole (reprezentowane przez 0). Warunek sprawdzający to
wykonuje się przy pomocy metody `some`, która sprawdza, czy w jakimkolwiek
wierszu istnieje puste pole.

pymasters.pl 42
Warsztat Juniora

3. Wewnątrz pętli `while`, dwie zagnieżdżone pętle `for` iterują po wszystkich


polach planszy.
4. Dla każdego pustego pola (gdzie `puzzle[y][x] === 0`), algorytm próbuje zna-
leźć prawidłową wartość, która powinna się tam znaleźć.
5. Tworzona jest tablica `p` z 10 elementami, które początkowo są ustawione na
`true`. Elementy tej tablicy reprezentują liczby od 0 do 9, a ich wartość `true`
lub `false` oznacza, czy dana liczba może być umieszczona w danym polu.
6. Następnie trzy zagnieżdżone pętle `for` iterują po wierszu, kolumnie i kwa-
dracie 3x3, w którym znajduje się dane pole, i dla każdej liczby już umieszczonej
w tych obszarach ustawiają odpowiednią wartość w tablicy `p` na `false`.
7. Po sprawdzeniu wszystkich wartości, jeśli w tablicy `p` jest dokładnie jedna
wartość ustawiona na `true`, to znaczy, że znaleziono jednoznaczną wartość
dla danego pola i jest ona umieszczana w tablicy `puzzle`.
8. Po przejściu przez wszystkie pola, funkcja zwraca uzupełnioną planszę Sudoku.
Warto zauważyć, że ten algorytm może nie działać poprawnie dla wszystkich
łamigłówek Sudoku, zwłaszcza tych trudniejszych, które wymagają zaawanso-
wanych technik rozwiązania lub prób i błędów. Algorytm ten opiera się na zna-
lezieniu pól, dla których istnieje tylko jedno możliwe > rozwiązanie, i nie jest
w stanie radzić sobie z sytuacjami, w których konieczne jest zgadywanie i spraw-
dzanie różnych możliwości.
Prawda, że ładnie to rozpisał? Dodatkowo można poprosić go o wyjaśnienie
jak 10-letniemu dziecku - pisze jeszcze prostszym językiem.

A wyjaśnij to dla 10-latka.


Okej, spróbuję to wyjaśnić w prosty sposób.
Wyobraź sobie, że masz dużą planszę do gry w Sudoku. To jest kwadrat podzie-
lony na 9 mniejszych kwadratów, a każdy z tych mniejszych kwadratów jest po-
dzielony na jeszcze mniejsze kwadraciki, tak że jest ich razem 81.
Celem gry jest wypełnienie wszystkich kwadracików liczbami od 1 do 9 tak, aby
w każdym rzędzie, w każdej kolumnie i w każdym z tych 9 mniejszych kwadra-
tów każda liczba od 1 do 9 pojawiła się tylko raz.
Teraz wyobraź sobie, że część z tych kwadracików jest już wypełniona liczbami,
a reszta jest pusta. Twoim zadaniem jest wypełnienie pustych miejsc.

pymasters.pl 43
Warsztat Juniora

Kod komputerowy, który widziałeś, to jak instrukcja dla komputera, jak rozwią-
zać taką łamigłówkę Sudoku.
Komputer zaczyna od szukania pustych kwadracików. Gdy znajdzie pusty kwa-
dracik, patrzy na wszystkie liczby w tym samym rzędzie, kolumnie i małym
kwadracie. Następnie robi listę wszystkich liczb, które mogą pasować do tego
pustego kwadracika.
Jeśli komputer znajdzie kwadracik, do którego pasuje tylko jedna liczba, wypeł-
nia ten kwadracik tą liczbą.
Komputer robi to tak długo, aż wypełni wszystkie puste kwadraciki lub dojdzie
do wniosku, że nie może wypełnić więcej kwadracików bez zgadywania.
To trochę jak gra w detektywa, gdzie komputer musi używać wskazówek, aby
dowiedzieć się, które liczby gdzie pasują.
No, może trochę za proste.

Poniżej wersja dla maturzysty.


Oczywiście, oto wyjaśnienie kodu algorytmu rozwiązującego Sudoku skierowane
do osoby przygotowującej się do matury:
Ten kod implementuje metodę rozwiązania łamigłówki Sudoku, której celem jest
wypełnienie kwadratowej planszy 9x9 liczbami od 1 do 9 zgodnie z określonymi
zasadami. Reguły gry wymagają, aby każda liczba od 1 do 9 pojawiła się do-
kładnie raz w każdym wierszu, kolumnie oraz w każdym z dziewięciu mniejszych
kwadratów 3x3.
Kod rozpoczyna od sprawdzenia, czy na planszy są jeszcze jakieś puste miejsca
(oznaczone jako 0). Następnie, dla każdego pustego miejsca, algorytm analizuje
możliwe liczby, które mogą się tam znaleźć. Eliminuje te liczby, które już wystę-
pują w danym wierszu, kolumnie lub mniejszym kwadracie 3x3.
Jeżeli dla danego miejsca istnieje tylko jedna możliwa wartość, która nie naru-
sza zasad Sudoku, to miejsce to jest wypełniane tą wartością. Proces ten jest
powtarzany iteracyjnie, aż do wypełnienia całej planszy lub dojścia do punktu,
w którym nie można jednoznacznie określić kolejnych wartości bez dokonywa-
nia założeń.
Warto zauważyć, że przedstawiony algorytm może nie radzić sobie z bardziej skom-
plikowanymi łamigłówkami Sudoku, które wymagają bardziej zaawansowanych

pymasters.pl 44
Warsztat Juniora

technik rozwiązywania, takich jak zgadywanie i sprawdzanie różnych możliwo-


ści (tzw. backtracking).
Kod ten jest przykładem deterministycznego algorytmu, który działa popraw-
nie dla wielu przypadków łamigłówek Sudoku, ale nie gwarantuje rozwiązania
w każdym możliwym przypadku. Algorytm ten można by było rozbudować, włą-
czając do niego techniki backtrackingu lub innych zaawansowanych metod, aby
zwiększyć jego skuteczność i zakres zastosowania.
I tak można długo.

Można też AI poprosić AI o napisanie formularza rejestracji użytkownika


w Django.

Napisz mi formularz rejestracji użytkownika w djagno. Kompletny kod.


Poniżej przedstawiam przykład formularza rejestracji użytkownika w Django,
który obejmuje model użytkownika, formularz, widok oraz szablon HTML.
1. Najpierw zdefiniujemy model użytkownika. W tym celu w pliku `models.py`
umieść następujący kod:

from django.contrib.auth.models import AbstractUser


from django.db import models

class CustomUser(AbstractUser):
age = models.PositiveIntegerField(null=True, blank=True)

2. Następnie stworzymy formularz rejestracji. W pliku `forms.py` umieść poniż-


szy kod:

from django import forms


from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class SignUpForm(UserCreationForm):
age = forms.IntegerField(required=False, help_
text='Optional.')

pymasters.pl 45
Warsztat Juniora

class Meta:
model = CustomUser
fields = ('username', 'age', 'password1',
'password2', )

3. Teraz zdefiniujemy widok obsługujący rejestrację. W pliku `views.py` umieść


poniższy kod:

from django.shortcuts import render, redirect


from .forms import SignUpForm
from django.contrib.auth import login
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('home')
else:
form = SignUpForm()
return render(request, 'signup.html', {'form': form})

4. Na koniec utworzymy szablon HTML dla formularza rejestracji. W pliku `si-


gnup.html` umieść poniższy kod:

<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
</head>
<body>
<h2>Sign Up</h2>
<form method=”post”>
{% csrf_token %}
{{ form.as_p }}
<button type=”submit”>Sign Up</button>
</form>

pymasters.pl 46
Warsztat Juniora

<a href=”{% url 'login' %}”>Already have an account? Log


in</a>
</body>
</html>

5. Pamiętaj, aby dodać odpowiednie ścieżki URL w pliku `urls.py`:

from django.urls import path


from . import views
urlpatterns = [
path('signup/', views.signup, name='signup'),
# inne ścieżki URL
]

6. Dodatkowo, pamiętaj o skonfigurowaniu Django, aby używać własnego mo-


delu użytkownika. W pliku `settings.py` projektu dodaj lub zaktualizuj następu-
jące linie:

AUTH_USER_MODEL = 'myapp.CustomUser'

Zakładając, że aplikacja nazywa się `myapp`, a w pliku `settings.py` masz skon-


figurowane odpowiednie ustawienia (w tym `AUTH_USER_MODEL`), powinieneś
być w stanie uruchomić serwer Django i przetestować formularz rejestracji, od-
wiedzając `http://127.0.0.1:8000/signup/` w przeglądarce internetowej.

Czy ten kod zadziała? Ma spore szanse. Nie sprawdzałem. Niemniej, widać
potencjał, prawda? Zastosowanie AI w pracy bardzo pomaga.

HINT: przed zadaniem pytania czatowi warto nakreślić mu kontekst ”Jesteś


ekspertem w programowaniu w pythonie”. I w następnych krokach zada-
wać pytania. Sztuka zadawania pytań dla IA dorobiła się już własnej nazwy:
prompt engineering. Tego też możesz poszukać w Google.

pymasters.pl 47
Warsztat Juniora

Jednym z najciekawszych zastosowań chata jest szukanie błędów. Po prostu


wklei mu kod, który sprawia problemy i poproś o znalezienie błędu. Usiądź
wygodnie i obserwuj. Serio, to takie proste.

2. Użycie Instrukcji Wypisujących


To nic innego jak skorzystanie z popularnego print() by zobaczyć co się dzie-
je w programie. Weźmy taki kod:

# zadanie pochodzi z www.codewars.com/kata/51e056fe544cf-


36c410000fb/train/python

import re
import operator
import string

def top_3_words(text):
if not text:
return []
words = {}
translator = str.maketrans(string.punctuation.repla-
ce(”'”, ””), ' '*len(string.punctuation.replace(”'”, ””)))
text = text.translate(translator)
for word in text.lower().split():
apostrophes = len(re.findall(r”(?<!\w)'(?!w)”, word))

if apostrophes > 1:
word = re.sub(r”'+”, ”'”, word)
if word and word != ”'”:
words[word] =1 + words.get(word, 0)

words = dict( sorted(words.items(), key=operator.itemget-


ter(1),reverse=True))
ret = list(words.keys())[0:3]
return ret

pymasters.pl 48
Warsztat Juniora

Możemy oczywiście poprosić czata o wyjaśnienie tego kodu. Natomiast


Codewars opisuje to jako “Funkcja, która na podstawie ciągu tekstowego
(prawdopodobnie ze znakami interpunkcyjnymi i znakami podziału wier-
sza) zwraca tablicę trzech najczęściej występujących słów, w kolejności ma-
lejącej według liczby wystąpień.”.

Chcemy prześledzić przebieg działania tej funkcji - w tym celu dodam in-
strukcje print().

# zadanie pochodzi z www.codewars.com/kata/51e056fe544cf-


36c410000fb/train/python

import re
import operator
import string

def top_3_words(text):
if not text:
return []
words = {}
translator = str.maketrans(string.punctuation.repla-
ce(”'”, ””), ' '*len(string.punctuation.replace(”'”, ””)))
print(text)
text = text.translate(translator)
print(text)
for word in text.lower().split():
print(word)
apostrophes = len(re.findall(r”(?<!\w)'(?!w)”, word))
print(apostrophes)
if apostrophes > 1:
word = re.sub(r”'+”, ”'”, word)
if word and word != ”'”:
words[word] =1 + words.get(word, 0)
print(words)
words = dict( sorted(words.items(), key=operator.itemget-
ter(1),reverse=True))
print(words)
ret = list(words.keys())[0:3]

pymasters.pl 49
Warsztat Juniora

print(ret)
return ret

Uruchamiam tą funkcje:

text = ”””Lorem Ipsum is simply dummy text of the printing


and typesetting industry. Lorem Ipsum has been the industry's
standard dummy text ever since the 1500s, when an unknown
printer took a galley of type and scrambled it to make a type
specimen book. It has survived not only five centuries, but
also the leap into electronic typesetting, remaining essen-
tially unchanged. It was popularised in the 1960s with the
release of Letraset sheets containing Lorem Ipsum passa-
ges, and more recently with desktop publishing software Alike
Aldus PageMaker including versions of Lorem Ipsum.”””

top_3_words(text)

Lorem Ipsum is simply dummy text of the printing and typeset-


ting industry. Lorem Ipsum has been the industry's standard
dummy text ever since the 1500s, when an unknown printer took
a galley of type and scrambled it to make a type specimen
book. It has survived not only five centuries, but also the
leap into electronic typesetting, remaining essentially un-
changed. It was popularised in the 1960s with the release of
Letraset sheets containing Lorem Ipsum passages, and more re-
cently with desktop publishing software Alike Aldus PageMaker
including versions of Lorem Ipsum.
Lorem Ipsum is simply dummy text of the printing and typeset-
ting industry Lorem Ipsum has been the industry's standard
dummy text ever since the 1500s when an unknown printer took
a galley of type and scrambled it to make a type specimen
book It has survived not only five centuries but also the
leap into electronic typesetting remaining essentially un-
changed It was popularised in the 1960s with the release of
Letraset sheets containing Lorem Ipsum passages and more re-
cently with desktop publishing software Alike Aldus PageMaker
including versions of Lorem Ipsum

pymasters.pl 50
Warsztat Juniora

lorem
0
ipsum
0
is
0
simply
0
dummy
0
text
0
of
0
the
0
printing
0
and
0
typesetting
0
industry
0
lorem
0
ipsum
0
(... usunięte by oszczędzać miejsce ...)
versions
0
of
0
lorem
0
ipsum
0
{'lorem': 4, 'ipsum': 4, 'is': 1, 'simply': 1, 'dummy':
2, 'text': 2, 'of': 4, 'the': 6, 'printing': 1, 'and': 3,

pymasters.pl 51
Warsztat Juniora

'typesetting': 2, 'industry': 1, 'has': 2, 'been': 1, ”indu-


stry's”: 1, 'standard': 1, 'ever': 1, 'since': 1, '1500s':
1, 'when': 1, 'an': 1, 'unknown': 1, 'printer': 1, 'took':
1, 'a': 2, 'galley': 1, 'type': 2, 'scrambled': 1, 'it': 3,
'to': 1, 'make': 1, 'specimen': 1, 'book': 1, 'survived':
1, 'not': 1, 'only': 1, 'five': 1, 'centuries': 1, 'but':
1, 'also': 1, 'leap': 1, 'into': 1, 'electronic': 1, 'rema-
ining': 1, 'essentially': 1, 'unchanged': 1, 'was': 1, 'po-
pularised': 1, 'in': 1, '1960s': 1, 'with': 2, 'release': 1,
'letraset': 1, 'sheets': 1, 'containing': 1, 'passages': 1,
'more': 1, 'recently': 1, 'desktop': 1, 'publishing': 1, 'so-
ftware': 1, 'alike': 1, 'aldus': 1, 'pagemaker': 1, 'inclu-
ding': 1, 'versions': 1}
{'the': 6, 'lorem': 4, 'ipsum': 4, 'of': 4, 'and': 3, 'it':
3, 'dummy': 2, 'text': 2, 'typesetting': 2, 'has': 2, 'a':
2, 'type': 2, 'with': 2, 'is': 1, 'simply': 1, 'printing':
1, 'industry': 1, 'been': 1, ”industry's”: 1, 'standard': 1,
'ever': 1, 'since': 1, '1500s': 1, 'when': 1, 'an': 1, 'unk-
nown': 1, 'printer': 1, 'took': 1, 'galley': 1, 'scrambled':
1, 'to': 1, 'make': 1, 'specimen': 1, 'book': 1, 'survived':
1, 'not': 1, 'only': 1, 'five': 1, 'centuries': 1, 'but':
1, 'also': 1, 'leap': 1, 'into': 1, 'electronic': 1, 'rema-
ining': 1, 'essentially': 1, 'unchanged': 1, 'was': 1, 'popu-
larised': 1, 'in': 1, '1960s': 1, 'release': 1, 'letraset':
1, 'sheets': 1, 'containing': 1, 'passages': 1, 'more': 1,
'recently': 1, 'desktop': 1, 'publishing': 1, 'software': 1,
'alike': 1, 'aldus': 1, 'pagemaker': 1, 'including': 1, 'ver-
sions': 1}
['the', 'lorem', 'ipsum']
['the', 'lorem', 'ipsum']

No wiele to nie mówi - dużo printów, ale… bezużytecznych, nie wiadomo co


jest czym. Poprawie.

pymasters.pl 52
Warsztat Juniora

# zadanie pochodzi z www.codewars.com/kata/51e056fe544cf-


36c410000fb/train/python

import re
import operator
import string

def top_3_words(text):
if not text:
return []
words = {}
translator = str.maketrans(string.punctuation.repla-
ce(”'”, ””), ' '*len(string.punctuation.replace(”'”, ””)))
print(”orgiginal_text”, text)
text = text.translate(translator)
print(”text after translate”, text)
for word in text.lower().split():
print(”word in loop 1”, word)
apostrophes = len(re.findall(r”(?<!\w)'(?!w)”, word))
print(”apostrophes count”, apostrophes)
if apostrophes > 1:
word = re.sub(r”'+”, ”'”, word)
if word and word != ”'”:
words[word] =1 + words.get(word, 0)
print(”words 1”, words)
words = dict( sorted(words.items(), key=operator.itemget-
ter(1),reverse=True))
print(”words 2”, words)
ret = list(words.keys())[0:3]
print(”ret”, ret)
return ret

Zmiany nie są duże: dodaje nazwe przy print, np. print(”word in loop 1”,
word).

Uruchamiam, jak poprzednio.

pymasters.pl 53
Warsztat Juniora

>>> top_3_words(text)
orgiginal_text Lorem Ipsum is simply dummy text of the prin-
ting and typesetting industry. Lorem Ipsum has been the in-
dustry's standard dummy text ever since the 1500s, when an
unknown printer took a galley of type and scrambled it to
make a type specimen book. It has survived not only five cen-
turies, but also the leap into electronic typesetting, rema-
ining essentially unchanged. It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum
passages, and more recently with desktop publishing software
Alike Aldus PageMaker including versions of Lorem Ipsum.
text after translate Lorem Ipsum is simply dummy text of the
printing and typesetting industry Lorem Ipsum has been the
industry's standard dummy text ever since the 1500s when an
unknown printer took a galley of type and scrambled it to
make a type specimen book It has survived not only five cen-
turies but also the leap into electronic typesetting rema-
ining essentially unchanged It was popularised in the 1960s
with the release of Letraset sheets containing Lorem Ipsum
passages and more recently with desktop publishing software
Alike Aldus PageMaker including versions of Lorem Ipsum
word in loop 1 lorem
apostrophes count 0
word in loop 1 ipsum
apostrophes count 0
word in loop 1 is
apostrophes count 0
word in loop 1 simply
apostrophes count 0
word in loop 1 dummy
apostrophes count 0
word in loop 1 text
apostrophes count 0
word in loop 1 of
apostrophes count 0
word in loop 1 the
(... usunięte by oszczędzać miejsce ...)
apostrophes count 0
word in loop 1 ipsum

pymasters.pl 54
Warsztat Juniora

apostrophes count 0
words 1 {'lorem': 4, 'ipsum': 4, 'is': 1, 'simply': 1, 'dum-
my': 2, 'text': 2, 'of': 4, 'the': 6, 'printing': 1, 'and':
3, 'typesetting': 2, 'industry': 1, 'has': 2, 'been': 1, ”in-
dustry's”: 1, 'standard': 1, 'ever': 1, 'since': 1, '1500s':
1, 'when': 1, 'an': 1, 'unknown': 1, 'printer': 1, 'took':
1, 'a': 2, 'galley': 1, 'type': 2, 'scrambled': 1, 'it': 3,
'to': 1, 'make': 1, 'specimen': 1, 'book': 1, 'survived':
1, 'not': 1, 'only': 1, 'five': 1, 'centuries': 1, 'but':
1, 'also': 1, 'leap': 1, 'into': 1, 'electronic': 1, 'rema-
ining': 1, 'essentially': 1, 'unchanged': 1, 'was': 1, 'po-
pularised': 1, 'in': 1, '1960s': 1, 'with': 2, 'release': 1,
'letraset': 1, 'sheets': 1, 'containing': 1, 'passages': 1,
'more': 1, 'recently': 1, 'desktop': 1, 'publishing': 1, 'so-
ftware': 1, 'alike': 1, 'aldus': 1, 'pagemaker': 1, 'inclu-
ding': 1, 'versions': 1}
words 2 {'the': 6, 'lorem': 4, 'ipsum': 4, 'of': 4, 'and': 3,
'it': 3, 'dummy': 2, 'text': 2, 'typesetting': 2, 'has': 2,
'a': 2, 'type': 2, 'with': 2, 'is': 1, 'simply': 1, 'prin-
ting': 1, 'industry': 1, 'been': 1, ”industry's”: 1, 'stan-
dard': 1, 'ever': 1, 'since': 1, '1500s': 1, 'when': 1,
'an': 1, 'unknown': 1, 'printer': 1, 'took': 1, 'galley': 1,
'scrambled': 1, 'to': 1, 'make': 1, 'specimen': 1, 'book': 1,
'survived': 1, 'not': 1, 'only': 1, 'five': 1, 'centuries':
1, 'but': 1, 'also': 1, 'leap': 1, 'into': 1, 'electronic':
1, 'remaining': 1, 'essentially': 1, 'unchanged': 1, 'was':
1, 'popularised': 1, 'in': 1, '1960s': 1, 'release': 1, 'le-
traset': 1, 'sheets': 1, 'containing': 1, 'passages': 1,
'more': 1, 'recently': 1, 'desktop': 1, 'publishing': 1, 'so-
ftware': 1, 'alike': 1, 'aldus': 1, 'pagemaker': 1, 'inclu-
ding': 1, 'versions': 1}
ret ['the', 'lorem', 'ipsum']
['the', 'lorem', 'ipsum']

Czytelniej, prawda? Zwykły print jest potężnym narzędziem do debugowania,


tylko trzeba opisywać dane wyjściowe, by potem było wiadomo co jest czym.

pymasters.pl 55
Warsztat Juniora

Oczywiście, Python ma jeszcze moduł logging. Natomiast znajomość i sku-


teczne używanie print na poziomie juniora, mida i seniora to podstawa.

Przy debugowaniu szalenie ważne jest zapisywanie postępów. Nie zliczę, ile
razy straciłem długie godziny robiąc dokładnie to samo, bo nie byłem w sta-
nie wyrwać się z tego zaklętego kręgu. Dalej, mimo lat doświadczenia, zda-
rza mi się gonić w kółko. Strasznie to irytujące i powoduje, że człowiek ma
ochotę rzucić te robote w diabły. Serio.

Rozwiązaniem tego jest działanie według metody naukowej. W skrócie pole-


ga to na dokumentowaniu postępów, czyli zapisywaniu co już zostało spraw-
dzone. W dłuższej wersji proces dzielimy na etapy:
• sformułowanie hipotezy: np. użytkownik nie został stworzony po reje-
stracji, bo formularz zawiera jakiś błąd.
• eksperymentowanie, czyli sprawdzenie hipotezy na różne sposoby.
Tutaj zmodyfikowanie kodu tak, by potwierdzić nieprawidłowe działa-
nie formularza. Lub stwierdzić, że jest prawidłowe.
• analiza danych - czyli przeanalizowanie zapisanych wyników ekspery-
mentów
• wyciągniecie wniosków: formularz działa prawidłowo lub nie
• rewizja hipotezy (jeśli konieczne). Na przykład: formularz działa prawi-
dłowo, czyli przyjmuje poprawne dane i zwraca błędy zgodnie z zało-
żeniami. Wobec tego błąd leży gdzie indziej, zapewne w widoku.
• i powtórzenie procesu.

Jak do tego podejść w praktyce? Stworzyć sobie plik tekstowy w edytorze


i notować po kolei każdy krok debugowania. Jeśli plik tekstowy jest niewy-
starczający, można wykorzystać narzędzia do rysowania mindmap, typu
whimsical.com. I powoli, iteracja za iteracją, eksperymet za eksperymen-
tem, dojść do sedna problemu.

pymasters.pl 56
Warsztat Juniora

3. Podstawowe Zrozumienie Kodu


Sprowadza się to do czytania kodu oraz analizy kontroli przepływu - czyli
analizy instrukcji warunkowych if/for itp. Bardzo przy tym pomaga chat gpt.
Ale… Uwaga tutaj na własność intelektualną. Wklejanie do czata kodu bę-
dącego własnością firmy w której pracujesz może nie być dobrze widziane.
Skonsultuj się tutaj ze swoim przełożonym. Możesz pokazać przykłady inne-
go, publicznego kodu, omówionego przez czata.

A jeśli nie można użyć czata to pozostaje kartka, długopis i ręczne przejście
algorytmu - żeby go dobrze zrozumieć. Często takie “zwolnienie” poprzez
pisanie na kartce okazuje się zbawienne, bo znajdujemy rozwiązania które
inaczej byśmy przeoczyli.

4. Testowanie i Weryfikacja
Jak testujesz kod? Ręcznie, najczęściej? Jeśli jest to strona napisana w opar-
ciu o np. Django, to trzeba uruchomić przeglądarkę i przejść daną ścieżkę
żeby zobaczyć czy działa prawidłowo. Problem w tym, że to strasznie dużo
czasu zajmuje. Setki godzin, w skali życia programisty. Pracujmy mądrze,
nie ciężko.

Osobiście bardzo polecam TDD - Test Driven Development. Polega to na


tym, że najpierw piszesz test, dopiero potem kod, który ma go spełnić.
Oczywiście, na Twoim, początkowym poziomie może to być problematycz-
ne. “Jak mam przetestować formularz którego jeszcze nie ma?” zapytasz.
Dobrze, możemy też zrobić to w drugą stronę. Możesz dopisać test do ist-
niejącego kodu. Oszczędza Ci to potem masę czasu, kiedy trzeba sprawdzić
wielokrotnie, czy wprowadzane przez Ciebie zmiany naprawdę rozwiązują
problem. Prześledźmy to na przykładzie.

Masz aplikacje webową, opartą na frameworku Django. Znajduje się tam


formularz rejestracji, pod adresem /register. Formularz zawiera pola: imię,
nazwisko, email, numer telefonu. Niewymagany jest tylko numer telefo-
nu. Po jego poprawnym wypełnieniu użytkownik ma zostać przekierowany

pymasters.pl 57
Warsztat Juniora

na stronę /register-thank-you oraz ma zostać utworzone nowe, nieaktyw-


ne konto w systemie. Problem w tym, że formularz nie działa. Z jakiegoś
powodu konto w systemie się nie tworzy. Jak to naprawić? Można ręcznie
przechodzić procedurę rejestracji i badać dokładnie co się dzieje korzystając
z instrukcji print i czata. Można też napisać sobie kilka testów które będzie
można uruchamiać szybko i wielokrotnie. Poniżej przykłady testów, wraz
z omówieniem w kodzie. Jak wcześniej, poproszę o pomoc AI:

Jesteś ekspertem pythona i Django. Dopisz testy do strony internetowej.


Znajduje się tam formularz rejestracji, pod adresem /register. Formularz zawie-
ra pola: imię, nazwisko, email, numer telefonu. Niewymagany jest tylko numer
telefonu. Po jego poprawnym wypełnieniu użytkownik ma zostać przekierowany
na stronę /register-thank-you oraz ma zostać utworzone nowe, nieaktywne kon-
to w systemie.
Napisz do tego testy w oparciu o pytest.

# Importujemy pytest oraz funkcje create_new_user_account


z naszej aplikacji webowej.
import pytest
from your_web_app import create_new_user_account # to jest
przykładowy kod.

# Test sprawdzający, czy strona rejestracji wyświetla się po-


prawnie.
def test_registration_form_page(client):
response = client.get('/register')
# Sprawdzamy, czy status odpowiedzi to 200 OK.
assert response.status_code == 200
# Sprawdzamy, czy strona zawiera pola do wypełnienia
(imię, nazwisko, email, numer telefonu).
assert 'Imię' in response.content
assert 'Nazwisko' in response.content
assert 'Email' in response.content
assert 'Numer telefonu' in response.content
# To trochę naiwny test, bo tylko sprawdza czy takie
stringi występują na stronie. Może w tym przypadku wystarczy?

pymasters.pl 58
Warsztat Juniora

# Test sprawdzający poprawną rejestrację użytkownika.


def test_successful_registration(client):
data = {
'first_name': 'John',
'last_name': 'Doe',
'email': 'john@example.com',
}
response = client.post('/register', data=data, follow_re-
directs=True)
# Sprawdzamy, czy status odpowiedzi to 200 OK.
assert response.status_code == 200
# Sprawdzamy, czy na stronie wyświetla się komunikat
o sukcesie.
assert 'Rejestracja zakończona sukcesem' in response.con-
tent
assert 'Konto zostało utworzone' in response.content
# Te dwie linie należy odpowiednio dostosować.

# Test sprawdzający przekierowanie po poprawnej rejestracji.


def test_successful_registration_redirect(client):
data = {
'first_name': 'John',
'last_name': 'Doe',
'email': 'john@example.com',
}
response = client.post('/register', data=data, follow_re-
directs=False)
# Sprawdzamy, czy status odpowiedzi to 302 Found (prze-
kierowanie).
assert response.status_code == 302
# Sprawdzamy, czy przekierowanie prowadzi na właści-
wą stronę.
assert response.headers['Location'] == 'http://localhost/
register-thank-you'

# Test sprawdzający rejestrację użytkownika bez podawania nu-


meru telefonu.
def test_missing_phone_number(client):

pymasters.pl 59
Warsztat Juniora

data = {
'first_name': 'John',
'last_name': 'Doe',
'email': 'john@example.com',
'phone_number': '', # Pusty numer telefonu.
}
response = client.post('/register', data=data, follow_re-
directs=True)
# Sprawdzamy, czy status odpowiedzi to 200 OK.
assert response.status_code == 200
# Sprawdzamy, czy na stronie wyświetla się komunikat
o sukcesie.
assert 'Rejestracja zakończona sukcesem' in response.con-
tent
assert 'Konto zostało utworzone' in response.content
# Te dwie linie należy odpowiednio dostosować.

# Test do funkcji create_new_user_account - wymaga dostosowa-


nia do implementacji aplikacji.
def test_create_new_user_account():
# Testowanie funkcji tworzenia konta użytkownika.
# Dodaj odpowiednie asercje do sprawdzenia, czy konto zo-
stało poprawnie utworzone.
pass

Piękne, prawda? Dostaliśmy za darmo testy które po niewielkim dostoso-


waniu sprawdzą formularz rejestracyjny. Nie muszę już klikać po stronie.
Uruchamiam komendę pytest i gotowe.

W kodzie występuje słowo assert wielokrotnie, zwane asercją. Jest używa-


ne do sprawdzania warunków lub wyrażeń. Jeśli warunek jest prawdziwy
(True), to program kontynuuje działanie. Jeśli warunek jest fałszywy (False),
to zostanie wygenerowane wyjątek AssertionError, co pozwala na wykrycie
i obsługę błędów w kodzie. Jest to narzędzie do tworzenia asercji lub testów
jednostkowych w celu zapewnienia, że kod działa zgodnie z oczekiwaniami.

pymasters.pl 60
Warsztat Juniora

Ten kod oczywiście nie jest idealny, to jest to co podsuwa sztuczna inteli-
gencja. Potężnie jednak przyśpiesza pracę. Trzeba by go zapewne trochę
dostosować do rzeczywistej aplikacji, między innymi poprzez poprawę:
• nazwy pól formularzy
• komunikaty o utworzeniu użytkownika
• dodać sprawdzenie, czy użytkownik został utworzony w bazie.

Więcej na temat pytest można znaleźć na stronie projektu: pytest.org. A je-


śli chcesz poćwiczyć pisanie testów na żywym projekcie z innymi ludźmi - za-
praszam do dołączenia do społeczności pymasters.pl, którą prowadzę.

5. Cierpliwość i systematyczność
“You waste years by not being able to waste hours.” Amos Twersky

Te dwie cechy są bardzo ważne. O ileż łatwiej jest rzucić się w wir klepania
w klawisze po jednorazowym przeczytaniu zadania do wykonania. Jak fajnie
pisze się nowy kod, który zaraz będzie można uruchomić. Ale… nie działa.
Stop. Powoli.

Cierpliwość, systematyczność i metodyczne podejście. Zatrzymaj się i po-


myśl. Dostajesz nowe zadanie do wykonania, znajdujesz nowy projekt czy
zagadnienie, które chcesz zrobić. Usiądź, weź kartkę i długopis, lub otwórz
notatnik, i napisz swoimi słowami, co chcesz zrobić. Rozpisz krok po kroku
co ma się zadziać. W wielu narzędziach to zarządzania projektami, takich jak
Jira czy Clickup, w zadaniach można stosować checklisty - rozbij więc swoje
obecne zadanie na takie podstawowe kroki. Gdybym miał napisać formu-
larz rejestracyjny, wspomniany w poprzedniej sekcji, wyglądałoby to mniej
więcej tak:
• sprawdz czy w modelu użytkownika są niezbędne pola. Jesli nie ma,
dodaj
• napisz formularz w forms.py
• dodaj nowy widok, oparty o CreateView z formularzem z poprzednie-
go kroku

pymasters.pl 61
Warsztat Juniora

• zaktualizuj urls.py
• przygotuj szablon html - zapewne skopiuj istniejący
• sprawdź czy formularz się wyświetla po wejściu na strone
• sprawdź czy przekierowuje poprawnie po rejestracji
• sprawdź czy jest poprawnie tworzony użytkownik w systemie (poprzez
panel admina, więc może trzeba zmodyfikować admina).

W taki sposób rozpisane zadanie mogę sobie wykonywać spokojnie, bez


niespodzianek, swoim tempem. Co więcej, mogę je właściwie zostawić w do-
wolnym momencie, bo wiem gdzie skończyłem (odznaczam podczas pracy).
Wspaniałe prawda?

6. Dokumentowanie postępów
Kolejną ważną rzeczą jest dokumentowanie postępów. Nieważne, czy pra-
cujesz już w zawodzie, czy dopiero się uczysz. Stwórz sobie dokument, może
być to dokument na Google drive, plik tekstowy w PRYWATNYM repozy-
torium na GitHub (polecam, proste rozwiązanie) czy notatka w Notion lub
Evernote. Zapisuj tam co tydzień, co w danym tygodniu robiłeś i czego się
nauczyłeś. Wpisz tam każdy kurs i książkę, jaką przerobiłeś. To zajmuje 10 -
15 minut. Dzięki temu, przygotowując się do rozmowy kwalifikacyjnej masz
sporo informacji o rzeczach, które znasz. A jak masz gorszy dzień i myślisz
o powrocie do klepania faktur w sekretariacie, bo myślisz, że nic nie umiesz…
popatrz, ile już wiesz?

pymasters.pl 62
Warsztat Juniora

Język Angielski
Jako programista musisz znać język angielski w stopniu umożliwiającym
zrozumienie dokumentacji technicznej. Conajmniej. W niektórych firmach
będziesz pracować tylko po angielsku. Spotkania, taski, maile, to wszystko
może być tylko w tym języku. Oczywiście jest też mieszanka - polsko-ame-
rykańska firma, która angielskiego używa tylko w taskach i mailach, nato-
miast polski zespół w biurze rozmawia “po ludzku”. Trzeba więc znać język
i go ćwiczyć.

Wiem, są narzędzia, które przetłumaczą dokumentacje na język polski:

• tłumacz Google
• Chat GPT (ten nawet potrafi wyjaśnić co bardziej skomplikowane po-
jęcia)

Sam z nich czasem korzystam, bo nawet po latach pracy czasem czegoś nie
rozumiem. I tu nie chodzi o język, ale o barierę kulturową. Przykład z nasze-
go podwórka: przetłumacz na angielski: Dziura zabita dechami. Albo wiocha
zabita dechami. Generalnie nie da się przekazać sensu bez dodatkowego tłu-
maczenia.

Dodatkowo, jeśli piszesz maila czy opis zadania po angielsku - na końcu


przetłumacz go z angielskiego (Twojego) na polskie (nasze). Serio, można
się zdziwić jakie dziwne błędy się robi.

Jak się uczyć angielskiego?


Najlepiej na spotkaniach 1:1 z nauczycielem. Nic nie daje takiego przełoże-
nia jak lekcje 1:1, zwłaszcza jeśli jeszcze jest to język techniczny. Jest kilka
firm oferujących tego typu usługi, np. www.fluentbe.com.

Dodatkowo: otocz się językiem. Zmień ustawienia języka na kompute-


rze. Zacznij używać fiszek. Oglądasz film? No to w wersji angielskiej lub co

pymasters.pl 63
Warsztat Juniora

najwyżej z napisami. Wybieraj materiały do nauki po angielsku i tak też


twórz do nich notatki. Im więcej języka wokół Ciebie, tym lepiej.

Dodatkowa motywacja: jak już nabierzesz trochę doświadczenia w zawo-


dzie to na kontraktach dla firm z USA czy Wielkiej Brytanii zarabia się zu-
pełnie inne pieniądze niż w Polsce. Ja tak pracuje, odkąd odszedłem z etatu
w 2010 roku. Ty też możesz.

pymasters.pl 64
Warsztat Juniora

Umiejętności miękkie.
Kim masz być, by Cię zatrudnili?

Dobre pytanie, prawda? Specjalnie zadaje je w takiej formie - nie co musisz


robić, ale kim masz być.

Musisz być świetnym komunikatorem. Jasno wyrażaj swoje myśli. Wiele ze-
społów obecnie, nie tylko w IT, pracuje w rozproszeniu (zdalnie). Owszem,
mogą być biura. Kiedy jedno jest we Wrocławiu, a drugie w Warszawie, cała
komunikacja odbywa się poprzez email lub Slack, to skuteczna komunika-
cja staje się kluczowa. Musicie wiedzieć, o czym rozmawiacie. Używać tych
samych określeń do tych samych narzędzi (tzw słownika). Jeśli czegoś nie
rozumiesz, to po prostu zadaj pytanie. Poproś drugą stronę, żeby to wytłu-
maczyła jeszcze raz. Jesteś juniorem, masz prawo nie wiedzieć lub nie ro-
zumieć. Bardzo kiepsko wygląda sytuacja, kiedy ktoś coś tłumaczy, a potem
się okazuje, że druga strona zatrzymała się na trzecim zdaniu, bo czegoś nie
zrozumiała. A w sumie cały czas potakuje…

Ja też proszę o wytłumaczenie jeszcze raz jeśli czegoś nie rozumiem.

Jednym z bardziej użytecznych tricków jest powtórzenie tego, co przekazał


rozmówca, żeby potwierdzić rozumienie: “Panie Pawle, czyli mam napisać
skrypt który przekonwertuje 10k rekordów z pliku CSV na JSON, z zachowa-
niem nagłówków kolumn. Skrypt ma być łatwy do uruchomienia, bo będą
go obsługiwać osoby nietechniczne. W założeniu te pliki CSV jakoś strasznie
większe niż te 10000 rekordów nie będą. Dobrze rozumiem zadanie?”. Jest
to genialna technika, bo pozwala Ci sprawdzić rozumienie przekazanej in-
formacji. Rozmówca może od razu zweryfikować, co zrozumiałeś. Działa to
zarówno w rozmowie, na slacku, w mailach czy w zadaniach w Jirze. Stosuje
to właściwie codziennie.

pymasters.pl 65
Warsztat Juniora

Musisz być świetnym współpracownikiem. Zapamiętaj raz na zawsze i po-


wtarzaj codziennie - nie ma My (programiści) i Oni (biznes) - praca programi-
sty polega na rozwiązywaniu problemów Biznesu. Jedziecie na tym samym
wózku, a nawet więcej - to Biznes Ci płaci. A czym jest ten osławiony Biznes?
Właściwie to Waszym klientem. On mówi, czego potrzebuje. Od jego sukce-
su zależą Twoje wakacje. Zapamiętaj więc, że Twoim celem w tej firmie jest
rozwój tej firmy. Masz pomagać w osiąganiu celów i rozwiązywać problemy.
Kiedy ktoś z czymś do Ciebie przychodzi, bardzo fajnie sprawdza się pytanie:
“W czym mogę pomóc”? Najlepiej jeszcze z uśmiechem. Serio. Pozytywne
podejście do pracy, entuzjazm, chęć pomocy współpracownikom, bardzo
pomagają. W końcu nikt nie chce pracować ze zrzędą, prawda?

Do tego dochodzi oczywiście umiejętność pracy w zespole, czyli podziału


zadań oraz pracy w grupie.

Musisz być spokojny w sytuacjach kryzysowych (odporny na stres). Gene-


ralnie zawsze warto zachować spokojną głowę kiedy “robi się gorąco”.
Zatrzymać się i spokojnie pomyśleć nad rozwiązaniem problemu. Jeśli gonią
terminy: skupić się na małych kroczkach i po prostu zabrać do pracy - jedna
rzecz, za drugą. Słonia się zjada po kawałku.

Warto być kreatywnym. Pozwoli Ci to rozwiązywać problemy w nietypowy,


nowatorski sposób, a może nawet obejść dany problem i jego rozwiązanie
wcale nie będzie potrzebne?

Musisz umieć myśleć krytycznie, czyli myśleć logicznie i umieć patrzeć na


problemy z różnych perspektyw. Myślenie logiczne to uporządkowanie my-
śli w spójny sposób, wykorzystując racjonalne argumenty i dowody. Pozwala
oddzielić fakty od przekonań i emocji, prowadząc do bardziej obiektywnych
wniosków. Polega na ocenie dowodów, identyfikacji błędów w rozumowa-
niu (takich jak fałszywe analogie czy błędne generalizacje) i budowaniu spój-
nych argumentów.

Z kolei patrzenie na problemy z różnych perspektyw to zdolność do rozpa-


trywania różnych punktów widzenia i rozumienia, że różne osoby mogą mieć
odmienne interpretacje tej samej sytuacji. Włącza to empatię i otwartość na

pymasters.pl 66
Warsztat Juniora

nowe pomysły, a także gotowość do przemyślenia i ewentualnego zmienie-


nia własnych przekonań w świetle nowych informacji. Rozpatrywanie różno-
rodnych perspektyw pomaga dostrzec nie tylko oczywiste aspekty problemu,
ale także te mniej widoczne, co może prowadzić do nowych, bardziej kom-
pleksowych i efektywnych rozwiązań.

Warto również być inteligentnym emocjonalnie, czyli umieć zarządzać swoimi


(zwłaszcza) emocjami. Oznacza to też, że rozpoznajesz i rozumiesz emocje
innych. Oznacza to, że np. potrafisz opanować złość lub frustrację w trud-
nych sytuacjach. Potrafisz też odczytać subtelne wskazówki, takie jak mowa
ciała czy ton głosu, co pozwala im lepiej zrozumieć stan emocjonalny innych
osób. Potrafisz klarownie i szczerze wyrażać swoje emocje, jednocześnie bę-
dąc wrażliwymi na emocje rozmówców. Wszystko to prowadzi do bardziej
efektywnej i klarownej komunikacji.

Musisz być otwarty na krytykę. Co więcej, sam tej krytyki szukaj. Pytaj innych
członków zespołu co sadzą o Twojej pracy, o Twoim kodzie. Pytaj swojego
przełożonego, co możesz poprawić. Bądź aktywny, zbieraj te informacje.
Bądź gotowy do uczenia się, wsłuchuj sie w te informacje zwrotne. Pamiętaj
też, żeby brać pod uwagę tylko tę krytykę o którą prosisz. Nie interesuje Cię
frustracja innych, tylko konstruktywny feedback, o który prosisz.

Warto też być empatycznym. Empatia pozwala lepiej rozumieć użytkowni-


ków i ich potrzeby, co z kolei ułatwia projektowanie przyjaznych i użytecz-
nych interfejsów użytkownika.

Jeśli w firmie, w której jesteś, takie zasady współpracy są źle widziane, jest
wyraźny podział, a nawet pewna “wrogość” wobec coraz to nowych wyma-
gań ze strony Biznesu, brakuje kultury otwartości i konstruktywnej krytyki
- szukaj innego pracodawcy. Siedząc w takim, przesiąkniesz tą negatywną
atmosferą i na kolejne zadanie ze strony Biznesu stwierdzisz “Co ci debile
znowu wymyślili?” zamiast “Jak możemy im pomóc rozwiązać ten problem”?
Rożnica w podejściach jest ogromna.

pymasters.pl 67
Warsztat Juniora

Jak przejść rozmo-


wę kwalifikacyjną?
Najpierw trzeba się na nią dostać.

Warto zrobić mały research na temat firmy, do której aplikujesz. Mają stro-
nę? Zobacz czym, zajmują się dokładnie. Może mają profil na Facebooku lub
Instagramie? Są na Linkedin? Prześledź te media, zobacz co znajdziesz. Te
informacje pomogą Ci skomponować lepsze CV lub napisać list motywacyj-
ny. A może się okaże że kolega kolegi tam pracuje (LinkedIn?) i uda się wejść
“bocznymi drzwiami”?

Przygotuj CV pod konkretną pozycję - nie zajmie to dużo czasu. Zaznacz wy-
raźnie które wymagania spełniasz w 100% i jesteś w stanie to “udowodnić”
- certyfikatem, projektem z portfolio itp. Przenieś te informacja na sam po-
czątek dokumentu. Usuń totalnie zbędne pozycje.

Sprawdź, czy ogłoszenie nie ma jakichś specyficznych wymagań, np. że CV


ma być po angielsku. A może masz jakieś dodatkowe atuty, które przyda-
dzą się przyszłemu pracodawcy? Podkreśl, co robiłeś na studiach, jakie pro-
jekty? Może Twoja praca dyplomowa obejmowała programowanie? Może
działałeś w społecznościach, gdzie przekazywałeś wiedze młodszym stażem
programistom? A może brałeś udział w projektach grupowych?

Bierz pod uwagę oferty, w których spełniasz conajmniej 70% wymagań.


Serio. 100% zgodności to mit.

Elementy, których nie spełniasz lub nie wiesz jak wykazać, wykorzystaj na
swoją korzyść. Jak? Skontaktuj się z rekruterem - albo przez formularz kon-
taktowy na stronie, Linkedin, albo telefonicznie (tak, znajdź ten numer -
możesz też o niego na Linkedinie poprosić). Podczas rozmowy powiedz, ile
procent wymagań spełniasz, wymień wymagania, których nie spełniasz lub
obawiasz się, że Twoje kompetencje są na zbyt niskim poziomie. Wymień,

pymasters.pl 68
Warsztat Juniora

jakie działania podjąłeś lub jakie masz doświadczenia w tych obszarach i któ-
re mogą być podstawą do zbudowania, lub rozwinięcia tych umiejętności.

Ten kontakt z rekruterem zawsze warto nawiązać. Zapytaj, co możesz zrobić,


żeby ułatwić mu prace z Twoim CV. Na pewno w ten sposób zwrócisz na sie-
bie uwagę, a może Twoje CV trafi bezpośrednio do tego rekrutera, zamiast
na skrzynkę z ogłoszenia z kilkuset innymi? Ponadto, cały czas ćwiczysz kon-
takt z drugim człowiekiem w celu rekrutacji. To spowoduje, że będziesz po
prostu czuć się w tym coraz swobodniej.

Skup się na tym, co robiłeś do tej pory. Jeśli pracowałeś jako python deve-
loper, to jakie były Twoje zadania? Tutaj bardzo przydatny będzie dziennik
nauki (kariery), o którym wspominałem wcześniej. “Nie ma nic gorszego niż
CV, z którego nic nie wynika - tzn. nie wystarczy napisać, że przez x czasu
pracowałam jako Python Developer, bo to w praktyce mogło oznaczać róż-
ne rzeczy” - to cytat z jednej z moich rozmów z rekruterami.

Jeśli nie masz projektów komercyjnych, no to przecież masz swojego GitHuba.


Tutaj zasady są te same. Opisz projekty, jakie robiłeś, ze szczegółami:
• jaki był zakres zadań
• co się udało
• jaki był mój wkład
• czy i jak moja praca wpłyneła na postępy
• czy odniosłem po drodze jakieś pomniejsze sukcesy? Część z tych suk-
cesów da się wyrazić liczbowo - jeśli tak, warto o tym wspomnieć

Oczywiście bardzo cenna jest praca w grupie. Tutaj można dołączyć do jed-
nego z wielu projektów open source lub do społeczności PyMasters.pl, którą
prowadzę. W naszej społeczności dzielimy się wiedzą, pracujemy na grupo-
wych projektach i mamy regularne spotkania.

pymasters.pl 69
Warsztat Juniora

A co na rozmowie?
Spokój.

Jeśli rozmowa odbywa się online, przygotuj się do niej 15 min wcześniej.
Sprawdź słuchawki, mikrofon, nagraj się i odsłuchaj żeby wiedzieć czy dźwięk
jest ok. Sprawdź, czy działa Ci internet. Zobacz, jak awaryjnie podłączyć się
pod internet z telefonu. Powiedz domownikom, że masz ważną rozmowę
i odkurzanie czy wiercenie w tym momencie jest niemile widziane. Postaraj
się żeby kot, pies czy dziecko nie przeszkodziło w rozmowie. A jeśli już coś
takiego się zdarzy - poproś o 3 minuty i uporaj się z kłopotem. Szczerość po-
maga, jesteśmy ludźmi, w końcu jesteś w swoim domu i nie masz dodatko-
wego pomieszczenia, w którym się możesz zamknać na 40 minut. Rozmowa
kwalifikacyjna z łazienki raczej by wyglądała kiepsko.

Jeśli rozmowa odbywa się w siedzibie firmy, przyjedź odpowiednio wcze-


śniej. Nawet 30 minut wcześniej - możesz pójść do kawiarni obok i chwile
posiedzieć, żeby uspokoić się przed spotkaniem. Sprawdź dokładnie gdzie
jest biuro, zobacz która klatka, które piętro, czy jest recepcja, schody, winda?
Wyceluj tak, żeby do biura firmy wejść 5 minut przed czasem. Oczywiście,
“w okolicy” masz być sporo wcześniej, żeby nie było problemu z korkami czy
niespodziewanym objazdem.

Doprecyzowuj pytania. Popularne pytanie: ” Proszę powiedzieć coś o sobie”


jest dość onieśmielające. Można poprosić o doprecyzowanie: Oczywiście,
proszę powiedzieć jaki aspekt swojego życia powinienem poruszyć: eduka-
cje, życie osobiste, życie zawodowe? Co dla Państwa ma największą wartość?
Skup się na tym czego nie ma w CV.

Zadawaj pytania i notuj odpowiedzi. Jak sama nazwa wskazuje, to jest roz-
mowa, nie przesłuchanie. Przygotuj sobie wcześniej notes z pytaniami, i za-
dawaj je w trakcie bądź na końcu rozmowy. Notuj podczas rozmowy. Jeden
z rekruterów stwierdził, że zadziwia go, jaką Ci ludzie mają fenomenalną
pamięć - nic nie notują podczas rozmowy.

pymasters.pl 70
Warsztat Juniora

Kilka przykładowych pytań:

• jak wygląda ścieżka rozwoju w tej firmie/na tym stanowisku?


• kim jest mój przyszły przełożony, jakie ma oczekiwania, co się dla nie-
go liczy? Czego oczekuje, czego wymaga?
• Jak wygląda codzienność na tym stanowisku, po czym poznają ze pra-
cownik jest dobry?

Na sam koniec podziękuj. Zapytaj, kiedy będą wyniki i czy firma dzieli się fe-
edbackiem w przypadku sukcesu jak i porażki kandydata? Poproś o numer
telefonu osoby, z którą rozmawiasz i zapisz go sobie - możesz zadzwonić za
jakiś czas i zapytać o wynik.

Jak ćwiczyć rozmowy rekrutacyjne?


Uczysz się angielskiego z native speakerem? Zróbcie sobie symulacje roz-
mowy kwalifikacyjnej. Poćwiczysz zarówno język, jak i sytuację, w bezpiecz-
nych warunkach, z żywym człowiekiem.

Użyj AI!

Wykorzystaj Chat GPT. Możesz tak z nim porozmawiać:

pymasters.pl 71
Warsztat Juniora

Jeśli czat sobie nie radzi za dobrze, można rozważyć wykupienie subskrypcji
za 20$ na miesiąc i wtedy powtórzyć operacje. Wersja płatna jest naprawdę
dużo bardziej rozbudowana.

To tak na początek. Warto też poprosić kogoś z rodziny, żeby z Tobą prze-
prowadził taką rozmowę - zwłaszcza jeżeli pracuje w branży. Można też sko-
rzystać z platform typu:
• interviewing.io - tutaj możemy porozmawiać inżynierem pracującym np
w Google lub Facebooku. Droga usługa. Inne serwisy tego typu to, mię-
dzy innymi:
• www.pramp.com - Pramp to darmowa platforma do praktykowania wy-
wiadów technicznych w czasie rzeczywistym z innymi użytkownikami.
Oferuje pełne symulacje wywiadów, w tym pytania i odpowiedzi z fe-
edbackiem.
• interviewbuddy.net - Umożliwia użytkownikom przeprowadzanie symu-
lowanych wywiadów wideo z ekspertami z branży, którzy następnie ofe-
rują szczegółowe recenzje i porady.

Podpowiedzi od rekruterów
Podczas przygotowywania tego ebooka porozmawiałem z ponad 50 rekru-
terami, pytając o rzeczy które wyróżniają dobre CV. Poniżej znajdziesz pod-
sumowanie tych rozmów.

Jako Junior nie masz imponującego portfolio. Możliwe, że nie masz w ogóle
doświadczenia komercyjnego. Kluczowe jest więc precyzyjne opisanie, co
dokładnie realizowało się w ewentualnie już zrealizowanych pracach - jaki
był zakres zadań, co się udało, jaki był twój wkład, czy i jak ta praca wpły-
nęła na postępy. Może odniosłeś jakieś pomniejsze sukcesy, część z tych
sukcesów da się wyrazić liczbowo - jeśli tak, warto o tym wspomnieć. Jeśli
nie masz komercyjnego doświadczenia, opisz projekty prywatne - w takich
samych szczegółach. Samo ukończenie bootcampu czy kursu to obecnie za
mało - potrzebne są dodatkowe projekty.

pymasters.pl 72
Warsztat Juniora

Podkreślę to jeszcze raz: pierwsze co rekruter powinien zobaczyć to, to że


nadajesz się na to stanowisko. Informacje potwierdzające. Jeśli nie masz do-
świadczenia, to odwracasz schemat. Pokazujesz to, co jest najbliższe poszu-
kiwanej pracy, czyli projekty pokazujące co zrobiłeś hobbystyczne w ramach
kompetencji zawodowych czy w społecznościach. Wszystko to, co potwier-
dza kompetencje, przenieś na początek.

Ten temat doświadczenia przewija się w niemal wszystkich odpowiedziach.


Twórz więc dziennik nauki (kariery), zapisuj swoje projekty. Dopieść GitHuba.
A w CV dokładnie i szczegółowo opisuj projekty.

Warto też napisać list motywacyjny, w którym wspomnisz o wartości doda-


nej, którą możesz wnieść do zespołu. Może np. masz doświadczenie w bran-
ży, w której działa firma?

Ważne jest dopasowanie kandydata do oferty, na którą aplikuje. Przygotuj


CV pod konkretną oferte - pasujace pozycje przenieś na początek w CV, usuń
zbędne. Podkreśl swoje doświadczenie z poprzedniej pracy, które może
być przydatne w tej ofercie. Tutaj też przydaje się dziennik nauki (kariery).
Dodatkowo, jeśli np. firma wymaga Azure, a Ty się go uczysz, to warto na-
pisać że “jestem w trakcie nauki Azure, zrobiłem kurs X, Y, Z” - nawet jeśli te
kursy są darmowe. Pokazuje to Twoje zainteresowanie i chęć nauki, wyglą-
da też dużo lepiej niż “Chciałbym się nauczyć Azure”.

Przy Azure zatrzymam się nieco dłużej. Przewija się w rozmowach potrzeba
znajomości chmury - Google Cloud, Azure, AWS. Przy czym pamiętać należy,
że chmura to nie tylko kontener Dockera uruchomiony na serwerze. To na-
prawdę są już ogromne ekosystemy. Warto poznać, chociaż podstawy ich
działania i to w praktyce.

W przypadku Juniorów czasem elastyczność i motywacja mogą przeważyć


nad zaawansowanymi umiejętnościami technicznymi, zwłaszcza gdy kan-
dydaci są przyjemni w kontakcie. Warto pokazywać swoje zaangażowanie
i motywacje. Ponadto mogą pomóc niewygórowane oczekiwania finansowe.
Tutaj warto się zastanowić, co jest Twoim celem: zdobycie doświadczenia czy

pymasters.pl 73
Warsztat Juniora

spłata kredytu hipotecznego 2 lata wcześniej? Bardzo możliwe, że zdobycie


doświadczenia pozwoli Ci na szybszy rozwój i szybszy przyrost zarobków.

Bardzo ciekawą rzecz stwierdziła jedna z rekruterek. Otóż dużo jest progra-
mistów Pythona, którzy nie ogarniają programowania bez Django. Warto
więc podkreślać, że potrafisz programować bez frameworka i mieć takie
projekty na swoim Githubie. Możesz na przykład napisać aplikacje, która
będzie zbierała informacje o mieszkaniach do wynajęcia w Twojej okolicy
i zapisywała to do pliku.

Konieczna jest znajomość języka angielskiego co najmniej na poziomie B2.

pymasters.pl 74
Warsztat Juniora

Zakończenie.
Dziękuję, że poświęciłeś swój bezcenny czas na przeczytanie tego ebooka.
Mam nadzieje, że wiedza w nim zawarta pomoże w Twojej drodze progra-
misty.

Zapraszam Cię serdecznie do dołączenia do społeczności pymasters.pl,


gdzie dzielimy się wiedzą i prowadzimy wspólne projekty. To bezpieczna
przestrzeń w sieci, skupiająca programistów Pythona na różnych pozio-
mach, gdzie dzielimy się wiedzą i szkolimy nawzajem. Mnie też tam można
znaleźć ;-)

Możesz też skontaktować się ze mną bezpośrednio na:

jacek@akademiait.com.pl

Powodzenia na Twojej drodze.

pymasters.pl 75

Вам также может понравиться