Od czego zacząć naukę Javy?

Tytuł wpisu jest po części niepoprawny, jednakże dostaję co i rusz mejle z mniej więcej tak sformułowanym pytaniem. Dlatego też by nie musieć odpisywać za każdym razem na to samo, a także by nie stosować brutalnego kopiowania postanowiłem swoje przemyślenia zamieścić na blogu.

Na samym początku mała uwaga do ludzi, którzy na Javie zjedli zęby i kawałek dziąseł – proszę o zachowanie komentarzy z cyklu ‘Tak naprawdę technologia/framework XX nie jest YY, albowiem Iksiński uważa inaczej i tak naprawdę realizuje się tam wzorzec ZZZ i z całą pewnością powinno się go poznawać przed/po OOO’ dla siebie. Wpis ma za zadanie choć oględnie pokazać o co chodzi w tej masie nazw i specyfikacji – mniejsza o detale i kłótnie ‘pro-programmersów’.

Czym tak naprawdę jest Java? To wcale nie jest głupie pytanie! Czym jest Java? Językiem programowania ktoś rzeknie. I będzie miał rację. Platformą do budowania aplikacji – też przyznam mu rację (pomińmy językowe wygibasy co jest platformą, a co nie). Specyfikacją, do której potem stosują się inni? Też racja. Więc co to tak naprawdę oznacza ‘nauczyć się Javy’?

Java jako taka miała być językiem wieloplatformowym, uruchamianym na różnych systemach i urządzeniach (mottem było “Write once, run everywhere”) dzięki użyciu maszyny wirtualnej. Dlatego też na samym początku Java poszła trzema różnymi drogami:

a) przeznaczona do pisania aplikacji desktopowych. Dziś przy tendencjach do przenoszenia wszystkiego do chmurek, lekkości i mobilności rozwiązań wydaje się być to pewnym przeżytkiem. Jednakże Java dalej posiada bibliotekę Swing oraz AWT/SWT, które umożliwiają tworzenie aplikacji desktopowych uruchamianych  konkretnie na maszynach klienta. Nie wiem jak ten rynek wygląda obecnie – na pewno istnieje masa legacy-code, ale nie za bardzo jestem na bieżąco z rynkiem koderów w tych technologiach. Wiem za to na pewno, że na swoim kompie instalowałem Adobe AIR – choćby dla aplikacji do składania PITa przez internet, z tego co wiem np. Ipla dla linuxów jest w tym pisana. Czyli jakby Java tutaj oddawała pola.

b) lekka wersja przeznaczona na urządzenia mobilne (to w dużym uogólnieniu) – wersja Mobile Edition. Najczęściej kojarzona z telefonami komórkowymi, choć może i niesłusznie – bardziej chodziło o urządzenia z małą zdolnością obliczeniową. Z tego, co do mnie dociera z blogosfery wygląda na to, że jeśli chodzi o komórki to chyba też Java przegrała tę batalię (w pewnym sensie) – Objective-C dla iPhonów i pochodnych od Apple, Android bazuje na JVM, ale nie jest z nią w pełni kompatybilny, Symbian Windows Phone to rodzina C++. Trochę kiepsko.

c) wersja korporacyjna (webowa) – póki co tutaj dzieje się magia. O tej wersji piszę na blogu najwięcej. Programistów wyznających się na tej magii pracodawcy poszukują najwięcej. I o tej też Javie skupię się w dalszej części wpisu.

Zanim jednakże przejdziemy do samego webdevelopmentu poruszę kilka okolicznych zagadnień. Zaczniemy od samej Javy  jako języka programowania. Nie wiem drogi czytelniku czy posiadasz doświadczenie w tej dziedzinie. Może do tej pory kodowałeś desktopowe gierki na swoim wysłużonym blaszaku. Równie dobrze jak ja jakiś czas temu możesz pracować przy PHP czy innym Pytonie. Może jesteś frontendowcem, który musi dowiedzieć się czegoś o JSP, servletach i okolicach. Wiem jedno – nauczyć się podstaw Javy jako języka programowania nie jest zbyt trudno. Odradzałbym jednakże kanoniczną ‘Thinking in Java’ – o tym dlaczego opisałem kiedyś na blogu. Zwykłe tutoriale w internecie – taki jak choćby tutorial na stronach Oracle czy książeczki z serii ‘Core Java’ dostępne w Helionie absolutnie wystarczą.

Idziemy dalej. Przy nauce języka z całą pewnością będziemy korzystać z IDE – czy będzie to Eclipse, czy NetBeans czy jeszcze coś innego – nie ma znaczenia. Znaczenie ma to, iż wszystkie IDE ukrywają przed użytkownikiem magię, którą czynią pod spodem – budowanie aplikacji, kompilacja i w końcu uruchomienie. W przypadku prostych aplikacji do nauki języka nie jest to jeszcze tak mocno widoczne – z całą pewnością jednak stanie się kiedy przejdziemy do prawdziwego JEE. Konkretnie na sam początek mam na myśli narzędzia budujące projekty – konkretnie zaś Anta oraz Mavena. Znajomość (choćby ogólna i dość pobieżna) tych dwóch pozwala na zrozumienie co w ogóle się dzieje z kodem kiedy klikamy ‘Compile and run’ w IDE. Do poznania tych dwóch dobrze jest odwiedzić ich strony internetowe, albo zaopatrzyć się w tę oto książeczkę, w której można znaleźć opis szeregu innych ciekawych narzędzi przeznaczonych dla Javy

