Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Miben különbözik a Java a többi népszerű nyelvtől? Miért a Java legyen az első nyelv, amelyet megtanulnak? Készítsünk egy tervet, amely segít megtanulni a Java nyelvet a semmiből és a programozási ismeretek más nyelveken történő alkalmazásával. Soroljuk fel a különbségeket a termelési kód Java-ban való létrehozása és más nyelveken történő fejlesztés között. Mihail Zatepyakin felolvasta ezt a jelentést a jövőbeli résztvevők találkozóján szakmai gyakorlatok Yandex és más kezdő fejlesztők - Java Junior találkozó.


- Üdv mindenkinek, a nevem Misha. A Yandex.Market fejlesztője vagyok, és ma elmondom, miért kell megtanulni a Java-t, és hogyan kell ezt hatékonyan csinálni. Feltehetsz egy ésszerű kérdést: miért én mesélem el ezt a történetet, és nem egy erős, sok éves tapasztalattal rendelkező fejlesztő? Az a helyzet, hogy én magam is nemrég, nagyjából másfél éve tanultam a Java nyelvet, így még mindig emlékszem, milyen volt, és milyen buktatók vannak.

Egy évvel ezelőtt a Yandex.Marketnél kaptam gyakorlatot. A hátteret Beru-hoz fejlesztettem, magához a Markethez, valószínűleg te is használtad. Most ott folytatom a munkát, egy másik csapatban. Elemző platformot hozunk létre a Yandex.Market számára az üzleti partnerek számára.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Kezdjük el. Miért tanuljuk meg a Java nyelvet gyakorlati szempontból? A tény az, hogy a Java egy nagyon híres programozási nyelv. Nagyon nagy közössége van.

Például van egy ilyen TIOBE index, a programozási nyelvek népszerűségének népszerű indexe, és ott a Java az első helyen. Valószínűleg az álláshelyeken is feltűnik majd, hogy az állások nagy része Java-ról szól, vagyis Java-ban fejlesztve mindig lehet munkát találni.

Mivel a közösség nagyon nagy, minden kérdésedre választ találsz néhány Stack Overflow vagy más webhelyen. Továbbá, ha Java-ban fejleszt, valójában kódot ír a JVM-re, így könnyen válthat a Kotlin, a Scala és más, a JVM-et használó nyelvekre.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Mi a jó a Java-ban ideológiai szempontból? Különféle programozási nyelvek léteznek. Különféle problémákat oldanak meg, ezt te is tudod. Például a Python kiválóan alkalmas egysoros szkriptek írására a gyors problémák megoldására.

Pozitívum, hogy teljes mértékben vezérelheti a végrehajtható kódot. Például vannak autóink, Yandex vezető nélküli autóink, a kódjuk pluszban van írva. Miért? A Java-ban van egy ilyen dolog - a Garbage Collector. Megtisztítja a RAM-ot a felesleges objektumoktól. Ez a dolog spontán elindul, és megállítja a világot, vagyis leállítja a program többi részét, és megy az objektumok számlálására, az objektumok memóriájának törlésére. Ha drónban működik ilyesmi, az nem menő. A drón egyenesen fog vezetni, ebben a pillanatban törli a memóriáját, és egyáltalán nem néz az útra. Ezért a drón a profikra van írva.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Milyen problémákat old meg a Java? Ez elsősorban olyan nagy programok kidolgozásának nyelve, amelyeket évek alatt írnak, több tucat vagy több száz ember. Különösen a Yandex.Market háttérrendszerének nagy része Java nyelven íródott. Több városban van elosztott csapatunk, mindegyikben tíz ember. A kódot pedig könnyű karbantartani, legalább tíz éve támogatott, ugyanakkor új emberek jönnek be és értik meg ezt a kódot.

