Ocena własnych umiejętności pod kątem języka programowania

5

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.

3

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?

Z bibliotek zrobiłbym osobny punkt w CV, obok znajomości danego języka, głównie ze względu na to o czym napisałeś. Ale do oceny samej znajomości języka programowania dorzuciłbym jeszcze "umiejętność programowania" jako takiego.
Wracając do głównego tematu, moim zdaniem wygląda to trochę tak:

  1. Znajomość składni języka - absolutne minimum. To tak jakbyś nie znał wszystkich literek i zabrał się za pisanie książki. Pewnie się da, ale wyjdzie z tego niezły potworek... To jest za mało żeby uznać że "zna się" dany język, bo znając tylko literki, raczej nie napiszesz dobrej książki. To jest jedyny punkt który jest związany stricte ze znajomością "języka programowania". Pozostałe to już umiejętność programowania.
  2. Umiejętność wyrażania w kodzie tego co chcesz, czyli umiejętność myślenia zgodnie z paradygmatem danego języka i wyrażania swoich myśli w kodzie (tu wpada algorytmika i struktury danych). To jest tak jakbyś nauczył się pisać słowa. Do książki nadal daleko, ale pewnie dałoby się coś zrozumiałego napisać. Sporo ludzi kończy naukę na tym etapie i potem tworzy potworki z copy-paste na każdym kroku na przykład. Bo niby znają składnie języka, ale nie wiedzą jeszcze gdzie czego użyć.
  3. Znajomość pewnych utartych konstrukcji językowych i wzorców projektowych - to tak jakbyś nauczył się pisać całe sensowne zdania. To nadal nie wystarczy do napisania bestsellera, ale wystarczy do napisania zrozumiałej książki, przym czym może się okazać, że będzie trochę niespójna, a tylko złożona z sensownych kawałków.
  4. Rozumienie architektury aplikacji i poprawne pisanie pod nią. Chodzi o to że widzisz "big picture" i rozumiesz jak i czemu pewne rzeczy powinny być napisane. W połączeniu z poprzednim punktem pozwala to na pisanie sensownego kodu, który dobrze komponuje się z całym projektem. Tutaj możesz już napisać technicznie dobrą książkę wg zadanego szablonowego schematu.
  5. Umiejętność projektowania sensownej architektury aplikacji zdobyta poprzez doświadczenie w pracy z kodem. Od napisania książki idealnej pod względem technicznym, napisanej od szablonu, do napisania bestsellera jest jeszcze długa droga. Wiele rzeczy w kodzie można napisać na różne (równie poprawne z technicznego punktu widzenia) sposoby i tylko doświadczenie w pracy z kodem pozwala zobaczyć, kiedy pewne rozwiązania są lepsze a kiedy gorsze.
0

@Shalom podoba mi się Twoja analogia do pisania książki.

Ale do oceny samej znajomości języka programowania dorzuciłbym jeszcze "umiejętność programowania" jako takiego.

Oczywiście zgodzę się z Tobą. Sama znajomość języka nie daje jeszcze umiejętności programowania, a umiejętność programowania nie daje od razu umiejętności programowania w danym języku (chociaż w tą stronę zdecydowanie łatwiej). Programowanie w końcu samo w sobie jest szerszym pojęciem, niż znajomość języka programowania.

Pomijam fakt, że sam temat nie rozbijam tylko o ewentualne CV i zamieszczenie w nim jak najbardziej wiarygodnych informacji. Bardziej koncentruję się na myśli przewodniej czyli "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?" Sam mam z tym problemy. Nie wiem jak można określić stopień znajomości samego języka przez przykładowego Janusza.
Osobiście uważam się za osobę średnio zaawansowaną, ze względu na to iż boję się górnolotnych określeń typu zaawansowany w przypadku danej technologii, lub biegle w przypadku znajomości języka obcego. W konsekwencji sam już nie wiem.

Wypunktowałeś rzeczy, które tyczą się samego programowania. W tak szerokim kontekście wydaje mi się że jest bardzo ciężko o zdrowy osąd swoich umiejętności. Tutaj IMHO sprawa wygląda następująco: umiesz programować / coś wiesz ale wciąż się uczysz / uczysz się. Jak wiadomo człowiek uczy się programować całe życie, w konsekwencji człowiek nie umie programować(!?) :D

W artykule, który podlinkowałem pada świetne stwierdzenie:

Wykonanie jakiegokolwiek, nawet najprostszego projektu wymaga od programisty wiedzy o wielokrotnie większej ilości zagadnień, aniżeli tylko znajomości samego języka programowania.

