Rozmawiamy dziś na temat „Wykształcenie, a umiejętności programistyczne”. Zaprosiliśmy do dyskusji cztery osoby:

Przemysława Rosłona - trenera w firmie CTS Customized Training Solutions, prowadzącego szkolenia z zakresu .NET Framework, Visual Studio i SQL Server, projektowania aplikacji internetowych, baz danych i Business Intelligence, posiadającego wiele tytułów między innymi: MCT (Microsoft Certified Trainer), MCSA, MCSE, MCSD, MCITP (Database Administrator, Database Developer), MCPD (Windows Developer, Web Developer), MCTS
Sebastiana Malacę – obecnie Scrum Mastera, członka zespołu developerów odpowiedzialnego za analizę i projektowanie historii użytkownika, uczestniczącego również w implementacji back i front endu i odpowiedzialnego za rekrutację zespołu projektowego, dbającego o to, aby kod pisany był czytelny i jak najwyższej jakości, kładącego duży nacisk na proces refaktoryzacji oraz na to, aby implementowana przez niego funkcjonalność była jak najlepiej przetestowana
Daniela Jankowskiego – obecnie dyrektora ds. oprogramowania Commersoft odpowiedzialnego za rozwój i utrzymanie internetowej platformy biznesowej Commersoftu, zarządzającego zespołem tworzącym nowoczesne oprogramowanie w technologiach Silverlight,Html 5, Java, Object-C, .NET, MS SQL SERVER, doświadczonego projektanta i programistę mającego na swoim koncie stworzenie silnika aplikacji Asseco Softlab ERP oraz mobilnej platformy biznesowej iBusiness oraz iSoftlab dla Asseco Business Solutions
Bartłomieja Juszczyka – dyrektora zarządzającego Grupą Adweb, managera, inwestora, eksperta mediów, wykładowcę, prywatnie podróżnika, pasjonata motocykli, alpinistę, teoretyka nauk ekonomicznych w trakcie rozprawy doktorskiej, autora kilkuset publikacji poświęconych budowaniu marek, wizerunku, promocji firm, zagadnieniom strategii marketingowych
Proszę opowiedzieć jak uczyli się Państwo programowania ?
S.M. W przypadku pierwszych języków programowania (C++, PHP) nauka była równoważna siedzeniu nad książką, przepisywaniu przykładów ze zrozumieniem, a następnie na próbie stworzenia czegoś własnego (na podstawie wcześniej zebranej wiedzy).
Przy przyswajaniu kolejnych języków programowania przyjmowałem inną technikę, - gdy już wiedziałem, do czego najczęściej wykorzystuje się język, w jakich przypadkach i przy jakich projektach najlepiej się sprawdza, wymyślałem sobie prostą aplikację, która mogła przydać się mi albo komuś z mojego otoczenia i zaczynałem pisać.
Odrębnym tematem jest nauka programowania obiektowego (w oderwaniu od konkretnego języka). Muszę przyznać, że droga do poznania technik obiektowych w stopniu zadowalającym była moim zdaniem dużo trudniejsza.
W każdej książce, którą miałem przyjemność czytać były albo informacje o strukturach (interfejsy, klasy itp.) bez tłumaczenia idei, albo dotykały zbyt zaawansowanych (dla początkującej osoby) tematów jak wzorce projektowe, zasady SOLID, GRASP itp.
Nauka programowania obiektowego polegała przede wszystkim na uczeniu się na własnych błędach i sukcesach oraz w dużej mierze na rozmowach z ludźmi bardziej doświadczonymi w tym temacie.
D.J. Przygodę z programowaniem zacząłem na początku liceum. Jak napisać pierwszy program zobaczyłem na lekcjach informatyki, a potem długimi nocami przy książkach uczyłem się samodzielnie. Niestety nie miałem wtedy dostępu do Internetu i zostawały tylko książki. W 2 klasie liceum założyłem stronę internetową, przez którą zgłaszali się do mnie studenci różnych kierunków, którzy mieli problemy z programowaniem. Przez długi czas pisałem programy, o które mnie proszono i tak ćwiczyłem sztukę rozwiązywania problemów na rzeczywistych problemach.
Gdy uważałem się za dobrego programistę, zacząłem pracę w firmie Softlab (byłem najmłodszym pracownikiem
firmy, obecnie jest to Asseco Business Solution) i tam uświadomiłem sobie, że tak na prawdę byłem w błędzie, co do swojego poziomu. Potrafiłem programować, jednak nie znałem się na porządnym debugowaniu, zarządzaniu pamięci. Przy pomocy doświadczonych kolegów, ciężkiej pracy i ciągłym poszerzaniu wiedzy, nauczyłem się kunsztu programisty i odpowiedniego myślenia.
P.R. Jak widać większość programistów uczy się samodzielnie. Mimo, że na rynku są dostępne szkolenia, które pokazują jak rozwiązać pewne problemy w najlepszy sposób to nic nie zastąpi zwykłego siedzenia i ćwiczenia na własną rękę. Programiści muszą ciągle praktykować. Teoria jest równie ważna jak praktyka. Często na szkoleniach człowiek uczy się rzeczy, które teoretycznie mu się nie przydają, a przy którymś projekcie zamiast kombinować jak koń pod górkę i wymyślać na nowo rozwiązania – korzysta z istniejących. Ponadto zawsze warto wiedzieć co jest optymalniejsze od czegoś i w jakich przypadkach.
Panie Bartku bardzo proszę opisać pokrótce przy jakiego typu projektach pracują u Pana w firmie programiści ? Czym się zajmują ?
B.J. Studio programistyczne, które uruchomiliśmy przed niespełna dwoma laty zajmuje się realizowaniem przede wszystkim autorskich zamówień, w tym m.in. aplikacji mobilnych, jak również systemów klasy CMS czy CRM. Programiści na co dzień programują także moduły niezbędne w realizacji większych zleceń opartych o gotowe rozwiązania, np. korzystając z silników open source, jak Wordpress.
Czy najlepsza jest nauka w domu, nad konkretnymi projektami czy też szkolenia w firmach zewnętrznych ?
S.M. Uważam, że nauka w domu jest najtrudniejszą i najkosztowniejszą drogą, ponieważ uczymy się na własnych błędach.
Gdy pracujemy nad konkretnymi projektami, z doświadczonymi ludźmi uczymy się dużo szybciej. Największym plusem tego typu nauki jest moim zdaniem to, że często uczymy się na błędach innych osób, a więc koszt przyswajania wiedzy jest znacznie mniejszy.
Szkolenia w firmach zewnętrznych są moim zdaniem najszybszym sposobem pozyskania nowej wiedzy bądź poukładania tej, którą się obecnie posiada. Jednak w przypadku takiej formy nauki trzeba zwracać uwagę na to, kto prowadzi szkolenie i w jaki sposób to robi, ponieważ jeżeli szkoleniowiec nie potrafi zainteresować słuchaczy, to nawet najciekawszy temat może się zmienić w kilkugodzinny nudny wykład, z którego ma się ochotę uciec.
D.J. Ciężko odpowiedzieć na takie pytanie, co jest lepsze z tych dwóch rzeczy. Tak na prawdę bez pracy w domu i ciągłego samo-dokształcania, szkolenia zewnętrzne można sobie darować. Szkolenia oczywiście uczą dużo (jeśli są dobre), jednak taką wiedzę trzeba wykorzystywać w praktyce inaczej staje się bezużyteczna.
Czy warto zdobyć najpierw teoretyczne doświadczenie a potem wdrażać je w praktyce ?
S.M. Warto znać teorię, ale z doświadczenia wiem, że programiści dopiero w zetknięciu z praktyką zaczynają ją rozumieć w pełni. Osobiście uważam, że najlepiej zacząć pracować jak najwcześniej i choć na początku możemy nie czuć się zbyt pewnie wśród bardziej doświadczonych kolegów/koleżanek, to jeżeli tylko mamy ochotę, aby się rozwijać, to takie środowisko jest idealne, gdyż gdzie nie spojrzymy, są osoby, od których możemy się czegoś nauczyć.
D.J. Teoria jest dobra i trzeba ją znać. Jednak wszystko zależy od charakteru i predyspozycji danej osoby. Na pewnym poziomie zaawansowania teorii mało się potrzebuje, ale jest ona jednak potrzebna. Całkowicie początkująca osoba bez teorii według mnie nie ma, co podchodzić do programowania, ponieważ nawet nie zacznie.
Jak sprawdza Pan przed zatrudnieniem nowej osoby umiejętności zawodowe danej osoby ?
B.J. Na całe szczęście posiadam fantastycznych ludzi z genialnymi umiejętnościami, którzy uczestnicząc w procesie rekrutacji są w stanie ocenić umiejętności programistyczne. Moim zadaniem jest rozmowa o kwestiach formalnych, jak również opinia na temat osobowości danej osoby – rzecz dla mnie najważniejsza; do moich ludzi zaś należy ocena umiejętności, którą sprawdzamy czy to poprzez pytania, czy to analizę dotychczasowych dokonań, czy w końcu – zadania, o których wykonanie prosimy.
P.R. Jeśli chodzi o sprawdzania potencjalnych kandydatów w grę wchodzą testy, sprawdziany oraz certyfikacja. Spotkałem się z przypadkiem, gdzie pracodawca wolał zatrudnić kogoś w teorii słabszego ale z certyfikatami (mógł się wykazać pracownikiem i zbierał dodatkowe punkty za niego w przetargach).Dziś u programistów zwraca się uwagę na umiejętności miękkie. Programista już nie tylko musi umieć kodować, ale też dogadać się z klientem/pracodawcą itd. Zgadzam się ponadto, że programista nie musi być dobry z matematyki (sam znam wielu takich), jednakże w zadaniach, które wymagają wymyślenia dobrego rozwiązania zdecydowanie lepiej sprawdzają się ci, którzy znają matematykę.
Jakie cechy wyróżniają dobrego programistę ?
S.M. Chęć rozwoju, brak strachu przed nowymi wyzwaniami/problemami, umiejętność ich rozwiązywania, uciekanie od schematów, poszerzanie horyzontów i nieustanne poszukiwanie lepszych rozwiązań, umiejętność
pracy w grupie, chęć i umiejętność dzielenia się wiedzą.
D.J. Ja u swoich pracowników cenię przede wszystkim, zdolność logicznego myślenia i wykorzystywania tego, co już jest do rozwiązywania problemów, a nie budowania wszystkiego od podstaw. Taka osoba powinna umieć zaprojektować rozwiązanie od początku do końca, potrafić je obronić przed przełożonym, jak również słuchać tego, co do niej się mówi. Współpracowałem z wieloma programistami i niestety muszę z przykrością stwierdzić, że dobry programista jest na wagę złota i to „towar” deficytowy. Mój dobry kolega twierdzi, że trzeba się urodzić programistą i albo po prostu się nim jest, albo nie.
B.J. Wydaje mi się – z punktu widzenia pracodawcy i nie – informatyka – że zmysł analityczny, który pozwala szybko ocenić zakres zadania przed programistą stojący oraz czas i nakład pracy nacelowany na realizację określonego zlecenia. Cenię sobie w swoich programistach to, że są w stanie równolegle pracować nad dwoma, trzema realizacjami, które wymagają odrębnego podejścia – zatem ta cecha jest niezbędna podczas pracy w agencji interaktywnej, w przeciwieństwie do dość mozolnego, ale jednak – pracowania nad wielkim systemem, często przez lata, po stronie Klienta.
Jakie kompetencje są kluczowe, aby sprawnie wykonywać powierzone programiście w firmie zadania ?
B.J. W przypadku Grupy Adweb kluczowymi są wiedza i umiejętności, niezbędne do realizacji rozmaitych, wszechstronnych zleceń programistycznych. Jak to bywa w agencji interaktywnej – zamówienia Klientów są różnorakie i każde z nich wymaga indywidualnego podejścia do realizacji – zatem otwartość na różnorodność jest kluczowa w pracy programisty.
Czy programista musi być dobry z matematyki ?
S.M. Posiadanie ścisłego umysłu pomaga. Matematyka to wiele gałęzi, ja osobiście zawsze miałem problemy z analizą matematyczną i tematami pokrewnymi, co mi nigdy nie przeszkadzało. Jednak znajomość i rozumienie logiki z pewnością jest bardzo istotne. Programista nie musi być dobrym matematykiem, ale na pewno nie może to być ktoś, dla kogo ta dziedzina wiedzy jest czymś tajemniczym i „magicznym”.
D.J. Jeśli popatrzeć na samo programowanie, to nie trzeba być orłem z matematyki, aby napisać program. Osobiście uważam, że znajomość matematyki bardzo ułatwia, tak jak w matematyce, tak i w programowaniu trzeba myśleć logicznie, analitycznie. Nie wystarczy nauczyć się kilku wzorów i zdać z danej części egzamin. To coś więcej. Wszyscy, których znam i szanuje, jako programistów, tak się składa, że z matematyką radzą sobie bardzo dobrze.
Czego się dziś uczą programiści ? – spotkałam się w necie ze stwierdzeniem że dziś programowanie sprowadza się do umiejętności wyboru odpowiednich kreatorów i jak ktoś ma dopisać kod z głowy to jest przerażony.
S.M. Co do stwierdzenia, które Pani znalazła, to muszę przyznać, że narzędzia, które teraz programiści mają do dyspozycji bardzo pomagają i rzeczywiście, wiele rzeczy można zrobić w stosunkowo krótkim czasie.
Jednak cechą wspólną tych wszystkich rzeczy jest ich powtarzalność, musi istnieć jakiś wzorzec, część wspólna, aby stworzyć taki „kreator”. Na szczęścia dla nas, programistów, nie wszystko da się stworzyć w ten sposób i logika biznesowa najczęściej musi być implementowana „manualnie”. Czy kogoś to przeraża? Jeżeli tak, to chyba nie jest to zawód dla niego.
Wracając do pytania – czego programiści się uczą? Nowych bibliotek, ponieważ ich znajomość pozwala niekiedy zaoszczędzić mnóstwo czasu, bo nie trzeba „wynajdywać koła na nowo”. Nowych języków, które są zbudowane na podstawie innych paradygmatów programowania, niż te, z którymi mają styczność na co dzień. Pomaga to w patrzeniu na problem z różnych perspektyw. Nowych narzędzi, ponieważ coraz więcej rzeczy można zautomatyzować, a lepiej zaoszczędzić czas spędzany na powtarzanych czynnościach, aby skupić się na rzeczach kreatywnych. Większość programistów, których znam (w tym i ja) uczy się różnych rzeczy, niekoniecznie związanych z ich zawodem. Cały czas poznają i szukają czegoś nowego. Może dlatego, że nie lubimy się nudzić?
D.J. Ciężko mi stwierdzić, czego się dziś uczą. Bardzo trudno jest zatrudnić młodą osobę, która poza tym, że twierdzi, że jest programistą i co to ona nie umie, nic sobą nie reprezentuje a oczekuje wynagrodzenia na poziomie seniora. Jednak zdarzają się na szczęście wyjątki. Jakiś czas temu jak przeprowadzałem rekrutację, udało mi się zatrudnić programistę w wieku 21 lat. O tej osobie mogę z czystym sumieniem powiedzieć, że będzie z niego bardzo dobry programista za parę lat, a w tej chwili od niego mogliby się uczyć starsi. Ta osoba postawiła na rozwiązania mobilne i bardzo dobrze się w nich realizuje. Wyklinanie jakiegoś programu za pomocą kreatorów, nie jest możliwe, oczywiście jeśli mówimy o programie który ma spełniać dane kryteria i realizować bardziej złożoną funkcjonalność. Na studiach nie uczono mnie, używania kreatorów tylko pokazywano jak rozwiązywać poszczególne przypadki. Niestety bardzo niewiele rzeczy sprawdziło się podczas rozwiązywania realnych problemów.
P.R. Programiści często korzystają z generatorów. Nie ukrywam, że w wielu przypadkach się sprawdzają i przyspieszają pracę, ale część albo działa nie do końca dobrze, albo nie generuje wszystkiego (np.: w Symfony 2), albo da się pewne rzeczy rozwiązać lepiej. Także z generatorów trzeba korzystać z rozsądkiem. Zgodzę się również, że tak jak w przypadku ASP.NET MVC4 nie trzeba pisać nawet fragmentu kodu by stworzyć system CMS.
Programiści muszą zatem uczyć się nie tylko nowych bibliotek ale i śledzić konstrukcje językowe i mało tego badać ich wydajność w odniesieniu do konkretnych sytuacji. Jeśli chodzi o języki z przyszłością to HTML5 (HTML+CSS+Java Script), C#, Java, Objective-C, PHP. Nie ma jednego języka do wszystkiego. Do jednych rzeczy lepszy będzie C#, do innych PHP.
Czy uważa Pan że warto wprowadzić w firmie systematyczny system podwyższania kompetencji programistów poprzez delegowanie ich do udziału w szkoleniach ?
B.J. Oczywiście szkolenia, czy udział w spotkaniach branżowych, tudzież konferencjach to sposoby na podwyższanie kompetencji ludzi. W studiu CodeFathers jest to pewnym standardem, przy czym kluczem do decyzji o szkoleniach jest indywidualna rozmowa z wybranym człowiekiem i wsłuchanie się w jego oczekiwania i chęci rozwoju w określonych kierunkach.
Przenieśmy się trochę do przyszłości. Jak Pan myśli jakie języki będą się rozwijać, jakie będą przydatne ? Który z obecnych języków jest najbardziej perspektywiczny ?
S.M. W ostatnich latach popularność zdobywały języki obiektowe i wydaje mi się, że w tym kierunku będą się rozwijały przyszłe języki. Z racji tego, że coraz większa część naszej rzeczywistości jest połączona z Internetem i technologiami, są nam potrzebne języki, które będą w stanie tą rzeczywistość odwzorować w jak najlepszy (najprostszy i najszybszy) sposób.
Przez jakiś czas będą się rozwijały i stawały coraz popularniejsze (co ma miejsce obecnie) języki obiektowe, ale prawdziwy przełom moim zdaniem nie jest kwestią „kolejnego” języka, który pozwala rozwiązać problemy w ten sam/podobny sposób. Prawdziwy przełom przyjdzie wraz z nowym paradygmatem programowania, coś co będzie łatwiejsze w odbiorze dla zwykłego (nie związanego z IT) człowieka.
D.J. Uważam, że bardzo dużą szansę na rozwój ma Html 5, wszystko powoli przenosi się na przeglądarki internetowe i w rozwój tego języka są zaangażowani najwięksi gracze na rynku. Poza tym językiem oczywiście Object-C oraz Java – zatem rozwiązania mobilne na platformę Apple oraz Android.
Czy wybór technologii w programowaniu to sprawa wtórna ? Czy liczy się problem i do niego trzeba dobrać rozwiązanie ?
S.M. Do każdego problemu/projektu należy podchodzić indywidualnie. Wybór „moich ulubionych technologii/języków” może sprawić, że niepotrzebnie wydłużymy swoją pracę oraz koszty stworzenia aplikacji, co bezpośrednio wpływa na zadowolenie klienta.
D.J. Wybór technologii to rzecz najważniejsza, jednak nie zawsze można sobie na to pozwolić. Jeśli mamy taki komfort, że dostajemy zadanie i mamy zaproponować jego rozwiązanie i nie jesteśmy niczym ograniczeni, wtedy możemy wybierać wśród technologii, która będzie najlepiej pasowała do rozwiązania. Jednak to zdarza się bardzo rzadko. Najczęściej firmy mają już pracują już w oparciu o „jakąś” technologię aplikacji i dane rozwiązanie problemu staramy się wpasować w tą technologię. Nie zawsze zmiana technologii jest możliwa, z różnych względów.
Proszę powiedzieć czy dziś programowanie sprowadza się do umiejętności wyboru odpowiednich kreatorów ?
D.J. Niestety nie, a tak na prawdę to bardzo dobrze, że nie. Prawdziwe programowanie to sztuka sama w sobie. Czasem lepiej poświęcić dzień dwa, aby wymyśleć i dobrze zaprojektować a dopiero napisać, niż zacząć pisać od razu. Osobiście nie spotkałem się w swojej historii programowania, aby można było wyklinać rozwiązanie.
Spróbujmy na koniec podejść krytycznie do poszczególnych języków programowania. Czy każdy nadaje się do tworzenia konkretnych aplikacji ?
S.M. Jeżeli tylko sama specyfikacja języka na to pozwala, to grupa doświadczonych programistów byłaby w stanie zaimplementować dowolną aplikację w dowolnym języku. Inna sprawa, że grupa tych samych programistów, gdyby stanęła przed realnym problemem, to wybrałaby język, który w najlepszy i najefektywniejszy sposób pozwoliłby im na realizację zadania.
D.J. Tego nie da się tak określić. Każdy język ma swoje dobre i złe strony. Czasem po prostu nie mamy wyboru. Jeśli chcemy napisać coś na urządzenia mobilne firmy Apple, nie ma żadnego wyboru. Co prawda Apple nie jest już tak rygorystyczne i dopuszcza zewnętrzne kompilatory, jednak to nigdy nie będzie taka, jakość programu jak coś napisanego natywnie.
Na studiach zawsze była grupka ludzi, która kłóciła się nad przewagą Javy nad C++ /C# i odwrotnie. Jeśli mam napisać dany program i mam wybór nad technologią, wtedy zastanawiam się, w czym będzie lepiej, co się nadaje bardziej, a co mniej. Osobiście uważam, że takie języki jak Java, C# uczą młodych programistów niechlujstwa, nikt się nie przejmuje wyciekami pamięci, zarządzaniem kodem, bo wydaje im się że wszystko robi się samo. Oczywiście są w błędzie i ich programy zazwyczaj działają, jednak nie mają dobrej, jakości. Podsumowując uważam, ze prawie dowolny program można napisać w dowolnym języku, wszystko kwestia kryteriów odbioru i czasu, a co za tym idzie i pieniędzy.