Milyen tulajdonságokkal kell rendelkeznie egy nyelvnek, hogy a benne lévő kód könnyen támogatott legyen, és nagy csapatokban könnyen fejleszthető legyen. Mindenekelőtt legyen olvasható kód, és könnyen megvalósítható legyen az összetett építészeti megoldások. Ez azt jelenti, hogy könnyű legyen magas szintű absztrakciókat írni, stb. Mindezt a Java biztosítja számunkra. Ez egy objektum-orientált nyelv. Nagyon könnyű magas szintű absztrakciókat és összetett architektúrákat megvalósítani.

Javahoz is rengeteg keretrendszer és könyvtár létezik, mert a nyelv több mint 15 éves. Ez idő alatt mindent felírtak rá, amit fel lehetett írni, így rengeteg könyvtár található mindenhez, amire szüksége lehet.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Véleményem szerint milyen alapkészségekkel kell rendelkeznie egy kezdő JA játékosnak? Először is ez a Java alapnyelv ismerete. A következő egyfajta Dependency Injection keretrendszer. A következő előadó, Kirill erről részletesebben fog beszélni. Nem megyek túl mélyre. A következő az építészet és a tervezési minták. Tudnunk kell építészetileg szép kódot írni ahhoz, hogy nagy alkalmazásokat írhassunk. És ez egyfajta SQL vagy ORM az adatbázissal való munkavégzéshez. És ez inkább a háttérrendszerre vonatkozik.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Megy! Java mag. Nem igazán fogom itt felfedezni Amerikát – tudnia kell magát a nyelvet. Mire érdemes odafigyelni. Először is, a Java rengeteg verziót adott ki az elmúlt években, vagyis 2014-2015-ben megjelent a hetedik, majd a nyolcadik, kilencedik, tizedik, rengeteg új verzió, és sok új klassz dolog került be bennük , például a Java Stream API , lambda stb. Nagyon menő, friss, menő dolgok, amiket a gyártói kódban használnak, miről kérdeznek az interjúkban, és amiket tudnod kell. Ezért ne vegyen le egy könyvet a Java-4 könyvtár polcáról, és tanulja meg. Ez a tervünk: megtanuljuk a Java-8-at vagy újabbat.

Nagy figyelmet fordítunk az olyan újításokra, mint a Stream API, var, stb. Az interjúk során megkérdezik őket, és folyamatosan használják a gyártásban. Vagyis a Stream API sokkal menőbb, mint a hurkok, általában nagyon klassz dolog. Ügyeljen rá.

És mindenféle dolog létezik, például iterátorok, kivételek és így tovább. Számodra lényegtelennek tűnő dolgok, amíg magad írsz egy kis kódot. Neked nincs szükséged ezekre a kivételekre, kinek kellenek mégis? De az interjúkon biztosan megkérdezik őket, biztosan hasznosak lesznek a gyártás során. Általában figyelni kell a kivételekre, az iterátorokra és egyéb dolgokra.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Adatstruktúrák. Nem megy struktúrák nélkül, de nagyszerű lesz, ha nem csak azt tudod, hogy vannak készletek, szótárak és lapok. És a szerkezetek különböző megvalósításai is. Például ugyanannak a Java szótárnak számos implementációja van, köztük a HashMap és a TreeMap. Különböző aszimptotikumaik vannak, belül más a felépítésük. Tudnia kell, miben különböznek egymástól, és mikor melyiket használja.

Az is nagyon jó lenne, ha ismeri, hogyan működnek ezek az adatstruktúrák belsőleg. Vagyis nem könnyű megismerni az aszimptotikumukat - mennyit működik a tét, mennyi ideig működik a passz, de hogyan működik a szerkezet belül - például, mi az a vödör a HashMapben.

Érdemes odafigyelni a fákra és a grafikonokra is. Ezek olyan dolgok, amelyek nem túl gyakoriak a gyártási kódban, de népszerűek az interjúkban. Ennek megfelelően tudnia kell fákon, szélességben és mélységben is bejárni. Ezek mind egyszerű algoritmusok.

