Showing posts with label fiabilitate. Show all posts
Showing posts with label fiabilitate. Show all posts

Saturday, December 30, 2017

Fiabilitatea programelor și ordinele de mărime

În programele FORTRAN IV se lucra cu:
- variabile și constante de tip întreg definite pe 4 bytes;
- variabile și constante de tip real definite pe 4 bytes;
- variabile și constante de tip real definite pe 4 bytes;
- variabile și constante de tip logic
- variabile și constante de tip complex definite pe 4+4 bytes.
Fiecare constantă sau variabilă este caracterizată prin magnitudine, adică valoare maximă, respectiv, valoare minimă și prin ordin de mărime, adică număr de cifre maxim ce se stochează în zona de memorie care se alocă.
O constantă de tip întreg care este definită pe 4 bytes are cel mai mare număr ce se stochează acolo egal cu 2 la puterea 31 minus 1, cunoscătorii știu de ce..., adică magnitudinea maximă este de 2147483647. Deci dacă cineva dorește să scrie un program fiabil în care adună două numere IA și IB trebuie să verifice dacă:
  • IA > 2147483647;
  • IB > 2147483647;
  • IA+IB > 2147483647.
Având în vedere că în calcule toate variabilele sunt cu aceeași importanță, este rezonabil să se ia în considerare pentru fiecare dintre ele un domeniu care să asigure fiabilitatea programului în orice condiții. Din punctul meu de vedere, domeniul de variație al variabilelor nu trebuie calculat pe bucățele, ci per global, pentru a da generalitate și operaționalitate programului, adică programul să funcționeze în orice condiții, nu uneori da și de o mie de ori, nu.
Dacă se consideră doi operanzi de tip întreg OP1 și OP2 având N1 și respectiv N2 cifre, când se face o operație de adunare sau de scădere rezultatul REZ = OP1 + OP2  va avea un număr de cifre egal cu NREX = max (N1,N2) +1. Ca un program să fie fiabil trebuie ținut seama și de acest aspect. Dacă rezultatul REZ nu trebuie să fie mai mare în valoare absolută decât 2147483647, înseamnă că operanzii OP1 și OP2 nu trebuie să fie mai mari în valoare absolută decât 2147483647/2, adică mai mare decât 1072418237. Sunt chestiuni învățate în școala elementară, despre care foarte mulți dintre noi nu le-am considerat importante atunci, dar care pentru a face programe fiabile revin în forță.
Dacă se consideră doi operanzi de tip întreg OP1 și OP2 având N1 și respectiv N2 cifre, când se face o operație de înmulțire rezultatul REZ = OP1 * OP2  va avea un număr de cifre egal cu NREX =  N1+N2. În acest context OP1 și OP2 nu trebuie să fie mai mari de 46340 pentru a nu avea dureri de cap cu derularea calculelor și fără a fi nevoiți să stabilim numărul de cifre al numărelor stocate în zonele de memorie OP1 sau OP2.
Este rezonabil să introducem prin programele noastre colo și colo instrucțiuni precum:
                  IF((OP1.GT.1072418237).OR.(OP2.GT.1072418237)) GO TO 10
                  REZ = OP1 + OP2
                  IK=1
sau
                  IF((OP1.GT.46340).OR.(OP2.GT.46340)) GO TO 10
                  REZ = OP1 * OP2
                  IK=2
....................
10              IK=0
....................
Unde IK=0 dacă operațiile de calcul nu se efectuează din motive de depășire a capacității sau IK=1 în ideia că operațiile se efectuează. Dacă suntem convinși că trebuie să verificăm efectuarea calculelor se vor face conversii pe real a operanzilor și numai după efectuarea calculelor finale se va face testul dacă rezultatul final este mai mare decât constanta reală 2147483647. ceea ce va conduce la atribuirea valorii IK=0 cum că s-a produs o depășire care duce la trunchiere dacă se face conversie de la real spre întreg.
Fiabilitatea programelor și ordinele de mărime merg mână în mână și în vremurile de demult subdepășirea dar și depășirea de capacitate au dat mari bătăi de cap programatorilor mai ales când erau neglijeate oarece inițializări și se lucra cu operanzii neinițializați spre direcționarea în zone aleatoare a rezultatelor finale.




(30 decembrie 2017)

Monday, December 11, 2017

Standarde de calitate

Standardele de calitate sunt numeroase și au fost elaborate în timp, reflectând exact cerințele și posibilitățile informaticii de la acele vremuri.
Am identificat următoarele standarde:
ISO 9000 din 1987
ISO 9001 din 1997
ISO 9002 din 1987
ISO 9001 din 1987
ISO/IEC 9126 din 1991
ISO/IEC 2500
ISO/IEC 2501
ISO/IEC 2502
ISO/IEC 2503
ISO/IEC 2504
ISO/IEC 25010 din 2011
ISO/IEC 25012 din 2008
ISO/IEC 25050
ISO/IEC 25099
Textele acestor standarde sunt foarte complexe, iar IEEE a editat masivul volum Implementing the IEEE Software Engineering Standards, apărută la SAMS, avându-l autor pe Michael SCHMIDT, în anul 2000, iar lista standardelor IEEE este impresionantă, listă pe care o redau și eu aici. În vremurile de demult, mă refer la intervalul 1997-2003 am avut și eu un tom imens publicat la IEEE publications cu nenumăprate standarde, care erau așa de bune încât cine ar fi ieșit din litera lor, focurile Gheenei l-ar fi păscut iremediabil, ireversibil și pentru totdeauna.
IEEE Std. 610.12-1990, IEEE Standard Glossary of Software Engineering Terminology
IEEE Std. 1062, 1998 Edition, IEEE Recommended Practice for Software Acquisition
IEEE Std. 1220-1998, IEEE Standard for Application and Management of the Systems Engineering Process
IEEE Std. 1228-1994, IEEE Standard for Software Safety Plans
IEEE Std. 1233, 1998 Edition, IEEE Guide for Developing System Requirements
IEEE Std. 1362-1998, IEEE Guide-System Definition-Concept of Operations Document
IEEE Std. 12207.0-1996, IEEE/EIA Standard for Industry Implementation of International Standard ISO/IEC 12207:1995 (ISO/IEC 12207), Standard for Information Technology-Software life cycle processes
IEEE Std. 12207.1-1997, IEEE/EIA Guide-Industry Implementation of International Standard ISO/IEC 12207:1995 (ISO/IEC 12207), Standard for
Information Technology-Software life cycle processes-Life cycle data
IEEE Std. 12207.2-1997, IEEE/EIA Industry Implementation of International
Standard ISO/IEC 12207:1995 (ISO/IEC 12207), Standard for Information
Technology-Software life cycle processes-Implementation considerations
Process Standards these standards describe primary processes including acquisition, supply, development, maintenance, operations, and measurements.
IEEE Std. 730-1998, IEEE Standard for Software Quality Assurance Plans
IEEE Std. 730.1-1995, IEEE Guide for Software Quality Assurance Planning
IEEE Std. 828-1998, IEEE Standard for Software Configuration Management Plans
IEEE Std. 1008-1987 (R1993), IEEE Standard for Software Unit Testing
IEEE Std. 1012-1998, IEEE Standard for Software Verification and Validation
IEEE Std. 1012a-1998, Supplement to IEEE Standard for Software Verification and Validation-Content Map to IEEE/EIA 12207.1-1997
IEEE Std. 1028-1997, IEEE Standard for Software Reviews
IEEE Std. 1042-1987 (R1993), IEEE Guide to Software Configuration Management
IEEE Std. 1045-1992, IEEE Standard for Software Productivity Metrics
IEEE Std. 1058-1998, IEEE Standard for Software Management Plans
IEEE Std. 1059-1993, IEEE Guide for Software Verification and Validation Plans
IEEE Std. 1074-1997, IEEE Standard for Developing Software Life Cycle Processes
IEEE Std. 1219-1998, IEEE Standard for Software Maintenance
IEEE Std. 1490-1998, IEEE Guide to the Project Management Body of Knowledge
Product Standards
These standards explain the requirements for classes of software products[md]characteristics, measurements, evaluations, and specifications.
IEEE Std. 982.1-1988, IEEE Standard Dictionary of Measures to Produce Reliable Software
IEEE Std. 982.2-1988, IEEE Guide for the Use of IEEE Standard Dictionary of
Measures to Produce Reliable Software
IEEE Std. 1061-1998, IEEE Standard for a Software Quality Metrics Methodology
IEEE Std. 1063-1987 (R1993), IEEE Standard for Software User Documentation
IEEE Std. 1465-1998, IEEE Standard Adoption of ISO/IEC 12119:1994(E),
Information Technology-Software packages-Quality requirements and testing
Resource and Technique Standards these standards recommend proper documentation for a well-managed software
program and its related processes.
IEEE Std. 829-1998, IEEE Standard for Software Test Documentation
IEEE Std. 830-1998, IEEE Recommended Practice for Software Requirements
Specifications
IEEE Std. 1016-1998, IEEE Recommended Practice for Software Design
Resource and Technique Standards
IEEE Std. 1044-1993, IEEE Standard Classification for Software Anomalies
IEEE Std. 1044.1-1995, IEEE Guide to Classification for Software Anomalies
IEEE Std. 1320.1-1998, IEEE Standard for Functional Modeling LanguageSyntax and Semantics for IDEFO
IEEE Std. 1320.2-1998, IEEE Standard for Conceptual Modeling LanguageSyntax and Semantics for IDEF1X97(IDEFobject)
IEEE Std. 1348-1995, IEEE Recommended Practice for the Adoption of Computer-Aided Software Engineering (CASE) Tools
IEEE Std. 1420.1-1995, IEEE Standard for Information Technology-Software
Reuse-Data Model for Reuse Library Interoperability: Basic Interoperability Data Model (BIDM)
IEEE Std. 1420.1a-1996, IEEE Guide for Information Technology-Software
Reuse-Data Model for Reuse Library Interoperability:Asset Certification Framework
IEEE Std. 1430-1996, IEEE Guide for Information Technology-Software ReuseConcept
of Operations for Interoperating Reuse Libraries
IEEE Std. 1462-1998, IEEE Standard Adoption of ISO/IEC 14102:1995-Guidelines for the Evaluation and Selection of CASE Tool.
Standardele spun multe numai celor care înțeleg litera dar și spiritul lor, fără a fi vorba de o utilizare mecanică, ci creativă astfel încât calitatea să rămână obiectivul esențial și nu teama de a nu respecta proceduri și fluxuri pe care standardele nu le impun în niciun fel, ci doar dau direcții de urmat, fiecare dintre noi având infinite libertăți de a ne încadra în cerințele lor, fără a dăuna obiectivului-calitate.




(08 decembrie 2017)


Managementul total

Managementul total al calității software este un deziderat ce nu va fi atins chiar așa de curînd la noi, în condițiile în care chiar în practică la noi managementul calității, adică banalul managementului calități are aspecte caricaturale. Acum mulți ani când m-am pus împreună cu prieteni mei Marius POPA, Gheorghe NOȘCA și Sergiu CAPISIZU să scriem cartea Managemntul calității aplicațiilor informatice, am făcut oferta unui nefericit de la o universitate din străinătate. De la respectivul am primit mesajul că i-ar conveni dacă noi am scrie despre Managemntul total al calității aplicațiilor informatice, ceea ce era cu totul altceva. M-am supărat, l-am expediat la origini și am pornit demersul nostru.
Cine vrea să vadă ce ste cu managementul toatl al calității software - TQMS să intre pe Internet și se va convinge că teoria este sublimă, dar o minimă decență ar trebui să ne rețină atât timp cât nu suntem nici perfecți și nici frumoși în ale managementului. TQMS presupune:
- continuitate;
- profunzime;
- rigoare;
- proceduri;
- măsurători;
- instrumente;
- specialiști;
- conștiință;
- profesionalism;
- industrie;
- reguli;
- standarde;
- respect.
În condițiile în care costurile pentru TQMS sunt cu mult mai mari decât în cazul SQM și când se înregistrează numeroase abateri de la proceduri și reguli, iar personalul din SQM nu este deloc independent, ba din contră este dependent de managementul de producție, evident, TQMS este un vis cam prea îndepărtat, așa cum robotizarea nu merge în secțiile cu strunguri realizate la 1950.
Managementul total în zona calității software este doar un deziderat, care mă duce la poemul eminescian La steauna.
Icoana stelei ce-a murit
Încet pe cer se suie;
Era pe când nu s-a zarit,
Azi o vedem, si nu e.
Mi se par mai natural să nu fim absurzi și acum în anul 2017 să facem măcar un management al calității software cinstit, cu proceduri, cu independența celor care fac acest management și cu dorința tuturor de a aloca eforturi și resurse spre a face calitate și nu de a o mima, căci acum aplicațiile online multiplică îngrozitor efectele negative, aducând în faliment pe dezvoltatorul neglijent.


în lucru acum

(08 decembrie 2017)

Calitatea procesului

Calitatea procesului de realizare a aplicațiilor informatice nu este nici pe departe o noutate. Este doar o translatare a studiului calității proceselor de producție din industrie, unde se analizează:
- echipamente;
- activități;
- executanți;
- consumuri;
- materiale;
- procedee;
- rețete;
- succesiuni;
- pregătiri;
- verificări;
- stocări;
- încercări.
Oricare dintre etapepe ciclului de realizare a unui produs software este analizată din punct de vedere cantitativ, dar și din punct de vedere calitativ. Din punct de vedere cantitativ analiza presupune a se da răspunsuri la întrebări precum:
- câți oameni lucrează la realizarea respectivei etape?
- din cîte operații este alcituită repseticva etapă?
- câte restricții de succesiune a operațiilor există?
- care sunt duratele operațiilor?
- câte resurse sunt necesare la fiecare etapă?
- care sunt riscurile care apar la fiecare operație?
- cât durează pregătirea unei operații?
- cât durează predarea produsului?
Aspectele de ordin calitativ sunt legate în mod adaptat de fiecare dintre etapele ciclului de realizare, căci fiecare operație se realizează bine, foarte bine sau prost, iar pentru fiecare calificativ există elemente clare de încadrare. Pentru ca un proces să fie bine bine derulat trebuie ca:
- toate operațiile să fie executate complet;
- toate procedurile necesare să fie cunoscute bine;
- procedurile să fie bine aplicate;
- executantul să fie conștiincios;
- executantul să fie mulțumit de ceea ce face;
- diferențele dintre planificat și realizat să fie minime;
- produsul obținut să fie catalogat ca bun. 
Pentru ca un proces să fie prost derulat este necesar ca doar un element care intră în componența sa să fie executat anapoda, o operație să fie sărită sau să nu i se acorde atenția corespunzătoare și totul se duce de râpă. La scrierea textului sursă trebuie executate activități precum:
- construirea listei complete de variabile;
- evitarea folosirii instrucțiunii GO TO;
- inițializarea tuturor variabilelor înainte de a fi utilizate;
- respectarea tuturor regulilor de sintaxă;
- punerea în corespondență a blocurilor din schema logică cu instrucțiunile programului.
Lista continuă cu alte și alte cerințe de care programatorul nu trebuie să fie străin. Noncalitatea produsului software este strict dependentă de măsura în care programatorul nu asigură calitatea procesului specific etapei în care el, programatorul intervine, adică etapa de scriere a programului. Dacă există o singură modalitate de a asigura calitatea procesului în scrierea programului, evident există o infinitate de modalități de a distruge calitatea procesului. Să ne uităm la pseudomeseriașii care mișună în economia românească și ne dăm seama cu precizie de  toată gama de improvizații și omisiuni ce au consecință distrugerea calității oricărui proces, ceea ce prin extensie se întâmplă și în activitatea de programare.
Lumea acordă destul de puțină atenție calității procesului. Disciplina din timpul activităților este esențială, mai ales că de nivelul de concentrare al programatorului depinde calitatea programului. Să nu-mi spună mie că un programator:
- hărțuit,
- stresat,
- timorat,
- agitat,
- sunat,
- chemat,
- verificat,
- urlat,
- subestimat,
- înjurat,
- bârfit,
- izolat,
- superficial,
- împrăștiat,
va avea acel randament care să-i permită să gândească și să scrie acele secvențe care să-l reprezinte și mai ales care să fie exact de nivelul și de potențialul pe care el îl dă în condiții propice scrierii de programe așa cum trebuie, când este respectat și lăsat să-și facă meseria. În vremurile de demult, când nu erau atât de mulți șefi și manageri ca azi, parcă programatorul era mai liber să gândească, mai creativ și cu mult mai eficient, iar programele sale parcă semănau mai mult a bijuterii și nu a tinichele ca azi, când doar poleiala contează




(08 decembrie 2017)

Saturday, December 9, 2017

Controlul calității

