Witam. Od dłuższego czasu nachodziła mnie ta kwestia. Jak obiektywnie podejść do subiektywnego oceniania własnych umiejętności programistycznych (w głównej mierze konkretnego języka programowania). Do refleksji na ten temat przyczynił się temat na 4programmers: http://4programmers.net/Forum/C_i_C++/223532-przyszlosc_c++ oraz wiele postów, gdzie ich autorzy mają odwagę ocenienia swoich umiejętności w sposób słowny, np. zaawansowany, bardzo dobry itd. Nasz portal od jakiegoś czasu również ma system subiektywnej oceny własnych umiejętności: http://4programmers.net/User/Skill: "słabo, podstawy, przeciętnie, dobrze, bardzo dobrze, ekspert".
Postanowiłem stworzyć w związku z tym ankietę, w której każdy może ocenić własne umiejętności dla języka programowania, w którym głównie pisze. Skala taka została przeze mnie celowo dobrana, ale o tym może w kolejnych postach. Sam zaś temat nie tyczy się umieszczenia danych w cv, czy też przebiegu rozmowy kwalifikacyjnej. By dyskusja miała sens i podstawy, prosiłbym wcześniej o zaznaczenie odpowiedzi w ankiecie :]
Mała uwaga. Prosiłbym o nie propagowanie filmiku z yt, znanego w społeczności programistów ;] Z nim można się zgadzać lub nie, jednocześnie odpowiednio to argumentując.
By nie odwoływać się ciągle bezosobowo, załóżmy że będziemy rozważać sytuację fikcyjnego "Janusza". Osobiście językiem którym operuję jest C++, więc go będę mieć w głównej mierze na uwadze, myślę że nie będzie to większym problemem.
Zacznijmy może od zdefiniowania samej umiejętności:
"biegłość w danym temacie, praktyczna zdolność do robienia czegoś" - za wikisłownikiem.
A teraz przejdźmy do konkretów. Przez jaki pryzmat najlepiej oceniać własne umiejętności z danej technologii?
-
Wiek rozpoczęcia nauki programowania
Ile mieliście lat jak zaczęliście programować
Absolutnie niemiarodajny sposób, niczego nie potwierdzający. -
Wykonywanie zawodu:
Sama umiejętność nie jest ściśle powiązana z wykonywaniem zawodu. Można być słabym programistą, jednocześnie pracować w zawodzie, lub być dobrym programistą nie mając jeszcze możliwości realizacji się zawodowo. Pracowanie zawodowo może być permanentnym sposobem na zwiększanie swoich umiejętności, lub cofanie się (rozwijanie starych wdrożeń opartych o archaiczne technologie itp). -
Porównanie się na tle innych osób, które również programują:
Na pierwszy front niech idzie praca. Praca w słabej firmie, która skupia w głównej mierze słabo rozgarniętych, tanich pracowników. Janusz, który dysponuje sporymi umiejętnościami, z automatu może poczuć się bardzo pewnie, tym samym zdecydowanie zawyżając mniemanie o własnych zdolnościach. Można pracować także w świetnej firmie, która zgarnia najlepszych z rynku pracy. W tym wypadku pomimo sporych umiejętnościach, jego samoosąd zostanie zaniżony. Podobna sytuacja ma się co do szkoły, lecz tutaj jest bardziej drastycznie. Janusz na studiach będzie mieć do czynienia w głównej mierze z osobami, które pierwszy raz na oczy zobaczą linijkę kodu źródłowego. -
Uczestniczenie w konkursach/olimpiadach, rozwiązywanie testów.
Olimpiady szkolne są podyktowane odpowiednim wiekiem. Przypuśćmy że Janusz już nie jest gimbusem ;] Konkursy to chyba kwestia ambicji. Czy testy do rozwiązania są dobrą metodą? Nie wydaje mi się, zbyt subiektywne (chyba że rozwiązujemy testy na podstawie całej dokumentacji języka ;]). Lub coś takiego: http://www.starling-software.com/employment/programmer-competency-matrix.html -
Przeczytane książki
Na samym początku zapodałem link do tematu, w którym jego autor stwierdził że zna odpowiedni język w stopniu zaawansowanym, gdyż przeczytał i zrozumiał książkę "Język C++. Szkoła programowania. Wydanie VI" autor Stephen Prata. Oczywiście przeczytanie jednej książki to zdecydowanie za mało, tym bardziej traktującej nota bene o podstawach języka. Nawet przeczytanie wielu książek nie jest tym samym co wykorzystywanie wiedzy w nich zawartej. -
Reputacja
Mało obiektywne. Na przykładzie 4programmers, który ma swój system reputacji. Osoby piszące często mają zdecydowanie większą szansę na jej zwiększanie. Nie każdy ma chęci ani czas na odpisywanie początkującym, którzy mają problemy z banalnymi rzeczami. Poza tym jakże skrajne porównanie umiejętności wynikałoby z systemu reputacji na przykładzie takich użytkowników?
maszynaz (z całym szacunkiem dla tej osoby, ale każdy wie jak jest): http://4programmers.net/Profile/25083
Gynvael Coldwind: http://4programmers.net/Profile/3762 -
Stworzone aplikacje (kod źródłowy)
Można napisać pięknego snake'a, lub okropny system zarządzania hurtownią farmaceutyczną. Do tetrisa można napisać cudny re-usable kod, który nikomu już się nie przyda itd.
Teraz pozwolę sobie przytoczyć odpowiedź @msm w temacie, który w pewnym stopniu stał się genezą tej dyskusji:
msm napisał(a):
Na poziomie zaawansowanym C++ zna mało ludzi, możesz być pewien że Ty nie (ja też nie, więc nie czuj się obrażony).
No właśnie. W takim razie co to znaczy znać C++ na poziomie zaawansowanym? Co taki Janusz powinien wiedzieć, lub umieć by mógł się określić osobą znającą C++ w stopniu zaawansowanym? Gdzieś znajduje się ta cienka granica, między osobą ogarniającą podstawy a zaawansowane elementy języka.
Znalazłem bardzo ciekawy artykuł na temat oceny własnych umiejętności niejakiego Piotra Kowalskiego, który został opublikowany na łamach czasopisma computerworld:
http://www.pk.bzi.pl/artykuly/cv.htm
Sam artykuł skupia się w głównej mierze na pracy zawodowej, jednakże zachęcam do jego przeczytania - trochę długaśny :]
Postarajmy się wymienić jaki Janusz musi mieć zakres umiejętności, by się określić osobą zaawansowaną.
Ogólne:
- typowe podstawy, czyli w sumie język C zawarty w C++
- obiektowość, polimorfizm
- szablony
- wyjątki
- metaprogramowanie za pomocą szablonów
- castowanie
- standardowa biblioteka C & C++
- nowy standard - w tym współbieżność i wszystko co z nią związane
- RTTI
- wielokrotne dziedziczenie
- operatory
- przestrzenie nazw
- dynamiczna alokacja i dealokacja pamięci
Bardziej szczegółowe:
- Koenig lookup
- różnorakie UB
- ramki stosu
- wirtualne dziedziczenie
- late binding/early binding
- jawne konstruktory (explicit)
- RAII
- mutable
- funkcje inline
- wirtualne konstruktory
- przekazywanie przez wartość, stałą wartość, referencję, stałą referencję, wskaźnik, stały wskaźnik, wskaźnik na stałą, stały wskaźnik na stałą itd.
- odśmiecanie (gc, zliczanie referencji, mark&sweep itp.)
Może coś bardziej z dziedziny inżynierii oprogramowania? Bardziej w kontekście umiejętności stosowania niż samej świadomości ich istnienia:
- programowanie defensywne (asercje, wyjątki, testy jednostkowe, programowanie w pseudokodzie)
- wzroce projektowe (GOF, wielokrotna dyspozycja, domieszki, singleton vs monostate itp.)
Na pewno o czymś zapomniałem...
Nasuwa mi się pytanie. Czy w takim razie, rozważając stopień znajomości języka C++, należy brać pod uwagę zewnętrzne biblioteki i frameworki? Jeżeli tak, to wówczas nie ma osoby na świecie która zna język C++ w stopniu zaawansowanym. Jeżeli brane by były pod uwagę te "najważniejsze", lub "występujące najczęściej w świadomości programisty", to mamy powtórkę sytuacji. Są przecież osoby, które specjalizują się w konkretnej dziedzinie i np. świetna znajomość OGL'a jest im zupełnie niepotrzebna. No i oczywiście kwestia winAPI, czy brać to na poważnie? Kto dzisiaj o zdrowych zmysłach ma zamiar bezwzględnie kodować w tym API? Jakie relatywne korzyści dadzą Jankowi w ogarnianiu winapi, przy frameworkach pokroju qt? Co z Unixami, czyli zależności od systemu operacyjnego?
Co z algorytmami? To już jest bardziej kwestia samego programowania, nie znajomości języka. To samo ze strukturami danych, złożonością obliczeniową, formatami plików itd.
A może znajomość dokumentacji języka jest miarodajnym sposobem na mierzenie swoich umiejętności? Jak dla mnie chyba OP i imba jednocześnie :]
Temat jest być może na pierwszy rzut oka prozaiczny, lecz po głębszym zastanowieniu w mojej ocenie takim nie jest. Dodatkowo jestem ciekawy Waszych opinii, pozdrawiam.