Danasnje softverske kuce koje drze do sebe vrse projektovanje sistema na nacin i koristeci strucnjake i alate koje su gore opisali silverglider i soulfly.
Medjutim, poenta je zasto se sve to bas tako radi.
Kada o ovome pricamo ne misli se na neke sicusne programcice od par stotina linija koda (mada zavisi od kompleksnosti), vec na projektovanje tzv.
"softverski intenzivnih sistema". Nekada, kada su programi bili linearni i OS bili monoprogramski, dosta su se koristili flowchart dijagrami, ali i oni samo za opis nekih zestokih rutina i na razlicitim nivoima hijerarhije. Danas su sistemi mnogo komplikovaniji bilo to obicni programi, OS ili softverski intenzvini sistemi: imas multiprogramske OS, programi su event-driven i daleko od linearnosti, multithread gde svaka nit ima svoj prioritet, programiranje sistema za rad u realnom vremenu... Opsti show danas moze da se konstriuse.
Fora je u 3 stvari: poimanje problema projektanta sa porastom slozenosti drasticno opada, potrebno je sto vise omoguciti ponovno koriscenje koda (reusable code) i potrebno je omoguciti sto je moguce lakse odrzavanje (to ti je ono: kada posle godinu dana pogledas kako nesto radi, da ti na osnovu modela i dijagrama odmah bude jasno sta si radio, da ne lupas glavu zasto je to bas tako i ako sada nema nikakve logike u tome

).
Na ove dve poslednje stvari mnooogo love odlazi. Zato je i uvedeno objektno (orijentisano) programiranje OOP i modelovanje.
Osnovni principi objektnog modelovanja su:
apstrakcija - apstrahovanje problema i
resavanje problema iz ugla korisnika, a ne programera ; hijerarhija - nasledjivanje i sta kome pripada; enkapsulacija - tajnost koda (zato postoji private i protected prava pristupa i header i cpp fajlovi) i modularnost - podela problema na fizicki razdvojene module. Sve ovo vodi do toga da se prvo do detalja projektuje neki softver, pa posle pisanje koda predstavlja samo puko fizikalisanje, mada ti u tome moze delimicno pomoci CASE alat, kao sto je recimo Rose firme Rational koji ima opciju generate code.
Npr. danasnji C++ kompajleri mnogo bolje mogu da optimizuju kod po pitanju brzine i velicine nego sto bi to uradila gomila programera. Zato se ne ide na neko posebno optimizovanje koda (da li program ima 2.2MB ili 2.195MB - nebitno!) vec se naglasak baca na
citljivost. Hakerisanje po kodu (kao pisanje rutina u asembleru pod DOS-om da bi program bio sto brzi, manji i nerazumljiviji) nije pozeljno. Potrebno je pisati CITLJIVE programe, jer kada ti posle 6 meseci dodje sef i kaze da treba da se napravi verzija 2.0 programa na kojem ste radili 5 meseci i ako tebi treba 2 meseca da ti samo provalis tvoj prethodno napisani kod (a sveki sat se placa!) - letis s posla.
Zbog svega ovoga, prvo se ispituje sta i kako program treba da radi (mozda se i trziste ispituje radi isplativosti pokretanja projekta). Potom se uradi detaljna specifikacija sta, gde i kako treba da izgleda i da radi. Onda razni Software Architect, Designer, Developeri i ostala ekipa se odluce i dogovore o vrsti arhitekture, protokolima, i svemu relevantnom u vezi paketa i kada se odluce (eventualno mozda urade simulaciju preliminarnog projekta - sve zavisi od slozenosti i sistema, mozda je potreban i neki specifican hardware koristiti) onda se sistem deli na podsisteme. Specificira se svaki podsistem i strogo i tacno se definisu veze sa ostalim podsistemima. Takodje se na nivou sistema i podsistema sa odredjenim stepenom detaljnosti opisuju staticke karakteristike (dijagram klasa, paketa,...), kao i dinamicke karakteristike (dijagrami interakcija, kolaboracija,...) - sve ovo se obicno radi u nekom programskom paketu specijalizovanm za to, npr. Rational Rose-u koji koristi UML (imas i super knjigu o UML-u koji je danas neka vrsta standarda). Ovaj opis sistema obicno radi covek zaduzen za to ili ceo tim i oni su ti koji modeluju sistem na osnovu nekih specifikacija. Recimo, neki softverski paket koji sadrzi u sebi 450 klasa - bez CASE alata je nemoguce pohvatati sve veze i zavisnosti, jos ako imamo i aktivne objekte (threads)... Na kraju, na osnovu dobro definisanog sistema u UML-u, vrsi se pisanje koda koje predstavlja vise manje rutinu, sem mozda nekih vremenski ili hardverski kriticnih delova kojima se poklanja posebna paznja, ali oni obicno i cine samu srz sistema.
Na kraju se obicno za svaki deo sistema i koda pise dokumentacija koja opisuje sta i kako radi, prilaze se source sa svim header i eventualno .cpp fajlovima kao i modeli na svim nivoima u UML-u (ima i drugih, ali ovaj jezik je danas neka vrsta standarda) - i sve to bi vise manje cinilo dokumentaciju nekog dobro projektovanog i opisanog sistema.
Uhhh, ceo esej! Malo sam udavio, ali generalno sa nekim manjim ili vecim razlikama to otprilike (bar bi tako trebalo) ide.
Tako da, nauci ti za pocetak flow-charts, a onda ces vec videti sta te ceka ako odes u iole ozbiljniju firmu jer projektovanje bez ovih alata je muka teeeska (znam iz iskustva).
