Koja je najbolja karijerna putanja za Elektronsko i informaciono inženjerstvo?
Najbolja karijerna putanja je, po mom mišljenju, master studije, a zatim rad u integriranim kolima (IC); ako ne želite na postdiplomske i želite ranije da zaradite, preporučujem prelazak na smer računarstva; ako želite kompromis, razmislite o ugradbenim sistemima.
Reći ću šta o tome znam.
1. IC (integrisana kola)
IC je opšti naziv za proizvode od poluprovodničkih elemenata, uglavnom se dele na digitalna i analogna IC. Digitalna IC prenose, obrađuju i procesuiraju digitalne signale; analogna IC obrađuju prirodne analogne signale poput neprekidne svetlosti, zvuka, brzine, temperature.
Digitalna kola IC obuhvataju uređaje koji procesuiraju digitalne signale, na primer CPU, logička kola itd.; analogna kola IC obuhvataju uređaje koji daju analogne signale, na primer operacione pojačivače i linijske regulatore napona.
Poznatih proizvođača analognih IC-a nema mnogo — na primer, u inostranstvu Texas Instruments, a u Kini Aiwei Electronics.
S druge strane, kod digitalnih IC-a poznatih kompanija zaista ima mnogo, na primer NVIDIA, AMD, ZTE, HiSilicon itd.
Što se tiče praga ulaska, analogni ima nešto viši prag od digitalnih. Za analogni IC, da bi se radio dobro, neophodan je master, a doktorat je još bolji; prag za digitalni takođe se ne može nazvati niskim, ali ako ste dovoljno dobri, možete se zaposliti i sa osnovnim studijama. Pozicije u dizajnu rasporeda imaju nešto niže zahteve — dovoljno je imati osnove digitalne i analogne elektronike, pa su prilično prijateljske i prema učenicima srednjih stručnih škola.

Što se tiče plate, za diplomanate poznatih univerziteta sa odgovarajućeg smera, plata od 500.000 RMB zaista zavidi mnoge.
2. Smer računarstva
Sa stanovišta primene tehnologije, prilično dugo vremena deficit radnika u oblasti računarstva bio je veoma veliki. Jer, svaka industrija treba da uključi stručnjake iz oblasti računarstva i sprovede digitalnu transformaciju. Na primer, u petogodišnjem planu jednog kineskog grada drugog reda video sam sledeće:
U narednih 5 godina, uz pomoć internetske tehnologije, značajno povećati zadovoljstvo građana u obavljanju poslova — od ranijeg "doći samo jednom" do "ne mora se doći ni jednom", izgraditi "vladin prozor koji radi 24 časa bez prekida".
Razmislite malo — po toj logici, ako se to proširi na sve industrije i celu zemlju, kakva je to količina radova, i kolika je tek onda potražnja za radnicima u oblasti računarstva.
Pored toga, softver za specifične oblasti potpuno je nadmašen od strane inostranstva.
- AutoCAD, SolidWorks, Pro/E, Creo i drugi softver za 3D dizajn — industrija fizičke proizvodnje, uključujući kućne aparate, nameštaj, uređenje enterijera, mašinstvo, opremu za odeću, proizvodnju razne opreme, proizvodnju proizvodnih linija;
- Adobe familija — industrija dizajna i čitanja, kreativna industrija;
- ANSYS, Fluent, MATLAB — analiza strukturnih naprezanja, analiza fluida, sve srednje i visoke industrije, velika preduzeća, naučni instituti, granične industrije;
- CATIA — automobilska industrija, industrija novih izvora energije;
- Protel — elektro industrija, dizajn kola itd., obuhvata sve digitalne uređaje na struju, od slušalica do mobilnih telefona, displeja laptopova, kućnih aparata itd.
Za taj softver za specifične oblasti potrebno je uključiti još stručnjaka iz oblasti računarstva i istrajati 5-10 godina da bi se mogao prestići.
Zato je prelazak sa Elektronskog i informacionog inženjerstva na smer računarstva takođe odličan izbor.
Industrija računarstva je za obične ljude i dalje sjajna prilika da promene sudbinu. Relativno govoreći, tradicionalne industrije više cene resurse — pozadina i poznanstva su posebno važni, a za osobu običnog porekla napredovanje je jednako penjanju uz stepenice pod uglom od 90 stepeni. Naravno, ako se tradicionalna industrija spoji sa internetom, može se stvoriti i ogromna vrednost.
Stari narod kaže: od dva zla, izaberi manje.
Gledano nadole — niska plata, mračna perspektiva, tradicionalno inženjerstvo poput mlinice za meso;
Gledano nagore — visok prag, zavisnost od porodičnih resursa i porekla univerziteta: finansije, pravo, medicina;
Računarstvo u sredini jeste, moglo bi se reći, jedina blagost koju ovo doba pruža deci iz siromašnih porodica. U svakom slučaju, ja sam promenio sudbinu zahvaljujući smeru računarstva. Pokazaću sliku — ovo je moj rodni kraj, iako ima mnogo drveća i vazduh je svež, zaista je prilično siromašan.

Razloga što sam uspeo u tome ima više, ali mislim da su ove tri stvari veoma važne:
- podrška roditelja;
- sopstveni trud;
- odabir smera računarstva.
Ovde ću ponoviti svoje teorijsko gledište o učenju računarstva — ako želite da pređete na računarstvo, mislim da će vam to pomoći da brzo izgradite sopstveni sistem znanja!
Ako želite da učite fiziku, preporučujem vam da učite duž istorije razvoja fizike — prvo učite Njutnovu klasičnu fiziku, zatim termodinamiku i elektromagnetizam, pa onda relativnost i kvantnu mehaniku, koje potpuno ruše klasičnu fiziku, i na kraju elektrodinamiku, koja je "tvrdi" deo.
Ceo proces učenja je odozdo nagore. Ali kod računarstva, to ne prolazi.
Prvo učiti kola, zatim fon Nojmanovu arhitekturu, pa napraviti računar? Zatim učiti kako u asembleru napisati mini operativni sistem? Onda kako napisati jednostavan kompajler? I na kraju učiti visoke programske jezike, poput Jave, Pythona?
Očito, to ne prolazi! Učenje računarstva najbolje je odozgo nadole.
Šta je "vrh"? Mislim da je to visoki programski jezik, na primer Java, C++ ili Python!
Kada u učenju Java konkurentnog programiranja naiđete na pojmove "atomicitet", "sinhronizacija", "asinhronost", "proces", "alokacija memorije", prirodno ćete se zapitati mnogo toga, pa ćete krenuti da učite arhitekturu računara i operativne sisteme, i vaša pitanja će postepeno biti rešena.
Kada otkrijete da prilikom implementacije nekog poslovnog zahteva u Javi tuđa implementacija algoritma radi mnogo brže od vaše, prirodno ćete biti radoznali zašto je to tako. Onda otkrijete da druga osoba koristi drugačiju strukturu podataka, pa krenete da učite strukture podataka, a zatim i neke efikasne algoritme, poput dinamičkog programiranja.
A sada da govorimo o rutama učenja za smer računarstva — kome treba ruta neka je zabeleži! Prilično je "tvrda", vredi sačuvati i lajkovati.
1. Osnove jezika Java
Početnici mogu učiti kroz "Ergov put ka naprednom Javi", odnosno kroz ovaj sajt — to je duhovit i lako razumljiv Java tutorial, izuzetno prijateljski nastrojen prema Java početnicima, a obuhvata, između ostalog, Java sintaksu, Java okvir za kolekcije, Java IO, Java konkurentno programiranje, Java virtuelnu mašinu i druge ključne teme.
Za detaljniju rutu učenja pogledajte: https://javasi.dev/xuexiluxian/java/yitiaolong.html
2. Razvojni okviri
Mnogi možda prezrivo gledaju na razvojne okvire, misleći da učenje toga nema neku vrednost i da vam neće unaprediti tehničku podlogu. Ali, ako želite da radite projekte za vežbu, bez pomoći razvojnih okvira to je veoma teško.
Važan razlog popularnosti Jave jeste što poseduje ubojito oružje u vidu Spring familije okvira, uključujući SSM (Spring+SpringMVC+MyBatis), Spring Boot i Spring Cloud.
Jednostavno ne treba ostati samo na nivou upotrebe — treba razumeti principe iza toga. Ukratko, Spring se svodi na dva ključna pojma: AOP i IoC.
AOP (Aspect-Oriented Programming), odnosno aspektno-orijentisano programiranje, omogućava da se logika ili odgovornosti koje nisu poslovne prirode, a koje zajednički pozivaju poslovni moduli (na primer obrada transakcija, upravljanje logovima, kontrola prava) inkapsuliraju, čime se smanjuje ponavljajući kod u sistemu, snižava stepen međuzavisnosti između modula i olakšava buduća proširivost i održavanje.
IoC (Inverse of Control), odnosno inverzija kontrole, jeste ideja dizajna koja znači da kontrolu kreiranja objekata, koja je prvobitno rađena ručno u programu, prepustite Spring okviru na upravljanje.
Prvo učite SSM, zatim Spring Boot. Pojava Spring Boot-a ne znači da su Spring i SpringMVC zastareli — sa stanovišta cilja dizajna, Spring Boot je samo automatizovao konfiguraciju Spring-a i snizio težinu postavljanja projekta.
Sa tehničkog stanovišta, u osnovi Spring Boot-a i dalje su ključni mehanizmi Spring-a, odnosno AOP i IoC — Spring Boot je samo nosilac. Po mom mišljenju, pravi put učenja Spring-a treba da bude Spring -> Servlet -> Spring MVC -> Spring Boot.
3. Baze podataka
CRUD, CRUD — želite li biti programer koji zna samo CRUD, baza podataka se ne može zaobići. Ipak, ovde neću ulaziti posebno u to, nego ću preporučiti neke resurse.
Tri videa sa Bilibili-ja.
- SQL: https://www.bilibili.com/video/BV1UE41147KC
- MySQL: https://www.bilibili.com/video/BV12b411K7Zu
- Redis: https://www.bilibili.com/video/BV1S54y1R7SB
Četiri knjige.
- "SQL — obavezno znanje"
- "Visoko-performantni MySQL"
- "MySQL iznutra — InnoDB pogon za skladištenje"
- "Redis avantura — ključni principi i primene"
4. Arhitektura računara
Računar čine hardverske komponente poput CPU-a, memorije, ulazno-izlaznih uređaja, ali se mi programeri najčešće bavimo softverskim razvojem — kako izgraditi most između hardvera i softvera?
Odgovor je — učenjem arhitekture računara.

