Niebezpieczne Java-Szkoły

Oryginalny post: The Perils of JavaSchools

Autor: Joel Spolsky

Leniwe dzieciaki.

Gdzie się podział kult ciężkiej pracy?

Niewątpliwą oznaką mojego starzenia się jest biadolenie i zrzędzenie, jaka to beznadziejna jest "ta dzisiejsza młodzież". Jeśli coś wymaga od nich wysiłku, to im się nie chce albo nie potrafią.

"Byłeś szczęściarzem. My to przez trzy miesiące musieliśmy mieszkać w pojemniku septycznym wyściełanym zwykłym kartonem. Musieliśmy wstawać o szóstej rano, czyścić karton, jeść twardy jak kamień chleb i gonić do pracy przy młynie, dzień w dzień, po czternaście godzin, a gdy wracaliśmy do domu, ojciec tulił nas do snu przy pomocy paska." — Latający Cyrk Monty Pythona, Four Yorkshiremen

Gdy ja byłem dzieckiem, uczyłem się programować na kartach perforowanych. Jeśli zdarzyło Ci się popełnić jakiś błąd, nie miałeś do dyspozycji żadnych nowoczesnych ficzerów, takich jak na przykład klawisz Backspace. Musiałeś wyrzucić kartę i zacząć od nowa.

Gdy w roku 1991 zaczynałem przeprowadzać rozmowy kwalifikacyjne z programistami, zazwyczaj pozwalałem im wybrać język programowania, w którym chcieliby rozwiązać postawiony przed nimi problem. 99% z nich wybierało język C.

W obecnych czasach wybierają Javę.

Nie zrozumcie mnie źle: Java, jako język stosowany w praktyce, jest całkiem w porządku.

Chwila, chciałbym inaczej sformułować tę myśl. Nie twierdzę wcale, w tym konkretnym artykule, że z Javą, jako językiem stosowanym w praktyce, jest coś nie tak. Z Javą wiele rzeczy jest nie w porządku, ale to musi poczekać na kolejny artykuł.

Twierdzę natomiast, że Java, generalnie, nie jest wystarczająco trudnym językiem, by móc go użyć do odróżnienia programisty przeciętnego od wybitnego. Być może jest to język, w którym wygodnie się pracuje, ale nie to jest dzisiejszym tematem. Mógłbym nawet pójść dalej i powiedzieć, że to, że Java jest stosunkowo łatwym językiem, to ficzer, a nie bug. Ale nie zmienia to faktu, że problem, o którym wspomniałem, wciąż istnieje.

Być możę zabrzmię trochę arogancko, ale moje skromne doświadczenie nauczyło mnie, że na uczelniach, na których wykłada się informatykę, tradycyjnie są dwa zagadnienia, ktorych wiele osób nigdy nie będzie w stanie w pełni pojąć: wskaźniki i rekurencja.

Na studiach dosyć szybko zaczynasz mieć do czynienia ze strukturami danych -- listami połączonymi, tablicami haszującymi itp. Bez wskaźników ani rusz. Tego typu przedmioty często służą do selekcji pierwszoroczniaków: są tak trudne, że każdy, kto nie jest w stanie podjąć umysłowego wyzwania, w końcu się poddaje. I dobrze. Jeśli sądzisz, że wskaźniki są trudne, poczekaj, aż przyjdzie Ci udowodnić coś w teorii punktu stałego.

Historia wielu dzieciaków, którym w liceum dobrze szło programowanie w BASICu kolejnych wersji Ponga, jest taka, że po pójściu do koledżu, zapisaniu się na przedmiot CompSci 101 (struktury danych) i zetknięciu ze wskaźnikami, ich mózgi zwyczajnie eksplodują. Nawet się nie spostrzeżesz, gdy okazuje się, że decydują się jednak skończyć nauki polityczne, bo ten kierunek wydaje im się lepszym pomysłem. Widziałem wiele statystyk pokazujących liczbę studentów, którzy rezygnują ze studiów informatycznych. Zazwyczaj oscylują one w granicach 40% - 70%. Uniwersytety mają skłonność do widzenia tego jako jakiejś straty; Ja z kolei uważam, że to po prostu niezbędny odsiew ludzi, którzy nie byliby szczęśliwi, bądź nie odnieśliby sukcesu, jako programiści.

Innym przedmiotem, sprawiającym wiele trudności młodym studentom informatyki, był ten przedmiot, na którym uczono programowania funkcjonalnego (również programowania rekurencyjnego). MIT postawiło wysoką poprzeczkę, tworząc obowiązkowy kurs (6.001) i wydając podręcznik (Structure and Interpretation of Computer Programs, Abelson & Sussman). Na wielu topowych uczelniach informatycznych używano ich jako de facto wprowadzenia do informatyki. (Masz możliwość, i powinieneś, obejrzeć online starszą wersję tych wykładów.)

Poziom trudności tych kursów jest zdumiewający. Na pierwszym wykładzie poznajesz właściwie wszystko na temat języka Scheme i przedstawiają Ci funkcję z punktem stałym, która na wejściu bierze inną funkcję. Gdy sam walczyłem z tym przedmiotem na Uniwersytecie w Pensylwanii, widziałem jak wielu, jeśli nie większość, studentów po prostu nie dawała rady. Materiał był za trudny. Napisałem wtedy długiego, rzewnego maila do profesora, w którym żaliłem się, że to Nie W Porządku. Ktoś na uniwersytecie musiał mnie posłuchać (albo jednego z innych narzekających), ponieważ teraz, przy prowadzeniu tego kursu, używa się Javy.

Żałuję, że posłuchali.

Myślisz, że się nadajesz? Sprawdź się!

W tym tkwi problem. Lata narzekań leniwych studentów wraz z zarzutami ze strony przemysłu, jak to mało jest absolwentów informatyki, dały się we znaki i w ostatniej dekadzie spora liczba dobrych uczelni całkowicie przerzuciła się na Javę. Super, rekruterom, którzy używają "grepa" do filtrowania życiorysów, to się podoba, i, co najlepsze, żaden aspekt Javy nie jest na tyle trudny, by można było odsiać tych programistów, którzy nie posiadają części mózgu odpowiadającej za wskaźniki i rekurencję, więc statystyki rezygnacji są niższe, a wydziały informatyki mają więcej studentów, wyższe budżety, i wszystko idzie dobrze.

Tym szczęściarzom z Java-Szkół nigdy nie będzie dane zobaczyć dziwnych segfaultów podczas próby implementacji tablic haszujących za pomocą wskaźników. Nigdy nie będą rwać sobie włosów z głowy podczas prób upakowania czegoś w jak najmniejszej liczbie bitów. Nigdy nie będą musieli wytężać swoich umysłow, aby zrozumieć jak to jest, że w czystym języku funkcjonalnym, wartość zmiennej nigdy się nie zmienia, a jednak zmienia się cały czas. Paradoks!

Nie potrzebują tej części mózgu, aby dostać 4 z obrony.

Czy nie jestem przypadkiem jednym z tych staroświeckich maruderów, jak w Four Yorkshiremen, przechwalających się, jakim to twardym trzeba było kiedyś być, żeby to wszystko przetrwać?

Cholera, w roku 1900 łacina i greka były obowiązkowe w koledżu, nie dlatego, że były do czegoś potrzebne, ale dlatego, że uważało się ich znajomość za całkiem oczywistą wśród wykształconych ludzi. W pewnym sensie moje argumenty nie róźnią się niczym od tych przedstawianych przez zwolenników łaciny (wszystkich czterech). "[Łacina] ćwiczy umysł. Ćwiczy pamięć. Rozszyfrowywanie łacińskich zdań jest doskonałym ćwiczeniem myślenia, prawdziwą intelektualną zagadką, oraz dobrym wprowadzeniem do logicznego myślenia.", pisze Scott Barker. W dzisiejszych czasach ciężko jednak znaleźć jakiś uniwersytet, na którym nauka łaciny byłaby wymagana. Czy wskaźniki i rekurencja są łaciną i greką informatyki?

