Lépjünk eggyel feljebb

Posted by | · · · · | Szoftverfejlesztés | Nincs hozzászólás a(z) Lépjünk eggyel feljebb bejegyzéshez

Korábban beszámoltam az OCA vizsgára való felkészülésünk tapasztalatairól. Az előző kör sikerei arra ösztönöztek minket, hogy azzal a lendülettel letegyük az OCP vizsgát is.

OracleJavaSECerts072013

Továbbra is minden támogatást megkaptunk ahhoz, hogy elérjük a célkitűzésünket:

  • heti két órában munkaidőben készülhettünk,
  • kaptunk tankönyvet és gyakorló teszteket,
  • a vizsgadíjat, és az utazási költségeket is állta a cég.

Az OCA-s csapatból mindannyian jelentkeztünk, sőt időközben még ketten letették az OCA vizsgát, így összesen 11-en vágtunk neki az újabb kihívásnak. A felkészülés az előző körhöz hasonlóan történt. Hetente 1-1 témakört dolgoztunk fel, a könyv szerinti sorrendben haladtunk:

  • Java Class Design
  • Advanced Class Design
  • Object-Oriented Design Principles
  • Generics and Collections
  • String Processing
  • Java I/O Fundamentals
  • Java File I/O (NIO.2)
  • Building Database Applications with JDBC
  • Exceptions and Assertions
  • Localization
  • Threads
  • Concurrency

Minden hétre volt házi feladat, ami abból állt, hogy elolvastuk a könyv ill. a Java Tutorial megfelelő fejezetét (no meg az érintett osztályok JAVA API leírását), és az előző heti témakörhöz kapcsolódó teszteket töltöttünk ki. Első alkalomra a könyvben található  45 kérdéses tudásfelmérő teszt (pretest) segítségével mértük fel, hogy melyik témakörökben vannak hiányosságaink – többségünknek majd mindegyikben. Heti egyszer összeültünk, és átbeszéltük a kritikusabb pontokat, kielemeztük a tesztkérdéseket.

A tananyagról

Általánosságban elmondható, hogy “helyre tett” dolgokat. Az OCA áttekintőbb, az OCP jóval mélyebb, alaposabb, gyakorlati tudást feltételező, emellett “lexikális” tudás igénylő szint.

A mock tesztek kitöltésekor gyakran égnek állt a hajunk az ilyen jellegű kérdésektől, pl.:

  • X osztálynak hány konstruktora van?
  • bizonyos osztály melyik JAVA verziótól a JDK része, melyik csomagban található?
  • metódus signature helyes-e?

A vizsga tematikája több olyan témakört tartalmaz, amikkel a mindennapi projektjeink során egyáltalán nem, vagy csak közvetve találkozunk (elsősorban JEE6-ra épülő webes alkalmazásokat készítünk). Ezek pl.: Threads, Concurrency, Java File I/O (NIO.2)

A könyv első három fejezete nagyrészt az Associate szinten is szereplő témát dolgozott fel (OO fogalmak), nem tartogatott különösebb meglepetéseket. Ami mégis szót érdemel: singleton, (abstract) factory, és DAO desing pattern-ek, „nested class”-ok, és a „covariant return types” fogalma.

A Generics and Collections témakörnél szembesültünk először azzal, hogy itt azért jóval többről lesz szó, mint az OCA esetén. Elég sok újdonsággal találkoztunk ebben a fejezetben, elsősorban a Generics oldalon, amit egyébként használunk nap, mint nap. Ilyen volt pl., hogy wildcard (<?>) használatakor milyen kötöttségek vannak, de most értettük meg teljesen azt is, hogy mikor érdemes a <? extends T>, vagy <? super T>-t használni.

A String Processing fejezetnél az volt a nagy kérdés, hogy vajon milyen szinten kell fejből tudnunk a reguláris kifejezések, szövegformázó (printf) utasítások szintaktikáját, ill. az ide tartozó metódusok különféle változatait, azok paramétereit (method signature).

A Java I/O Fundamentals fejezetből a Console osztály használatát emelném ki, mint számunkra ismeretlen terepet, ill. a szerializálásról tudtunk meg néhány újdonságot.

A Java File I/O (NIO.2) egy teljesen új, JAVA 7-ben megjelent csomag. Az ide tartozót osztályok segítségével többek között be tudjuk járni a könyvtárstruktúra egy ágát (walking file tree), amivel pl. rekurzív törlést tudunk megvalósítani, továbbá figyelni tudjuk egy mappa változásait (watching directory for changes).

