Juniors, Praca w IT

Zapłaczmy nad poziomem kształcenia młodych programistów na studiach

komputery

Temat niestety smutny, nawet bardzo. Pominę, że program nauczania jest przestarzały, że materiały mają po dwadzieścia lat i dawno się przeterminowały. Skoncentruję się na przypadkach pochodzących od jednej z elitarnych uczelni warszawskiej — tej, o której marzą studenci informatyki, bo tam to jest poziom, tam to się wyszkolą.

Mariusz Walczak. Tech lead w Softfin. Absolwent Warszawskiej Wyższej Szkoły Informatycznej. Pasjonat inżynierii oprogramowania, swoje aplikacje tworzy w PHP i językach opartych na ES6/7. Prywatnie miłośnik futrzanych czworonogów, oraz winiarstwa i nalewkarstwa. Wszystkie jego teksty znajdziecie pod tym adresem.


Zadanko na ćwiczenia

Jeden z początkujących programistów, któremu pomagam, jest studentem takiej uczelni. Przyszedł do mnie z zadaniem, bo nie bardzo mógł je zrozumieć. Stwierdziłem: dobra, zrobimy je wspólnie, a przy okazji czegoś się nauczysz. Oto zadanie:

Ktoś napisał klasę, która realizuje scenariusz znany z lokalnego warzywniaka. Przychodzi Zenek, który wrzuca do koszyka warzywa (ich cenę znamy z cennika) i idzie z nimi do kasy. Okazuje się, że nie ma tyle pieniędzy, więc kupuje tyle, na ile go stać. Potem Zenek przepakowuje wszystko do reklamówki i opuszcza sklep.

Do tego zadania były uwagi. Jeżeli klientowi zabraknie pieniędzy, nie będzie mógł kupić wszystkiego, co chciał. Co więcej, jeżeli kupi trzy jabłka, a okaże się że stać go tylko na jeden owoc, nie może wtedy kupić żadnego. Kolejny warunek: cennik musi być singletonem.

Śmiech przez łzy rozpaczy

Po pierwsze, nieważne, że singleton został już dawno pochowany w zakamarki pomyłek programistycznych. Jego czas minął, nie stosuje się go już, a wręcz uznaje się go za antywzorzec. Ok, nie czepiajmy się. Przejdźmy do analizy tej klasy, w której nie można wedle treści polecenia nic zmienić. Mój ulubiony fragment z treści zadania:

reklamowkaZenka = new Reklamowka(zenek);

zenek.pakujReklamowke(reklamowkaZenka);

Jak to zobaczyłem, to myślałem, że padnę. Napisała to osoba, która kształci przyszłych programistów. Dla osób, które nie dostrzegły na czym polega błąd, wytłumaczę, to słowami koleżanki, która powiedziała: Włóż do reklamówkiZenka Zenka i spraw, aby Zenek zapakował reklamówkęZenka z Zenkiem w środku. Niby się da, ale po co? Nie znalazłem też żadnego dobrego powodu, aby stosować takie rozwiązanie. Jeżeli już chcielibyśmy być poprawni logicznie, to wystarczyłoby takie coś

reklamowkaZenka = new Reklamowka();

zenek.pakujReklamowke(reklamowkaZenka);

i wtedy jest fantastycznie. W ostateczności, za co bym był tylko trochę zdruzgotany, to utworzenie reklamówki zenka z Zenkiem w środku. Wtedy mógłbym łatwo przekazać wszelkie towary jakie Zenek ma w koszyku do tej reklamówki, choć nie byłoby to zbyt logiczne rozwiązanie.

Kolejną zabawną rzeczą to uproszczenie. Jeżeli Zenka nie stać na dany artykuł, usuń wszystkie artykuły danego typu i dalej nie licz. Kurczę, a o dekrementacji w pętli while to słyszeli?

while((Liczba Jabłek) * cena>(od pozostałej kwoty jaka została Zenkowi)){

     (Liczba jabłek) --;

}

Takie to trudne do ogarnięcia, poważnie? Potem przychodzą ludziska po takiej szkole i uważają, że potrafią wszystko, a jak o coś ich pytamy, to nie wiedzą z czym co się je.

Pójdźmy dalej do nazewnictwa metod. Jak zobaczyłem metodę sumOf, to padłem, sumOf czego się pytam. Podstawa czystego kodu, to nazewnictwo, w zasadzie od tego powinno się zacząć. Jak przeglądałem kiedyś kod gry i widziałem metody, flee, throwStone, attack, to nie zastanawiałem się o co chodzi, ja to wiedziałem. Jak ktoś mi wali metodę sumOf, to nie wiem o co chodzi. Ta sama koleżanka, co ładnie skwitowała reklamówkę Zenka, pokazała jedną metodę doktoranta na AGH.

