poniedziałek, 30 kwietnia 2012

Po co te wzorce?

Od jakiegoś czasu nieodłącznym elementem wszelkich ogłoszeń o pracę dla programistów języków obiektowych pojawia się znajomość wzorców projektowych, co byłoby nawet całkiem zrozumiałe, gdyby nie jeden drobny szczegół: w wielu firmach z tego grona, rozmowa kwalifikacyjna będzie jedynym momentem, kiedy o wzorcach usłyszycie.

W takim wypadku, po co tyle firm umieszcza takie wymagania odnośnie kandydatów? Skoro potrzeba im kogoś, kto potrafi pisać np. w PHP strony internetowe, a o OOP słyszeli dawno temu na studiach, to w jakim celu zawyżają oni tak bardzo wymagania? Bo znajomość wzorców świadczy jednak o sporej wiedzy z zakresu OOP. Z tym, że przez "znajomość" rozumiem tutaj również umiejętność ich zastosowania oraz wiedzy, kiedy należy takie rozwiązania implementować.
Tak, więc po co to im? Tylu potencjalnych kandydatów nie zgłosi się na taką rozmowę, ponieważ nt. wzorców wiedzą jedynie tyle (a i to tylko ze słyszenia), że singleton jest zły i nie powinno się go używać. Poza miejscami, gdzie jednak dobrze by było go wykorzystać:P Z drugiej strony Ci, którzy się zgłoszą, po wstępnej rozmowie uznają, że to miejsce nie jest dla nich, bo jednak poziom jest trochę niższy niż spodziewali się po ogłoszeniu:)

Dziwny i niezrozumiały to dla mnie zabieg. Ja, kiedy rozmawiałem ostatnio na temat wymagań, jakie powinniśmy wpisać do oferty pracy, stwierdziłem, że jak dla mnie wystarczające są trzy: komunikatywna znajomość angielskiego (bo część rzeczy omawiamy w tym języku), podstawowa znajomość programowania obiektowego, czyli klasa, abstrakcja i interfejs oraz umiejętność ich wykorzystania i wytłumaczenia się dlaczego tak, a nie inaczej, a na koniec znajomość jakiegoś języka obiektowego, frameworka MVC i (ewentualnie) pracy z ORM'em.
Mile widziana oczywiście znajomość konkretnego języka i bibliotek. A wzorce? Co prawda pytamy o nie na rozmowie kwalifikacyjnej, ale czy to jest główne kryterium na podstawie, którego podejmujemy decyzję? Nie. Dobrze jak programista wie, czym są i potrafi je zidentyfikować, rozumie dlaczego zostały wykorzystane właśnie tutaj, ale to projektant jest od tego, aby wiedzieć gdzie ich użyć. A jeżeli nie projektant, to jakiś straszy programista.

Wydaje mi się, że ostatnio jest jakaś moda na "znajomość" wzorców. Oczywiście polecam dokształcanie się i rozwój, ale programista nie musi być od wszystkiego, czytanie diagramów UML i rozumienie wzorców powinno wystarczyć i to nawet (a może przede wszystkim) w dużych firmach.
Po prostu często można się spotkać z opinią (a przynajmniej takim myśleniem), że projektant = programista, a jak już jest (dobry) projekt, to może być byle jaki programista, a to nie jest prawda. Tak samo, jak jest architekt domu i wykonawcy. Żeby być zadowolonym ze swoich czterech kątów i architekt i firma budowlana muszą być dobrzy w tym, co robią, a dobra jakość pracy jednych nie jest równoznaczna z jakością drugich.

Tak czy inaczej, nawet jeżeli nie macie wzorców w małym palcu jednej ręki, to warto próbować nawet tam, gdzie wymagają ich znajomości, ponieważ czasami może się okazać, że ta znajomość nie jest aż tak wymagana, jak jest napisane w ofercie, a nawet jeśli, to możecie okazać się dobrzy na innych polach (a to na rozmowach też wychodzi) i potencjalny pracodawca zmieni się w pracodawcę:)

