Jesteś tutaj

Charakter narodowy Polaków, czyli kończ waść, programowania oszczędź

Karty podstawowe

GeeCON 2012

Charakter narodowy Polaków czyli kończ waść, programowania oszczędź

Ostatnio bardzo mocno mnie zastanawia, jaki wpływ na sposób tworzenia programowania mają typowe cechy Polaków. Dochodzę do wniosków, które miejscami osobiście mnie zaskakują. A chodzi o istotę programowania, projektowania i innych elementów, które szumnie nazywamy inżynierią oprogramowania.

Polak jest krnąbrny. Polak musi wszystko zrobić sam. Oczywiście po swojemu. Czyż nie przypomina nam to naszych kochanych bohaterów romantycznych, pozytywistycznych i pewnie kilku innych. Co najciekawsze odnoszę wrażenie, że dokładnie tak samo jest w świecie współczesnym. W pełnym wymiarze, moim subiektywnym zdaniem, dotyczy to również naszych ukochanych informatyków. Wprawdzie ostatnie uogólnienie może być prawdziwe dla całej rzeszy informatyków, skupię się na samym procesie programowania.

Polak programista jest twórczy ? tego nie można mu zarzucić. Potrafi stworzyć wszystko, zaprojektować system, którego jeszcze nikt nie zaprojektował, włamać się do systemu, którego jeszcze nikt nie złamał. Radzi sobie świetnie.

Jakim kosztem?

Na szczęście ma niemal wrodzoną umiejętność kombinowania na wszelkie możliwe sposoby. Przecież nie ma góry nie do zdobycia.

Ale jakim kosztem?

Kreatywność jest błogosławieństwem, ale czasami może być przekleństwem. Dlaczego? Ponieważ za każdym razem trzeba rozwiązywać problemy, które już były rozwiązane ? jeśli nie całkowicie, to przynajmniej częściowo. Spostrzeżenie: Polak programista ma tendencje do ciągłego wymyślania kół od nowa! A może to niechęć do nauki na podstawie doświadczeń innych? Może trzeba samemu się oparzyć? Zepsuć? Nie przespać kilku nocy?

Spróbuję zamodelować typowy proces poznawania biblioteki przez naszych współziomków. ?Ok, znalalazłem bibliotekę. Pewnie zrobi za mnie wszystko. Hmm? gdzie jest jakiś tutorial? O, jest! No proszę, całkiem niezła ta dokumentacja?. Tutaj następuje czytanie kilku pierwszych wierszy/akapitów (niepotrzebne skreślić). Niedługo potem następuje zniechęcenie. I pojawia się olśniewająca myśl: ?Nic sensownego nie piszą. Zabiorę się do eksperymentowania z biblioteką, pewnie szybciej dojdę do tego, o co chodzi.? I zaczyna się długotrwały proces tworzenia własnych rozwiązań. Długotrwały i żmudny ? należy podkreślić. Owszem Polak programista dojdzie do pewnych, tylko sobie znanych sposobów korzystania z nowego narzędzia, wymyśli kilkanaście pokrętnych pomysłów na realizowanie podstawowych zadań. Nie zauważy tymczasem jednej rzeczy: jego rozwiązania są bardzo dziwne i przypominają drapanie się lewą ręką za prawym uchem. I co najważniejsze ? straci mnóstwo czasu, pozostanie zaś uczucie, że ?nie dokońca wszystko rozumiem.?

Jaki płynie z tego wniosek? Polak programista ma tendencję do tworzenia własnych rozwiązań, lecz zazwyczaj nie potrafi stworzyć sobie zbioru dobrych nawyków. Jego IDE to jedno wielkie pobojowisko, nazwy klas, metod, pól to mieszanka wszystkich możliwych konwencji (stosowanych oczywiście niekonsekwentnie). Polak programista nie zdążył nauczyć się zasad dobrego, uporządkowanego programowania, bo w międzyczasie poznał tysiące niuansów języka programistycznego (niuansów tych oczywiście nigdy nie wykorzysta). Podsumowując: Polak programista jest nieekonomiczny.