Controlul calității în opinia mea trebuie făcut de cei care știu meserie și nu de unii care doar asta știu să facă, adică să controleze. Îmi face atâta scârbă când văd pe câte unul care nu a scris în viața lui un program că se uită la texte sursă și strâmbă din nas, căutând și găsind tot felul de cusururi, dintre care
unele sunt de-a dreptul exagerate.
Când am scris cartea programarea standard, referită prin: Ion Ivan - Programare  standard, Editura Litera, București, 1981, 123 pg. Acolo am scris că analiștii trebuie să fi fost cândva cei mai buni programatori. Numai așa ei vor ști să scrie specificații și să facă descrieri pe care programatorii să le înțeleagă perfect. În opinia mea, un rol esențial în alre autocontrolul calității. Adică, înainte ca altcineva să vadă cât de bine este scris un text sursă, cel mai bine este ca programatorul însuși să facă analiza și să facă corecții. Numai după ce el este convins că a epuizat tot ce știe să dea programul pe mâna altora. Cândva am avut ocazia să văd niște tipi absolut ignorați care făceau pe testerii, deși ei în viața lor nu scriseseră vreo instrucțiune. Erau extrem de duri. I-am lăsat să delireze, după care le-am arătat eu toate greșelile lor de testare, care erau greșeli elementare. Una dintre ele este că nimeni nu ară același set de date de test de două ori pentru a trage două concluzii absolut diferite, aberante, incomplete și mai ales de un subiectivism crunt care începe cu mi se pare că. În zona software orice se face are dreptul de a face obiectul controlului. Se controlează definirea problemei. Se controlează specificațiile. Se controlează textul sursă. Se controlează cum s-a făcut testarea. Se controlează implementarea. Se controlează modul cum se face exploatarea. Ideia este ca procesul de control să se facă fie în timp ce se derulează operațiunea, fie imediat ce operațiunea s-a încheiat. Dacă se găsesc hibe, acestea se vor corecta și nu se vor propaga etapelor ce urmează și abia în final să fie identificate și nu oricum, ci rostogolite, amplificate și costisitoare.
Am un respect imens față de toți cei care vin să facă control cu bune intenții și care dau șanse reale executanților de a face corecții, fără a lovi cu barda, necruțător, ireversibil și zgomotos.
Există ă literatură foarte bogată pe contro, căci plăcerea de a controla, de a face pe zmeul și de a-i umili pe cei din jur este cu atât mai crâncenă, cu cât cel ce controlează este mai ignorant și needucat.
Controlul calității este un lucru normal, care devine anormal când are dimensiuni și importanță disproporționate în raport cu efectele pe care le generează față de cei din jur. Am văzut controlori de calitate software care când au pierdut poziția, nici post de măturători în echipe de dezvoltare nu și-au găsit.






(08 decembrie 2017)



Realizarea calității

Realizarea calității este un nou mod de a înțelege calitatea. În opinia mea, calitatea este o construcție, asemeni unei care, care se construiește pas cu pas. Se pun temeliile calității-construcție prin:
- achiziționare de tehnică de calcul de ultimă generație;
- achiziționarea de licențe pentru cele mai noi instrumente;
- achiziționarea de licențe pentru cele mai noi medii de dezvoltare;
- achiziționarea de licențe pentru cele mai noi SGBD-uri;
- achiziționarea de facilități și resurse de a lucra în cloud;
- instruirea și certificarea  personalului existent;
- implementarea cerițelor de management al calității;
- implementarea de proceduri clare de scriere programe;
- definirea exactă a fluxurilor ciclului de realizare.
Construcția numită calitate, exact ca la realizarea unui zid unde se urmărește verticalitatea, caracterul drept și uniform al dispunerii cărămizilor, tot așa și la programe. La fiecare secvență programatorul însuși face analize proprii,. El nu așteaptă pe altcineva să vină să-i spună că programul lui nu e bun și să-i înșire tot felul de cauze.
Fiecare dintre cei ce lucrează în informatică trebuie să se gândească la echivalentul poziției lui în etapa de realizare a calității unei clădiri și după aceea să facă similitudini și va înțelege exact cum stau lucrurile la locul său de muncă cu procesul de a construi calitate software. Orice altă abordare este păguboasă și când spun asta, știu ce spun, pentru că am lucrat cu programatori care nu au înțeles chesria și am pătimit și eu și alții cu vârf și îndesat. Este infinit mai greu să corectezi decât să faci lucrul bun din start.
Istoria informaticii a consemnat nenumărate momente ale realizării calității pe principiile translatate din alte domenii pentru că programatorii proveneau ei înșiși din alte domenii și până să capete deprinderile de informaticieni, se manifestau cu obiceiurile de la vechile lor locuri de muncă. Am văzu persoane care veneau din contabilitate și care gestionau etichetele din programe exact ca în contabilitate cu debit pe cele care erau la instrucțiuni DO, IF(), GO TO și la credit pe cele de la instrucțiunile unde fie se delimita domeniul, fie trebuia să se ajungă la un moment dat. În acest fel ei nu se găseau niciodată în situația de a avea etichete necunoscute ca mesaj în compilare.
Am văzut matematicieni meticuloși care realizau schemele logice pe care le verificau și răsverificau. Ei realizau corespondență perfectă între blocurile din schema logică și liniile textului sursă. Chiar și etichetele erau în corespondență  cu conectorii din schemele logice. Totul era ca o interpretare după note a unuei melodii când aceștia scriau programele.




(08 decembrie 2017)

Calitatea software

Calitatea software a fost intuită dintotdeauna, de când a fost scris primul program.
Un program era bun dacă și numai dacă:
- prelua datele de intrare de pe suport sau de la consolă;
- și executa calculele pentru care a fost scris;
- și tipărea sau afișea rezultate corecte și complete;
- și se încadra într-o durată de execuție decentă;
- și era realizat în termenii impuși de beneficiar.
Un program nu era bun dacăcel mult una dintre cerințe nu era îndeplinită, căci nimeni nu avea nevoie de un program care:
- nu intra în execuție că avea greșeli de compilare sau de editare de legături;
- cu citea toate datele;
- nu efectua toate calculele și se întrerupea subit execuția;
- nu așișea toate rezultatele sau afișea rezultate incorecte;
- nu era realizat la termenul cerut de beneficiar ci mai târziu;
- avea durate de execuție mult prea mari comparativ cu altele;
- îl chinuiau pe beneficiar cu interpretarea de rezultate.
Făcând translatarea conceptului de calitate de la celelalte produse pe care industria le realiza, în cazul calității software se dau nenumărate definiții pentru calitatea software, dintre care mie mi-a plăcut cea care spune că: prin calitate software se înțelege totalitatea însușirilor tehnice, economice și sociale cu care trebuie înzestrat un produs program astfel încât să fie utilizat de către cei interesați.
În vremurile de demult lumea nu era interesată:
- nici de a măsura calitatea programelor,
- nici de a estima calitatea programelor;
- nici de a urmări calitatea programelor,
- nici de a impune calitatea programelor,
- nici de costurile generate de programe,
- nici de amortizarea calculatoarelor,
ci era interesată de a găsi metode empirice pentru:
- a crește calitatea programelor,
- a-l mulțumi cu programul pe beneficiar,
- a reutiliza în timp programele,
- a se scrie programe cât mai complexe,
- a testa cât mai complet programele,
- a folosi cât mai bine resursele disponibile.
Când se studiază acum calitatea software, cărțile dau definiții, enumeră caracteristici, dau modele de estimare a niveurilor caracteristicilor și fac unele considerații referitoare la corelațiile dintre caracteristici. Mai identifică și căi de creștere a calității, precum și dezvoltă elemente de costuri ale calității și se fac remarci legate de optimizare.
În vremurile de demult, programatorii erau cei care discutau despre artificiile care le permiteau să facă să se termine orice program scris de ei cu mesaje proprii ale programului, adică să arate ce era greșit în datele de intrare de nu se ducea prelucrarea până la capăt. Chestia cu validările de date era și atunci ca și acum esențială și mă mir acum cumm unele aplicații sofisticate nu validează numele de persoană care nu trebuie să conținp cifre sau caractere bizare. Sunt stupefiat să văd aplicații mobile care permit introducerea de numere negative la cantitate. Sunt șocat să văd cum vin dezvoltatori cu aplicații netestate, pentru a se face de cacao și pentru a se comprtomite deplin și definitiv.



(08 decembrie 2017)


Asigurarea calității

Asigurarea calității a fost un obiectiv subânțeles în lumea programatorilor datorită:
- mândriei;
- erorilor;
- duratelor;
- renumelui;
- depanării;
- zvonurilor;
- efectelor;
- termenelor;
- admirației.
Orice programator se asigura că știe destul de bine să scrie programe pentru că și atunci ca și acum se punea problema traversării etapelor de realizare de la analiză, la scriere de text sursă, la testare, la implementare și la utilizare, această ultimă etapă revenea în peste 80% tot ptogrematorului, beneficiarul fiind cel care aducea cu tiile cu cartele de date.
Nu exista în legătură cu asigurarea calității ceea ce există acum, mai ales că perfecționarea programatorilor nu presupunea certificări și meseria nu se învăța, se fura. Asigurarea calității o făceau șefii de sectoare din centrele de calcul, prin distribuirea de sarcini acelor programatori despre care ei aveau certitudinea că scriu bine programe. Pe ceilalți îi arondau unor echipe la și alții. Programatorii de elită asigurau calitatea studiind variante de soluții și alegând una dintre ele, pe care o considerau cea mai potrivită.
Ei scriau pe hârtie formule, făceau diagrame, făceau calcule, schițau liste de parametrii. Când se apucau de scris programe știau cu excatitate ce scriu, căci foile de programare nu se șterg așa cum se șterg liniile de text sursă de pe monitor, când procesorul de texte suportă orice. Existența schemelor logice de detaliu arată că programatorul are o imagine completă asupra a ceea ce are de făcut. Numai faptul că etichetele în programele FORTRAN erau termenii unei progresii aritmetice cu primul termen 10 și cu rație, de asemenea, 10, spune foarte multe.
Asigurarea calității era realizată prin testul de birou, în care programatorul verifica bloc cu bloc schema logică, după care verifica existența concordanței dintre blocuri și instrucțiunile din program. În acele vremuri nu existau metrici, nici indicatori, numai că se știau:
- numărul de linii sursă al programului;
- numărul de erori de compilare la fiecare rulare;
- numărul erorilor de execuție;
- instrucțiunile de scriere rezultate intermediare;
- urma programului solicitată sau generată;
- raportarea în raport cu termenul de predare;
- analiza rezultatului predării programului.
Acum asigurarea calității produselor software este capitol de Software engineering și există cărți despre așa ceva. Una dintre ele este Software Quality Assurance a lui Daniel GALIN, apărută în anul 2004 în Editura Edisson Wesley, new York, de 587 de pagini,
Al cărui cuprins îl redau aici:
Contents
Preface xvii 
Unique features of this text xviii 
The book’s audience xix Acknowledgements xx 
Publisher’s acknowledgements xxi 
About the author xxii 
Guides for special groups of readers xxiii 
Guide to readers interested in ISO 9000-3 requirements xxiii 
Guide to readers interested in ASQ’S CSQE body of knowledge xxiv 
Part I Introduction 1
Chapter 1 The software quality challenge 3
1.1 The uniqueness of software quality assurance 4 
1.2 The environments for which SQA methods are developed 7 
Summary 11 
Review questions 
12 Topics for discussion 12
Chapter 2 
What is software quality? 14
2.1 What is software? 15 
2.2 Software errors, faults and failures 16 
2.3 Classification of the causes of software errors 19 
2.4 Software quality – definition 24 
2.5 Software quality assurance – definition and objectives 25 
2.6 Software quality assurance and software engineering 30 
Summary 30 
Selected bibliography 32 
Review questions 32 
Topics for discussion 33
Chapter 3 
Software quality factors 35
3.1 The need for comprehensive software quality requirements 36 
3.2 Classifications of software requirements into software quality factors 37 
3.3 Product operation software quality factors 38 
3.4 Product revision software quality factors 41 
3.5 Product transition software quality factors 43 
3.6 Alternative models of software quality factors 44 
3.7 Who is interested in the definition of quality requirements? 47 
3.8 Software compliance with quality factors 49 
Summary 51 
Selected bibliography 52 
Review questions 52 
Topics for discussion 54
Chapter 4 
The components of the software quality assurance system – overview 56
4.1 The SQA system – an SQA architecture 57 
4.2 Pre-project components 60 
4.3 Software project life cycle components 61 
4.4 Infrastructure components for error prevention and improvement 65 
4.5 Management SQA components 68 
4.6 SQA standards, system certification, and assessment components 69 
4.7 Organizing for SQA – the human components 70 
4.8 Considerations guiding construction of an organization’s SQA system 72
Part II Pre-project software quality components 75
Chapter 5 
Contract review 77
5.1 Introduction: the CFV Project completion celebration 78 
5.2 The contract review process and its stages 79 
5.3 Contract review objectives 80 
5.4 Implementation of a contract review 82 
5.5 Contract review subjects 85 
5.6 Contract reviews for internal projects 85
Contents
Summary 87 
Selected bibliography 88 
Review questions 89 
Topics for discussion 89 
Appendix 5A: Proposal draft reviews – subjects checklist 92 
Appendix 5B: Contract draft review – subjects checklist 94
Chapter 6 
Development and quality plans 95
6.1 Development plan and quality plan objectives 97 
6.2 Elements of the development plan 97 
6.3 Elements of the quality plan 101 
6.4 Development and quality plans for small projects and for internal projects 103 
Summary 106 
Selected bibliography 108 
Review questions 109 
Topics for discussion 110 
Appendix 6A: Software development risks and software risk management 112
Part III SQA components in the project life cycle 119
Chapter 7 
Integrating quality activities in the project life cycle 121
7.1 Classic and other software development methodologies 122 
7.2 Factors affecting intensity of quality assurance activities in the development process 131 
7.3 Verification, validation and qualification 133 
7.4 A model for SQA defect removal effectiveness and cost 135 
Summary 
143 Selected bibliography 145 
Review questions 146 
Topics for discussion 147
Chapter 8 Reviews 149
8.1 Review objectives 150 
8.2 Formal design reviews (DRs) 152
8.3 Peer reviews 158 
8.4 A comparison of the team review methods 168 
8.5 Expert opinions 
170 Summary 171 
Selected bibliography 
172 Review questions 
172 Topics for discussion 
174 Appendix 8A: DR report form 175 
Appendix 8B: Inspection session findings report form 176 
Appendix 8C: Inspection session summary report 177
Chapter 9 Software testing – strategies 178
9.1 Definition and objectives 180 
9.2 Software testing strategies 182
9.3 Software test classifications 187 
9.4 White box testing 189 
9.5 Black box testing 197 
Summary 209 
Selected bibliography 211 
Review questions 212 
Topics for discussion 213
Chapter 10 Software testing – implementation 216
10.1 The testing process 217 
10.2 Test case design 232 
10.3 Automated testing 235 
10.4 Alpha and beta site testing programs 245 
Summary 247 
Selected bibliography 249 
Review questions 250 
Topics for discussion 251
Chapter 11 Assuring the quality of software maintenance components 254
11.1 Introduction 255 
11.2 The foundations of high quality 257 
11.3 Pre-maintenance software quality components 261 
11.4 Maintenance software quality assurance tools 264 
Summary 273 
Selected bibliography 275 
Review questions 275
Topics for discussion 277
Chapter 12 Assuring the quality of external participants’ contributions 279
12.1 Introduction: the HealthSoft case 280 
12.2 Types of external participants 282 
12.3 Risks and benefits of introducing external participants 283 
12.4 Assuring quality of external participants’ contributions: objectives 286 
12.5 SQA tools for assuring the quality of external participants’ contributions 287 
Summary 293 
Selected bibliography 295 
Review questions 295 
Topics for discussion 296
Chapter 13 CASE tools and their effect on software quality 298
13.1 What is a CASE tool? 299 
13.2 The contribution of CASE tools to software product quality 302 
13.3 The contribution of CASE tools to software maintenance quality 304 
13.4 The contribution of CASE tools to improved project management 304 
Summary 305 
Selected bibliography 306 
Review questions 306 
Topics for discussion 307
Part IV Software quality infrastructure components 309
Chapter 14 Procedures and workinstructions 311
14.1 The need for procedures and work instructions 312 
14.2 Procedures and procedures manuals 313 
14.3 Work instructions and work instruction manuals 316 
14.4 Procedures and work instructions: preparation, implementation and updating 317 
Summary 318 
Selected bibliography 319 
Review questions 319 
Topics for discussion 320 
Appendix 14A: Design review procedure 322
Chapter 15 Supporting quality devices 325
15.1 Templates 326 
15.2 Checklists 329 
Summary 332 
Selected bibliography 333 
Review questions 333 
Topics for discussion 334
Chapter 16 Staff training and certification 335
16.1 Introduction: Surprises for the “3S” development team 336 
16.2 The objectives of training and certification 337 
16.3 The training and certification process 338 
16.4 Determining professional knowledge requirements 338 
16.5 Determining training and updating needs 339 
16.6 Planning training and updating programs 340 
16.7 Defining positions requiring certification 340 
16.8 Planning the certification processes 341 
16.9 Delivery of training and certification programs 342 
16.10 Follow-up subsequent to training and certification 344 
Summary 345 
Selected bibliography 346 
Review questions 347 
Topics for discussion 347
Chapter 17 Corrective and preventive actions 349
17.1 Introduction: the “3S” development team revisited 350 
17.2 Corrective and preventive actions – definitions 351 
17.3 The corrective and preventive actions process 352 
17.4 Information collection 353 
17.5 Analysis of collected information 354 
17.6 Development of solutions and their implementation 356 
17.7 Follow-up of activities 359 
17.8 Organizing for preventive and corrective actions 360 
Summary 361 
Selected bibliography 362 
Review questions 362 
Topics for discussion 363
Chapter 18 Configuration management 365
18.1 Software configuration, its items and its management 367 
18.2 Software configuration management – tasks and organization 369 
18.3 Software change control 371 
18.4 Release of software configuration versions 373 
18.5 Provision of SCM information services 380 
18.6 Software configuration management audits 380 
18.7 Computerized tools for managing software configuration 381 
Summary 382 
Selected bibliography 383 
Review questions 384 
Topics for discussion 384
Chapter 19 Documentation control 387
19.1 Introduction: where is the documentation? 388 
19.2 Controlled documents and quality records 389 
19.3 The controlled documents list 392 
19.4 Controlled document preparation 393 
19.5 Issues of controlled document approval 393 
19.6 Issues of controlled document storage and retrieval 394 
Summary 395 
Selected bibliography 396 
Review questions 397 
Topics for discussion 397
Part VManagement components of software  quality 399
Chapter 20 Project progress control 401
20.1 The components of project progress control 402 
20.2 Progress control of internal projects and external participants. 404 
20.3 Implementation of project progress control regimes 405 
20.4 Computerized tools for software progress control 406 
Summary 408 
Selected bibliography 409 
Review questions 
410 Topic for discussion 411
Chapter 21 Software quality metrics 412
21.1 Objectives of quality measurement 414 
21.2 Classification of software quality metrics 415 
21.3 Process metrics 416 
21.4 Product metrics 420 
21.5 Implementation of software quality metrics 427 
21.6 Limitations of software metrics 432 
Summary 434 
Selected bibliography 436 
Review questions 438 
Topics for discussion 440 
Appendix 21A: The function point method 442
Chapter 22 Costs of software quality 449
22.1 Objectives of cost of software quality metrics 450 
22.2 The classic model of cost of software quality 451 
22.3 An extended model for cost of software quality 455 
22.4 Application of a cost of software quality system 458 
22.5 Problems in the application of cost of software quality metrics 462 
Summary 463 
Selected bibliography 465 
Review questions 465 
Topics for discussion 468
PartVI Standards, certification and assessment 471
Chapter 23 Quality management standards 475
23.1 The scope of quality management standards 476 
23.2 ISO 9001 and ISO 9000-3 477 
23.3 Certification according to ISO 9000-3 481 
23.4 Capability Maturity Models – CMM and CMMI assessment methodology 485 
23.5 The Bootstrap methodology 490 
23.6 The SPICE project and the ISO/IEC 15504 software process assessment standard 492 
Summary 497 
Selected bibliography 
499 Review questions 500 
Topics for discussion 501 
Appendix 23A: CMMI process areas 502 
Appendix 23B: ISO/IEC 15504 model processes 505
Chapter 24 SQA project process standards – IEEE software engineering standards 507
24.1 Structure and content of IEEE software engineering standards 509 
24.2 IEEE/EIA Std 12207 – software life cycle processes 510 
24.3 IEEE Std 1012 – verification and validation 514 
24.4 IEEE Std 1028 – reviews 519 
Summary 521 
Selected bibliography 
524 Review questions 524 
Topics for discussion 525 
Appendix 24A: IEEE Software Engineering Standards 526 
Appendix 24B: MIL-STD-498: list of Data Item Descriptions (DIDs) 528 
Appendix 24C: Task structure for a primary process according to IEEE/EIA Std 12207 – example 528
PartVII Organizing for quality assurance 539
Chapter 25 Management and its role in software quality assurance 543
25.1 Top management’s quality assurance activities 544 
25.2 Department management responsibilities for quality assurance 549 
25.3 Project management responsibilities for quality assurance 550 
Summary 551 
Selected bibliography 552 
Review questions 553 
Topics for discussion 554
Chapter 26 The SQA unit and other actors in the SQA system 555
26.1 The SQA unit 556 
26.2 SQA trustees and their tasks 563 
26.3 SQA committees and their tasks 563 
26.4 SQA forums – tasks and methods of operation 564 
Summary 565 
Review questions 568 
Topics for discussion 568
Epilogue The future ofSQA 570
Facing the future: SQA challenges 571
 Facing the future: SQA capabilities 574
