Python Junior - wymagania

0

Witam,

przeczytałem kilka wątków - min. ten Junior Python Software Engineer, co umieć
i tak się zastanawiam "co" musi umieć junior Py Developer aby czuć się w miarę "pewnie" aplikując na stanowisko junior?

2

Tldr, co ja umiałem:
Algo:
Insertion Sort – chyba nie muszę tłumaczyć, proste wyszukiwanie po strukturze danych. Podstawa podstaw.
Selection Sort – podobnie jak na górze. Bardzo podstawowe, nieefektywne.
Bubble sort
Merge sort b) szukania
Linear Search – podstawa kompletna
Binary Search To chyba tyle z takich absolutnych podstaw. I teraz uwaga – czy każdy z tych algorytmów znam dokładnie na pamięć, implementowałem po kilka razy i wykorzystywałem własne, zmodyfikowane wersje? Nie. Po prostu wiem jak działają – znam schemat ich pracy, ich wady i zalety, kiedy użyć jakiego. Kiedy nie używać danego algorytmu, złe przypadki i tak dalej. Bo to ważne jest. Czasami diametralnie zmienia prędkość pracy naszego programu.

truktury danych Tutaj sprawa jest prosta. Struktury danych to rzeczy, które niejednokrotnie mogą nam ułatwić znacząco życie. Tu warto trochę zagłębić się w szczegóły.

Jakie konkretnie te struktury danych kojarzyłem? Już mówię.

Array – chyba każdy zna, co?
Dictionary – też?
LinkedList – większość?
Stack
Heap
Set
Queue
Trees
HashTable
Trie Przy czym te trzy ostatnie to raczej tak ekstra, ponad poziom bym rzekł. Co tutaj warto wiedzieć? Jakie są wady/zalety danej struktury, kiedy jakiej używać. Złożoności obliczeniowe czy też pamięciowe dla nich i podstawowych operacji na nich jak szukania, wstawianie, sortowanie. Podobnie jak przy algorytmach.

frameowkir: Django, flask, django-rest-framwork (flaska można wyrzucić)

Testowanie
No jest coś takiego. Jak to wygląda? Chodzi o przeklikanie appki? No nie zawsze. Fajnie jest wiedzieć, co to są te testy jednostkowe, testy funkcjonalne i takie tam. Czy musisz być w nich biegły i umieć je pisać? Nie, w zasadzie to większość programistów niezbyt je ogarnia tak w sumie.

Systemy operacyjne
Jak słyszałeś, że jest coś takiego jak Linux, to spoko. Jak nie, no to też nie najgorzej. Szczerze to mocno zależne od twojej pracy, czy będzie ci potrzebne, ale moim zdaniem dobrze jest wiedzieć na początku chociaż jakieś podstawy. Nie każę ci tu instalować od razu Gentoo czy coś, ale jak będziesz umiał poruszać się po systemie za pomocą konsoli, utworzyć, przenieść czy zmienić nazwę pliku, usunąć go, za pomocą linuxowej(albo windowsowej) konsoli, to będzie świetnie.

Jak już o systemach mowa
To porozmawiajmy o rzeczach nieco niżej poziomowych. Tak, te okropne, archaiczne rzeczy. Yup. Otóż wyobraźcie sobie, że moje zrozumienie informatyki, programowania i ogólne pojęcie, wzrosło zasadniczo po tym, jak trochę ogarnąłem te właśnie podstawy.

To, jak komputer reprezentuje wszystko w pamięci, jak ta pamięć wygląda, stos i sterta, różnice między nimi, kiedy które używamy. Struktury danych jak wyglądają, czemu arraye indeksujemy od 0 a nie 1, jak wygląda ta linked list od środka, liczenie w binarnym systemie, hexowym.

Co to ten assembler, jak wygląda proces kompilacji, jaka różnica jest między językami kompilowanymi a interpretowanymi, typowanie statycznie a dynamicznie.

Dobre praktyki
Chodzi tu głównie o organizacje kodu, nazywanie zmiennych i tak dalej. Zmienne powinny być nazywane zwięźle, ale dokładnie, opisowo, konkretnie. Co robi zmienna x? No tego nie wie nikt, ty też zapomnisz, ale jeśli zmienna nazywa się number_of_clients to już coś nam to mówi.

