Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Softversko inženjerstvo, ne kompjuterska nauka




  "Naučnik gradi kako bi učio; inženjer uči kako bi gradio."
    - Fred Bruks


Pri intervjuisanju kandidata za programske poslove, jedno od mojih omiljenih pitanja za intervju je "Kako biste opisali svoj pristup razvoju softvera?" Dajem im primere kao što su stolar, vatrogasac, arhitekta, umetnik, pisac, istraživač, naučnik , i arheolog, i tražim im da dođu do svojih odgovora. Neki kandidati pokušavaju da iz drugog puta pogode šta želim da čujem, obično mi kažu da vide sebe kao “naučnike”. Hot-shot šifranti mi kažu da vide sebe kao komandose ili kao članove SWAT-tima. Moj omiljeni odgovor je odgovor jednog kandidata koji je rekao: "Tokom projektovanja softvera, ja sam arhitekta. Kada dizajniram korisnički interfejs, ja sam umetnik. Tokom izgradnje, ja sam zanatlija. I tokom testiranja jedinice, ja sam jedan zli kučkin sin! "

Volim da postavim ovo pitanje zato što dobija na fundamentalnom značaju u našoj oblasti: Koji je najbolji način da se razmišlja o razvoju softvera? Da li je to nauka? Da li je to umetnost? Da li je zanatstvo? Da li je to nešto sasvim drugo?

"Je" protiv "Trebalo bi"


Mi imamo dugu tradiciju rasprave u oblasti softvera o tome da li je razvoj softvera umetnost ili nauka. Pre trideset godina, Donald Nuh je započeo pisanje serije od sedam tomova, The Art of Computer Programming ( Umetnost kompjuterskog programiranja). Prva tri toma koja imaju 2,200 stranica, sugerišu da svih sedam mogu iznositi više od 5,000 stranica. Ako umetnost programiranja tako izgleda, nisam siguran da ikada želim da vidim nauku!

Ljudi koji se zalažu da je programiranje sve od umetnosti pa do estetskih aspekata razvoja softvera i koji tvrde da nauka ne dozvoljavaja takve inspiracije i kreativne slobode. Ljudi koji se zalažu da je programiranje naučna oblast mnogih programskih grešaka i tvrde da je takva niska pouzdanost nedopustiva-kreativna sloboda je prokleta. Oba ova stava su nepotpuna i oba postavljaju pogrešno pitanje. Razvoj softvera je umetnost. To je nauka. To je zanat, arheologija, gašenje požara, sociologija, i niz drugih aktivnosti. On je amaterski u nekim krugovima, profesionalan u drugim. On predstavlja različite stvari kao što postoje različiti programeri. Ali pravo pitanje nije "Šta je trenutno razvoj softvera?", već "Šta bi trebalo da bude profesionalni razvoj softvera" Po mom mišljenju,odgovor na to pitanje je jasan: Profesionalni razvoj softvera bi trebalo da bude inženjering. Da li je? Nije. Ali da li bi trebalo da bude? Nesumnjivo, da bi trebalo..

Inženjering protiv nauke


Pošto samo oko 40 odsto programera softvera ima diplomu iz kompjuterske nauke i praktično niko nema diplomu iz softverskog inženjerstva, ne bi trebalo da budemo iznenađeni ako pronađemo ljude koji su zbunjeni razlikom između softverskog inženjerstva i kompjuterske nauke. Razlika između nauke i inženjeringa u softveru je ista kao i razlika u drugim oblastima [1]. Naučnici uče šta je istina, kako se testiraju hipoteze, i kako da prošire znanja u svojoj oblasti. Inženjeri uče šta je istina, šta je korisno, i kako da primenjuju dobro shvaćeno znanje u rešavanju praktičnih problema. Naučnici moraju biti u toku sa najnovijim istraživanjima, Inženjeri moraju biti upoznati sa saznanjima za koja je već dokazano da su pouzdana i efikasna. Ako se bavite naukom, možete sebi priuštiti da budete usko i specijalizovano stručni. Ako se bavite inženjeringom, morate imati široko razumevanje svih faktora koji utiču na proizvod koji projektujete. Naučnici ne treba da budu regulisani jer su uglavnom odgovorni drugim naučnicima. Inženjeri moraju da budu regulisani, jer su uglavnom odgovorni javnosti. Redovno naučno obrazovanje priprema studente da nastave svoje studije. Redovno inženjering obrazovanje priprema studente da uđu u radnu snagu odmah posle završetka studija.

Univerziteti nagrađuju stepene kompjuterske nauke, i oni normalno očekuju da njihovi studenti kompjuterske nauke dobiju posao za razvoj softvera gde će odmah početi rešavanje realnih problema. Samo mali deo studenata informatike koji su na osnovnim studijama, ide na postdiplomske studije ili istražuje situacije u kojima se razvija svest o kompjuterskom i softverskom znanju.