Author index 577 
Subject index 580
Se observă cu ușurință că pentru a face asigurarea calității și programatorul și analistul și testerul și toți cei ce sunt într-o companie dezvoltatoare de software trebuie să știe:
- ce este aceea calitatea software;
- care sunt caracteristicile de calitate;
- câteva modele sau indicatori de măsurare a carateristicilor;
- cum se culeg datele de intrare în modele și indicatori;
- să folosească  niște software care calculează indicatorii;
- să interpreteze rezultatele;
- să corecteze module pentru a le face să fie de calitate.
Între teorie și practică este mare diferență, iar practica este cea care arată dacă se face sau nu asigurarea calității software, căci nu trebuie constatată nici calitatea, nici non-calitatea, ci trebuie făcuți acei pași care să ducă spre texte sursă care să dovedească un nivel de calitate ridicat.
în lucru acum

(08 decembrie 2017)

Friday, December 8, 2017

Planificarea calității

Planificarea calității unui produs software înseamnă:
- a stabili care sunt caracteristicile de calitate esențiale;
- a găsi produse similare sau din aceeași clasă de complexitate;
- a găsi elemente comune ale acestora cu viitorul produs;
- a găsi niveluri pentru caracteristici care sunt satisfăcătoare;
- a construi un sistem de niveluri de calitate acceptabil;
- a adopta acele niveluri ca fiind ideale pentru noul produs;
- a estima costurile pentru a realiza acea calitate;
- a corecta niveluri dacă sunt costuri prea mari;
- a decide cum trebuie să arate calitativ noul produs;
- a demonstra că nivelul de calitate este superior;
- a exista asigurărică există există resurse pentru realizare.
Ca orice proces de planificare și planificarea calității unui produs software pornește de la premisele că:
- produsul nu există;
- însușirile de construiesc;
- au loc comparații;
- se fac calcule;
- se aleg niveluri;
- se folosesc similitudini;
- nivelul planificat este orientativ;
- pe parcurs se fac corecții;
- se obține doar o imagine;
- textul creat e coerent;
- nivelurile din plan sunt etaloane;
- activitatea se orientează spre plan.
Dacă înainte de 1989 planul era o obsesie națională, acum prin activitatea de planificare a calității, se face un tabel în care pe o coloană se trec caracteristici de calitate și pe o altă coloană se trec niveluri minime cu care produsul software ce se realizează trebuie înzestrat. Acele niveluri sunt justificate prin modul de comportament al unor produse software existente în piață și mai ales pornind de la exigențele proprii care au menirea de  a asigura un nivel de competitivitate superior celor aflate în exploatare curentă acum. Și în cazul planificării calității, ca și în cazul planificării duratei de realizare a produsului, există formule de calcul, care țin seama de nivelul calității planificat și estimările de costuri, care dau caracter realist abordării atât timp cât costul produsului este suportabil, comparabil și frecventabil pe la instituțiile financiare de unde se obțin credite sau orice altă formă de finanțare.
Planificarea calității presupune cunoașterea pieței de software căci a realiza un nou produs software înseamnă a-l înzestra cu caracteristici de calitate care să-l facă apreciat în piață de către viitorii utilizatori. Acest lucru se face prin comparație. Înseamnă că planificatorii trebuie să cunoască piața, să cunoască nivelurile efective ale caracteristicilor de calitate ale produselor software din piață. Intrarea pe piață este posibilă pentru un nou produs dacă și numai dacă nivelul indicatorului său de calitate agregat este superior oricărui alt produs similar ca funcționalități.
Programatorii de altădată nu aveau în gând explicit să-și planifice calitatea. Ei doreau ca:
- programele să fie bune, deci mental planificau calitativ nivelul calității agregate;
- utilizatorul să fie mulțumit, deci planificau nivelul indicelui de satisfacție;
- procesul de testare să fie lin, iar ondulanța să fie finită, deci planificau calitatea procesului;
- timpul necesar și cheltuielile să fie rezonabile, deci optimizau costul calității.
În felul lor erau niște manageri de calitate softwate, dar erau manageri tăcuți ai calității, pentru că nu se exprimau nici științific și nici măsurători de indicatori ai calității nu făceau și nici calitatea nu o estimau cumva.
Ca programator din antichitatea programării calculatoarelor știu cu exactitate că nimeni nu se preocupa despre:
- fiabilitatea software, deși fiabilitatea centralelor nucleare se studia intens;
- complexitatea software, deși chestia cu dublarea utilajelor era un mod ce crestere a sa;
- portabilitate în sine, ci de portabilitatea de a trece a programelor de pe IBM pe FELIX C 256;
- reutilizare, căci ideia de originalitate 100% era obsesia fundamentală și neîncrederea era maximă;
- lucru în echipă pentru că programarea nu se desprinsese de poezie în Internet nu exista;
- a identifica o serie de căi de creștere a calității, mai ales că se lucra sub presiunea termenelor.
Deși totul se planifica înainte de 1989, în zona informaticii, ca o altă formă de manifestare a artei pe lângă cele șapte recunoscute, planificarea nu a pătruns până în adâncul viscerelor economiei sale pentru că era un domeniu inaccesibil profanilor, calculatorul fiind regele. De aceea a planifica calitatea era și ceva misterios și ceva de nepătruns, dar mai ales ceva fluid, abstract și lunecos.





(08 decembrie 2017)

Caratcteristici de calitate

Caratcteristicile de calitate software formează o listă destul de consistentă. Fiecare generație de software a venit cu caracteristicile sale. De aceea studiul caracteristicilor de calitate vine să completeze istoria dezvoltării software, căci pentru un produs software realizat empiric cu totul altfel se punea problema să se analizeze calitatea în comparație un un produs software dezvoltat după tehnica programării orientate obiect OOP. Dintre caracteristicile de calitate cu care se lucrează în prezent enumăr:
- funcționalitate
- fiabilitate
- utilizabilitate
- eficiență
- mentenabilitate
- portabilitate.
Fiecare dintre aceste caracteristici are la rândul ei o serie de subcaracteristici derivate conform ISO 9126.
Subcarcateristicile fiabilității sunt:
- recuperabilitatea
- toleranța la defecțiuni
- maturitatea,
Eficiența unui produs software se măsoară prin:
- comportamentul în timp
- comportamentul resurselor.
Mentenabilitatea este strâns legată de subcaracteristicile:
analizabilitate
substituibilitate
stabilitate
testabilitate.
Portabilitatea are subcaracteristicile:
- adaptabilitatea
- instabilitatea
- conformitatea
- înlocuirea
- interschimbabilitatea.
Utilizabilitatea are subcaracteristicile:
- ușurința de instruire
- operabilitatea.
Funcționalitatea are subcaracteristicile:
- potrivirea
- corectitudinea
- interoperabilitatea
- conformitatea
- securitatea.
În elaborarea de standarde toate caracteristicile dar și subcaracteristicile sunt definite riguros și se vede că niciuna dintre acestea nu se suprapune cu o alta. În studiul calității software există și nenumărate atribute de calitate, pe care le preiau așa cum sunt ele date în limba engleză:
accessibility
accountability
accuracy
adaptability
administrability
affordability
agility
auditability
autonomy
availability
compatibility
composability
configurability
correctness
credibility
customizability
debugability
degradability
determinability
demonstrability
dependability
deployability
discoverability
distributability
durability
effectiveness
efficiency
evolvability
extensibility
failure transparency
fault-tolerance
fidelity
flexibility
inspectability
installability
integrity
interchangeability
interoperability
learnability
maintainability
manageability
mobility
modifiability
modularity
operability
orthogonality
portability
precision
predictability
process capabilities
producibility
provability
recoverability
relevance
reliability
repeatability
reproducibility
resilience
responsiveness
reusability
robustness
safety
scalability
seamlessness
self-sustainability
serviceability
supportability
securability
simplicity
stability
standards compliance
survivability
sustainability
tailorability
testability
timeliness
traceability
transparency
ubiquity
understandability
upgradability
vulnerability
usability.
Există multe modalități de a face adaptări pentru a da sensul cu care vorbitorii de limbă română îl au pentru unii termeni, ceea ce mă face ca de cele mai multe ori să nu traduc chiar toate subcaracteristicile sau toate atributele, care ar conduce către lucruri forțate.
Conceptul de atribut este mult mai larg și nu se bazează pe raporturi de subordonare, care în final duc la dilema cu cine a fost mai înainte, oul sau găina. Oricând există posibilitatea de a veni cu argumente care să răstoarne structura unui graf al dependențelor pe care se bazează raportul clasă-subclasă.


În imaginea de deasupra sunt prezentate caracteristicile și subcaracteristicile regrupate, așa cum le văd Francisca Losavio, Ledis Chirinos, Nicole Lévy și  Amar Ramdane-Cherif în articolul Quality Characteristics for Software Architecture, publicat în JOURNAL OF OBJECT TECHNOLOGY, Vol. 2, No. 2, 2003, pg. 133 - 150.
Lucrurile se complică foarte mult în cazul aplicațiilor online și a celor mobile căci un rol special îl au interfețele și tehnicile de programare fac să treacă pe planuri secunde fiabilitatea și portabilitatea. Caratcteristicile de calitate sunt atât de numeroase și se combină în nenumărate moduri încât este imposibil de stabilit care sunt componentele sistemului caracteristicilor de calitate pentru un anumit produs software.






(08 decembrie 2017)

Managementul calității software


Calitatea software
Calitatea procesului
Caratcteristici de calitate
Planificarea calității
Realizarea calității
Asigurarea calității
Controlul calității
Metrici software
Căi de creștere a calității
Optimizarea calității
Managementul total
Standarde de calitate




(08 decembrie 2017)

Metrici software

Metricile software sunt o colecție de indicatori utilizați în măsurarea nivelurilor unor caracteristici de calitate pe care clienții sau dezvoltatorii le consideră esențiale în demersul pe care îl urmăresc.
Dacă se intră pe google vor fi găsite nenumărate caracteristici de calitate software care sunt complet tratate complet cu definiții, cu modele, cu corelații între caracteristici și cu indicații speciale pentru modul în care se culeg date, se interpretează rezultatele și despre riscurile care apar când se fac estimări.
La construirea unei metrici există libertatea de a alege indicatorii, dar ideia este de a face o astfel de alegere încât să se asigure operaționalitatea, în ideia ca efortul de culegere a datelor să nu facă imposibilă repetarea operației în timp.
Este rezonabil să se studeiese:
- caracteristici de calitate;
- diversitatea de modele;
- avantaje și dezavantaje;
- efortul de a asigura continuitatea;
- mod efectiv de utilizare a rezultatelor.
Consider că sunt operaționale metricile în care:
- numărul de indicatori pe caracteristică este de 1 la 1;
- complexitatea indicatorilor este redusă;
- culegerea de date nu ridică probleme;
- există software de calcul indicatori;
- indicatorii sunt normați;
- metrica este stabilă pentru comparabilitate;
- și alte produse sunat analizate tot cu ele.
În timp am avut preocupări pe acest subiect pentru că una se vorbește și cu totul altfel stau lucrurile în realitate, lumea preferând teoria și mai puțin practica, deși de fiecare dată când se vorbește de calitate, trebuie să fie prezentate valori numerice și trebuie stabilite ipotezele de lucru. Am scris materiale:
  • Ion IVAN, Panagiotis SINIOROS, Mihai POPESCU, Felix SIMION – Metrici software, Editura INFOREC, Bucuresti, 119 pg., ISBN 973-97435-0-X, 1997
  • Ion IVAN, Doru CAZAN – Metricile de calitate ale sistemelor informatice, Informatica Economica, vol. 8, nr. 3, 2004, pg. 123 – 128, ISSN 1453-1305, 2004
  • Ion IVAN, Marius POPA – Tipuri de metrici ale textelor, Studii si cercetari de Calcul Economic si Cibernetica Economica, vol. 38, nr. 1, 2004, pg. 25 – 36, ISSN 0585-7511., 2004
  • Ion IVAN, Constantin NICULAE, Paul POCATILU – Metrici pentru evaluarea coeziunii software orientat obiect, Studii si Cercetari de Calcul Economic si Cibernetica Economica, vol. 37, nr. 3, 2003, pg. 5 – 14, ISSN 0585-7511., 2003
  • Ion IVAN, Paul POCATILU, Mihai AMITROAIE, Metrici ale societăţii informaţionale, revista Informatica Economică, vol. 5, nr. 4, 2001, pg. 33 – 40, ISSN 1453-1305, 2001
  • Ion IVAN, Alexandra KARADIMOU, Adrian LICURICEANU, Gheorghe LUPU - Metrici de complexitate software bazate pe dependenţele instrucţiunilor, revista Informatica Economică, vol. 3, nr. 3, 1999, pg. 11 – 19, ISSN 1453-1305, 1999
  • Ion IVAN, Gheorghe LUPU, Adrian LICURICEANU – Substituirea de metrici software, Studii si Cercetari de Calcul Economic si Cibernetica Economica, vol. 33, nr. 1/1999, pg.25 – 33. , 1999
  • Alexandru BALOG, Ion IVAN, Extensii ale metricii Halstead pentru sisteme de programare, PC WORLD ROMANIA, an 5, nr.5, 1997, pag.86-87, 1997
  • Ion IVAN, Daniel VERNIS, Petrisor OPREA - Metrici pentru compresia fişierelor, revista Informatica economica, vol1, nr. 2/ 1997, pg. 100 – 104, ISSN 1453-1305, 1997
  • Ion IVAN, Felix SIMION, Emilia STANCIU, Alexandra KARADIMOU - Metrici ale re-ingineriei software, revista Informatica Economică, vol. 1, nr. 3/ 1997, pg. 27 – 34, ISSN 1453-1305, 1997
  • Ion IVAN, Felix Simion, Viorel Nica - Gradul de interferenta al metricilor Halstead si McCabe, Revista Romana de Informatica si Automatica, vol. 7, nr. 3, 1997, pg. 23-28, ISSN 1220-1758. , 1997
  • Ion Ivan, Popescu Mihai - Metrici software, BYTE România, vol. 2, nr. 5, mai 1996, pg. 73-82, ISSN 1223-9801. , 1996
  • Ion IVAN, Adrian VISOIU - Rafinarea metricilor software, Economistul, nr. 1947 (2973), 29 august 2005, supliment Economie teoretica si practica, nr. 466
  • Tudor BARON, Alexandru BALOG, Ion IVAN – Aspecte privind definirea metricilor pentru evaluarea calitatii produselor program, volumul Lucrarile celui de al III-lea Simpozion Modelarea Cibernetica a Proceselor de Productie, 22-23 Aprilie, 1982, Bucuresti, pg. 573-580.
  • Ion IVAN, Gheorghe NOSCA, Andrei TUDOREL, Paul POCATILU, Razvan CACIULA – Metrici ale datelor care sunt intrari si iesiri pentru pachetele de programe aflate in uz curent la societatile de servicii informatice, studiu pentru contractul METODE SI INSTRUMENTE SOFTWARE DE EVALUARE A SOCIETATILOR DE SERVICII INFORMATICE, Act aditional nr. 821/98/III la contractul nr. 1253, 198/1996, Beneficiar: ANSTI 
  • Ion IVAN, Gheorghe NOSCA, Ludovic TOVISSI, Valerie VOICA, Maria BODNAR Christina SUCIU, Catalion HUIDUMAC, Paul POCATILU – Definirea indicatorului agregat de evaluare a calitatii productiei conform ISO9000, studiu pentru contractul ASISTAREA INFORMATIZATA A ACTIVITATILOR DE ASIGURARE A CALITATII CONFORM ISO9000 PENTRU INTREPRINDERI MICI SI MIJLOCII, act aditional nr. 821/98/III la contractul nr. 1253, 198/1996, Beneficiar: MCT. 

