Dok sam bio u Kaliforniji, došao sam u dodir sa jednom aplikacijom koja me je oduševila svojom kombinacijom jednostavnosti i praktičnosti – u pitanju je Splitwise, aplikacija za deljenje grupnih troškova. Iako je ideja daleko od revolucionarne, ovaj servis se probio i dobro pozicionirao kako na mobilnim platformama (postoje Android i iOS aplikacije), tako i na webu, ali do nas iz nekog razloga nikada nije došao. Zbog toga sam počeo uporno da dosađujem ljudima da ga koriste, jer znatno olakšava bilo kakva putovanja ili grupne finansijske konstrukcije, pa ovim tekstom pokušavam da doprem i do šire javnosti. This message has been brought to you by the Splitwise Advertising Department.
Kao što sam već rekao, aplikacija je veoma jednostavna: čitav proces započinje kreiranjem grupe ljudi (ne moraju biti registrovani na sajtu, dovoljno je da jedna osoba barata logovima) koji će deliti neke troškove među sobom tokom određenog vremenskog perioda. Dakle, mogu biti u pitanju cimeri, neko društvo koje redovno izlazi zajedno, ili, pak, društvo koje ide na putovanje. Nakon što je grupa kreirana, započinje se logovanje troškova i transakcija:
- Ukoliko jedan ili više članova grupe plate neki račun, to predstavlja trošak.
- Ukoliko jedan član grupe dâ novac drugom članu, to predstavlja transakciju.
Transakcije su prilično self-explanatory, ali troškovima treba posvetiti veću pažnju, zbog nivoa kontrole koji aplikacija pruža nad njima. Da bi čitav ovaj sistem funkcionisao, za svaki trošak potrebno je precizno odrediti koliki je čiji deo, i za to Splitwise ima više opcija:
- podeli račun na jednake delove
- podeli račun prema procentima
- podeli račun prema “deonicama” – slično procentima, s tim što ukupan broj deonica ne mora da bude 100
- podeli račun na tačne delove
- podeli račun na jednake delove, pa dodaj/oduzmi određenu sumu svakom članu
- podeli račun prema stavakama – odlično za račune iz prodavnica, jer se za svaku stavku unosi cena i određuje koji sve članovi za tu stavku plaćaju
Nakon unošenja troška, Splitwise osvežava dugovanja, i odmah prikazuje ko je dao više para nego što je trebalo, kao i ko kome koliko duguje na osnovu dosadašnjih troškova i transakcija.
Glavna čar Splitwise-a je zapravo u opciji pod nazivom “Simplify debts”. Kao što i samo ime kaže, uključivanjem ove opcije pojednostavljuju se dugovanja, i minimizira se broj potrebnih transakcija. Ukoliko Pera duguje 200 dinara Miki, a Mika duguje 200 dinara Đoletu, logično je da samo Pera da tih 200 dinara Đoletu.
Ova opcija ujedno predstavlja i najkompleksniji (odnosno programerima najzanimljiviji) deo aplikacije, jer se sve ostalo svodi na jednostavne računske operacije, dok je se ovde najverovatnije barata nekim grafom, što nas dovodi do grafovskog problema! Odrediti tačnu sumu koju neki član duguje, odnosno treba da dobije, je lako, ali je problem odrediti kako izvršiti te transakcije tako da ih bude što manje.
Naime, moja pretpostavka je da se jedna grupa ljudi predstavlja usmerenim multigrafom, gde su čvorovi ljudi, a grane dugovanja. U najosnovnijoj varijanti, dodavanje svakog troška dodaje nekoliko grana u graf, ali takav graf je nepraktičan za analizu. Prvi korak “pojednostavljivanja” grafa bi bio spajanje svih grana koje se nalaze između neka dva čvora u jednu granu, što ne predstavlja izazov – saberu se sve grane od Mike ka Peri, kao i sve grane od Pere ka Miki, pa se od veće vrednosti oduzme manja, što ujedno određuje i smer nove grane.
Postupkom uklanjanja grana svodimo njihov broj na najviše , odnosno na po najviše jednu granu između svaka dva čvora/člana. Drugi deo postupka je ono što se aktivira opcijom “Simplify debts”, a to je (ponovo, pretpostavljam) zapravo minimiziranje ukupnog broja grana. I tu već kreću silne diskusije i radovi o raznim mogućim rešenjima, mislim da ih vredi pročitati:
- Stack Overflow – Algorithm to determine minimum number of payments amongst a group
- Stack Overflow – Algorithm to simplify a weighted directed graph of debts
- Mutual debts compensation as graph theory application
- Settling multiple debts efficiently
Verujem da je prilično očigledno zašto se valja mučiti oko korišćenja ove aplikacije. Umesto raskusuravanja nakon svakog plaćenog računa, uz neizbežno zaokruživanje (pa i zaboravljanje) dugovanja i komplikovane proračune, troškovi se unose u Splitwise, i tu se mogu gomilati zauvek – bitno je samo da se stremi ka tome da dugovanja svih članova budu što manja, a da se finalno raskusuravanje ostavi upravo za kraj putovanja (ili kakva je već avantura u pitanju). Prepiranje oko toga ko će da plati račun takođe postaje prošlost, i sve se svodi onu staru “čist račun duga ljubav”.
Naravno, aplikacija i dalje ima razne mane, gde bih kao jednu (mada ne toliko bitnu) naveo nedostatak dinara kao valute; s druge strane, to je možda i dobro za samopouzdanje, jer se dobro osećate kada vidite da vam neko duguje 300 dolara (sve dok ne shvatite da su to zapravo dinari). Srećom, razvojni tim je veoma aktivan na stranici za podršku, kao i na Twitteru, pa se svi problemi brzo rešavaju, a poželjne funkcionalnosti brzo implementiraju.
U svakom slučaju, aplikaciju treba probati, pa čak i ako vaši prijatelji sa podsmehom odbacuju tu ideju, jer će im se kasnije ovaj koncept zasigurno svideti, a svima će olakšati život.