Oblany test zdalny i brak konstrkywnego wytlumacznia porazki

0

zdawalem jakis czas temu zdalny tescik na zachod UE.

oblalem i nie zaprosili mnie nigdzie, ale poraza mnie brak odpowiedzi i zerwanie kontaktu.

takie oto pytanie dostalem (tlumacze z ang na pl, coby przypadkiem nie zdradzic sie w google):

-> napisz skrypt w Pythonie, ktory:
a promptuje uzytkownika o adres url jakiejs strony
b) nastepnie produkuje report i drukuje go np na konsole:
- str tytulowa i wszelkie metatagi jakie moga byc obecne w kodzie strony
- rozmiar strony url w rozmiarze np KB (czyli ma sie wyswietlic np size; 53K)
c) zanalizuj wczytana str i zwroc:
- policzone slowa
- liczbe unikalnych slow
- najczestszych 5 slow
d) wyswietl rowniez liste meta keywordow, ktore nie pojawiaja sie w zawartosci kodu strony
e) wyswietl liste linkow ktore sie pojawiaja na stronie, wlaczajac w to: link text i cel (target) href

nie jest to wymog, ale mozesz uzyc Beautiful Soup do powyzszych taskow.

czas na rozwiazanie zadania: ok 1.5h

ponizej kod.

a teraz prosze wszystkich ekspertow i architektow, co zrobilem zle ? czy moze musialem to pieknie napisac na klasach, dekoratorach i innych g..nach demonstrujac tym samym swoje ekspertyze pajtonowska ? ale przeciez nie bylo o tym wspomniane nic !!! kazdy chwyt dozwolony !!!

def programming_task(s):
    
    import requests
    from bs4 import BeautifulSoup
    from collections import Counter

    
    if 'http://' not in s[:8]:
        s = 'http://' + s
    
    try:
        resp = requests.get(s)
    except:
        print 'Unable to open the above URL.'
        return None
        
    soup = BeautifulSoup(resp.text, 'lxml')
    
    print 'Tytul strony:', soup.title.string
    
    all_tags = [str(tag.name) for tag in soup.find_all()]
    metatags = soup.find_all('meta')

    if not metatags:
        print '\nStrona nie zawiera zadnych meta tags.'
    else:
        all_meta_name_tags = []
        for i in metatags:
            if 'name' in i.attrs:
                all_meta_name_tags.append(i.attrs)            
    
        print '\nMeta tagnames found:'
        for tag in all_meta_name_tags:
            print tag['name']
    
    print '\nRozmiar strony: ', str(len(resp.text) / 1024) + 'KB'


    # Analiza zawartosci:
    # liczenie slow
    contents_found = []
    for attr in ('title', 'content'):
        for i in set(all_tags):
            for j in soup.find_all(i):
                try:
                    contents_found.append(j[attr])
                except:
                    continue
    
    contents1 = []
    for i in contents_found:
        contents1.extend(i.split())
        
    print 'Zliczone slowat:\n'
    print Counter(contents1)
    
    # Liczba unikalnych slow
    print 'Liczba unikalnych slow:', len(set(contents1))
    
    # 	Najczestsze 5 slow
    print 'Most common 5 words\n'
    for i in Counter(contents1).most_common(5):
        print i[0], ' - found', i[1], 'razy'


    # Lista meta keywordow, ktore nie wystepuja na stronie (tresci):
    tmp = [i.attrs.keys() for i in metatags]
    all_meta_keywords = []
    for i in tmp:
        for j in i:
            if j not in all_meta_keywords:
                all_meta_keywords.append(j)


    # Lista linkow ze strony, wlaczajac w to sam link oraz jego target href
    urls = []
    for h in soup.find_all('a'):
        if 'title' in h.attrs and 'href' in h.attrs:
            urls.append((h.attrs['title'], h.attrs['href']))
    print '\nLista linkow:'
    for h in urls:
        print h[0]
        print h[1]
        print '\n'

    
if __name__ == '__main__':
    # start of the main program
    print 'Prosze wpisac adres URL strony:'
    s = raw_input()
    
    programming_task(s)

Tylko blagam - nie piszcie takich tesktow, ze skoro aplikuje, to "powiniennem sam wiedziec" a jak nie to "niech zyje i aplikuje dalej w swojej nieswiadomosci".