Przed rozpoczęciem pisania kodu zawadzimy o jeszcze dwie rzeczy. Pierwszą z nich jest baza danych. Jeżeli przychodzisz z miejsca, gdzie klucz główny tabeli oznacza to samo co kolumnę INTEGER z auto-increment to wiedz, że jeszcze bardzo dużo nie wiesz. Absolutnie nie twierdzę, że MySQL jest zły – chodzi mi tylko o to, iż w przypadku korporacyjnych aplikacji najczęściej używa się produktów, które są traktowane jako ‘poważne’, no i mają też niebagatelne możliwości – tutaj (z mojego doświadczenia) wynika, że graczy jest tak naprawdę dwóch – Oracle oraz MSSQL. Gdzieś tam ktoś słyszał o tym, iż w użyciu jest Sybase, DB2 czy jeszcze inne wynalazki – jednakże to mniejszość – znajomość tych dwóch pierwszych (nie ekspercka, nie da się nie będąc adminem lub zawodowo programistą PL/SQL stwierdzić, że się zna te bazy). Temat jest długi, materiałów w sieci nie brakuje, książek (po polsku) również nie.  Zarówno Oracle jak i MSSQL posiadają wersje, które można za darmo pobrać i zainstalować na lokalnym kompie by się ich poduczyć. I nawet nie mówię o samym języku SQL (bo ten w podstawach jest taki sam wszędzie – w końcu po coś mamy standard ANSI), ale o takich rzeczach jak schematy, userzy, materializowane lub nie widoki, podstawy programowania bazy (PL/SQL czy T-SQL) – to się przydaje w codziennej pracy, choćby po to by wiedzieć co wpisać w konfigu cienkiego klienta.

Drugą rzeczą są serwery. W przypadku aplikacji desktopowych problemu nie ma – JVM jest odpalana na lokalnym komputerze i problemu nie ma. W przypadku JavaScriptu mamy przeglądarkę i tylko przeglądarkę. PHP czy Python wykonywane są na odpowiednio skonfigurowanym serwerze WWW  (choćby poprzez FCGI). Wszystko jest dość oczywiste. Czym innym niestety są serwery do użycia Javy – możemy je bowiem podzielić na dwie kategorie – kontenery servletów oraz serwery aplikacyjne.

a) kontener servletów – jak sama nazwa wskazuje jest to serwer (aplikacja), która pozwala na wykonywanie kodu zawartego w servletach (klasach Javy, których kod może być wywoływany przez zdalnego klienta – nie musi to być np. protokół HTTP), a także kodu, do którego servlet się odwołuje. Najpopularniejsze to Apache Tomcat oraz Jetty.

b) serwer aplikacyjny – jest to serwer (aplikacja), która jest zgodna ze specyfikajcą korporacyjnej Javy – w związku z czym poza zwykłym hostowaniem aplikacji webowych (tak samo jak kontener servletów) udostępnia masę dodatków – jak choćby obsługę kolejek (JMS), obsługę bezpieczeństwa, współdzielonych zasobów JNDI i masę masę innych rzeczy. Jednakże w związku z tym jest o wiele bardziej zasobożerny. Najpopularniejsze serwery to BEA Weblogic, JBOSS Server, Websphere oraz Glassfish.

Większość IDE skonfigurowanych do pracy z Javą lub Javą EE przy instalacji pyta o jednoczesne zainstalowanie kontenera lub całego serwera ( np. NetBeans może nam zainstalować Glassfisha). Przy rozpoczynaniu przygody z Javą EE jest to dobra opcja – taka instalacja ma tę zaletę (przynajmniej powinna mieć), że działa po kliknięciu w IDE. Nie bawimy się w konfigurację, tworzenie domen i ustawianie źródeł danych – serwerek po prostu działa, a my możemy pisać kod. No właśnie, kod.