Teme arhitekture računara mogu se podeliti u četiri dela:
- osnovni hardverski sastav računara;
- instrukcije i izračunavanje računara;
- dizajn procesora;
- memorija i IO uređaji.
Prema fon Nojmanovoj arhitekturi, računar se deli na jedinicu za računanje, kontrolnu jedinicu, memoriju i ulazno-izlazne uređaje; kod koji pišemo da bi se izvršio na računaru mora se kroz kompajler pretvoriti u asembler, zatim kroz asembler u niz instrukcija, a izvršenje tih instrukcija obavlja kontrolna jedinica.
Kako učiti arhitekturu računara?
Ako vam je engleski jak, preporučujem kurs na Courseri — "od NAND kola do Tetrisa". Jednostavno rečeno, taj kurs će vas naučiti kako od NAND kola izgraditi računar.
Adresa: https://www.coursera.org/learn/build-a-computerwww.coursera.org/learn/build-a-computer
Video snimci tog kursa izuzetno su kvalitetni; iako nemaju prevod na naš jezik, titlovi ispod videa se ritmički pomeraju.

Preporučujem i kurs Harbin Instituta Tehnologije (HIT), sa veoma visokom ukupnom ocenom (preporučujem puštanje na 1,5x brzini): Arhitektura računara (Tang Shuofei), Bilibili
5. Strukture podataka i algoritmi
Neko možda misli: iako ne poznajem strukture podataka i algoritme, zar ne mogu sjajno da koristim Java API i razvojne okvire?
Ali ovde želim da kažem sledeće:
1) Strukture podataka i algoritmi jeste jedan od faktora po kojima velike kompanije filtriraju talente.
To je zato što pri kampus-izboru studenti koji dolaze na intervju najčešće nemaju praktičnog iskustva na projektima, pa kompanija može samo preko provere ovih osnova da ih filtrira.
Velike kompanije se ne plaše toga da nemate iskustva na projektima, već se plaše da nemate potencijal za dugoročni razvoj. Zato mnogi koji učestvuju na kampus-izboru pre intervua intenzivno rešavaju zadatke — barem nabilduju oko 100 zadataka.
2) U praktičnom radu sigurno će se koristiti.
Primer: prilikom čuvanja nekih poslovnih podataka, da li ćete koristiti ArrayList ili LinkedList, koju strukturu podataka oni koriste u osnovi, a koje su prednosti i mane kod CRUD operacija?
Ili, na primer, kojom strukturom podataka je implementiran sortirani skup u Redisu? Zašto preskočna lista, a ne binarno stablo?
Može li se bez poznavanja struktura podataka i algoritama?
3) Kad savladate strukture podataka i algoritme, to će mnogo pomoći u čitanju izvornog koda.
Jer se vrlo često u izvornom kodu razmatraju prednosti i mane različitih struktura podataka.
Recimo, zašto HashMap, kada dužina liste prelazi 8, pretvara u crveno-crno stablo? Zašto ne može binarno stablo?
Kako onda učiti strukture podataka i algoritme?
Nacrtao sam jednu sliku koja obuhvata gotovo sve teme o kojima se govori u knjigama iz struktura podataka i algoritama.