Sprawa jest mocno subiektywna. Jednakże musi istnieć jakiś rozsądny sposób na ocenę własnych umiejętności, który będzie jak najbardziej obiektywny.

0

Bjarne Stroustrup w skali 1-10 znajomości C++ ocenia się na 7. Wielu studentów kończących dopiero co studia ocenia się wyżej od niego... ;)

Znać C++ na poziomie zaawansowanym = umieć zaprojektować i zaimplementować STL od zera i zrobić to lepiej niż oryginał (tak, da się, zwłaszcza iostream).

0

Jednakże musi istnieć jakiś rozsądny sposób na ocenę własnych umiejętności, który będzie jak najbardziej obiektywny.

Tak, pewnie. Przyłożyć pistolet do głowy i zacząć odliczać do 10. Ewentualnie w wersji dla upartych wcześniejsze tortury. Pojęcie "obiektywny" jest często używaną abstrakcją. Coś takiego w świecie rzeczywistym nie istnieje (już pomijam zupełnie "obiektywność" wobec siebie samego).

0

W miarę obiektywnie można ocenić swoje umiejętności poprzez odniesienie ich do otoczenia. Tzn. jeżeli:

  • pracujesz w dobrej firmie, która robi dobry soft (i dostałeś się, mimo że nie pracuje tam Twój wujek ani szwagier);
  • dostajesz do napisania ważne kawałki tego softu;
  • koledzy do Ciebie przychodzą pytać Cię o radę jak coś zaprojektować;
  • zwykle Ty rozwiązujesz problemy które wydają się prawie niemożliwe do rozwiązania (np. błędy, które nigdy nie objawiają się w testach, a tylko u klienta);
  • potrafisz odnaleźć się w kodzie, który napisałeś rok temu, mimo braku komentarzy;
  • szef sam z siebie daje Ci podwyżkę / premię, mimo że już w tym roku jedną dostałeś

... to najprawdopodobniej jesteś dobry. Ale nie popadaj w samozachwyt, bo w tym fachu zawsze można być lepszym. ;)

0

No powiem że bardzo ciekawy temat ;)
Ale mam też kilka wątpliwości...

Krolik podał jakąś możliwość oceny swoich umiejętności tylko z jednego punktu widzenia - osoby pracującej jako programista. No ok a co z tymi ( jak ja ) którzy nie pracują w zawodzie a jednak piszą różnego rodzaju oprogramowanie?

Z tego co dampe napisał w 1 poście to większość elementów używam w swoich programach( obiekty, dziedziczenie, dynamiczna alokacja pamięci, operatory, przestrzenie nazw, funkcje inline ITD. ) więc to jest dla mnie podkładem pod to że te elementy języka znam.

Więc z jednej strony mogę napisać że znam C++, a z drugiej to nie oznacza że jestem nieomylny czy bezbłędny... nie tak łatwo zdefiniować swoje umiejętności jakby to mogło się wydawać ;)

Idąc dalej wykorzystałem bibliotekę boost::filesystem w swoim programie - czy mogę powiedzieć że ją znam? no tak mogę bo korzystałem z niej, przebrnąłem przez kilkadziesiąt stron dokumentacji, program działa - pełny sukces. Tylko jak ocenić moją znajomość tej biblioteki? Czy wymienić ją po prostu w swoich umiejętnościach ( tak byłoby najbezpieczniej ) czy podać że znam ją na poziomie zaawansowanym? dobrym? No właśnie...

0
Krolik napisał(a):
  • pracujesz w dobrej firmie, która robi dobry soft (i dostałeś się, mimo że nie pracuje tam Twój wujek ani szwagier);

Pracuję w dużej korporacji, w której jest wielu specjalistów, jednak jest też wielu świeżaków, którzy się uczą pod okiem tych specjalistów.
Są beznadziejni jeśli chodzi o umiejętności programowania a powyższe kryterium spełniają.

Krolik napisał(a):
  • dostajesz do napisania ważne kawałki tego softu;

Bywa ale sa kontrolowane przez QA.

Krolik napisał(a):
  • potrafisz odnaleźć się w kodzie, który napisałeś rok temu, mimo braku komentarzy;

W mega bałaganie w swoim pokoju też potrafię się odnaleźć. Czy tzn że jestem pedantem?

Krolik napisał(a):
  • szef sam z siebie daje Ci podwyżkę / premię, mimo że już w tym roku jedną dostałeś

Nie ma takich sytuacji. Chyba że coś w stylu:
"-odchodzę

  • a może podwyżkę?"

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