Pytanie o predyspozycje


#1

Cześć,

Zwracam się do was z problemem, licząc na szczere odpowiedzi.
Piszę w Rubym od połowy grudnia 2017. Dodatkowo mam doświadczenie w języku PHP. Podsumowując, z programowaniem mam do czynienia około rok.
Od jakiegoś miesiąca zacząłem szukać stażu lub pracy w Krakowie, jako RoR developer.
Tutaj właśnie pojawia się problem przejścia rekrutacji. Przeważnie nie daję rady rozwiązać prostych(?) zadań rekrutacyjnych. Zadania te przeważnie są na czas i o ile jestem w stanie je wykonać o tyle czas, który potrzebuję na rozwiązanie jednego wynosi, czasem, nawet tyle, ile jest przewidziane na wykonanie wszystkich.
Dla przykładu jest tablica ze stringami:
arr = [
‘ab’,
‘aab’,
‘abba’,
‘abaaaba’
]
Miałem napisać funkcję, która wyznaczy najmniejszą ilość zamian znaków w taki sposób, aby znaki sąsiednie nie były takie same. Jako zamienniki miałem używać znaki, w przedziale [a-z]. Oczywiście wiadomym jest, że dana tablica jest tylko przykładowa i kolejne stringi były coraz to dłuższe z coraz to większą ilością rodzajów znaków.
Być może nie jest to zadanie czysto komercyjne, ale ma ono coś sprawdzić. Być może znajomość technologii? Inteligencję? Sposób myślenia? Proszę też o odpowiedź na to pytanie.
Natomiast moim głównym dylematem są predyspozycje do zostania programistą.
Po pierwsze:
Czy można sobie takie predyspozycje wyrobić? Jeżeli można, to od czego zacząć. Algorytmy?
Jeżeli nie, również proszę o odpowiedź.
Po drugie:
Czy można w jakiś sposób nabrać wprawy w rozwiązywaniu takich zadań jak powyżej? Jeżeli tak, to czy poprzez rozwiązywanie takich zadań, czy jest inny sposób.
Po trzecie:
Czy jest sens rozwiązywania takich zadań, czy może raczej skupić się na stworzeniu jakiejś aplikacji? Dodam, że kilka prostych aplikacji mam zrobionych w RoR. Jedną szczególnie cały czas rozwijam.
Wybaczcie, że aż tyle napisałem, ale już któryś raz z kolei nie przeszedłem procesu rekrutacyjnego i zacząłem zastanawiać się nad sensem tego wszystkiego.

Liczę na szczere odpowiedzi i życzę wszystkim forumowiczom najlepszego.
Pozdrawiam.


#2
  1. Nie przesadzałbym z predyspozycjami - do wysokiego poziomu w niemal czymkolwiek dojdziesz pracą. Czyli np. nauka algorytmów (choćby podstawowych). Ja może nie wyglądam, ale kiedyś się zaparłem i przebiegłem półmaraton, a zapewniam cię, predyspozycji nie mam żadnych.

  2. Po prostu je rozwiązując. Jak przygotowanie do matury.

  3. Warto znać podstawy. Małe szanse, że ci się później przydadzą, ale na pewno pozwala to inaczej spojrzeć na dziedzinę.


#3

Od siebie polecam codewars.com, jeśli chcesz poćwiczyć. Można tam się dużo nauczyć, przede wszystkim ze względu na to, że po rozwiązaniu zadania, masz dostęp do rozwiązań innych użytkowników i możesz zobaczyć, co mogłeś zrobić lepiej/inaczej.

Tak z ciekawości - ile miałeś czasu na rozwiązanie tego zadania?


#4

@mdotz Było pięć pytań testowych i trzy zadania. Na wszystko była godzina.


#5

Po pierwsze nie masz powodów do obaw, te zadania są oderwane od rzeczywistości, nie mówię że są bez sensu, ale wymagają pewnej sprawności w robieniu rzeczy, których się potem nie robi w pracy… Bardzo mi się podobała wypowiedź DHH na temat procesów rekrutacyjnych youtube

Po drugie, ćwicz tego typu zadania na codewars to jest fajna programistyczna gimnastyka…

