Koliko bi trebalo da zna Java backend programer iz kampus-izbora?
U nastavku ukratko delim ono što smatram stručnim sposobnostima i nivoom znanja koje bi trebalo da ima Java diplomanat iz kampus-izbora, uz lično sažeto delimično izdvajanje temâ za Java pozicije i preporuke knjiga za učenje — za referencu.
Najpre nešto apstraktno
Tri najupečatljivija intervjua:
Jedan je bio za poziciju backend programera kod jedne velike kompanije — ne za Javu
(Moj biografija je u to vreme bio skoro sve Java.)
Intervjuer odmah pita: za koju oblast tehnologije ili znanja misliš da si najbolje upućen — hajde da pričamo o onom što najbolje znaš.
(Tada sam pomislio da je intervjuer zaista na nivou 😄)
Drugi je bio u jednoj startup kompaniji za autonomnu vožnju
(Pre intervua saznao sam da ta kompanija postavlja izuzetno visoke zahteve na nivo algoritama, a moj nivo algoritama bio je ograničen samo na LeetCode.)
Tokom intervua dobio sam do tada neviđen ACM zadatak iz algoritma — pošto nisam imao nikakvu ideju, rešavao sam ga korak po korak uz vođstvo intervjuera.
Kasnije, kad sam dobio ponudu, shvatio sam da intervjuer, postavljajući zadatak, nije ni očekivao da kandidat odmah reši — želeo je da proveri sposobnost učenja, razumevanja, razmišljanja i rešavanja problema.
Najupečatljiviji je ipak intervju za Tao-series
Više nego intervju, podsećao je na razgovor sa velikim majstorom;
Umesto jednosmernog postavljanja pitanja, intervjuer je više pažnje posvetio dvosmernom razgovoru — za svega sat i nešto vremena dobio sam mnogo toga;
(O "kompatibilnosti nadole" kod velikih ljudi 😄)
Mislim da ovi intervjuui odražavaju neka očekivanja i zahteve koje intervjueri ili kompanije imaju prema studentima iz kampus-izbora:
- Dubina tehnologije i znanja: nije ključno koliko ste jezika naučili ili koliko okvira koristili, već to — za projekte na kojima ste radili, za tehnologije i znanje koje ste savladali — koje dubine možemo dosegnuti.
- Aktivno razmišljanje i učenje: na intervjuima intervjuer često postavlja pitanja o projektima ili srodnim tehnologijama iz biografije kandidata — time želi da proveri sposobnost kandidata da u procesu stvarnog učenja i rada otkriva, razmišlja i rešava probleme. Kažu da je u svakodnevnom radu ono čemu su programeri najveći majstori "programiranje okrenuto pretraživaču", ali po mom mišljenju, naći odgovor pretragom tek je prvi korak — razlog pojave baga, zašto kod ne radi, zašto na kraju ipak radi — to su pitanja koja treba dublje da proučavamo.
Sada nešto konkretno
Na osnovu svog iskustva sa intervjuima, sažeo sam nekoliko temâ za Java pozicije, za referencu.
Osnove Jave
Osnovna sintaksa, objektno-orijentisano programiranje, najčešće korišćene klase, nasleđivanje i polimorfizam i druge osnove ne treba posebno pominjati — pogledajte "Ergov put ka naprednom Javi".
Preporuka knjige: "On Java 8"
Toplo preporučujem da prilikom učenja Jave što više učite i referišete se na JDK izvorni kod, da biste shvatili suptilne programske ideje — JDK izvorni kod i Java doc su najautoritativniji materijal za učenje Jave.
Višenitnost
Mnogi studenti na fakultetu možda su se retko susretali sa scenama konkurentnosti, zato tome treba posvetiti veću pažnju.
Ključno znanje: pool niti, ključne reči volatile i synchronized, razni mehanizmi brava, prekidi, CAS, JUC paket za konkurentnost (npr. ReentrantLock i AQS) itd.
Preporučene knjige: "Umetnost Java konkurentnog programiranja", deo o konkurentnom programiranju u "Ergovom putu ka naprednom Javi".
JVM
Ključno znanje: mehanizam prikupljanja smeća, struktura Java memorije, mehanizam učitavanja klasa, Java model memorije, podešavanje performansi JVM-a itd.
Preporuka knjige: toplo preporučujem "Duboko razumevanje Java virtuelne mašine".
(To što ovako suvoparan materijal iz osnova može biti napisan tako jasno i zanimljivo — klanjam se pred majstorom.)
Spring
Toplo preporučujem čitanje izvornog koda Spring-a; ako vam je suviše suvo, možete učiti uz video. Ako nemate dovoljno vremena, pročitajte barem izvorni kod pokretanja Spring kontejnera, instancijacije i cikličnih zavisnosti graha (bean) — da biste zaista razumeli ideju Spring okvira i razvili sposobnost čitanja izvornog koda.
Ključno znanje: instancijacija i ciklične zavisnosti Spring graha (bean), ideja IoC-a, AOP i dinamički proxy, najčešće korišćene anotacije itd.
Preporuka knjige: "Tehnička unutrašnjost Spring-a"
Baze podataka
Prvo sistematski učite baze podataka — upoznajte se sa najčešćim relacionim i nerelacionim bazama, savladajte SQL naredbe, a posebno učite MySQL.
Ključno znanje: strukture podataka i indeksi, brave, transakcije, sistem logova, InnoDB osobine itd.
Preporuke knjiga: "Pojmovi sistema baza podataka", "MySQL obavezno znanje"
Računarske mreže
Ključno znanje: HTTP, TCP, IP i srodne teme
Preporuke knjiga: "Računarske mreže — top-down pristup", "HTTP ilustrovano", "TCP/IP ilustrovano"
Mrežno programiranje
Ključno znanje: sinhrono/asinhrono/blokirajuće/neblokirajuće/BIO/NIO/AIO, "zero copy", Netty itd.
Preporuke knjiga: "Netty autoritativni vodič", "Vodič za NIO i Socket programiranje"
Operativni sistemi
Ključno znanje: procesi i niti, komunikacija između procesa, raspoređivanje procesa, upravljanje memorijom itd.; vešto ovladati Linux naredbama
Preporuke knjiga: "Duboko razumevanje sistemâ računara", "Moderni operativni sistemi"
Distribuirani sistemi i mikroservisi
Sistematski učite principe i osnovnu teoriju distribuiranih sistema, upoznajte se sa RPC-jem, posrednicima poruka, distribuiranim kešom, registracionim centrima, distribuiranim transakcijama, algoritmima distribuirane konzistentnosti, distribuiranim bravama itd.
Ključno znanje: Redis i dizajn distribuiranog keša, RPC i Dubbo okvir, redovi poruka i RocketMQ, Paxos, Raft i drugi algoritmi distribuirane konzistentnosti itd.
Strukture podataka i algoritmi
Preporučujem paralelno čitanje knjiga iz algoritama i rešavanje zadataka na LeetCode-u, s naglaskom na grupisanje i sažimanje.
Ključno znanje: najčešće strukture podataka (binarno stablo, stek i red, povezana lista itd.), algoritmi sortiranja, dinamičko programiranje, obilazak u širinu i u dubinu, backtracking itd.
Preporuke knjiga: "Mač na ponudu" (prilično osnovna) + "Vodič za intervju koda programera: optimalna rešenja zadataka iz algoritama i struktura podataka IT divova" (na Niuke-u postoji odgovarajuća baza zadataka)
Ostalo
- Git, Maven/Gradle — principi i korišćenje naredbi, Docker;
- Scenarijska pitanja: (tzv. "na intervjuu se pravi raketa") — na primer kako dizajnirati sistem za "seckill" (rasprodaja u sekundi), koji su ključni punktovi pri dizajnu posrednika za poruke itd.; uglavnom se proverava makro razumevanje sistema i integrisana primena osnovnog znanja i iskustva na projektima.
Referenca: https://www.zhihu.com/question/403508943/answer/2036074069, obradio: Chenmo Wang Er