Przyznaję, że programowanie z użyciem wskaźników nie jest potrzebne w 90% kodu pisanego w dzisiejszych czasach, byłoby to wręcz niebezpieczne w kodzie produkcyjnym. W porządku. A programowania funkcjonalnego nie używa się za wiele w praktyce. Zgoda.

Jednakże są to rzeczy ważne, gdy chce się brać udział w niektórych z najbardziej ekscytujących projektów programistycznych. Przykładowo, bez wskaźników nigdy nie będziesz w stanie pracować nad jądrem Linuksa. Nie zrozumiesz nawet jednego wiersza kodu Linuksa (ani żadnego innego systemu operacyjnego) bez dogłębnego zrozumienia wskaźników.

Bez zrozumienia programowania funkcjonalnego nie wymyślisz MapReduce, algorytmu, który sprawia, że infrastruktura Google jest tak skalowalna. Pojęcia Map i Reduce pochodzą od Lispa i ogólnie od programowania funkcjonalnego. Koncepcja MapReduce, patrząc z perspektywy czasu, powinna być trywialna dla każdego, kto ze studiów pamięta, że programy napisane w czystym języku funkcjonalnym nie mają efektów ubocznych i dzięki temu łatwo da się je zrównoleglić. Sam fakt, że to w Google, a nie w Microsofcie, wynaleziono MapReduce, po części tłumaczy, dlaczego Microsoft wciąż męczy się z implementacją najprostszych funkcjonalności dotyczących wyszukiwania, podczas gdy Google zajął się już kolejnym problemem: budową Skynetu^H^H^H^H^H^H - największego na świecie równoległego superkomputera. Sądzę, że Microsoft nie zdaje sobie sprawy, jak daleko jest w tyle.

Poza dostrzegalnym na pierwszy rzut oka znaczeniem wskaźników i rekurencji, ich prawdziwą wartością jest to, że sama nauka o nich daje Ci pewną elastyczność umysłową, niezbędną, aby budować duże, skomplikowane systemy; Wymagają tej mentalnej postawy, która sprawia, że udaje Ci się uniknąć odsiewu na pierwszym roku studiów. Wskaźniki i rekurencja wymagają umiejętności rozumowania, abstrakcyjnego myślenia oraz, co najważniejsze, spojrzenia na problem na wielu poziomach abstrakcji równocześnie. Tak więc zdolność rozumienia wskaźników i rekurencji jest bezpośrednio skorelowana ze zdolnością bycia ponadprzeciętnym programistą.

Fakt ukończenia Java-Szkoły nie ma w sobie nic, co pozwoliłoby od razu rozpoznać absolwentów, którym brakuje umysłowej zwinności pozwalającej zajmować się tymi koncepcjami. Jako pracodawca zauważyłem, że Java-Szkoły zaczynają produkować wielu absolwentów, którzy nie są na tyle bystrzy, by móc pracować w zawodzie programisty nad czymkolwiek bardziej skomplikowanym niż Kolejna Javowa Aplikacja Dla Księgowości, chociaż udało im się jakoś prześlizgnąć przez ten nowy, mocno uproszczony program studiów. Tym studentom nigdy nie udałoby się przetrwać kursu 6.001 na MIT czy CS 323 na Yale, i szczerze mówiąc, jest to jeden z powodów, dla którego ja, jako pracodawca, znacznie bardziej cenię dyplom z MIT czy Yale niż z Duke, które ostatnio całkowicie przerzuciło się na Javę, czy Penn, gdzie na kursie, który nieomal zabił mnie i moich znajomych (CSE121), języki Scheme i ML zastąpiono Javą. To nie tak, że nie chcę zatrudniać bystrzaków z Duke czy Penn -- chcę -- ale jest mi zdecydowanie trudniej ocenić, którzy to są. Kiedyś mogłem ich odróżnić, ponieważ Ci bystrzy potrafili przeanalizować rekurencyjny algorytm w kilka sekund albo zaimplementować funkcje operujące na listach połączonych tak szybko, jak tylko umieli pisać na tablicy. W przypadku absolwenta Java-Szkoły, nie wiem, czy nie radzi on sobie z tymi problemami dlatego, że jest niedoedukowany, czy też może dlatego, że nie posiada on tej wyjątkowej części mózgu, której potrzebuje, by móc ponadprzeciętnie wykonywać swoją pracę jako programista. Paul Graham nazywa ich Blub Programmers.

Fakt, że Java-Szkoły nie odsiewają tych studentów, którzy nigdy nie będą znakomitymi programistami, jest wystarczająco przygnębiający. Uczelnie mogą powiedzieć, że to nie ich problem. Przemysł, a przynajmniej rekruterzy, będący zwolennikami grepa, wydają się być zadowoleni z tego, że uczy się Javy.

Ale Java-Szkoły odnoszą także porażkę, nie ćwicząc umysłów studentów, by byli oni na tyle biegli, sprawni i elastyczni, by dobrze projektować oprogramowanie (i nie mam tutaj na myśli projektowania obiektowego, gdzie spędzasz niezliczone godziny na przepisywaniu kodu, aby przetasować hierarchię klas albo zamartwiasz się fałszywmi "problemami" w rodzaju has-a vs. is-a). Potrzebujesz treningu w myśleniu na wielu poziomach abstrakcji równocześnie, taki rodzaj treningu jest właśnie tym, co pozwoli Ci tworzyć znakomite architektury oprogramowania.

Być może zastanawiasz się, czy nauka programowania obiektowego (OOP - Object-Oriented Programming) jest w stanie zastąpić wskaźniki i rekurencję pod względem zdolności odsiewowej. Szybka odpowiedź: nie. Nie wdając się zbytnio w szczegóły, programowanie obiektowe nie jest wystarczająco trudne, aby odsiać przeciętnych programistów. Nauka programowania obiektowego w szkołach sprowadza się zazwyczaj do wkuwania pojęć w rodzaju "enkapsulacja" czy "dziedziczenie" i rozwiązywania testów wielokrotnego wyboru na temat różnic pomiędzy polimorfizmem i przeciążaniem. Będąc niewiele bardziej wymagającym niż zapamiętywanie znanych dat i nazwisk na lekcjach historii, programowanie obiektowe nie stanowi adekwatnego wyzwania umysłowego, aby odstraszyć pierwszoroczniaków. Gdy męczysz się z jakimś problemem z dziedziny programowania obiektowego, twój program ciągle działa, może jedynie być trudniejszy w utrzymaniu. Powiedzmy. Ale gdy walczysz ze wskaźnikami, a Twój program powoduje błąd segmentacji, nie masz pojęcia, czym to jest spowodowane, dopóki nie zatrzymasz się, nie weźmiesz głębokiego oddechu i naprawdę nie postarasz się zmusić swojego umysłu do pracy na dwóch różnych poziomach abstrakcji równocześnie.

A tak na marginesie, specjalnie ośmieszam tutaj rekruterów korzystających z grepa. Nie spotkałem nigdy nikogo, kto znałby Scheme, Haskella i C, a kto nie potrafiłby opanować Javy w dwa dni i tworzyć w niej lepszy kod niż ludzie z pięcioletnim doświadczeniem w Javie, ale spróbuj wytłumaczyć to przeciętnemu trutniowi z HR.

Co w takim razie z misją wydziałów informatyki? To nie są zawodówki! Ich celem nie powinno być nauczanie ludzi, jak pracować w przemyśle. To zadanie szkół pomaturalnych albo programów rządowych dla pracowników zmuszonych do przekwalifikowania się. Uczelnie powinny oferować studentom podstawowe narzędzia na całe życie, a nie przygotowywać ich do pracy przez kilka pierwszych tygodni. Prawda?