Trochę wyjaśnień. Skąd ta nieekonomiczność? Przyjrzyjmy się procesowi nauki dowolnej umiejętności. Proces ten możemy podzielić na cztery etapy:
1. niekompetencja nieświadoma ? nie wiem, że nie potrafię (sześcioletnie dziecko nie wie, że nie potrafi jeździć samochodem)
2. niekompetencja świadoma ? wiem, że nie potrafię (osiemnastoletnie już dziecko chcę jeździć samochodem, ale wie, że musi się tego nauczyć)
3. kompetencja świadoma ? już potrafię, ale kosztuje mnie to mnóstwo energii (osiemnastoletnie dziecko już zrobiło kurs prawa jazdy, ale jeszcze musi się skupiać na tym, że zmieniać bieg, spoglądać w lusterka, obserwować ulicę, włączać kierunkowskaz itp.)
4. kompetencja nieświadoma ? potrafię i już nie pamiętam, że to mogło sprawiać problem

Czy przypominacie sobie waszego ulubionego muzyka, który gra na instrumencie tak, jakby to była czynność dla ludzi naturalna? To właśnie jest objaw posiadania kompetencji nieświadomej ? niezwykle skomplikowane procesy zachodzą w sposób uporządkowany i subiektywnie prosty. To jest właśnie ten element, którego brak Polakowi programiście. Upraszczając ? brak jest podstawowych dobrych nawyków. Wyobraźcie sobie, jak wielki potencjał tkwi w połączeniu dwóch cech: kreatywności i umiejętności czerpania z przemyślanych (czytaj: dobrych) nawyków. W końcu przestajemy skupiać się żmudnym tworzeniu niskopoziomowych rozwiązań (mamy nawyki), a skupiamy się na rzeczach istotnie ważnych ? jak zrealizować to, co jest unikalne dla naszego projektu. Wtedy można, a nawet należy, wykorzystać typową dla Polaków kreatywność.

Na zakończenie słów kilka o tym, skąd takie wnioski. Do zespołu Equilibrium zgłasza się wiele osób (80% studenci wyższych lat), jednym z elementów procesu rekrutacji jest zrobienie zadania. Zadanie jest nieskomplikowane, natomiast ujawnia wiele braków projektowych i programistycznych. Możemy stwierdzić, że w dużej części przypadków kod jest tworzony niechlujnie, brak jest znajomości (a na pewno wykorzystywania) metod obiektowych, istnieją duże wypaczenia na poziomie projektowym. Krótko mówiąc ? nie jest dobrze. Dla wszystkich tych, którzy chcieliby przyjrzeć się własnym poczynaniom, poniżej zamieszczamy otwartą listę umiejętności, których zastosowanie warto rozważyć:
1. uporządkowane podejście do ustrukturyzowania projektów na poziomie ich artefaktów (np. określona struktura katalogów - wsparciem może być Maven),
2. stosowanie standard kodowania (niezwykle istotny),
3. znajomość metod obiektowych (często pojawia ogromny brak wyczucia sfery odpowiedzialności obiektów),
4. używanie wzorców projektowych (celowo potraktowane osobno),
5. testowanie (jednostkowe, integracyjne i funkcjonalne),
6. refaktoring kodu,
7. korzystanie z architektur systemów oprogramowania.

Mariusz Sieraczkiewicz
Zespół Equilibrium
http://equilibrium.fpl.pl

Artykuły: 

Odpowiedzi

Bardzo ciekawe spostrzeżenia, jednak brak tutaj opisu faktycznej przyczyny takiego stanu rzeczy (braku profesjonalizmu, amatorka, bo to chyba o to z grubsza chodzi).

Piszesz, że zgłasza się do Was 80% studentów. Ja pytam, gdzie oni mają się uczyć poprawnie, systematycznie, obiektowo, standardowe, "reusableowo" programować? Na uczelni na zajęciach fizyki? Czy może w ciągu tych 40 godzin języków obiektowych w semestrze na czwartym roku?

Tak, polscy programiści to "dłubki" i "kombinatorzy" (w pozytywnym sensie - zawsze dojdą do celu), ale o tym decyduje raz brak odpowiedniego kształcenia, a dwa postawa wielu firm (zwłaszcza tych mniejszych, choć i w większych pewnie też tak bywa), które nie są skłonne przeszkolić pracownika i przyuczyć go do zawodu.

