Software Design Techniques
Curs predat la FILS, secția în limba engleză, în anul IV, semestrul I. El continuă cursul Software Development Methods și mută accentul de la analiză și modelare către proiectarea propriu-zisă a sistemelor software, către deciziile arhitecturale și către tehnicile de structurare a aplicațiilor mari.
Repere
- Instituție: Universitatea POLITEHNICA din București
- Facultate: FILS – Facultatea de Inginerie în Limbi Străine
- Specializare: Information Engineering
- An / semestru: anul IV, semestrul I
- Limba de predare: engleză
- Titlu oficial: Software Design Techniques
- Titular curs: Luca Dan Șerbănați
- Structură: 2 ore curs + 2 ore laborator
- Evaluare: două proiecte majore + examen scris
- Credite: de verificat
- Prerechizite: Software Development Methods, Object-Oriented Programming
Locul cursului în evoluția mea didactică
Acest curs reprezintă una dintre formele cele mai mature ale modului în care am înțeles să predau ingineria software la FILS. Dacă în Software Development Methods accentul era pus pe proces, cerințe, modelarea domeniului și construcția treptată a modelului de analiză, aici interesul se mută asupra proiectării: cum se organizează sistemul, cum se distribuie responsabilitățile, cum se aleg structurile arhitecturale și cum se reutilizează soluții de proiectare validate de experiență.
În plus, cursul deschide explicit drumul către sisteme distribuite, middleware și arhitecturi orientate pe servicii, deci nu rămâne la nivelul proiectării locale orientate pe obiecte, ci trece spre problemele mai largi ale sistemelor software enterprise.
Obiectivul cursului
Cursul urmărește formarea unei viziuni inginerești asupra proiectării software: cum se trece de la modelele rezultate din analiză la structuri implementabile, cum se separă abstracția de implementare, cum se aleg stiluri și pattern-uri adecvate și cum se proiectează sisteme care să rămână modulare, scalabile, mentenabile și extensibile.
Din această perspectivă, disciplina are un caracter dublu: pe de o parte, clarifică principiile teoretice ale proiectării; pe de altă parte, îi obligă pe studenți să le aplice efectiv în proiecte de dimensiuni mai mari decât exercițiile obișnuite de programare.
Profilul cursului
Suportul de curs îl prezintă drept un curs de advanced software design, destinat dezvoltării de sisteme software ample. Accentul cade pe relația dintre proiectarea orientată pe obiecte, arhitectura sistemelor și tehnicile de reutilizare. Astfel, cursul depășește nivelul unui simplu repertoriu de diagrame UML și încearcă să ofere un cadru conceptual coerent pentru proiectarea sistemelor complexe.
El poate fi văzut ca o punte între disciplinele de analiză și modelare, pe de o parte, și disciplinele dedicate arhitecturii software, sistemelor distribuite și integrării aplicațiilor, pe de altă parte.
Structura cursului
1. Introducere în software design
Partea introductivă discută locul proiectării în ciclul de viață al dezvoltării software, diferența dintre forward engineering și reverse engineering, rolul modelelor în procesul de dezvoltare și caracterul arhitectură-centric al Unified Process. În această zonă este clarificată și distincția dintre architectural design și object design.
2. Concepte și principii fundamentale de proiectare
Cursul introduce instrumentele conceptuale ale proiectării: abstracția, reificarea, deducția și inducția. Pe acest fond sunt discutate principiile moderne de proiectare: SOLID, DRY, KISS, YAGNI, precum și ideea de separation of concerns. Apar și tehnici clasice precum stepwise refinement, nivelurile de abstracție și proiectarea structurată.
3. Calități urmărite în proiectare
O secțiune importantă privește vocabularul calității inginerești: modularitate, componentizare, reutilizare, performanță, scalabilitate, reziliență, toleranță la defecte și elasticitate. Accentul cade pe faptul că proiectarea este în esență o negociere între constrângeri și calități dorite.
4. De la analiză la proiectare
Cursul explică explicit cum derivă modelul de proiectare din modelul de analiză: relația dintre use case model, modelul de domeniu, SSD-uri, contracte de operații și clasele de proiectare. Este insistată ideea de trasabilitate a proiectării față de analiză și ideea de „micșorare a distanței intelectuale” dintre domeniul problemei și structura software.
5. Reutilizare și patterns în dezvoltarea software
O componentă centrală a cursului este dedicată reutilizării: nu doar reutilizare de cod, ci și reutilizare de idei, structuri, comportamente, experiență inginerească și modele de rezolvare. În acest context sunt introduse conceptele de pattern, stil arhitectural, pattern arhitectural și arhitectură specifică de domeniu.
6. Atribuirea responsabilităților
Înaintea pattern-urilor GoF propriu-zise, cursul discută principiile de bază pentru atribuirea responsabilităților claselor: Information Expert, Creator, Low Coupling, High Cohesion și Controller. Acestea joacă rolul de criterii generale de proiectare orientată pe obiecte.
7. Pattern-uri fundamentale și creationale
Sunt tratate pattern-uri fundamentale precum Delegation, Interface, Marker Interface și Proxy, apoi pattern-urile creationale: Factory Method, Abstract Factory, Builder, Prototype, Singleton și Object Pool.
În această parte cursul insistă asupra decuplării clientului de clasele concrete, asupra controlului procesului de creare și asupra reutilizării structurilor de construire a obiectelor complexe.
8. Pattern-uri structurale și comportamentale
Cursul tratează apoi pattern-uri structurale precum Filter, Composite, Adapter, Iterator, Bridge, Facade, Decorator și Virtual Proxy, precum și repertoriul pattern-urilor comportamentale (Command, Observer, State, Strategy, Template Method, Visitor, Mediator, Interpreter etc.).
Miza nu este memorarea lor izolată, ci înțelegerea relațiilor dintre ele și a modului în care pot fi combinate în proiectarea unei aplicații reale.
9. Stiluri și pattern-uri arhitecturale
O altă secțiune importantă este dedicată arhitecturii software: diferența dintre stil arhitectural, pattern arhitectural și arhitectură de referință, precum și rolul lor în organizarea sistemelor mari. Sunt discutate stiluri precum: monolitic, client–server, N-tier, layered, component-based, event-driven, message-passing, SOA, REST, microservices, peer-to-peer și space-based.
Sunt prezentate și pattern-uri arhitecturale precum Broker, Model-View-Controller, Model-View-ViewModel, Microkernel, Plug-ins, CQRS și Ports and Adapters.
10. Sisteme distribuite, middleware și servicii
În partea avansată, cursul se ocupă de proiectarea aplicațiilor distribuite: dimensiunile distribuției, concurenței și persistenței, serviciile necesare calculului distribuit, precum și infrastructura middleware. Sunt introduse forme de middleware pentru comunicație la distanță: RPC/RMI, ORB și Message-Oriented Middleware, apoi rolul application server-elor.
Cursul merge apoi către arhitecturile orientate pe servicii, către abordarea SOMA și către introducerea în arhitecturile orientate pe web services.
11. Proiecte
Suportul de curs indică explicit o componentă aplicativă susținută: exerciții practice și două proiecte majore de proiectare. Acestea urmăresc nu doar aplicarea izolată a unor pattern-uri, ci integrarea lor într-un design coerent, capabil să susțină cerințe funcționale și nefuncționale realiste.
Laborator și proiect
Componenta practică a cursului avea rolul de a transforma principiile și pattern-urile în decizii efective de proiectare. Studenții erau puși să aleagă structuri potrivite, să justifice folosirea anumitor pattern-uri și să construiască modele de colaborare între obiecte, subsisteme și servicii.
Proiectele ocupau un loc central în evaluare. Din suportul recuperat reiese că ele erau gândite ca proiecte de proiectare propriu-zisă, nu ca simple teme de codare: trebuiau să dovedească alegerea unui stil arhitectural, a unor pattern-uri dominante și a unei structuri coerente a responsabilităților.
Bibliografie de bază
- Luca Dan Șerbănați, Software Design Techniques, suport de curs.
- L. D. Șerbănați, Integrating Tools for Software Development, Yourdon Press / Prentice Hall, 1992.
- E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns.
- G. Booch, J. Rumbaugh, I. Jacobson, The Unified Modeling Language. User Guide.
- M. Fowler, UML Distilled.
- C. Larman, Applying UML and Patterns.
- R. C. Martin, lucrări privind principiile SOLID.
Semnificația cursului
Privit retrospectiv, acest curs marchează trecerea de la predarea modelării software la predarea artei de a proiecta efectiv sisteme complexe. El nu mai tratează doar „cum descriem” un sistem, ci „cum îl organizăm” astfel încât să reziste la schimbare, să poată fi extins, distribuit și integrat.
În acest sens, el ocupă un loc de legătură între analiza și modelarea învățate anterior și disciplinele dedicate arhitecturii software, sistemelor distribuite și integrării. Încerca să-i obișnuiască pe studenți cu ideea că proiectarea nu este o simplă prelungire a analizei, ci o activitate distinctă, în care intervin compromisuri, constrângeri, alegeri tehnologice și forme de reutilizare.





