Kvalitetna i na vreme plasirana informacija je jedina koja donosi novac u današnje vreme. Koliko je ova teorija primenljiva u praksi ponuđača poslovnog softvera u Srbiji? I šta potencijalni kupci poslovnog softvera mogu naći na sajtovima ponuđača?
Praznici i vreme za odmor. Pravo vreme da se baci malo detaljniji pogled na skorija dešavanja programerskom svetu. Ako zanemarimo „gorilu u sobi“ (Eg. JavaScript), postaje očigledno da se poprilično prašine podiže oko novih programski jezika. Izdvojio bi dva meni interesantna sistemska programska jezika: Rust i Go.
Ono što je na mene ostavilo upečatljiv utisak je činjenica da dva ovoliko različita programska jezika imaju niz zajedničkih stvari. Nije samo u pitanju sintaksa sa C blokovima u kovrdžavim zagradama. Mnogo više je u pitanju odricanje od nekih stvari koje su zastarele, kao i uključivanje u standardnu instalaciju ono što je u skladu sa potrebama vremena u kom programiramo. Nema neke veličanstvene inovacije za velike naslove. Glavne inovacije su suptilne, suštinske i realizovane na različite načine.
Idemo redom, još malo o sličnostima.
Ovo „sistemski“ u opisu znači fokus na programiranje sistemskih servisa, a ne korisničkog interfejsa. Ni Go ni Rust ne dolaze sa GUI bibliotekama. Nema funkcija koje će otvoriti nekakav prozor ili crtati natpise, dugmiće i slično. Sistemski znači da jednako podržavaju sve velike operativne sisteme, uključujući Windows, ali ne i njihov grafički deo.
Isto tako, ni jedan ni drugi nemaju svoj preferirani IDE (Integrisano Razvojno Okruženje). Instalacijom dobijate samo kompajler i par alata koje možete da pozovete iz komandne linije. Za editor, IDE, debager, dokumentaciju – snalazite se sami.
Iako ovo izgleda kao mana, zapravo nije. Ciljna ekipa su postojeći programeri. Iz iskustva tvrdim da je programeru lakše da promeni programski jezik nego editor. Svi bolji editori i razvojna okruženja imaju lak način da podrže novu sintaksu, sistem za kompajliranje, debag i slično. A i sva dokumentacija, sa sve primerima, odavno je na mreži. Go i Rust igraju na kartu da treba da koristite omiljeni OS, editor, IDE i browser. Mogu slobodno da kažem – jaka je to karta.
Još jedna sličnost prosto „bode oči“. Rust je čedo Mozila Fondacije (kao i FireFox), dok je Go čedo ekipe starih vukova Unixa koje zapošljava Google. To su dva konglomerata vrhunskih programera. Nije to čudno, obzirom da Oracle stoji iza Jave, Microsoft iza C#, Apple iza Swifta, može se reći i Facebook iza php-a. Iskreno se nadam da nije prošlo vreme kada je genijalac kao Guido van Rossum mogao da izgura Python, ili Yukihiro Matsumoto Ruby.
Iskreno se nadam da nije prošlo vreme kada je genijalac kao Guido van Rossum mogao da izgura Python, ili Yukihiro Matsumoto Ruby. Share on XVeć sam napomenuo da Go dolazi od starih Unix vukova. Ako je sredovečni C u srcu Unixa, samim tim je jasno da je uzor za Go. Jednostavnost C-a je lajt-motiv Go filozofije: samo 25(!) ključnih reči, mali broj idioma, nema prekida (Exceptions), nema generičkih tipova, nema klasičnih objekata. Kod je u stilu fukcija po funkcija. Kompajler izbacije monolitni izvršni fajl – nema runtime bibiloteka.
Sa druge strane, Go modernizuje sve što može biti prepoznato kao mana kod C-a. Nema predprocesora, memorija se automatski oslobađa i prati, stringovi, višesturke niti kao go kanali. Nema configure, make – dovoljno je „go build“ u direktorijumu. Kompajliranje je munjevito, standardna biblioteka je moderna i ima sve što treba. A ako zatreba dodatna bibloteka, dovoljno je da navedete direktno u kodu, i jedno „go get“ će je dovući i instalirati gde treba. Možete imati privatne i javne funkcije i podatke. Interesantno: nema posebne ključne reči za ovo – sve što počinje malim slovom je private, a sve što počinje velikim slovom je public.
Testiranje koda je ugrađeno, dovoljno je da nazovete fajl sa „_test.go“ sufiksom, referencirate test bibiloteku i možete da pišete testove. Nakon toga „go test“ testira aplikaciju. „go cov“ će vam napisati koliko koda je pokriveno testovima.
Ako ste naveli u go fajlu da koristite neki paket , onda mora negde da se taj paket i koristi. U protivnom, „go build“ će odbiti da kompajlira projekat. Neće vam dozvoliti da nabrajate pakete koje ne koristite. Niz preporuka kako treba da izgleda Go kod je implementiran u posebnu alatku (GoOracle). Ako istupate izvan preporuka – alat će vas obavestiti, i napisati šta treba da uradite. Na primer „Funkcija XY počinje velikim slovom što znači da je javna. Sve javne funkcije treba da imaju komentar koji opisuje šta rade. Napišite opis funkcije u komentaru, ili stavite da je funkcija privatna“
Uz ovu komandu i „go fmt“ na svakom snimanju fajla bićete naterani da vaš kod bude čitljiv kao da ga je pisao Google. Koliko je samo ovo bitno! Dovoljno je da insistirate da sav kod u projektu prolazi kroz GoOracle, test i cov bez upozorenja. Nema dodatnih alata, sumanutih rasprava o tabovima ili razmacima, komentarima… Nema dimenzija – čist Go.
Dodatni bonus – standardna bibiloteka izgleda po pravilima, kao i većina ostalih bibiloteka. Ne mogu dovoljno da naglasim koliko je čitljiv i razgovetan kod produktivna stvar. C programer može ovde da bude produktivan jako, jako brzo.
Međutim Java ili C# ili C++ programer biće zbunjeni. U najmanju ruku. Evo par razloga:
Go nema objekte. Zapravo ima, ali je to bliže C strukturama, nego OOP svetu koji se uči u školi.
Go nema izuzetke. Rad sa greškama svodi se na proveru error parametra koji vraća funkcija.
Go nema generičke tipove. Ovoga nema po dizajnu jezika. A nije ni u planu.
Go funkcije nemaju default vrednosti parametara.
Go funkcije ne podržavaju overload.
Go funkcije nisu kompatibilne sa standardnim C funkcijama.
Pratio sam šta autori izjavljuju povodom ovih stvari. A često se potežu ova pitanja. Stvarno trebaju ogromna iskustvo da se izađe pred javnost sa stavom da većina stvari koje se rutinski, zdravo za gotovo, predaju po školama i fakultetima jednostavno – nisu. I znate šta? Potpuno im uspeva. Uz dva iznenađenja.
Go postaje izuzetno popularan. Ali ono što je prvo iznenađenje – ne zbog gomile C programera; Ispostavilo se da je u pitanju je gomila Perl, PHP, Python i Ruby programera! Evo o čemu se radi:
„Klasični“ skript jezici su jako produktivni. Postoji ogroman broj aktivnih Python, Django, Rails projekata koji rade sasvim ok. Međutim, brzina ovde nije jača strana. Nije u pitanju samo broj http odgovora u sekundi – u pitanju je i sve drugo: vreme potrebno da se „podigne“ aplikacija, vreme potrebno da se izvrše testovi, vreme potrebno da se odradi neko zahtevnije ovo ili ono. Prepisivanje kompletne aplikacije, što je uradio na primer Twitter, često nije opcija.
Ono što se pokazalo kao pravi put je da se polako „usko grlo“ po „usko grlo“ prebacuju iz glavne aplikacije u poseban servis. Upravo je Go ovde našao svoje idealno mesto! Mali efikasni projekti, fokusirani da rade jednu stvar, i da komuniciraju sa drugim servisima. Go je iz kutije kao stvoren za to.
Odličan izbor za novi tip aplikacije: dobrodošli u svet „mikroservisa“.
Dovoljno da se iz aplikacije prebaci samo zahtevan deo koji radi kompresiju, ili kriptovanje, ili neke specifične binarne pretrage na Go mikroservise, pa da se za rezultat dobije aplikacija koja na istom hardveru radi XX puta brže.
Postojeći programeri treba da nauče Go – što nije nikakav problem, i da dodaju u „deploy“ proceduru još jedan binarni izvršni fajl. Što je još manji problem. U praksi se pokazalo da to funkcioniše neočekivano dobro.
Iznenađenje broj 2 je još veće. Vodeći Go projekat, mimo interne Google upotrebe, pokrenuo je novu softversku lavinu. Naravno, radi se o projektu Docker. Teško je ukratko opisati šta Docker sve radi, ali hajde da probam na najkraći način koji umem.
Recimo da koristite neki Windows11 koji ume da radi kao Docker. Mogli bi ste da napravite direktorijum App1, i u njega iskopirate „App1\Windows“ folder od XP instalacije, i u „App1\Program Files“ iskopirate neku svoju App1 aplikaciju. Vaš Windows11 bi vam dozvolio da startujete App1.exe kroz tu XP instalaciju, tako da App1 „misli“ da radi pod XP-om, i „vidi“ sebe kao jedinu aplikaciju na celom XP operativnom sistemu. To je kontejner. Nema emulacije – nije virtuelna mašina, aplikacija radi direktno na hardveru, ali je izolovana.
Docker i kontejnerske aplikacije će sigurno biti bitan pravac razvoja. I Go je tu kao kod kuće.
Docker i kontejnerske aplikacije će sigurno biti bitan pravac razvoja. I Go je tu kao kod kuće. Share on XRust je na teži način došao u fokus. Ceo projekat je počet kao projekat „sa strane“ jednog od programera u Mozili. Pa je tek godinu kasnije Mozila odlučila da zvanično sponzoriše Rust. A i tada je Rust bio još u povoju i stekao reputaciju da iz verzije u verziju trpi drastične promene. Verzija 1.0 zvanično je izašla 2015. Rust je stvarno nov jezik. Za poređenje, „moderni skript jezici“ Python je 1991. godište, a Ruby se pojavio februara 1993.
Slično kao Go, instalacija donosi kompajler „rustc“ i „cargo“ pomoćni alat. Sve funkcije se najlakše izvršavaju preko „cargo“ komande: „cargo build“, „cargo test“ i slično. Ovde se već vidi prva razlika u odnosu na Go: cargo alat u folderu projekta traži konfiguracioni fajl u kome se nalaze podaci o projektu, biblioteke (crate) koje se koriste, sa verzijama. Rust je ovde temeljniji, ali to je tek početak.
Rust ima i generičke tipove, i sistem koji je bliži objektima, izuzetke (Exceptions), dekoratore, makroe… To je pun programski jezik, koji zahteva neko vreme navikavanja na sintaksu i idiome.
A glavna stvar koju Rust nudi je automatsko baratanje memorijom bez GC podsistema. Koliko je ovo neobično, napomenuću samo da Java, C# i Go imaju GC podsistem, a da ga C nema, a C++ tek u novijim verzijama standarda dobija sistem za automatsko baratanje memorijom, ali ne svuda. C je „brz“ i zato što nema taj pozadinski GC (Garbage Collection) sistem, koji često ume da u najnezgodnijem trenutku zaglavi aplikaciju da se oslobodi malo memorije. E, pa nema ga ni Rust.
Upravo ovih par stvari lansiralo je Rust, slično kao i Go – na neočekivanom mestu: na univerzitetima i na sistemskim a i ostalim eksperimentima. Gotovo po pravilu, čim neko objavi neki krajnje neobičan projekat, velika je verovatnoća da koristi Rust.
Na primer studenski projekti imaju poprilično smisla da koriste Rust. Logično je da profesor insistira da bolji IT studenti budu spremni ne samo da naprave traženi projekat, već moraju da budu spremni da nauče novi programski jezik i da naprave traženi projekat u njemu. Rust je idealan kandidat: pun programski jezik, sa dobrom perspektivom, a dovoljno različit do „klasika“ kakvi su Java i C++. (Pitam se da li ovo čitaju domaći profesori?)
Drugi pravac su pomenuti kontejneri. Ali na nešto drugačiji način nego Go. Naime, sa kontejnerima se pojavila potreba za drugačijim operativnim sistemom. Klasičan OS je preglomazan za kontejner. Ovo važi čak i za mini Linux distribucije. Ono što se traži je minimalni operativni sistem sveden bukvalno samo na kernel – „Unikernel“. Rust je odličan izbor za takav razvoj: ima C brzinu, a ima i sve što donosi moderni razvoj.
Ono što obeležava Rust danas je da je još sve u razvoju. Glavni Rust projekat je Mozilin Servo, novi sistem za prikaz html-a, koji treba da dođe u FireFox. Naravno – još je u povoju. Http serveri, ORM sve je nekako još u povoju. Ali i to se menja, i vrlo brzo će stvari biti dosta drugačije.
Meni lično, kao programeru zaposlenom u Srbiji, zatrpanom raznim tehnologijama, mnogo više leži Go. Ja već vidim par mesta gde mogu da ga upotrebim, i na prvu loptu sam već blizu i da ga pustim. Sve što bi mi smetalo, ili me usporavalo, ili odvlačilo pažnju – elegantno je sklonjeno iz Go razvoja. Još nisam siguran da li je onaj trik sa „malo slovo – private, veliko – public“ najgenijalnija stvar ikada ili obična budževina. Ali se čovek tako lako na to navikne, i počne da koristi da ubrzo deluje kao najnormalnija stvar na svetu. Eto takav je Go.
Sa druge strane da sam student – prava stvar bi bila da se dobro savlada i Go i Rust. Nisu samo programski jezici u pitanju, već filozofija razvoja softvera u bliskoj budućnosti. Taj niz sličnih stvari nije slučajan. Fokus na Docker nije slučajan.
Obrni, okreni – kontejneri su već tu. Ta tehnologija već ima značajan uticaj na pravac razvoja servera, hostinga i razvoja aplikacija. Uskoro, ono što smatramo da je cloud će se izmeniti iz korena. Po ko zna koji put.
Kontejneri, mikroservisi, unikernel aplikacije: to je ono što se valja iza oblaka, u godinama koje dolaze.
If it wasn't for C, we would be using BASI, PASAL and OBOL! A feature is a bug with seniority. Undetectable errors are always infinite in variety.
Poslovni softver i rešenja već odavno predstavljaju osnov za efikasno upravljanje poslovanjem. Cloud je sve bliže i više ne predstavlja samo svetski trend, već se i na našem tržištu pojavljuje sve više i više rešenja ovog tipa.
Preuzmi izveštaj!