Co do nazw mówimy, to mamy różne metodologie nazywania zmienny, metod, klas. Camel case, uderscore i tak dalej. Jaka? Bez znaczenia, byleś trzymał się jednej konsekwentnie. Poczytaj PEP8 jeśli jesteś Pythonowcem.

Funkcje, które piszesz nie powinny być też zbyt długie – nie upychaj wszystkiego do jednego wora. Dziel problemy na mniejsze elementy, rozbijaj je i programuj, twórz w sposób pozwalający na ich wielokrotne wykorzystanie bez powtarzania kodu.

VCS
Co to VCS i po co ci to nie będę się zagłębiał, ale jedno jest oczywiste.

Potrzebujesz znać Git’a. A jak nie znasz? Możesz się gdzieś tam dostać, ale to raczej do takiej firmy, z której trzeba uciekać. To nie jest trudne, naucz się. Git commit, merge, branch, checkout, push, pull, rebase. Chyba więcej na początek nie trzeba, mi to starcza.

I tak dalej. Jak masz ochotę to poczytaj sobie więcej u mnie na blogu: https://grski.pl/umiejetnosci.html

1

Nigdy nie można czuć się pewnie, bo przyjdzie Junior, który umie jedną bibliotekę/algorytm lepiej i to jego wezmą.
Albo firma odrzuci wszystkich kandydatów, bo szuka Seniora, a ma budżet dla Juniora.

0

@grski: Trochę mnie zaskoczyłeś przyznam... Spodziewałem się, że zagadnienia, które tutaj przeczytam mnie zaskoczą

Jestem świezo upieczonym inżynierem studiów informatycznych, pracuję 2 lata jako DevOps/Administrator (nie będe tutaj się rozpisywał w jakich technologiach).

Wątki, które przedstawiłeś zdają się być "trywialne" z mojego pkt widzenia (Tak, cały semestr pisałem w Assemblerze, w składni Intel 32b + Intel NASM).

We Flasku robiłem kilka fajnych projektów (CRUD + RabbitMQ + Redis (do cachowania) + konteneryzacja w Docker-Compose) => Takie mikroserwisy, teraz popularne :)

Co do Django dopiero zaczynam naukę

0

@Xoxepin Cóż, wydaje mi się zatem, że nie powinieneś mieć większych problemów. Poćwicz tylko proces rekrutacji i rozmowy, whiteboard interview, algorytmy na żywo i takiei tam + sztampowe pytania które często się zadaje juniorom na pythona, powinno być spoko.
W sumie jak chcesz to napisz mi na pw to ci podam przykłady jakie ja słyszałem itd. czy możemy sobie nawet zrobić videocalla gdzie postaram się być wrednym rekruterem xd

0

Generalnie zanim damy komuś rady, dobrze jest się zastanowić czy nie wyrządzimy mu w jakiś sposób krzywdy, bo np. dany ktoś uzna że jest łatwiej niż w rzeczywistości jest. Ja dodam, że na rozmowach na staż hash map to był standard, a zdarzyło się też mieć pytanie np. o strukturę danych Trie (tzn. pytanie było ogólne, po prostu ta struktura była potrzebna do rozwiązania problemu). Do tego przewija się sporo rzeczy na temat języka, wątków, HTTP, REST, GC (jeżeli aplikujemy na pozycję związaną z JVM to pytanie o GC to raczej standard), heap, stack itd. Zakres pytań się dość różni między firmami, dlatego warto po prostu dużo wiedzieć i nie zastanawiać się jakie jest minimum. To nie musi być standardem, ale w moich doświadczeniach znajomość konkretnych frameworków czy czasem nawet języków nie była kluczowa. Jak ma się solidne podstawy to takich rzeczy można się szybko nauczyć, ale w tym przypadku 'your mileage may vary'.

1

Przede wszystkim - wybrałeś sobie nieodpowiednią porę. Jeżeli szukasz pierwszej pracy powinieneś celować w praktyki studenckie / staże - to jest najłatwiejszy sposób no wejście jako student do branży, ok 80% stażystów potem zostaje juniorami. Obecnie wbicie do branży jako junior bez żadnego doświadczenia jest prawie niemożliwe (niektórym się udaje, ale po prostu sa lepsze alternatywy), ponieważ w prawie każdej ofercie na juniora wymagają z 6 miesięcy, czasami 1 rok lub nawet 2 lata doświadczenia komercyjnego. W dodatku od takiego juniora wymaga się znacznie więcej niż od stażysty - przede wszystkim od juniora wymaga się trochę większej samodzielności i radzenia sobie z problemami, a stażystę trochę prowadzi się za rączkę. Więc jak masz możliwość to w pierwszej kolejności spróbuj dostać się na staż lub praktyki, a potem jest bardzo duża szansa, że zostaniesz w firmie jako junior.

