Co jest najważniejsze w informatyce? Odruchowa, wynoszona ze studiów
odpowiedź - pisanie algorytmów. Znajdowanie efektywnych rozwiązań
trudnych problemów, weryfikowanie ich poprawności formalnej czy
numerycznej. Wirth, Knuth, Dijkstra, Hoare, ... Algorytmy i struktury danych!
Codzienna informatyka wygląda trochę inaczej. Kluczowe są
umiejętnosci architektoniczne - od zaplanowania złożonego systemu jako
całości, po organizowanie kodu tak by był czytelny, rozszerzalny i
reużywalny - i organizacyjne. Waży dobra znajomość konkretnych
języków, bibliotek i narzędzi. Znaczy profil psychologiczny - od
pomysłowości, po umiejętność kooperacji. Przydaje się umiejętność
zrozumiałego pisania tekstów, a nawet zmysł estetyczny.
Za to okazje do pisania nietrywialnych algorytmów są - rzadkie.
Niemal wszystko, co potrzebne, da się znaleźć i użyć w gotowej formie.
Tym bardziej chce się czasem sprawdzić, czy jeszcze w ogóle to potrafię.
Konkursy
W sieci jest całkiem sporo serwisów z różnymi zadaniami
programistycznymi. Czasem są prowadzone przez hobbistów, czasem
stanowią odprysk działalności uniwersytetów, często stanowią dyskretną
formę szukania potencjalnych kandydatów do
pracy (Google CodeJam jest nawet obudowany w sposób pomagający czołówce zapoznać się z firmą
Google, w Polsce też raczej nie
przypadkiem Mistrzostwa Polski w Programowaniu organizowało Asseco).
Opiszę dwie - bardzo różne - strony, którymi się trochę pobawiłem.
Jest oczywiście wiele innych możliwości. Hasła typu programming
contest, programming problems, algorithm competition, a nawet
zawody w programowaniu każdy może wpisać w wyszukiwarkę sam, więc
nie będę tu kopiował wyników.
Bardzo mi się podoba ProjectEuler. Może dlatego, że wpisuje się w
moje zainteresowania matematyczne - publikowane są tu
zadania z pogranicza matematyki i informatyki.
Spektrum jest dość szerokie, z kilkudziesięciu zadań jakimi się
zajmowałem, kilka udało mi się rozwiązać na kartce, kilka miało czysto
programistyczną specyfikę, a większość wymagała połączenia chwili
rozważań matematycznych z napisaniem rozsądnego algorytmu.
Podobnie, niektóre zadania są dość łatwe, a niektóre ... nietrywialne.
Charakterystyczny przykład zadania to optymalizacja n/φ(n). Ale trafia się też czysto algorytmiczne
wyszukiwanie optymalnej ścieżki
albo pachnące praktycznie symulacja pokera i łamanie hasła.
ProjectEuler nie stawia żadnych wymagań co do metody rozwiązania.
Liczy się jedynie wpisanie poprawnej odpowiedzi. Dlatego można
stosować dowolnie wybrane narzędzia i języki programowania.
Po rozwiązaniu zadania zyskuje się dostęp do forum, na którym
użytkownicy serwisu opisują swoje rozwiązania. Bywa to oczywiście
pouczające - gdy mój program przez minutę czy dwie przeszukiwał
miliony możliwości, a ktoś znalazł i udowodnił szybką, elegancką metodę - ale też po
prostu ciekawe - gdy pojawiają się fragmenty kodu w
egzotycznych językach programowania.
Ogromna zaleta: zadania są krótkie i jasno napisane i przygotowane
tak, by nie wymagały nudnego programowania (rozbudowanej obsługi
wejścia i wyjścia, walidacji, formatowania itp). Rozwiązanie może
być trudno wymyślić, ale gdy się już je wymyśli, jest krótkie
i pisze się je szybko.
Wady? Część problemów - zwłaszcza tych starszych - daje się łamać
brute force, co stanowi niepotrzebną pokusę. A na forum zadania
brakuje jakiegoś systemu oceniania wypowiedzi, który pozwoliłby
wyłapać najcenniejsze uwagi.
Prowadzona jest prosta punktacja: jeden punkt za jedno poprawnie
rozwiązanie, uzupełniana różnymi statystykami. Dochodzi do
tego nieformalna rywalizacja, kto najszybciej rozwiąże i opisze
nowo dodane zadanie. A takowe pojawia się raz na tydzień.
W tej chwili ProjectEuler zawiera 225 zadań. Rozwiązanie
ich wszystkich to zabawa na wiele wieczorów... Mi udało
się na razie zrobić kilkadziesiąt.
Topcoder działa zupełnie inaczej. To duży serwis, ukierunkowany
głównie na praktyczne programowanie.
Piszemy konkretny kod (w C++, C# lub Javie), który zapisujemy na
serwerze i który tam zostaje skompilowany i przetestowany. Nie ma
pełnej swobody, jest wymóg by to, co napiszemy, skompilowało się i
zwróciło odpowiednie wyniki.
Nie piszemy całych programów. Zazwyczaj zadanie nakazuje napisać
metodę o takiej-a-takiej sygnaturze, która zostaje zlinkowana
z gotowym (niewidocznym) szkieletem programu.
Po rozwiązaniu problemu można oglądać cudze rozwiązania - i nie jest
to kwestia dobrej woli ich autorów, dostępne są wszystkie. Ba! Można
próbować je obalać (przez podanie parametrów, dla których nie
zadziałają poprawnie) - i jest to także ważny element rywalizacji (za
udane obalenie zdobywamy dodatkowe punkty). Fajny pomysł, pomagający
zdobywać wyczucie przydatne przy robieniu review kodu.
Topcoder uruchamia się w formie rozbudowanego apletu, zapewniającego
nawigację pomiędzy konkursami i zadaniami oraz środowisko edycyjne
(okno edytora z kolorowaniem składni, podgląd ewentualnych błędów kompilacji). Wygodna jest funkcja
bezkarnego uruchamiania na danych testowych.
Tryb pracy: piszemy program, dowolną ilość razy próbujemy go kompilować
i uruchamiać na danych testowych, wreszcie publikujemy rozwiązanie
(co już jest nieodwracalne).
W środowisku Topcodera do dyspozycji jest masa zadań
archiwalnych, do tego regularnie odbywają się nowe konkursy - czasem
nawet z nagrodami finansowymi (te toczą się w ustalonych terminach, z ograniczeniem czasu).
Wady?
Aplet Topcodera jest niewygodny i mało intuicyjny. Sporo
wysiłku wymaga elementarna nawigacja, okno edytora jest małe i nieporęczne
(po paru próbach pisania w nim zdecydowałem się pisać programiki w Emacsie
i kopiować, gdy są już gotowe), ciężko się zorientować w pokaźnej ilości
zadań i konkursów o kryptycznych nazwach.
Zadania - przynajmniej te, które robiłem lub oglądałem (kilkakanaście
wybranych na chybił-trafił) - są mniej zgrabne, niż te z ProjectEuler. Długa - nawet
kilkustronicowa - treść, częsta konieczność pisania parserów danych
wejściowych, czy sprawdzania rozmaitych warunków brzegowych, za to
faktyczne rozwiązanie nieraz dość oczywiste. Jest to bliższe prawdziwej
informatyce ale mniej pociągające jako forma rozrywki. No i jest
dużo bardziej czasochłonne.
Ma tu oczywiście znaczenie wybór narzędzi. Załadowanie ciągu liczb
rozdzielonych przecinkami w perlu czy pythonie jest jedną
instrukcją, w C++ czy Javie wymaga znacznie więcej zachodu. Topcoder
ma opcję Python ale dla konkursów algorytmicznych chyba nie jest ona
dostępna (w Pythonie można pisać rozwiązania maratonów, czyli otwartych
trudnych problemów).
Podsumowując: bardzo rozbudowany, ciekawie pomyślany, realistyczny i
obiektywnie oceniający rozwiązania serwis - ale raczej dla osób
dysponujących większą ilością wolnego czasu.
Bawiłem się tylko konkursami algorytmicznymi i tylko o nich
piszę. Na Topcoderze dzieje się więcej, min.
rywalizacje związane z projektowaniem.
Dopisek (OPSS)
Rzuciłem szybko okiem na OPSS. Całkiem przyjemnie ten serwis
wygląda. Piszemy gotowy pełny program (C++, Pascal lub C), uploadujemy go, po chwili
sprawdzamy wynik. Program zazwyczaj wczytuje ciąg liczb z standardowego wejścia i ma wypisać
odpowiedź na standardowe wyjście.
Zadania wyglądają ciekawie, zwłaszcza te z dalszymi numerkami.
Co może być ważne: OPSS jest po polsku.
Mi się osobiście bardzo spodobał Project Euler :-) Trochę czasu mi zajęło, ale warto było.
Do appletu TopCodera można doinstalować różne pluginy, które umożliwiają pisanie kodu w naszym ulubionym edytorze (bez konieczności kopiowania itp.)