Warsztat Juniora
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
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ć.
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).
Kod “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
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.
pymasters.pl 6
Warsztat Juniora
Przykład
def get_squares(l):
s = []
for i in l:
s.append(i*i)
return s
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”.
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.
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.
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().
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().
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
• Definicja:
Kolekcja znaków ujęta w pojedyncze lub podwójne cudzysłowy.
• Zastosowania:
Przechowywanie i manipulowanie tekstem.
• Operacje:
split(), replace(), upper(), lower(), strip().
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.
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
Przykłady
# Przykład użycia
arr = [10, 20, 30, 40, 50]
index = 3
print(access_element(arr, index)) # Wynik: 40
pymasters.pl 14
Warsztat Juniora
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
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
pymasters.pl 15
Warsztat Juniora
pymasters.pl 16
Warsztat Juniora
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.
pymasters.pl 17
Warsztat Juniora
Repozytorium na Githubie!
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.
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:
Przykład:
pymasters.pl 20
Warsztat Juniora
Przykład:
Przykład:
pymasters.pl 21
Warsztat Juniora
Przykład:
pymasters.pl 22
Warsztat Juniora
• 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
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
Zacznijmy od podstaw.
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.
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
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ą:
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
7. Checkout:
Polecenie „checkout” w Gitcie pozwala na przełączanie się między różny-
mi gałęziami w repozytorium.
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.
2. develop
pymasters.pl 31
Warsztat Juniora
Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
pymasters.pl 32
Warsztat Juniora
Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
Ref: atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
pymasters.pl 33
Warsztat Juniora
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.
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.
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:
» ./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
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.
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
3. Wykorzystanie AI.
pymasters.pl 39
Warsztat Juniora
pymasters.pl 40
Warsztat Juniora
Wykorzystanie AI.
pymasters.pl 41
Warsztat Juniora
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
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.
pymasters.pl 44
Warsztat Juniora
class CustomUser(AbstractUser):
age = models.PositiveIntegerField(null=True, blank=True)
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', )
<!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
AUTH_USER_MODEL = 'myapp.CustomUser'
Czy ten kod zadziała? Ma spore szanse. Nie sprawdzałem. Niemniej, widać
potencjał, prawda? Zastosowanie AI w pracy bardzo pomaga.
pymasters.pl 47
Warsztat Juniora
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)
pymasters.pl 48
Warsztat Juniora
Chcemy prześledzić przebieg działania tej funkcji - w tym celu dodam in-
strukcje print().
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:
top_3_words(text)
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
pymasters.pl 52
Warsztat Juniora
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).
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']
pymasters.pl 55
Warsztat Juniora
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.
pymasters.pl 56
Warsztat Juniora
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.
pymasters.pl 57
Warsztat Juniora
pymasters.pl 58
Warsztat Juniora
pymasters.pl 59
Warsztat Juniora
data = {
'first_name': 'John',
'last_name': 'Doe',
'email': '[email protected]',
'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ć.
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.
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.
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).
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ć.
• 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.
pymasters.pl 63
Warsztat Juniora
pymasters.pl 64
Warsztat Juniora
Umiejętności miękkie.
Kim masz być, by Cię zatrudnili?
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…
pymasters.pl 65
Warsztat Juniora
pymasters.pl 66
Warsztat Juniora
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.
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
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.
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.
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.
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.
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
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.
Użyj AI!
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
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.
pymasters.pl 73
Warsztat Juniora
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.
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.
pymasters.pl 75