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.)
48 komentarze:
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.
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.
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.
@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.
Stary zapierdziały informatyk z Ciebie...Pieprzysz jak nauczyciel
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?
Na UMCS w Lublinie uczą Scheme'a i podstaw rachunku lambda :)
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
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.
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ć....
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!
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.
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
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").
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.
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 :)
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.
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Ć.
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.
@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.
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 :)
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".
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..
@Anonim "Jak by wszyscy": nie chodzi o inżynierię, tylko o informatykę, jako gałąź matematyki.
@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
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
pouczajacy art, szkoda, ze sie nie poszedlem na informatyke ;)
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!
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.
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.
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
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 ;)
Szczególnie ze nie widziałem nawet jednego procesora obsługujacego SSE5... co za mlotek
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)
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.
@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
@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.
Nie mogę się doczekać, kiedy na studiach zaczną uczyć Scali
@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ć
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ć ;)
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!"
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.
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.
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.
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ł.
@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.
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.
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.
Prześlij komentarz