Jeżeli chodzi o sam proces rekrutacji to jest on naprawdę różny. Najlepsza rada dla początkującego jest taka, abyś znalazł sobie 2-3 firmy, w których spełniasz wymagania, ale nie chcesz pracować i udać się na rozmowę kwalifikacyjną w celu zdobycia doświadczenia. Nie słyszałem jeszcze o takim przypadku, by ktoś dostał zatrudnienie po 1 czy 2 rozmowie o pracę (no chyba że po znajomości). Ja jak szukałem pierwszego stażu to dostałem się dopiero bodajże do 3 lub 4 firmy i potem wybrałem lepszą, pierwsze 2 rozmowy spaliłem przez brak doświadczenia.

Co do rozmów rekrutacyjnych - musisz odbyć kilka, żeby zrozumieć, że w każdej firmie to inaczej wygląda. To co się zawsze powtarza i co powinieneś umieć.

  • podstawy wybranego języka programowania (w twoim przypadku Python), znajomość kilku ostatnich, najważniejszych wersji języka + różnice między nimi. Warto też znać pułapki danego języka, szczegóły i inne smaczki, często rekruterzy lubią dawać podchwytliwe pytania
  • algorytmy i struktury danych, złożoność obliczeniowa optymistyczna/pesymistyczna
  • znajomość VCS, najczęściej po prostu praktyczna znajomość Gita
  • podstawy SQL i relacyjnych baz danych

I to by było na tyle z rzeczy, które zawsze się pojawiają, natomiast w zależności od firmy reszta pytań może się znacznie różnić, tzn. w jednej firmie możesz mieć test wiedzy z danego frameworka + więcej pytań z języka. Na innej rozmowie możesz mieć większy nacisk na algorytmy i struktury i 0 pytań o frameworki. Ja raz w jednej firmie dostałem do rozwiązania test z podstaw informatyki na poziomie kilku najważniejszych rzeczy ze studiów w kontekście programowania czyli wybrane pytania z algorytmów, OOP, wzorców, systemów operacyjnych, sieci komputerowych, baz danych. W jeszcze innej firmie miałem tylko i wyłącznie pytania z podstaw języka i szczegółowa rozmowa na temat moich projektów na gicie, dlaczego np użyłem takiej funkcji a nie innej w danym miejscu, dlaczego nie zastosowałem wzorca, pytania czy moja klasa nie łamie którejś z zasad SOLID, miałem zademonstrować jak używam debuggera i korzystam z różnych tooli. W jeszcze innej firmie miałem napisać prosty program w kompletnie nieznajomej mi technologii i języku programowania (sprawdzanie tego jak szybko ogarniam pewne rzeczy).

Tak więc - niektóre rozmowy potrafią być naprawdę kreatywne, a w niektórych dostaniesz pytania z neta typu "top 100 XXX interview questions". Przed poszukiwaniem pierwszej pracy naprawdę warto powtórzyć sobie wiedzę ze studiów, wiele aspektów teoretycznych danego języka, algorytmy, zagadnienia związane z sieciami komputerowymi i bazami danych, poćwiczyć z miesiąc / 2 miesiące ćwiczenia z codility czy innej podobnej platformy i po prostu chodzić od firmy do firmy, zdobywać doświadczenie. W końcu się uda.

0

Co umieć by czuć się pewnie? Żyć z ignorancja, pychą i narcyzmem. Przyda się na juniora, mida i seniora. Nwm jak z (an)achitektem, ninja i CTO.

Jedni spytają o sam język, wskoczą z django, jeszcze inni pomieszają i będą chcieli jakąś szczegółową wiedzę o OSI. Po necie lata trochę przykładów gdzie ludzie mający 5 lat nie wiedzą czym się różnią drzewa od grafów, albo co to jest.

0

Ciekawe jest to, że często w takich tematach padają zagadnienia, których nie ogarniam bo po prostu jest to nie przydatne. A pracuję już komercyjnie kilka lat w Pythonie i zarabiam ponad 10k (kilka firm mi tyle proponowało więc jakieś tam wzięcie mam).