4

Nie jestem ekspertem ale rzucajac okiem 1-2 minuty na mysl mi wpada

Umieszczenie całości w 1 funkcji eliminuje Cie od razu.
Nazwa funkcji "programming_task" ?
Zmiena s ?
Nie wiadomo o co chodzi w tym kodzie. Te komentarze nie sa tu potrzebne zamiast tego moglbys uzyc jako rzecze Uncle Bob
"descriptive function names".
Wymagania tego zadania mozna napisac polowe krocej.

W ogole 3 zagniezdzone fory ? omg

Sam czasem rekrutuje i też bym Cie odrzucił.

0
DolBo napisał(a):

Nie jestem ekspertem ale rzucajac okiem 1-2 minuty na mysl mi wpada

Umieszczenie całości w 1 funkcji eliminuje Cie od razu.
Nazwa funkcji "programming_task" ?
Zmiena s ?
Nie wiadomo o co chodzi w tym kodzie.

Sam czasem rekrutuje i też bym Cie odrzucił.

no to dzieki. nie wiedzialem, ze za umieszczanie kodu w funkcji sie oblewa.
a jakbym zrobil to na klasach, to tez bys mnie oblal ?
zmienne sa takie jak je sobie wymyslimy. moge zamiast s uzyc tez "web_url" ale sie spieszylem i uzylem np. s.
wiadomo o co chodzi, bo sa dodane komentarze co kawalek kodu. co mialem moze jeszcze napisac esej jak to dziala ?

0
DolBo napisał(a):

Nie jestem ekspertem ale rzucajac okiem 1-2 minuty na mysl mi wpada

Umieszczenie całości w 1 funkcji eliminuje Cie od razu.
Nazwa funkcji "programming_task" ?
Zmiena s ?
Nie wiadomo o co chodzi w tym kodzie. Te komentarze nie sa tu potrzebne zamiast tego moglbys uzyc jako rzecze Uncle Bob
"descriptive function names".
Wymagania tego zadania mozna napisac polowe krocej.

W ogole 3 zagniezdzone fory ? omg

Sam czasem rekrutuje i też bym Cie odrzucił.

No to czekam na Twoje rozwiazanie bez uzycia modulu BeautifulSoup. W koncu to nie byl wymog konieczny, wiec zakladamy, ze nie znasz tego modulu i jakbys napisal / rozrysowal te fory.

3

Uzywasz klas kiedy jest to potrzebne tutaj nie ma takiej koniecznosci.

Mozna ten kod podzielic np: na kilka metod.
Czas który poświecasz na pisanie komentarzy poświęc na dobre nazwy metod i zmiennych. Ogólnie ten skrypt sie kompletnie do niczego nie nadaje i nie przeszedlby zadnego review.

Przeczyta: "Mistrz Czystego Kodu" lub podobna pozycje tego samego autora to troche otworzy Ci oczy.
Bo jak Uncle Bob nie da rady to ja tym bardziej Ci nie przekonam ;)

3

Stworzyłeś coś, co jest mało czytelne, przy okazji spełnia wszelkie wymogi pomieszania kartoflanki ze spaghetti.

I teraz tak:

  • kod jest umieszczony w jednej funkcji, powinien być rozdzielony na logiczne porcje i mniej istotne jest tu czy zamkniesz go w samodzielnych funkcjach czy metodach klas.
  • znaczące nazwy funkcji/metod/zmiennych MAJĄ znaczenie. I twierdzenie, że wszystko jest jasne, bo są komentarze, więc w kodzie może być burdel jest deczko śmieszne. Wytłumaczenie "bo się spieszyłem" także, bo napisanie sensownej nazwy zamiast "s" czy "d", to całe 3 sekundy więcej. A w językach dynamicznych nazewnictwo jest tym ważniejsze, bo nawet typu na pierwszy rzut oka często nie zgadniesz, więc fajnie jest wiedzieć co dana zmienna przechowuje.

Ergo: Pokazałeś kod, którego forma odpowiada mniej więcej studentowi drugiego semestru, który nie ma pojęcia o konwencjach nazewnictwa czy dobrych praktykach, które w branży są znane od lat, a teraz się złościsz, że ktoś, kto to zobaczył stwierdził, że nie warto kontynuować procesu rekrutacji.
Jak komuś dajesz wizytówkę umazaną gównem, to się nie dziw, że pluje Ci w twarz chłopie :P