private String combinePath(long time) {

       Date date = new Date(time);

       SimpleDateFormat formater = new SimpleDateFormat("yy/MM/dd");

       String dateText = formater.format(date);

       return dateText;

   }

No nic, pośmialiśmy się. Zdarzyć się może każdemu, ale to zadanie, o którym mówimy pokazuje młodym niespaczonym umysłom pewną drogę do rozwiązywania problemów i jak się nauczą czegoś takiego, to biada im i nam, bo przyjdzie nam z nimi żyć i uczyć ich wszystkiego od początku.

Przedmioty zapchaj dziury

Na tej samej uczelni jest przedmiot nazwany programowaniem efektywnym. Zastanawiałem się czego tam będą uczyć. Bardzo mnie to intrygowało, jak się okazało uczyli liczenia na kartce, ile będzie wykonywał się dany program. Padłem. Jak już się pozbierałem, to zacząłem się zastanawiać, po co ten przedmiot w programie nauczania? W jakim celu, przecież każdy program odpalony 100 razy skończy w innym czasie, ma na to przełożenie wiele czynników. Jeżeli zaś chodzi o szybkość wykonywania danego algorytmu, to wystarczy policzyć na palcach ilość operacji jakie mają zostać wykonywane. A to czy szybciej się zrobi pętla for, czy while, poważnie nie ma znaczenia.

Doszliśmy do czasów, kiedy praca programisty jest droższa niż sprzęt i zazwyczaj taniej jest dokupić więcej mocy obliczeniowej niż przeorać program, aby działał efektywniej. Dodatkowo wystarczy pamiętać o kilku zasadach i podstawowych błędach, a tego już nie nauczą. Taki student bez problemu będzie wrzucał algorytmy typu n^2 (n kwadrat), wiedząc jak policzyć jego szybkość wykonania, nie rozumiejąc, że trzeba poszukać innej drogi. Może przecież gdzieś urwać iteracje po wszystkim albo coś pofiltrować, ogólnie pokombinować, tak by unikać sytuacji iterowania kilkukrotnie po tej samej kolekcji danych.

Innym fajnym przedmiotem była architektura systemów komputerowych, znów, ciekawe co to? To zależy, jeśli chodzi o ćwiczenia to zamiana z systemów 16 na binarne, dziesiętne, poznawanie różnych zapisów, na BCM, ósemkowych. Ogólnie studenci mają mnóstwo liczenia na wykładach, ale dowiadują się też jak działa komputer od strony systemu operacyjnego. To jedyna rzecz jaka się przydaje. Wykłady rozumiem, natomiast ćwiczenia są totalnie bez sensu. A powinni uczyć młodych adeptów, jak używać flag, semaforów, co to asynchroniczność, jak wygląda projektowanie systemów informatycznych, oraz wielu przydatnych rzeczy.

Miałem wielki fart

Takich przedmiotów mógłbym wymienić wiele. Muszę jednak przyznać, że na mojej uczelni, czyli WWSI takich niepotrzebnych przedmiotów jest naprawdę mało. Większość z nich wynika z bloku humanistyczno, ekonomiczno, społecznego, ale i w tym przypadku podstawowa wiedza jest potrzebna, aby nie być troglodytą. Co prawda bywały takie przedmioty, które do niczego nie służyły, ale było ich naprawdę mało. Mi podobało się przede wszystkim praktyczne podejście, oraz to, że prowadzący przedmioty techniczne wymagali myślenia, co mnie wiele nauczyło.

Dlaczego młodzi idą na uczelnie informatyczne, które są zacofane?

Mam pewną teorię, ludzie idą tam, gdzie są autorytety, a co może być wyższym autorytetem niż uznany w społeczności naukowej jegomość z tytułem, który odbierał z rąk prezydenta RP? No właśnie. Nasi rodzice i dziadkowie, nie mogli tak łatwo jak my teraz zdobyć wykształcenia wyższego i pracować w zawodzie. Inżynierów było stosunkowo mało, tamtejsza władza kazała iść do pracy każdemu, nie było takich możliwości jak teraz. Większość naszych rodziców nie miało doświadczenia jak to ze studiami jest. Wiedzieli tylko, że studia i tytuł dają przepustkę do wspaniałej przyszłości, bo tak było za ich czasów. Dodatkowo kierunki jakie wtedy były dostępne, były kierunkami, które w większości podstawy mają niezmienne od kilkuset lat, bo jak działa mechanika nie zmieniło się i nie zmieni się długo. Co prawda są nowe silniki, nowe metody wytwarzania materiałów, ale umówmy się, że liczenie jego wytrzymałości jest niezmienne od kilkudziesięciu lat…