Amint elkezd bármilyen nagy kódot, összetettet, könyvtárakat használó, több osztályú kódot írni, rá fog jönni, hogy nehéz számodra a rendszerek felépítése és a függőségek feloldása nélkül. Ezek elsősorban Maven és Gradle. Lehetővé teszik könyvtárak importálását a projektbe egy sorban. Vagyis írsz egy egysoros xml-t, és programkönyvtárakat importálsz a projektbe. Remek rendszerek. Körülbelül azonosak, használjon egyet - Maven vagy Gradle.

Következő - valamilyen verzióvezérlő rendszer. A Git-et ajánlom, mert népszerű, és rengeteg oktatóanyag van. Szinte mindenki használja a Git-et, klassz dolog, nem lehet nélküle élni.

És valamiféle fejlesztői környezet. Az IntelliJ Ideát ajánlom. Nagyban felgyorsítja a fejlesztési folyamatot, sokat segít, megírja helyetted az összes alapkódot, általánosságban jó.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Linkek a diáról: SQLZOO, habrapost

SQL. Egy kicsit a backenderekről. Valójában volt itt egy vicces eset. Két nappal a második gyakornoki interjúm előtt felhívott egy HR-es lány, és azt mondta, hogy két nap múlva megkérdeznek az SQL-ről és a HTTP-ről, meg kell tanulnom. És szinte semmit sem tudtam az SQL-ről vagy a HTTP-ről. És rátaláltam erre a klassz oldalra... SQLZOO. 12 óra alatt megtanultam rajta az SQL-t, mármint az SQL szintaxist, a SELECT lekérdezések írását, JOIN-t stb. Nagyon klassz oldal, nagyon ajánlom. Valójában 12 óra alatt megtanultam a 90%-át annak, amit most tudok.

És az adatbázis-architektúrát is nagyon jó ismerni. Ezek mindenféle kulcsok, indexek, normalizálás. Erről egy sor bejegyzés található a Habrén.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

A Java nyelven az SQL mellett mindenféle objektum-relációs leképező rendszer létezik, mint például a JPA. Van valami kód. Az első metódusban van néhány SQL kód - SELECT id name FROM info.users WHERE id IN userIds. A felhasználói adatbázisból, a táblából nyerjük ki az azonosítóikat és a nevüket.

Ezután van egy bizonyos leképező, amely egy objektumot az alapból Java objektummá alakít. És van egy harmadik módszer az alábbiakban, amely ténylegesen végrehajtja ezt a kódot. Mindez a JPA segítségével egy sorral helyettesíthető, ami alább van írva. Ugyanezt teszi – keresse meg az All ByIdIn-t. Vagyis a metódus neve alapján SQL lekérdezést generál neked.

Nagyon klassz dolog. Jómagam, amikor még nem ismertem az SQL-t, JPA-t használtam. Általában figyeljen. Ha túl lusta az SQL megtanulásához, az katasztrófa. És általában a tűz!

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Tavaszi. Ki hallott már olyanról, mint a tavaszi keret? Látod, hányan vagytok? Nem ok nélkül. A tavasz minden második Java-háttérrendszer megüresedésének követelményei közé tartozik. Enélkül tényleg nincs sehol egy nagy fejlődés. Mi a tavasz? Először is, ez egy Dependency Injection keretrendszer. Erről is el fogja mondani következő előadó. De röviden ez egy olyan dolog, amely lehetővé teszi, hogy megkönnyítse egyes osztályok függőségének importálását másokra. Vagyis leegyszerűsödik a függőségek ismerete.

A Spring Boot a Spring egy darabja, amely lehetővé teszi a szerveralkalmazás futtatását egyetlen gombbal. Megnyitja a THID-et, megnyom néhány gombot, és most már fut a kiszolgálóalkalmazása a localhost 8080-on. Vagyis még egyetlen kódsort sem írtál, de már működik. Nagyon klassz dolog. Ha írsz valamit a sajátodból, tüzelj!