0

no to dzieki. nie wiedzialem, ze za umieszczanie kodu w funkcji sie oblewa.
a jakbym zrobil to na klasach, to tez bys mnie oblal ?
zmienne sa takie jak je sobie wymyslimy. moge zamiast s uzyc tez "web_url" ale sie spieszylem i uzylem np. s.
wiadomo o co chodzi, bo sa dodane komentarze co kawalek kodu. co mialem moze jeszcze napisac esej jak to dziala ?

koles dal Ci feedback a ty jeszcze opryskliwie odpowiadasz. Na regulara to nawet nie startuj z takim kodem. CleanCode do nauki i wroc za 2 lata

1

tescic na zachod UE i Polskie komentarze... piszesz ze zadnych zasad wiec i nikt nie wspominal o klasach...
nikt Cie za roczke nie bedzie prowadzic o ile nie idziesz na praktyki

od tego sa testy, zeby zobaczyc jak kodzisz, jak myslisz, jak nazywasz funkcje, zmienne etc... oblales i pretensje mozesz miec tylko do siebie

0
NazwaUser napisał(a):

tescic na zachod UE i Polskie komentarze... piszesz ze zadnych zasad wiec i nikt nie wspominal o klasach...
nikt Cie za roczke nie bedzie prowadzic o ile nie idziesz na praktyki

od tego sa testy, zeby zobaczyc jak kodzisz, jak myslisz, jak nazywasz funkcje, zmienne etc... oblales i pretensje mozesz miec tylko do siebie

absurd. nie moge miec pretensji do siebie, jesli w ogole nie wiem, dlaczego oblalem. zaprzeczenie w logice.
jesli zaaplikuje tak 10 razy i za 10tym mnie przyjma bez podania feedbacku, to dalej bede twierdzil, ze nic zle nie napisalem.
gdybys przeczytal uwazniej, to bys zrozumial, ze komentarze w kodzie tez zostaly przetlumaczone na jezyk polski.

dziwi mnie jedynie podejscie, ze szuka sie perfekcjonistow od 1 linijkii kodu.
ja wole miec napisane cos co dziala, niz nie miec nic, lub miec perfekcyjnie czysta kartke z 1 linijka perfekcyjnego kodu.

to bylo przeciez 1.5h... to co ja bede robil przez pozostale 6.5h skoro wg pracodawcy w 1.5h mam sie strescic z dzialajacym i pieknym standardowym kodem ?

0

Ta branza chyba nie dla mnie jednak :D
to tak jakbyscie mieli za zadanie przejechac z punktu A do punktu B, np 100 km.

Macie do wyboru: czyste i pachnace Audii z pustym bakiem, albo Syrenke brudna, smierdzaca, zatankowana "na full".
Wiem, co Wy wybierzecie, ale ja wybiore jednak ta Syrenke, bo chce tam dojechac. I nie obchodzi mnie, ze bede w smrodzie i brudzie jechal. To tylko 100km.
Wiec sie nie dogadamy.

1

Inne zadania?
Bo chyba nie zakładasz, że dostaniesz w pracy pierdółę powyższego typu i dostaniesz tydzień żeby się z tym zabawiać?

Wybacz, ale jeśli spodziewałeś się, że jedynym wymaganiem było "oby było cokolwiek, co działa", że ktoś Cię będzie prowadził za rękę, albo wręcz pokaże jaki kod powinieneś napisać, by było idealnie... No błagam.
Jeśli to nie było stanowisko entry-level, to naprawdę nie możesz się dziwić, że druga strona podarowała sobie dalszą dyskusję. Tym bardziej, że właśnie formą, którą przyjęła Twoja twórczość pokazałeś im, że masz ich tak głęboko w tyłku, że mogą Ci pomiziać migdałki.

Co więcej - jeżeli potrzebowałeś więcej czasu na porządne rozwiązanie zadania, to należało o tym poinformować rekrutera. To także jest element testu.