Ovaj stavlja studente kompjuterske nauke u tehnološki “ničiju zemlju”. Oni se nazivaju naučnicima, ali obavljaju poslove koje tradicionalno obavljaju inženjeri, bez obuke za inženjere. Efekat je otprilike isti kao što bi bio kada biste dodelili doktorat iz fizike za projektovanje elektro opreme za komercijalnu prodaju. Fizičar možda može bolje da razume električne principe od inženjera sa kojim radi. Ali, njegovo iskustvo u pravljenju opreme je u stvaranju prototipova koji se koriste za unapređenje stanja znanja u laboratoriji. On nema iskustva ni obuke u projektovanju izdržljive, ekonomične opreme koja pruža praktična rešenja u stvarnom svetu. Očekivali bismo da će oprema projektovana od strane doktora nauka fizike da radi, ali možda uz neki nedostatak koji bi se upotrebio ili obezbedio izvan laboratorije. Ili oprema može da koristi materijale na način koji je prihvatljiv za jedan prototip ali veoma nepotrebne kada se jedinice proizvode od strane mnogih.

Situacije koje podsećaju na ovaj jednostavan fizički primer pojavljuju se bukvalno hiljadama puta godišnje u softveru. Kada radnici obrazovani kao kompjuterski naučnici počnu sa radom na proizvodnim sistemima, često projektuju i istvaraju softver koji je previše slab za upotrebu u proizvodnji, ili nije siguran. Oni se fokusiraju na malu oblast i posebno na male razloge za isključenje drugih faktora koji su važniji. Oni mogu da provedu dva dana na ručnom podešavanju algoritama za sortiranje umesto dva sata u biblioteci ili kopirajući odgovarajući algoritam iz knjige. Tipičnom postdiplomacu kompjuterske nauke je obično potrebno nekoliko godina obuke na poslu da bi sakupio dovoljno praktičnog znanja za izgradnju minimalno zadovoljavajućeg proizvodnog softvera bez nadzora. Bez odgovarajućeg formalnog obrazovanja, neki programeri rade tokom čitave karijere, bez sticanja ovih znanja.

Nedostatak profesionalnog razvoja nije samo neuspeh softverskih programera. Softverski svet je postao žrtva sopstvenog uspeha. Posao na softverskom tržištu se razvija brže nego što obrazovna infrastruktura može da ga podrži, pa i više od polovine ljudi koji se bave razvojem softvera su se obrazovali za druge predmete. Poslodavci ne mogu da zahtevaju od ovih prekvalifikovanih osoba da dobiju ekvivalent diplome osnovnih studija inženjeringa u svojim slobodnim satima. Čak i ako bi mogli, većina dostupnih kurseva je iz oblasti kompjuterske nauke, a ne softverskog inženjeringa. Obrazovna infrastruktura je pala ispod industrijskih potreba.

Iza aktuelne reči


Neki ljudi misle da je "softverski inženjering" samo aktuelna reč koja označava isto što i "kompjutersko programiranje." Doduše, "softverski inženjering" je pogrešno upotrebljen. Ali termin može biti zloupotrebljen ali i dalje imati legitimno značenje.

Definicija u rečniku za "inženjering" je primena naučnih i matematičkih principa ka praktičnom cilju. To je ono što većina programera pokušava da uradi. Mi primenjujemo naučno razvijene i matematički definisane algoritme, funkcionalno dizajnirane metode, metode osiguravanja kvaliteta, kao i druge postupke za razvoj softverskih proizvoda i usluga. Kao što i Dejvid Parnas ističe, u drugim tehničkim oblastima inženjerske profesije su stvorene i dato im je pravno značenje, tako da kupci mogu znati ko je kvalifikovan da izgradi tehničke proizvode [2]. Kupci softvera zaslužuju isto to.

Neki ljudi misle da tretiranje razvitka softvera kao inženjerstvo znači da ćemo svi morati da koristimo formalne metode-pisanje programa poput matematičkih formula. Zdrav razum i iskustvo nam govori da to uništava mnoge projekte. Drugi prigovaraju da komercijalni softver previše zavisi od promenljivih tržišnih uslova da bi odobrio pažljivi, dugotrajni inženjering.

Ove primedbe su zasnovane na uskoj i pogrešnoj ideji. Inženjerstvo je primena naučnih principa ka praktičnim ciljevima. Ako inženjering nije praktičan, onda je to loš inženjering. Pokušaji da se primene formalne metode za sve softverske projekte su isto toliko loša ideja koliko i pokušaji da se uvede stalni kodirani razvoj na svim projektima.