A tavasz egy nagyon nagy keret. Nemcsak felveszi a kiszolgálóalkalmazást, és feloldja a Dependency Injection-t. Lehetővé teszi egy csomó dolog elvégzését, beleértve a REST API metódusok létrehozását. Vagyis írtál valami metódust, és hozzá csatoltad a Get mapping annotációt. És most már van valami módszered a localhost-on, ami azt írja, hogy Hello world. Két soros kód és működik. Menő cucc.

A tavasz a tesztírást is megkönnyíti. Nagy fejlesztésben nincs lehetőség tesztelésre. A kódot tesztelni kell. Erre a célra a Java-nak van egy klassz könyvtára, a JUnit 5. És általában a JUnit, de a legújabb verzió az ötödik. Minden van a teszteléshez, mindenféle állítás és egyéb dolgok.

És van egy fantasztikus Mockito keretrendszer. Képzelje el, hogy van néhány funkciója, amelyet tesztelni szeretne. A funkció sok mindent megtesz, például valahol középen bejelentkezik a VKontakte-ba az Ön azonosítójával, és megkapja a VKontakte felhasználó vezeték- és keresztnevét az azonosítóból. Valószínűleg nem fogja bevonni a VKontakte-t a tesztekbe, ez furcsa. De tesztelni kell a funkcionalitást, ezért ezt az osztályt a Mockito, mok it, utánzásával készítetted.

Azt fogja mondani, hogy amikor egy kérés érkezik ehhez az osztályhoz ilyen és ehhez hasonló azonosítóval, akkor valamilyen vezetéknevet ad vissza, például Vasya Pupkin. És működni fog. Vagyis tesztelni fogja a mok one osztály összes funkcióját. Nagyon klassz dolog.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Link a diáról

Tervezési minták. Ami? Ezek sablonok a fejlesztés során felmerülő tipikus problémák megoldására. A fejlesztés során gyakran felmerülnek azonos vagy hasonló problémák, amelyeket jó lenne valahogy jól megoldani. Ezért az emberek bevált gyakorlatokat, bizonyos sablonokat találtak ki arra vonatkozóan, hogyan lehet megoldani ezeket a problémákat.

Van egy weboldal a legnépszerűbb mintákkal - refaktoring.guru, elolvashatod, megtudhatod, milyen minták vannak, elolvashatsz egy csomó elméletet. A probléma az, hogy gyakorlatilag használhatatlan. Valójában a gyakorlat nélküli minták nem különösebben hasznosak.

Hallani fog néhány mintáról, mint például a Singletone vagy a Builder. Ki hallotta ezeket a szavakat? Sok ember. Vannak olyan egyszerű minták, amelyeket magad is megvalósíthatsz. De a legtöbb minta: stratégia, gyár, homlokzat - nem világos, hogy hol kell alkalmazni.

És amíg nem lát a gyakorlatban egy másik személy kódjában egy helyet, ahol ezt a mintát alkalmazzák, addig nem fogja tudni alkalmazni azt maga. Ezért a gyakorlás nagyon fontos a mintáknál. Ha csak olvasni róluk a refaktoring.guru oldalon, az nem túl nagy segítség, de mindenképpen megéri.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Miért van szükség mintákra? Tegyük fel, hogy van egy felhasználói osztálya. Van egy azonosítója és egy neve. Minden felhasználónak rendelkeznie kell azonosítóval és névvel. Balra fent az osztályterem.

Milyen módokon inicializálható a felhasználó? Két lehetőség van - konstruktor vagy szetter. Mik a hátrányai mindkét megközelítésnek?

Konstruktőr. új felhasználó (7, "Bond"), oké. Tegyük fel, hogy nem User osztályunk van, hanem egy másik, hét numerikus mezővel. Kapsz egy konstruktort, amely hét egymást követő számot tartalmaz. Nem világos, hogy mik ezek a számok, és melyik ingatlanhoz tartozik közülük. A tervező nem nagyszerű.

