Kako popuniti prijavu za računarski smer na prijemnom ispitu — kako izabrati između računarske nauke, veštačke inteligencije, softverskog inženjerstva, velikih podataka, interneta stvari i mrežnog inženjerstva?
Otkako su izašli rezultati prijemnog ispita (gaokao), u grupama za razgovor sve pršti od diskusija; kao neko ko je već prošao kroz sve, svi pred mlađom braćom i sestrama igramo važnu ulogu — izbor škole i smera ipak određuje u kom pravcu će ići ostatak vašeg života i kakav će biti!

Kada sam ja krenuo na fakultet, nisam uopšte ni znao da se računarski smer može tako fino podeliti: računarska nauka, veštačka inteligencija, softversko inženjerstvo, veliki podaci, internet stvari, mrežno inženjerstvo, frontend itd.!
Prilikom popunjavanja prijave nakon prijemnog, prvi mi je izbor bila mehanika i automatika, ali nisam prošao, pa sam prebačen na smer računarskih mreža — i tako sam, pomalo zbunjeno, upisao taj smer!
Ko bi rekao da je računarski smer toliko tražen! Ispočetka je bio smešten u školi kao „loš" smer, a na kraju potpuno nadmašuje sve ostale.
Za druge smerove ne znam dovoljno, pa ću ovde govoriti samo o računarskom. Pre svega, nemoj se opterećavati time da li je grana „zasićena" ili ne — u svakoj industriji, sa porastom broja studenata, kako god ne bi bila zasićena?
Računari su zasićeni zato što su popularni! Zašto su popularni? Zato što su plate visoke! Nema druge, svi idu zbog visoke plate, kao čitalac o komem sam nedavno pričao, takođe moj zemljak — u ByteDance-u ima SSP paket od 500 hiljada godišnje; običan čovek u bilo kom drugom smeru jedva dolazi do te cifre.
Čak i ako neko zbog obrazovanja ili sposobnosti za učenje ode na outsourcing, ipak može izdržavati celu porodicu.
Ovde neću govoriti da svi slepo izaberu računarski smer; samo ću reći šta mi je računarski smer doneo i kako ja vidim računarski smer, kao referencu za vas.
Među mojim čitaocima ima i onih roditeljskog uzrasta, pa i osnovaca — ovaj članak bi trebalo da zadovolji potrebe svih grupa, a i ubuduće ću svake godine na ovoj osnovi praviti nove verzije, kako bi vam služio za referencu.

Kao običan student, ja sam promenio sudbinu upravo zahvaljujući računarskom smeru! Sledeća slika je izgled mog rodnog kraja; stari čitaoci je se sigurno sećaju — ne bih rekao da je to neka zabit, jer je nebo veoko plavo, a vazduh zaista čist.

Da sad kažem kako izabrati između računarske nauke, veštačke inteligencije, softverskog inženjerstva, velikih podataka, interneta stvari, mrežnog inženjerstva i frontenda.
1) Ako želiš na master ili doktorat
Na osnovnim studijama preporučujem računarsku nauku, a na diplomskim i postdiplomskim studijama veštačku inteligenciju ili velike podatke.
2) Viša škola ili osnovne studije
Preporučujem računarsku nauku ili softversko inženjerstvo; ako izabereš softversko inženjerstvo, predlažem da nakon diplome odmah kreneš u rad; ako izabereš računarsku nauku, možeš na master, a možeš i na rad — fleksibilno je.
Frontend — mnoge devojke, ali i oni koji ne žele da se „guraju", smatraju da je frontend dobar pravac. Zaista se poslednjih godina frontend mnogo promenio, u razvoju softvera uloga mu je sve važnija; ako interfejs nije lep, korisnici ga jedva i koriste.
U vreme JSP-a, sva posao na frontenda radili su backend Java programeri. Danas se insistira na razdvajanju frontenda i backenda, a i frontend se mora inženjerski organizovati, pa frontend pozicija sve više dobija na značaju.
Mrežno inženjerstvo zvuči prilično visoko i prestižno; možeš da pogledaš objašnjenje ovog smera na enciklopediji. Moje je razumevanje da mrežno inženjerstvo povezuje računare i druge uređaje radi mrežne komunikacije i pametnog nadzora. Glavne grane su: rutiranje i razmena, bezbednost mreže, bežične mreže itd.
Internet stvari (IoT) jeste prilično popularan koncept poslednjih godina; to je proces povezivanja svakodnevnih fizičkih objekata sa internetom — od medicinskih uređaja, preko nosive tehnologije, do pametnih kuća i pametnih gradova. Internet stvari ima još uvek veliki prostor za razvoj: pametni saobraćaj, pametna poljoprivreda — konkretan primer je automatsko pokretanje navodnjavanja preko senzora vlažnosti.
Veliki podaci (Big Data) — od tehnologija koje poznajem, a koje služe za velike podatke, tu su: distribuirani fajl sistemi, distribuirane baze podataka, platforme oblak computinga, skalabilni sistemi za skladištenje. Obama je jednom rekao da su „veliki podaci" nafta budućnosti, što svedoči o njihovoj važnosti. Smer velikih podataka tipičan je interdisciplinarni smer; ne obuhvata samo računarstvo, već i matematiku i statistiku; pored toga što zahteva jaku instituciju, postavlja i čvrste osnove i od same osobe.
Veštačka inteligencija je disciplina koja proučava kako računari mogu da simuliraju neke ljudske procese mišljenja i inteligentno ponašanje (učenje, zaključivanje, razmišljanje, planiranje itd.); magisterijum ili doktorat daju prednost.
Softversko inženjerstvo se temelji na računarskoj nauci, ali više ističe inženjerski pristup razvoju softvera, uključujući analizu zahteva, dizajn softvera, testiranje softvera, održavanje softvera i upravljanje projektom.
Računarska nauka (Computer Science, skraćeno CS) proučava i hardver i softver računara; konkretne teme uključuju programske jezike, programiranje itd.
Akademsko područje računarske nauke može se podeliti na: teoriju računara, teoriju informacija i kodiranja, algoritme i strukture podataka, formalne metode, programske jezike itd.
Praktičnije oblasti: arhitektura računara (ili organizacija računara), operativni sistemi, računarske mreže, bezbednost i kriptografija, veštačka inteligencija, računarska grafika, interakcija čovek-računar, ugrađeni sistemi i softversko inženjerstvo.
Drugim rečima, softversko inženjerstvo samo je jedan primenjeni pravac računarske nauke.
Još jednostavnije: možeš bezbrižno izabrati računarsku nauku! Ako dobro savladaš računarsku nauku, lako ćeš ovladati softverskim inženjerstvom, velikim podacima, internetom stvari, mrežnim inženjerstvom i veštačkom inteligencijom.
Tema izbora smera ovih dana je veoma aktuelna; tema je vidljiva svuda. Ko je čita, ili bira smer i školu nakon prijemnog, ili se suočava sa podelom na smerove u prvoj godini.
Iskreno, nemoj imati prevelika očekivanja od univerzitetskog obrazovanja — osim ako ne ideš na vrhunski univerzitet i ne naiđeš na vrhunske nastavnike; najčešće se računarstvo ipak uči samostalno.
Ja sam imao formalno obrazovanje iz oblasti, ali ako me pitaš šta sam zaista naučio na fakultetu, pomalo mi je neprijatno, jer sam na fakultetu učio prilično haotično. To što nisam bio otpušten, ili što sam zaradio nešto novca, kupio stan, oženio se, kupio auto — zahvaljujem isključivo samostalnom učenju.
Da budem iskren, ispočetka ni mene računari nisu zanimali, mislio sam da nisam stvoren za računare, ali nikada nisam odustao, nikad nisam pomislio da promenim struku.
Sa Javom sam ispočetka učio samo osnove, dosta sam vremena proveo i na Swing-u, misleći da je napraviti kalkulator u Swingu prilično lepo. Ali kasnije sam shvatio da jezgro Jave nema nikakve veze sa Swingom; važni su Java sintaksa, Java okvir za kolekcije, Java mrežno programiranje, Java konkurentno programiranje i Java virtuelna mašina.
Još jedan primer: ispočetka nisam rešavao zadatke na LeetCode; tada sam rano počeo da radim, pa je zaista bilo moguće naći posao bez LeetCode-a, ali danas je drugačije. Strukture podataka i algoritmi temelj su učenja programiranja, pa vidite da mnogi rešavaju LeetCode.
Takođe, gledao sam CS50 sa Harvarda, brzi kurs računarske nauke, video kurs iz struktura podataka sa Univerziteta Tsinghua, kurs C jezika profesora Weng Kaija — stalno sam upijao znanje, a što je još važnije, stalno sam i izlazio sa sadržajem, pa mi se to znanje dobro vari.
Iako nemam master, i dalje imam mnogo prijatelja i čitalaca sa masterom; kada mi dolaze sa pitanjima, uspevam da odgovorim smireno.
Više od deset godina iskustva u programiranju dalo mi je novo gledište na formalno obrazovanje iz računarstva.
Ako želiš da učiš fiziku, preporučujem ti da pratiš istoriju razvoja fizike: prvo klasičnu fiziku Njutna, zatim termodinamiku i elektromagnetizam, pa onda relativnost i kvantnu mehaniku, koje su potpuno srušile klasičnu fiziku, i na kraju elektrodinamiku, koja je prava tvrda srž.
Ceo taj proces učenja je od dna ka vrhu. Da li računarsku nauku treba tako učiti?
Prvo učiti kola, zatim fon Nojmanovu arhitekturu, pa napraviti računar? Onda učiti kako u asembleru napisati mini OS? Zatim učiti kako napisati prostiju verziju kompajlera? I tek na kraju učiti više programske jezike, na primer Javu, Python, C++?
Očigledno, tako ne ide! Računarsku nauku je najbolje učiti od vrha ka dnu.
Šta je taj vrh? Po mom mišljenju, to je jedan viši programski jezik, poput Jave, C++ ili Pythona. Ja se lično dugo bavio Java backend razvojem, pa ću uzeti svoj stari zanat kao primer.
Kada u Javi, u konkurentnom programiranju, naiđeš na pojmove poput „atomičnosti", „sinhronizacije", „asinhronosti", „procesa", „alokacije memorije", prirodno će ti se javiti mnogo pitanja, pa ćeš krenuti da učiš operativne sisteme i arhitekturu računara, i niz tvojih pitanja će postepeno biti rešen.
Kada pri učenju Jave naiđeš na probleme sa performansama, krenućeš da istražuješ — ah, pa Java je interpretirani programski jezik, dok je C kompajlirani programski jezik, pa se zato operativni sistemi poput Unixa/Linuxa pišu u C-u, jer tako treba maksimalno iskoristiti hardver.
Naravno, Java se jako potrudila da poboljša svoje performanse — na primer, kompajliranje u trenutku izvršavanja (JIT, Just-In-Time) poboljšava performanse tako što bajtkod u toku rada prevodi u mašinski kod računara; zatim, napredak mehanizma za sakupljanje smeća, od GC do ZGC; bolna tačka GC-a je u tome što tokom sakupljanja smeća sve nite staju i čekaju kraj STW-a (Stop The World), dok su ZGC u fazi označavanja, premeštanja i relokacije gotovo potpuno konkurentne, čime se znatno skraćuje vreme zastoja.
Kada u Javi realizuješ neki poslovni zahtev, a otkriješ da je tuđa implementacija algoritma mnogo brža, prirodno ćeš biti radoznao zašto; zatim primetiš da drugi koristi drugačije strukture podataka od tebe, pa kreneš da učiš strukture podataka, a onda i neke efikasne algoritme, poput dinamičkog programiranja.
Vidiš — polazeći od Java sintakse, korak po korak stigneš do operativnih sistema, arhitekture računara, struktura podataka i algoritama.
Učeći prema potrebama, zaista možeš savladati računarsku nauku.
Preporučujem ti i crnu knjigu „CSAPP", jer je ipak uvek na vrhu, ali ako bez ikakvih osnova kreneš da je gložiš, brzo možeš odustati; umesto toga, ispočetka pročitaj moju „Ergeovu Javinu stazu napretka", ili na Bilibiliju gledaj Java video kurseve trening kuća poput Shang Guigu ili Dongli Jiedian — možda ćeš što više učiš imati sve više samopouzdanja: „Pa ovako nešto jednostavno, ja sam toliko pametan, kako da ne naučim?" Imaćeš tu iluziju samopouzdanja!
A ako ispočetka kreneš na CSAPP, osetićeš: „Bože! Pa ja sam potpuni gubitnik, šta to uopšte učim, kako mogu da ne razumem, da ne naučim?"
Ako želiš da postaneš izvrstan inženjer računarstva, šta treba da pripremiš još od fakulteta? Mislim da je to pitanje koje zanima mnoge, pa ću ukratko progovoriti.
Prvo, zakljuak:
- Prva godina: što pre nauči jedan programski jezik, npr. C ili Javu; imaj želju da rešavaš LeetCode ili OJ;
- Ako je moguće, učestvuj na takmičenjima poput ACM, Plavi pehar (Lanqiao) itd.;
- Na fakultetu je dovoljno da ne padaju ispite; fokus stavi na stručno znanje;
- Vodi računa o razvoju apstraktnih sposobnosti, o podizanju načina razmišljanja u programiranju;
- Ako je moguće, rano kreni na praksu, ne oslanjaj se na udobnost školske klupe.
A sada da kažem koje kurseve najviše vredi naučiti:
- Programski jezik: C ili Java
- Strukture podataka i algoritmi
- Operativni sistemi
- Računarske mreže
- Arhitektura računara
- I engleski nemoj zapustiti
Hteo, žao mi je, kada sam ja išao na fakultet niko mi nije dao takav savet; da sam tada naučio sve to, danas bih verovatno letio i više.
- Programski jezik
Prvo o Javi.
Možeš prvo da pogledaš moju „Ergeovu Javinu stazu napretka", koja obuhvata sve ključne tačke znanja Jave, uključujući Java sintaksu, Java okvir za kolekcije, Java IO, Java konkurentno programiranje i Java virtuelnu mašinu, kao i znanje potrebno za Java enterprise razvoj, poput Gita, Spring Boota, pa MySQL, Redis itd.

Zatim na Bilibili pogledaj video kurseve od Shang Guigu ili Dongli Jiedian.
https://www.bilibili.com/video/BV1Rx411876f
A sada nešto o C-u.
C je star, ali zimzelen programski jezik koji ispunjava osnovne zahteve modernog programiranja; njegova sintaksa temelj je mnogih programskih jezika, na primer Jave. Preporučujem ti jedan kurs: „Uvod u programiranje — C jezik" profesora Weng Kaija sa Univerziteta Zhejiang, državni vrhunski kurs, veoma pogodan za početnike.
- Strukture podataka i algoritmi
Najveća moć koju računarska nauka daje ljudima leži u poznavanju uobičajenih algoritama i struktura podataka. Pored toga, to razvija sposobnost rešavanja raznih problema i pomaže u učenju u drugim oblastima.
Preporučujem ti da rešavaš zadatke na LeetCode; problemi na LeetCodeu često su zanimljivi i prate ih dobra rešenja i diskusije. Pored toga, u sve konkurentnijoj softverskoj industriji, ti problemi mogu ti pomoći da proceniš svoju sposobnost da odgovaraš na učestala pitanja na tehničkim intervjuima. Savetujem ti da rešiš bar 100 zadataka, kao deo učenja.
Evo mog iskustva rešavanja: od lakšeg ka težem, ponavljaš u krug, i nastojiš da koristiš programski jezik koji ti je poznat — na primer, ako si Java programer, nastoj da rešavaš u Javi, čime će i zadovoljstvo rešavanja znatno porasti.
Ako nisi izuzetno nadaren, nemoj se plašiti — na početku samo prepisuj zadatke; prvo otkucaj tuđe rešenje. Kad rešiš više zadataka, nastoj da kontrolišeš vreme; zadaj rok, ne dozvoli sebi da stalno razmišljaš i pišeš u nedogled; ako za pola sata ne rešiš, odlučno odustani i nauči napamet tuđi odgovor; nema potrebe da ti bude neprijatno; tek kad zaista uteraš, kreni da razmišljaš o sopstvenom pristupu rešavanju.
Možeš jednostavno da pratiš sledeći redosled tipova zadataka.
Niz → povezana lista → heš tabela → niska → stek → red → stablo → pretraga unazad (backtracking) → pohlepni pristup → dinamičko programiranje → graf
- Operativni sistemi
Operativni sistem je ključni sistemski softver u računarskom sistemu koji upravlja raznim hardverskim i softverskim resursima i pruža dobro okruženje za izvršavanje aplikativnog softvera. Kurs operativnih sistema sa Univerziteta Tsinghua — XuetangX uzima glavne operativne sisteme kao primere, a kao eksperimentalno okruženje koristi nastavni operativni sistem ucore; predaje koncepte, osnovne principe i tehnike implementacije operativnih sistema i izrazito je preporučen video kurs.

Što se knjiga tiče, preporučujem „Koncepte operativnih sistema" („knjiga zmaja") i „Moderni operativni sistemi", klasike iz oblasti operativnih sistema. Kad savladaš operativne sisteme, trebalo bi da odgovaraš na sledeća pitanja:
- Ukratko predstavljanje procesa i niti, razlike, načini komunikacije među procesima, načini sinhronizacije niti;
- Korisnički režim i kernel režim;
- Upravljanje memorijom: paginacija i segmentacija, virtuelna memorija, metode upravljanja slobodnim adresama;
- Mrtve blokade: potrebni uslovi za mrtvu blokadu, detekcija i oporavak od mrtvih blokada, prevencija mrtvih blokada, izbegavanje mrtvih blokada;
- Sistemi baza podataka.
- Računarske mreže
Mikrotečaj računarskih mreža na Bilibiliju je veoma dobar video kurs, toplo ga preporučujem.

Kad savladaš računarske mreže, trebalo bi da odgovaraš na sledeća pitanja:
- Sedmoslojni model, uz kratko objašnjenje svakog sloja;
- Šta se dešava nakon što uneseš URL? Ovo pitanje obuhvata veliki deo osnova računarskih mreža;
- HTTP i HTTPS, DNS razrešavanje;
- TCP, UDP, kontrola zagušenja, three-way handshake, four-way rukovanje, klizni prozor;
- IP i ARP protokol.
- Arhitektura računara
„Veštica sunca" (Jiuyang Zhenjing) u romanu „Oslanjanje na nebesko mačevanje" Džina Jonga najjača je tajna veština unutarnje moći; „veštica sunca" za programere, po mom mišljenju, upravo je arhitektura računara, jer tu leži tajna kako CPU izvršava kod, tajna pretvaranja virtuelnih adresa, tajna brojeva sa pokretnim zarezom...
Kada razumeš arhitekturu računara, dobijaš sistemsko shvatanje celokupnog razvoja softvera — bilo da je reč o hardverskim principima računara ili o softverskoj arhitekturi, dobro njima vladaš, a sa time dolaze i brojnije prilike za razvoj karijere. Ako želiš dublje da učiš arhitekturu računara, preporučujem video kurs sa HIT-a (Harbinskog instituta tehnologije), čija je ukupna ocena veoma visoka.
https://www.bilibili.com/video/BV1WW411Q7PF
Da dodam još jednu reč: za nas programere, engleski je važan kao vazduh — u svakom dahu se oslanjamo na njega. Ako kvalitet vazduha nije dobar, zarad ne osećaš manjak kiseonika? Isto tako, ako ti je engleski malo slabiji, i programiranje će ti biti naporno.
- Kad dobro vladaš engleskim, lako čitaš i pregledaš najnoviju stranu tehničku dokumentaciju.
- Kad dobro vladaš engleskim, možeš da plutaš morem izvornog koda i neometano crpiš ono najbolje.
- Kad dobro vladaš engleskim, možeš prijatno da slušaš javne kurseve prestižnih univerziteta poput Stanforda na internetu, prateći prave velikane i učeći najčistiju tehniku.
- Kad dobro vladaš engleskim, u najgorem slučaju — dok kuckaš kod, više ne moraš da brineš da li su imena metoda, promenljivih i klasa dovoljno elegantna.
Zato je na univerzitetskom nivou, kad god imaš prilike, dobro pokušati da više koristiš sajtove za učenje na engleskom; ispočetka možda bude teško, ali ako istraješ, osetićeš da se isplatilo.
---------ručna linija razdvajanja---------
Iskreno, ako dobro savladaš gore navedene kurseve, možeš gotovo po volji birati među velikim kineskim internet kompanijama.
Ali, s druge strane, čak i ako savladaš samo 3–5 desina, nije teško naći posao koji ti se sviđa!
Još nešto, o izboru smera, grada i škole — evo mog mišljenja:
Pre svega, obavezno izaberi dobar smer.
Šta je dobar smer? Trenutno je prvi izbor računarski smer, YYDS! Zasićenje je jer je popularan; ako ne iskoristiš priliku i uporno biraš nepopularne smerove (neću ih navoditi), posledice su žalosne.
Drugo, nastoj da odeš u veliki grad.
Šta je veliki grad, ne moram ni da objašnjavam.
Prošle godine, nakon prijemnog moje sestre, pred mojih roditelja je čak stigao predlog da se prijavi za neki univerzitet u Sanmenksiji, jer bi šanse za upis bile veće.
Odmah sam to odbio — pa zar to nije štetiti njoj!
Sestra je na kraju upisala fakultet u Luoyangu, a njen utisak je: „Brate, više nikad ne želim da se vraćam u Sanmenksiju, makar želim da ostanem u Luoyangu."
A zašto ne — čak i ako ne ideš u Peking ili Šangaj, idi u Hangzhou, Chengdu, Wuhan, pa makar Suzhou ili Zhengzhou.
Veliki grad donosi ne samo prilike, već pre svega širinu pogleda. Zato su elite u vreme Republike morali da idu u inostranstvo na studije.
Konačno, izaberi školu sa visokim ugledom.
Preporučujem ti da pogledaš ukupnu rang-listu univerziteta na ovom takmičenju, pa će ti pri izboru računarskog smera biti jasnije.
Možda većina običnih ljudi ne može na 985 ili 211; i pored toga imam neke savete.
Život nije ni predug, ni prekratak.
Nema potrebe meriti se u jednom trenutku; na fakultetu, u budućoj karijeri, i dalje imaš priliku da prestigneš i okreneš situaciju u svoju korist.
Neću navoditi druge primere, a ne moram nužno ni sebe da uzimam za merilo, ali zaista sam dobra referenca, jer mi je obrazovanje sasvim prosečno, nemam nikakvu pozadinu velike kompanije; zašto sam u ovoliko zasićenoj industriji ipak uspeo da ostvarim neke rezultate? Čime?
Mislim da su moje iskustvo i opažanja, moj plan života, primereniji za običnog čoveka kao referencu — ako mogu ja, zašto ne bi mogao i ti!
Pre svega, naporan rad je izvestan.
Uvek i svuda, za čoveka bez pozadine koji želi da ostvari bilo šta, naporan rad je obavezan. Ne moraš nužno da prestigneš druge, ali bar nastoj da ne zaostaješ, da razlika ne postaje sve veća.
Zatim, moraš naučiti da se menjaš.
Ono što je kod drugih dobro treba da učiš, makar i imitiraš; oči ti moraju sijati, moraš umeti da uočavaš vrline i dobre osobine kod drugih.
S vremena na vreme moraš da „odbaciš kožu", da skineš sa sebe ono što je zastarelo.
Konačno, potrebno je da istraješ.
Jedna stvar: ako je ne uradiš, jeste 0; ako je uradiš, jeste 1; ako je uradiš pa odustaneš, iz 1 postaje 0; ako istraješ, tek onda iz 1 možeš u 2, iz 2 u 4, iz 4 u 8, iz 8 u 16.
Na internetu svuda ima resursa za učenje, ali se mešaju oni najbolji sa onim bezvrednim. Ono što ti treba:
- koje predmete treba da učiš i zašto;
- koje su najbolje knjige ili video kursevi za te predmete.
Ta dva pitanja sam već rešio! Okvirno po navedenom redosledu, pomoću predloženih udžbenika ili video kurseva (najbolje oba), možeš prvo potrošiti 100 do 200 sati da savladaš jedan predmet, a onda zapamti — tokom cele karijere obavezno s vremena na vreme ponavljaj gradivo.

Računarski smer možda je smer koji najmanje laže — ako izabereš dobro i ako daš od sebe, zaista možeš izaći iz „gužve". Prijemni ispit menja sudbinu, ali tvoj život ne bi trebalo da bude određen jednim rezultatom.