Informatyka to dowody (rekurencja), algorytmy (rekurencja), języki (rachunek lambda), systemy operacyjne (wskaźniki), kompilatory (rachunek lambda) -- chodzi mi o to, że taka Java-Szkoła, na której nie wykłada się C ani Scheme, tak naprawdę nie uczy również informatyki. Jakkolwiek bezużyteczne w prawdziwym świecie może wydawać się pojęcie rozwijania funkcji (ang. function currying), to jego znajomość powinna być oczywistym wymogiem dla absolwentów informatyki. Nie mogę zrozumieć, dlaczego profesorzy, którzy biorą udział w ustalaniu programu studiów, zgodzili się na takie uproszczenia, które w rezultacie sprawiają, że uczelnie nie są w stanie produkować programistów zdolnych do wykonywania swojego zawodu. Co więcej, nie są nawet w stanie wyprodukować absolwentów, którzy podejmą studia doktoranckie a w przyszłości powalczą o tytuły profesorskie. Chwila. Nieważne. Może jednak rozumiem.

Właściwie to jeśli cofnąć się w czasie i przyjrzeć dyskusjom toczonym w środowiskach akademickich podczas Wielkiego Przewrotu Javowego, można zauważyć, że największym zmartwieniem było to, czy Java jest wystarczająco prostym językiem, aby używać go w celach dydaktycznych.

Mój Boże, pomyślałem, oni chcą pójść jeszcze dalej z tym upraszczaniem programu studiów! Może powinniśmy podawać studentom wszystko na tacy? Niech asystenci zdają za nich egzaminy. Jak ktokolwiek ma się czegoś nauczyć, jeśli program studiów został starannie zaprojektowany w taki sposób, aby uczynić wszystko łatwiejszym niż jest? Zdaje się, że w planach jest nawet utworzenie specjalnej grupy zadaniowej, której celem miałoby być opracowanie podzbioru Javy, którego używano by do nauczania studentów i stworzenie dokumentacji ukrywającej cały ten bajzel EJB/J2EE przed ich wrażliwymi umysłami, dzięki czemu nie musieliby zaprzątać swoich małych główek tymi wszystkim klasami, niepotrzebnymi do rozwiązania i tak coraz łatwiejszych zadań informatycznych.

Najzabawniejszym wytłumaczeniem, dlaczego wydziały informatyki są tak skłonne do upraszczania swoich programów nauczania, jest to, że dzięki temu mają więcej czasu na naukę naprawdę istotnych koncepcji informatycznych, że nie muszą marnować dwóch wykładów na wyjaśnianie studentom różnicy między javowym słowem kluczowym int a klasą Integer. Cóż, jeśli istotnie tak jest, to kurs 6.001 ma dla nich idealną odpowiedź: Scheme, dydaktyczny język tak prosty, że bystrym studentom można wyłożyć go w ciągu 10 minut; potem cały semestr można poświęcić na teorię punktu stałego.

Heh.

Wracam do zer i jedynek.

(Miałeś jedynki? Szczęściarz z ciebie! My mieliśmy tylko zera.)

Data publikacji oryginału: grudzień 29, 2005

54 komentarze:

Anonimowy pisze...

No koleś mnie normalnie rozwalił. Teraz przede wszystkim liczy się wydajność - umiejętność zrozumienia wskaźników i rekurencji jako atrybutu wyróżniającego zdolniejszych od motłochu świadczy o niedocenianiu znaczenia ważniejszych atrybutów jakimi jest np. biegłość w projektowaniu z użyciem UML, projektowanie obiektowe, projektowanie aspektowe, projektowanie komponentowe itp. oraz komunikacja
Osoba czująca wspomniane zagadnienia będzie według mnie dużo bardziej produktywna. Być może taka osoba nie wymyśli szybszego algorytmu wyszukującego dla Googla, ale szybko, sprawnie i tanio zbuduje duży system, który będzie działał przez długi czas sprawnie obsługując swoich użytkowników.
Wyśmiewanie rzemieślników, tak nie bójmy się tego określenia i gloryfikując "naukowców" zapomina o najważniejszym - o celu studiów -> wyprodukowania jak największej liczby rzemieślników mogących sprawnie ruszyć w kraj aby wykorzystując informatykę usprawnić pracę innych.

Anonimowy pisze...

JS uważa, że kto zrozumie wskaźniki i rekurencje lepiej sobie poradzi z tymi innymi biegłościami które wymieniasz jako ważniejsze w praktyce.

Ale w praktyce to działa jeszcze trochę inaczej - bardziej zdolni trafiają na lepsze studia, na których są też i owe "wskaźniki". Na studiach z gorszym poziomem studentów przestają uczyć "wskaźników", bo też uważają że niepotrzebne, a studenci nie łapią. W efekcie to że nieznana ci osoba nie słyszała o wskaźnikach zwiększa szanse że należy do tych mniej zdolnych.

Anonimowy pisze...

Do "produkowania" rzemieślników jest szkoła zawodowa lub terminowanie u majstra. Studia natomiast powinny dawać narzędzia do samorozwoju i samokształcenia, otwierać oczy na nowe rodzaje podchodzenia do problemu, wymuszać (czemuż by nie za pomocą wskaźników?) wykazanie się umiejętnością analitycznego myślenia.

Popieram autora artykułu. Ale wydaje się że jemu nie chodzi o to że jak piszesz w Javie to jestes leszczem, a jak znasz się na wskaźnikach to jesteś guru. Chodzi o to że skandalem jest, że absiolwenci nie znaja się na wskaźnikach. Istnieje wobec tego spore ryzyko że nie poradzą sobie tez z projektowaniem dużego systemu.

Informatyka to nie tylko UML i Java (pozwolę sobie taką metaforą ująć wysokopoziomowe rozwiązania) gdyby tak było studia nazywałyby się "programowanie dla zastosowań komercyjnych". Jeśli nazywają się informatyą to ma być tam również miejsce nie tylko na wskaźniki ale i na przynajmniej semestr jakiegoś asemblera.

Anonimowy pisze...

@pierwszy Anonimowy
Jeśli sądzisz, że uczelnie są w stanie wykształcić rzemieśliników, to grubo się mylisz. Takie rzeczy jak wymieniłeś można nabyć dopiero w pracy, bo uczelnia nie potrafi symulować szeroko pojętych biznesowych okoliczności tworzenia oprogramowania. Na uczelni mogą przedstawić UML, zrealizować jakiś projekt akademicki.

Natomiast nauczanie rachunku lambda, tw. o punkcie stałym jest możliwe tylko na uczelni, a jest tio bardzo rozwijające. Chyba tylko ktoś, kto przez to nie przeszedł nie przyzna autorowi racji.

Anonimowy pisze...

Stary zapierdziały informatyk z Ciebie...Pieprzysz jak nauczyciel

Anonimowy pisze...

Rachunek lambda i cała teoria informatyki wcale nie są takie niepraktyczne. Ciekawe ilu "zawodowych" programistów wyszkolonych w Javie potrafi wytłumaczyć jak tak naprawdę działa tam polimorfizm parametryczny.
Poza tym, jak to powiedział kiedyś mój wykładowca o sensie nauczania języków funkcyjnych, "nawet jeśli studenci po moim przedmiocie już nigdy nie napiszą choćby jednej linijki w Haskellu, to ich programy w Javie nie będą wyglądały tak samo".
Ciekawi mnie ile jest w Polsce kierunków informatycznych, na których można nauczyć się rachunku lambda i teorii punktu stałego? Ja wiem o 3 (UW, UWr, UJ) i niezmiernie mnie cieszy, że mogę na jednym z nich studiować, ale może nie jest tak źle i są jeszcze inne takie uczelnie?