Ako vam je engleski jak, preporučujem inostrani MIT 6.006 — klasičan uvodni kurs iz struktura podataka i algoritama, koji obuhvata sortiranje, heš, teoriju grafova i dinamičko programiranje.
Za kinesko tržište preporučujem kurs Univerziteta Zhejiang — veoma sistematičan i klasičan, pogodan za potpune početnike.
Strukture podataka — Univerzitet Zhejiang, Bilibili
Što se tiče vežbe, preporučujem rešavanje zadataka na LeetCode-u ili Niuke-u — tamo su problemi često zanimljivi, uz dobra rešenja i diskusije. Osim toga, u sve konkurentnijoj softverskoj industriji, ti zadaci vam mogu pomoći da procenite sopstvenu sposobnost da odgovorite na pitanja koja se često pojavljuju na tehničkim intervjuima.
Moje iskustvo je prosto i grubo: od lakših ka težim, rešavajte ih iznova i iznova, i trudite se da koristite programski jezik koji dobro poznajete — na primer, Java programeri neka pokušavaju da rešavaju u Javi, čime se osećaj sreće pri rešavanju znatno povećava.
Ako niste izuzetno nadareni, ne plašite se — na početku je u redu prepisivati: prvo otkucajte tuđe rešenje. Kada rešite više zadataka, trudite se da kontrolišete vreme — stavite tajmer, ne dozvolite sebi da stalno razmišljate i pišete. Ako za pola sata niste rešili, odlučno odustanite i naučite tuđi odgovor, ne stidite se; kada zaista savladate, onda razmišljajte o sopstvenom rešenju.
Za detaljniju rutu učenja pogledajte: https://javasi.dev/xuexiluxian/algorithm.html
6. Operativni sistemi
Operativni sistem je program koji upravlja hardverskim i softverskim resursima računara — temelj je računara.
Poslovi koje obavlja operativni sistem obuhvataju: upravljanje uređajima, čitanje i pisanje fajlova, kontrolu procesa, upravljanje memorijom itd. — to je svojevrsni "šef" među softverom, koji drži pravo na život i smrt. Preporučeni materijali za učenje su knjige "Moderni operativni sistemi" i "Duboko razumevanje sistemâ računara".
Ko je radio postdiplomske studije zna da je knjiga "Duboko razumevanje sistemâ računara" obavezno štivo. Ja sam nedavno kupio novi primerak — to mi je već drugi put da je čitam.