Pentru a construi o metrică se procedează astfel:
- se stabilește obiectivul metricii
- se identifică acele caracteristici esențiale
- se stabilesc factorii de influență
- se ierarhizează factorii
- se construiește lista factorilor esențiali
- se culeg date reprezentative
- se construiesg grafice ale dependențelor
- se identifică exresii analitice
- se stabilește criteriul de selecție
- se fac estimări
- se ierarhizează indicatorii în raport cu criteriul
- se construiește metrica
- se validează metrica
- se analizează stabilitatea metricii.
Se asociază o diagramă, căci procesul de alcătuire a unei metrici este un proces iterativ, fără a pleca de la idei preconcepute. Este rezonabil ca metrica să conțină indicatori normați pe intervalul [0; 1] cu ipoteza că valorile apropiate de zero duc la concluzia că produsul software nu este înzestrat cu acea caracteristică, în timp ce dacă valoarea indicatorului se apropie de unu înseamnă că produsul software este înzestreat cu acea caracteristică.



în lucru acum

(08 decembrie 2017)

Optimizarea calității

Optimizarea calității este o problemă spinoasă. Toată lumea vrea calitate de nivel maxim, numai că acest deziderat ori costă foarte mult, ori este foarte greu de realizat.
Se știe din experiența proprie a fiecărui programator că atunci când dorește să crească nivelul unei caracteristici de calitate apar efecte adverse. Când se urmărește creșterea fiabilității înseamnă că se introduc tot felul de teste, ceea ce duce la creșterea complexității produsului. Dacă se face un desen, efortul de reducere a cazurilor de căderi accidentale ale unui produs software este însoțită de creșterea exponențială a costurilor de programare și de testare pentru a atinge acest deziderat.


unde:
nf - nivelul nonfiabilității
cost- cheltuieli de programare
o - punctul unde se află costul optim al calității
t - axa timpului
c - axa costurilor.
Societatea nuși permite să cheltuiasă oricât pentru a realiza un nivel maxim de calitate. Deci se acceptă un minim rezonabil al defectelor. În realitate se demonstrează că nu există niciun program perfect, mai ales dacă are un nivel de complexitate oarecare. 
În timp am avut astfel de preocupări de a studia optimizarea calității software și aici prezint unele materiale publicate care vor fi referite prin:
  • Ion IVAN, Gheorghe NOSCA – Optimizarea costului calitatii sistemelor de programe, PC World, vol. 3, nr. 6, 1995, pg. 58-60
  • Ion IVAN, Paula APREUTESEI, Gheorghe NOSCA – Optimizarea costului calitatii sistemelor de programe, A XXVI – a Sesiune de Comunicari Stiintifice cu participare Internationala, Academia Tehnica Militara, 16-17 Noiembrie, 1995, vol. 5 de Comunicari, Sectiunea Informatica si Automatizarea conducerii trupelor, pg. 44-51.
  • Ion IVAN, Romulus ARHIRE, Alexandru BALOG - Modele ale estimării costurilor pentru produse-program, în volumul Conferinţei Naţionale de Cibernetică- Cibernetica in slujba dezvoltării economico-sociale a ţării, coordonatori Mihai FLORESCU, Eugeniu Niculescu MIZIL, Editura Academiei, Bucureşti, 1983, pg. 122-126

În 04.12.2003.. Gheorghe NOȘCA a susținut în ASE teza de doctorat intitulată Metode si tehnici de optimizare a costului calitatii produselor program, teză pe care am coordonat-o eu.
Optimizarea calității în zona de software este un concept puțin cam exagerat, căci mai corect este îmbunătățirea calității, întrucât creșterea calității se face pas cu pas, iterativ, prin încercări succesive. Se știe când începe procesul de îmbunătățire, iar stoparea este dată de mulți factori, inclusiv de identificarea momentului când tot umblând pe textul sursă, în loc să se îmbunătățească performanțele, acestea scad chiar surprinzător de dramatic.


în lucru acum

(08 decembrie 2017)

Căi de creștere a calității

Căile de creștere ale calității produselor program sunt nenumărate, dar dintre ele enumăr:
- nivelul de calificare; cu cât este mai ridicat, cu atât crește și calitatea;
- experiența acumulată pe tipologii de funcționalități;
- nivelul de exigență din companie;
- urmărirea stilului de programare unitar și selectat;
- asigurarea unei transparențe maxime pentru codul scris;
- utilizarea de componente verificate din biblioteci;
- difernțierea programatorilor;
- gestionarea efectelor de ondulanță;
- normarea clară a duratelor pentru activități;
- utilizarea de tehnici și de instrumente performante;
- utilizarea de prototipuri de programe;
- reutilizarea de componente software;
- omogenizarea în sus a echipelor de programatori;
- folosirea de reguli stricte în scrierea de programe;
- testarea după reguli foarte exacte a programelor;
- măsurarea permanentă a calității software;
- existența unei echipe care analizează calitatea software.
Căile de creștere a calității depind de la companie la companie, dar știind că în dezvoltarea de software peste 90% din costuri sunt cu salariile, toate căile trebuie concentrate pe forța de muncă. Trebuie văzut ce se va face cu programatorii, cu analiștii și cu testerii ca ei să prin munca lor să ducă la creșterea calității produselor pe care le realizează.





(08 decembrie 2017)

Creșterea fiabilității software

DESIGN PATTERNS – CALE DE CREŞTERE A FIABILITĂŢII SOFTWARE


             Ion IVAN                                                                                Liviu MIJACHE
                                                                            



Rezumat: Una dintre cele mai noi şi puternice posibilităţi de creştere a fiabilităţii software este folosirea design pattern ca modalitate de proiectare a unor aplicaţii software care să răspundă cerinţelor crescânde de fiabilitate. Sunt prezentate concepte de bază, efectele acestui mod de lucru şi se propun modalităţi de evaluare pentru fiabilitate.

Cuvinte cheie: Pattern, design, fiabilitate, enterprise applications

Software actual se confruntă cu frontiera complexităţii. Pe de-o parte se aşteaptă ca aplicaţiile software să facă să funcţioneze, fără erori, sisteme mari, precum si reţele de astfel de sisteme, cum sunt: reţelele electrice, sistemele de control al traficului aerian, reţelele ale sistemelor financiare, sisteme militare de comandă şi control, Internet. Tot al fel se aşteaptă ca aplicaţiile software să conducă activităţile diverselor echipamente cum sunt: monitorizarea implantului de inimă, diagnosticarea folosind instrumente nanometrice, protezele digitale. Sistemele de dimensiuni mari, care cuprind de la câteva sute până la câteva mii de platforme, milioane de linii de cod, miliarde de byte de date, au devenit rapid foarte populare. Pe de altă parte de la toate aceste sisteme se aşteaptă să funcţioneze la nivele din ce în ce mai înalte de fiabilitate, securitate şi siguranţă. Aceste două caracteristici  - creşterea rapidă a dimensiunilor şi a complexităţii – sunt cauzele principale pentru problemele actuale ale dezvoltatorilor de sisteme şi aplicaţii software. De aici apar cele mai multe erori şi aici trebuie îmbunătăţit procesul de dezvoltare a aplicaţiilor software.


  1. Fiabilitatea Software

În continuare se va face referire la aplicaţiile informatice cu caracter economic, dedicate structurilor organizaţionale orientate spre producţie şi servicii Enterprise Applications - EA. Acum când aplicaţiile Web influenţează totul, începând cu experienţa clienţilor până la relaţia cu vânzătorii, fiabilitatea sistemelor informatice ale organizaţiilor sunt în creştere, devenind critice pentru companii, clienţi, şi parteneri de afaceri. Pentru că o cădere a unei aplicaţii va duce la o afacere pierdută şi la costuri semnificative de reparare, şi pentru că Internet este întotdeauna deschis pentru afaceri, companiile solicită ca fiabilitatea EA, să fie de 24 de ore timp de 7 zile. Internet a făcut din informaţie şi în mod imediat şi din accesarea fără eroare a acesteia bunul cel mai valoros pentru o companie.

EA reprezintă o colecţie de hardware, servicii ale sistemului de operare, componente software, şi de cele mai multe ori procese umane care sunt concepute pentru a colabora în scopul asigurării serviciului de procesare aşteptat. Fiabilitatea întregii aplicaţii depinde foarte mult de fiabilitatea fiecărei componente. Pentru că toate componentele dintr-un sistem sunt în strânsă legătură, o cădere a unei componente va afecta fiabilitatea altora.

Căderile aplicaţiilor survin în urma a mai multe aspecte dintre care amintim:

Ø  testare inadecvată,
Ø  probleme ale schimbării managementului,
Ø  erori de operare,
Ø  cod slab calitativ,
Ø  lipsa unui proces de asigurare a calităţii,
Ø  interacţiuni cu servicii sau aplicaţii externe,
Ø  condiţii de operare diferite - grade de folosire mai mari, supraîncărcare ,
Ø  evenimente întâmplătoare - căderi de securitate,
Ø  căderi hardware - hard-disk-uri, echipamente de reţea, servere, surse de energie, memorie, CPU,
Ø  probleme legate de mediu - energia, răcirea, focul, praf, dezastre naturale.
Pe scurt fiabilitatea software se referă la cât de bine o aplicaţie asigură cu acurateţe, fără eroare, conform serviciul care a fost definit în specificaţiile funcţionale. În plus faţă de cât de mult rulează o aplicaţie fără eroare, fiabilitatea software se mai referă şi la oferirea rezultatelor corecte şi la detecţia şi recuperarea erorilor cu scopul de a evita căderile.
Fiabilitatea unui sistem este o măsură a abilităţii sistemului de a funcţiona în timp fără a înregistra căderi. în funcţie de sistem, e posibil ca fiabilitatea pe termen lung să nu reprezinte o preocupare pentru cei ce dezvoltă sistemul. De exemplu, să considerăm un sistem de auto-aterizare. Cerinţa de disponibilitate a sistemului este ridicată - trebuie să fie disponibil în momentul când primeşte o cerere de aterizare. Pe de altă parte, cerinţa de fiabilitate este destul de redusă în sensul că sistemul nu trebuie să rămână operaţional pentru o lungă perioadă de timp. Fiabilitatea unui sistem este măsurată în mod normal ca timpul mediu până la cădere Mean Time To Failure , durata de viaţă aşteptată a sistemului.
MTTF = Ore de lucru /Numărul de căderi

De exemplu dacă echipa de design se aşteaptă ca aplicaţia să ofere o fiabilitate de o cădere la fiecare 30 de zile de operare timp de 24 de ore pe zi, adică o cădere la fiecare 720 de ore de funcţionare. Testarea va dovedi că aplicaţia rulează corect timp de 1800 de ore şi înregistrează numai două căderi, rezultă că MTTF = 1800/2 = 900 ore. Altfel spus ne vom aştepta ca aplicaţia să ruleze aproximativ 900 de ore între două căderi succesive. În acest exemplu fiabilitatea a depăşit parametrii din design. De aceea o noţiune importantă a fiabilităţii software este aceea că o cădere software va apărea doar în momentul în care aplicaţia este disponibilă şi se execută.

Consecinţele căderilor variază de la a nu asigura serviciul, până la asigurarea unui serviciu incorect, şi până la a genera date corupte şi a afecta stabilitatea sistemului. În timp ce unele dintre căderi sunt doar inconveniente, alte căderi variază de la întreruperi cauzatoare de pierdere de timp atunci când un sistem de achiziţie nu este prea solicitat pentru a mai răspunde unei noi cereri de achiziţie, până la inconveniente serioase cum ar fi un sistem bursier care nu mai are resurse pentru a mai accepta o nouă autentificare  şi până la catastrofe majore în cazul căderii unui sistem de navigaţie al unei nave.

  1. Design Patterns

În mod tradiţional fiabilitatea software este privită din punctul de vedere al comportamentului produsului existent în comparaţie cu nivelurile planificate înaintea ciclului de realizare. Căile de creştere tradiţionale vizează un produs existent şi modificări pe acesta în vederea eliminării de erori.

Abordarea modernă a fiabilităţii vizează definirea de tehnici şi metode care interacţionează pe toată durata proceselor specifice ciclului de realizare asigurând ca fiecare stadiu al producţiei software să aibă un nivel de fiabilitate ridicat. Este un mod activ de creştere a fiabilităţii software în timpul proiectării, a codificării, respectiv în timpul celorlalte etape ale ciclului de realizare. Nu se mai aşteaptă efectuarea modificărilor pe un produs finit ci, se intervine în timpul procesului pentru a utiliza astfel de resurse încât ceea ce se obţine să fie fiabil.

Software bazat pe componente este o tehnologie eficientă de creştere a productivităţii dezvoltatorilor şi de creştere a calităţii software în general. Din nefericire multe dintre componente nu întrunesc specificaţiile iniţiale, chiar şi cele care sunt construite folosind arhitecturi middleware populare cum sunt: COM+, EJB, CORBA Component Model. Motivul pentru aceasta sunt simple: modelele pentru componente middleware furnizează numai infrastructura care formează elementele de bază pentru construirea sistemelor software complexe. În mod particular, designul specific al componentelor, aspectele legate de evoluţia, configurarea, distribuţia, concurenţa, scalabilitatea componentelor nu sunt prezentate de modelele convenţionale ale componentelor.  Rezolvarea eficientă a acestor aspecte rămâne în responsabilitatea dezvoltatorilor. Pentru crearea unei componente de succes pe lângă rezolvarea corectă a problemei specifice, trebuie să se implementeze complet serviciile si funcţiile necesare fiecărui model.

Design Pattern este o disciplina de rezolvare a acestor problemele software care s-a dezvoltat în rândul comunităţii programatorilor de aplicaţii orientate-obiect. Scopul principal al comunităţii de dezvoltatori ce folosesc patterns este acela de a crea o literatură de bază care să îmbunătăţească designul şi dezvoltarea în general.  DP au devenit populari odată cu descrierea unora dintre aceştia în [GoF95].

În această disciplină se utilizează terminologia în limba engleză, pentru că dezvoltarea tehnologiilor a fost făcută în limba engleză. Astfel termenul pattern este asimilat direct în limba română la fel ca termenul software. Pattern este folosit pentru a desemna un set de elemente cheie după care se pot realiza soluţii pentru o anumită clasă de probleme similare. Formele la plural au fost asimilate tot în limba engleză. Numele diferiţilor patterns au fost preluate tot în limba engleză pentru a se identifica uşor cu cele din terminologia de specialitate. Desigur că se pot adapta şi traduce denumirile, dar în acest mod s-ar crea confuzie între denumirile în română şi cele în engleză şi de aceea am preferat adoptarea denumirilor internaţional recunoscute.