Podstawą do działania Javy w środowisku internetowym jest technologia servletów i w pewnym sensie automatycznie wiązana z nią technologia JavaServerPages (od obsługi widoku). Jest to realizacja wzorca MVC – servlet sprawuje w tym przypadku funkcję kontrolera, zaś strony (pliki) JSP są naszym widokiem. Dla zrozumienia podstaw tej technologii (poza tutorialami w internecie) najbardziej nadaje się książeczka z serii ‘Head First’. Zasadniczo niewiele więcej trzeba o tym pisać – poza tym, iż tworzenie kodu za pomocą czystych servletów i JSP to trochę hardkor i najczęściej dziś do tego stosuje się konkretne frameworki webowe. Co to jest framework? Ano jest to zbiór klas/bibliotek/pakietów, które czynią tworzenie aplikacji internetowych znacznie łatwiejszym. Za najbardziej kanoniczny ( w sensie pochodzenia, nie zastosowań czy znaczenia) uważa się JavaServerFaces – był to framework stworzony przez firmę Sun Microsystems (twórcę języka Java). Problem z nim był taki, iż miał dość pokręcony model przetwarzania requestów, potrzebne też były różne hacki na poprawne renderowanie widoku i masę różnych rzeczy. Jakiś czas temu pojawiła się druga wersja tego frameworku, do zabawy z nią można zapoznać się książeczką dostępną po polsku. Mimo szeregu zmian nie jest to jednakże często polecane rozwiązanie. O wiele bardziej zaawansowanym narzędziem jest webframework o nazwie SEAM. Bazuje on w podstawach na JSF, jednakże posiada masę dodatkowych ficzerów, które naprawdę wydają się być przydatne. Niestety nie miałem okazji przysiąść na dłużej z tym frameworkiem. Wiem jednakże na pewno, iż posiada świetnie wyglądającą dokumentację dostępną na oficjalnej stronie frameworka. Podobnym do powyższych jest również webframework Struts – jego pierwsze wersje pojawiły się naprawdę dawno temu – w związku z czym jego konstrukcja potrafiła cokolwiek odstraszyć. Druga wersja frameworka, która pojawiła się nie tak dawno temu skonstruowana jest o wiele lepiej – choć dalej nie bez zastrzeżeń.

To co wymieniłem powyżej to najbardziej popularne (moim zdaniem i jest to subiektywne odczucie) webframeworki w naszym kraju. I tutaj uwaga! To są frameworki, które częściowo wchodzą również w warstwę widoku. Mówiąc krótko – najczęściej widok to po prostu pliki JSP, wzbogacone o masę ekstra tagów, które umożliwiają rendering ciekawszych kontrolek. Jednakże istnieje możliwość zastąpienia tej części bardziej wyrafinowanymi możliwościami – ostatnio w tej roli (głównie przynajmniej z tego co widzę po ogłoszeniach o pracę) zaczyna dominować produkt od Googla – GoogleWebToolkit. Jest to biblioteka, która umożliwia tworzenie mocno zAJAXowanych aplikacji, które jednakże powstają tylko i wyłącznie z użyciem Javy. Cały kod JavaScriptu jest generowany za pomocą kodu pisanego w Javie, jednakże programista ma docelowo nie przejmować się istnieniem przeglądarki, standardów i różnic w silnikach JavaScriptu. Z moich pobieżnych zabaw z GWT skojarzenie z pisaniem w ActionScripcie nasuwa się samo. Tworzymy kontrolki, umieszczamy na stronie i to docelowo ma działać. Ostatnimi czasy więcej słyszy się o produkcie opartym na GWT o nazwie Vaadin, a najbardziej chyba dobrym miejscem by rozpocząć przygodę z tym rozwiązaniem jest strona Kozioła. Oprócz tychże mamy też szereg innych ciekawych projektów, jednakże jest ich tyle, że aż głowa mała – nie będę wskazywał konkretnych przykładów (no dobra – Richfaces dla przykładu), które ułatwiają tworzenie GUI – tutaj jednakże trzeba wybrać samemu rozwiązania, które nam podpasują.

W powyższych wywodach nie wymieniłem jednego magicznego słowa – Spring. Albowiem ten framework (a może to biblioteka?) jest tak naprawdę nie tylko frameworkiem, ale też zupełnie nowym podejściem do tworzenia aplikacji webowych. Spring bowiem rozwiązywał problemy, które pojawiły się w czasach, kiedy Java była niesamowicie kobylasta, a fajne tagi w JSF naprawdę były szczytem innowacji. Spring jest rozwiązaniem, które realizuje wzorzec Dependency Injection / Inversion of Control (nie wchodzę w dywagacje co jest elementem czego i takie tam – na uniwerkach mogą bo mają czas i za to im płacą).  Co oznacza nie tylko ułatwienie tworzenia obiektów, zachowania czystości kodu oraz skalowalności, ale też wpływa tak naprawdę na wszystko. Wiem, że powyższe zdania wyglądają jak marketingowy bełkot, ale naprawdę nie potrafię w skrócie opisać Springa i całej jego zajebistości. Wiem tylko, że ostatnio dość często piszą/dzwonią do mnie rekruterzy i tak naprawdę z frameworków wymagają tylko tego Springa – ewentualnie z jego bardzo fajnym dodatkiem – Spring MVC, gdyż tak naprawdę dzięki temu combo nic więcej już nie potrzeba. No prawie…