Anonimowy pisze...

Na UMCS w Lublinie uczą Scheme'a i podstaw rachunku lambda :)

Darek pisze...

na MIM UW takie rzeczy jak wskaźniki traktowane były jak podstawy. nikt nie robił z tego wielkiego halo. Każdy pierwszo, czy drugo-roczniak musiał przejść przez Algorytmikę gdzie zaawansowane algorytmy operujące na rozmaitych strukturach wskaźnikowych to był chleb powszedni. Ale nikt nie traktował tego jak testu na inteligencję, tylko jako alfabet informatyki.
Po kilku latach, zatrudniając programistów nie pytam nikogo co wie o wskaźnikach. Nie uważam że to aż takie ważne.
No ale poziom edukacji w USA zawsze było "inny" od polskiego więc może darujmy sobie takie porównania bo chyba nie mają sensu

koziołek pisze...

Coś w tym jest co piszesz. Z drugiej strony...

No tak. Przemysł żąda dostarczania mu wysoko wykwalifikowanej kadry informatycznej, która może i nie ma pojęcia o rekurencji i wskaźnikach, ale potrafi pracować na skalę przemysłową. Informatyka jest nauką. Nauka wymaga od studenta by ten opanował pewien zakres materiału. Jednakże na tą naukę łoży pieniądze przemysł, który chce mieć ludzi rozumiejących zagadnienia z zakresu produkcji oprogramowania, posiadających wystarczająco dobry warsztat by móc pracować wydajnie i szybko. Przemysł wymaga, przemysł płaci, przemysł musi otrzymać i nie możesz tego negować. W przeciwnym wypadku cały ten "bajer" komputerów cofnie się do czasów z przed Apple II, gdzie komputer osobisty nie był nikomu potrzebny.
Należy tu jasno podkreślić, że istnieje różnica pomiędzy Informatyką, a Inżynierią Programowo-Sprzętową. Niestety język potoczny jest zbyt przywiązany do określenia informatyk w odniesieniu do wszystkich osób pracujących w branży IT.
Jest jeszcze inny aspekt, który pojawia się na tych złych java-uczelniach, które kształcą niedouczonych klepaczy. Otóż poza nauka programowania komputerów za pomocą narzędzi wysokiego poziomu bardzo często prowadzone są w formie obowiązkowej zajęcia "odchamiacze". Ja wybrałem kiedyś kurs rachunkowości. Dziś siedząc przed zadaniem napisania "Kolejnej Javowej Aplikacji Dla Księgowości" będę wiedział nie tylko jak zabrać się do tego od strony technicznej, ale też prawnej. Będę wiedział gdzie szukać informacji i za ich pomocą będę wstanie sprawdzić czy przedstawiony proces biznesowy jest prawidłowy.
Czy wskaźniki będą mi do tego potrzebne? Podejrzewam, że nie.
"Przyznaję, że programowanie z użyciem wskaźników nie jest potrzebne w 90% kodu pisanego w dzisiejszych czasach, byłoby to wręcz niebezpieczne w kodzie produkcyjnym."
Niebezpieczeństwo leży nie w tym co piszemy, ale w tym, że komputer nie jest już to poczciwa Odra, którą można było naprawić młotkiem. Komputer nie liczy dziś kolejnego miejsca po przecinku w liczbie PI, ani nie próbuje znaleźć bozonu higgsa. Współczesny komputer 99% swojego czasu poświęca na liczenie pieniędzy. Dzisiejszy "informatyk" musi w znacznie większym stopniu rozumieć zasady rządzące przemysłem i biznesem niż kiedyś.
Dlatego też widzę podstawowy błąd, który popełniłeś w całym swoim rozumowaniu. Nie rozdzielasz funkcji Informatyka-naukowca i Informatyka-praktyka. Ten drugi ma mniejszą wiedzę niż ten pierwszy, ale zazwyczaj to ten drugi sponsoruje badania pierwszego. Wymaga, płacąc za badania, dostarczania rozwiązań, które pozwolą na zarabianie pieniędzy. Niestety wyszliśmy już z naszych jaskiń w uczelniach i czas pieniądze, które w nas zainwestowano zwrócić. Niech nawet ta księgowa ma swoją durną aplikację. Ona za nią zapłaciła już dawno temu sponsorując ze swoich podatków nasze studia.

Pozdrawiam.

Anonimowy pisze...

Cieszę się, że autor rozumie rekurencję i wskaźniki. Szkoda tylko, że reklama googli przy dodawaniu komentarza pod operą 10 wchodzi na obrazek który trzeba przepisać....

Anonimowy pisze...

Odnoszę wrażenie, szanowny autorze, że zazdrościsz aktualnym studentom ich dużo prostszej i łagodniejszej ścieżki to bycia informatykiem. Jednak nie zapominaj o tym, że wszyscy powinni iść z biegiem czasu, nawet uczelnie, które tak jak i pozostałe firmy powinny stawiać na ilość, a nie na jakość. Może i większość studentów po informatyce to tak zwany bubel, który potrafi jedynie napisać jakąś webaplikację w Javie, PHPie czy innym wytworze współczesności, ale jest to bubel na miarę naszych czasów i możliwości. Fakt, nie wiedzą co to wskaźnik... ale po co im to? - niech sobie tworzą te swoje klasy i żyją w błogiej nieświadomości!

Anonimowy pisze...

Zwykłe zrzędzenie. Gdyby każdy miał takie podejście jak autor to do dzisiaj trzeba by było klepać kod w asemblerze. Na Politechnice Częstochowskiej (WIMiI) wskaźniki były zaliczone do podstaw programowania. Jakoś bez większego problemu to zdałem i wcale nie czuje się super inteligentny. Wystarczy to zrozumieć. Scheme miałem w IV semestrze, programowanie niskopoziomowe w III. Materiał opanowałem ale i tak wolę pisać w C#. Dlaczego? Bo jaki jest sens pisania kilkunastu linijek kodu (które i tak wiem jak działają) skoro mogę zrobić to jedną?

To jak by chodzić z buta poboczem zamiast jechać autem po trasie ;) Jedni wolą całe życie pod górkę ale fakt faktem trzeba zarabiać więc ja wolę zarabiać nie wysilając się za bardzo.

Anonimowy pisze...

Tandetny tekst starego impotenta, przeczytałem kiedyś jakieś jego ksiązka gada w miare rozsądnie ale jak na programiste jest bardzo ograniczony sam napewno wybitnym programistą nie jest poza bugtrackerem to potrafi tylko gadać umiejętnośc mało ważna przy tworzeni uoprogramowania. Gości sra takimi farmazonami i jest taki cofniety w rozwoju ze nie widzi ze to oczym gada gadali jego ojciec jego stary odnosnie mlodziezy a on otkrywa 100 raz ameryke na nowo i wszystkie nooby odrazu to łykaja wielcy programiści od siedmiu boleści bez jednego samodzielnie wykonanego projektu nie liczy sie ile umiesz a jaka masz motywace wiare i ile jestes wstanie sie nauczyc gdy bedzie trzeba pozatytm po studiach to same małpykoderskie są i właśnie tacy są potrzebni w firmach nie za dużo myślący robiący co im się każe a już napewno bez ambici i entuzjazmu żeby własnej konkurencyjnej firmy nie założyli po 99% wszystkich pomysłó to słomiany zapał programistów ze zbyt dużym mniemaniem o sobie

Immortal pisze...

Docierają już do nas sygnały, że są problemy z dodawaniem komentarzy. Postaramy się coś z tym zrobić. Prosilibyśmy jednak, żeby takie uwagi umieszczać na sugesterze (po prawej stronie powinien być przycisk "Twoja sugestia").

