Kai milijardas tampa kasdienybe
Prisimenu, kaip vaikystėje bandžiau įsivaizduoti milijardą. Skaičiavau, kad jei skaičiuočiau nuo vieno iki milijardo po vieną skaičių per sekundę, man prireiktų daugiau nei 31 metų. Dabar, kai technologijų įmonės kasdien operuoja milijardiniais skaičiais – naudotojų, duomenų, transakcijų – šis skaičius tapo kažkuo visai kitu. Bet kaip jie iš tikrųjų skaičiuoja? Ar tikrai Facebook žino, kad turi tiksliai 2,9 milijardo aktyvių naudotojų? Ir kas apskritai yra tas „milijardas” technologijų pasaulyje?
Technologijų kompanijos nebeskaičiuoja taip, kaip mes įsivaizduojame skaičiavimą. Jie nesėdi su popieriniais lapais ir neskaičiuoja kiekvieno naudotojo. Vietoj to naudoja sudėtingas sistemas, kurios veikia pagal visai kitokius principus nei mūsų kasdienė aritmetika.
Duomenų bazės ir jų skaičiavimo logika
Pirmiausia reikia suprasti, kad didžiosios technologijų įmonės nesaugo informacijos vienoje vietoje. Kai Google teigia, kad apdoroja milijardus paieškų per dieną, jie kalba apie paskirstytą sistemą, kuri veikia tūkstančiuose serverių visame pasaulyje. Kiekvienas serveris skaičiuoja savo dalį, o paskui visa tai susumuojama.
Štai kaip tai veikia praktiškai. Tarkime, turite internetinę parduotuvę ir norite sužinoti, kiek žmonių aplankė jūsų svetainę šiandien. Jūsų serveris kiekvieną kartą, kai kas nors atidaro puslapį, įrašo įvykį į duomenų bazę. Tai gali būti paprasta lentelė su stulpeliais: laikas, IP adresas, puslapis, naršyklė. Bet kai turite milijardą tokių įrašų, paprastas skaičiavimas tampa neįmanomas.
Todėl naudojamos specialios duomenų struktūros. Viena populiariausių – HyperLogLog algoritmas. Skamba bauginančiai, bet principas gana paprastas. Vietoj to, kad saugotum kiekvieną unikalų lankytojo ID (o tai užimtų milžinišką vietą), algoritmas naudoja matematinę gudrybę – jis stebi tam tikrus šablonus duomenyse ir iš jų apskaičiuoja apytikslį unikalių elementų skaičių. Tikslumas – apie 98%, bet užima šimtus kartų mažiau vietos.
Kai skaičiai tampa per dideli net kompiuteriams
Įdomus dalykas – net kompiuteriams milijardai kelia problemų. Standartinis 32 bitų sveikasis skaičius gali saugoti reikšmes tik iki maždaug 2,1 milijardo. Todėl programuotojai naudoja 64 bitų skaičius, kurie gali pasiekti apie 9 kvintilijonus (tai 9 su 18 nulių). Bet net ir tai kartais nepakanka.
YouTube, pavyzdžiui, 2014 metais susidūrė su keista problema. PSY dainos „Gangnam Style” peržiūrų skaitiklis pasiekė maksimalią 32 bitų sveikojo skaičiaus ribą – 2,147,483,647. Jiems teko skubiai pereiti prie 64 bitų sistemos. Dabar teoriškai vaizdo įrašas gali turėti iki 9,223,372,036,854,775,807 peržiūrų. Kol kas saugūs.
Bet problema ne tik technologinė. Kai skaičiuoji milijardus, kiekviena operacija turi būti optimizuota. Jei paprastas skaičiavimas užtrunka mikrosekundę, o tau reikia atlikti milijardą tokių operacijų, tai jau 16 minučių. Per lėtai, kai naudotojai laukia rezultato akimirksniu.
Apytikslumas kaip strategija
Štai ko daugelis nežino: dauguma milijardinių skaičių, kuriuos skelbia technologijų įmonės, yra apytikslūs. Ir tai visiškai normalu. Kai Facebook sako, kad turi 2,9 milijardo naudotojų, jie nežino tikslaus skaičiaus iki vieno naudotojo. Ir jiems to nereikia.
Technologijose naudojamas terminas „eventually consistent” – galiausiai nuoseklus. Tai reiškia, kad skirtingose sistemos dalyse gali būti šiek tiek skirtingi skaičiai tam tikrą laiką, bet galiausiai jie susilygina. Pavyzdžiui, jei dabar užsiregistruotumėte Facebook, jūsų paskyra būtų sukurta vienoje duomenų bazėje, bet gali praeiti kelios sekundės ar net minutės, kol ši informacija pasieks visas kitas sistemas visame pasaulyje.
Todėl kai įmonė skelbia statistiką, ji dažniausiai naudoja vakar ar praėjusios savaitės duomenis, kurie jau „nusistovėjo”. Realiuoju laiku tikslus skaičiavimas būtų per brangus ir per lėtas.
Sampling – skaičiavimas be skaičiavimo
Dar viena technika, kurią naudoja didžiosios įmonės – sampling arba mėginių ėmimas. Vietoj to, kad skaičiuotum visus duomenis, paimi reprezentatyvią imtį ir iš jos ekstrapoliuoji rezultatą visai populiacijai.
Tarkime, Netflix nori sužinoti, kiek žmonių žiūri tam tikrą serialą. Jie gali nebeskaičiuoti kiekvieno atskirai, o paimti, pavyzdžiui, kas dešimtą naudotoją ir padauginti rezultatą iš dešimties. Jei tarp 10 milijonų naudotojų imties paėmei milijoną ir 100 tūkstančių žiūrėjo serialą, tai reiškia, kad iš viso žiūrėjo apie milijoną.
Žinoma, čia naudojami daug sudėtingesni statistiniai metodai, bet principas tas pats. Google Analytics, pavyzdžiui, kai turite labai daug lankytojų, automatiškai pereina prie sampling režimo. Jie net įspėja apie tai sąsajoje – matysite žalią užrašą „This report is based on X% of sessions”.
Realaus laiko skaičiavimo iššūkiai
Kai Twitter rodo, kad hashtag’as buvo panaudotas milijoną kartų per valandą, kaip jie tai skaičiuoja realiuoju laiku? Atsakymas – stream processing arba srautų apdorojimas.
Įsivaizduokite upę, kurioje plaukia milijonai žuvų. Jums nereikia sugauti visų žuvų ir suskaičiuoti jas krante – galite stovėti upėje ir skaičiuoti jas praeinant. Taip veikia Apache Kafka, Apache Flink ir kitos stream processing sistemos.
Kiekvienas tweet’as, kai jis sukuriamas, pereina per tokią sistemą. Sistema tikrina, ar jame yra hashtag’ų, ir jei taip – padidina atitinkamą skaitiklį. Bet čia slypi gudrybė: šie skaitikliai saugomi ne paprastoje duomenų bazėje, o atmintyje (RAM), kuri yra tūkstančius kartų greitesnė. Tik periodiškai rezultatai išsaugomi į ilgalaikę saugyklą.
Problema ta, kad atmintis yra ribota ir brangi. Todėl naudojamos specialios duomenų struktūros kaip Count-Min Sketch ar Bloom filters, kurios leidžia saugoti apytikslius skaičiavimus užimant minimalią vietą. Vėlgi – ne tikslus skaičius, bet pakankamai tikslus praktiniams tikslams.
Kaip atskirti tikrus naudotojus nuo botų
Dar vienas didžiulis iššūkis skaičiuojant milijardus – kaip žinoti, kas yra tikras? Instagram teigia turintis daugiau nei milijardą naudotojų, bet kiek iš jų yra tikri žmonės, o kiek botai ar neaktyvios paskyros?
Technologijų įmonės naudoja sudėtingas sistemas, kad filtruotų netikrus duomenis. Pavyzdžiui, kai skaičiuojami aktyvūs naudotojai, dažniausiai skaičiuojami tik tie, kurie prisijungė per pastarąjį mėnesį ar atliko tam tikrą veiksmą. Bet net ir čia yra niuansų.
Facebook, pavyzdžiui, turi kelis aktyvumo lygius: DAU (Daily Active Users – kasdien aktyvūs naudotojai), MAU (Monthly Active Users – kas mėnesį aktyvūs) ir Family DAU (aktyvūs bent vienoje iš Facebook šeimos programų). Kiekvienas šis skaičius skaičiuojamas skirtingai ir gali skirtis milijardais.
Botų aptikimas – tai atskira mokslo šaka. Sistemos stebi elgesio šablonus: ar naudotojas juda kaip žmogus (su pauzėmis, klaidomis), ar kaip robotas (per greitai, per tiksliai). Ar IP adresas atrodo įtartinas? Ar naudojami automatizavimo įrankiai? Visa tai įeina į skaičiavimus.
Pinigų skaičiavimas – kai klaida kainuoja milijonus
Kai kalba eina apie pinigus, tikslumas tampa kritiškai svarbus. Bet ir čia milijardiniai skaičiai kelia unikalių iššūkių. Stripe, PayPal ar kiti mokėjimo procesoriai apdoroja milijardus transakcijų, ir kiekvienas centas turi būti apskaičiuotas tiksliai.
Problema ta, kad kompiuteriai blogai skaičiuoja dešimtaines trupmenas. Tai skamba keistai, bet tai tiesa. Jei programoje parašytumėte 0.1 + 0.2, daugelis programavimo kalbų gautų ne 0.3, o kažką panašaus į 0.30000000000000004. Tai vadinama floating point precision problema.
Todėl pinigams naudojami specialūs duomenų tipai. Vietoj to, kad saugotum 19.99 eurų kaip dešimtainę trupmeną, saugai 1999 centų kaip sveikąjį skaičių. Taip išvengi apvalinimo klaidų. Kai apdoroji milijardą tokių transakcijų, net mažytė klaida gali tapti milijonine problema.
Amazon, pavyzdžiui, turi sistemą, kuri nuolat tikrina, ar visų transakcijų suma sutampa su tuo, kas turėtų būti. Jei kažkur atsiranda neatitikimas – net vieno cento – sistema kelia aliarmus. Tai vadinama reconciliation arba suderinimas, ir tai vyksta nuolat, milijardus kartų per dieną.
Kai skaičiai tampa verslo paslaptimi ir manipuliacijos įrankiu
Paskutinis aspektas, apie kurį verta pakalbėti – kaip įmonės nusprendžia, kokius skaičius rodyti viešai. Ne viskas, kas skaičiuojama, yra skelbiama, ir ne viskas, kas skelbiama, yra skaičiuojama vienodai.
Pavyzdžiui, Netflix nustojo skelbti prenumeratorių skaičių 2021 metais. Kodėl? Nes jie nusprendė, kad šis skaičius nebeatspindi jų verslo sėkmės taip gerai kaip kiti rodikliai. Bet jie vis dar skaičiuoja jį viduje – tiesiog nebesidalina viešai.
Arba paimkime „aktyvų naudotoją”. Skirtingos įmonės apibrėžia tai skirtingai. Vienai įmonei aktyvus naudotojas gali būti tas, kuris prisijungė per pastarąjį mėnesį. Kitai – tas, kuris atliko bent vieną veiksmą. Dar kitai – tas, kuris praleido bent 5 minutes programoje. Visi skelbia „milijardą aktyvių naudotojų”, bet skaičiai nėra tiesiogiai palyginami.
Yra ir tamsesnė pusė. Kai įmonė žino, kad investuotojai ar reklamos partneriai žiūri į tam tikrus skaičius, gali atsirasti pagunda tuos skaičius „optimizuoti”. Facebook 2016 metais prisipažino, kad per klaidą per didelius skaičius rodė video peržiūrų trukmę – jie neskaičiavo peržiūrų, kurios truko mažiau nei 3 sekundes, bet tai įtraukė į vidurkio skaičiavimą, todėl vidutinė trukmė atrodė ilgesnė nei buvo iš tikrųjų.
Milijardiniai skaičiai technologijų pasaulyje yra ne tik techninė problema, bet ir verslo strategija, ir komunikacijos įrankis. Įmonės renkasi, ką skaičiuoti, kaip skaičiuoti ir ką skelbti, atsižvelgdamos ne tik į technines galimybes, bet ir į tai, kokį įspūdį nori sudaryti.
Taigi kai kitą kartą išgirsite, kad kažkokia programa turi milijardą naudotojų ar apdoroja milijardą transakcijų, prisiminkite – už to skaičiaus slypi sudėtinga infrastruktūra, kompromisai tarp tikslumo ir greičio, statistiniai metodai ir verslo sprendimai. Milijardas technologijose nėra paprastas skaičius – tai visas ekosistema sistemų, algoritmų ir strategijų, kurios kartu sukuria tą didžiulį skaičių, kurį mes matome ekrane.