Building Database Applications with JDBC: azért volt érdekes, mert az általunk használt perzisztencia API (JPA) szinte teljesen elfedi ezt a réteget a szemünk elöl. Szinte csak az olyan feladatoknál alkalmazzuk ezt az API-t, ahol kritikus a performancia. A RowSet különböző implementációival sem találkozunk igazán, és a tranzakciókat is más szinten kezeljük.

Az Exceptions and Assertions-nél arra kellett figyelnünk, hogy assertion-t mikor, mire használhatunk, ill. megismerkedtünk egy a JAVA 7-ben bevezetett új fogalommal, a precise rethrow-val, ami elég furcsának tűnt elsőre.

A Localization fejezet felfedte előttünk, hogy resource bundle betöltésnél mi az alkalmazott keresési sorrend, továbbá a LOCALE függő szám- és dátumformázások rejtelmeiben lettünk járatosak.

A legkeményebb dió talán a Threads és Concurrency fejezet volt. Ezek áttanulmányozása során megtanultuk, hogy egy szál milyen állapotokban lehet (thread states), milyen konkurens hozzáférési (access) problémákkal kell számolnunk, ha szálakkal dolgozunk (pl.: data race, deadlock, livelock, starvation stb.), továbbá megismertük az atomic ill. executor és threadpool osztályok használatát. Elmélyedhettünk a fork/join framework működésében is.

Néhány érdekesebb dolog

Amit a könyv nem tárgyalt részletesen, vagy egyáltalán nem tartalmazott, de mégis jó ha tudsz, ha OCP vizsgára mész (tekinthető akár ennek a listának a kiegészítéseként, ami egyébként még SCJP-re készült):

  • enum konstruktora implicit private, interfészen property implicit static final
  • listáknál metódus hívásnál a super, extends kulcsszavak
  • azonos nevű metódusok hívásakor (pl. long/float/int stb. paraméterrel) mi a sorrend?
  • szerializációkor az első nem szerializálható ősnek rendelkeznie kell default konstruktorral
  • származtatásnál és interfész implementálásnál statikus és nem statikus property-k láthatósága: elfedik egymást, vagy első használatkor „reference to … is ambiguous…” fordítási hiba?
  • inicializáló blockból lehet checked kivételt dobni, de minden konstruktornak kell jeleznie ezt, static inicializáló blockből nem lehet checked kivételt dobni
  • jdbc statement egyszerre egy resultset-et kezel (ha volt korábbi, akkor azt automatikusan close-olja)
  • try with resource exception kezelésekor mi lesz „supressed”?
  • try with resource blockban megadott resource implicit final (mint foreach-nél a változó)
  • watch service-nél a key-en mindig kell reset-et hívni
  • file visitor interface metódusainak és paramétereinek ismerete

Vizsga, eredmények, statisztika

Bár a lelkesedésünk (tanulási kedvünk) a nyár beköszöntével jelentősen megcsappant, többé-kevésbé sikerült tartani az eredetileg betervezett ütemezést. November elejére tűztük ki a vizsga időpontját, amire végül nyolcan vállalkoztunk.

90 kérdést kellett megválaszolni 2 és fél óra alatt, minimum 65%-ot kellett elérni. A vizsga angol nyelven zajlik.

A tesztet mindannyian nehéznek (“szivatósnak”) éreztük. A kérdésekre jellemző volt, hogy több témát foglaltak magukban, pl.: egyszerre ismerni kellett a JAVA szálkezelését, tudni kellett, hogy melyik metódus milyen exception-t dob, és figyelni kellett arra is, hogy az osztályt megfelelő/létező konstruktorral példányosították-e stb.

Általános vélemény/tapasztalat, hogy a rendelkezésre álló időkeret (150 perc) éppen arra volt elég, hogy egyszer végigmenjünk a kérdéseken. Bár a szoftver lehetőséget biztosít arra, hogy megjelöljük azokat a kérdéseket, amikben bizonytalanok vagyunk, és azokra visszatérjünk (review), egyikünknek sem maradt arra ideje, hogy végigmenjen ratjuk.

A teszt kitöltése után hivatalosan 30 percen belül kellett megkapnunk az eredményt, valójában pár percen belül jött az értesítő e-mail, hogy az Oracle oldalán megtekinthető, hány százalékot sikerült elérnünk.

Végül mindannyiunknak sikerült a vizsga, az eredmények jobbak lettek, mint amit a felkészülés során kitöltött tesztjeink alapján vártunk: 80% fölötti átlagot sikerült produkálni a csapatnak, ami kifejezetten jól hangzik.


No Comments

Leave a comment