Patterns au rădăcini în multe discipline inclusiv literatura de programare, dar în mod special în cartea despre panificarea urbană şi arhitecturile clădirilor[ALEX79]. El afirmă acolo că “fiecare pattern este o regulă tripartită, care exprimă relaţia între un anume context, o problemă şi o soluţie”. Un pattern ca element de lucru exprimă o relaţie între un anume context, un anume sistem de forţe care apar în mod repetat în acel context şi o anume configuraţie spaţială care permite acestor forţe să fie rezolvate. Ca element de limbaj, un pattern este o instrucţiune, care arată cum va fi folosită în mod repetat, această configuraţie spaţială, pentru a rezolva sistemul de forţe dat, de fiecare dată când contextul este relevant.

Drept urmare se afirmă că din punct de vedere software, fiecare pattern este  o regulă tripartită care exprimă o relaţie între un anume context, un anume sistem de forţe care se manifestă în mod repetat în acel context, şi o anumită configuraţie software care permite acestor forţe să se anuleze.

În general un pattern are patru elemente esenţiale: numele pattern, problema, soluţia, consecinţele.

Numele pattern este un element folosit pentru descrierea unei probleme de design, a soluţiei, şi a consecinţelor. În general conţine unul sau 2 cuvinte. Numele pattern ne permite să sporim vocabularul de design, şi să proiectăm la un nivel superior de abstractizare. Astfel folosirea numelui ne permite să rezumăm o cantitate apreciabilă de informaţie în doar câteva cuvinte, ceea ce face comunicarea  cu colegii, sau alţi designeri mult mai uşoară

Problema descrie când se aplică pattern. Explică problema şi contextul ei. Descrie probleme specifice de design cum sunt modul de reprezentare al algoritmilor ca obiecte; descrie clase sau structuri de obiecte care sunt fixe ca design. Uneori problema include o lista de condiţii care trebuiesc îndeplinite pentru a avea sens aplicarea pattern.

Soluţia descrie elementele care formează designul, relaţiile, responsabilităţile şi colaborările. Soluţia nu descrie un design particular concret sau o anume implementare, pentru că un pattern este ca un şablon care va fi aplicat în multe situaţii diferite. În schimb pattern asigură o descriere abstractă  a problemei de design  şi cum se aranjează în general elementele, clase şi obiecte, pentru rezolvarea ei.

Consecinţele sunt rezultatul şi urmările aplicării pattern. Deşi consecinţele nu sunt prezentate de cele mai multe ori când descriem deciziile de design, ele sunt critice pentru evaluarea alternativelor de design precum şi a costurilor şi beneficiilor aplicării lor. Consecinţele pentru software se referă cel mai adesea la echilibrul spaţiu – timp. Prezintă de asemenea probleme legate de limbaje şi implementare. Pentru că reutilizarea este un factor important în designul software orientat obiect, consecinţele unui pattern includ impactul asupra flexibilităţii sistemului, extensibilităţii sau a portabilităţii. Listarea acestor consecinţe ajută şa înţelegerea şi evaluarea lor.

Numele unui DP abstractizează şi identifică aspectele cheie ale unei structuri de design comune care face utilă crearea unui design orientat obiect, reutilizabil. DP identifică clasele şi instanţele, rolurile şi colaborările precum şi distribuţia responsabilităţii lor. Fiecare DP prezintă o anumită problemă de design, şi descrie când se aplică această soluţie în contextul constrângerilor de design existente, şi a consecinţelor aplicării acesteia.

Un PL defineşte o colecţie de patterns şi regulile pentru combinarea lor într-o arhitectură. Limbajele de pattern descriu framework-uri sau familii unitare de sisteme. Un framework este  un set de clase care cooperează şi care fac posibil reutilizarea designului pentru o anumită clasă de aplicaţii software. De exemplu un framework ajută la construirea unor compilatoare pentru limbaje diferite şi pentru platforme ţintă diferite; sau ajută la modelarea unor aplicaţii financiare. Un framework se customizează pentru o aplicaţie particulară, prin crearea unor subclase specifice aplicaţiei prin moştenirea unor clase abstracte ale framework-ului.

Deşi se numesc DPs, în realitate nu se referă numai la design, ci vin să schimbe modul tradiţional de gândire despre analiza, designul şi implementarea aplicaţiilor software. Pentru aceasta DPs propun crearea de noi nivele de abstractizare. De fiecare dată când se abstractizează ceva, se izolează practic detaliile particulare de restul problemei, cu scopul declarat de a separa lucrurile care se schimbă de lucrurile care rămân la fel. Astfel fiabilitatea respectivei probleme supuse abstractizării este separată în fiabilitatea lucrurilor modificabile şi fiabilitatea lucrurilor care rămân la fel. Se pleacă de la premisa că aducerea a cât mai multe lucruri care rămân la fel într-o problemă anume va duce la o fiabilitate sporită. Practic părţile care rămân fixe sunt considerate a avea o fiabilitate maximă, diferenţa fiind făcută de părţile modificabile, care sunt considerate a avea o fiabilitate mai mică. Cu cât rămân mai puţine astfel de părţi, şi cu cât fiabilitatea părţilor fixe este mai mare se afirmă că fiabilitatea produsului pe ansamblu a crescut.

Un pattern se spune că este bun dacă:

Ø  rezolvă o problemă: pattern prezintă o soluţie nu doar principii abstracte sau strategii;
Ø  este un concept dovedit: pattern prezintă o soluţie cu rezultate urmărite, nu doar teorii sau speculaţii;
Ø  soluţia nu este evidentă: multe dintre tehnicile de rezolvare a problemelor - de exemplu paradigmele sau metodele de design software, încearcă se deriveze soluţiile plecând de principii; cele mai bune patterns generează soluţii indirecte pentru o problemă anume, abordare necesară pentru cele mai dificile probleme de design;
Ø  descrie o relaţie: patterns nu numai că descriu module, dar descriu structuri şi mecanisme interne acestor module;
Ø  are o componenta umană semnificativă: toate aplicaţiile software servesc confortului uman şi calităţii vieţii; de aceea cei mai buni patterns se referă explicit la utilitate şi estetică.


  1. Categorii de design patterns

Au fost identificate următoarele categorii de patterns:

Ø  idiom:  se referă la modul în care este scris codul într-un limbaj particular, pentru a rezolva o anume problemă;
Ø  design specific: prezintă soluţia cu care se vine pentru rezolvarea unei anumite problemă;
Ø  design standard: se referă la modul în care se rezolvă un anumit tip de problemă; de cele mai multe ori sunt patterns care au devenit generali datorită reutilizării;
Ø  design pattern: prezintă modul în care se rezolvă o clasă întreagă de probleme similare; de cele mai multe ori aceştia apar după aplicarea de mai multe ori a unui design standard, şi apoi găsirea unui pattern comun în toate acele aplicaţii.

În [GoF95] sunt discutaţi 23 de patterns diferiţi, clasificaţi după trei scopuri, fiecare dintre aceste scopuri referindu-se la un anume aspect care variază: creaţional, structural şi comportamental.

Creaţional: cum este creat un obiect. Acest lucru implică adesea izolarea detaliilor de creare a unui obiect astfel încât codul să nu fie dependent de ce tipuri de obiect sunt, în aşa fel încât să nu fie necesară modificarea codului când se adaugă un nou tip de obiect. În această categorie sunt incluşi patterns denumiţi: Singleton, Factory Method şi Prototype

Structural: proiectarea obiectelor pentru satisfacerea constrângerilor particulare ale proiectului. Aceasta se referă la modul în care obiectele sunt conectate între ele pentru ca schimbările din sistem să nu necesite schimbări ale acestor conexiuni.

Comportamental: obiectele care sunt responsabile cu un anume tip de acţiuni dintr-un program . Acestea încapsulează procese care se doresc a se executa, de exemplu interpretarea unui limbaj, răspunsul la o cerere, implementarea unui algoritm. În această categorie sunt incluşi denumiţi: Observer şi Visitor

Un alt criteriu pentru clasificarea DPs, ţine cont dacă un pattern se aplică pentru clase sau pentru obiecte. Patterns pentru clase se ocupă cu relaţiile dintre clase şi subclasele aferente. Aceste relaţii sunt stabilite prin moştenire, aşa că sunt statice – la momentul compilării. Patterns pentru obiecte sunt răspunzători cu legăturile dintre obiecte, care se  modifică la momentul rulării şi sunt mult mai dinamici.

Ulterior acestei abordari, care este considerată ca fiind definitoare pentru conceptul de design patterns, pornind de la aceşti 23 de patterns s-au dezvoltat numeroşi alţii, din ce in ce mai complecşi, care au fost clasificaţi în noi categorii. În ultimii ani patterns au început sa fie clasficaţi în funcţie de scop, domeniul de aplicabilitate şi de etapa din cadrul ciclului de dezvoltare referită. În tabelele nr. 1, 2 şi 3 sunt prezentaţi o suită de patterns reprezentativi, clasificaţi după aceste categorii. Se observă includerea între aceştia a tutror celor 23 de patterns iniţiali precum şi participarea aceestora la definirea altora.

Tabelul nr. 1 Clasificarea DPs în funcţie de scop

Scop
Design Pattern
Descriere


DPs
Fundamentali
Abstract Superclass
Asigură o unitate conceptuală a unui set de clase
Delegation
O modalitate de extindere si folosire a unei clase
Immutable
Nu permite informaţiilor despre un obiect să fie modificate după ce acesta a fost construit
Interface
Instanta unei clase ofera servicii si date unei instantei a altei clase.
Interface and Abstract Class
O clasă care implementează o interfaţă şi extinde o clasa abstractă
Marker Interface
O clasă care implementează o interfaţă pentru a indica valoarea booleană a unui atribut al unei alte clase
Proxy
O modalitate de a accesa un obiect prin intermediul altuia

DPs
Creaţional
Abstract Factory
O modalitate de a crea un obiect care implementează un set de interfeţe similare.
Builder
O modalitate de construire a unui obiect complex
Factory Method
Un obiect care reprezintă date externe sau procesează evenimente externe.
Object Pool
Permite refolosirea obiectelor care sunt greu de creat sau care sunt create într-un număr limitat.
Prototype
Permite unui obiect sa creeze copii ale lui însuşi
Singleton
Asigură instanţierea unui singur obiect dintr-o anumită clasa

DPs de Partiţionare
Composite
Permite crearea recursivă de obiecte similiare într-o manieră similară unui arbore
Filter (Pipe)
Permite obiectelor sa fie conectate dinamica pentru a realiza operaţii pe şiruri de date
Read-Only Interface
Asigură modificarea unui obiect numai de către unii dintre clienţii lui



DPs
Structural
Adapter
Implementează o interfaţa cunoscută clienţilor săi asigurând acces la o interfaţă necunoscută clienţilor săi
Bridge
Impelementează abstractizările şi implementările în clase separate permiţând combinarea lor dinamică
Cache Management
Permite accesarea rapidă a unor obiecte care în alt fel ar dura mai mult
Decorator
Extinde funcţionalităţile unui obiect într-un mod transparent clienţilor săi
Dynamic Linkage
Permite unui program să încarce la cerere diferite clase care implementează o interfaţă cunoscută
Façade
Simplică accesul la un set de obiecte prin intermediul unui obiect pe care toate celelate obiecte il folosesc ca sa comunice cu setul.
Flyweight
Permite partajarea unei informaţii comune între mai multe instante ale aceleiasi clase
Iterator
Defineşte o interfaţă care declară metode pentru accesul secvenţial la obiectele dintr-o colecţie
Virtual Proxy
Ascunde inexistenţa unui obiect printr-un  altul care implementează aceeaşi interfaţă permiţând intarzierea instanţierii celui din urmă



DPs
Comportamen-
tal
Chain of Responsibility
Permite unui obiect transmiterea unei comenzi fără să ştie ce obiect sau ce tip de obiecte o vor recepţiona
Command
Incapsulează comenzile în obiecte pentru o uşoară manipulare a lor
Little Language / Interpreter
Permite definirea unui mic limbaj care sa faciliteze rezolvarea unui set similar de probleme
Mediator
Foloseşte un obiect pentru a coordona schimbarea stărilor unor alte obiecte
Null Object
Defineşte o alternativă la folosirea null pentru a indica absenţa unui obiect
Observer
Permite înregistrarea dinamică de către un obiect a obiectelor care depind de el în vederea notificării
Snapshot
Permite creare de imagini ale stării unui obiect astfel încat aceasta să fie refăcută ulterior
State
Incapsulează starea unui obiect ca obiecte discrete
Strategy
Încapsulează algoritmi similari în clase care sunt subclase ale unei superclase comune.
Template Method
O clasa abstractă care conţine doar o parte din logica necesară realizării scopului
Visitor
Permite realizarea unei anume operaţii pentru mai multe obiecte prin definirea unei clase separate cu logica necesară realizării operaţiei.




DPs de Concurenţă
Asynchronous Processing
Asigură o coadă de procese pentru executarea lor asincronă.
Balking
Dacă o metodă este apelată în momentul în care obiectul nu o poate executa atunci se asigură ca acea metodă nu execută nimic
Double Buffering
Asigură producerea de date asincrone astfel încât acestea sa fie pregătite înainte ca ele să fie necesare
Future
Incapsulează toată logica astel încât pentru client să nu conteze daca procesarea este sincronă sau nu
Guarded Suspension
Asigură execuţia unei metode până când este îndeplinită o condiţie
Lock Object
Asigură un obiect unitar care să solicite acces unic la mai multe obiecte
Producer-Consumer
Coordonează producţia şi consumarea asincronă de informaţii şi obiecte
Read/Write Lock
Asigură acces concurent la citire şi acces exclusiv la scriere
Scheduler
Controlează ordinea în care sunt executate metodele unui singur fir de execuţie
Single Threaded Execution
Previne apelurile concurente la o metodă să ducă la executarea concurentă a metodei
Two-Phase Termination
Asigură ordonarea încheierii unui proces sau unui fir de execuţie



Tabelul nr. 2 Clasificarea DPs în funcţie de etapa de dezvoltare
Etapa
Design Pattern
Descriere


DPs cu Responsabilită
ţi Generale
Controller  
Adaugă un eveniment care să decupleze clasa sursa a unui eveniment de clasa sursă care il rezolvă.
Creator  
Determină care clasă crează o instanţă a unei alte clase
Expert  
Adaugă responsabilitate unei clase care deţine informaţia necesară pentru realizarea responsabilităţii
Law of Demeter  
Daca două clase nu trebuie să ştie de prezenţa celeilalte atunci acestea nu trebuie să interacţioneze direct
Low Coupling/High Cohesion
Permite modificarea unei clase astfel încât sa ducă la o modificare facilă a designului
Polymorphism  
Permite folosirea de metode diferite în funcţie de typul obiectului
Pure Fabrication
Permite crearea unei clase care sa nu devină greu de modificat





DPs ai
Interfetei Grafice cu Utilizatorul
Conversational Text 
Desigunul trebuie să admită comenzi sub formă de text
Direct Manipulation
Permite utilizatorului să interacţioneze cu obeictele manipuland reprezentări ale acestora oferită de interfaţă
Ephemeral Feedback  
Asigură feedback utilizatorilor despre starea muncii lor fără a interveni în fluxul natural de muncă
Explorable Interface  
Designul interfeţelor trebuie să fie indulgent cu greşelile utilizatorului
Form  
Permite utilizatorului să adauge date structurate sub formă de informaţii discrete
Disabled Irrelevant Things  
Ascunde elementele de interfaţă care nu sunt necesare într-un anumit context
Interaction Style  
Mapează modalităţile de de interacţiune oferite de interfaţă utilizatorului cu cerinţele aplicaţiei
Limited Selection Size  
Evită prezentarea de valori pentru selectare la un anumit moment în afara unui număr maxim
Selection  
Permite utilizatorului să selecteze comenzi sau valori din liste
Step-by-Step Instructions  
Conduce utilizatorul informândul ce urmează să facă la pasul următor
Supplementary Window  
Afişează o fereastră suplimentară pentru informaţii suplimentare despre o fereastră părinte
Window per Task
Fiecare acţiune completă trebuie săă aibă o fereastră unică




DPs de
Organizare a Codului

Accessor Method Name  
Foloseste nume si definitii de funcţii care sunt uşor de citit
Anonymous Adapter  
Foloseşte obiectele de tratare a evenimentelor ca adaptoare anonime
Checked vs. Unchecked Exceptions  
Toate excepţiile interne vor fi unchecked iar cele externe vor fi checked
Conditional Compilation  
Controlează dacă un compilator intorduce sau ignoră comenzi pentru debug
Composed Method  
Reorganizarea unor metode care sunt prea mari ]n metode mai mici
Convert Exceptions  
Excepţiile netratate în layerul curent vor fi convertite si trimise la layerul superior
Define Constants in Interfaces
Se definesc constantele în interfeţele claselor
Extend Super  
Impelmentarea unei metode care modifică logica unei clase parinte
Intention Revealing Method  
Folosirea de nume semnificative pentru acţiuni care nu sunt executate de funcţii cu denumiri clare
Server Socket  
Cod standard scris pentru a controla partea de server a unui socket
Client Socket  
Cod standard scris pentru a controla partea de client a unui socket
Switch  
Selectarea diverselor parti din cod pentru executie intr-o clauză switch
Symbolic Constant Name
Folosirea de nume simbolice pentru constante