Natomiast Ty preferujesz plucie tak na pracodawcę, jak i ludzi, którzy uczciwie wyjaśniają Ci powody takiego, a nie innego wyniku.
Uważasz się za świętego, tylko dlatego, że to Tobie brak kompetencji i zrozumienia problemu, który w tej chwili napotkałeś, co się kończy brakiem refleksji i twierdzeniem, że nie masz sobie nic do zarzucenia.

Więc rób dalej największe dziadostwo jakie umiesz w ramach swojej wizytówki i miej nadal wielkie oczka.

0
zażenowany brakiem odp. napisał(a):

Ta branza chyba nie dla mnie jednak :D
to tak jakbyscie mieli za zadanie przejechac z punktu A do punktu B, np 100 km.

Macie do wyboru: czyste i pachnace Audii z pustym bakiem, albo Syrenke brudna, smierdzaca, zatankowana "na full".
Wiem, co Wy wybierzecie, ale ja wybiore jednak ta Syrenke, bo chce tam dojechac. I nie obchodzi mnie, ze bede w smrodzie i brudzie jechal. To tylko 100km.
Wiec sie nie dogadamy.

Ja wybieram pachnące Audi z pełnym bakiem.

0

brak feedbacku to jest plaga w rekrytacji, masz racje. jezeli firma taki wysyla to swieto. a opowiastka o audi bez znaczenia dla tego tematu.

poczytaj o clean code i wyjdzie Ci na dobre. jak nie tak firma to inna

1
zażenowany brakiem odp. napisał(a):

Ta branza chyba nie dla mnie jednak :D
to tak jakbyscie mieli za zadanie przejechac z punktu A do punktu B, np 100 km.

Macie do wyboru: czyste i pachnace Audii z pustym bakiem, albo Syrenke brudna, smierdzaca, zatankowana "na full".
Wiem, co Wy wybierzecie, ale ja wybiore jednak ta Syrenke, bo chce tam dojechac. I nie obchodzi mnie, ze bede w smrodzie i brudzie jechal. To tylko 100km.
Wiec sie nie dogadamy.

ja wole miec napisane cos co dziala, niz nie miec nic, lub miec perfekcyjnie czysta kartke z 1 linijka perfekcyjnego kodu.

ale o co chodzi? co to jest za popadanie w ekstrema?

według ciebie nie można napisać ładnego kodu, który zarazem działa?

Niech ktoś Ci da 1000 linijkowa funkcje z nazwami typu

a b c d e f g h aa bb cc dd ee ff aa true1 false2

do przemielenia, zobaczymy jak szybko zmienisz zdanie :D

4
  1. Brak feedbacku źle świadczy o tej firmie, więc nie masz co po nich płakać.
  2. Jak już wspomniano, twój kod jest bardzo słaby. Serio. Co więcej, generalnie ten kod pokazuje że albo nie znasz standardów czytelnego pisania kodu, albo nie umiesz refaktorować kodu, albo jesteś leniwy i miałeś to w dupie. Bo refaktor tego kodu do stanu używalności da się przeprowadzić w 5-10 min max. To jest na prawdę niewiele wysiłku żeby kliknąć na zmienną x i dać rename na sensowniejszą nazwę. Analogicznie to serio nie kłopot zaznaczyć fragment kodu i dać extract function a następnie dać sensowną nazwę funkcji, zamiast komentarza w kodzie. Więc nawet jeśli nie umiesz "w trakcie pisania" robić tego porządnie, to mimo wszystko mogłeś na koniec poprawić.
  3. Dodatkowo łapanie wszystkich wyjątków przez gołe except, a jeszcze lepiej takie z continue to jest trochę horror i za samą taką akcje byłbym skłonny odrzucić czyjeś CV.
2

Jak nie odpowiedzieli, to nie szanują ludzi i nie masz czego żałować, ale mimo wszystko do twojego kodu jest kilka ale.

Cóż, przedstawmy to na przykładzie, spróbuj zrozumieć taki kod:

def remove_all(n, u):
	if u not in n:
		return n
	else:
		g=""

		k=0
		f=0
		while k < len(n):		
			j=0
			
			while j < len(u) and u[j]==n[k]:
				j=j+1	
				k=k+1
				f=f+1
			if j==len(u):	
				g=g+n[k:]
				j=0
				break
			else:	
				if j==1:				
					j=0
					k=k-1
					f=f-1
					g=g+u[0]					
				else:					
					g=g+n[k]
			k=k+1
	if u not in g:
		return g	
	else:
		k=0
		j=0
		b=""
		while u in g:
			while j < len(u) and u[j] == g[k]:
				j+=1
				k+=1
				
			if j==len(u):
				b=b+g[k:]
				if u not in b:			
					return b
				else:	
					g=""
					g+=b
					b=""
					j=0
					k=0
					continue
			else:
				if j==1:				
					j=0
					k=k-1
					b=b+u[0]					
				else:					
					b=b+g[k]
			k=k+1	

Działa, napisany w odpowiednim czasie, ale jak go czytasz, próbujesz sobie wydrapać oczy. Co odróżnia laika, od osoby która faktycznie koduje.
A spróbuj zrozumieć coś takiego:

def remove_all_chars(string, chars=""):
    return string.replace(chars, "")

Ja tu widzę dość znaczącą różnicę w czytelności, co więcej od razu wiem co robi ta funkcja.
Ale zakładając że nigdy do niej nie wejdę ponownie, "mogłaby zostać" w pierwszej formie.
Co jednak w przypadku gdy chcę te funkcję (jedną wybraną z zagadnień które dostałeś) zaimportować do innego programu, bądź przeprowadzić jakieś unitesty, sprawdzić jak szybko działa czy cokolwiek tego typu? Jestem w D... ponieważ stracę czas na próbę zrozumienia kodu i wyizolowanie konkretnej funkcji, zamiast ją po prostu zimportować. W twoim rozwiązaniu mogę jedynie zimportować cały main co jest anty-funkcjonalne.
Ah i dygresja, patrząc na taki kod, wolałbym to samemu napisać niżeli próbować to zrozumieć i izolować.
Co czyniłoby cię pracownikiem bezużytecznym. Na "zadaniu o pracę" spróbuj pokazać najlepszą stronę swojego kodu, zamiast najgorszego. Nawet jak niektóre rzeczy ci nie odpowiadają, nawet jak jesteś świetny, bez poszanowania pracy zespołowej gdzie inne osoby niż ty będą na kod patrzeć oraz go implementować, to z takim podejściem nie dostaniesz pracy lub szybko cię z niej wydalą.

Przykład dobrego kodu:

#>>Wszelkie treści predefiniowane typu kodowanie znaków (jakby w przyszłości był inny standard i trzeba by było to zmieniać, edytorem strumieniowym jest prościej niż ręcznie)
#>>Wszelkie importy

def main():
   #>>Wywołania funkcji do prezentacji/wyniki:
   #Declare variables to presentation
   string = "something"
   data = ("some", "some", "some")
   #Some description of function
   result_something_with_string = do_something(string, arg=data)
   print(result_something_with_string)
   #etc.

def do_something(string, arg):
    #>>Wykonanie operacji funkcji i zwrot wyniku

#>> Zabezpieczenie by nie wykonać kodu przy importowaniu.
if __name__ == "__main__":
    main()    

Weź sobie to do serca, albo olej. Ale ja tak radzę, bo samemu jak wracasz do problemu/programu po pół roku, roku, dwóch latach czy więcej jeśli mało kodzisz, pogubisz się w tym co one robią, niestety :).
@Edit:
W przykładzie są troszkę przesadzone długości powyższych nazw, ale chodziło mi tu o przekazanie opisu "funkcja robi to"
@EDIT2:
Przy okazji, tutaj nie ma błędu?

    # Analiza zawartosci:
    # liczenie slow
    contents_found = []
    for attr in ('title', 'content'):
        for i in set(all_tags):
            for j in soup.find_all(i):
                try:
                    contents_found.append(j[attr])
                except:
                    continue

    contents1 = []
    for i in contents_found:
        contents1.extend(i.split())

Nie znam biblioteki BeautifulSoup, więc zastanawiam się czy słowo "slowo" oraz "slowo." nie będą czasem różnymi elementami :).

0

czy moze musialem to pieknie napisac na klasach,

Robienie czegoś "na klasach" nie jest żadnym wyznacznikiem profesjonalizmu i nie słuchaj nikogo, kto twierdzi, że jest.

