Ako ste ikada osjetili da Spotifyjev Discover Weekly djeluje s gotovo jezivom, vidovitom preciznošću, niste jedini. Možda otvorite aplikaciju u utorak navečer, prepustite joj kontrolu i odjednom vas pogodi pjesma koja tako savršeno utjelovljuje vaše trenutno raspoloženje da se počnete pitati sluša li vas mobitel.
Sustav vam ne čita misli niti prisluškuje vaše razgovore. Matthew Ogle, koji je vodio odjel za otkrivanje (discovery) u Spotifyju tijekom ere Discover Weeklyja, slavno je definirao cilj kao stvaranje „mixtapea od najboljeg prijatelja”. Međutim, iza te vizije koja djeluje tako ljudski krije se sustav nevjerojatne matematičke preciznosti.
Ono što djeluje kao digitalna telepatija zapravo je elegantna izvedba brutalne, višedimenzionalne matematike. Spotifyjeva arhitektura za preporuke je remek-djelo moderne podatkovne znanosti: ne oslanja se na jedan monolitni model, već koordinira ansambl različitih paradigmi strojnog učenja koje rade sinkrono. Rastavimo motor i pogledajmo matematičku arhitekturu ispod haube.
Slika 1: Makro orkestracija Spotifyjevog motora za preporuke, koja prikazuje cjevovod od sirove matrice interakcije korisnika i stavki do višedimenzionalnih latentnih vektorskih ugradnji.
Glavna arhitektura: Tri stupa ekstrakcije
Da bismo razumjeli Spotify, najprije ga moramo razlikovati od determinističkih algoritama za usklađivanje zvuka. Shazam se, primjerice, oslanja na spektrografije i lokalizirano kombinatorno sažimanje (hashing) kako bi identificirao poznati akustički otisak u statičnoj bazi podataka. Spotify, međutim, rješava fundamentalno teži vjerojatnosni problem: predviđanje budućih preferencija na temelju apstraktnog ljudskog ponašanja koje nikada nije izravno promatrao.
Kako bi to postigao, istovremeno povlači podatke iz tri potpuno različita izvora — ponašanja, jezika i sirovog zvuka.
Stup 1: Kolaborativno filtriranje putem izmjeničnih najmanjih kvadrata (ALS)
Temeljni kamen temeljac Spotifyjevog motora je Kolaborativno filtriranje (Collaborative Filtering). Umjesto analize same glazbe, ono analizira metapodatke ljudskog ponašanja na civilizacijskoj razini.
Spotify konceptualizira svoj ekosustav kao masivnu matricu interakcije , gdje redci predstavljaju korisnike (), a stupci stavke/pjesme (). Vrijednost u svakoj ćeliji, , kodira implicitni signal — broj reprodukcija, koliko je puta pjesma odslušana do kraja, je li spremljena ili je preskočena u prvih 30 sekundi. Budući da korisnici kolektivno slušaju samo maleni dio od preko 100 milijuna dostupnih pjesama, ova je matrica iznimno rijetka.
Cilj je Matrična faktorizacija: rastavljanje matrice na dvije guste matrice nižih dimenzija — matricu korisnika i matricu stavki — tako da njihov skalarni umnožak aproksimira izvornu matricu:
Svaki redak matrice je latentni vektor značajki koji predstavlja glazbeni ukus korisnika u nekom apstraktnom -dimenzionalnom prostoru. Svaki redak matrice je odgovarajući vektor za određenu pjesmu. Prateći standardnu notaciju strojnog učenja, latentni vektor za korisnika označavamo kao , a za stavku kao . Njihov skalarni umnožak predviđa koliko bi snažno korisnik reagirao na pjesmu .
Kako bi naučio ove vektore na masovnoj razini, Spotify je povijesno koristio algoritam izmjeničnih najmanjih kvadrata (ALS). Cilj je minimizirati sljedeću ponderiranu funkciju gubitka:
Gdje je:
- : Opažena implicitna interakcija između korisnika i stavke .
- : Predviđeni afinitet — skalarni umnožak latentnih vektora korisnika i stavke.
- : Težina pouzdanosti (confidence weight). Budući da su podaci o streamanju implicitni (neslušanje pjesme ne znači nužno da vam se ona ne sviđa — možda jednostavno niste naišli na nju), proporcionalno skalira važnost opaženih interakcija. Pjesma koja je reproducirana 50 puta dobiva daleko veću težinu u optimizaciji od pjesme koja je reproducirana samo jednom.
- : Parametar L2 regularizacije za kažnjavanje velikih težina i sprječavanje prevelikog prilagođavanja (overfitting).
Budući da istovremeno rješavanje i za i za rezultira nekonveksnim optimizacijskim problemom, algoritam ALS fiksira jednu matricu kako bi riješio drugu pomoću linearnih najmanjih kvadrata, a zatim ih izmjenjuje. Ovaj trik čini izračun visoko paraleliziranim na distribuiranim klasterima — što je ključno kada se radi s matricom od 600 milijuna korisnika.
Praktična intuicija: ako vaše ponašanje pri slušanju pomalo odražava ponašanje korisnika u Tokiju, algoritam zaključuje da ste „glazbene srodne duše” i preporučuje vam pjesme koje oni vole, a na koje vi još niste naišli. Vaš Discover Weekly je, u svojoj srži, odabrana kompilacija onoga što vaši matematički najbliži susjedi vrte ovaj tjedan.
Ažuriranje za 2026. — Grafovske neuronske mreže. Iako ALS ostaje konceptualni temelj, Spotify se sve više okreće grafovskim neuronskim mrežama (GNN) za preporuke na produkcijskoj razini. Kroz svoju internu platformu Twine, Spotify modelira cijeli ekosustav — korisnike, pjesme, playliste, izvođače i podcaste — kao jedan heterogeni graf. GNN-ovi mogu obuhvatiti odnose s više skokova (multi-hop) koji su nevidljivi matričnoj faktorizaciji: primjerice, da ste vi i superfan nekog izvođača u Seulu povezani kroz tri skoka između playlista, a ne samo izravnim zajedničkim slušanjem. ALS objašnjava zašto ovog pristupa, dok GNN-ovi sve više odrađuju najteži dio posla u produkciji.
Slika 2: Arhitektura Spotifyjevog okvira za kolaborativno filtriranje, koja ilustrira faktorizaciju rijetke matrice interakcije korisnika i stavki u latentne vektore značajki, matematičku optimizaciju funkcije gubitka i iterativno izvršavanje algoritma izmjeničnih najmanjih kvadrata (ALS).
Stup 2: Obrada prirodnog jezika — Playliste kao rečenice
Kolaborativno filtriranje je moćno, ali pati od problema hladnog starta (Cold Start Problem): kako preporučiti pjesmu koja ima nula povijesnih podataka o reprodukciji? Potpuno novi prijenos od neovisnog izvođača nema nikakav signal ponašanja. Zbog toga je potreban drugi, komplementarni sustav.
Spotify premošćuje ovaj jaz okretanjem širem kulturnom internetu. Njegovi indekseri (crawleri) neprekidno pretražuju web-sadržaj — glazbene blogove, uredničke članke — i što je najvažnije, naslove i opise milijuna playlista koje su generirali korisnici. Ovdje vrijedi i Ogleovo poznato zapažanje: istinska inteligencija sustava „stoji na ramenima ljudskih divova” — milijuna običnih korisnika koji nesvjesno označavaju glazbu svaki put kada imenuju playlistu.
NLP cjevovod (Natural Language Processing) tretira playliste kao rečenice, a pjesme kao riječi, primjenjujući modele koji su arhitektonski slični Word2Vec modelu (točnije varijantama Skip-gram ili CBOW). Treniranjem na slijedu pjesama unutar playlista, model se obučava da maksimizira vjerojatnost predviđanja okolnih pjesama s obzirom na sidrišnu pjesmu — što je cilj koji se obično optimizira putem negativnog uzorkovanja (Negative Sampling, računski učinkovita aproksimacija punog softmax gubitka unakrsne entropije). To prisiljava model da nauči guste vektorske ugradnje (embeddings) u kojima pjesme koje se supojavljuju u istim playlistama geometrijski završavaju blizu jedna drugoj.
To je ista intuicija koja stoji iza poznatog svojstva Word2Vec-a: baš kao što je „Kralj” − „Muškarac” + „Žena” ≈ „Kraljica” u prostoru ugradnje riječi, pjesma koja živi između playlista “lo-fi hip hop” i “late night study” klasterirat će se u skladu s tim u prostoru glazbenih ugradnji.
Nakon što se ove ugradnje nauče, sustav procjenjuje kulturnu bliskost između kandidatske pjesme i korisničkog profila preferencija pomoću Kosinusne sličnosti (Cosine Similarity):
Ako tisuće korisnika neovisno stave pjesmu u playliste pod nazivom “sad boy hours,” “crying in the rain,” ili “2 AM existential crisis,” vektorska reprezentacija te pjesme () u višedimenzionalnom prostoru primjetno se približava vektorskim reprezentacijama tih emocionalnih deskriptora (). To je točno razlog zašto vas preporuka pogodi u pravom trenutku — globalni kolektivni um već je obavio emocionalno označavanje u ime Spotifyja.
Spotify naziva ove naučene reprezentacije „kulturnim vektorima” (cultural vectors). Oni ne kodiraju samo žanr, već i raspoloženje, kontekst, potkulturu i društveno značenje — dimenzije kojima analiza sirovog zvuka jednostavno ne može pristupiti.
Slika 3: Konceptualni okvir Spotifyjevog stupa za obradu prirodnog jezika (NLP), koji ilustrira kako se korisnički generirane playliste modeliraju kao semantičke rečenice putem Word2Vec arhitekture radi generiranja kulturno osviještenih ugradnji pjesama i izračunavanja emocionalne bliskosti.
Stup 3: Analiza sirovog zvuka putem CNN-ova
Za pjesme kod kojih nedostaju i signali ponašanja i tekstualni signali, nastupa Spotifyjev treći stup: duboka akustička analiza pomoću konvolucijskih neuronskih mreža (CNN) primijenjenih na spektralni prikaz zvuka.
Sirovi zvučni val se najprije pretvara u Mel-spektrogram — dvodimenzionalni prikaz frekvencijskog spektra kroz vrijeme, s frekvencijskim pojasevima (bins) skaliranim logaritamski kako bi se približili ljudskoj auditivnoj percepciji. CNN obrađuje ovu matricu kroz više konvolucijskih slojeva, učeći otkrivati hijerarhijske obrasce u zvuku — od značajki niske razine poput tranzijentnih početaka i tonalne stabilnosti, pa sve do svojstava višeg reda kao što su tekstura žanra i emocionalni registar.
Izlaz je gusti vektor značajki koji kodira mjerljive akustičke karakteristike, a sve su normalizirane na skalu od 0.0 do 1.0 (osim glasnoće, koja se mjeri u dB):
| Značajka | Skala | Što obuhvaća |
|---|---|---|
| Valence | 0.0 – 1.0 | Glazbena pozitivnost. Visoko = euforično, veselo. Nisko = melankolično, napeto. |
| Energy | 0.0 – 1.0 | Perceptivni intenzitet. Kombinira dinamički raspon, glasnoću i brzinu nastanka tona (onset rate). |
| Danceability | 0.0 – 1.0 | Ritmička stabilnost, regularnost tempa i jačina ritma (beat strength). |
| Acousticness | 0.0 – 1.0 | Razina pouzdanosti da je pjesma akustična (prirodni naspram elektroničkog zvuka). |
| Instrumentalness | 0.0 – 1.0 | Vjerojatnost izostanka vokalnog sadržaja. Vrijednosti iznad 0.5 vjerojatno označavaju instrumentalnu skladbu. |
| Loudness | −60 do 0 dB | Ukupna prosječna glasnoća pjesme (ne glasnoća reprodukcije). |
Izbacivanjem ovog gustog vektora značajki za bilo koju novu pjesmu, sustav može u potpunosti zaobići nedostatak korisničkih podataka i odmah uskladiti akustičku topologiju pjesme s preferencijama slušatelja koji povijesno bilježe visoke vrijednosti na sličnim vektorima. Problem hladnog starta urušava se iz nepremostivog jaza u jednostavno traženje najbližeg susjeda.
Slika 4: Arhitektura neuronske mreže za Spotifyjevu analizu sirovog zvuka, koja ilustrira cjevovod ekstrakcije iz logaritamski skaliranog Mel-spektrograma kroz CNN radi generiranja gustog vektora značajki akustičkih svojstava za rješavanje problema hladnog starta.
Discover Weekly: Gdje tri stupa konvergiraju
Discover Weekly nije jedan algoritam. To je proizvod koji proizlazi iz sinkroniziranog izlaza sva tri gore navedena stupa.
Evo pojednostavljenog prikaza onoga što se događa svakog ponedjeljka kada se sastavlja vaša nova playlista:
-
Generiranje kandidata (Candidate Generation). ALS model identificira vaše najbliže susjede u prostoru ugradnje korisnika — slušatelje čiji su vektori ukusa najbliži vašima na temelju nedavnih signala ponašanja. Iz njihove zajedničke povijesti slušanja sastavlja se skup potencijalnih pjesama (kandidata): pjesme koje oni vole, a vi ih još niste čuli.
-
Bodovanje i ponovno rangiranje (Scoring and Re-ranking). Svaka pjesma kandidat boduje se u odnosu na vaš akustički profil (iz CNN značajki zvuka) i njezin kulturni vektor (iz NLP cjevovoda). Pjesma koja se čini relevantnom po ponašanju i akustički dosljednom i nosi kulturne deskriptore koji odgovaraju vašem kontekstu, penje se na vrh.
-
Ograničenje noviteta (Novelty Constraint). Sustav eksplicitno filtrira pjesme koje ste već reproducirali ili spremili. Cilj je otkrivanje, a ne ponavljanje.
-
Ograničenje od 30 pjesama (The 30-Track Limit). Spotifyjev tim za upravljanje proizvodima dosljedno tvrdi da je 30 pjesama optimalna duljina za tjednu playlistu otkrivanja — dovoljno dugačka da djeluje opsežno, a dovoljno kratka da se može poslušati tijekom jednog putovanja na posao ili trčanja. Konačna rangirana lista reže se na 30 pjesama, s većom težinom usmjerenom prema preporukama visoke pouzdanosti na vrhu i eksperimentalnijim izborima na dnu.
-
Konačno ponovno rangiranje putem BaRT-a. Prije nego što se lista isporuči, isti BaRT (Bandits for Recommendations as Treatments) okvir opisan u odjeljku Smart Shuffle provodi konačni prolaz kroz redoslijed. Na temelju vaših kontekstualnih signala u trenutku otvaranja aplikacije — doba dana, povijest sesije slušanja, nedavna stopa preskakanja — odlučuje hoće li pozicija br. 3 na vašoj playlisti u ponedjeljak ujutro biti siguran izbor visoke pouzdanosti (eksploatacija) ili izračunati istraživački potez (eksploracija). Oba sustava dijele isti temeljni RL (reinforcement learning) motor.
Konačni rezultat je playlista koja, u svom najboljem izdanju, djeluje točno poput preporuke prijatelja koji dijeli vaš ukus, ali je preslušao daleko više glazbe nego što biste vi ikada mogli.
Slika 5: Cjeloviti (end-to-end) cjevovod generiranja Discover Weekly playliste, koji prikazuje konvergenciju kolaborativnog filtriranja, NLP kulturnih vektora i CNN akustičkih značajki u jedinstveni motor za bodovanje, nakon čega slijedi uklanjanje već poznatog sadržaja i kontekstualna optimizacija u stvarnom vremenu putem BaRT okvira za potkrepljeno učenje.
Matematika Smart Shufflea: Kontekstualni banditi
Paradoks nasumičnosti: Ljudi su notorno loši u percipiranju istinske statističke nasumičnosti.
Rano u svom životnom ciklusu, Spotify je koristio generator istinske nasumičnosti — Fisher-Yatesov algoritam miješanja (Fisher-Yates shuffle). Statistički gledano, istinska nasumičnost često dovodi do grupiranja (clustering): potpuno je moguće čuti tri uzastopne pjesme istog izvođača iz biblioteke od 400 pjesama. Kada bi korisnici naišli na to, glasno bi se žalili da sustav „nije nasumičan”. Pericipirana nasumičnost je zakazala, iako je matematička nasumičnost bila savršena.
Inženjeri su odgovorili implementacijom algoritma inspiriranog ditherom (dithering) — tehnikom posuđenom iz obrade slika — koja namjerno narušava istinsku nasumičnost kako bi stvorila percepciju pravednosti ravnomjernim raspoređivanjem izvođača kroz red čekanja.
Danas je standardno miješanje zamijenjeno opcijom Smart Shuffle, inteligentnim sustavom usmjeravanja kojim upravlja potkrepljeno učenje (Reinforcement Learning), točnije arhitektura koju Spotify naziva BaRT (Bandits for Recommendations as Treatments).
Ovo je problem kontekstualnog višerukog bandita (Contextual Multi-Armed Bandit). Algoritam mora neprestano balansirati između eksploatacije (reproduciranje pjesama za koje zna da ih volite) i eksploracije (ubacivanje nepoznatih pjesama kako bi se mapirao vaš ukus koji se razvija i spriječilo da upadnete u „balon filtera”). Klasu algoritama koji to pokreću najbolje oslikava LinUCB (Linear Upper Confidence Bound):
Evo kako algoritam „razmišlja” u stvarnom vremenu, pri svakom koraku vašeg reda čekanja:
- Eksploatacija (): Predviđena nagrada za odabir pjesme s obzirom na vaš trenutni vektor konteksta — koji kodira signale poput doba dana, vrste uređaja (slušalice, automobil, pametni zvučnik) i nedavnih obrazaca preskakanja.
- Bonus za eksploraciju (): Statistička nesigurnost te pjesme. Pjesme koje je sustav rijetko nudio korisnicima poput vas u sličnim kontekstima dobivaju matematički uvećanu ocjenu, što potiče algoritam da prikupi više signala o njima. je hiperparametar koji se može podešavati, a kontrolira agresivnost ove eksploracije.
Petlja povratnih informacija je izravna i brutalna: ako algoritam ponudi istraživačku pjesmu, a vi je preskočite u prvih 30 sekundi, on bilježi snažan signal negativne nagrade i matrica kovarijance se ažurira u skladu s tim. Ako dodate pjesmu u svoju biblioteku ili pojačate glasnoću, algoritam je upravo dobio potvrdu da se ovaj kontekstualni rizik isplatio. Sustav uči kontinuirano, prilagođavajući svaku sljedeću odluku.
Slika 6: Mehanika potkrepljenog učenja Spotifyjeve značajke Smart Shuffle, koja suprotstavlja istinsku statističku nasumičnost s percipiranom pravednošću te opisuje izvođenje LinUCB algoritma kontekstualnog višerukog bandita zajedno s njegovom kontinuiranom petljom korisničkih povratnih informacija u stvarnom vremenu.
Arhitektonski pomaci: Vektorska pretraga i LLM-ovi
Glavni matematički teoremi koji upravljaju preporukama ostali su stabilni, ali infrastruktura koja ih izvršava u 2026. drastično je evoluirala.
Približni najbliži susjedi (ANN)
Jednom kada su korisnici i pjesme predstavljeni kao vektori, temeljna operacija koja pokreće preporuke je pretraga k-najbližih susjeda (kNN): pronalaženje vektora u bazi podataka koji su najbliži zadanom vektoru upita. Izračunata naivno kao skalarni umnožak kroz sve vektore, ova operacija skalira kao po upitu za pjesama u dimenzija — što je računski nemoguće u stvarnom vremenu za katalog od 100 milijuna pjesama.
Spotifyjevo rješenje bilo je stvaranje i otvaranje izvornog koda (open-source) biblioteke Annoy (Approximate Nearest Neighbors Oh Yeah), koju je prvotno razvio Erik Bernhardsson 2013. godine. Annoy particionira vektorski prostor koristeći šumu nasumičnih stabala hiperravnina, omogućujući pronalaženje približnih najbližih susjeda u vremenu . Kompromis je mali, ograničeni gubitak u točnosti — što je prihvatljivo za preporuke, gdje je 99.9% optimalan rezultat neprimjetan u usporedbi sa 100% optimalnim.
Do 2023. godine, Spotify je prešao na njezinu nasljednicu, biblioteku Voyager, koja je poboljšala Annoyjevu skalabilnost, učinkovitost memorije i vrijeme izgradnje indeksa — što je ključno kada se temeljna vektorska baza podataka kontinuirano ažurira kako pristižu novi podaci o ponašanju korisnika.
Kognitivni sloj: Veliki jezični modeli (LLM-ovi)
S pojavom generativne umjetne inteligencije, sirovi matematički izlazi cjevovoda za preporuke sada su orkestrirani semantičkim slojem izgrađenim na LLM-ovima. Značajke poput AI DJ-a djeluju kao inteligentno prevoditeljsko sučelje: LLM interpretira nestrukturirani kontekst korisnika — konverzacijski upit, implicitno emocionalno stanje, vrijeme i lokaciju — te ga prevodi u precizan dimenzionalni upit prema temeljnoj vektorskoj bazi podataka.
Stari i novi sustavi nisu u konkurenciji. LLM personalizira narativ i humanizira isporuku. Matrična faktorizacija, kosinusna sličnost i LinUCB optimizacija i dalje odrađuju najteži dio posla same selekcije glazbe. Generativni AI je rječiti front-end; matematika je motor na kojem on radi.
Slika 7: Spotifyjeva objedinjena moderna arhitektura, koja ilustrira sjecište između visokoperformansnih biblioteka za pretragu približnih najbližih susjeda (ANN) poput Annoya i Voyagera, te kognitivnog sloja LLM orkestracije koji prevodi semantički ljudski kontekst u strukturirane upite baze podataka.
Tehnički pojmovnik
| Pojam | Definicija |
|---|---|
| Kolaborativno filtriranje | Pristup preporukama koji se temelji na zajedničkim obrascima ponašanja među korisnicima. |
| Matrična faktorizacija | Rastavljanje rijetke matrice interakcije korisnika i stavki na matrice latentnih faktora i . |
| ALS | Alternating Least Squares (Izmjenični najmanji kvadrati) — iterativni algoritam za rješavanje matrične faktorizacije. |
| Latentni vektor | Gusti numerički prikaz apstraktnih karakteristika korisnika ili pjesme u -dimenzionalnom prostoru. |
| Problem hladnog starta | Izazov preporučivanja stavki koje nemaju povijesne podatke o interakciji s korisnicima. |
| Word2Vec | Plitka neuronska mreža koja uči ugradnje riječi (ili pjesama) na temelju njihovog supojavljivanja u sekvencama. |
| Kulturni vektor | Ugradnja glazbe (music embedding) izvedena iz NLP analize naslova playlista, članaka i šireg kulturnog konteksta. |
| Kosinusna sličnost | Mjera kuta između dva vektora; 1.0 = identičan smjer, 0 = ortogonalni vektori. |
| Mel-spektrogram | Dvodimenzionalni vremensko-frekvencijski prikaz zvuka, s frekvencijom skaliranom prema ljudskoj auditivnoj percepciji. |
| Valence | Značajka zvuka (0.0–1.0) koja kodira glazbenu pozitivnost ili melankoliju. |
| Višeruki bandit | Paradigma potkrepljenog učenja za balansiranje između istraživanja nepoznatog (exploration) i iskorištavanja poznatih nagrada (exploitation). |
| LinUCB | Linear Upper Confidence Bound — algoritam kontekstualnog bandita koji odabire akcije na temelju predviđene nagrade i nesigurnosti. |
| ANN / Annoy / Voyager | Biblioteke za pretragu približnih najbližih susjeda (Approximate Nearest Neighbor) za brzu pretragu sličnosti vektora u višedimenzionalnim prostorima. |
| BaRT | Bandits for Recommendations as Treatments — Spotifyjev RL okvir za personalizaciju reda čekanja u stvarnom vremenu. |
Zaključak: Višedimenzionalno ogledalo
U konačnici, Spotifyjev motor za preporuke ne čita misli. On je neumoljivo ogledalo visoke frekvencije — zrcalo koje vam vraća vaše vlastite obrasce ponašanja, pojačane kolektivnom inteligencijom više od 600 milijuna drugih slušatelja diljem svijeta.
Vaš glazbeni identitet unutar Spotifyjevog pozadinskog sustava (backend) nije pohranjen kao popis žanrova ili izvođača. To je niz brojeva s pomičnim zarezom (floating-point numbers) — jedna koordinata koja pluta kroz beskonačan, višedimenzionalni prostor. Sposobnost algoritma da pronađe točnu pjesmu koja odgovara vašem raspoloženju u utorak navečer jednostavno je rezultat milijardi kontinuiranih matričnih množenja, odluka kontekstualnih bandita i pretraga kosinusne sličnosti, koje nezaustavljivo konvergiraju prema točki u tom vektorskom prostoru u kojoj već živite.
Duša koju sustav prividno čita oduvijek je bila samo geometrija.

