Codility.com - czyli ile teoretycznie jest wart kandydat na programistę?

Data dodania wpisu: 28-08-2010

Andrzej utworzył nowy wpis, po czym rzekł:
"Nie oceniaj programisty każdego, po pierwszym kawałku kodu jego".

Ostatnio natknąłem się w sieci na stronę projektu Codility - jest to strona autorstwa kilku Polaków. Projekt narodził się w głowie jednego z jego twórców podczas pracy w firmie rekrutacyjnej w Chinach. Dodatkowo, pomysł został wyróżniony na konferencji startupów Seedcamp 2009.

Ale o co chodzi?

Codility to projekt mający na celu wspomagać firmy poszukujące programistów - oszczędza sporo czasu, ponieważ nawet testowe zadanie potrafi sprawić mały dylemat w stylu "I ja jestem programistą?" (tak było w moim przypadku, gdy zbyt nonszalancko podszedłem do zadania:D).

Docelowo - kandydatowi zostaje przedstawiony problem, do którego trzeba napisać algorytm w wybranym przez siebie języku programowania. Napisany skrypt po zatwierdzeniu zadania jest testowany na różne możliwości, w wyniku czego każdy element (test składowy) który się powiedzie, dodaje do naszego licznika punktów małe punkciki.

Demo Test

Link, który można tutaj wykorzystać, to test demo. Treść zadania prosta. Pozornie;) http://codility.com/demo/run/

O tym, jak Andrzej zaliczył zonka:)

W moim przypadku było mniej więcej tak: wybrałem PHP, napisałem kawałek kodu, myśląc "No kurde, co w tym trudnego". Wysyłam test. I zonk: 56/100 - dla testu extreme_first, extreme_zero i czegoś jeszcze zwrócony wynik -1 zamiast indeksu. O wywalonych na timeoucie ostatnich czterech testach nie wspominam. Zrobiłem wielkie oczy i poprawiam:) Ok, tym razem 75/100. Ostatnie 4 pkt. dalej sie wykładają. No tak, zagnieździłem pętle w pętli, a przecież zadanie wyraźnie mówiło o operacjach na dużych liczbach. Normalne, pewnie udawałem, że tego nie widze:P Ostatnie poprawki, czyli przepisanie całego schametu obliczeń i v'oilla - 100/100.

Kawałek kodu po poprawkach;)

function equi ( $A ) {
    $sum = 0;
    $left = 0;
    $right = 0;
    $count = count($A);
    
    for($i = 0; $i < $count; $i++) {
        $sum += $A[$i];
    }
    for($i = 0; $i < $count; $i++) {
        if($i > 0) {
            $left += $A[$i-1];        
        }
        $right = $sum - $A[$i] - $left;
        if($left == $right) {
            return $i;
        }
    }
    return -1;
}

Polecam stosować ten test rekruterom na programistę - nawet demo potrafi skutecznie pokazać usterki wszystko-wiedzących "programistów" i "developerów". Niemniej jednak, nie należy tego traktować jako wyznacznik - wszak po jednym upierdliwym teście nie stwierdzi się ile użytecznej wiedzy ma kandydat - co najwyżej można sprawdzić trochę jego umiejętności logicznego myślenia.

Komentarze

No nie taki pic na wodę. EQUI to jest bardzo prosta funkcja. Są inne bardziej złożone, które trzeba przecież poprawnie napisać w ograniczonym czasie. Ale weźmy taką EQUI. W przypadku wyboru php jak tutaj czy pythona nie ma większego problemu, ze względu na dynamiczne typowanie danych. Ale niech taki programista wybierze język np. c++, gdzie musi ustalić odpowiedni typ danych dla sum (lewej, prawej i łącznej). Test sprawdza również wartości ekstremalne a tablica jest longint. I tutaj właśnie można się naciąć na niewłaściwym doborze typów. Dla sum nie można wybrać longint, musi to być typ o znacznie szerszym zakresie wartości niż longint (bo Codility wypluje błędy WRONG ANSWER).

A zatem jeśli programista aplikuje na stanowisko C++ developera, jeśli wybierze C++ a walnie się na niewłaściwym doborze typów zmiennych, test go odrzuci bo pracodawca może wymagać min 80% a tu mu wyjdzie 75%. Jeśli wybierze python albo php to już ten problem ma z głowy. I wtedy przejdzie pozytywnie ten test.

A zatem jest jasne, że język nie jest wcale sprawą drugorzędną. Większe szanse na pozytywne przejście testów daje wybór języków z dynamicznym typowaniem danych, dlatego ja zalecam python, php. Niestety jeśli oferta dotyczy C++, test powinien być w C++ a nie w dowolnym języku. To podważa wiarygodność takiego badania kompetencji.
Taaa. Test ten jest w stanie sprawdzić jedynie umiejętności programisty pod względem poprawności algorytmów i ewentualnie radzenia sobie pod presją czasu. To jednak nie jest żadnym gwarantem tego, że programista będzie tak samo dobrze radził sobie w innych sytuacjach.

Prosty przykład. Zauważyłem że ta sama aplikacja obrabiająca duże ilości danych napisana w Pythonie działa o wiele wolniej niż gdyby użyć C++ czy Delphi. A załóżmy że celem jest szybkość działania aplikacji. I jaki jest sens używania Pythona? A Codility tego nie uwzględnia, zresztą nie o to tam chodzi.

Twórcy odnieśli sukces w biznesie, ponieważ rynek oferuje ogromną liczbę programistów chętnych do pracy, gdzie firmy mają w czym wybierać. Nie mam jadnak żadnych wątpliwości, że tylko wąska grupa jest bardzo dobra w tym co robi, niestety obawiam się, że nawet najpelszych ten test może odrzucić.

Nikt kto ma trochę oleju w głowie nie będzie się uczyć na pamięć tych wszystkich algorytmów, ponieważ wszystko tak naprawdę sprowadza się do tego, by wiedzieć gdzie co znaleźć. Poza tym wiele funkcji i klas jest już gotowych, także razem z kompilatorami, zatem jaki jest sens pisania tych funkcji od nowa. To nie ma sensu ani w darmowych ani w komercyjnych aplikacjach.
Codility to pic na wodę, tyle.
Comments closed...