Dio 1 – Vrijednost, troškovi, razvoj ili kupnja, TCO
Dio 2 – Metrike, procjena, NPV, povrat
Dopunska praksa – NPV u Pythonu
Materijale priredio Erkan Islamović
erkan.islamovic@eubd.edu.ba · erkan.islamovic@gmail.com
Deset predavanja: dva časa teorije i jedan čas dopunske prakse. Danas je poglavlje 10. Isti primjer kroz knjigu: DeliveryApp 2.0.
| Pred. | Dio 1 | Dio 2 | Praksa |
|---|---|---|---|
| 1 | Projekat i proizvod, trendovi, etika | Inženjerski pristup, alati, automatizacija | Repozitorij i vizija proizvoda |
| 2 | Modeli, uloge, planiranje | Rizici, tim, kvalitet, poboljšanje procesa | Plan izdanja, registar rizika |
| 3 | Konceptualni model, UML, SOLID | Prototip, UX, specifikacija dizajna | Wireframe i SDD |
| 4 | IDE, organizacija koda, OOP, okviri | Podaci, MVC/MVVM, čisti kod, refaktoring | Refaktoring funkcije |
| 5 | Git, pull request, CI | Testovi, CD, kontejneri | GitHub Actions |
Deset predavanja: dva časa teorije i jedan čas dopunske prakse. Danas: poglavlje 10 (označeno). Isti primjer kroz knjigu: DeliveryApp 2.0.
| Pred. | Dio 1 | Dio 2 | Praksa |
|---|---|---|---|
| 6 | Klasifikacija, mjerljivost | Taktike i redizajn | Mjerenje i keš |
| 7 | Odluke, pogledi, stilovi | Troslojna i čista arhitektura, predlošci | ADR i C4 |
| 8 | CBSE, odlike, interfejsi | Principi, smjernice, provođenje | Paket sa verzijom |
| 9 | SaaS, SOA, IoT, proizvodne linije | Aspekti, reaktivno programiranje | Dekorator i tok događaja |
| 10 | Vrijednost, troškovi, razvoj ili kupnja, TCO | Metrike, procjena, NPV, povrat | NPV u Pythonu |
Godine 2002. britanska vlada pokrenula je Nacionalni program za informacione tehnologije u zdravstvu (NPfIT), najveći civilni softverski projekat svog vremena. Cilj je bio velik i plemenit: jedan elektronski karton za svakog pacijenta u Engleskoj, dostupan u svakoj bolnici i ambulanti. Ugovori su potpisani brzo, s velikim dobavljačima, za cijelu zemlju odjednom. Ali bolnice su radile na različite načine, ljekari nisu bili pitani šta im treba, rokovi su probijani, a dobavljači su odustajali. Parlamentarni odbor je 2011. preporučio da se program ugasi, i iste godine vlada ga je raspustila; dijelovi koji su već radili nastavili su kao zasebni projekti.
Nacionalna revizorska kancelarija je kasnije procijenila da će ukupan trošak, do kraja korištenja svih dijelova, iznositi oko 10 milijardi funti. Koristi izmjerene do 2012. procijenjene su na 3,7 milijardi, otprilike trećinu potrošenog. Niko nije sumnjao da je cilj bio dobar. Pitanje koje je falilo na početku bilo je ekonomsko: koliko će zaista koštati, šta ćemo zaista dobiti, i kada?
U poglavlju 2 napravili smo budžet tima DeliveryApp (40.000 €), a u poglavljima 3–9 vidjeli smo da svaka odluka ima cijenu: nefunkcionalni zahtjevi, arhitektura, komponente, servisi. Ovo poglavlje sve to stavlja na vagu. Prvi dio govori o tome gdje softver stvara vrijednost, šta košta, kada je bolje kupiti nego razvijati, i šta je ukupna cijena vlasništva. Drugi dio govori kako se mjeri veličina i složenost softvera, kako se procjenjuje trošak, i kako se odlučuje o ulaganju pomoću neto sadašnje vrijednosti i perioda povrata. Matematike ima malo, i sve je na brojevima DeliveryApp.
Nakon poglavlja možete:
objasniti gdje u lancu vrijednosti softver stvara vrijednost; nabrojati vrste troškova i koristi softverskog proizvoda; obrazložiti odluku razvoj, kupnja ili saradnja; izračunati TCO za dvije opcije; izmjeriti LOC i ciklomatsku složenost i objasniti njihova ograničenja; prebrojati funkcijske tačke za jednostavan sistem; procijeniti napor i trajanje osnovnim COCOMO modelom; objasniti konus nesigurnosti; izračunati NPV i period povrata i na osnovu njih preporučiti odluku.
| Čas | Sadržaj | Na času |
|---|---|---|
| Teorija 1 | 10.1–10.4 Lanac vrijednosti, troškovi i koristi, razvoj ili kupnja, TCO | Razvijati ili kupiti platformu? 73.600 € naspram 77.000 € |
| Teorija 2 | 10.5–10.8 Metrike, procjena, NPV, period povrata | Da li se DeliveryApp 2.0 isplati? NPV = 9.950 € |
| Dopunska praksa | NPV i povrat u Pythonu ili Excelu | Šta ako je stopa 25 %? |
Michael Porter je 1985. opisao lanac vrijednosti: firma stvara vrijednost kroz niz aktivnosti, i svaka dodaje nešto što kupac plaća. Za softverski proizvod lanac izgleda ovako:
Uz to idu aktivnosti podrške: ljudi (zapošljavanje, učenje), alati i infrastruktura, upravljanje.

Važan uvid: kupac DeliveryApp ne plaća kod, nego vrijednost: narudžbu koja stigne tačno, tačan obračun, manje izgubljenih poziva u restoranu. Kod je trošak; vrijednost je ono što proizvod donosi. Zato tim pita „koja funkcija donosi najviše vrijednosti za najmanje troška?”, a to je isto pitanje koje vlasnica proizvoda postavlja kad slaže backlog (poglavlje 2).
Troškovi softverskog proizvoda dijele se na:
| Vrsta | Primjeri u DeliveryApp 2.0 |
|---|---|
| razvoj | plate tima (36.000 €), dizajn, licence alata |
| infrastruktura | oblak, baza, red poruka, SMS (po poruci) |
| isporuka i uvođenje | obuka restorana, marketing u novom gradu |
| održavanje | ispravke, nadogradnje komponenti, sigurnosne zakrpe |
| podrška | odgovori na pozive restorana i kupaca |
| skriveni troškovi | tehnički dug (poglavlje 4), zastoji, incidenti |
Koristi mogu biti:
Održavanje je najveći trošak. Prema većini istraživanja, više od polovine ukupnog troška softvera koji se koristi godinama odlazi na održavanje i razvoj poslije prve isporuke. Zato poglavlja o čistom kodu, testovima i arhitekturi nisu „lijepo pisanje”, nego ekonomija: ona smanjuju najveću stavku troška.
„Najjeftinije je ono što se najbrže napravi.” Brzo napravljen proizvod s mnogo tehničkog duga je jeftin samo do prve isporuke. Svaka sljedeća izmjena je skuplja (slika 4.3), a izmjena ima mnogo više od prve isporuke.
Prije nego što se išta razvija, pita se: mora li to biti naše? Postoje tri puta:
| Put | Kada ima smisla | Rizik |
|---|---|---|
| razviti sami | funkcija je srce proizvoda i razlikuje nas od konkurencije | trošak, vrijeme, održavanje zauvijek |
| kupiti gotovo (proizvod, usluga, komponenta) | funkcija je ista kod svih (plaćanje, SMS, računovodstvo) | zavisnost od dobavljača, cijena licence, manje kontrole |
| razviti u saradnji | više firmi ima isti problem; otvoreni kod | dogovaranje, licence, sporije odluke |
Pravilo palca: razvijaj ono što te razlikuje, kupuj ono što je isto kod svih. DeliveryApp ne razvija vlastiti sistem plaćanja karticama (to je isto kod svih, i strogo regulisano), ali razvija obračun dostave po gradovima i praćenje uživo (to ga razlikuje).
Razvoj u saradnji danas najčešće znači otvoreni kod: Python, .NET, FastAPI, PostgreSQL, Linux, Kubernetes razvijaju hiljade ljudi iz stotina firmi zajedno. Firme koriste otvoreni kod jer je besplatan za upotrebu, ali i doprinose mu, jer je jeftinije zajedno održavati zajedničku osnovu nego svako svoju. Uslovi su provjera licence i rizici iz poglavlja 8 (left-pad, ranjivosti).
Odluka za DeliveryApp 2.0. Na tržištu postoji gotova platforma za dostavu koja se može prilagoditi („white label”): uvođenje 5.000 €, licenca 1.500 € mjesečno. Lana mora odlučiti: razvijati DeliveryApp 2.0 dalje ili preći na gotovu platformu? Odgovor daje ukupna cijena vlasništva.
Ukupna cijena vlasništva (TCO) je sve što softver košta kroz cijeli život, a ne samo cijena kupovine ili razvoja. Analogija je automobil: jeftin auto koji troši mnogo goriva i često je u servisu može za pet godina koštati više od skupljeg, a štedljivog.
TCO za DeliveryApp 2.0, za četiri godine (primjeri/python/ekonomika.py):
| Stavka | Razviti sami | Kupiti platformu |
|---|---|---|
| početno | ulaganje u 2.0: 40.000 € | uvođenje: 5.000 € |
| godišnje | održavanje 20 % troška razvoja: 7.200 €; hosting: 1.200 € | licenca 12 × 1.500 € = 18.000 € |
| 4 godine | 40.000 + 4 × (7.200 + 1.200) = 73.600 € | 5.000 + 48 × 1.500 = 77.000 € |

Razlika od 3.400 € nije velika, i zato odluka ne može biti samo o brojevima. U korist razvoja: DeliveryApp ostaje svoj, s pravilima po gradu koja gotova platforma možda ne podržava, i s mogućnošću proizvodne linije (DeliveryApp Apoteka, poglavlje 9). U korist kupovine: manji rizik, brže uvođenje, tim se može baviti drugim stvarima. Lana bira razvoj, ali zapisuje odluku u ADR (poglavlje 7), s uslovom: ako za dvije godine broj gradova ne pređe pet, odluka se preispituje.
Kad bi licenca platforme bila 1.200 € mjesečno, koliko bi bio TCO kupovine za 4 godine? Da li bi se odluka promijenila? (Odgovor: 5.000 + 48 × 1.200 = 62.600 €, što je 11.000 € manje od razvoja; odluka bi tražila jače razloge za razvoj.)
Odgovori: tipka R ili klik na zamućeno polje.
Da bi se procijenilo koliko će nešto koštati, treba znati koliko je veliko i koliko je složeno. Tri mjere se najčešće koriste.
Linije koda (LOC). Najjednostavnija mjera: koliko linija ima program. Stara funkcija obracun iz poglavlja 4 ima 46 linija, a refaktorisani obračun 23 linije. Ograničenja: različiti jezici trebaju različit broj linija za isti posao; bolji programer često napiše manje linija; i LOC se zna tek kad je kod napisan, a procjena treba prije.
Ciklomatska složenost (Thomas McCabe, 1976) broji nezavisne putanje kroz funkciju: svaki if, petlja ili logičko „ili” dodaje jednu. Za praksu je važno pravilo: što je broj veći, to je funkcija teža za razumijevanje i treba više testova. Iznad 10 se smatra rizičnim. Izmjereno alatom radon: stara funkcija obracun ima 16, a nove funkcije najviše 5. U slučaju Toyote (poglavlje 4) vještak je naveo desetine funkcija sa složenosti daleko iznad toga.
Funkcijske tačke (Allan Albrecht, IBM, 1979) mjere veličinu prema onome što softver radi za korisnika, nezavisno od jezika. Prebrojavaju se pet vrsta elemenata i množe težinom (ovdje prosječne težine po metodi IFPUG):
| Element | Šta je | U DeliveryApp 2.0 | Broj | Težina | Tačke |
|---|---|---|---|---|---|
| ulazi (EI) | korisnik unosi podatke | narudžba, otkazivanje, prijava, novi restoran, novo jelo, tarifa | 6 | 4 | 24 |
| izlazi (EO) | izvještaj ili izračunat rezultat | račun, izvještaj prometa, obračun dostave, potvrda | 4 | 5 | 20 |
| upiti (EQ) | jednostavno čitanje | jelovnik, stanje narudžbe, moje narudžbe, lista restorana, lista gradova | 5 | 4 | 20 |
| interni fajlovi (ILF) | grupe podataka koje sistem čuva | narudžbe, kupci, restorani i jela, tarife, dostavljači | 5 | 10 | 50 |
| vanjski interfejsi (EIF) | podaci drugih sistema | servis mapa, sistem plaćanja | 2 | 7 | 14 |
| ukupno | 128 |
Funkcijske tačke se mogu prebrojati iz zahtjeva, prije koda, i zato su korisne za procjenu.

Barry Boehm je 1981. objavio model COCOMO (Constructive Cost Model), napravljen na podacima iz šezdesetak stvarnih projekata. Najjednostavnija verzija, osnovni COCOMO za „organski” projekat (mali tim, poznat problem), ima dvije formule:
gdje je E napor u čovjek-mjesecima, T trajanje u mjesecima, a KLOC hiljade linija koda.
Za DeliveryApp 2.0: iz 128 funkcijskih tačaka, uz pretpostavku od oko 50 linija Pythona ili C# po tački, dobija se 128 × 50 = 6.400 linija, dakle 6,4 KLOC. Tada je
Uporedimo s planom iz poglavlja 2: šest ljudi tri mjeseca, to je 18 čovjek-mjeseci. Napor se poklapa (16,9 i 18), ali COCOMO predlaže manji tim duže (2–3 osobe oko 7 mjeseci). Šest ljudi za tri mjeseca je moguće samo ako se posao zaista može podijeliti bez mnogo komunikacije, a Brooksov zakon (poglavlje 2) upozorava da to nije uvijek tako. Tim zato prati brzinu u prvim sprintovima i spreman je da plan izdanja produži.
COCOMO II (2000) je novija verzija s više faktora (iskustvo tima, alati, zahtjevi za pouzdanošću…). Ali nijedan model nije tačan sam po sebi; on daje polaznu tačku za razgovor.
Konus nesigurnosti. Što je projekat ranije, to je procjena nesigurnija. Boehm, a kasnije McConnell, opisali su konus nesigurnosti: na samom početku stvarni trošak može biti i četiri puta manji ili veći od procjene; kad su zahtjevi jasni, raspon se suzi na otprilike ±50 %; tek pred kraj procjena postaje tačna. Zato se procjena daje kao raspon („između 14 i 22 čovjek-mjeseca”), a ne kao jedan broj, i ponavlja se kako projekat odmiče.

U praksi se kombinuje više metoda: COCOMO ili funkcijske tačke odozgo, procjena tima (planning poker, poglavlje 2) odozdo, i analogija s prethodnim projektima („DeliveryApp 1.0 je trajao…”). Ako se metode slažu, procjena je vjerovatno razumna; ako se mnogo razlikuju, treba razgovarati zašto.
Udruženje ulaže 40.000 € u DeliveryApp 2.0 danas, a očekuje neto priliv (prihod od pretplata i provizija, umanjen za troškove rada) u naredne četiri godine: 12.000, 16.000, 18.000 i 18.000 €. Zbir priliva je 64.000 €, više od ulaganja. Da li to znači da se isplati?
Ne nužno, jer euro danas vrijedi više od eura za tri godine. Novac danas može se uložiti u banku i donositi kamatu; uz to, budući priliv je nesiguran. Zato se budući novac diskontuje: umanjuje se za diskontnu stopu (npr. 10 % godišnje). Priliv od 12.000 € za godinu dana danas vrijedi 12.000 / 1,1 ≈ 10.909 €.
Neto sadašnja vrijednost (NPV) je zbir svih diskontovanih priliva minus ulaganje:
gdje je I ulaganje, P~t~ priliv u godini t, a r diskontna stopa.
| Godina | Priliv | Djelilac (1,1^t) | Današnja vrijednost |
|---|---|---|---|
| 0 | −40.000 € | 1 | −40.000 € |
| 1 | 12.000 € | 1,100 | 10.909 € |
| 2 | 16.000 € | 1,210 | 13.223 € |
| 3 | 18.000 € | 1,331 | 13.524 € |
| 4 | 18.000 € | 1,464 | 12.294 € |
| NPV | 9.950 € |

Pravilo odluke: NPV > 0 znači da se ulaganje isplati uz izabranu stopu, jer donosi više nego alternativa (npr. banka). NPV od 9.950 € znači da je DeliveryApp 2.0, uz stopu od 10 %, bolji od alternative za skoro deset hiljada eura u današnjem novcu.
Osjetljivost. Stopa izražava i rizik: što je ulaganje rizičnije, to je stopa veća. Uz stopu od 25 %, NPV istih priliva je −3.571 €, pa se ulaganje više ne isplati. Zato se NPV uvijek računa za nekoliko stopa i nekoliko scenarija priliva (optimistični, očekivani, pesimistični).
Period povrata odgovara na pitanje koje svaki investitor prvo postavi: za koliko se vraća uloženo? Saberu se prilivi godinu po godinu dok zbir ne dostigne ulaganje:
| Godina | Priliv | Kumulativno |
|---|---|---|
| 1 | 12.000 € | 12.000 € |
| 2 | 16.000 € | 28.000 € |
| 3 | 18.000 € | 46.000 € ← prešli 40.000 € |
Nakon dvije godine vraćeno je 28.000 €; nedostaje još 12.000 €, a treća godina donosi 18.000 €. Dio treće godine je 12.000 / 18.000 ≈ 0,67, pa je period povrata 2,67 godina, oko dvije godine i osam mjeseci.

Period povrata je jednostavan i razumljiv, ali ima dvije mane: ne gleda vrijednost novca u vremenu (to radi NPV), i ne gleda šta se dešava poslije povrata. Projekat koji se vrati za dvije godine i onda ništa ne donosi izgleda bolje od projekta koji se vrati za tri, a onda donosi deset godina. Zato se koriste obje mjere zajedno.
Odluka o DeliveryApp 2.0. Lana iznosi udruženju:
Udruženje prihvata. Priča o NHS-u iz početka poglavlja nije nastala zato što niko nije računao, nego zato što su se računi pravili jednom, za sve odjednom, i nisu se preispitivali dok se projekat mijenjao. DeliveryApp radi suprotno: mali koraci, brojevi u svakom koraku, i jasan trenutak kad se odluka ponovo gleda.
Odgovori: tipka R ili klik na zamućeno polje.
Cilj je izračunati NPV, period povrata i TCO za DeliveryApp 2.0 i ispitati osjetljivost odluke. Trajanje: jedan čas.
Pokrenite primjeri/python/ekonomika.py. Program ispisuje broj kanala komunikacije, brzinu tima, funkcijske tačke i COCOMO, NPV za 10 % i 25 %, period povrata i TCO. Provjerite da se brojevi slažu s ovim poglavljem.
python primjeri/python/ekonomika.pyNapravite tabelu s kolonama Godina, Priliv, Diskontovano, Kumulativno. U ćeliju za diskontovani priliv upišite formulu =B3/(1+$F$1)^A3, gdje je u F1 stopa (10 %). NPV izračunajte kao zbir diskontovanih priliva minus ulaganje, a provjerite i ugrađenom funkcijom =NPV(F1; B3:B6) + B2 (u Excelu na engleskom zarez umjesto tačke-zareza; B2 je −40.000).
Napravite tri scenarija priliva:
Za svaki izračunajte NPV uz 10 % i 25 % i period povrata. Koji scenarij i koja stopa mijenjaju odluku?
U docs/ekonomika.md napišite preporuku udruženju u pet tačaka, po uzoru na odjeljak 10.8, s vašim brojevima.
Rezultat: tabela s tri scenarija i dvije stope, i preporuka u pet tačaka.
Rješenja su sakrivena – tipka R ili klik na okvir.
Opcija A: razvoj 30.000 €, održavanje 6.000 € godišnje. Opcija B: licenca 900 € mjesečno, bez početnog troška. Koja je jeftinija za 3 godine, a koja za 5?
3 godine: A = 30.000 + 3 × 6.000 = 48.000 €; B = 36 × 900 = 32.400 €; B je jeftinija. 5 godina: A = 30.000 + 5 × 6.000 = 60.000 €; B = 60 × 900 = 54.000 €; B je i dalje jeftinija. Opcija A se isplati tek ako donosi koristi koje B nema.
Mala aplikacija ima 3 ulaza, 2 izlaza, 3 upita, 2 interna fajla i 1 vanjski interfejs. Uz prosječne težine i 50 linija po tački, koliko je funkcijskih tačaka i KLOC, i koliki su napor i trajanje po osnovnom COCOMO-u? (Stepene izračunajte kalkulatorom ili u Pythonu.)
FP = 3 × 4 + 2 × 5 + 3 × 4 + 2 × 10 + 1 × 7 = 12 + 10 + 12 + 20 + 7 = 61. KLOC = 61 × 50 / 1000 = 3,05. Napor E = 2,4 × 3,05^1,05 ≈ 7,7 čovjek-mjeseci; trajanje T = 2,5 × 7,7^0,38 ≈ 5,4 mjeseca; prosječno oko 1,4 osobe. (Provjera u Pythonu: 2.4 * 3.05 ** 1.05.)
Ulaganje 20.000 €, prilivi 8.000 € u svakoj od tri godine, stopa 10 %. Izračunajte NPV i period povrata.
Diskontovano: 8.000 / 1,1 ≈ 7.273; 8.000 / 1,21 ≈ 6.612; 8.000 / 1,331 ≈ 6.011; zbir ≈ 19.895 €. NPV ≈ 19.895 − 20.000 = −105 €, dakle (tijesno) ne isplati se uz 10 %. Period povrata: nakon dvije godine 16.000 €, nedostaje 4.000 od 8.000, pa 2,5 godina. Primjer pokazuje da kratak povrat ne znači i pozitivnu NPV.
Opština nudi DeliveryApp 10.000 € podsticaja ako u Gradu C uvede termo-torbe (poglavlje 9), čiji razvoj i uređaji koštaju 18.000 €. Očekuje se dodatni neto priliv od 4.000 € godišnje u naredne 3 godine. Izračunajte NPV uz 10 % i dajte preporuku.
Neto ulaganje = 18.000 − 10.000 = 8.000 €. Diskontovani prilivi: 3.636 + 3.306 + 3.005 ≈ 9.947 €. NPV ≈ 9.947 − 8.000 = 1.947 € > 0, pa se uz podsticaj isplati. Bez podsticaja (ulaganje 18.000 €) NPV bi bio ≈ −8.053 €. Preporuka: prihvatiti, uz provjeru da je priliv od 4.000 € realan (npr. pilot s 20 torbi).