[Curs nr.1]
Introducere
Tehnologia orientata pe obiecte si-a
demonstrat valoarea intr-o multitudine de aplicatii din cele mai diverse
domenii: electronica medicala, tranzactii de valori mobiliare, sisteme
de gestiune a informatiilor din intreprinderi, controlul traficului aerian,
productia de semiconductori, jocurile video interactive, retele de telecomunicatii,
cercetari in astronomie etc.
La ora actuala exista deja o bogata
experienta acumulata in cadrul proiectelor care au adoptat tehnologia orientata
pe obiecte - atat proiecte reusite, cat si proiecte esuate. In ambele cazuri,
experienta rezultata a constituit un ghid pretios pentru proiectele viitoare
si a condus la o concluzie foarte importanta, anume ca modelul obiectual
poate avea un impact benefic asupra dezvoltarii software, dar ca un proiect
necesita mult mai mult decat simpla "venerare" a acestei tehnologii.
Din perspectiva proiectantilor de software
lucrurile se vad cam in felul urmator: la ora actuala chiar si in spatele
celor mai obisnuite activitati dintr-o societate industrializata (telefonie,
tranzactii de actiuni, conducerea automobilelor, examinari medicale) se
afla programe sofisticate; software-ul s-a infiltrat tot mai adanc in societatea
umana, ceea ce creaza o cerere tot mai mare de specialisti.
Pe de alta parte, nu se poate
prevedea
cu certitudine ca software-ul va avea o evolutie constant crescatoare,
ca va deveni mereu mai complex.
Exista 2 FORTE care actioneaza asupra acestui
proces:
Cresterea gradului de conectare intre sisteme de calcul performante distribuite. Acest factor a fost favorizat de aparitia liniilor de transmisie cu spectru larg de frecvente.Sub influienta acestor 2 factori, in ziua de azi au ajuns sa ni se para firesti facilitati ca: achitarea direct din contul bancar personal a unui film prin cablu comandat, accesarea on-line de catre cercetatori a informatiilor din laboratoare aflate la distanta, vizualizarea de catre arhitecti a unor schite create de colaboratori aflati la distanta, jocurile interactive dotate cu imagini care aproape ca nu se deosebesc de realitate, posibilitatile de urmarire a vanzarilor de catre distribuitorii de produse, astfel incat sectorul de aprovizionare sa reactioneze prompt in functie de preferintele clientilor, respectiv sectorul de marketing sa poata formula noi oferte indreptate spre grupuri tot mai specializate de consumatori (de exemplu produse pentru diabetici).Cresterea cerintelor utilizatorilor privind imbunatatirea accesului si a vizualizarii informatiilor. Acest factor este in mare masura o consecinta a dezvoltarii unei generatii de oameni constienti de potentialul urias al automatizarii.
Pe de alta parte, insa, se poate evidentia si un aspect pozitiv: astazi software-ul este mult mai putin constrans de hardware. Fata de acum un deceniu, multe aplicatii ruleaza in conditii de spatiu de memorie in exces, de conexiuni ieftine, de factor MIPS (milioane de instr/sec) crescut. Acest fapt are 2 aspecte:
- hardware-ul nu mai influienteaza in mod dramatic arhitectura software;Cu alte cuvinte, ne confruntam cu o realitate simpla, dar fundamentala:- abundenta de resurse hardware incurajeaza cereri de software tot mai mari, care probabil nu vor ajunge niciodata sa fie satisfacute.
Posibilitatile noastre de a imagina aplicatii complexe vor depasi intotdeauna posibilitatile de a le dezvolta. |
---|
Deocamdata ne aflam pe panta "pozitiva"
a lucrurilor, in sensul ca cererile izvorate din imaginatia noastra constituie
un factor ce determina imbunatatirea modului in care construim sistemele
software.
Cauze ale esecului proiectelor software
Majoritatea proiectelor software
au la baza motivatii dintre cele mai serioase: acoperirea unor necesitati
ale pietii, oferirea unor functionalitati solicitate de anumite grupuri
de utilizatori sau experimentarea unor teorii noi.
Pentru unii programarea formeaza o
parte necesara si inevitabila a activitatii lor, desi nu una principala.
De exemplu, o banca are ca obiect principal de activitate gestionarea banilor,
dar software-ul reprezinta un mijloc important in acest scop.
Pentru altii scrierea de programe
este o pasiune, orice altceva fiind considerat ca preocupare prozaica.
In oricare din aceste cazuri programarea
este o activitate consumatoare de timp si energie intelectuala.
S-a constatat ca cel mai adesea esecul unor proiecte software este cauzat de:
1. Abordarea necorespunzatoare a riscurilor.Abordarea necorespunzatoare a riscurilor
Din nefericire, pe masura desfasurarii
muncii unei echipe de programatori, multe din proiecte o "iau razna"
din cauza lipsei unei supervizari mature, ca sa nu spunem lipsa oricarei
supervizari (conform lui Booch: majoritatea proiectelor care esueaza, ajung
astfel nu atat din cauza unui management slab, cat mai ales din cauza lipsei
management-ului).
De obicei, in aceste cazuri lucrurile
evolueaza cam asa: se elaboreaza planuri si termene tot mai nerealiste
care in cele din urma ajung o succesiune de minciuni. Fiecare problema
este tratata drept "o simpla chestiune de programare" in loc sa fie abordata
sistematic, din perspectiva arhitecturii sistemului sau a procesului de
dezvoltare insusi. Colectivul de management, in loc sa ia decizii cu privire
la problemele aparute, lasa echipa de proiectanti sa actioneze "de capul
ei". Urmarea este ca acestia din urma, liberi de constrangeri, neavand
un obiectiv comun clar, se lasa atrasi de ceea ce li se pare lor a fi ceva
"cool" in materie de implementare. Documentele cerute de beneficiari sunt
tratate ca maruntisuri sau anexe ce urmeaza a fi eventual completate dupa
ce echipa finalizeaza infrastructura sistemului. In final se constata ca
aproape nimic din ceea ce a cerut utilizatorul nu este concretizat.
Morala: managerii trebuie sa atace in mod activ riscurile unui proiect, altfel ele ii vor ataca pe ei.
Produsul realizat nu este ceea ce s-a cerut
In alte situatii proiectele esueaza din cauza abordarii la intamplare a unor domenii de aplicatii nefamiliare. Echipa de proiectanti are doar o vaga idee asupra destinatiei finale a sistemului, fiind tentata sa se concentreze spre ceea ce, aparent, ar constitui aspecte tehnice importante (v. ilustratia). Nimeni nu este preocupat sa valideze ceea ce face impreuna cu utilizatorul si cu expertii in domeniu. Fiecaruia i se pare ca a inteles despre ce e vorba, iar la urma se constata cu surprindere ca beneficiarul respinge sistemul creat cu atata pasiune, dar in conditii de totala "eprubeta".
Morala: pe durata procesului de dezvoltare trebuie implicati din plin beneficiarii sistemului. Prezenta lor constituie o atentionare constanta asupra a "de ce" si "pentru cine" se construieste sistemul.
Neajunsurile de natura tehnologica
O alta categorie de proiecte esueaza
din cauza tehnologiei utilizate la crearea sistemelor software. Instrumentele
software "crapa" in cele mai nepotrivite momente, lipsind echipa de capacitatea
de a controla complexitatea crescanda a proiectului. Pe de alta parte,
adesea instrumentele folosite se dovedesc a functiona incorect, obligand
proiectantii sa adopte solutii "contra naturii", pentru a sunta limitarile.
Alteori, furnizorii de instrumente
software livreaza altceva decat au promis initial, produse carora le lipsesc
anumite functionalitati sau ale caror performante lasa mult de dorit. In
cazurile cele mai rele furnizorul pur si simplu iese din afacere, lasand
proiectantii total descoperiti.
Necazurile de natura tehnologica apar
mai ales cand pe piata de hardware/software se produc schimbari ce nu pot
fi controlate de "cei mici": o anumita platforma hardware nu se mai produce,
interfata si caracteristicile unui sistem de operare sunt modificate intr-un
ritm prea rapid pentru ca proiectul sa tina pasul, beneficiarul isi modifica
gusturile si pretentiile, de multe ori pentru ca a citit sau a auzit de
undeva ca pe piata a aparut un produs grozav care pana la urma se dovedeste
a fi fost doar "reclama goala".
In fine, anumite instrumente/ limbaje/
metode alese de proiectanti promit avantaje reale, dar in practica se dovedeste
ca extragerea acestor avantaje e mult mai dificila decat pare. In acest
sens, probabil ca fraze ca cea de mai jos suna destul de familiar programatorilor:
". . . din cauza complexitatii programului 'cutare', pentru a beneficia din plin de toate facilitatile oferite, este necesar ca utilizatorul sa aloce un anumit timp ca sa invete cum sa foloseasca programul. In acest scop, pentru a veni in ajutorul utilizatorului, a fost prevazut un sistem extins de help online. Cum insa acest sistem este departe de a fi perfect, uneori informatiile necesare nu sunt evidente imediat, dar in cele mai multe cazuri informatia se afla sigur undeva in help. Cea mai dificila latura a procesului de invatare va fi de fapt sa gasiti unde . . . :). Intotdeauna este bine sa se prevada o marja suplimentara de timp pentru a studia informatiile continute de sistemul de help . . ."In situatiile in care un anumit proiect intampina obstacole de natura tehnologica, se ajunge la criza de timp daca nu se renunta la o parte a functionalitatilor promise. In ultima instanta, toate acestea sunt foarte suparatoare pentru un programator: ca profesionist, ultimul lucru la care te astepti este ca tehnologia din propria ta meserie sa se intoarca impotriva ta.
Exista insa si urmatorul aspect: de multe ori se arunca vina pe tehnologie, cand de fapt echipa de manageri ar fi trebuit sa anticipeze acest risc si sa-si ia masuri de prevedere. La urma urmei, nu traim intr-o lume perfecta!
Morala: pe cat posibil, un proiect nu trebuie legat de o singura sursa de tehnologie, dar daca acest lucru este inevitabil, atunci arhitectura sistemului trebuie prevazuta cu elemente de protectie.
Stabilirea obiectivelor esentiale ale unui proiect
Cu toate ca multe proiecte se soldeaza
cu succes, pana si cel mai grozav dintre ele dureaza mai mult, implica
mai mult efort intelectual si necesita un control mai intens decat s-a
planificat la initierea lui.
Din pacate, asa cum arata Parnas,
nu vom putea avea niciodata un proces de dezvoltare complet rational, deoarece:
Chiar daca am putea stabili toate cerintele unui sistem, raman multe detalii care vor fi descoperite abia intr-un stadiu avansat al implementarii sistemului.
Chiar daca am cunoaste de la inceput aceste detalii, exista niste limite fundamentale ale complexitatii pe care o fiinta umana o poate stapani.
Chiar daca s-ar putea stapani intreaga complexitate a sistemului, exista forte externe, independente de proiect, care determina modificari ale cerintelor, unele dintre ele putand invalida decizii luate anterior.
Sistemele construite de oameni sunt intotdeauna expuse erorilor umane.
La inceperea fiecarui nou proiect, echipa de proiectanti aduce cu sine un bagaj intelectual de idei provenite din proiecte anterioare, precum si un bagaj economic format din instrumentele hardware/software de care dispune. Ambele vor influienta in mod inevitabil deciziile luate pentru noul sistem, independent de cerintele reale ale acestuia.
In afara de aceasta, un proiect reusit implica adoptarea unor decizii
Sarcina principala a echipei de management software este aceea de a echilibra un set incomplet, inconsistent si schimbator de cerinte tehnice si non-tehnice, in vederea producerii unui sistem optim din punct de vedere al unui set minimal de caracteristici. |
---|
Acest set minimal de caracteristici trebuie sa constituie
obiectivul principal al echipei de proiectanti.
Pentru ca un proiect sa reuseasca, echipa de proiectanti trebuie sa fie foarte drastica, in sensul ca fiecare decizie tehnica trebuie sa contribuie la satisfacerea setului minimal de caracteristici stabilit la inceput. Orice decizie care contravine acestor caracteristici trebuie inlaturata, respectiv orice decizie care este neutra ("nici nu adauga, nici nu scade") trebuie considerata drept un lux. |
---|
Intreaga organizatie implicata in dezvoltarea unui sistem trebuie sa aiba o viziune comuna asupra problemei de rezolvat. Pe masura ce lucrul inainteaza, echipa trebuie sa-si puna mereu intrebarea: "ceea ce producem se incadreaza inca in setul de caracteristici stabilit ?". Daca raspunsul e "da", atunci echipa e pe "calea cea buna". Daca raspunsul e "nu", atunci exista 3 posibilitati:
Relaxarea unor restrictii.
Abandonarea proiectului.
Tipuri
de proiecte
Fiecare proiect software, OO sau non-OO, se caracterizeaza
printr-o anumita politica sau stil de dezvoltare, care depinde de alegerea
explicita sau implicita a setului minimal de caracteristici.
Din acest punct de vedere putem distinge urmatoarele tipuri de proiecte:
Orientate pe calendar
Orientate pe cerinte
Orientate pe documentatie
Orientate pe calitate
Orientate pe arhitectura
Proiecte
orientate pe calendar
Se caracterizeaza printr-o grija obsesiva privind planificarea
termenelor de livrare. Cuvantul de ordine este "operativitatea". Toate deciziile se iau pe termen scurt, avandu-se in vedere exclusiv ceea ce urmeaza a fi scadent in viitorul imediat. Tot
ce nu contribuie la respectarea termenelor stabilite este ignorat sau
fusarit. Se urmareste
doar ca produsul sa respecte un minimum-minimorum de functionalitate si
performanta. Ca urmare, au de suferit calitatea, completitudinea, documentatia
si integritatea conceptuala.
Singurul argument care ar putea justifica o asemenea
optica ar fi acela ca organizatia respectiva ar da faliment daca proiectul
nu ar fi predat la timp.
Proiectele orientate pe calendar in general nu incorporeaza
un proces definit, ci doar o anumita cantitate de disciplina informala
derivata din cultura locala in materie de programare, redata plastic prin
asertiuni de genul: "Adevaratii programatori nu utilizeaza metode". Nu putine sunt organizatiile care functioneaza in aceasta atmosfera de haos continuu, mentinerea lor in viata fiind asigurata de munca eroica a catorva bravi programatori.
O firma nou infiintata ar putea adopta strategia
orientarii pe calendar pentru o scurta perioada de timp, deoarece acesta
poate fi singurul mod de a patrunde pe piata. Daca firma este mica nu
poate rezista mult timp in acest regim. O firma mare, care isi poate
permite sa aloce forta de munca pe mai multe proiecte paralele, va putea
aplica stilul orientat pe calendar mai mult timp; scotand rapid pe piata
mai multe produse, asemenea firme vor obtine in felul acesta un avantaj
psihologic asupra concurentei.
In orice caz insa, politica orientata exclusiv pe calendar nu
constituie o solutie viabila pe termen lung. Deoarece produsele rezultate
sunt rareori scalabile, extensibile, portabile sau reutilizabile, costul
intretinerii lor atinge in timp valori intolerabile.
Proiectele orientate pe calendar au si un cost social. Daca din
cand in cand e interesant sa faci parte dintr-o echipa care lucreaza
intr-un ritm alert, un asemenea stil de viata nu poate dura la
nesfarsit. De obicei, organizatiile care lucreaza permanent sub
presiunea termenelor nu au o morala profesionala sanatoasa.
Cand un proiectant este capabil sa ia decizii bune si profunde,
el nu va avea nici o satisfactie daca mereu va trebui sa sacrifice
calitatea si sa opteze pentru solutiile expeditive.
Proiecte
orientate pe cerinte
Se caracterizeaza printr-o atentie exagerata acordata
comportarii observabile din exterior a sistemului. Deciziile se iau in
primul rand in conformitate cu necesitatile locale ale fiecarei cerinte.
Calitatea si performanta sunt importante doar in masura in care exista
cerinte explicite in acest sens. In ceea ce priveste respectarea termenelor
de predare, o organizatie care aplica strategia orientata pe cerinte este
dispusa mai degraba sa accepte intarzieri, decat sa renunte la anumite
functii ale sistemului. Integritatea conceptuala a proiectului este afectata,
deoarece nu exista interesul de a promova principii de genul portabilitate,
reutilizare, extensibilitate, dincolo de ceea ce ar putea eventual implica
unele dintre cerinte.
Un asemenea stil de proiecte se justifica acolo unde
lista cerintelor este bine definita, unde comportarea vizibila a sistemului
este clara, iar probabilitatea sa apara modificari este mica. In aceste
cazuri completitudinea este principalul obiectiv, iar sistemul rezultat
este optim in raport cu un set static de cerinte.
Proiectele orientate pe cerinte sunt conduse de regula
dupa urmatorul proces:
Daca se estimeaza ca mai mult de 90% din cerintele sistemului vor fi stabile de-a lungul vietii acestuia, atunci stilul orientat pe cerinte reprezinta o solutie rezonabila. Pentru un grad de stabilitate mai mic de 90% este necesar un alt model de dezvoltare, care sa asigure o valoare tolerabila a costurilor de intretinere. |
---|
Proiecte
orientate pe documentatie
Reprezinta o forma degenerata a stilului orientat pe
cerinte, impins spre birocratie. Deciziile privind dezvoltarea se iau tinand
cont de documentatia care trebuie livrata in pasul urmator. Adesea, pe
masura ce se apropie termenul de predare a unui document, orice activitate
de dezvoltare propriu-zisa inceteaza pana cand documentul respectiv este
editat si pus in bratele utilizatorului care, oricum nu-l va citi. Dupa
care, proiectantii se vor da peste cap sa recupereze timpul pierdut, pana
la urmatoarea intrerupere.
Proiectele demarate cu intentia de a aplica stilul orientat
pe cerinte pot usor fi deviate spre stilul orientat pe documentatie. Aceasta
se intampla de regula cand managementul, nesigur asupra metodei de a controla
latura creativa a procesului de dezvoltare, impune in mod fortat realizarea
unui maldar de ceea ce se considera a fi documente esentiale.
Daca in cadrul unui proiect angajatii lucreaza mai mult ca editori de documente decat ca programatori, sau daca costul actualizarii documentatiei este mai mare decat costul unei modificari in program, acestea sunt semne sigure ca proiectul a alunecat in "gaura neagra" a stilului orientat pe documentatie. |
---|
Toate acestea nu inseamna ca orice documentatie este inutila, adica nu trebuie sa se treaca in extrema cealalta, redata plastic prin asertiuni de genul: "Adevaratii programatori nu scriu documentatie"! Anumite documente constituie instrumente esentiale pentru management si servesc drept marturii ale procesului de dezvoltare. Ceea ce trebuie evitat este documentatia gratuita, facuta de dragul documentarii. Practic, doar in cateva situatii este admis ca intr-un proiect cantitatea de hartie livrata sa depaseasca software-ul propriu-zis, si anume: la elaborarea unei biblioteci de clase de exemplu, este foarte important ca aceasta sa fie foarte minutios documentata, astfel incat utilizatorul sa poata intelege si utiliza clasele respective. Si in acest caz, insa, trebuie analizate costurile, deoarece se poate constata ca uneori este mai economic sa se angajeze un consultant tehnic care sa ofere asistenta utilizatorului, decat sa se elaboreze documentatie scrisa.
Proiecte
orientate pe calitate
Se caracterizeaza printr-o preocupare obsedanta in legatura
cu anumite metrici cuantificabile. Aceste metrici se pot referi la:
Daca esecul unui sistem software poate pune in pericol fie si viata unui singur om, pentru acel sistem trebuie aplicat stilul de dezvoltare orientat pe calitate. |
---|
In general, proiectele orientate pe calitate prezinta
o mare inertie, in sensul ca orice modificare este intampinata cu multe
retineri. Aceasta, din cauza costurilor ridicate generate de verificare
si validare. In cazuri extreme se aplica masuri ultra-conservatoare, cum
ar fi verificarea compatibilitatii binare a noilor versiuni. Chiar si efectuarea
unui upgrading la un compilator utilizat in dezvoltarea sistemului poate
constitui o decizie morala majora. Mai ales acolo unde e vorba de vieti
omenesti, se pot aplica verificari formale pentru a mari gradul de incredere
in comportarea sistemului. Sistemele orientate pe calitate au o forma simpla
de masurare a succesului: daca se ajunge ca o echipa de avocati sa evalueze
pagubele provocate de esecul unui asemenea sistem, inseamna ca esecul este
tragic.
Daca in anumite domenii politica orientata pe calitate este absolut
necesara, in altele ea reprezinta un lux pe care dezvoltatorii de software
nu si-l pot permite. Aceasta nu inseamna ca proiectele respective trebuie
sa ignore aspectele calitative, ci inseamna ca atingerea unui anumit nivel
de calitate constituie intotdeauna o decizie economica. In cel mai bun
caz, un proiect va trebui sa realizeze un echilibru intre
satisfacerea
cerintelor privind calitatea si costurile necesare acestui lucru.
De multe ori, relaxarea usoara a unor restrictii de calitate (cum ar
fi
perioada medie intre caderi) poate avea un impact imens asupra reducerii
costurilor dezvoltarii. De aceea, este important ca managementul sa
analizeze oportunitatea oricarei cerinte privind calitatea, daca aceasta
apare prea restrictiva.
Pe de alta parte, de cele mai multe ori sacrificarea calitatii in
favoarea
scurtarii duratei de dezvoltare este o falsa economie. In consecinta, un
manager intelept va lua in considerare intotdeauna si aspectul costurilor
de intretinere in timp a produsului, inainte de a adopta astfel de
compromisuri.
Proiecte
orientate pe arhitectura
Reprezinta la ora actuala cel mai matur stil de dezvoltare,
caracterizat prin crearea unui cadru care satisface toate cerintele principale
cunoscute, dar ramane dispus la adaptari in raport cu cerintele inca necunoscute
sau neintelese. Stilul orientat pe arhitectura se situeaza, pe o scara
evolutiva, deasupra stilului orientat pe cerinte. Intre cele 2 stiluri
exista multe asemanari, exceptand faptul ca stilul orientat pe arhitectura,
aplicat la proiectele orientate pe obiecte, incearca sa atenueze dezavantajele
stilului orientat pe cerinte.
Proiectele orientate pe arhitectura presupun de regula
urmatorul proces:
5 reguli de reusita a proiectelor software OO
O definitie nu neaparat comerciala a unui proiect reusit
spune ca:
Un
proiect software se considera reusit daca:
|
---|
(O definitie mai prozaica ar fi: un proiect de succes
este acela care aduce multi bani!).
Definitia de mai sus (cea cuprinsa in chenar) nu face
referire la tehnologia aplicata in dezvoltarea proiectului. Cu alte cuvinte
ea este valabila si in cazul proiectelor non-OO. Totusi, in literatura
de specialitate se afirma ca, din punct de vedere statistic, numarul proiectelor
OO reusite este mult mai mare decat al celor non-OO reusite.
In cazul in care pentru un proiect se alege tehnologia
obiectuala, problema care se pune este aceea a modului in care se va aplica
aceasta tehnologie pentru a obtine maximum de beneficii, deoarece doar
simplul fapt ca se hotaraste adoptarea metodologiei OO nu asigura automat
succesul unui proiect.
In primul rand, sa vedem CARE sunt beneficiile pe care
le poate aduce orientarea pe obiecte:
Pe langa cele enumerate mai sus, intervin si caracteristici care tin de natura intrinseca a tehnologiei OO: simplitate, localizarea structurii si a comportamentului, expresivitatea relatiei de mostenire etc.Modelul OO al unei probleme si al solutiei ei incurajeaza crearea unui vocabular comun intre utilizatorii sistemului si proiectantii lui, permitand astfel o interpretare comuna a problemei.
Aplicarea metodei de integrare continua creaza posibilitatea identificarii din timp a riscurilor, astfel incat corectiile incrementale sa nu destabilizeze ceea ce deja s-a dezvoltat.
O arhitectura OO permite o separare clara intre elementele independente ale sistemului, in felul acesta putandu-se ridica adevarate "ziduri de protectie" (firewalls) intre elementele respective, cu avantajul ca o modificare efectuata asupra unui element nu va afecta tot restul sistemului.
1. Concentrarea atenta asupra dezvoltarii sistemului pentru a defini clar o colectie minimala de caracteristici. Acest principiu este de fapt valabil si pentru proiecte non-OO, dar avantajul pe care il aduce metodologia OO in acest caz este faptul ca permite o reactie mai buna la schimbarile ce apar in intelegerea unei probleme, schimbari ce se vor manifesta si in setul minimal de caracteristici. Tehnicile OO dau posibilitatea de a efectua modificari fara a implica refacerea unei cantitati considerabile din proiect.
2. Existenta in cadrul organizatiei a unei mentalitati orientate spre rezultate, care incurajeaza comunicarea si care nu este obsedata de spectrul esecului. Tehnologia OO vine si in intampinarea acestui principiu. Ea impune o permanenta comunicare intre membrii echipei de proiectanti, dar si intre acestia si utilizatori, fapt care garanteaza o mai buna si mai rapida intelegere a problemei, precum si o formare a unei viziuni comune asupra sistemului de dezvoltat. In ceea ce priveste teama de esec, aceasta genereaza de regula 2 fenomene nesanatoase: un accent exagerat asupra partii de analiza si respectiv o evitare a experimentarii. In realitate, in toate disciplinele ingineresti, si poate ca in productia de software mai mult, zicala ca "din greseli invata omul" isi gaseste o foarte buna aplicare. Examinand cauzele si imprejurarile unui esec, putem desprinde invataminte utile care vor duce pe viitor la evitarea erorilor respective. In cazul proiectelor OO trebuie ca proiectantii sa aiba permanent in minte ideea ca nu exista abstractiuni perfecte, iar in cazul in care se constata ca anumite clase nu sunt bune, acest lucru trebuie sa constituie un imbold spre imbunatatirea abstractiunilor respective si nu un motiv de descurajare.
Pe de alta parte, nici extrema cealalta nu este de dorit, si anume lansarea intr-o munca de experimentare fara restrictii, de prototipizare grosiera, intr-o maniera "hacker"-ista cu scopul construirii de abstractiuni perfecte, condusi de principiul: "Dati-mi Smalltalk (sau alt limbaj), un laptop si un loc unde sa stau, si voi muta lumea".
3. Utilizarea eficienta a modelarii OO. Utilizarea eficienta a claselor si a obiectelor presupune mai mult decat simpla manipulare a mecanismelor sintactice ale unui limbaj de programare OO. Este foarte important de subliniat ca clasa este o unitate necesara, dar nu si suficienta de descompunere a unui sistem. Arhitectura unui sistem se exprima mai intai in termeni de grupuri de clase (package-uri sau cluster-e) si acestea, la randul lor, se formeaza din clase individuale.
4. Existenta unei viziuni arhitecturale puternice. Un sistem cu o arhitectura solida se caracterizeaza prin unitate si integritate conceptuala. Doar avand o imagine clara a arhitecturii, se pot descoperi abstractiunile si mecanismele comune mai multor parti ale sistemului si astfel se poate ajunge la simplificarea lui. In capitolul urmator se va discuta notiunea de arhitectura OO solida.
5. Aplicarea unui model iterativ si incremental bine condus, al ciclului de viata. Din experienta s-a constatat ca proiectele OO reusite nu au fost dezvoltate in cadrul unui proces anarhic, dar nici draconic de restrictiv. Maniera recomandata de desfasurare a procesului de dezvoltare este cea iterativa si incrementala. Un proces software iterativ presupune o detaliere succesiva a arhitecturii OO, astfel incat fiecare noua versiune a acesteia se bazeaza pe experienta si rezultatele obtinute din versiunea anterioara. Un proces incremental presupune ca fiecare trecere printr-un ciclu de forma analiza-proiectare-evolutie conduce spre o detaliere treptata a deciziilor strategice si tactice, obtinandu-se in ultima instanta solutionarea cerintelor reale ale utilizatorului (care de obicei nu sunt formulate explicit), sistemul ramanand insa simplu, fiabil si adaptabil. Un proces iterativ si incremental poate asigura o reconciliere a celor 2 factori opusi: creativitatea (care nu trebuie constransa) si disciplina, sau, altfel spus, arta si stiinta care intervin in ingineria software.