Anonimowy pisze...

Hmm to ja moze to wytłumacze w bardziej ludzki sposób.

Sam się uczyłem C zaraz po gimnazjum. Wskaźniki i referencja nie są dla mnie najmniejszym problemem.
PHP strukturalnie nawet się nie uczyłem, bo C + manual w zupełności starczał.

Dodatkowo Ciekawostką jest to, że ostatnio właśnie w PHP pisałem prace inżynierską pewnemu studentowi z Politechniki, dodatkowo temat tej pracy był wymyślony przez Profesora.

Taki morał z tego, że w pełni się zgadzam z autorem, że podstawy takie jak wskaźnik i rekurencja, każdy informatyk powinien znać.

Jednak rzeczywistość jest niestety trochę inna. Składałem ostatnio CV i zauważyłem że w większości tzw grep rekrutatorzy poszukują słów "znajomość OOP". Wiec czy tak, czy inaczej trzeba się do tego przystosować jak chce się pracowac.

Anonimowy pisze...

Zwykle narzekanie ;)

Nie skonczylem zadnych studiow, a pracuje jako zawodowy programista :) placa mi za to i oni jak i ja sa zadowoleni :) jesli czegos nie umiem lub nie znam z tego co napisali mi w specyfikacji projektu, to poprostu otwieram google i czytam :) wg mnie nie ma czasu tracic czasu na cos czego mozesz nauczyc sie przy robieniu projektu, a po co sie uczyc czegos czego nigdy w zyciu sie nie wykorzysta ? :) swoja droga.. ja wyznaje idee ze pracuje, odbieram kase i ide korzystac z zycia.. a nie siedziec 5 lat na studiach.. i czytac ksiazki :) zycie jest zbyt krotkie :)

Anonimowy pisze...

Ludzie, którzy nie rozumieją wskaźników nie są informatykami, a zwykłymi koderami. Informatyka to nauka o informacji, analiza numeryczna, kryptologia, te sprawy, a nie klepanie kodu w głupiej javie. Od tego powinny być szkoły pomaturalne.

Paweł pisze...

Autor gada jak stary dziad, który narzeka, że obecnie jadąc autem nie trzeba kręcić korbką aby móc się poruszać, a ON TO KIEDYŚ MUSIAŁ ROBIĆ.

Anonimowy pisze...

Autor ma 100% racji.
Czy naprawde uwazacie, ze bycie programista to jedynie implementowanie UML'a albo przerobienie kodu znalezionego na google? Jesli tak mialoby byc to niech mi ktos powie kto tego UML'a wymodelowal? Kto wymyslil te wszystkie algorytmy ktore tak chetnie kopiujecie? Jesli wszyscy dzialaliby w ten sposob stanelibysmy w mniejscu. I ten problem Autor probuje wskazac, on wcale nie neguje programowania w javie, ale martwi sie ze uczelnie przestaly produkowac specjalistow zdolnych wymyslec cos nowego, albo przynajmniej cos swojego. Wlasnie dzieki abstrakcyjnemu mysleniu, nauczonemu przez wskazniki, prawdziwy programista jest w stanie ruszyc problem z miejsca, a wtedy przydaja sie klepacze kodu, do implementacji.

Anonimowy pisze...

@Paweł&co.: Tego wymaga podstawowe zrozumienie zasady działania oprogramowania. Oczywiście każdy jest w stanie ułożyć kilka cegieł na sobie i powiedzieć, że umie budować, ale zbudowanie domu jest bardziej skomplikowane i wymywaga chociaż szczątkowego pojmowania praw rządzących tym wszystkim.

Anonimowy pisze...

Myślę, że Koziołek ma rację - należy odróżniać różne rodzaje "informatyków".

Co do samej treści artykułu to myślę, że powinno się poruszać problemy związane z głupieniem społeczeństwa - informatyka to tylko wierzchołek góry lodowej.

My nawet zer nie mieliśmy :)

Anonimowy pisze...

Jak czytam co niektóre wypowiedzi, to wydaje mi się, że niektórzy wychodzą z założenia: "Po co mi rozum skoro mam dresik".

Anonimowy pisze...

Jak by wszyscy mieli uczyć się podstaw od zera to nie wyszlibyśmy ze średniowiecza.

Nasi pradziadkowie stworzyli maszynę turinga, nasi dziadkowie zaprojektowali język maszynowy, nasi ojcowie stworzyli języki wysokiego poziomu, my operujemy na bardzo wysokiej warstwie rozwiązując problemy na klastrach, używając heurystyk, środowisk rozproszonych, zrównoleglamy problemy by wykonać je szybciej. Nasze dzieci nie będą uczyły się assemblera a mimo wszystko ewolucja w informatyce będzie się posuwać. Wchodzenie na wyższe "poziomy" jest domeną rozwoju.

Wyobrażacie sobie by nawet dziś, studia informatyczne zaczynały się od kwantowych teorii dryfu elektronów (i ezaminów z tego)? albo analizy obwodów magistrali na płycie ? Nie! dziś niskopoziomówkę łapie się po łebkach bo niewiele da się wymyśleć i zrobić na tym poziomie. Dziś jeden programista w Perlu napisze quicksorta w 5 sekund zamiast godziny w assemblerze (i tak nie zrobi tego lepiej). Nie należy zastanawiać się jak zrobione są narzędzia by przy ich pomocy zbudować coś większego...

Najwyraźniej autor tekstu zaczyna wbijanie gwoździa od analizy stopu metalu z którego zrobiony jest młotek..

Anonimowy pisze...

@Anonim "Jak by wszyscy": nie chodzi o inżynierię, tylko o informatykę, jako gałąź matematyki.

koziołek pisze...

@Anonim od "gałęzi matematyki", Informatyka jest nadal rozwijana jako gałąź matematyki, ale odeszliśmy już od poziomu "jak rozpalić ogień" i dochodzimy powoli do poziomu "zapałki".
Swoją drogą Google jest bardzo złym przykładem ponieważ dopiero od niedawna zatrudnia "nie doktorów", na początku przepustką do pracy był co najmniej jeden doktorat.

Prośba do wszystkich. Ludzie podpisujcie się xwkami. W polu "komentarz jako" jest na końcu opcja nazwa/url.

Pozdrawiam

Anonimowy pisze...

Większość z Was bredzi jak pijani.. i to bardzo.
A sam autor to już zachowuje się jak stary żul na kacu. :P
Wskaźniki.. wielkie mi halo.. tw. o punkcie stałym... to teoria, a nie praktyka.
Programista to nie projektant, a jeżeli w jego gestii jest także wymyślanie algorytmów, to i tak zastosuje najprostszy jaki mu przyjdzie do głowy i jaki będzie w stanie zaprogramować. :P

Iluż to ja już widziałem takich 'mądrali teoretyków', a w praktyce to prostego algorytmu nie był w stanie zaprogramować.

Dobry programista to taki, który pisząc program jest w stanie przewidzieć słabe punkty zaprogramowanej funkcji i odpowiednio go przed tymi słabymi punktami zabezpieczyć. :P

tra pisze...

pouczajacy art, szkoda, ze sie nie poszedlem na informatyke ;)

Anonimowy pisze...

Ten koleś pisze takie głupoty że głowa mała i to nie pierwszy tak denny artykuł...

Poza tym jakoś nie widziałem programistów którzy programowali w c i nie wiedzieli co to wskaźnik. Bez wskaźników i struktur nie ma programowania w c!

Andrew pisze...

W C# też można korzystać ze wskaźników ;) I działa to prawidłowo bo już sprawdzałem. Tylko, że mało kto o tym wie.

Anonimowy pisze...

Podstawowy problem:

BYCIE INFORMATYKIEM NIE JEST JEDNOZNACZNE Z BYCIEM PROGRAMISTĄ. Nie trzeba programować, żeby pracować jako informatyk, dziedzina jest dużo dużo szersza niż zwykłe kodowanie.

osobiście uważam akurat, że podstawy są ważne, ale nie czarujmy się. Praca programisty jest dobra na 2-3 lata na początek kariery.

Anonimowy pisze...

marudzisz , kiedyś starzy ludzie którzy działali w dosie znali wszystkie komendy też marudzili gdy pojawił się windows i zamiast 5 minut wklepywania komend można było parę kliknąć myszką i gotowe

to jak byś cały życie jeździł rowerem pod górkę a potem pojawi się ktoś kto elegancko bez najmniejszego wysiłku wjedzie tam motorkiem :D życie idzie do przodu i zamiast mordować sie składnią można oddać to w ręce języka a samemu zająć sie czymś ciekawszym

Anonimowy pisze...

i tak bym was wszystkich rozjebal assemblerem na SSE5 i wasze javy srawy C++ jitowane .net-y z chujowymi kompilatorami by wam chuja daly, dlatego mi placa 50 tysiecy zl miesiecznie, a wam tylko 3 kafle wy biedne informatyczne zarobasy ;)

Xamael pisze...

Szczególnie ze nie widziałem nawet jednego procesora obsługujacego SSE5... co za mlotek

Anonimowy pisze...

Studia informatyczne polegają na nauczeniu logicznego myślenia i samodzielnego rozwiązywania problemów. Jeżeli ktoś nie wie co to wskaźnik, to odpala przeglądarkę lub bierze jakąś książkę, czyta i za 10 minut wie... Tutaj jest to tak opisane, jakby to była największa na świecie filozofia. Na studiach jest 100tys. rzeczy o wiele trudniejszych. Jednym z gorszych przedmiotów są np. języki formalne (jeden z wielu)

majaczek pisze...

tylko wielce mądrzy koderzy zapomnieli, że aby móc pisać w javie ktoś musiał napisać "maszynę wirtualną" a żeby ją napisać ktoś musiał napisać kompilator, a do napisania tego potrzebna jest znajomość assemblera i/lub kodu maszynowego.

każdy język programowania i każda technika jest gdzieś potrzebna, a w innych miejscach jest niekonieczna chociaż często bywa pomocna.

jako że procesory się rozwijają, kompilatory też, oraz powstają nowe języki programowania lub ich nowe wersje te "uczeńce" nadal są potrzebne

W javie nigdy nie napiszesz systemu operacyjnego bo ten jest konieczny aby istniał interpreter pseudokodu javy bez którego żaden program w javie nie ruszymbo i salomon z pustego nie naleje.

oczywiście wskaźniki, rekurencje itp. to proste narzędzia, jednak dające dużo możliwości - przecież nie chodzi w tym o to co masz tylko czy umiesz tego użyć. I o to autorowi chodziło - w przyszłości mogą "zostać wyprodukowani" informatycy co nawet wskaźnika nie jarzą a rekurencja to dla niego czarna magia. Czyli powszechne zjawisko obniżania poziomu. Już teraz w polsce program nauczania matematyki w gimnazjach i liceach jest na poziomie kryptodepresji - co przeszkadza nawet w studiach zawodu dużo prostszego niż informatyk.

ms pisze...

@koziolek
> na tą naukę łoży pieniądze przemysł; przemysł wymaga, przemysł płaci, przemysł musi otrzymać i nie możesz tego negować.

oj, zanegowałbym

> bardzo często prowadzone są w formie obowiązkowej zajęcia "odchamiacze"

tak samo jest i na dobrych uczelniach

> Komputer nie próbuje znaleźć bozonu higgsa.

ojej, czyżby już w CERNie znaleźli ten bozon?

> Ona za nią zapłaciła już dawno temu sponsorując ze swoich podatków nasze studia.

bs

koziołek pisze...

@ms, jak już cytujesz to racz cytować pełna wypowiedź, a nie fragment wyrwany z kontekstu.

Przemysł sponsoruje naukę. W Polsce płacąc na nią "ściepkę narodową" pod postacią podatków, ale też fundując stypendia. W USA, większość stypendiów przyznawanych na kierunkach ścisłych to stypendia pochodzące od firm. Stypendysta zobowiązuje się po zakończeniu nauki pracować u fundatora.
Dlaczego nie cytujesz/ nie czytasz ze zrozumieniem, mojej wypowiedzi jako całości? Komputerów wykorzystywanych w celach czysto naukowych jest niewielki procent. Znaczna ich cześć pracuje na rzecz biznesu, przemysłu i w celu utrzymania infrastruktury.

Anonimowy pisze...

Nie mogę się doczekać, kiedy na studiach zaczną uczyć Scali

Anonimowy pisze...

@majaczek: "W javie nigdy nie napiszesz systemu operacyjnego bo ten jest konieczny aby istniał interpreter pseudokodu javy bez którego żaden program w javie nie ruszymbo i salomon z pustego nie naleje."

Nie jesteś na bieżąco. Istnieją systemy pisane w Javie. Np taki JNode, JavaOS.

@autor posta: Zgadzam się, że język Java (język nie platforma), pozwalają na to by brali się za niego laicy, którzy nigdy nie wyjdą poza "polimorfizm", choć Twoje podejście ogólnie uważam za ograniczające i szufladkujesz ludzi. To, że poziom uczelni idzie w dół, to zupełnie normalne ;} Przecież uczelnie Amerykańskie obniżają poziom od lat (Polskie uczelnie wypadają na prawdę nieźle przy większości tych w USA). Zauważ jednak, że do napisania "nowego systemu księgowości" (tego poziomu potrzeba większości absolwentów) wystarczy sam język Java.
Studia nadają tylko kierunek i pokazują podstawy programowania. Java wystarczy, żeby odstraszyć większość studentów historii z kierunku programowania. Ci którzy chcą być programistami, sami sięgną do najlepszych rozwiązań. Na pewno uczelnia nie ma na celu nauczyć programistów programować

Anonimowy pisze...

Na AGHu też uczą wskaźników i rekurencji na pierwszym semestrze, aby odsiać pozostałych (jeśli się nie zaliczy tego przedmiotu, na którym się programuje w Pascalu, to nie dostanie się wpisu na 3. semestr). Poza tym mamy rzeczy nieco "przestarzałe" jak Icon, Lisp, Asembler 8086, Pascal, ale z drugiej strony również Javę, Ruby'ego, Pythona, programowanie i technologie obiektowe, a równocześnie przedmioty, które uczą budowy komputerów, mikroprocesorów, podstaw elektroniki czy elektrotechniki. Jaki będzie efekt końcowy, zobaczymy. Ponoć absolwenci nie mogą narzekać ;)

Gluth pisze...

Znajomość określonego języka nie gwarantuje jakichkolwiek umięjętności programistycznych (widziałem tak skopane strukturalnie funkcje napisane w C++, że wysypywały kompilatory). Wydaje się, że w Javie, czy też w .NET być takim łośkiem jest łatwiej, ale można ich spotkać wszędzie.

"Kaziu? Jak tam PHP? Umiesz już foreach? No to jedziemy z tym projektem bo klient czeka!"

Anonimowy pisze...

O jej! Autor artykułu jest zarozumiały a nawet dodam, że jest to zwyczajny głupek. Fakt, że osoba pracująca jako programista MUSI mieć pojęcie o wskaźnikach itd. jest oczywisty. Jednak autor zapomina, że nieduży procent absolwentów uczelni informatycznych podejmuje prace jako programista!
Ja na uczelni nie miałem w ogóle Javy - miałem C oraz Delphi. Obecnie pracuję jako programista, ale nie dlatego, że mnie uczelnia dobrze nauczyła tylko dlatego, że programować nauczyłem się sam. A programowania uczyłem się od czasów II klasy szkoł podstawowej i to właśnie na BASIC'u.

Co z tego, że podstawy javy są łatwiejsze od podstaw C? Skoro aby być dobrym programistą to trzeba znać oba te języki!

Odnoszę wrażenie, że ten artykuł został napisany wyłącznie w celu ośmieszenia języka jakim jest java.

Anonimowy pisze...

Hmm. Zdawałem (i zdałem na jedną) na kilka uczelni z pierwszej 10 na świecie i praktycznie 'pytali' z rekurencji. Tzn. nie zakładali czy znam czy nie (w końcu nie każdy idący na studia musi programować) ale czy pojme z ich pomocą tą koncepcję (oczywiście bez straszenia terminami czy zbytniej abstrakcji - po prostu rozwiązanie z pomocą wykładowcy prostego problemu).

PS. Mimo prośby wolę napisać anonimowo - przepraszam.

s pisze...

Przeczytałęm parę negatywnych komentarzy i muszę stwierdzić, że to koledzy o was, (nie)stety. Większość z was wykazuje daleko posunięty analfabetyzm funckjonalny -- co tu więc w ogóle mówić o programowaniu czegokolwiek. Co jak co, ale czytać ze zrozumieniem "wyższy informatyk"[*] musi umieć.

Zrobiono kiedyś taki eksperyment: grupie ludzi dano do rozwiązania test, po czym poproszono o (samo)ocenę jak im poszło. Następnie przyrównano samooceny i rzeczywiste wyniki testu. Wyszło zabawnie:
grupując po rzeczywistych wynikach, ludzie z czwartego kwartyla (ci którym poszło najlepiej) oceniali sami, że poszło im średnio lub słabo, mało kto twierdził że poszło mu dobrze, a w tej grupie największy był odsetek samoocen złych; ludzie z 2. i 3. kwartyla najczęściej samooceniali się trafnie; ludzie z ostatniego (pierwszego) kwartyla, czyli ci co g... umieli oceniali się bardzo wysoko, w tej grupie był największy odsetek tych, którzy ocenili, że poszło im doskonale a najmniejszy tych, którzy stwierdzili, że poszło im źle.

Wy koledzy, wyglądacie mi na tych z najniższego kwartyla. Ale zapewne tego też nie zrozumiecie, bo użyłem trudnego słowa.

Co do "zwyczajnego głupka" to ten "głupek" jest właścicielem firmy produkującej soft ale też przede wszystkim współwłascuicielem i współpomysłodawcą serwisu stackoverflow.com -- więc kolego, co to miałeś C i Delphi, pogadamy jak będziesz miał takie osiągnięcia jak ten "zwyczajny głupek". I jeszcze jedno: wyższa uczelnia to nie szkoła zawodowa, uczelnia nie uczy cię programować tylko uczy umiejątności rozwiązywania trudnych problemów oraz podstawy specjalistycznej wiedzy -- tak żebyć nie był w tym ostatnim kwartylu i "wiedział, że nic nie wiesz". Bez tej wiedzy to są potem przypadki takie, jak w jednej firmie gdzie usilnie chcieli na szybko produkować wyniki dla problemu równoważnego z NP-trudynym. Jak im ktoś mądrzejszy powiedział, że się nie da, to powiedzieli że "nie czuje team spirit". Tej firmy już nie ma :)

Do kolegi, co to "nie tracił czasu na studia" i jest programistą: nawet nie wiesz że nic nie wiesz.

[*] - "informatyka wyższa" -- w odróżnieniu od niższej, czyli skreć komputer do kupy, odkorkuj drukarkę, itd. Społeczeństwo pod pojęciem informatyka zwykle rozumie właśnie kolesia który potrafi wymienić toner i zainstalować soft.

Kos pisze...

Drobna uwaga do tłumaczenia: "Functonal language" tłumaczymy jako: "Język funkcyjny", nie "język funkcjonalny" - te słowa mają w języku polskim różne znaczenia, a angielski ma jedno słowo "functional" na obydwa. Odsyłam do SJP po szczegóły :)
A pzoa tym, dobra robota i równie dobry artykuł.

Immortal pisze...