DPs de Optimizare a Codului
Double Checked Locking   
Evită dublarea eforturilor de iniţializare ale unei resurse de către două fire de execuţie
Hashed Adapter Objects  
Transmite un apel de metodă către un obiect adaptor asociat cu un obiect arbitrar
Lazy Initialization  
Iniţializrea unui obiect doar în momentul în care acesta este necesar
Lookup Table  
Evită recalcularea unor valori prin calcularea lor iniţială şi salvarea lor ulterioară
Loop Unrolling
Măreşte numărul de operaţii efecutate într-o singură iteraţie

DPs de
Robusteţe a Codului
Assertion Testing  
Verifică dacă o metode este conformă cu apelurile clineţilor
Copy Mutable Parameters  
Copierea unui obiect în cazul în care se doreşte nemodificarea stării acestuia prin modificarea lui.
Guaranteed Cleanup
Asigură terminarea unui obiect în cazul în care acesta nu execută corect terminarea lui
Maximize Privacy  
Membrii claselor trebuie să fie cât mai privaţi posibil
Return New Objects from Accessor
Un obiect returnat trebuie să fie copiat şi nu transmis prin valoare




DPs de
Testare

Acceptance Testing  
Testarea făcută pentru a vedea dacă software livrat respectă nevoile organizaţiei pentru care a fsot realizat
Black Box Testing  
Definirea de teste numai pe baza cerinţele
Clean Room Testing  
Cei care au proiectat sistemul nu trebuie să discute specificaţiile cu cei care realizează testele
Integration Testing  
Testarea împreuna, pentru prima dată,  a claselor dezvoltate separat
Regression Testing  
Retestarea unor module pentru a observa dacă modificările au introdus noi buguri
System Testing  
Tetstarea unui sistem ca o entitate, într-un mediu similar cu cel în care va lucra
Unit Testing  
Testarea claselor individuale isolat de celelalte clase din program
White Box Testing
Definirea de teste pentru toate situaţile semnificative

Tabelul nr. 3 Clasificarea DPs în funcţie de domeniul de aplicabilitate
Clasa
Design Pattern


DPs de
Transacţii
ACID Transaction
Asigură ca rezultatul unei tranzacţii nu este inconsistent.
Audit Trail
Menţine un set de înregistrări ale tranzacţiilor efectuate asupra unui obiect sau unui set de obiecte
Composite Transaction
Definirea de tranzacţii complexe alcătuite din tranzactii ACID
Two Phase Commit
Un obiect care asigură că o tranzacţie complexe alcătuită din două tranzacţii ACID fie se termină, fie eşuează



DPs de Arhitecturi Distribuite

Demilitarized Zone
Serverele publice de Internet se vor lega la o reţea LAN care este conectată la firewall şi la reţeaua Internet
Mobile Agent
Un obiect are nevoie să acceseze volume mari de date aflate la distanţă
Object Replication
Multiplicarea unui obiect pe mai multe maşini astfel încât el să apară clienţilor ca fiind unic
Object Request Broker
O arhitectură care permite obiectelor să facă apeluri la distanţă fără a cunoaşte detaliile apelului
Process Pair
Două obiecte care lucrează în pereche pentru ca în momentul în care unul cade celălalt să îl repornească
Prompt Repair
Repararea unui obiect care cade imediat după această cădere
Redundant Independent Objects
Păstrarea unor obiecte redundante în cazul în care una dintre masini cade
Shared Object
Un obiect care va efectua logica necesară partajării unui alt obiect



DPs de
Procesare Distribuită
Connection Multiplexing
Un obiect care gestionează conexiunile dintre mai multe alte oiecte
Heartbeat
Transmiterea de mesaje periodice care să confirme clientului că serverul execută acţiuni în numele clientului
Heavyweight/Lightweight Object
Proiectarea de clienţi care sunt cât mai mici
Mailbox
Stocarea mesajelor în recipiente pentru fiecare dintre destinatari
Object Identifier
Fiecare obiect trebuie să aibă un identificator unic
Protection Proxy
Limitarea accesului la un obiect furnizând alte obiecte care pe baza drepturilor de securitate accesează un proxy
Publish-Subscribe
Transmiterea fiecărui mesaj către destinatarul precizat
Registry
Un mecanism care returnează un proxy la un obiect dându-i-se numele obiectului sau numele serviciului
Retransmission
Reluarea transmisiei unui mesaj până când se încheie cu succes



DPs de Concurenţă
Ephemeral Cache Item
Folosirea unei copii locale a unor obiecte de la surse de date aflate la  distanţă
Deep Transaction Nesting
Implementarea posibilităţii de a restaura starea unui obiect modificat prin folosirea de tranzacţii imbricate
Lock File
Folosirea unui fişier de blocare care să gestioneze accesul exclusiv la resurse partajate
Optimistic Concurrency
Folosirea de copii ale obiectelor pentru executarea de tranzacţii
Session Object
Folosirea unui singur obiect pentru informaţiile despre o sesiune de pe server
Static Locking Order
Asigură preluarea blocării obiectelor în aceeaşi ordine pentru toate obiectele
Thread Pool
Refolosirea unui fir de execuţie aflat într-un pool dacă recrearea unuia nou durează mai mult
DPs de
Timp

Temporal Property
Menţinerea unui istoric al valorilor unor atribute care se modifică de-a lungul timpului
Time Server
Asigură sincronizarea ceasurilor calculatoarelor dintr-o aplicaţie distribuită
Versioned Object
Asigură regăsirea unei stării mai vechi sau viitoare a unui obiect în funcţie de momentul temporal



DPs de
Baze de date
CRUD
Organizarea operaţiilor pe baza de date în operaţii de Creare, Selectare, Modificare, Ştergere (Create, Retrieve, Update and Delete)
isDirty
Evitarea modificării unor date din baza de date care nu necesită acest lucru
Lazy Retrieval
Amânarea aducerii de atribute din baza de date pentru obiecte complexe până în momentul în care acestea sunt necesare
Persistence Layer
Menţine independenţa aplicaţiei faţă de baza de date
Stale Object
Folosirea informaţiilor despre ultima stare a unui obiect cu atribute aduse din baza de date pentru operaţii cu versiunea actuală a obiectului
Type Conversion
Organizarea metodelor de conversie a tipurilor de date în clase de conversie
4.      Descrierea design pattern
Pentru descrierea unui DP se vor folosi atât metodele grafice cât şi cele descriptive. Metodele grafice deşi sunt importante şi utile nu sunt suficiente deoarece prezintă produsul final al designului ca relaţie între clase şi obiecte. Pentru reutilizarea designului, trebuie înregistrate deciziile, alternativele, şi consecinţele care au condus la alegerea acestuia. Exemplele concrete sunt şi ele importante pentru că ajută la înţelegerea designului prezentând modul cum acesta este folosit în producţie.
Descrierea fiecărui DP trebuie împărţită în secţiuni după următorul model, care face ca deciziile de alegerea a acestora să fie mai uşoare, mai uşor de citit, înţeles, învăţat, comparat şi folosit.
Ø  Numele Pattern şi clasificarea: numele pattern rezumă în unu, două cuvinte esenţa unui pattern. Un nume bine ales este vital, pentru că va deveni parte a vocabularului de design.
Ø  Scopul: rezumă răspunsul la următoarele întrebări: Ce face respectivul design pattern? Care îi sunt raţiunile şi scopul? Ce problemă particulară de design este rezolvată prin respectivul pattern?
Ø  Pseudonim: alt nume sub care mai este cunoscut pattern, în cazul în care există
Ø  Motivaţia: un scenariu care ilustrează o problemă de design şi modul în care clasele sau obiectele se structurează în cadrul pattern pentru soluţionarea problemei. Scenariul ajută la înţelegerea descrieri care urmează şi care este mai abstractă.
Ø  Aplicabilitatea: răspunde la următoarele întrebări: Care sunt situaţiile în care design pattern se aplică ? Care sunt exemplele de design mai slab pe care pattern le rezolvă ? Cum sunt recunoscute aceste situaţii?
Ø  Structura: o reprezentare grafică a claselor din pattern folosind o notaţie bazată pe  OMT – Object Modeling Technique. Se folosesc de asemenea diagrame de interacţiune, pentru a ilustra secvenţele de cereri şi colaborările dintre obiecte.
Ø  Participanţii: clasele şi/sau obiectele participante la design pattern şi responsabilităţile lor.
Ø  Colaborare: prezintă modul în care participanţii colaborează între ei pentru rezolvarea responsabilităţilor.
Ø  Consecinţe: ilustrează cum îşi suportă pattern obiectivele, care sunt consecinţele şi rezultatele folosirii patterns şi care sunt aspectele din structura sistemului care variază independent.
Ø  Implementări: se referă la tehnicile, şi sugestiile care trebuiesc ştiute pentru implementarea pattern, precum şi la problemele specifice unui sau altuia dintre limbajele de programare.
Ø  Exemple de cod: sunt fragmente de cod care ilustrează cum va fi implementat pattern în diverse limbaje.
Ø  Utilizări cunoscute: se referă la exemple de patterns care sunt regăsiţi în sisteme reale.
Ø  Relaţii cu alţi patterns: identifică alţi patterns care sunt foarte legaţi de cel în cauză; care sunt diferenţele importante; cu care dintre ceilalţi patterns vor fi aceştia din urmă folosiţi.
5.      Concluzii
Conform unui studiu al grupului Gartner [Will00], se apreciază ca piaţa pentru componentele prefabricate a crescut de la 1,4 miliarde USD în 1997 la aproape 8 miliarde USD in 2002. Tot în acest studiu se aprecaiză că un procent de 70 % din aplicaţiile software nou create  vor fi asamblate din componente până în 2003. Acelaşi studiu afirmă că piaţa componetelor va deveni domeniul cel mai activ din cadrul pieţei de software. Windows 2000 şi mai nou Windows Server 2003 şi EJB – Enterprise Java Beans sunt platforme mature care suportă EA scalabile bazate pe componete. În următorii ani, majoritatea aplicaţiilor nou create vor fi livrate pentru aceste platforme, şi în ambele cazuri folosirea componentelor este obligatorie din punct de vedere tehnic. Iată de ce folosirea unor componente care să fie în prealabil fiabile duce către o fiabilitate mult sporită a aplicaţiilor. DPs sunt cheia atât pentru realizarea acestor componente cât şi pentru asamblarea acestora în aplicaţii.

Bibliografie
1.      [GoF95] E. GAMMA, R. Helm, R. Johnson, and J. Vlissides, “Design Patterns: Elements of Reusable Object-Oriented Software”. Reading, MA: Addison-Wesley, 1995.
2.      [ECKE03] B. ECKEL, “Thinking in Patterns”, Revision 0.9, 20-05-2003, MindView, Inc.
3.      [COPE01] J.W. COOPER “Design Patterns and Object Oriented Programming in Visual Basic 6 and VB.NET ”, IBM Thomas J Watson Research Center January 14, 2001
4.      [SHAL01] A. SHALLOWAY, J.R. Trott – “Design Patterns Explained – A New perspective On Object Oriented Design” , 2001
5.      [ALEX79] ALEXANDER, C., Ishikawa, S., Silverstein, M., “The Timeless Way of Building”, New York: Oxford University Press, 1979.
6.      [LYU96] LYU, R., M., ed. "Handbook of Software Reliability Engineering", IEEE Computer Society Press 50 years of service , Los Alamitos, CA.; Computing McGraw-Hill, 1996
7.      [WILL00] WILLIAMS J D,   “Raising Components”, Application Development Trends, vol. 7, no.9, Sep 2000, pp.27--32.
8.      [FOWL02] FOWLER Martin, RICE David, FOEMMEL Matthew, HIEATT Edward, MEE  Robert, STAFFORD  Randy - “Patterns of Enterprise Application Architecture” - Addison-Wesley Pub Co, November , 2002

Anexa nr 1     -           Lista de acronime

1. P – Pattern = prezintă modul în care se rezolvă o clasă întreagă de probleme similare
2. DP – Design Pattern = prezintă modul în care se rezolvă o clasă întreagă de probleme similare  de proiectare software
3. DPs – Design Patterns = mulţimea de design pattern

4. PL – Pattern language  = limbaj de design

DESIGN PATTERNS – CALE DE CREŞTERE A FIABILITĂŢII SOFTWARE


Ion IVAN                                                                                Liviu Mijache
ivan@fx.ro                                                                              liviu.mijache@email.ro



Rezumat: Una dintre cele mai noi şi puternice posibilităţi de creştere a fiabilităţii software este folosirea design pattern ca modalitate de proiectare a unor aplicaţii software care să răspundă cerinţelor crescânde de fiabilitate. Sunt prezentate concepte de bază, efectele acestui mod de lucru şi se propun modalităţi de evaluare pentru fiabilitate.

Cuvinte cheie: Pattern, design, fiabilitate, enterprise applications

Software actual se confruntă cu frontiera complexităţii. Pe de-o parte se aşteaptă ca aplicaţiile software să facă să funcţioneze, fără erori, sisteme mari, precum si reţele de astfel de sisteme, cum sunt: reţelele electrice, sistemele de control al traficului aerian, reţelele ale sistemelor financiare, sisteme militare de comandă şi control, Internet. Tot al fel se aşteaptă ca aplicaţiile software să conducă activităţile diverselor echipamente cum sunt: monitorizarea implantului de inimă, diagnosticarea folosind instrumente nanometrice, protezele digitale. Sistemele de dimensiuni mari, care cuprind de la câteva sute până la câteva mii de platforme, milioane de linii de cod, miliarde de byte de date, au devenit rapid foarte populare. Pe de altă parte de la toate aceste sisteme se aşteaptă să funcţioneze la nivele din ce în ce mai înalte de fiabilitate, securitate şi siguranţă. Aceste două caracteristici  - creşterea rapidă a dimensiunilor şi a complexităţii – sunt cauzele principale pentru problemele actuale ale dezvoltatorilor de sisteme şi aplicaţii software. De aici apar cele mai multe erori şi aici trebuie îmbunătăţit procesul de dezvoltare a aplicaţiilor software.


  1. Fiabilitatea Software

În continuare se va face referire la aplicaţiile informatice cu caracter economic, dedicate structurilor organizaţionale orientate spre producţie şi servicii Enterprise Applications - EA. Acum când aplicaţiile Web influenţează totul, începând cu experienţa clienţilor până la relaţia cu vânzătorii, fiabilitatea sistemelor informatice ale organizaţiilor sunt în creştere, devenind critice pentru companii, clienţi, şi parteneri de afaceri. Pentru că o cădere a unei aplicaţii va duce la o afacere pierdută şi la costuri semnificative de reparare, şi pentru că Internet este întotdeauna deschis pentru afaceri, companiile solicită ca fiabilitatea EA, să fie de 24 de ore timp de 7 zile. Internet a făcut din informaţie şi în mod imediat şi din accesarea fără eroare a acesteia bunul cel mai valoros pentru o companie.

EA reprezintă o colecţie de hardware, servicii ale sistemului de operare, componente software, şi de cele mai multe ori procese umane care sunt concepute pentru a colabora în scopul asigurării serviciului de procesare aşteptat. Fiabilitatea întregii aplicaţii depinde foarte mult de fiabilitatea fiecărei componente. Pentru că toate componentele dintr-un sistem sunt în strânsă legătură, o cădere a unei componente va afecta fiabilitatea altora.

Căderile aplicaţiilor survin în urma a mai multe aspecte dintre care amintim:

Ø  testare inadecvată,
Ø  probleme ale schimbării managementului,
Ø  erori de operare,
Ø  cod slab calitativ,
Ø  lipsa unui proces de asigurare a calităţii,
Ø  interacţiuni cu servicii sau aplicaţii externe,
Ø  condiţii de operare diferite - grade de folosire mai mari, supraîncărcare ,
Ø  evenimente întâmplătoare - căderi de securitate,
Ø  căderi hardware - hard-disk-uri, echipamente de reţea, servere, surse de energie, memorie, CPU,
Ø  probleme legate de mediu - energia, răcirea, focul, praf, dezastre naturale.
Pe scurt fiabilitatea software se referă la cât de bine o aplicaţie asigură cu acurateţe, fără eroare, conform serviciul care a fost definit în specificaţiile funcţionale. În plus faţă de cât de mult rulează o aplicaţie fără eroare, fiabilitatea software se mai referă şi la oferirea rezultatelor corecte şi la detecţia şi recuperarea erorilor cu scopul de a evita căderile.
Fiabilitatea unui sistem este o măsură a abilităţii sistemului de a funcţiona în timp fără a înregistra căderi. în funcţie de sistem, e posibil ca fiabilitatea pe termen lung să nu reprezinte o preocupare pentru cei ce dezvoltă sistemul. De exemplu, să considerăm un sistem de auto-aterizare. Cerinţa de disponibilitate a sistemului este ridicată - trebuie să fie disponibil în momentul când primeşte o cerere de aterizare. Pe de altă parte, cerinţa de fiabilitate este destul de redusă în sensul că sistemul nu trebuie să rămână operaţional pentru o lungă perioadă de timp. Fiabilitatea unui sistem este măsurată în mod normal ca timpul mediu până la cădere Mean Time To Failure , durata de viaţă aşteptată a sistemului.
MTTF = Ore de lucru /Numărul de căderi