6 komentarzy:

  1. Programować bez znajomości wzorców projektowych to jak pisać książki bez znajomości literatury. Niby się da, ale efekt jest po prostu ubogi.

    Znajomość wzorców projektowych może nie jest kluczowa, by spłodzić działający program, ale ułatwia analizę cudzego kodu (lub komuś analizę Twojego kodu). Poza tym nie narodziły się one w głowie jakiegoś pierdzącego w stołek profesorka. Zostały wyprawcowane przez branżę na przestrzeni wielu lat i nie znająć ich często wyważasz po prostu otwarte drzwi. Wreszcie, znajomość wzorców pomaga w korzystaniu z rozmaitych API, czy właśnie wspomnianych przez Ciebie frameworków MVC (Model-Widok-Kontroler to przecież też wzorzec projektowy ;) )

    OdpowiedzUsuń
    Odpowiedzi
    1. Da się programować bez znajomości wzorców i można być nawet całkiem niezłym programistą:) Ba, można używać wzorców nawet o tym nie wiedząc, co pewnie wielu z nas wielokrotnie robiło.
      Dlaczego tak jest? Bo, jak sama nazwa wskazuje, takie rozwiązania to wzorce, coś powtarzalnego, dobra odpowiedź na konkrety problem. I nie trzeba wiedzieć, czym jest Fabryka, żeby ją zastosować. Dobry programista dojdzie do tego rozwiązania tak czy inaczej. Dlaczego? Bo pasuje do problemu, bo jest odpowiednie.

      Nie chodzi mi o to, żeby nie stosować wzorców, ale o to, że nie trzeba znać ich definicji. Oczywiście, że pomaga to w komunikowaniu się z innymi programistami, bo łatwiej powiedzieć, że 'tutaj użyłem wzorca Obserwator' niż opisywać dokładnie to, co zrobiliśmy.

      Jednak naokoło wzorców zrobiła się w ostatnim czasie taka magiczna otoczka, a tak naprawdę żadnej magii za tym nie ma. To nie są wymyślone rozwiązania dla określonych problemów. To są nazwy dla tych rozwiązań, bo wzorzec nie jest czymś nowym. Nowy wzorzec to oksymoron, bo albo coś jest nowe, albo jest wzorcem:)

      Dlatego wolę dać komuś do rozwiązania proste zadanie, a później ewentualnie wypytywać o wzorce. Jeżeli ktoś zadanie rozwiąże dobrze (może nawet użyje jakiegoś wzorca:), to jaki jest sens pytać go o definicję? Rozwiązanie to praktyka, definicja to teoria i choć w teorii praktyka i teoria są tym samym, to w praktyce nie zawsze:)

      Usuń
  2. z twojego opisu wynika że jesteś "początkującym programistą"

    dzięki wzorcom dążymy do pewnej standaryzacji pisania kodu
    zgodzę się z 1 komentarzem a szczególnie z "ale ułatwia analizę cudzego kodu"

    to tak jak byś wziął kielnie do ręki i chciał zbudować mur, masz narzędzia mniej więcej wiesz jaki ma być ten mur, ale jak go wykonać ? tu już potrzebna jest jakaś technika klejenia cegły do cegły którą mógłbyś własnie nazwać wzorcem

    OdpowiedzUsuń
    Odpowiedzi
    1. Chyba już taki początkujący nie jestem:P

      Ja wiem, jakie korzyści płyną ze znajomości wzorców. Wpis nie traktuje o tym, że są złe, czy też zbędne.

      Zastanawiam się jedynie, czy rzeczywiście powinny figurować jako pozycja przy każdej ofercie pracy? Moim zdaniem nie.

      Usuń
    2. Co do Twojego porównania, to czy nie sądzisz, że murarz jest w stanie sam dojść do tego, jaka jest dobra technika? Może się okazać, że technika przez niego wypracowana jest stosowana z powodzeniem przez innych murarzy i ma nawet swoją nazwę!
      Jasne, że musiał do tego dojść, ale gdy już wypracował rozwiązanie, to czy nieznajomość nazwy tej techniki mu w czymś przeszkadza? Tylko w tym, że innym murarzom będzie musiał opisać jak on to zrobił, a nie rzucić stosowną nazwą.

      Analogicznie rzecz się ma z programistami:)

      Usuń