Tutaj wystarczyłoby parę funkcji, jeśli chodzi o ogólną strukturę.

Ogólna zasada to: w miejscu gdzie masz komentarz, wywal go, i napisz funkcję o podobnej nazwie, jaki miałeś komentarz (nazwa po angielsku oczywiście). Komentarze w kodzie (jeśli są potrzebne) też się pisze profesjonalnie po angielsku.

Wchodząc w szczegóły:

    for i in tmp:
        for j in i:
            if j not in all_meta_keywords:
                all_meta_keywords.append(j)

to by pewnie się zadało załatwić za pomocą jakiegoś list comprehension (tam więc tu mogli cię oblać za nieznajomość podstaw Pythona (co prawda list comprehension jak dla mnie są często mniej czytelne od zwykłych forów - ale w sumie te twoje fory też nie są zbyt czytelne). No i w kodzie masz parę takich miejsc, gdzie mógłbyś użyć list comprehension, a nie używasz (co może sugerować, że nie znasz takiego konstruktu).

(EDIT: w zasadzie częściowo używasz, ale i tak mam wrażenie, że nie czujesz tego myślenia)

Chociaż nie wiem czy faktycznie list comprehension opłacałoby się tu dawać. Największy problem chyba jest taki, że masz zmienne i, j, oraz tmp.

  • Dlaczego nie nazwałeś zmiennej tmp jakoś ładniej?
tmp = [i.attrs.keys() for i in metatags]

może keys, skoro znajdują się w niej klucze(czy raczej lista list kluczy). BTW Python ma coś takiego jak moduł itertools i różne zabawki do iterowania, nie chcę wnikać co tam robisz dokładnie, ale może mógłbyś zobaczyć, czy jest tam coś ciekawego, co by ci uprościło te kombinacje.

dlaczego i nie jest liczbą? (i nazywa się zwyczajowo raczej liczbę, a nie każdy iterator. Chyba, że nie znam zwyczajów Pythonowców, co też jest możliwe).

Tak samo j.

Albo tam iterujesz po h. Od czego to skrót h? Lepiej byłoby np. element (ewentulanie el), node, albo zależnie od pętli np.

for url in urls:
    for i in contents_found:
        contents1.extend(i.split())

to już w ogóle nie wiem do czego służy. Rzadko programuję w Pythonie (musiałem sobie aż przypomnieć jak działa extend), ale jeśli dobrze myślę, to jedyne, co robisz, to kopiujesz listę, co mogłeś zrobić tak: contents_found[:], o ile w ogóle potrzebujesz ją kopiować (contents1? co to znaczy?).

3

No niestety kolego ale wyłożyłeś się po całości. Przykro mi to mówić ale w tym kodzie wszystko jest źle. Zacznijmy od tego, że brak 'feedbacku' podejrzewam ma związek z tym że wstawiłeś importy do funkcji. Zapewne na tym zakończyło się czytanie twojego kodu... Więc co tu dalej komentować? Jeśli czujesz się zażenowany brakiem odpowiedzi to wyobraź sobie co czuł programista która patrzył na ten kod. Dwie osoby gdzieś na świecie się zażenowały, a wszystko dlatego że ktoś nie przeczytał dokumentacji odnośnie przyjętych standardów pisania w pytongu. Tu niektórzy sugerują sięgnięcie po"Czysty cod" itp. szanowane pozycje, ale w twoim przypadku wystarczyło jedynie przeczytać wytyczne z dokumentacji. Widać że nigdy tam nie zajrzałeś.

No to lecimy
0. "def programming_task(s):" - zła nazwa funkcji

  1. importy wewnątrz funkcji

  2. 's' wywalone do name? Nazwa tej zmiennej też super intuicyjna.


try:
        resp = requests.get(s)
    except:
        print 'Unable to open the above URL.'
        return None

Po tym co wyświetlasz w konsoli wynika że spodziewasz się konkretnego rodzaju błędu, więc dlaczego używasz 'gołego' except? Widać, że nie do końca to rozumiesz, już lepiej jakbyś tego w ogóle nie użył.


    # Liczba unikalnych slow
    print 'Liczba unikalnych slow:', len(set(contents1))

Jeśli widzisz w swoim kodzie takie coś, to wiedz że gdzieś popełniłeś ogromny błąd. Nie wiesz co powinno się komentować i jak powinno się używać komentarzy. Wynika to z tego że Twój kod jest źle zorganizowany, nie znasz zasad które pozwalają pisać samo-dokumentujący się kod, nie szanujesz innych ludzi.

  1. Praktycznie wszystko co u Ciebie zaczyna się od 'if' lub 'for' a kończy na 'print' to powinno być oddzielną funkcją bądź metodą. Już nikt tu nie narzuca używania klas bo nie są one jakoś obowiązkowe w większości wypadków ale podzielić ten program na małe modularne funkcję to jest oczywista oczywistość. Zawsze powinieneś uwzględniać że twój kod może zostać wykorzystany przez inną osobę. Przy zadaniach rekrutacyjnych zawsze to musisz uwzględniać nawet jakby to zadanie było z tych najbardziej trywialnych. Tutaj poniosłeś porażkę po całości, wyobraź sobie trzy sytuacje:
    a) po napisaniu tego kodu, dostajesz zadanie numer 2: masz wyświetlić w konsoli to samo co wcześniej ale bez liczby unikalnych słów. Co zrobisz? Napiszesz od nowa, zakomentujesz fragment kodu, usuniesz dany fragment?
    b) po zrobieniu zadania numer 2, dostajesz zadanie numer 3, tym razem masz wyświetlić wszystko łącznie z unikalnymi słowami ale bez listy linków.
    c) twój kod jest tak zarąbisty że od razu chcą go wykorzystać w gotowym projekcie, ale inny pracownik potrzebuje tylko użyć z niego pobieranie strony tytułowej i metatagów. Jak to ma niby zrobić?