De exemplu dacă echipa de design se aşteaptă ca aplicaţia să ofere o fiabilitate de o cădere la fiecare 30 de zile de operare timp de 24 de ore pe zi, adică o cădere la fiecare 720 de ore de funcţionare. Testarea va dovedi că aplicaţia rulează corect timp de 1800 de ore şi înregistrează numai două căderi, rezultă că MTTF = 1800/2 = 900 ore. Altfel spus ne vom aştepta ca aplicaţia să ruleze aproximativ 900 de ore între două căderi succesive. În acest exemplu fiabilitatea a depăşit parametrii din design. De aceea o noţiune importantă a fiabilităţii software este aceea că o cădere software va apărea doar în momentul în care aplicaţia este disponibilă şi se execută.

Consecinţele căderilor variază de la a nu asigura serviciul, până la asigurarea unui serviciu incorect, şi până la a genera date corupte şi a afecta stabilitatea sistemului. În timp ce unele dintre căderi sunt doar inconveniente, alte căderi variază de la întreruperi cauzatoare de pierdere de timp atunci când un sistem de achiziţie nu este prea solicitat pentru a mai răspunde unei noi cereri de achiziţie, până la inconveniente serioase cum ar fi un sistem bursier care nu mai are resurse pentru a mai accepta o nouă autentificare  şi până la catastrofe majore în cazul căderii unui sistem de navigaţie al unei nave.

  1. Design Patterns

În mod tradiţional fiabilitatea software este privită din punctul de vedere al comportamentului produsului existent în comparaţie cu nivelurile planificate înaintea ciclului de realizare. Căile de creştere tradiţionale vizează un produs existent şi modificări pe acesta în vederea eliminării de erori.

Abordarea modernă a fiabilităţii vizează definirea de tehnici şi metode care interacţionează pe toată durata proceselor specifice ciclului de realizare asigurând ca fiecare stadiu al producţiei software să aibă un nivel de fiabilitate ridicat. Este un mod activ de creştere a fiabilităţii software în timpul proiectării, a codificării, respectiv în timpul celorlalte etape ale ciclului de realizare. Nu se mai aşteaptă efectuarea modificărilor pe un produs finit ci, se intervine în timpul procesului pentru a utiliza astfel de resurse încât ceea ce se obţine să fie fiabil.

Software bazat pe componente este o tehnologie eficientă de creştere a productivităţii dezvoltatorilor şi de creştere a calităţii software în general. Din nefericire multe dintre componente nu întrunesc specificaţiile iniţiale, chiar şi cele care sunt construite folosind arhitecturi middleware populare cum sunt: COM+, EJB, CORBA Component Model. Motivul pentru aceasta sunt simple: modelele pentru componente middleware furnizează numai infrastructura care formează elementele de bază pentru construirea sistemelor software complexe. În mod particular, designul specific al componentelor, aspectele legate de evoluţia, configurarea, distribuţia, concurenţa, scalabilitatea componentelor nu sunt prezentate de modelele convenţionale ale componentelor.  Rezolvarea eficientă a acestor aspecte rămâne în responsabilitatea dezvoltatorilor. Pentru crearea unei componente de succes pe lângă rezolvarea corectă a problemei specifice, trebuie să se implementeze complet serviciile si funcţiile necesare fiecărui model.

Design Pattern este o disciplina de rezolvare a acestor problemele software care s-a dezvoltat în rândul comunităţii programatorilor de aplicaţii orientate-obiect. Scopul principal al comunităţii de dezvoltatori ce folosesc patterns este acela de a crea o literatură de bază care să îmbunătăţească designul şi dezvoltarea în general.  DP au devenit populari odată cu descrierea unora dintre aceştia în [GoF95].

În această disciplină se utilizează terminologia în limba engleză, pentru că dezvoltarea tehnologiilor a fost făcută în limba engleză. Astfel termenul pattern este asimilat direct în limba română la fel ca termenul software. Pattern este folosit pentru a desemna un set de elemente cheie după care se pot realiza soluţii pentru o anumită clasă de probleme similare. Formele la plural au fost asimilate tot în limba engleză. Numele diferiţilor patterns au fost preluate tot în limba engleză pentru a se identifica uşor cu cele din terminologia de specialitate. Desigur că se pot adapta şi traduce denumirile, dar în acest mod s-ar crea confuzie între denumirile în română şi cele în engleză şi de aceea am preferat adoptarea denumirilor internaţional recunoscute.

Patterns au rădăcini în multe discipline inclusiv literatura de programare, dar în mod special în cartea despre panificarea urbană şi arhitecturile clădirilor[ALEX79]. El afirmă acolo că “fiecare pattern este o regulă tripartită, care exprimă relaţia între un anume context, o problemă şi o soluţie”. Un pattern ca element de lucru exprimă o relaţie între un anume context, un anume sistem de forţe care apar în mod repetat în acel context şi o anume configuraţie spaţială care permite acestor forţe să fie rezolvate. Ca element de limbaj, un pattern este o instrucţiune, care arată cum va fi folosită în mod repetat, această configuraţie spaţială, pentru a rezolva sistemul de forţe dat, de fiecare dată când contextul este relevant.

Drept urmare se afirmă că din punct de vedere software, fiecare pattern este  o regulă tripartită care exprimă o relaţie între un anume context, un anume sistem de forţe care se manifestă în mod repetat în acel context, şi o anumită configuraţie software care permite acestor forţe să se anuleze.

În general un pattern are patru elemente esenţiale: numele pattern, problema, soluţia, consecinţele.

Numele pattern este un element folosit pentru descrierea unei probleme de design, a soluţiei, şi a consecinţelor. În general conţine unul sau 2 cuvinte. Numele pattern ne permite să sporim vocabularul de design, şi să proiectăm la un nivel superior de abstractizare. Astfel folosirea numelui ne permite să rezumăm o cantitate apreciabilă de informaţie în doar câteva cuvinte, ceea ce face comunicarea  cu colegii, sau alţi designeri mult mai uşoară

Problema descrie când se aplică pattern. Explică problema şi contextul ei. Descrie probleme specifice de design cum sunt modul de reprezentare al algoritmilor ca obiecte; descrie clase sau structuri de obiecte care sunt fixe ca design. Uneori problema include o lista de condiţii care trebuiesc îndeplinite pentru a avea sens aplicarea pattern.

Soluţia descrie elementele care formează designul, relaţiile, responsabilităţile şi colaborările. Soluţia nu descrie un design particular concret sau o anume implementare, pentru că un pattern este ca un şablon care va fi aplicat în multe situaţii diferite. În schimb pattern asigură o descriere abstractă  a problemei de design  şi cum se aranjează în general elementele, clase şi obiecte, pentru rezolvarea ei.

Consecinţele sunt rezultatul şi urmările aplicării pattern. Deşi consecinţele nu sunt prezentate de cele mai multe ori când descriem deciziile de design, ele sunt critice pentru evaluarea alternativelor de design precum şi a costurilor şi beneficiilor aplicării lor. Consecinţele pentru software se referă cel mai adesea la echilibrul spaţiu – timp. Prezintă de asemenea probleme legate de limbaje şi implementare. Pentru că reutilizarea este un factor important în designul software orientat obiect, consecinţele unui pattern includ impactul asupra flexibilităţii sistemului, extensibilităţii sau a portabilităţii. Listarea acestor consecinţe ajută şa înţelegerea şi evaluarea lor.

Numele unui DP abstractizează şi identifică aspectele cheie ale unei structuri de design comune care face utilă crearea unui design orientat obiect, reutilizabil. DP identifică clasele şi instanţele, rolurile şi colaborările precum şi distribuţia responsabilităţii lor. Fiecare DP prezintă o anumită problemă de design, şi descrie când se aplică această soluţie în contextul constrângerilor de design existente, şi a consecinţelor aplicării acesteia.

Un PL defineşte o colecţie de patterns şi regulile pentru combinarea lor într-o arhitectură. Limbajele de pattern descriu framework-uri sau familii unitare de sisteme. Un framework este  un set de clase care cooperează şi care fac posibil reutilizarea designului pentru o anumită clasă de aplicaţii software. De exemplu un framework ajută la construirea unor compilatoare pentru limbaje diferite şi pentru platforme ţintă diferite; sau ajută la modelarea unor aplicaţii financiare. Un framework se customizează pentru o aplicaţie particulară, prin crearea unor subclase specifice aplicaţiei prin moştenirea unor clase abstracte ale framework-ului.

Deşi se numesc DPs, în realitate nu se referă numai la design, ci vin să schimbe modul tradiţional de gândire despre analiza, designul şi implementarea aplicaţiilor software. Pentru aceasta DPs propun crearea de noi nivele de abstractizare. De fiecare dată când se abstractizează ceva, se izolează practic detaliile particulare de restul problemei, cu scopul declarat de a separa lucrurile care se schimbă de lucrurile care rămân la fel. Astfel fiabilitatea respectivei probleme supuse abstractizării este separată în fiabilitatea lucrurilor modificabile şi fiabilitatea lucrurilor care rămân la fel. Se pleacă de la premisa că aducerea a cât mai multe lucruri care rămân la fel într-o problemă anume va duce la o fiabilitate sporită. Practic părţile care rămân fixe sunt considerate a avea o fiabilitate maximă, diferenţa fiind făcută de părţile modificabile, care sunt considerate a avea o fiabilitate mai mică. Cu cât rămân mai puţine astfel de părţi, şi cu cât fiabilitatea părţilor fixe este mai mare se afirmă că fiabilitatea produsului pe ansamblu a crescut.

Un pattern se spune că este bun dacă:

Ø  rezolvă o problemă: pattern prezintă o soluţie nu doar principii abstracte sau strategii;
Ø  este un concept dovedit: pattern prezintă o soluţie cu rezultate urmărite, nu doar teorii sau speculaţii;
Ø  soluţia nu este evidentă: multe dintre tehnicile de rezolvare a problemelor - de exemplu paradigmele sau metodele de design software, încearcă se deriveze soluţiile plecând de principii; cele mai bune patterns generează soluţii indirecte pentru o problemă anume, abordare necesară pentru cele mai dificile probleme de design;
Ø  descrie o relaţie: patterns nu numai că descriu module, dar descriu structuri şi mecanisme interne acestor module;
Ø  are o componenta umană semnificativă: toate aplicaţiile software servesc confortului uman şi calităţii vieţii; de aceea cei mai buni patterns se referă explicit la utilitate şi estetică.


  1. Categorii de design patterns

Au fost identificate următoarele categorii de patterns:

Ø  idiom:  se referă la modul în care este scris codul într-un limbaj particular, pentru a rezolva o anume problemă;
Ø  design specific: prezintă soluţia cu care se vine pentru rezolvarea unei anumite problemă;
Ø  design standard: se referă la modul în care se rezolvă un anumit tip de problemă; de cele mai multe ori sunt patterns care au devenit generali datorită reutilizării;
Ø  design pattern: prezintă modul în care se rezolvă o clasă întreagă de probleme similare; de cele mai multe ori aceştia apar după aplicarea de mai multe ori a unui design standard, şi apoi găsirea unui pattern comun în toate acele aplicaţii.

În [GoF95] sunt discutaţi 23 de patterns diferiţi, clasificaţi după trei scopuri, fiecare dintre aceste scopuri referindu-se la un anume aspect care variază: creaţional, structural şi comportamental.

Creaţional: cum este creat un obiect. Acest lucru implică adesea izolarea detaliilor de creare a unui obiect astfel încât codul să nu fie dependent de ce tipuri de obiect sunt, în aşa fel încât să nu fie necesară modificarea codului când se adaugă un nou tip de obiect. În această categorie sunt incluşi patterns denumiţi: Singleton, Factory Method şi Prototype

Structural: proiectarea obiectelor pentru satisfacerea constrângerilor particulare ale proiectului. Aceasta se referă la modul în care obiectele sunt conectate între ele pentru ca schimbările din sistem să nu necesite schimbări ale acestor conexiuni.

Comportamental: obiectele care sunt responsabile cu un anume tip de acţiuni dintr-un program . Acestea încapsulează procese care se doresc a se executa, de exemplu interpretarea unui limbaj, răspunsul la o cerere, implementarea unui algoritm. În această categorie sunt incluşi denumiţi: Observer şi Visitor

Un alt criteriu pentru clasificarea DPs, ţine cont dacă un pattern se aplică pentru clase sau pentru obiecte. Patterns pentru clase se ocupă cu relaţiile dintre clase şi subclasele aferente. Aceste relaţii sunt stabilite prin moştenire, aşa că sunt statice – la momentul compilării. Patterns pentru obiecte sunt răspunzători cu legăturile dintre obiecte, care se  modifică la momentul rulării şi sunt mult mai dinamici.

Ulterior acestei abordari, care este considerată ca fiind definitoare pentru conceptul de design patterns, pornind de la aceşti 23 de patterns s-au dezvoltat numeroşi alţii, din ce in ce mai complecşi, care au fost clasificaţi în noi categorii. În ultimii ani patterns au început sa fie clasficaţi în funcţie de scop, domeniul de aplicabilitate şi de etapa din cadrul ciclului de dezvoltare referită. În tabelele nr. 1, 2 şi 3 sunt prezentaţi o suită de patterns reprezentativi, clasificaţi după aceste categorii. Se observă includerea între aceştia a tutror celor 23 de patterns iniţiali precum şi participarea aceestora la definirea altora.

Tabelul nr. 1 Clasificarea DPs în funcţie de scop

Scop
Design Pattern
Descriere


DPs
Fundamentali
Abstract Superclass
Asigură o unitate conceptuală a unui set de clase
Delegation
O modalitate de extindere si folosire a unei clase
Immutable
Nu permite informaţiilor despre un obiect să fie modificate după ce acesta a fost construit
Interface
Instanta unei clase ofera servicii si date unei instantei a altei clase.
Interface and Abstract Class
O clasă care implementează o interfaţă şi extinde o clasa abstractă
Marker Interface
O clasă care implementează o interfaţă pentru a indica valoarea booleană a unui atribut al unei alte clase
Proxy
O modalitate de a accesa un obiect prin intermediul altuia

DPs
Creaţional
Abstract Factory
O modalitate de a crea un obiect care implementează un set de interfeţe similare.
Builder
O modalitate de construire a unui obiect complex
Factory Method
Un obiect care reprezintă date externe sau procesează evenimente externe.
Object Pool
Permite refolosirea obiectelor care sunt greu de creat sau care sunt create într-un număr limitat.
Prototype
Permite unui obiect sa creeze copii ale lui însuşi
Singleton
Asigură instanţierea unui singur obiect dintr-o anumită clasa

DPs de Partiţionare
Composite
Permite crearea recursivă de obiecte similiare într-o manieră similară unui arbore
Filter (Pipe)
Permite obiectelor sa fie conectate dinamica pentru a realiza operaţii pe şiruri de date
Read-Only Interface
Asigură modificarea unui obiect numai de către unii dintre clienţii lui



DPs
Structural
Adapter
Implementează o interfaţa cunoscută clienţilor săi asigurând acces la o interfaţă necunoscută clienţilor săi
Bridge
Impelementează abstractizările şi implementările în clase separate permiţând combinarea lor dinamică
Cache Management
Permite accesarea rapidă a unor obiecte care în alt fel ar dura mai mult
Decorator
Extinde funcţionalităţile unui obiect într-un mod transparent clienţilor săi
Dynamic Linkage
Permite unui program să încarce la cerere diferite clase care implementează o interfaţă cunoscută
Façade
Simplică accesul la un set de obiecte prin intermediul unui obiect pe care toate celelate obiecte il folosesc ca sa comunice cu setul.
Flyweight
Permite partajarea unei informaţii comune între mai multe instante ale aceleiasi clase
Iterator
Defineşte o interfaţă care declară metode pentru accesul secvenţial la obiectele dintr-o colecţie
Virtual Proxy
Ascunde inexistenţa unui obiect printr-un  altul care implementează aceeaşi interfaţă permiţând intarzierea instanţierii celui din urmă



DPs
Comportamen-
tal
Chain of Responsibility
Permite unui obiect transmiterea unei comenzi fără să ştie ce obiect sau ce tip de obiecte o vor recepţiona
Command
Incapsulează comenzile în obiecte pentru o uşoară manipulare a lor
Little Language / Interpreter
Permite definirea unui mic limbaj care sa faciliteze rezolvarea unui set similar de probleme
Mediator
Foloseşte un obiect pentru a coordona schimbarea stărilor unor alte obiecte
Null Object
Defineşte o alternativă la folosirea null pentru a indica absenţa unui obiect
Observer
Permite înregistrarea dinamică de către un obiect a obiectelor care depind de el în vederea notificării
Snapshot
Permite creare de imagini ale stării unui obiect astfel încat aceasta să fie refăcută ulterior
State
Incapsulează starea unui obiect ca obiecte discrete
Strategy
Încapsulează algoritmi similari în clase care sunt subclase ale unei superclase comune.
Template Method
O clasa abstractă care conţine doar o parte din logica necesară realizării scopului
Visitor
Permite realizarea unei anume operaţii pentru mai multe obiecte prin definirea unei clase separate cu logica necesară realizării operaţiei.