Z mojej perspektywy to jeśli potrafisz poruszać się w projektach to jest okej. Cała reszta idzie za tym. Bo skoro piszesz swój projekt i w pewnym momencie musisz coś zoptymalizować używając SQLa to się tego uczysz mimochodem. Pobierasz sobie jakiś projekt z internetu i jeśli widzisz, że niektóre rzeczy są słabo napisane itd. Potrafisz zmienić coś w kogoś projekcie. Napisz po prostu większy projekt a nie sam CRUD i niech będzie miał wysoką jakość. To będzie oznaczało, że podołasz zadaniom w pracy a więc zarobią na Tobie.

1

Pozostali już wspomnieli najważniejsze. Ale poza tym jak prowadziłem rozmowę z juniorem Pythona to pytałem o:

  • doświadczenie. Niektórzy już jakieś mieli (staże) albo mieli jakieś projekty w Pythonie. Jeżeli mieli gita to mogłem podyskutować nad kodem. Przy tym też oceniałem "techniczne umiejętności miękkie" czyli czy kandydat potrafił opisać swój projekt i podyskutować
  • odpytywanka z Pythona. Losowe pytania aby mieć ogólne pojęcie - na większość wystarczy kilka słów odpowiedzi po których jestem w stanie ocenić jak kto ogarnia Np:
    PEP8, PEP257 (czyli jakie mamy standardy kodowania, coś o dokumentacji), dict,set vs list,tuple vs list, mutowalność, list/dict/set comprehension, slicing (i może pytania typu jak wziąć drugi element od tyłu z listy itp), pytania podchwytliwe (MRO - problem diamentu, def f(a = []), a = [] b=a b.append(5), etc - wygooglaj top pytania), wielowątkowość (głównie by zdawać sobie sprawę z GIL), obiektowość w Pythonie, super(), dekoratory, magic/dunder methods (init, str), lambda, importy (np. różnica między from x import * a import x),
  • proste zadanie - tu np. wychodzę na 5-10minut żeby ktoś się nie stresował a później ewentualnie prowadzę dyskusję aby pomóc. Zadania typu wykryj anagram. Nawet takie szybko pokazują poziom Pythona w praktyce więc nie ma sensu wchodzić w skomplikowane zadania jak z leetcode

Oprócz tego pytania pod kandydata (jak ma w CV że zna technologie X to na pewno podpytam, a jak nie znam jej to poczytam o niej i zapytam i tak), znajomość GIT, wykorzystywane systemy, pytania pod daną ofertę.

0

Byłem na 1 spotkaniu własnie z Pythona na juniora -

  1. Etap rozmowa z HR po angielsku (10-15 minut), ogólnie banał + fajne pytanie "W jaki sposób bym motywował członków teamu do wydajniejszej pracy"
  2. Rozmowa z PM + jakims Dev Seniorem
    Na 2 etapie wpierw była rozmowa o doświadczeniu, projektach, pytania o rózne zagadnienia (Clousure, Hoisting w JS, kilka z baz danych, potem więcej z Pythona)

Następnie dostałem 2 zadania:

  1. Napisać funkcję "keszującą" ale nie używając dedykowanego dekoratora LRU (dostępny od wer 3.3 w Py) tylko "po swojemu" - dosyć proste takie na 10 min
    Niestety drugie zadanie dostałem takie, które mnie przerosło - nie pamiętam treści, ale trzeba było tam stosować zaawansowane i dosyć trudne algorytmy. Jestem przekonany, że gdyby nie stres to na spokojnie bym to w 30 min ogarnął, a tak niestety się wyłożyłem.

Także wszystko oprócz zadania drugiego oceniam pozytywnie, no ale niestety, jak ktoś wyżej napisał szukali seniora z kapitałem na juniora

0
  1. W sensie programowanie dynamiczne?
1

Większość programistów w FAANG nie ma pojęcia jak działa GC albo czym jest problem diamentu. Najwyraźniej są zbyt słabi, żeby z wami pracować. :D

Zadania typu wykryj anagram.

Znajdź wszystkie indeksy początkowe anagramów P w niepustym S.

def solve(S, P):
    ...

assert solve('cbaebabacd', 'abc') == [0, 6]
assert solve('abab', 'ab') == [0, 1, 2]
assert solve('foobar', 'baz') == []

1 użytkowników online, w tym zalogowanych: 0, gości: 1