SCJP

A mai nap sikeresen letettem a Sun Certified Programmer for the Java Platform, Standard Edition 6 (CX-310-065), rövid nevén SCJP vizsgát. Már rég meg kellett volna lépnem, a voucher is már majdnem egy éve megvan, de most tudtam rászánni magam. Leírnám a tapasztalataimat, hátha más is tudja kamatoztatni.

Felkészülés

Szinte kizárólag Katherine Sierra, Bert Bates: SCJP Sun Certified Programmer for Java 6 Exam 310-065 könyvet használtam felkészülésre. A könyv tíz fejezetből áll, és kifejezetten a vizsgára koncentrál, nagyon kevés plusz tudnivalót ír le, bár így is a tananyaggal foglakozó rész kb. 800 oldal. Azért érdemes ezt választani, mert írói részt vettek a vizsgakérdések kidolgozásában, egyértelműen definiálja a tananyagot, és példa teszt sorok is járnak hozzá. A könyvet mindig frissítették, ahogy új verziók jöttek ki a vizsgából.

A könyv egy bevezetéssel indul, mely a vizsga lebonyolításáról szól, hogyan kell jelentkezni, hogyan zajlik a vizsga, stb. Majd mindegyik fejezet hosszasan kifejti a tananyagot, tudnivalókat. A szöveg közben vannak un. Exam Watch keretes írások, melyek azt írják le, hogy mire kell a vizsgán odafigyelni, és viszonylag kevés On The Job keretes írás, hogy az ismeretett témakört hogyan érdemes a gyakorlatban alkalmazni. Mindegyik fejezet leírja Certification Objective fejezethez tartozó részét, azaz a Sun által kiadott témakörökre való hivatkozásokat. Mindegyik fejezet végén van egy összefoglaló, egy Two-Minute Drill mely felsorolásszerűen tartalmazza a fontosabb tudnivalókat (nevükkel ellentétbe nekem darabjának áttanulmányozása vagy 15 percig tartott). Itt vannak még a témakörhöz kapcsolódó példa kérdések és válaszok is (nagyon zavaró, mikor a kérdés felénél, a forráskódban van a sortörés). Különösen kiakasztott, hogy olyanokra kérdezett rá, melyeket az előző fejezetben nem írt le.

A CD mellékleten található két teljes vizsgasor is. Ezt meg lehet oldani úgy is, mintha a vizsgán lennénk (MasterExam), ugyanazokkal a feltételekkel, valamint quiz-szerűen is (Quiz). A CD mellékleten lévő vizsga 72 kérdéssel számol és 210 perccel. A quiz esetén 90 perc van a maximum 70 kérdésre, ez ne zavarjon meg minket, és ne keseredjünk el, reménytelen annyi idő alatt. A vizsga azonban nemrég változott, csak 60 kérdés van, melyeket 180 perc alatt kell megválaszolni. A program nagyon nem tetszett. Egyrészt nincsenek benne drag&drop kérdések, melyek a valós tesztben vannak. Ha egy teljes tesztet végigcsinálunk, akkor van lehetőség riport nyomtatására. A riport csak a jó válaszokat tartalmazza, és nem tartalmazza, hogy mi mit válaszoltunk, szóval csak a memóriánkra hagyatkozhatunk. Így a riport tanulásra teljesen alkalmatlan. Ehelyett alkalmazzuk a quiz-t, open book-kal, ilyenkor tippet is kapunk, valamint a választ megadva azonnal láthatjuk a helyes válaszokat, meg is magyarázva. A program honlapján regisztrálva állítólag még egy példa tesztet le lehet tölteni, de ezt nem próbáltam.

Én a teljes vizsgára kb. 30 órát készültem. Ebben benne van a könyv végigolvasása, a Two-Minute Drill-ek kétszeri végigolvasása, a fejezetek végén lévő tesztek megoldása, valamint a két példateszt végigpróbálása, és a válaszok kielemzése. Ennek bőven elég kell lennie. A vizsga a könyv kérdéseihez képest sokkal egyszerűbb, szóval ha az előbbin átmegyünk, nem lesz gondunk az éles vizsgán sem. Hasznos lehet még a JavaRanch.com-on lévő JSCP FAQ, valamint a Sun felkészítő anyaga. Bevallom, én a CD mellékleten kívül egy szabadon elérhető tesztsort sem vittem végig. Amit még elolvastam, ismétlő jelleggel Palacsint blogjában található SCJP csapdák poszt, mely nagyon jól használható. Innen vettem az ötletet, hogy én is összeírom a szerintem fontos dolgokat, melyet listaszerűen a poszt végén találsz.

Amire nagyon oda kell figyelni, az szerintem a collections, generics és concurrency.

Körítés

A vizsgára a voucher-t a Sun-nál lehet megrendelni, jelenleg 300$, ehhez semmiféle járulékos költség nem adódik. A vizsgát valamelyik Prometric vizsgaközpontban lehet letenni, természetesen én a SZÁMALK-ot válaszotottam, a vizsga előtt kb. két héttel jelentkeztem be. A vizsgán feleletválasztós kérdések (egy helyes válasz esetén rádiógomb, több esetén meg van adva a helyes válaszok száma - szemben a könyvvel) és pár drag&drop kérdés van (kódrészleteket kell kódrészletbe behuzigálni - egyet akár többször is, és nem kötelező mindet felhasználni). A rendelkezésre álló idő 180 perc, a 60 kérdésből 35-öt kell eltalálni a sikeres vizsgához (58.33 %). A vizsgára nem lehet íróeszközt, szatyrot, tárcát, telefont, kabátot bevinni, ezeket elzárják. Letörölhető jegyzettömböt adnak. Mindenképp érdemes vizet bevinni. Az idő nem kevés, én minden kérdésen még egyszer át tudtam menni. Ezt érdemes is megtenni, 4-5 kérdést biztos javítottam. A teszt közben ha valamelyik kérdésben nem vagy biztos, érdemes megjelölni, sőt a jegyzettömbre felírni, hogy melyik válaszra gyanakszol. A drag&drop-ról sokan mondták, hogyha újból megjeleníted, elveszted a már beírt dolgokat, így nem is kísérleteztem vele, de szerencsére nagyon egyszerűek voltak, nem akartam őket újra átnézni. A vizsga eredménye nem jelenik meg a képernyőn, hanem ki kell nyomtatni, és kinn adja oda az adminisztrátor.