DPs de Concurenţă
Asynchronous Processing
Asigură o coadă de procese pentru executarea lor asincronă.
Balking
Dacă o metodă este apelată în momentul în care obiectul nu o poate executa atunci se asigură ca acea metodă nu execută nimic
Double Buffering
Asigură producerea de date asincrone astfel încât acestea sa fie pregătite înainte ca ele să fie necesare
Future
Incapsulează toată logica astel încât pentru client să nu conteze daca procesarea este sincronă sau nu
Guarded Suspension
Asigură execuţia unei metode până când este îndeplinită o condiţie
Lock Object
Asigură un obiect unitar care să solicite acces unic la mai multe obiecte
Producer-Consumer
Coordonează producţia şi consumarea asincronă de informaţii şi obiecte
Read/Write Lock
Asigură acces concurent la citire şi acces exclusiv la scriere
Scheduler
Controlează ordinea în care sunt executate metodele unui singur fir de execuţie
Single Threaded Execution
Previne apelurile concurente la o metodă să ducă la executarea concurentă a metodei
Two-Phase Termination
Asigură ordonarea încheierii unui proces sau unui fir de execuţie



Tabelul nr. 2 Clasificarea DPs în funcţie de etapa de dezvoltare
Etapa
Design Pattern
Descriere


DPs cu Responsabilită
ţi Generale
Controller  
Adaugă un eveniment care să decupleze clasa sursa a unui eveniment de clasa sursă care il rezolvă.
Creator  
Determină care clasă crează o instanţă a unei alte clase
Expert  
Adaugă responsabilitate unei clase care deţine informaţia necesară pentru realizarea responsabilităţii
Law of Demeter  
Daca două clase nu trebuie să ştie de prezenţa celeilalte atunci acestea nu trebuie să interacţioneze direct
Low Coupling/High Cohesion
Permite modificarea unei clase astfel încât sa ducă la o modificare facilă a designului
Polymorphism  
Permite folosirea de metode diferite în funcţie de typul obiectului
Pure Fabrication
Permite crearea unei clase care sa nu devină greu de modificat





DPs ai
Interfetei Grafice cu Utilizatorul
Conversational Text 
Desigunul trebuie să admită comenzi sub formă de text
Direct Manipulation
Permite utilizatorului să interacţioneze cu obeictele manipuland reprezentări ale acestora oferită de interfaţă
Ephemeral Feedback  
Asigură feedback utilizatorilor despre starea muncii lor fără a interveni în fluxul natural de muncă
Explorable Interface  
Designul interfeţelor trebuie să fie indulgent cu greşelile utilizatorului
Form  
Permite utilizatorului să adauge date structurate sub formă de informaţii discrete
Disabled Irrelevant Things  
Ascunde elementele de interfaţă care nu sunt necesare într-un anumit context
Interaction Style  
Mapează modalităţile de de interacţiune oferite de interfaţă utilizatorului cu cerinţele aplicaţiei
Limited Selection Size  
Evită prezentarea de valori pentru selectare la un anumit moment în afara unui număr maxim
Selection  
Permite utilizatorului să selecteze comenzi sau valori din liste
Step-by-Step Instructions  
Conduce utilizatorul informândul ce urmează să facă la pasul următor
Supplementary Window  
Afişează o fereastră suplimentară pentru informaţii suplimentare despre o fereastră părinte
Window per Task
Fiecare acţiune completă trebuie săă aibă o fereastră unică




DPs de
Organizare a Codului

Accessor Method Name  
Foloseste nume si definitii de funcţii care sunt uşor de citit
Anonymous Adapter  
Foloseşte obiectele de tratare a evenimentelor ca adaptoare anonime
Checked vs. Unchecked Exceptions  
Toate excepţiile interne vor fi unchecked iar cele externe vor fi checked
Conditional Compilation  
Controlează dacă un compilator intorduce sau ignoră comenzi pentru debug
Composed Method  
Reorganizarea unor metode care sunt prea mari ]n metode mai mici
Convert Exceptions  
Excepţiile netratate în layerul curent vor fi convertite si trimise la layerul superior
Define Constants in Interfaces
Se definesc constantele în interfeţele claselor
Extend Super  
Impelmentarea unei metode care modifică logica unei clase parinte
Intention Revealing Method  
Folosirea de nume semnificative pentru acţiuni care nu sunt executate de funcţii cu denumiri clare
Server Socket  
Cod standard scris pentru a controla partea de server a unui socket
Client Socket  
Cod standard scris pentru a controla partea de client a unui socket
Switch  
Selectarea diverselor parti din cod pentru executie intr-o clauză switch
Symbolic Constant Name
Folosirea de nume simbolice pentru constante

DPs de Optimizare a Codului
Double Checked Locking   
Evită dublarea eforturilor de iniţializare ale unei resurse de către două fire de execuţie
Hashed Adapter Objects  
Transmite un apel de metodă către un obiect adaptor asociat cu un obiect arbitrar
Lazy Initialization  
Iniţializrea unui obiect doar în momentul în care acesta este necesar
Lookup Table  
Evită recalcularea unor valori prin calcularea lor iniţială şi salvarea lor ulterioară
Loop Unrolling
Măreşte numărul de operaţii efecutate într-o singură iteraţie

DPs de
Robusteţe a Codului
Assertion Testing  
Verifică dacă o metode este conformă cu apelurile clineţilor
Copy Mutable Parameters  
Copierea unui obiect în cazul în care se doreşte nemodificarea stării acestuia prin modificarea lui.
Guaranteed Cleanup
Asigură terminarea unui obiect în cazul în care acesta nu execută corect terminarea lui
Maximize Privacy  
Membrii claselor trebuie să fie cât mai privaţi posibil
Return New Objects from Accessor
Un obiect returnat trebuie să fie copiat şi nu transmis prin valoare




DPs de
Testare

Acceptance Testing  
Testarea făcută pentru a vedea dacă software livrat respectă nevoile organizaţiei pentru care a fsot realizat
Black Box Testing  
Definirea de teste numai pe baza cerinţele
Clean Room Testing  
Cei care au proiectat sistemul nu trebuie să discute specificaţiile cu cei care realizează testele
Integration Testing  
Testarea împreuna, pentru prima dată,  a claselor dezvoltate separat
Regression Testing  
Retestarea unor module pentru a observa dacă modificările au introdus noi buguri
System Testing  
Tetstarea unui sistem ca o entitate, într-un mediu similar cu cel în care va lucra
Unit Testing  
Testarea claselor individuale isolat de celelalte clase din program
White Box Testing
Definirea de teste pentru toate situaţile semnificative

Tabelul nr. 3 Clasificarea DPs în funcţie de domeniul de aplicabilitate
Clasa
Design Pattern


DPs de
Transacţii
ACID Transaction
Asigură ca rezultatul unei tranzacţii nu este inconsistent.
Audit Trail
Menţine un set de înregistrări ale tranzacţiilor efectuate asupra unui obiect sau unui set de obiecte
Composite Transaction
Definirea de tranzacţii complexe alcătuite din tranzactii ACID
Two Phase Commit
Un obiect care asigură că o tranzacţie complexe alcătuită din două tranzacţii ACID fie se termină, fie eşuează



DPs de Arhitecturi Distribuite

Demilitarized Zone
Serverele publice de Internet se vor lega la o reţea LAN care este conectată la firewall şi la reţeaua Internet
Mobile Agent
Un obiect are nevoie să acceseze volume mari de date aflate la distanţă
Object Replication
Multiplicarea unui obiect pe mai multe maşini astfel încât el să apară clienţilor ca fiind unic
Object Request Broker
O arhitectură care permite obiectelor să facă apeluri la distanţă fără a cunoaşte detaliile apelului
Process Pair
Două obiecte care lucrează în pereche pentru ca în momentul în care unul cade celălalt să îl repornească
Prompt Repair
Repararea unui obiect care cade imediat după această cădere
Redundant Independent Objects
Păstrarea unor obiecte redundante în cazul în care una dintre masini cade
Shared Object
Un obiect care va efectua logica necesară partajării unui alt obiect



DPs de
Procesare Distribuită
Connection Multiplexing
Un obiect care gestionează conexiunile dintre mai multe alte oiecte
Heartbeat
Transmiterea de mesaje periodice care să confirme clientului că serverul execută acţiuni în numele clientului
Heavyweight/Lightweight Object
Proiectarea de clienţi care sunt cât mai mici
Mailbox
Stocarea mesajelor în recipiente pentru fiecare dintre destinatari
Object Identifier
Fiecare obiect trebuie să aibă un identificator unic
Protection Proxy
Limitarea accesului la un obiect furnizând alte obiecte care pe baza drepturilor de securitate accesează un proxy
Publish-Subscribe
Transmiterea fiecărui mesaj către destinatarul precizat
Registry
Un mecanism care returnează un proxy la un obiect dându-i-se numele obiectului sau numele serviciului
Retransmission
Reluarea transmisiei unui mesaj până când se încheie cu succes



DPs de Concurenţă
Ephemeral Cache Item
Folosirea unei copii locale a unor obiecte de la surse de date aflate la  distanţă
Deep Transaction Nesting
Implementarea posibilităţii de a restaura starea unui obiect modificat prin folosirea de tranzacţii imbricate
Lock File
Folosirea unui fişier de blocare care să gestioneze accesul exclusiv la resurse partajate
Optimistic Concurrency
Folosirea de copii ale obiectelor pentru executarea de tranzacţii
Session Object
Folosirea unui singur obiect pentru informaţiile despre o sesiune de pe server
Static Locking Order
Asigură preluarea blocării obiectelor în aceeaşi ordine pentru toate obiectele
Thread Pool
Refolosirea unui fir de execuţie aflat într-un pool dacă recrearea unuia nou durează mai mult
DPs de
Timp

Temporal Property
Menţinerea unui istoric al valorilor unor atribute care se modifică de-a lungul timpului
Time Server
Asigură sincronizarea ceasurilor calculatoarelor dintr-o aplicaţie distribuită
Versioned Object
Asigură regăsirea unei stării mai vechi sau viitoare a unui obiect în funcţie de momentul temporal



DPs de
Baze de date
CRUD
Organizarea operaţiilor pe baza de date în operaţii de Creare, Selectare, Modificare, Ştergere (Create, Retrieve, Update and Delete)
isDirty
Evitarea modificării unor date din baza de date care nu necesită acest lucru
Lazy Retrieval
Amânarea aducerii de atribute din baza de date pentru obiecte complexe până în momentul în care acestea sunt necesare
Persistence Layer
Menţine independenţa aplicaţiei faţă de baza de date
Stale Object
Folosirea informaţiilor despre ultima stare a unui obiect cu atribute aduse din baza de date pentru operaţii cu versiunea actuală a obiectului
Type Conversion
Organizarea metodelor de conversie a tipurilor de date în clase de conversie
4.      Descrierea design pattern
Pentru descrierea unui DP se vor folosi atât metodele grafice cât şi cele descriptive. Metodele grafice deşi sunt importante şi utile nu sunt suficiente deoarece prezintă produsul final al designului ca relaţie între clase şi obiecte. Pentru reutilizarea designului, trebuie înregistrate deciziile, alternativele, şi consecinţele care au condus la alegerea acestuia. Exemplele concrete sunt şi ele importante pentru că ajută la înţelegerea designului prezentând modul cum acesta este folosit în producţie.
Descrierea fiecărui DP trebuie împărţită în secţiuni după următorul model, care face ca deciziile de alegerea a acestora să fie mai uşoare, mai uşor de citit, înţeles, învăţat, comparat şi folosit.
Ø  Numele Pattern şi clasificarea: numele pattern rezumă în unu, două cuvinte esenţa unui pattern. Un nume bine ales este vital, pentru că va deveni parte a vocabularului de design.
Ø  Scopul: rezumă răspunsul la următoarele întrebări: Ce face respectivul design pattern? Care îi sunt raţiunile şi scopul? Ce problemă particulară de design este rezolvată prin respectivul pattern?
Ø  Pseudonim: alt nume sub care mai este cunoscut pattern, în cazul în care există
Ø  Motivaţia: un scenariu care ilustrează o problemă de design şi modul în care clasele sau obiectele se structurează în cadrul pattern pentru soluţionarea problemei. Scenariul ajută la înţelegerea descrieri care urmează şi care este mai abstractă.
Ø  Aplicabilitatea: răspunde la următoarele întrebări: Care sunt situaţiile în care design pattern se aplică ? Care sunt exemplele de design mai slab pe care pattern le rezolvă ? Cum sunt recunoscute aceste situaţii?
Ø  Structura: o reprezentare grafică a claselor din pattern folosind o notaţie bazată pe  OMT – Object Modeling Technique. Se folosesc de asemenea diagrame de interacţiune, pentru a ilustra secvenţele de cereri şi colaborările dintre obiecte.
Ø  Participanţii: clasele şi/sau obiectele participante la design pattern şi responsabilităţile lor.
Ø  Colaborare: prezintă modul în care participanţii colaborează între ei pentru rezolvarea responsabilităţilor.
Ø  Consecinţe: ilustrează cum îşi suportă pattern obiectivele, care sunt consecinţele şi rezultatele folosirii patterns şi care sunt aspectele din structura sistemului care variază independent.
Ø  Implementări: se referă la tehnicile, şi sugestiile care trebuiesc ştiute pentru implementarea pattern, precum şi la problemele specifice unui sau altuia dintre limbajele de programare.
Ø  Exemple de cod: sunt fragmente de cod care ilustrează cum va fi implementat pattern în diverse limbaje.
Ø  Utilizări cunoscute: se referă la exemple de patterns care sunt regăsiţi în sisteme reale.
Ø  Relaţii cu alţi patterns: identifică alţi patterns care sunt foarte legaţi de cel în cauză; care sunt diferenţele importante; cu care dintre ceilalţi patterns vor fi aceştia din urmă folosiţi.
5.      Concluzii
Conform unui studiu al grupului Gartner [Will00], se apreciază ca piaţa pentru componentele prefabricate a crescut de la 1,4 miliarde USD în 1997 la aproape 8 miliarde USD in 2002. Tot în acest studiu se aprecaiză că un procent de 70 % din aplicaţiile software nou create  vor fi asamblate din componente până în 2003. Acelaşi studiu afirmă că piaţa componetelor va deveni domeniul cel mai activ din cadrul pieţei de software. Windows 2000 şi mai nou Windows Server 2003 şi EJB – Enterprise Java Beans sunt platforme mature care suportă EA scalabile bazate pe componete. În următorii ani, majoritatea aplicaţiilor nou create vor fi livrate pentru aceste platforme, şi în ambele cazuri folosirea componentelor este obligatorie din punct de vedere tehnic. Iată de ce folosirea unor componente care să fie în prealabil fiabile duce către o fiabilitate mult sporită a aplicaţiilor. DPs sunt cheia atât pentru realizarea acestor componente cât şi pentru asamblarea acestora în aplicaţii.

Bibliografie
1.      [GoF95] E. GAMMA, R. Helm, R. Johnson, and J. Vlissides, “Design Patterns: Elements of Reusable Object-Oriented Software”. Reading, MA: Addison-Wesley, 1995.
2.      [ECKE03] B. ECKEL, “Thinking in Patterns”, Revision 0.9, 20-05-2003, MindView, Inc.
3.      [COPE01] J.W. COOPER “Design Patterns and Object Oriented Programming in Visual Basic 6 and VB.NET ”, IBM Thomas J Watson Research Center January 14, 2001
4.      [SHAL01] A. SHALLOWAY, J.R. Trott – “Design Patterns Explained – A New perspective On Object Oriented Design” , 2001
5.      [ALEX79] ALEXANDER, C., Ishikawa, S., Silverstein, M., “The Timeless Way of Building”, New York: Oxford University Press, 1979.
6.      [LYU96] LYU, R., M., ed. "Handbook of Software Reliability Engineering", IEEE Computer Society Press 50 years of service , Los Alamitos, CA.; Computing McGraw-Hill, 1996
7.      [WILL00] WILLIAMS J D,   “Raising Components”, Application Development Trends, vol. 7, no.9, Sep 2000, pp.27--32.
8.      [FOWL02] FOWLER Martin, RICE David, FOEMMEL Matthew, HIEATT Edward, MEE  Robert, STAFFORD  Randy - “Patterns of Enterprise Application Architecture” - Addison-Wesley Pub Co, November , 2002

Anexa nr 1     -           Lista de acronime

1. P – Pattern = prezintă modul în care se rezolvă o clasă întreagă de probleme similare
2. DP – Design Pattern = prezintă modul în care se rezolvă o clasă întreagă de probleme similare  de proiectare software
3. DPs – Design Patterns = mulţimea de design pattern
4. PL – Pattern language  = limbaj de design

************************
Materialul este referit prin:
Ion IVAN,  Liviu MIJACHE - Design Patterns – cale de crestere   a fiabilitatii software - Software 2003, ASE Publishing House, pp.  609-625, Bucuresti , 2003