Mnoge ideje i klasični algoritmi iz operativnih sistema mogu se pronaći u alatima ili okvirima koje koristimo u svakodnevnom razvoju.
Na primer, Redis je veoma sličan keš memoriji operativnog sistema — Redis rešava problem nejednakosti brzine procesiranja programa i brzine pristupa MySQL-u, dok memorija rešava problem nejednakosti brzine procesiranja CPU-a i brzine pristupa spoljnoj memoriji poput diska.
U nastavi se obično na ispitu traže one tačke iz prezentacija koje zahtevaju bubanje, dok u inostranstvu često traže da se implementira jednostavan kernel operativnog sistema.
Ako vam je engleski izuzetno jak, preporučujem inostrani MIT 6.828 — opštepriznati "tvrdi" kurs, klasik koji povezuje teoriju i praksu. Preporučujem da prvo savladate osnove jezika C, a zatim krenete na ovaj kurs — sigurno ćete mnogo naučiti. Ako pratite projekat korak po korak, moći ćete da implementirate jednostavan kernel operativnog sistema.
Adresa kursa: 6.828 / Fall 2018
Funkcije koje operativni sistem treba da pruži:
- podrška za više procesa;
- izolacija između procesa;
- kontrolisana komunikacija između procesa.
Kernel (jezgro) je srž operativnog sistema — poseban program koji pruža usluge programima u izvršenju. Svaki program u izvršenju zove se proces, a u memoriji svakog procesa nalaze se instrukcije, podaci i stek. Jedan računar može imati više procesa, ali samo jedan kernel.
Kada proces treba da pozove kernel, on okida system call (sistemski poziv); sistemski poziv ulazi u kernel, obavlja odgovarajuću uslugu i vraća se.

Beleške jednog člana zajednice sa ovog kursa: MIT 6.S081 Lecture Notes — možete ih koristiti kao referencu.
"Javna predavanja Univerziteta Tsinghua: Operativni sistemi" takođe imaju odličnu reputaciju.
Javna predavanja Univerziteta Tsinghua: Operativni sistemi
Još i kurs operativnih sistema sa Harbin Instituta Tehnologije:
Operativni sistemi — profesor Li Zhijun, Harbin Institut Tehnologije, Bilibili
Kroz pitanje "kako osnovnom računaru sa jednojezgrenim CPU-om, memorijom, diskom, tastaturom i ekranom obezbediti stvarno upotrebljiv operativni sistem", kurs se deli na četiri velika bloka:
- osnove operativnih sistema;
- procesi i niti;
- upravljanje memorijom;
- upravljački programi uređaja i sistem fajlova.
Ispod je naslovna slika kursa — jednostavna verzija operativnog sistema. U poređenju sa interfejsom operativnog sistema koji danas koristimo, očigledno je ružna do neprepoznatljivosti, ali vam može pružiti radost — radost koja dolazi od toga što ste zaista naučili nešto.

Za detaljniju rutu učenja pogledajte: https://javasi.dev/xuexiluxian/os.html
3. Ugradbeni sistemi
Ugradbene sisteme možemo dalje podeliti na ugradbeni hardver i ugradbeni softver.
Inženjer ugradbenog hardvera mora imati osnovne veštine inženjera hardvera, ali mora obaviti i deo posla inženjera softvera — na primer moći seći, prilagoditi i portovati ugradbeni operativni sistem za niskonivouaske pokretače.
Glavna odgovornost inženjera ugradbenog hardvera jeste da projektu dizajnira šematske dijagrame hardverskih kola i PCB ploče (štampanu ploču), izabere odgovarajuće komponente, zalemi i testira hardverske ploče i osigura pouzdanost, stabilnost i otpornost na smetnje hardverskih kola.
Godišnja plata jednog iskusnog inženjera ugradbenog hardvera iznosi oko 150.000-300.000 RMB. Potrebno je veoma čvrsto teorijsko znanje, kao i iskustvo u dizajnu visokofrekventnih CPU-a i višeslojnih PCB ploča.

Inženjer ugradbenog softvera jeste osoba koja razvija korisničke aplikacije pod ugradbenim operativnim sistemima poput WinCE-a i Linux-a; hardverske platforme obuhvataju mobilne telefone, tablet računare itd.; razvojni alati obuhvataju EVC pod WinCE-om, QT pod Linuxom itd.
Glavna odgovornost inženjera ugradbenog softvera jeste da na osnovu funkcionalnih zahteva proizvoda dizajnira dobar softver koji će pokrenuti hardver. Uobičajeno je da je potražnja za inženjerima softvera veća.

Godišnja plata jednog iskusnog inženjera ugradbenog softvera takođe iznosi oko 150.000-300.000 RMB. Potrebno je dobro poznavanje C/C++-a, vešto korišćenje mikrokontrolera iz serije Cortex-M4 i RTOS-a (FreeRTOS, μC/OS-II, RT-Thread) itd.
Nadam se da će ovo svima pružiti makar malu pomoć i nadahnuće.