A już najgorsze jest, jak przemaglują cię z SOLIDów, DRYów i KISSów a potem się okazuje że w kodzie aplikacji złamano każdą jedną z tych zasad…

Procesy rekrutacyjne są trudne do przeprowadzenia, często robione przez osoby, które nie mają na to ochoty, albo przygotowania… Dlatego nie należy wyrabiać sobie na ich podstawie samooceny.

Oczywiście są wyjątki, sam miałem okazję uczestniczyć w takim procesie po którym dowiedziałem się dużo o sobie, o swoich słabych punktach, dzięki czemu wiedziałem dokładnie co muszę poprawić :slight_smile: - bardzo cenne doświadczenie.


#6

Codewars znam. Mam 6kyu i bardzo sobie cenie. Brakuje mi tylko na to czasu ponieważ chodzę do pracy nie związanej z programowaniem, a w domu piszę aplikację w Railsach. Chyba że proponujecie Railsy odpuścić jeszcze i porobić codewars.
Ogólnie dziękuję za odpowiedzi


#7

Pytania przypominają te ze stron typu SPOJ i podobnych. Nic tylko ćwiczyć.


#8

Cześć @michalstroz!

Pisząc, że programujesz około roku zbyt wiele to nie mówi. Intensywnie ucząc się można w ciągu takiego czasu dużo się nauczyć, ale równie można nie mieć pomysłu jak uczyć się dobrze i tkwić niejako w miejscu.

Jeśli szukasz stażu to bardzo dobrze! Ogólnie nauka na realnym kodzie, w środowisku z bardziej doświadczonymi programistami daje ogromnego kopa (zakładam oczywiście, że na takim stażu robiony jest code review kodu stażysty i nie jest on rzucany w przysłowiowy kąt).

Z rekrutacją jest różnie. Są firmy, które trzepią ostro z algorytmów, inne z kolei przepytują wręcz z teorii, a inne będą chciały Cię sprawdzić od razu w praktyce. Rekrutacja programistów jest trudna i tak naprawdę nie ma idealnego sposobu (choć oczywiście są lepsze i gorsze sposoby). Nie ma się co zrażać do tego czy przejmować. Idąc na rozmowę musisz postawić sobie realny cel, nie wymagać od siebie cudów. Tym realnym celem póki co jest dowiedzieć się czego firmy wymagają od kandydatów i za każdym razem próbować się pod tym kątem przygotować jeszcze lepiej. Jeśli rzeczywistość pokaże, że firmy trzepią z algorytmów nie pozostanie nic innego jak podszkolenie się w tej dziedzinie.

Podajesz przykład zadania z jakim miałeś do czynienia. Czy udało Ci się wymyślić algorytm? To zadanie być może z początku wydawać się trudne, ale już po chwili zastanowienia rozwiązanie powinno przyjść do głowy. Pozwolę sobie zaprezentować tutaj rozwiązanie, po to żebyś zobaczył że rozwiązanie nie jest trudne.

Nie przytaczasz pełnej treści tego zadania (co w zadaniach algorytmicznych ma ogromne znaczenie, czasem jedno słowo może zmieniać sens), ale zakładam że mając ciąg aabbbcccca wystarczy, że dokonam 4 podmian (aabbbcccca -> axbxbcxcxa) i dostaję łańcuch, w którym nie powtarzają się znaki obok siebie. Analizując dochodzę do wniosku, że interesują mnie podciągi spójne (czyli następujące po sobie znaki) z powtarzającymi się znakami. Jeśli powtarzających się znaków w takim ciągu jest 2 to wystarczy, że zamienię 1 z nich (aa -> ax), jeśli jest ich 3 to wystarczy, że zamienię także 1 (aaa -> axa). Idąc dalej dla 4 i 5 zmian muszę zrobić 2 (aaaa -> axax, aaaaa -> axaxa). Widzę zatem że jest to całkowite (bez reszty) dzielenie N/2, gdzie N to długość takiego podciągu.

Wystarczy znaleźć długości kolejnych podciągów składających się z tych samych znaków i zsumować ich długości podzielone przez 2 (co ciekawe nie trzeba robić specjalnego przypadku dla podciągu o długości 1 bo 1/2 da nam 0).