Posmatranje softvera kao inženjerstvo čini jasnijim ideju da različiti razvojni ciljevi odgovaraju različitim projektima. Kada je zgrada projektovana, građevinski materijal mora odgovarati nameni te zgrade. Mogu da izgradim veliko skladište za opremu gde bih smeštao poljoprivredna vozila od tankog neizolovanog lima. Ne bih izgradio kuću na isti način. Ali, iako je kuća tvrđa i toplija, ne bismo se odnosili prema šupi kao manje vrednoj u odnosu na kuću na bilo koji način. Šupa je prikladno dizajnirana za namenjenu svrhu. Ako je ona podignuta na isti način kao kuća, čak bismo mogli i da kritikujemo da je "previše-projektovana"- rekli bismo da su dizajneri rasipali sredstava u izgradnji i da zapravo nije dobro projektovana.

U softveru, dobro pokrenutim projekatom se može upravljati tako da ispunjava neki od sledećih ciljeva:
  • Najmanji nedostaci

  • Maksimalno zadovoljstvo korisnika

  • Minimalno vreme odziva

  • Dobra pogodnost održavanja

  • Dobra proširivost

  • Visoka robusnost

  • Visoka korektnost
Svaki softverski projektnii tim bi trebalo da definiše relativnu važnost svake karakteristike eksplicitno,a zatim bi projektni tim trebalo da sprovede projekat na način na koji se postižu ciljevi.

Softverskih projekti su drugačiji od inženjerskih projekata koji koriste fizičke materijale. U drugim vrstama inženjerstva, troškovi materijala mogu da doprinesu 50 ili više procenata od ukupnih troškova projekta. Neke kompanije inženjeringa izveštavaju da one automatski smatraju projekte rada sa više od 50 odsto troškova kao projekte visokog rizika [3]. Na tipičnom softverskom projektu, troškovi radne snage mogu da doprinesu skoro 100 odsto od ukupnih troškova projekta. Najviše inženjerskih projekata se fokusira na optimizaciji ciljeva proizvoda; troškovi dizajna su relativno beznačajni. Zbog cene rada koja čini tako veliki deo ukupnih troškova softvera, softverski projekti bi trebalo da se više fokusiraju na optimizaciju ciljeva projekta nego što to čine druge vrste inženjeringa. Dakle, pored rada na ciljevima proizvoda, softverski tim bi takođe mogao da postigne neki od sledećih ciljeva projekta:
  • Kratak raspored

  • Poznati datum isporuke

  • Niska cena

  • Mala veličina tima

  • Fleksibilnost da se napravi srednji projekat funkcija-set izmene
Svaki softverski projekat mora da uspostavi ravnotežu između različitih ciljeva projekta i proizvoda . Mi ne želimo da platimo $ 5,000 za obradu teksta, niti želimo neki koji se kvari na svakih 15 minuta.

Koji od ovih specifičnih proizvoda i karakteristika projekta projektni tim naglašava ne određuje da li je projekat pravi "softver inženjeringa" . Neki projekti treba da proizvedu softver sa minimalnim nedostacima i skoro savršenom tačnošću-softver za medicinsku opremu, avionike, anti-lock kočnice i tako dalje. Većina ljudi bi se složila da su ovi projekti odgovarajući domen za punopravni softverski inženjering. Ostali projekti treba da isporuče svoj softver sa određenom sigurnošću, ali i sa niskim troškovima i kratkim rokovima. Da li ovo zaista domen softverskog inženjerstva? Jedna neformalna definicija inženjeringa "radi za novčić ono što bilo ko može da uradi za jedan dolar." Mnogi softverski projekti danas rade za dolar ono što bi bilo koji dobar softverski inženjer mogao da uradi za novčić. Ekonomski razvoj je takođe u domenu softverskog inženjerstva.

Današnje oslanjanje na fiksirani kodni razvoj - i troškovi i raspored prekoračenja koji ide uz to-nije rezultat nekog softverskog inženjerskog izračunavanja, već premalo obrazovanja i obuke u softverskoj inženjerskoj praksi.

Prava pitanja


Razvoj softvera kao što se obično praktikuje danas ne izgleda mnogo kao inženjering, ali bi mogao. Kada prestanemo da postavljamo pogrešno pitanje: "Šta je razvoj softvera trenutno?" I počnemo sa postavljanjem pravih pitanja, "Da li bi profesionalni razvoj softvera trebalo da bude inženjering?" možemo početi sa odgovaranjem na stvarno zanimljiva pitanja. Šta je suština znanja softverskog inženjeringa? Šta je potrebno da se uradi pre nego što profesionalni programeri mogu da koriste to znanje? Kolika je otplata od obuke softverskog razvoja kao inženjerske discipline? Šta su odgovarajući standardi profesionalnog ponašanja za programere? Za softverske organizacije? Da li bi programeri trebalo da budu regulisani? Ako je tako, do koje granice? A, možda najinterensantnije pitanje od svih: Kako će softverska industrija izgledati posle svih odgovora na ova pitanja?




Published (Last edited): 24-07-2012 , source: http://www.stevemcconnell.com/psd/04-senotcs.htm