Tym, co jest potrzebne to jakiś sposób implementacji logiki biznesowej, co jest dość często automatycznie powiązane z dostępem do bazy danych. Wiem, że to może dość radykalne stwierdzenie, ale nie piszę tu rozprawy doktorskiej – piszę do ‘wanna be Java programmer’. Zatem przyjmijmy na razie, że rzecz jest w dostępie do bazy danych. I tutaj mamy dwie możliwości:

a) JDBC – technologia stara jak świat, ale dalej dość mocno użytkowana. Dlaczego? Albowiem jest prosta do bólu i nie wymaga zaznajamiania się z ORMem, pisaniem masy XMLa, albo wpisywania masy adnotacji do kodu. Po prostu działa. Do swego działania wystarczy dostarczyć bibliotekę ze sterownikiem dla konkretnej bazy danych i piszemy kod. Jest również najbliższym do pisania czystego SQLa (w sumie to jest pisanie czystego SQLa tylko opakowanego w obsługę połączenia i wyjątków). Zawsze czysto, zawsze sucho i zawsze pewnie.

b) ORM – bazy danych obecnie używane w 99% to bazy relacyjne. Ergo – obiektowe języki programowania nie za bardzo do nich przystają – musimy napisać kod, który jakoś zamieni te proste rekordy z bazy na piękne obiekty z ich metodami dostępowymi, modyfikatorami dostępu oraz polimorfizmem. I tutaj ludzie wymyślili coś takiego jak ORM Object Relational Mapping. Standardem stworzonym przez firmę Sun jest Java Persistence API, w skrócie JPA. W obecnej wersji jest to tak naprawdę synergia pomiędzy rozwiązaniami zaimplementowanymi uprzednio w najbardziej popularnym rozwiązaniu – Hibernate. Bibliotekę tę wymienia się zasadniczo w każdym ogłoszeniu o pracę, zatem jeśli chcesz zostać koderem Javy – poznanie Hibernate (a przez to i w dużej mierze JPA) jest po prostu warunkiem koniecznym. Co jest w ORMach niefajne? Konieczność klepania XMLa – choć ostatnio o wiele szybciej i wygodniej osiąga się cel poprzez adnotacje. Często jednak mam wrażenie, że kiedy przychodzi do czegoś bardziej skomplikowanego trzeba (mimo opakowania w np. criteria API Hibernate) wklepać fizycznie ‘SELECT * FROM’ i nic się z tym nie da zrobić.

Co nam teraz zostało? W sumie masa innych rzeczy, które jednakże na pewno dla ‘wannabe programersów’ znajdują się na bardzo wysokim poziomie. Wróć, może źle napisałem. Odległym poziomie – brzmi bardziej prawdziwie. Wymienię tylko nazwy – pisać już mi się nie chce, a kto chce znajdzie sobie informacje w Wiki i na pewno wujek Google dopomoże. Mamy zatem JMS, JMX, JaaS,  ESB, WebServices (SOA), BPM, UML, ufff – zapewniam też, że możnaby tak jeszcze długo.

Powodzenia życzę 😉

Advertisements