Kod:

def count_changes(arr)
  arr.map { |str| count_changes_in_string(str) }.sum
end

def count_changes_in_string(str)
  total = 0
  i = 0

  while i < str.size
    j = i + 1
    while str[i] == str[j]
      j += 1
    end
    total += (j - i) / 2
    i = j
  end

  total
end

puts count_changes([
  'ab',
  'aab',
  'abba',
  'abaaaba'
]);

Do zadanie to typowa łamigłówka gdyż nie trzeba znać żadnego konkretnego algorytmu. Kwestia pogłówkowania i pobawienia się danymi. Ilość czasu potrzebna na rozwiązanie to kwestia względna. Też nie przepadam za dawaniem jakiś wyśrubowanych limitów.

Sposób myślenia, umiejętność główkowania. Wiem, że różnie są odbieranie tego typu zadania, ale mimo wszystko umiejętność rozwiązywania tego typu zadań trochę mówi o potencjale programistycznym kandydata. Natomiast nie oznacza to, że każdy kto programuje musi się w tym specjalizować. Programowanie jest ogromną dziedziną i nie da się od wszystkich wymagać tych samych umiejętności.

Predyspozycje to raczej coś co sprawia, że uczysz się szybciej lub wolniej. To co budujesz to umiejętności. Jak? Pracując, ucząc się, pisząc kod, czytając. I nie możesz tego robić z doskoku. Potrzebna jest praca regularna, najlepiej codzienna. Większość programistów miała taki etap w życiu, że programowana codziennie.

Ależ oczywiście, że tak! I recepta jest prosta. Próbujesz rozwiązywać tego typu zadania, aż zaczną wchodzić w krew. One naprawdę uczą myślenia logicznego i kombinowania. To się z czasem przełoży na ogólne programistyczne myślenie. Ze swojej strony polecam Ci polski serwis SPOJ http://pl.spoj.com/ (mają skopaną trochę rejestrację, robisz to na wersji anglojęzycznej a potem wchodzisz ręcznie na adres który Ci podałem).
Zacznij sobie od kategorii łatwe. Nie wszystkie zadania da się rozwiązać w Ruby (limity czasowe często są ustawione pod szybsze języki). Polecam przed rozwiązywaniem sprawdzić czy ktoś rozwiązał zadanie w Ruby (wchodzisz na konkretne zadanie, potem w zakładkę ‘Najlepsze’ i filtrujesz po Ruby). Spróbuj codziennie rozwiązywać po 3-5 zadań. Po miesiącu będziesz mieć setkę zadań.

Nauka RoR oczywiście też jest ważna. Ostatecznie chodzi przecież o umiejętności tworzenia aplikacji (tak, w pracy nie rozwiązuje się zadań tego typu jak przytoczyłeś ;-)).
Co do nauki algorytmów to zależy od Ciebie. Są firmy, które nie trzepią z algorytmicznych zadań, bardziej skupiając się np. na praktyce w RoR. Ale moim zdaniem dużo zyskasz jednak robiąc i takie zadania. One uczą logicznego myślenia, umiejętności przelewania wymyślonego algorytmu w kod, szukania przypadków brzegowych i wiele innych.

Ogólnie nie masz się co załamywać. Kwestia czasu i samozaparcia. W końcu osiągniesz swój cel :). Jakbyś miał jeszcze jakieś konkretne pytania to pisz śmiało (nawet PW). Chętnie podpowiem.


#9

Z ciekawości. Gdzie rekrutowałeś?


#10

Dzieki za odpowiedź o za rady. Jak ogarnę się z przeprowadzka to spróbuję w systemie 3-5 zadań dziennie rozwiazywac.
Radarek jak popatrzyłem na twoje rozwiązanie to od razu się mi pojawiła w głowie myślą jak mogłem na coś takiego nie wpaść. Problem jak zawsze w tym, że o ile wpadł bym (może) na takie rozwiązanie to zrobiłbym to po sporym odcinku czasu. Dlatego ogarniam przeprowadzkę i siadam do główkowania :slight_smile: . Szkoda mi tylko przerwy z projektem, bo obawiam się że przy mojej obecnej pracy może nie wystarczyć czasu na niego.