Zaczynasz dostrzegać ile nagle robi się dodatkowej pracy z twoim kodem? I tu mówimy o takim małym trywialnym programiku. Gdybyś na początku podzielił ten kod na małe funkcje z której każda robi tylko jedną rzecz to byś nie musiał zaglądać do niego już nigdy więcej. Ty jednak postanowiłeś sobie i innym wygenerować dodatkową pracę i koszty.

  1. Dalsza praca z tym kodem to będzie udręka. Przypuśćmy że ktoś będzie musiał rozwinąć funkcjonalność słów kluczowych. Po pierwsze minie trochę czasu zanim odszuka gdzie jest fragment który za to odpowiada. Dwa nie będzie miał pewności że po zmianie się całość nie wykrzaczy. Praktycznie zmiana w tylko tym jednym małym fragmencie całego kodu będzie wymagała od niego pracy z całością == kolejna dodatkowa praca. Zapewne się ucieszy.

Szczerze na brak feedbacku można narzekać, ale jak napisałem wyżej podejrzewam że tego kodu nikt nie sprawdzał do końca. Mówię to bez złośliwości, ale po 5 sekundach patrzenia na niego można powiedzieć że umiesz bardzo mało, a przynajmniej tak się zaprezentowałeś. I to zapewne zauważył rekrutujący.

2

wbrew pozorom rozmowa kwalifikacyjna to nie sa korepetycje

0

Moim zdaniem 1.5h to nie jest konkurs pieknosci i ja wybralbym kandydata z brzydkimi nazwami zmiennych i dzialajacym kodem, od kandydata z ladnymi nazwami zmiennych. No ale oczywiscie najlepiej by bylo to i to, ale tu zakladamy 2 oddzielne skrajnosci.

Druga kwestia odnosnie wstawiania importu wew funkcji.
A co, jesli ten skrypt mialbym wykorzystsc w innym, ktory z kolei uzywa multiprocessingu i klasy Process ?
Wywoluje ta klasa konkretna funkcje z pierwszego skrypt u i nie martwi sie o jakies specyficzne importy, ktorymiby zasmiecal glowny skrypt (multiprocessing)

1

Jakbyś odpowiadał za projekt, który ma być pisany przez 50 osób przez 5 lat to uwierz, że nie wziąłbyś żadnego z nich, bo taniej będzie poczekać na kogoś, kto umie napisać ładny i działający kod. Nie każda firma to software house z nowym projektem co miesiąc, gdzie jak coś się raz napisze, żeby działało, to się o tym zapomina.

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