A második lehetőség a beállító. Egyértelműen írod: setId(7), setName(“Bond”). Megérti, hogy melyik tulajdonság melyik mezőbe tartozik. De setternek van egy problémája. Először is, elfelejthet hozzárendelni valamit, másodszor pedig kiderül, hogy az objektum változtatható. Ez nem biztonságos, és kissé csökkenti a kód olvashatóságát. Ezért találtak ki az emberek egy klassz mintát – Builder.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Ez miről szól? Próbáljuk meg egyesíteni a két megközelítés – a beállító és a konstruktor – előnyeit egyben. Készítünk egy bizonyos objektumot, a Builder-t, aminek Id és Name mezői is lesznek, ami maga is a setter alapján épül fel, és lesz egy Build metódus, ami visszaad egy új User-t az összes paraméterrel. Megváltozhatatlan tárgyat és szettert kapunk. Menő!

Mik a problémák? Itt van a klasszikus Builder. A probléma az, hogy még mindig elfelejthetünk ellenőrizni bizonyos mezőket. És ha elfelejtettük meglátogatni az azonosítót, ebben az esetben a Builderben nullára inicializálódik, mivel az int típus nem nullázható. Ha pedig a „Bond” nevet adjuk, és elfelejtjük felkeresni az azonosító irodát, akkor új Felhasználónk lesz „0” azonosítóval és „Bond” névvel. Nem menő.

Próbáljunk meg küzdeni ez ellen. A Builderben az int-t int-re változtatjuk, így az érvényteleníthető. Most minden nagyszerű.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Ha „Bond” néven próbálunk létrehozni egy Felhasználót, elfelejtve az azonosítóját, null pointer kivételt kapunk, mivel az azonosító nem nullázható, és a Buildernek van nulla, konkrétan pointer kivétele.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

De még mindig elfelejthetünk nevet adni, ezért az objektum visszajátszását nullra állítjuk. Most, amikor az objektumunkat Builderből építjük, ellenőrzi, hogy a mező nem nullázható-e. És ez még nem minden.

Nézzük az utolsó példát. Ebben az esetben, ha valahogy nullát helyeznénk az ID futási környezetbe, jó lenne azonnal tudni, hogy megtette, és nem jó, hogy most hibát követ el.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Nem a Felhasználó létrehozása pillanatában kell hibát dobni, hanem amikor nullát állítunk be az azonosítóra. Ezért a Builderben az Integer settert int-re változtatjuk, és azonnal esküdni fog, hogy nullát dobtak ki.

Röviden: mi a lényeg? Létezik egy egyszerű Builder-minta, de még a megvalósításában is vannak finomságok, ezért nagyon jó nézegetni a minták különböző megvalósításait. Mindegyik mintának több tucat megvalósítása van. Ez az egész nagyon érdekes.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Hogyan írjuk be a Buildert a gyártási kódba? Itt a Felhasználónk. A Lombok könyvtárból egy Builder rotációt csatolunk hozzá, és maga generál nekünk egy Buildert. Vagyis nem írunk kódot, de a Java már azt hiszi, hogy ennek az osztálynak van Builderje, és ezt így nevezhetjük.

Már mondtam, hogy a Java szinte mindenhez rendelkezik könyvtárral, beleértve a Lombok-ot is, egy remek könyvtárat, amely lehetővé teszi, hogy elkerülje a sablonok írását. Építő, GET.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