Powiem z własnego przykładu. Zaczynałem pracę na 4 roku studiów jak HTML-slave w jednej z większych wrocławskich firm internetowych. Podejście było takie: chcesz to sobie zainstaluj dowolny program i składaj te strony jak chcesz. Nas interesuje tylko efekt końcowy. Wykonując należycie polecenie szefostwa każdy składał sobie HTML jak chciał - jeden w Dreamweaverze, jeden we FrontPage, inny w VIM-ie. Efekt był taki, że przejęcia po kimś kodu to była rzeźnia. W firmie, ze względu na dobrą wtedy koniunkturę, przeważało jednak podejście, że składać trzeba szybko, choćby byle jak. Nikt nie został przeszkolony jak ma to robić. Nie było żadnych standardów.

Potem pracowałem w innej firmie, w której już na jakość kodu zwracało się ciut większą uwagę, ale z kolei dział techniczny _nigdy_ nie miał żadnych pogadanek na temat stylu, standardów, projektowania itp. Znowu - każdy ma swój projekt i ten miał działać. Szkolenia to była dla szefostwa fanaberia, na którą nie było nigdy kasy.

Jak w takich warunkach uczyć się, rozwijać i nabierać dobrych nawyków? Pracując w tego typu firmach (a zaryzykuję stwierdzenie, że jest takich sporo na rynku) jesteś zdany na "dłubanie" i "kombinowanie", bo przecież ma działać i już!

Do czego zmierzam? Oczekiwanie, że człowiek po studiach będzie od razu super projektantem i programistą nie jest poprawnym założeniem. Dużo bardziej moim zdaniem liczy się to, czy delikwent rokuje, czyli, czy jest szansa, że przyswoi sobie szybko i zaakceptuje zasady, metody i styl pracy w danym zespole.

--
pozdrawiam
piotr maj

jcake software - http://www.jcake.com/

Portret użytkownika mbartyzel

Mając wielu znajomych w firmach o dość znamienitych poniekąd referencjach i nazwach, które pewnie każdy z nas dobrze zna, wiem że to nie dotyczy tylko studentów. Jesli chodzi o studentow, posiadamy bardzo konkretne dane. Większość nawyków nabytych w czasie edukacji jest propagowanych na okres pracy. A im dalej w las, tym trudniej je zmienic.

Oczywiscie mozna szukac winnych dookola. Ale prawda jest taka, że to jak tworzymy oprogramowanie, zależy od nas. Można całe życie czekać jak zbawienia okazji, aż w końcu ktoś wyśle nas na szkolenie ... lub wziąć sprawy w swoje ręce. W końcu jeśli chcemy być profesjonalistami, sami musimy kształtować swoje umiejętności.

Bazując na własnych doświadczeniach, mogę stwierdzić, że naprawdę nie potrzeba wiele, żeby diametralnie zmienić swój sposób pracy. Oczywiście w pozytywnym kierunku. Doświadczają tego między innymi członkowie naszego Zespołu.

Może czas przyjrzeć się temu z boku i zrobić sobie mały rachunek sumienia. Kilka wytycznych w ostatnim akapicie artykułu może być w tym celu pomocnym.
-------------------------
Mariusz Sieraczkiewicz
Zespół programistyczny Equilibrium
http://equilibrium.fpl.pl

"Ale prawda jest taka, że to jak tworzymy oprogramowanie, zależy od nas."
To jest naprawdę piękne założenie, jednak nie zawsze prawdziwe. Ja akurat mam to szczęście że trafiam do firm (albo: staram się wybierać ;) ) które przykładają dużą wagę do jakości.
Znam jednak masę ludzi, których szefowie mają opisane podejście "byle szybciej" i niestety człowiek pracujący w takich warunkach nie ma czasu żeby siąść z kartką papieru i sobie conieco zaplanować, a co dopiero uczyć się innych dobrych nawyków. Szef nie ma namacalnych dowodów w postaci iluś linii kodu, więc taka praca się nie liczy. Nie pracujesz - wylatujesz. Kiedy masz do wyboru wyrabianie sobie dobrych nawyków bez pracy, albo pracę taką jak szef wymaga, to nie dla każdego jest to prosty wybór, bo niestety nie jest to kwestia zmiany pracy (często można trafić z deszczu pod rynnę...) To są ludzie w większości młodzi, którzy mają ochotę i potencjał żeby pracować "dobrze" a nie "byle działało, tu łatkę, tam brzydki hack, ale chodzi", ale jeśli szef nie uważa że ustalenie spójnego standardu kodowania dla wszystkich jest ważne ("tego nie dostaje klient"), jeśli pisanie testów to dla niego strata czasu ("przecież widać że chodzi"), jeśli cały proces wytwarzania oprogramowania jest dla niego czarną magią - to jeden programista z dobrymi chęciami utonie choćby dlatego, że nie ma żadnego wpływu na swoich współpracowników i ich praktyki...
Masz bardzo, bardzo dużo racji w tym jak polscy programiści pracują, ale ja jednak mam wrażenie że to bardziej wina "góry" niż ich samych.

"Write your code as if the person maintaining it is a homicidal maniac who knows where you live."

Portret użytkownika mbartyzel

[...] Znam jednak masę ludzi, których szefowie mają opisane podejście "byle szybciej" i niestety człowiek pracujący w takich warunkach nie ma czasu żeby siąść z kartką papieru i sobie conieco zaplanować, a co dopiero uczyć się innych dobrych nawyków [...]

Mam wrażenie, że dla wielu osób projektowanie, testowanie i inne tzw. "dobre nawyki" to sztuka dla sztuki. Tymczasem one są po to, żeby robić te same projekty - lepiej i szybciej. Cała magia polega na tym, że wszyscy uważają, iż to strata czasu, bo to jest coś dodatkowego. Chciałbym zatem podkreślić, że to jest ZAMIAST. Nic nie tracimy, a piszemy coś, nad czym panujemy i łatwo to utrzymać.

Przepraszam za małą demagogię, którą zaraz poczynię. Trochę mi to przypomina taką historyjkę: "... wsiadłem do samochodu, żeby nauczyć się jeździć. Wiesz co, dopiero po pół godzinie wyruszyłem z miejsca, zanim dowiedziałem się, co zrobić. Trzeba tyle rzeczy na raz robić, o wszystkim myśleć, wszystko obserwować na ulicy. Lepiej chodzić piechotą ...". Ale ... o tym jest właśnie artykuł :-)

Każdy z nas ma wybór.

Mariusz Sieraczkiewicz
Zespół programistyczny Equilibrium
http://equilibrium.fpl.pl

Ja wiem że w ostatecznym rozrachunku to się bardziej opłaca i właśnie po to są dobre nawyki żeby m.in. oszczędzać czas (choćby przez to żeby nie wymyślać koła na nowo tylko korzystać z wzorców projektowych). :)Tyle tylko że istnieją szefowie którzy jak nie widzą kolejnych linii kodu, nie słyszą klepania w klawiaturę, to już im się wydaje że pracownik się obija. Nie potrafią na to spojrzeć w szerszym kontekście (ten projekt będzie realizowany 2 miesiące a nie 3) tylko widzą "w tym tygodniu nie powstała prawie żadna linia kodu!"). I wcale nie jest ich tak mało.

--
Pozdrawiam - Lilith
"Write your code as if the person maintaining it is a homicidal maniac who knows where you live."

Portret użytkownika mbartyzel

albo może założyć własną firmę? :-)

O takich szefach, a raczej o firmach tego typu ciekawie traktuje ten artykuł.

Jak szef nie rozumie, ze ladniejszy kod jest lepszy dla firmy; ze testy pomagaja w tym, ze klient dostanie przetestowany soft i lepiej napisany, tak by dalej latwiej sie go rozwijalo, to:
1) wytlumaczyc to szefowi (kolegom) przystepnie, pracowac dalej - lepiej
2) zmienic firme (na rynku sa poszukiwani dobrzy programisci, projektanci, vide: BMS/Java)

3) jesli programista nie pisze ladnego kodu - a kod pisze sie po to, aby pozniej go ktos przeczytal - to jest niechlujny, zaniedbuje swoja wlasna prace, nie przyklada sie, moze powinien robic cos innego w zyciu
3a) taki programista powinien sie sam doksztalcac, czytajac "na sieci" Martina Fowlera

4) nawet pracujac w stresowych warunkach, i nawet jesli kod nalezy szybko wykonywac (szybko?), mozna troche "pedantycznosci" wprowadzic i sie ciagle uczyc i ciagle poprawiac
4a) wazne, aby malymi kroczkami ciagle sie udoskonalac

5) sukces gwarantowany: zwykly czlowiek sam jest w stanie wymyslic wszystkie wzorce projektowe, wszystkie metodyki (TDD, skryptowosc, refactoring, ..) bez ich teoretycznej znajomosci (np. na studiach). Wystarczy na swoja wczesniejsza prace patrzec z krytyka i sie uczyc na bledach.

5a) Pamietam jak wymyslilismy jakis tam "mechanizm", a pozniej okazalo sie, ze jest to "Chain of responsibility". Podobnych sytuacji bylo jeszcze kilka.

Tomasz

Portret użytkownika mbartyzel

[...]zmienic firme (na rynku sa poszukiwani dobrzy programisci, projektanci, vide: BMS/Java)[...]

:-)

Myślę, że kwestie które poruszasz nie mają wiele wspólnego z naszymi
cechami narodowymi. Te same problemy z tworzeniem oprogramowania mają
również inne nacje (we wszystkich miejscach twojego tekstu gdzie jest
"Polak" można wstawić "Chińczyk" i stwierdzenia będą tak samo prawdziwe).

Jeżeli istnieją jakieś różnice to wynikają one z różnego stopnia rozwoju
cywilizacyjnego a zwłaszcza organizacji pracy w różnych firmach.
Dlatego na pewno można znaleźć więcej firm, które robią to lepiej
w Niemczech niż w Polsce, ale dotyczy to nie tylko programowania
ale również budownictwa czy innych dziedzin.

Problemy z tworzeniem oprogramowania wynikają moim zdaniem między innymi z następujących kwestii.

1) Jest to coś co robi się bardzo łatwo. Każdy kto umie czytać, pisać,
posługiwać się komputerem, ma podstawowe intuicje dotyczące logiki i trochę
chęci (a więc prawie każdy) nie powinien mieć większego problemu aby zacząć
programować. Bardzo często zajmują się tym ludzie zupełnie przypadkowi.
Ot po prostu, spróbowali, okazało się, że nie jest to nic trudnego a jest
zapotrzebowanie i można zarobić więc to robią.

Dobrze wykształconych informatyków wśród wszystkich, którzy zajmują się
programowaniem zawodowo jest pewno bardzo mało (10%?).

2) Stosunkowo łatwo jest przejść od tworzenia małych systemów do tworzenia
dużych. Większości ludzi wydaje się, że różnica jest tylko ilościowa a nie
jakościowa, że można to robić tymi samymi metodami.
Trochę inaczej niż np. w budownictwie, o ile każdy może zrobić budę dla psa
to już zbudować mostu przez Wisłę tymi samymi metodami co tę budę się nie da.

Oczywiście jest to nieprawda. Wie to każdy kto, brał udział w tworzeniu
dużego systemu, który działał przez wiele lat, był wdrażany u wielu klientów,
musiał się przez te lata dostosowywać do zmieniających się wymagań.

3) Programowanie jest działalnością bardzo młodą i rozwijającą się bardzo
dynamicznie i żywiołowo. Inne dziedziny inżynierskie z którymi często próbuje
się porównywać tworzenie oprogramowania rozwijają się setki lub tysiące lat.

4) Większość ludzi jest z natury leniwa więc nic dziwnego, że nie chcą
się rozwijać, udoskonalać sposób pracy. Jak już coś opanują i jakoś im to
wychodzi to tak to robią a ewentualny czas, który mieliby poświęcić na
rozwój wolą poświęcić na coś według nich przyjemniejszego (oczywiście nie
mówię tu o tych dla których programowanie to przyjemność).

---
Pozdrawiam
waf