Vélemény

Kérdés, hogy mennyi értelme van letenni az SCJP vizsgát? Sajnos itthon nem annyira elfogadott, álláskereséskor inkább a céget képviselő programozó kérdéseire, általa összeállított tesztsorra kell válaszolgatni. Kint jobb a helyzet, németeknél pl. sokat számít a papír. Magam részéről úgy gondolom (, régebben gyakrabban felvételiztettem), hogy az SCJP vizsgától még nem lesz jó programozó az emberből, de jobb programozó lesz, és mindenképp becsülendő, hogyha valaki időt és pénzt áldozott a felkészülésre és a vizsga megcsinálására. Ha egy cégnél dolgozunk, akkor szép juttatás lehet a vizsga, és arra való felkészülésnek a biztosítása.

És a végén az általam összegyűjtött dolgok, melyre érdemes odafigyelni:

  • Publikus osztályt nem tartalmazó állományt bárhogy elnevezhetünk.
  • Default hozzáféréssel rendelkező osztályok elérhetőek az ugyanabban a csomagban lévő osztályokból.
  • A példánymetódusok felüldefiniálásakor (override) az új metódus nem dobhat bővebb (broader, azaz nem azonos vagy leszármazott) ellenőrzött (checked) kivételeket.
  • A strictfp módosító osztályra és metódusra is alkalmazható.
  • Az enum deklaráció végén opcionális a pontosvessző.Ha egy statikus metódust hívunk egy változón keresztül, a fordító a változó deklarációjában szereplő osztályra cseréli ki.
  • Java 5-től kezdve a metódus felüldefiniálásakor a visszatérési érték lehet az eredeti visszatérési érték, vagy annak leszármazottai (covariant return)
  • Laza kötésre (loose coupling) és magas kohézióra (high cohesion) kell törekedni.
  • Az értékadó operátorok (pl. +=) automatikus típuskényszerítést végezhetnek
  • Az == használata autoboxing esetén trükkös, ugyanis byte, és -128 és 127 közötti Short, Integer értékek között egy pool van, így igazat fog visszaadni, e felett viszont hamist.
  • Egyenlőségvizsgálatnál ha két különböző osztályhierarchiában lévő osztály típusú változót hasonlítunk össze, már fordításkor elszáll
  • A switch esetén a case paraméterének fordítási időben kiszámolhatónak kell lennie
  • Ha byte típust adok át egy switch-nek, és a case után nem fér bele a szám byte-ba, fordítási hiba keletezik
  • A default block középen is lehet
  • System.exit-nél nem fut le a finally
  • Assert Java 1.4-től van
  • Nem szerializálható ősosztályok konstruktora, inicializációja lefut deszerializáláskor. Statikus változó sosem kerül szerializálásra.
  • A StringBuffer equals() metódusa nincs felüldefiniálva, nem az értéket hasonlítja
  • A megtanulandó printf flag-ek: -, +, 0, "," , és (, formátumok: %b, %c, %d, %f, %s. A %b boolean-ra, true-t ad minden non-null vagy non-boolean értékre.
  • Autoboxing esetén az equals() csak akkor igaz, ha a primitív típusok és az értékek is megegyeznek.
  • Queue interfész, PriorityQueue osztály
  • NavigableSet, NavigableMap interfészek: Java 6
  • A HashMap beenged null-t, a Hashtable nem
  • LinkedHashMap sorrendje: beszúrás vagy utolsó hozzáférés
  • equals metódusnál kötelező az Object típusú paraméter, compareTo-nál nem
  • headSet, subSet, tailSet - boolean paraméter - inclusive, ha nincs boolean, a kezdő mindig inclusive
  • Natural order: space, nagybetűk, kisbetűk
  • Generikus esetében a deklarációban és az értékadásban a generikus típusának pontosan meg kell egyeznie, amennyiben nem használunk wildcard karaktereket, azaz a List<Animal> aList = new ArrayList<Dog>(); nem fordul le, hiába a Dog az Animal leszármazottja
  • Példányosításnál generics wildcard nem használható
  • new MyOuter().new MyInner(); vagy MyOuter.MyInner inner = mo.new MyInner();
  • MyOuter.this
  • A vizsga szempontjából metóduson belül definiált osztály módosítója vagy abstract vagy final.
  • JAR készítésekor az a könyvtár is belekerül, melyet paraméternek megadunk, nem csak az az alatti könyvtárak, állományok
  • A Runnable példánynak nincs referenciája a szálra, ami futtatja, ezt lehet elkérni a Thread.currentThread() metódussal
  • Ha egy szál el lett indítva, nem lehet többet újra elindítani
  • sleep, yield: statikus metódusok
  • sleep-nél nem vesznek el a lock-ok
  • Console a java.io csomagban van
  • Polimorfizmus csak a példánymetódusokra vonatkozik, se a statikus metódusokra, se bármilyen típusú változókra
  • A Throwable az osztály
  • Szerializációkor a pontos metódus: private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException