Appendix A — Dodaci

Dodatak A – Rječnik

Pojam Značenje Poglavlje
ADR kratak zapis arhitekturalne odluke: kontekst, odluka, posljedice, alternative 7
AOP aspektno orijentirano programiranje: presjecajuće brige na jednom mjestu 9
Backlog lista svega što treba napraviti, poredana po važnosti 2
Bod priče relativna mjera veličine posla 2
Brooksov zakon dodavanje ljudi zakašnjelom projektu čini ga još zakašnjelijim 2
Brzina tima bodovi završeni u jednom sprintu 2
C4 model dijagrami u četiri nivoa: kontekst, kontejneri, komponente, kod 7
CBSE razvoj softvera sklapanjem komponenata 8
Ciklomatska složenost broj nezavisnih putanja kroz funkciju 4, 10
CI / CD kontinuirana integracija / kontinuirana isporuka 5
CMMI model pet nivoa zrelosti procesa 2
COCOMO Boehmov model procjene napora i trajanja 10
Čista arhitektura pravila poslovanja u centru, zavisnosti samo prema unutra 7
Dostupnost procenat vremena u kojem sistem radi 6
DORA metrike učestalost isporuke, vrijeme izmjene, neuspjele izmjene, vrijeme oporavka 5
Funkcijske tačke mjera veličine prema onome što softver radi za korisnika 10
IaaS, PaaS, SaaS infrastruktura, platforma i softver kao usluga 9
IDE integrisano razvojno okruženje 1, 4
IoT / IoE internet stvari / internet svega 9
ISO/IEC 25010 standard karakteristika kvaliteta softverskog proizvoda 6
Kanarinac postepeno puštanje nove verzije dijelu korisnika 5
Kohezija koliko dijelovi komponente pripadaju zajedno 8
Kontejner paket programa sa svim zavisnostima 5
Miris koda znak u kodu koji upućuje na problem dizajna 4
MVC / MVVM obrasci koji odvajaju prikaz od logike 4
NFR nefunkcionalni zahtjev: kako sistem radi 6
NPV neto sadašnja vrijednost 10
ORM prevođenje objekata u redove tabela i obrnuto 4
p95 vrijednost ispod koje je 95 % mjerenja 6
Period povrata vrijeme za koje se ulaganje vrati 10
Povezanost koliko komponenta zavisi od drugih 8
Prekidač kola zaštita koja privremeno prestaje zvati servis koji ne radi 6
Prekidač funkcije uključivanje i isključivanje funkcije podešavanjem 5
Proizvodna linija porodica proizvoda sa zajedničkim jezgrom i planiranom varijabilnošću 9
Pull request zahtjev za spajanje izmjena uz pregled 5
Reaktivno programiranje rad s tokovima događaja na koje kod reaguje 9
Refaktoring promjena strukture koda bez promjene ponašanja 4
Repozitorij (obrazac) objekat koji skriva bazu od logike 7
SBOM spisak svih komponenata proizvoda 8
Scenarij kvaliteta mjerljiv NFR: izvor, podsticaj, okruženje, artefakt, odgovor, mjera 6
SDD dokument specifikacije dizajna 3
Semantička verzija glavna.sporedna.zakrpa s tačnim značenjem 8
SOA arhitektura sklopljena od servisa 9
SOLID pet principa objektno orijentiranog dizajna 3
Tehnički dug budući trošak lošijeg, bržeg rješenja 4
TCO ukupna cijena vlasništva 10
Troslojna arhitektura prezentacija, poslovna logika, podaci 7
UX korisničko iskustvo 3
Višezakupnička usluga jedna instalacija za mnogo zakupaca s odvojenim podacima 9

Dodatak B – Podsjetnici

B.1 Mermaid i UML

```mermaid
classDiagram
    Narudzba "1" *-- "1..*" Stavka : sadrži
    Stavka "*" --> "1" Jelo : za
```
Dijagram Početak bloka Poglavlje
klasni classDiagram 3
sekvencijalni sequenceDiagram 3
stanja stateDiagram-v2 3 (PIS 7)
tok, C4, komponente flowchart TB ili flowchart LR 7, 8
Git grane gitGraph 5

Natpisi s razmacima, zagradama ili dvotačkom stavljaju se pod navodnike. Dijagram se uvijek provjeri iscrtavanjem (VS Code, GitHub ili mermaid.live).

B.2 Git u timu

Naredba Šta radi
git switch -c ime-grane nova grana i prelazak na nju
git status šta je promijenjeno
git add fajl priprema izmjene za commit
git commit -m "Dodaj tarifu za Grad B" zapis izmjene s porukom
git push -u origin ime-grane slanje grane na GitHub
git pull preuzimanje tuđih izmjena
git switch main povratak na glavnu granu
git log --oneline --graph istorija kao graf

Tok rada (GitHub flow): grana → commit → push → pull request → pregled i CI → spajanje → brisanje grane.

B.3 Python i C# rame uz rame

Ideja Python C#
objekat s podacima @dataclass(frozen=True) class Tarifa: ... record Tarifa(...)
svojstvo samo za čitanje @property def stanje(self): ... public string Stanje { get; private set; }
interfejs class ServisMapa(Protocol): ... interface IServisMapa { ... }
greška raise ValueError("…") throw new ArgumentException("…");
hvatanje greške try: … except ValueError as e: try { … } catch (ArgumentException e) { … }
zaokruživanje naviše math.ceil(x) Math.Ceiling(x)
rječnik {"A": t1, "B": t2} new Dictionary<string, Tarifa> { ["A"] = t1 }
lista s filtrom [x for x in xs if x > 0] xs.Where(x => x > 0).ToList()
test pytest: def test_...(): assert ... xUnit: [Fact] public void ...() { Assert.Equal(...); }
paket pyproject.toml, PyPI, pip install .csproj, NuGet, dotnet add package
pokretanje python fajl.py dotnet run Fajl.cs (.NET 10)

B.4 Formule iz knjige

Formula Značenje Primjer DeliveryApp
broj sprintova = backlog / brzina plan izdanja 126 / 21 = 6
k = n(n − 1)/2 kanali komunikacije 6 ljudi → 15
prioritet = V × U rizik RZ-1: 4 × 4 = 16
zastoj = (1 − dostupnost) × 720 h dozvoljeni zastoj u 30 dana 99,5 % → 3,6 h
E = 2,4 × KLOC^1,05; T = 2,5 × E^0,38 osnovni COCOMO 6,4 KLOC → 16,9 čm, 7,3 mj
NPV = −I + Σ Pt/(1 + r)^t neto sadašnja vrijednost 9.950 €
povrat = godine prije + nedostaje / priliv te godine period povrata 2 + 12/18 = 2,67

Dodatak C – Šabloni dokumenata

C.1 Vizija proizvoda

Za **(ciljna grupa)** koji **(potreba)**,
**(ime proizvoda)** je **(vrsta proizvoda)**
koji **(glavna korist)**.
Za razliku od **(alternativa)**, naš proizvod **(ključna razlika)**.

C.2 Registar rizika

| Oznaka | Rizik | V (1–5) | U (1–5) | V × U | Odgovor | Vlasnik | Pregled |
| --- | --- | --- | --- | --- | --- | --- | --- |
| RZ-1 | ... | | | | izbjeći / ublažiti / prenijeti / prihvatiti | | datum |

C.3 Dokument specifikacije dizajna (SDD)

# Dizajn: (naziv funkcije)
1. Svrha i obim (šta radi, šta ne radi)
2. Kontekst (ko koristi, na šta utiče)
3. Struktura (klasni dijagram)
4. Ponašanje (sekvencijalni dijagram, alternativni tokovi)
5. Sučelje (wireframe)
6. Podaci (nove tabele i polja)
7. Nefunkcionalni zahtjevi
8. Odluke i alternative
9. Otvorena pitanja

C.4 Scenarij kvaliteta

| Dio | Vrijednost |
| --- | --- |
| Izvor | |
| Podsticaj | |
| Okruženje | |
| Artefakt | |
| Odgovor | |
| Mjera | |

C.5 ADR

# ADR-00N: (naslov odluke)
Status: predloženo / prihvaćeno / zamijenjeno (ADR-…)
## Kontekst
## Odluka
## Posljedice (+ i −)
## Razmatrane alternative

C.6 Bilješke o izdanju (CHANGELOG)

## 2.1.0 – (datum)
### Dodano
- Tarifa za Grad D.
### Ispravljeno
- Poruka greške za adresu izvan zone.

Dodatak D – Ispitni zadaci s rješenjima

Zadatak 1 (poglavlja 1–2). Tim od 7 ljudi ima brzinu 20, 26, 24 i 22 boda; backlog ima 184 boda; sprint traje dvije sedmice. a) Koliko sprintova i sedmica treba? b) Koliko je kanala komunikacije? c) Šta biste rekli rukovodiocu koji predlaže da se tim u sredini projekta poveća na 12 ljudi?

Rješenje. a) Brzina (20 + 26 + 24 + 22) / 4 = 23; 184 / 23 = 8 sprintova = 16 sedmica. b) 7 × 6 / 2 = 21 kanal. c) Sa 12 ljudi kanala je 66, više od tri puta više; novi ljudi bi prvo učili, a stari ih podučavali (Brooksov zakon). Bolje je smanjiti obim, pomjeriti rok ili, ako se ljudi ipak dodaju, napraviti drugi tim sa svojim jasnim dijelom proizvoda.

Zadatak 2 (poglavlje 3). Za funkciju „Ocijeni dostavu” (kupac nakon isporuke daje 1–5 zvjezdica i komentar) nacrtajte dopunu konceptualnog modela i navedite koji princip SOLID kaže da obavještenje restoranu o lošoj ocjeni ne ide u klasu Ocjena.

Rješenje. Novi pojam Ocjena (zvjezdice 1–5, komentar, datum), veza Narudzba “1” – “0..1” Ocjena, i posredno Dostavljac “1” – “*” Ocjena preko narudžbe. Princip jedne odgovornosti: Ocjena čuva pravila ocjene (npr. zvjezdice samo 1–5), a slanje obavještenja je odgovornost servisa obavještenja.

Zadatak 3 (poglavlje 4). Navedite četiri mirisa koda u funkciji i prepišite je čisto:

def f(n, t):
    if t == 1:
        return n * 0.9
    if t == 2:
        return n * 0.8
    return n

Rješenje. Nejasno ime funkcije i parametara, magični brojevi (1, 2, 0.9, 0.8), grananje po tipu, decimalni broj za novac. Čisto: konstanta POPUSTI = {"STUDENT": 10, "VJERNI": 20} (procenti), funkcija iznos_s_popustom(iznos_centi, vrsta_kupca) koja vraća iznos_centi - round(iznos_centi * POPUSTI.get(vrsta_kupca, 0) / 100), i testovi za svaku vrstu kupca i nepoznatu vrstu.

Zadatak 4 (poglavlje 5). Opišite put izmjene „Dodaj tarifu za Grad D” od grane do svih korisnika, koristeći pojmove: grana, commit, pull request, pregled, CI, linter, test, kontejner, kanarinac, povratak.

Rješenje. Programer napravi granu tarifa-grad-d, doda tarifu i testove granica, napravi commit i push, otvori pull request. CI pokrene linter i testove; kolega pregleda kod i odobri. Nakon spajanja CI napravi sliku kontejnera s novom verzijom, koja ide na test okruženje, pa kao kanarinac na 5 % korisnika uz praćenje grešaka, pa svima. Ako greške porastu, radi se povratak na prethodnu sliku.

Zadatak 5 (poglavlje 6). Dostupnost je 99,8 % mjesečno (30 dana). a) Koliko je dozvoljeno zastoja? b) Prepišite „aplikacija mora biti brza i kad ima mnogo korisnika” kao scenarij kvaliteta. c) Predložite dvije taktike.

Rješenje. a) 0,002 × 720 h = 1,44 h ≈ 86 minuta. b) Izvor: kupci; podsticaj: 600 istovremenih korisnika pregleda jelovnike i naručuje; okruženje: normalan rad, 12–14 h; artefakt: DeliveryApp 2.0; odgovor: prikaz jelovnika i prijem narudžbe; mjera: p95 ≤ 2 s. c) Keš jelovnika i horizontalno skaliranje iza raspoređivača opterećenja (ili red poruka za obavještenja).

Zadatak 6 (poglavlje 7). Napišite ADR za odluku da se modul izvještaja za udruženje napiše u C# (ASP.NET Core), iako je ostatak DeliveryApp u Pythonu.

Rješenje (primjer). Kontekst: izvještaje će održavati partnerska firma koja radi u .NET-u; Dino i Emir bolje znaju C#; modul samo čita podatke. Odluka: poseban modul u ASP.NET Core, čita bazu preko repozitorija samo za čitanje, ne mijenja podatke. Posljedice: + partner ga lako održava, + jasna granica; − dva jezika u proizvodu, dva CI posla, dvije vrste testova. Alternative: izvještaji u Pythonu (odbijeno zbog održavanja kod partnera); gotov alat za izvještaje (odbijeno zbog licence i pravila po gradu).

Zadatak 7 (poglavlje 8). Komponenta deliveryapp-obavjestenja je u verziji 1.3.0. Odredite sljedeću verziju: a) dodan kanal „Viber”, stari rade; b) ispravljena greška zbog koje se SMS slao dva puta; c) funkcija posalji(telefon, tekst) zamijenjena sa posalji(poruka: Poruka). Za c) navedite šta moraju uraditi korisnici komponente.

Rješenje. a) 1.4.0; b) 1.3.1; c) 2.0.0 – korisnici moraju promijeniti sve pozive da prave objekat Poruka i ažurirati zavisnost na >=2,<3; poželjno je da 1.x još neko vrijeme dobija sigurnosne zakrpe.

Zadatak 8 (poglavlje 9). Objasnite kako bi „Praćenje dostavljača uživo” koristilo IoT i reaktivno programiranje, i navedite dva sigurnosna zahtjeva.

Rješenje. Uređaj (mobitel ili torba) šalje lokaciju svakih nekoliko sekundi kroz mrežu u oblak; u oblaku lokacije čine tok događaja na koji se pretplaćuje aplikacija kupca, uz filter (samo dostavljač te narudžbe) i map (lokacija → tačka na mapi). Sigurnost: lokacija je lični podatak, vidi je samo kupac čija je narudžba na putu i samo dok je na putu; uređaj nema fabričku lozinku, komunicira šifrovano i samo s oblakom DeliveryApp.

Zadatak 9 (poglavlje 10). Ulaganje 30.000 €, prilivi 10.000, 12.000, 14.000 i 14.000 €, stopa 10 %. Izračunajte NPV i period povrata i dajte preporuku.

Rješenje. Diskontovano: 9.091 + 9.917 + 10.518 + 9.562 = 39.088 €; NPV ≈ 9.088 € > 0, isplati se. Kumulativno: 10.000, 22.000, 36.000 – nakon dvije godine nedostaje 8.000 od 14.000, pa je povrat 2 + 8/14 ≈ 2,57 godina. Preporuka: prihvatiti, uz provjeru pesimističnog scenarija i kontrolnu tačku nakon prve godine.

Zadatak 10 (cijeli predmet). Tim od četiri studenta pravi mini-proizvod „Rezerviši termin” za frizerske salone. U deset tačaka opišite plan: od vizije do odluke o isplativosti, i za svaku tačku navedite poglavlje knjige.

Rješenje (primjer). 1) Vizija i zainteresovane strane (1). 2) Scrum, backlog, procjena bodovima, registar rizika (2). 3) Konceptualni model, sekvencijalni dijagram rezervacije, wireframe (3). 4) Kod po slojevima, čisti kod, Python ili C# (4). 5) Git grane, pull request, CI s testovima (5). 6) NFR: npr. potvrda rezervacije za ≤ 2 s, dostupnost 99,5 % (6). 7) Arhitektura: modularni monolit, ADR, C4 (7). 8) Komponenta „kalendar slobodnih termina” s verzijom (8). 9) SaaS za više salona (zakupci), podsjetnici kao reaktivni tok (9). 10) Funkcijske tačke, procjena napora, NPV i povrat uz pretpostavljene pretplate (10).

Dodatak E – Izvori priča i činjenica

Sve priče na početku poglavlja i okviri „Iz stvarnog svijeta” zasnovani su na javno dostupnim izvorima. Brojevi su provjereni u oktobru 2026; gdje se izvori razilaze, u tekstu stoji opreznija formulacija („oko”, „više od”).

Poglavlje Događaj Glavni izvori
1 NATO konferencija, Garmisch, 7–11. 10. 1968 P. Naur, B. Randell (ur.): Software Engineering: Report on a conference sponsored by the NATO Science Committee, 1969; B. Randell: „Fifty Years of Software Engineering”, 2018
1 Dieselgate, 2015 izvještaji američke agencije EPA i Ministarstva pravde, 2015–2017
2 Brooks i OS/360 F. P. Brooks: The Mythical Man-Month, 1975 (izdanje 1995)
2 Googleov projekat Aristotel, 2015 Google re:Work, „Guide: Understand team effectiveness”
3 Apple u Xerox PARC-u, decembar 1979 Computer History Museum; M. Hiltzik: Dealers of Lightning, 1999
4 Toyota, presuda Bookout, oktobar 2013 EDN, „Toyota’s killer firmware”, 2013; transkript svjedočenja M. Barra
5 CrowdStrike, 19. 7. 2024 CrowdStrike, preliminarni izvještaj nakon incidenta (PIR) i analiza uzroka, 2024; Microsoft blog, 20. 7. 2024; CISA
6 Pokémon GO, juli 2016 Google Cloud blog, L. Stone, 29. 9. 2016
6 Netflix Chaos Monkey, 2011 Netflix Tech Blog, „The Netflix Simian Army”, 2011
7 Prime Video, 2023 Prime Video Tech blog, mart 2023; devclass.com, 5. 5. 2023
8 McIlroy, 1968 M. D. McIlroy: „Mass Produced Software Components”, izvještaj NATO konferencije, str. 138–155
8 left-pad, 22. 3. 2016 npm blog, „kik, left-pad, and npm”, 2016; The Register, 23. 3. 2016
8 Ariane 5, let 501, 4. 6. 1996 izvještaj istražne komisije (J. L. Lions), 19. 7. 1996
8 Log4j, decembar 2021 CVE-2021-44228; CISA
9 Mirai i Dyn, 21. 10. 2016 Dyn, izjava od 26. 10. 2016; Flashpoint; KrebsOnSecurity
10 NHS NPfIT, 2002–2011 National Audit Office, 2013; House of Commons Public Accounts Committee, 2011 i 2013

Godine i autori pojmova (Royce 1970, Boehm 1981 i 1986, Tuckman 1965, Cunningham 1992, Reenskaug 1979, Kruchten 1995, Nygard 2011, Cockburn 2005, Gamma i dr. 1994, Szyperski 1998/2002, Kiczales i dr. 1997, McCabe 1976, Albrecht 1979, Porter 1985, Cohn 2009, Reaktivni manifest 2014, NIST 2011) navedeni su prema osnovnoj i dodatnoj literaturi predmeta.