A minták lehetnek építészeti jellegűek – nemcsak egy osztályhoz, hanem a rendszer egészéhez kapcsolódhatnak. Van egy ilyen klassz elv a rendszertervezésben: az Egységes Felelősség Elve. Miről beszél? Az a tény, hogy minden osztálynak felelősnek kell lennie a saját funkcióiért. Ebben az esetben van egy Vezérlőnk, amely kommunikál a felhasználókkal, JSON-objektumokkal. Van egy Facade, amely a JSON-objektumokat olyan modellekké alakítja, amelyekkel a Java alkalmazás ezután fog működni. Van egy szolgáltatás, amely összetett logikával működik ezekkel a modellekkel. Van egy Data Access Object, amely ezeket a modelleket az adatbázisba helyezi, és lekéri az adatbázisból. És ott van maga az adatbázis. Más szóval, mindez nem egy osztályban van, hanem öt különböző osztályt készítünk, és ez egy másik minta.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Miután többé-kevésbé megtanulta a Java nyelvet, nagyszerű, ha saját projektet ír, amely adatbázissal rendelkezik, más API-kkal működik, és a szerveralkalmazását a REST API-kliensek számára teszi elérhetővé. Ez nagyszerű dolog lenne, ha hozzáadná az önéletrajzát, ez egy jó befejezése lenne az oktatásának. Ezzel elmehetsz és szerezhetsz munkát.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Itt van egy példa a szerveralkalmazásomra. A második évben egy félévi dolgozatot írtam a srácokkal. Mobil alkalmazást írtak rendezvények szervezésére. Ott a felhasználók a VKontakte-on keresztül bejelentkezhetnek, pontokat helyezhetnek el a térképen, eseményeket hozhatnak létre, meghívhatják barátaikat, menthetik az események képeit stb.

Mit csináltam a projektben? Szerveralkalmazást írt a Spring Bootban SQL használata nélkül. Nem ismertem, JPA-t használtam. Mit tehetett? Jelentkezzen be a VK-ba az OAuth-2-n keresztül. Vedd a felhasználói tokent, menj vele a VK-ra, ellenőrizd, hogy valódi felhasználó-e. Információkat kaphat a felhasználókról a VKontakte segítségével. Képes volt az információkat adatbázisba menteni, a JPA-n keresztül is. Ügyesen mentse el a képeket és egyéb fájlokat a számítógép memóriájába, és mentse el az ezekre mutató hivatkozásokat az adatbázisba. Akkor még nem tudtam, hogy vannak CLOB objektumok az adatbázisban, ezért így csináltam. Volt egy REST API a felhasználóknak, kliens alkalmazásoknak. És voltak egységtesztek az alapvető funkciókhoz.

[…] Egy kis példa a Java sikeres tanulására. Az egyetem első évében C#-t tanítottak, és megértettem az OOP programozást – mik azok az osztályok, interfészek, absztrakció, és miért van szükség rájuk. Nekem nagyon sokat segített. E nélkül a Java tanulása meglehetősen nehéz, nem világos, miért van szükség az osztályokra.

Miért tanulja meg a Java-t, és hogyan kell ezt hatékonyan csinálni? Yandex jelentés

Az egyetem második évében ismét Java core-t tanítottak, de nem álltam meg itt, magam mentem tanulni a tavaszt, és írtam egy kurzusdolgozatot, a projektemet, amit fentebb említettem. És mindezzel elmentem gyakorlatra a Yandexhez, sikeresen interjút készítettem, és bekerültem a Yandex.Marketbe. Ott írtam a Beru hátterét, ez a mi piacterünk, és magának a Yandex.Marketnek.

Ezt követően hat hónappal ezelőtt átigazoltam egy másik csapathoz ugyanazon a piacon. Üzleti partnereink számára elemzést végzünk. Az elemző platformban vagyunk, hárman vagyunk a háttérben, így nagyon nagy befolyásom van a projektben. Valójában nagyon érdekes. Vagyis tulajdonképpen a piacról adunk adatokat - milyen értékesítések, milyen kategóriákban, milyen modellekben, üzleti partnerek, nagy neves cégek számára. És csak hárman vagyunk, mi írjuk ezt a kódot, és ez nagyon klassz.

Köszönöm! Hasznos Linkek:
- "Java 8. Útmutató kezdőknek".
- Adatstruktúrák.
- SQLZOO.
- Adatbázis normalizálása.
- Tervezési minták.
- Tervezési minták.
- Tiszta kód.
- Hatékony Java.

Forrás: will.com

Hozzászólás