Z informatyką jest inaczej, jest to jeden z bardziej rozwijających się kierunków w obecnym czasie. Zaczynam od programowania strukturalnego, pamiętam te ściany kodu, bez klas, niczego, tylko kod i słynna metoda goto, a teraz nie dość, że pracuję w metodologiach zwinnych, to jeszcze stosuję zasady SOLID, które zrównały z ziemią wiele zasad z lat poprzednich. Języki programowania są też teraz bardziej skomplikowane, to już nie jest warunek, pętla, zmienna, funkcja, to byłoby zbyt piękne…

Profesorowie się nie uczą

Ludzie poświęcający się nauce nie zmienili się, bo nie mają takiego impulsu. Przepraszam, że generalizuje, ale większość tak niestety robi: dochodzi do jakiegoś punktu w swoim życiu, zdobywa upragniony tytuł, robi swoje badania i zamyka się na całą resztę. Dodatkowo za karę prowadzi zajęcia ze studentami, bo przerywają mu jego badania i jeszcze marudzą. Co więcej, nie dziwie im się, jak proszą mnie o pomoc młodzi adepci rzemiosła programistycznego i wiedzę ich podejście, to im dziękuję. Nie biorę za to żadnych pieniędzy, nikt nie robi moich projektów, ogólnie, szkole, bo lubię i tyle, a oni jeszcze zaczynają ode mnie wymagać, abym był dostępny 24/7, abym dawał łatwiejsze zadania, są wiecznie nieprzygotowani i nie potrafią nic, a co gorsza nie chcą umieć. Chcą cudu, że machną myszką i dostaną moją wiedzę i 15K na fakturze, co miesiąc od pracodawcy. Także drodzy pracownicy uczelni wyższych: rozumiem was.

Wracając do tematu, profesorowie nie aktualizują swojej wiedzy, nie mają podejścia praktycznego, oni teoretyzują. Miałem fart, że wszyscy prowadzący ćwiczenia z przedmiotów technicznych, pracowali. Jak człowiek pracuje, to aktualizuje swoją wiedzę, widzi co jest przydatne co nie, dodatkowo wie jak wyglądają projekty komercyjne, gdzie jest napięty grafik, gdzie nagle nie ma czasu zrobić czegoś idealnie i trzeba coś gdzieś ciąć. Tacy ludzie mogą przekazać naprawdę przydatną wiedzę w zawodzie.

Niestety jak ktoś się poświęci rozwojowi naukowemu, zazwyczaj traci to poczucie, w nauce jako takich terminów nie ma, potrzebna jest szczegółowa wiedza teoretyczna. Tworzenie nowych algorytmów i wyznaczania ich czasu wykonywania, nie ma miejsca w praktyce, w praktyce tworzymy algorytm, puszczamy co najwyżej metodę sprawdzającą obciążenie systemu sprawdzamy, czy będzie w porządku na środowisku wykonawczym i wystarczy.

Reasumując

Prestiż uczelni wyznaczany jest przez kadrę oraz poziom nauczania. Niestety przedmioty ważne są słabo tłumaczone i uczą błędnego myślenia, a przedmioty nieważne są mocno eksploatowane. Profesorowie uczą rzeczy dawno przeterminowanych, dodatkowo popełniają wiele błędów, jakie w projektach komercyjnych byłby gwoździem do trumny. Studenci też nie są bez winy, studia to tylko drogowskaz, ale przez tę drogę musicie przejść sami. Jak ktoś chce abym wsadził was na wózek i nią przebiegł, to wybaczcie, ale tak to nie działa.

Teraz prośba do rodziców: nie patrzcie na prestiż studiów, zapytajcie ilu profesorów pracuje w jakiś firmach, im więcej tym lepiej. Tytuł profesora zdobywa się ciężko, ale na teorii, która w codziennym życiu się nie przydaje, jest ona niezbędna przy badaniach naukowych i szukaniu rozwiązań do zagadnień teoretycznych. W normalnej pracy tego nie ma. Liczą się inne umiejętności i Ci wykładowcy, którzy pracują na co dzień w zawodzie, wiedzą o tym aż za dobrze. Im wcześniej wasza latorośl złapie poprawne podstawy życia projektowego i pisania aplikacji, tym będzie lepszym programistą w przyszłości.


Tym, którzy zastanawiają się nad tym, czy warto studiować — polecamy naszą devdebatę, w której udział wzięli doświadczeni developerzy. Dowiecie się z niej o tym, co seniorzy myślą na temat studiów informatycznych i czy poszliby na nie jeszcze raz.

Zdjęcie główne artykułu pochodzi z pexels.com.

Podobne artykuły

[wpdevart_facebook_comment curent_url="https://geek.justjoin.it/zaplaczmy-nad-poziomem-ksztalcenia-mlodych-programistow-studiach/" order_type="social" width="100%" count_of_comments="8" ]