16 thoughts on “Od czego zacząć naukę Javy?

  1. kwiateusz

    Dzięki Ci za ten wpis, zawsze mnie zastanawiało co do czego jest w javie bo tych skrótów jest multum, ale nie chciało mi się szukać 🙂 A tu kompendium wiedzy w pigułce.

  2. Krzysiek

    Dość mieszane mam odczucia tym razem. Ogólnie to punkt widzenia zależy od punktu siedzenia i nie porywałbym się na pisanie “jak to jest w środowisku” bez porządnego źródła by to poprzeć, dla równowagi przedstawię swój punkt 😉

    Na dobry początek się nie zgodzę z całym artykułem. Najpierw jak ktoś chce coś poznać to niech pozna JUnit (lub Spock dla zwolenników języków dynamicznych). Koniecznie i natychmiast śmiałek powinien się uczyć poprawnego sposobu pisania kodu z testami, na razie nie musi się przejmować co to znaczy TDD i test first, bo najpewniej sam do tego dojdzie, to tak naprawdę jest naturalne, a my się uczyliśmy w jakiś dziwny sposób bez testów i potem musimy się uczyć od nowa.

    W kontynuacji znów nie zgodzę się z całym artykułem 😉 Jeśli ktoś chce się nauczyć programować to najpierw musi mieć Problem albo jak kto woli Potrzebę. Trzeba mieć potrzebę jakiejś aplikacji lub problem z czymś co aplikacja mogła by spróbować rozwiązać. Tak człowiek nauczy się najszybciej najważniejszej części programowania w Java -> znajdowania właściwego młotka do właściwej śruby. Mając problem część narzędzi i technologi się sama wybierze.

    Chciałbym się nie zgodzić się z opinią odnośnie Ant-a i Maven-a. I chciałbym powiedzieć że Maven to zło, które trzeba wytępić… ale jeszcze nie mogę (integracja z ide, zarządzanie zależnościami, archetypy, seam forge, etc.). Jednak jeśli ktoś zaczyna i chce zrozumieć co się dzieje to niech skorzysta z konsoli. Maven to czarna magia i zło konfiguracji więc nie pokazuje jak coś działa. Ant nie skaluje się łatwo, poza tym działa. Jednak do samego budowania projektów, zarządzania zależnościami istnieją znacznie lepsze projekty (polecam Gradle)

    Z mojego doświadczenia jest więcej niż dwóch graczy w bazach danych, i to mocno zależy od skali. Często jest również spotykany i obsługiwany PostgreSQL 😉 a wiele systemów obsługuje po prostu parę platform (ORM w końcu po coś mamy). I to właśnie PostgreSQL bym polecał na początek (albo nawet zero-obsługową, mega-prostą bazę H2, która mieści się w jednym pliku razem z konsolą web z podpowiadaniem składni SQL), bo baza ma przede wszystkim nie przeszkadzać. Do tego przejdzie się później (gdy coś będzie nie optymalnego).

    [Dygresja]
    Ogólnie pozostaje pytanie, czy trzeba promować technologie powszechne (Oracle) czy dobre dla początkującego (DB2, PostgreSQL oba są łatwiejsze do instalacji, mają nowsze wersje i mniej obciążają komputer, jeszcze 2 lata temu moi znajomi i ja jak stawialiśmy Oracle na domowym sprzęcie lub laptopie to robiliśmy to na wirtualnych maszynach lub osobnym systemie, PostgreSQL, MySQL, MSSQL, DB2 zawsze instalowałem wprost w systemie) zwłaszcza wśród mniejszych lub nowszych firm coraz częściej spotykam się z poglądem że DB2 jest “lepsza” (pod kontem technicznym i licencyjnym się z tym zgodzę, klient może mieć inne zdanie 😉 ).
    [Dygresja end]

    Seam to ogólnie był szkielet do aplikacji (bliżej kilku projektów Spring razem) niż coś powiązanego stricte z widokiem (choć bardzo JSF poprawiał). Seam 3 to są bardzo niewielkie dodatki do CDI i tylko jeden do JSF, ponieważ większość pomysłów w ten czy inny sposób przeszły 😉 Ogólnie JSF2 i CDI to naprawdę mocne combo. I co prawda JSF2 z bólem polecałbym początkującemu do samodzielnej nauki (brak dobrej książki jak na razie i kompletnych tutorialów innych niż hello world, dużo starych informacji i poglądów w sieci, a stare podejścia mocno zrażają do JSF), może jednak Vaadin? Na pewno nie GWT i nie Wicket.

    Żeby mnie też można było skrytykować 😉 to ja bym polecił komuś kto chce pracować później w Java i nie śpieszy mu się:

    JUnit!

    Eclipse + JBoss Tools (edytorki do JSF, validacja do CDI, wsparcie hibernate itp)
    Lista najważniejszych skrótów (Ctrl+1, Refactor, Source, bieganie po okienkach, szybkie modyfikacje, Quick Outline, Hierarchy, wyszukiwania plików/typów itd…)
    Use the source! – Czyli podpinanie źródła do czego się tylko da (JDK, bibliotek itp)

    Refaktoryzacja

    Debugowanie

    Seam Forge (do skonfigurowania reszty, to też wrzuci Maven-a)
    JBoss AS7 (bo hibernate, hibernate validator etc) uruchamiane z Eclipse (by auto deploy działał poprawnie)
    Arquillian! (więcej testów!)

    Servlets 3 (czyli na początek hello world, filtry, etc. w JEE 6 to całkiem proste jest)
    Selenium (2?) bo wszystko da się testować 😉 tu nie jestem pewien, ja bym brał Geb ale może Selenium lepiej początkujących?

    Podstawy GIT – to i tak przyszłość a samemu znacznie łatwiej korzystać z GIT niż z SVN

    Facelets (czyli JSF2 “ui:”, EL i generowanie statycznego html-a, dekorowanie i kompozycja, szablony, widok też może być obiektowy)
    HTML / CSS

    Wstęp do CDI – nazwane klasy o różnym czasie życia (Request, Application)

    Własne strony wyjątków, różne tryby działania (development, production)
    Arquillian i CDI – Alternatywne implementacje w testach i w różnych środowiskach

    PrettyFaces + CDI – przekazywanie parametrów w linku, ładne linki
    JSF2 “h:” + CDI -prosta nawigacja z PrettyFaces, linki i akcje
    “h:” + CDI – kolejne zakresy – View, Flash, bindings bean-komponent

    JSFUnit?
    Organizowanie fragmentów xhtml (niby kompomenty, szablony, statyczne fragmenty)

    JSF2 + RichFaces4 (idea komponentów i gotowce), może PrimeFaces
    Tworzenie komponentów w xhtml
    Co musi być w formularzu i czemu? Stan.

    AJAX, JavaScript

    H2 – baza danych
    JPA2 podstawowe encje i save, findAll etc.
    JPAQL – proste zapytania

    Formularze
    JSR303 / Hibernate Validator + JPA + JSF – automatyczna validacja danych

    DBUnit?

    SLF4J – logowanie w aplikacjach, wstęp

    Apache Shiro do autentykacji i autoryzacji

    Cache – cache a JSF, cache a JPA, cache a beans

    Ok, to mamy aplikacje z z kolorowym i migającym gui, która najpewniej się nie skaluje (stanowy widok + początkujący + JPA z kiepskim SQL, n+1, wiele zapytań w widoku), ale nie musi. Za to ma trwałe dane i obsługuje użytkowników. No i ma testy. Chyba nieźle. Biblioteki spoza standardu niewiele (PrettyFaces, h2, RichFaces, slf4j, Shiro) i zarządzane przez paskudnego Maven-a.

    Co dalej? Jak najmniej nowych framework-ów na razie (to nie jest zbyt ważne 😉 ), ale:
    XP, BDD, Scrum 🙂
    OOP i OOAD – SOLID, GRASP, Wzorce projektowe, DRY, KISS
    DDD – bo tak
    DAO, DTO, DAO, VO, BO – WTF?
    Jakość czyli Sonar
    Automatyzacja czyli Jenkins
    Wytrzymałość czyli JMeter
    Monitoring czyli JMX

    Czemu nie ma tu Spring? Bo jest nie potrzebny (CDI zapewni DI, AOP, eventy, widok jest, JPA2 działa wystarczająco dobrze samo na początek), wymaga dodatkowej konfiguracji, wprowadza zamieszanie i powtarza funkcjonalności – więc nie mam zamiaru tłumaczyć początkującemu czemu ma się tego uczyć. Szkody wielkiej nie ma, uważam, że i tak w stronę CDI będzie się JEE rozwijać (obstawiam, że w JEE 8 JPA, JMS, JCache będą korzystać z CDI a może i więcej).

    No i się rozpisałem.

  3. chlebik Post author

    Dzieki za fajny koment. Ale pozostawię go bez swojego komentarza, gdyż wyszłaby z tego dyskusja na 20 stron, a i tak nikt by nikogo do czegokolwiek nie przekonał – albowiem każdy ma inny punkt widzenia/doświadczenia i potencjalnych wizji siebie jako programisty. Może też źle napisałem tytuł tekstu – powinienem dodać ‘jeśli chcesz nauczyć się Javy by pracować w jednej z 99% firm w Polsce, które zajmują się pisaniem kodu w Javie’.

  4. Krzysiek

    Rozumiem, choć zmiana tytułu by mnie przekonała (z dodatkiem, “za pół roku”) ale testów nie odpuszczę 😉

  5. chlebik Post author

    Niestety we wszystkich firmach, w których do tej pory pracowałem nikt testów nie pisał/używał. Zaś nawet gdyby ktoś chciał to generalnie nie wiedząc jak działa np. konkretny framework to trudno pisać testy (wiem po sobie). Całe szczęście dość często w dzisijeszych IDE z podpiętym wsparciem np. dla Grailsów czy Springa przy np. utworzeniu kontrolera automatycznie jest generowana dla niego klasa testowa. Może choć to trochę ułatwia temat.

  6. Krzysiek

    Sam mam aktualnie projekt, który miał testy, ale testy wymagały testów lub nic nie testowały w praktyce i przestało to mieć sens. Właśnie dlatego trzeba ich uczyć się samemu, od początku i poznawać narzędzia które testy umożliwiają (projektowe: Spring DI, CDI oraz testowe JUnit, mockito, Selenium). Przecież każdy gdy zaczyna się uczyć programowania pisze w trybie Red,Green,Refactor (chce wypisać coś na ekran; nic nie mam; o mam hello world, a teraz zróbmy to inaczej…) 😉 tylko nie automatyzuje testów. Pisania testów i testowalnego kodu też trzeba się nauczyć. Gdy jednocześnie pisze się nowe funkcjonalności w produkcyjnym kodzie i uczy się testowania to wiadomo jak to się skończy.

    Zawsze można pisać testy jednostkowe tylko dla siebie 😉

    Niestety generowanie klas testowych nic nie zmienia, bo ważne jest co przetestować (Uncle Bob twierdzi, że wszystko) i jak to robić.

    Za to mając doświadczenie np. z Selenium 2, można napisać testy do każdej aplikacji webowej w dowolnej technologii opartej o HTML, potem można w firmach takie testy wdrażać (tylko trzeba wiedzieć jak je pisać by miały sens) 🙂

  7. drupality

    Po przeczytaniu tego postu sam pare lat wcześniej pewnie odpuściłbyś sobie Java. To najbardziej odpychające wprowadzenie do nauki Java jakie czytałem.

    Ogólne przesłanie: “Jest tego tak wiele, że lepiej daj sobie spokój i idź na ryby”.

    Ja mam całkowicie inną odpowiedź na Twoje pytanie: poznaj dobrze podstawy Java i podstawy EE, czyli JSP/Servlet. Załap się na jakiś opensource’owy projekt i się rozwijaj (praktyki, zdalnie itp). Jak ktoś jest ogarnięty i z taką wiedzą znajdzię pracę. Hibernate? Tego się może nauczyć na kodzie aplikacji, z którą przyjdzie mu pracować.

    Sam staram się przekonać do nauki Java EE. Ciężko jest, bo zarabiam na chleb zdalnie, a to niestety głównie PHP. Mimo wszystko chcę zacząć, ale kurna, takich postów to unikać jak ognia.

    Zamierzam pracę mgr pisać właśnie w EE, wrażenia postaram się opisywać na nowo powstałym blogu, chyba, że spotkam więcej takich demotywatorów i skończę na serwsie w Drupal, will see.

  8. Pingback: drupality » Od czego zacząć naukę Java, no właśnie…

  9. chlebik Post author

    Hmmm, początkowo chciałem olać, ale w sumie…

    Mój tekst o ‘Rozpoczynaniu z Javą EE’ miał na celu nie poinformowanie ludzi co zrobić, aby napisać w niej ‘Hello World’, ale by docelowo znaleźć w tej technologii zatrudnienie. I nie mówię o półrocznych bezpłatnych praktykach, ale o otrzymaniu satysfakcjonującej pracy na etacie/działalności za godziwe pieniądze. Ja byłem w takiej sytuacji. Pracowałem w PHP, całkiem nieźle mi to szło, pracowałem przy dobrych projektach i powodziło mi się całkiem nieźle. Jednakże nie chciałem przejść do świata Javy i zgodzić się na obcięcie dochodów o 50% (lub więcej) by w jakimś Accenture na ‘praktykach’ i tutaj cytat: ‘Zapierdalać jak mały parowozik’. Stąd takie podejście do nauki – pod kątem oczekiwań pracodawców w stosunku do Programistów Java/EE, a nie praktykantów czy ludzi do przyuczenia. Odwiedź serwisy rekruterskie – wpisz ‘java’ w wyszukiwarkę. Potem wróć i napisz mi w ilu ogłoszeniach wymagania kończą się na ‘Servlet i Java’. Potem jak już to przemyślisz to zajrzyj na strony POWAŻNYCH firm konsultingowych (np. 7N) i zobacz czego oczekują od kandydatów. Popatrz też na stawki.

    Moje podejście zdało egzamin – bo mogłem pójść na rozmowę kwalifikacyjną – nie wpisałem wówczas w życiu (jak teraz choćby) kiluset ‘mvn clean install’, nie napisałem setek testów, nie grzebałem w ustawieniach DataSource i kolejek na serwerze aplikacyjnym. Jednakże mogłem się pochwalić znajomością teoretyczno-edukacyjną tych zagadnień, co zresztą człowiek, który mnie rekrutował zauważył. Dostałem do napisania aplikację by udowodnić, że wiem co mówię (i chcę pracować) – myślisz, że od ręki napisałbym aplikację w SEAM, uruchamianą na JBossie z Hibernate i używającą API Facebooka w 2 dni nie bawiąc się wcześniej wspomnianym Hibernate/Tomcatem/JSF? Szczerze wątpię. Zasadniczo 3/4 z tych technologii, w których miałem ową aplikacyjkę napisać, nie użyłem nigdy wcześniej. Jednak doświadczenie zdobyte podczas pracy z tą masą technologii/bibliotek/frameworków dało o sobie znać. Udało i tak szczęśliwie mija ponad rok jak zawodowo klepię w JEE, dla dość konkretnych firm (obecnie w Agorze) i nie narzekam na życie.

    Zresztą dziwi mnie Twoje podejście (chyba jesteś dość młody jeszcze), co zresztą widać we wpisie, który umieściłeś na swoim blogu. Kiedy zaczynałem w PHP (a studiowałem wtedy politologię i pracowałem na pełen etat w knajpie) to myślisz, że człowiek, który dał mi szansę zadowolił się tym, że znam tylko PHP i umiem $mysqli->query()? Też zadecydowało to, iż znałem jQuery, pogrzebałem trochę przy Zend Frameworku i takie podejście wówczas załatwiło mi pierwszą pracę w IT. Do dziś zbieram tego owoce, bo nie zatrzymałem się na ‘Java SE i JDBC’. No i na pewno nie musiałem czytać tekstów zachęcających mnie do tego. Po prostu się nauczyłem. Pozdrawiam.

  10. drupality

    Ja podszedłem do Twojego wpisu od strony nauki, Ty znalezienia pracy, dobrze płatnej, wpis traktował o nauce. Zdaję sobie sprawę z potrzeby znajomości takich technologii, ale uczenie się, a znajdywanie dobrej pracy to co innego. Pół roku praktyk? Jeśli ktoś dobrze trafi, może wystarczy, na douczenie się Hibernate, Spring itp, aby znaleźć później dobrze płatną pracę.

    Moje podejście źle odebrałeś, nie neguję potrzeby posiadania dobrej wiedzy na temat x liczby technologii w przypadku ubiegania się o dobrą posadę y. Poza tym wcale nie uważam, że poznanie Servlet/JSP/Java daje super extra pracę, wcale tak nie myślę. Poznając dobrze podstawy masz jedynie solidną bazę, bez, której czasem bardzo ciężko. Ty pracujesz z framework’ami, ale pewnie wielu utrzymuje stare projekty Servlet/JSP, może Struts. Ucząc się podstaw, można oswoić się i polubić bardzo rozbudowaną JEE.

    Znam ludzi, którzy stosując podejście w stylu muszę znać technologie A,B,C,D,E,F itd żeby w ogóle składać CV do dzisiaj nie miało by pracy. Nie możesz przez pryzmat swojej ścieżki zawodowej (której zresztą gratuluję), patrzeć na podejście innych do tematu nauki. Początkujących nie powinno się odstraszać koniecznością poznania X liczby technologii, wpisałem w google hasło jak zacząć naukę, nie jak znaleźć dobrą pracę. Miałem pecha, trafiłem na Twój wpis, który wywarł na mnie taki, a nie inny wpływ.

    Fakt, na razie zarabiam na życie w głównie w PHP, ale nie piszę tylko $mysqli->query() i swoje wiem.

    Nie twierdzę, że istnieje jedyne, słuszne podeście do tego tematu i tymbardziej moje takie jest. Każdy potrzebuje własnego podejścia, jestem przekonany, że moje podejście się sprawdzi i pewnie znajdą się ludzie, którym przypadnie do gustu taka ścieżka.

    Pozdrawiam

  11. Justyna

    Jakie masz IQ że się tego wszystkiego sam nauczyłeś?
    Od kilku miesięcy staram się ogarniać Javę – ucząc się sama. I to trwa i trwa i trwa…. i umiem jakieś żałosne podstawy tylko. Mam wrażenie że trzeba mieć albo najwyższej jakości procesor osobisty (mózg) albo inne (nieznane mi) czynniki sytuacyjne wpływają, że Tobie się
    udało i to jak rozumiem dość szybko zrealizować to co napisałeś bez wykształcenia kierunkowego.

    Wydawało mi się że skoro mam umysł ścisły – nie genialny ale stara matura na 5 z matematyki – i jakoś to mi zawsze łatwo przychodziło, IQ – też ze dwa odchylenia powyżej średniej ;)… A czuję się jakby sami geniusze byli w internecie (i wypowiedzi typu “mam dziewięć lat i dziękuję za ten tutorial, zrobiłem cały w 2 godziny i wszystko od razu zrozumiałem”) Może jakoś się odniesiesz do tego?
    Ja skończyłam kilka lat temu psychologię i się miotam cały czas bo chciałabym w pracy robić coś ciekawego i rozwijać się cały czas (a nie mam nawet pracy w zawodzie). Kilka różnego rodzaju podjętych prób poszło na marne. Teraz czas na programowanie…

  12. chlebik Post author

    Najważniejsze to wiedziec co chce sie osiagnac. Potem trzeba miec konsekwentny plan osiagniecia zalozonego celu. No i oczywiscie konsekwentnie go realizowac.

    Co to znaczy, ze ‘umiesz zalosne podstawy’? Jak konkretnie sie uczysz? Bez odpowiedzi na te pytania nie bardzo jestem w stanie pomoc. Jak cos zapraszam na prv – michpioUSUNMNIETOPRZECIEZNIECHCESPAMU@gazeta.pl

  13. Damian

    bardzo mnie zainteresował wpis Justyny, ciekaw jestem na jakim jest etapie czy odpuściła czy dąży do swojego celu… po przeczytaniu jej komentarza pomyślałem sobie, kurde nie tylko ja tak mam 🙂

  14. Robert

    Też jestem ciekawy i i mam podobnie. Za naukę zabrałem się niecałe 2 lata temu. Wcześniej przed ponad 15 laty bawiłem się tylko Turbo Pascalem. W pierwszym roku zabrałem się za coś prostego, czyli zrobiłem kilka stron i prostych webowych aplikacji by opanować PHP, HTML, CSS, JS, jQuery. W kolejnym roku zabrałem się za Jave. Początek nie był prosty bo nigdy nie programowałem obiektowo. Wzorce projektowe były dla mnie przełomem i dzięki nim zrozumiałem idee. Pomogło mi w tym studium inżynierii oprogramowania na które się zapisałem. Dziś z samą Javą sobie radzę, skupiłem się na Androidzie i kończe pierwszą aplikację. Absolutne podstawy JavyEE znam, ale niestety ciągle nie mogę się zabrać za Spirng i Hibernate, marnie mi też idzie obsługa SQL. O dziwo to co mnie głównie hamuje to problemy konfiguracyjne. Obecnie pracuje w zupełnie innym zawodzie i nie zarabiam źle, również bym nie chciał zarabiać mniej. Czasem tracę wiarę, że jestem w stanie po godzinach ogarnąć taki pakiet wiedzy, by móc to dobrze sprzedać na rynku pracy.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s