@Kos
Na UWr używaliśmy pojęcia "programowanie funkcjonalne". Powiedziano nam, że pochodzi to od "funkcjonału" (http://pl.wikipedia.org/wiki/Funkcjona%C5%82) i przy takim tłumaczeniu chciałbym zostać. Ale dzięki za spostrzegawczość :] Pozdrawiam.

Kamil Mętrak pisze...

W pełni popieram JS. Może taki delikwent po studiach idąc do pracy nie skorzysta jawnie ze wskaźników, nie będzie mu to potrzebne. Jednak sama wiedza dużo daje. Na PW miałem taki przedmiot "Programowanie obiektowe - JAVA". Nie rozumiałem sposobu w jaki gość zaczął pierwsze laborki - mieliśmy napisać pewien program w... C++, z określonymi wymaganiami - wszystko obiektowo, używając arytmetyki wskaźników. Po co? Bo kilka (3-4) tygodni później dostaliśmy jeszcze raz ten program do napisania, tym razem w Javie. Dzięki temu dało się zrozumieć jakie są główne różnice od strony programisty w tych zupełnie różnych środowiskach. Dzięki temu bardzo łatwo przychodziło zrozumienie konstrukcji, które w javie są OOTB, a w C++ trzeba było je samemu napisać (lista, hashmapa, kolejka). Dzięki tak trudnemu zadaniu dało się odkryć pewne piękno Javy - otóż tu jest łatwiej, to co trzeba było napisać było do zrobienia w czasie jednych laborek, a nie jako praca domowa pisana po nocach.

Gość który nam to prowadził bardzo słabo znał javę, po tych 3-4 tygodniach my (studenci) byliśmy już na wyzszym poziomie niż on (jeżeli chodzi o znajomośc samego języka i środowiska). Jednak to On nas dalej uczył - programowania obiektowego.

Anonimowy pisze...

Wskaźniki i programowanie funkcyjne mają ogromny wpływ na wydajność i pamięciożerność programu napisanego obiektowo. Na przykład tam, gdzie obiekty są immutable, a wołając metody generuje się z nich nowe obiekty, można użyć funkcji jako filtrów; wtedy zamiast przerzucać milion pozycji listy lub (wewnętrznie) wskaźników do nich, gdy zmienia się jedna z nich, można przerzucać jeden obiekt, który jest leniwą funkcją (operacją jaka się wykona na liście, gdy zajdzie taka konieczność). Potem można dostawiać kolejne "piętra" takich filtrów bez obaw o to, że któryś zechce stworzyć tymczasową listę.

Widziałem poważne programy pisane dla poważnych instytucji przez świeżo upieczonych absolwentów studiów. Potrafiły pobrać część bazy danych do RAM-u i tam odsiać kawałek, bo była to najłatwiejsza, podręcznikowa droga. A to że data mapper się nie domyślił, że to zje całą pamięć, to już była "wina Javy albo sprzętu". Na funkcjach przetwarzanie tego zajęłoby kilkaset tysięcy razy mniej pamięci. Nawet nie chodzi o to, że trzeba by to kodować w jakiś dziwny sposób, tylko o to, że można by użyć mało popularne warianty operacji, które ktoś napisał w funkcyjny sposób. Ale żeby to zrobić, trzeba zlokalizować problem i wiedzieć, że ma on rozwiązanie. Tu się sprawdza to, że nie trzeba kodować funkcyjnie, ale to się może przydać.

Jeśli chodzi o same wskaźniki, to czasem ułatwiają zrozumienie, jak naprawdę coś działa w OOP. Dzięki wskaźnikom można wypłaszczyć wielowymiarowy problem i sprowadzić go do sekwencji, którą łatwo prześledzić na kartce papieru, rysując sobie strzałki. To bardzo ułatwia zrozumienie dziedziczenia, metaprogramowania i pomaga wyszukiwać usterki, gdy trafimy na jakiś błąd w strukturze, która jest tak zagmatwana, że trzeba ją jakoś rozrysować, żeby zrozumieć, co się naprawdę dzieje.

Anonimowy pisze...

Zgadzam się tylko w 3/4 z autorem artykułu, ponieważ nie zauważa on pewnych bardzo ważnych kwestii, które wymuszają programowanie w JAVA-ie czy .NET.
Otóż ja jako użytkownik potrzebuje(lub nie) oprogramowania.
Firma X musi jak najszybciej mi je sprzedać, czyli jak najszybciej je wyprodukować.
Najszybciej programuje się właśnie na tych dwóch platformach(chyba że są inne podobne których nie znam), i łatwo szkoli się na nie programistów.
Ogólnie na tych platformach programuje się łatwo, dlatego spory odsetek programistów JAVA czy .NET nie umie programować w niczym innym i jest im to nie potrzebne, i pewnie dla nich za trudne(nie istotna kwestia).
Prestiżowa firma powinna mieć pracowników z wykształceniem wyższym, więc tworzy się Licencjaty na których tworzy się pracowników wykwalifikowanych, którzy będą klepać programy w JAVA czy .NET.
Tacy pracownicy, mają nie myśleć, cieszyć się z 3K zł na miesiąc i do 67 roku życia klepać kod dla szefa który ma gdzieś ich, oraz klientów.
Wszyscy są zadowoleni i to sprawia, że rekurencja czy wskaźniki nie są potrzebne.
Niepotrzebna w przemyśle aż tylu projektantów czy analityków, którzy zarabiają o wiele więcej niż programiści, a którzy powinni się znać na czymś takim jak rekurencja. Ci którzy wiedzą co to rekurencja czy wskaźniki, czy znają ASM-a, Haskella i taki przedmiot jak "języki formalne"(swoją drogą 2 lub 3 co do łatwości przedmiot na studiach) będą projektantami czy analitykami, a ich dochody będą większe.

Nie wiem jak to jest ze studiami 2 i 3 stopnia, gdzie według siatek są są takie przedmioty jak ASM. Niestety na UŁ który skończę w tym roku poziom prowadzących z wielu przedmiotów jest dość kiepski, są to nauczyciele z przymusu, którzy często nie znają się na tym co wykładając, a są przymuszani przez władzę uczelni do prowadzenia(ktoś musi to poprowadzić). Zdarzają się tacy studenci, którzy nie potrafią programować w ogóle, ale uczelnia przecież musi produkować absolwentów. Z tego powodu poziom jest fatalny.
Zdarzają się również prowadzący dany przedmiot świetnie, uchodzą za bardzo dobrych znawców danego tematu(tak naprawdę trzeba przeczytać 1-3 książki i będzie się miało taką wiedzę jak oni).
Do tego dochodzi problem mody na wykształcenie wyższe(lub nawet na średnie), każdy młody człowiek musi coś skończyć, nawet jeżeli później będzie kasjerem w markecie, czy będzie zamiatać ulicę.
Istnieje też dziwna moda na to, aby studenci pracowali podczas studiów, bo to świadczy o ich zaradności. Co sprawia, że tacy studenci nie chodzą na wykłady, nie mają pojęcia o omawianych tam kwestiach(bo przecież umiem programować w JAVA-ie czy .NET-cie, to po co mi wiedza np.: o projektowaniu interfejsów), i później mamy jakieś dziwnie zaprojektowane formularze i "białe tło strony firmy sprzedającej suknie ślubne między innymi w Japonii"(przecież klient tak chciał).
Jeżeli ktokolwiek uważa, że wiedza absolwenta na temat różnych języków programowania(szczególnie niskopoziomowych), różnych zagadnień teoretycznych, rekurencji czy wskaźników jest niepotrzebna, to życzę mu, aby najbliższą operacja jaką przeżyje była operacja prowadzona przez stażystę-chirurga który skończył studia na samych trójkach.
Osobiście natrafiłem na 2 rażące przypadki niewiedzy ze strony "pseudo informatyków", którzy raczej nie ukończyli studiów, albo ukończyli na kiepskich ocenach, a większość przedmiotów olali.

Anonimowy pisze...

1) Mój administrator, który po zgłoszeniu problemu z siecią, nie wie czy przez "ich router" przechodzą pakiety przesyłane do mnie czy nie. Widać że dla niego stwierdzenie topologia sieci(albo schemat połączenia urządzeń w sieci) nie jest potrzebne do bycia adminem.
2) Projektant, który zaprojektował w .NET kontrolkę odpowiedzialną za wstawianie daty i czasu(nie pamiętam jej nazwy), która posiada aż 5 pól służących do zmiany koloru(różnych elementów tej kontrolki), których zmiana wartości nie wpływa na zmianę wyglądu tej kontrolki(może czegoś nie umiem czy nie rozumiem, ale wrzucenie wszędzie wartości Color.red i niezaobserwowaniu zmiany dla mnie oznacza, że nie działa). Nie wspomnę już o niekonsekwencji w dziedziczeniu(a raczej jego brak) w niektórych kontrolkach .NET w C#. No taki człowiek nie musi wiedzieć co to rekurencja, ale on nie ma o programowaniu obiektowym pojęcia. Są kontrolki które posiadają pole SelectedIndex, oraz takie podobne w budowie(w formie listy), które zamiast tego pola, mają w każdym z Item - ów kolekcji pole Selected typu bool. Może się czepiam ale ten przykład pokazuję jak projektant .NET nie umie programować obiektowo.
Nie znam na tyle JAVA-y aby się do niej czepiać, więc nie wytkam palcami, ale jeżeli programiści będą się specjalizować w kilku językach, to będą mogli dobrać sensowny język do rozwiązania danego problemu, a nie wszystkie problemy rozwiązywać w tym jedynym który znają. Jeżeli będą naprawdę umieli programować, to zwykli użytkownicy a w tym i my będziemy mieli sensowne oprogramowanie.
Wszystkim studentom którzy chcą pracować a nie się uczyć polecam program SDM z MSDN AA służący do ściągania oprogramowania MS. Program ten przy ściąganiu dużego pliku np 3 GB działa znakomicie do czasu gdy pobieranie się nie skończy. Po skończeniu pobierania, program rozpakowuje pliki ściąganego programu alokując 3 GB pamięci(programista nie słyszał o buforowaniu bo w .NET czy JAVA-ie się nie buforuje). Wtedy proces zabiera całe 3 GB ram-u które mam, zamulając wszystkie inne procesy na ok. 5 min. I system wielozadaniowy zmienia mi się na 0 zadaniowy.
Nie jest to problem aż tak trudny jak rekurencja czy wskaźniki, ale pokazuje, że ta osoba nauczyła się programować z samouczków z internetu, a nie z sensownej książki czy na jakiejś uczelni.

Anonimowy pisze...

Jeszcze jedno, do wbijania gwoździ nie potrzebna jest wiedza z jakiej stali robi się młotki, tak jak do rysowania w Paint nie potrzebna jest znajomość algorytmów graficznych. Ale jak będziemy produkować młotki, to już to warto wiedzieć, podobnie jak przy pisaniu programu graficznego Paint znać algorytmy graficzne.

Anonimowy pisze...

Instytut Informatyki UWr. <3

rafek pisze...

@Anonimowy (powyżej): +1!

Marek Stój pisze...

II UWr FTW!

Prześlij komentarz

Related Posts with Thumbnails