Documente Academic
Documente Profesional
Documente Cultură
Cuprins
Introducere ............................................................................................................................ - 7 -
e. Refactorizarea codului.......................................................................................... - 25 -
4.1 Problema.................................................................................................................... - 37 -
Concluzie ............................................................................................................................ - 49 -
Bibliografie ......................................................................................................................... - 50 -
-7-
Introducere
Această lucrare îşi propune să sintetizeze metodologiile de dezvoltare software
încadrate în categoria Agile, care se bucură în ziua de astăzi de o creştere continuă în
popularitate în rândul companiilor de pe piaţa IT. Lucrarea descrie punctele comune şi
punctele diferite ale fiecărei metodologii în parte, precum şi recomandări pro şi contra
folosirii lor în diverse proiecte, în procesul de dezvoltare software.
Ideea poate fi extinsă şi la altfel de echipe IT, pretându-se foarte bine şi echipelor de
testare, care lucrează în acelaşi timp cu echipele de dezvoltare, deoarece aceleaşi diferenţe
între un junior şi senior, de exemplu, vor exista şi în echipele de testare.
-8-
1. Introducere în Agile
Una dintre primele probleme care apar la inceputurile unui nou proiect software este
discuţia despre ce metodologie de dezvoltare se va folosi. Acest aspect este o decizie
suficient de importantă si va genera discuţii si dispute aprinse, întrucât este foarte dificil
sau chiar imposibil sa fie schimbată în decursul proiectului, fără a afecta planificarea
iniţială. Astfel, se remarcă mai multe categorii mari de metodologii de dezvoltare
software:
a. Waterfall
b. Prototipul
c. În spirală
d. Agile
Dintre acestea, cele mai folosite în ziua de astăzi ar fi Waterfall şi Agile, cu tendinţa
metodologiei Agile de a câştiga teren faţă de clasicul Waterfall, celelalte reprezentând o
pondere mai mică în ingineria software, fiind în schimb folosite în alte domenii.
Prima prezentare conţinând etape similare a fost ţinută in 1956 de către Herbert
Benington, în cadrul Simpozionului pentru metode de programare avansată. În care acesta
descria procesul folosit pentru dezvoltarea proiectului SAGE (Semi Automated Ground
Environment), proiect pentru apărarea aeriană automata a Americii de Nord.
Prima prezentare formală a procesului a avut loc de fapt mult mai târziu, în 1970, într-
un articol al cărui autor a fost Winston Royce, acesta nefolosind termenul „waterfall” în
prezentarea sa. Royce l-a prezentat ca pe un model intens folosit, care este greşit si
nefuncţional.
-9-
Termenul de „waterfall” sau „cascadă” a apărut mai târziu, datorită definiţiei etapelor,
în stil „top-down”, fără elemente repetitive, ca o cascadă care mereu merge în jos, iterativ,
niciodată nu urcă şi nu repetă etapele anterioare.
În general, etapele sunt mai multe sau toate din lista următoare, ca în Figura 1 de mai
jos [13]:
Acestui tradiţional model de dezvoltare i s-au adăugat modele modificate de-a lungul
anilor, în funcţie de necesităţile de moment, păstrând totuşi neschimbate conceptele de
bază.
1.2 Prototipul
Acest modelul de dezvoltare implică definirea iniţială a unui model sau tipar, numit
prototip, după care se va ghida întreg procesul de dezvoltare software, şi care poate fi
folosit în testare sau ca demonstraţie pentru client [8].
Modelul acesta a fost derivat din Waterfall, în acele cazuri când cerinţele iniţiale nu
sunt foarte clare. În timpul procesului de construire a acestui model, clientul va oferi
feedback din când în când, acest fapt conducând la obţinerea acestui prototip. Având
confirmarea de la client la terminarea construcţiei acestui prototip, este posibilă editarea
unui document de specificaţii. Folosind acesta, se poate începe dezvoltarea software a
produsului final, folosind în general Waterfall.
Această metodologie a fost descrisă pentru prima oară de către Barry Boehm în 1986.
Este folosită în general în sistemele cu grad ridicat de risc. În general, fiecare buclă a
spiralei reprezintă o fază a dezvoltării, iar fiecare fază va fi alcătuită din 4 paşi [7],
descrişi mai jos:
1.4 Agile
Datorită greutăţilor întâmpinate în timpul dezvotării proiectelor folosind „waterfall”, a
fost prezentată in 2001 o metodologie numită generic „Agilă”, bazată pe etape
incrementale si repetitive, în care cerinţele se dezvoltă pe parcurs, având suportul întregii
echipe şi de asemenea axându-se pe colaborarea intensă între membrii echipei.
Termenul „agile” a fost prezentat în 2001 de către autorii „Agile Manifesto” [1], o
proclamaţie a unor valori cheie si principii de dezvoltare, care are 17 semnatari.
După cum se poate observa, aceste principii sunt foarte generale si se pot folosi
practic în mult mai multe domenii, nu doar în dezvoltarea de software, iar autorii acestui
manifest doresc introducerea si familiarizarea mai multor industrii cu aceste concepte
utile si principii.
O parte din aceşti autori au decis formarea „alianţei Agile” [2], o organizaţie non
profit care promovează şi astăzi devoltarea Agile, conform principiilor si regulilor de mai
sus. Deşi iniţial nu foarte cunoscută, metodologia a inceput să prindă contur pe parcursul
ultimilor ani, în 2005 fiind publicat un addendum la Agile Manifesto, numit „Declaraţia
de Independenţă”, un set de 6 principii de management în dezvoltarea agilă de software,
iar în 2009 a fost publicat „Software Craftmanship Manifesto”, un ghid extins pentru
- 14 -
comunicarea intensivă descrisă mai sus poate consuma suficient de mult timp, probabil
mai mult decât în metoda Waterfall [4], dar în acest caz avantajele sunt mai importante
decat dezavantajele.
Waterfall vine şi ea cu o serie de avantaje, printre care numărăm un plan clar de lucru
la inceputul proiectului şi posibilitatea unei estimări mai acurate [4]. Timpul de lucru si
bugetul sunt mult mai bine planificate, ceea ce este de obicei pe placul clienţilor.
Deoarece se pune accent pe documentare si planificare, înlocuirea unui individ în timpul
procesului de dezvoltare nu este foarte dificilă, o persoană nouă putând cu uşurinţă să ia
locul altcuiva în timpul procesului de dezvoltare.
1.6 Ce alegem
Alegerea unei metodologii la începutul proiectului poate fi dificil, întrucât este clar că
nici una nu este potrivită pentru toate cazurile şi toate tipurile de proiecte. Susţinătorii
ambelor metodologii vor exista mereu şi asta deoarece fiecare are avatanje considerabile
şi se poate plia pe anumite tipuri de proiecte mai bine decât opusa ei.
În general, Waterfall tinde să fie mai utilă atunci când se estimează multe schimbări
pe parcursul proiectului, când se cunoaşte bugetul clientului de la început şi ceea ce se
doreşte a se obţine prin proiect este foarte clar. Este mai potrivită în cazul proiectelor
foarte mari, care se întind pe o durată mare de timp şi implică echipe mari, în care multă
interacţiune cu clientul ar încetini foarte mult procesul, sau echipe distribuite în mai
multe ţări, eventual cu fuse orare foarte diferite.
- 16 -
Agile tinde să fie potrivită pentru proiecte mai mici, cu tendinţe de schimbare pe
parcurs, echipe mai mici şi independente, de obicei localizate în acelaşi loc.
Este necesar ca echipele să fie alcătuite din indivizi cu diferite responsabilităţi pentru
a putea fi atinse toate punctele anterioare. De asemenea este necesară prezenţa în
permanenţă a unui reprezentant al clientului la şedinţele ce au loc în cadrul echipei de
dezvoltatori sau posibilitatea contactării acestuia în permanenţă, pentru a confirma cu
aceştia cerinţele necesare şi a clarifica problemele decizionale care s-ar putea ivi.
Sfârşitul unui sprint nu are ca scop livrarea unui produs final, ci mai degrabă livrarea
unor funcţionalităţi cu un număr redus de defecte (buguri).
2.1 Scrum
Scrum este o metodă de dezvoltare Agile si management de proiect bazată pe
flexibilitate la schimbări si planificare iniţială minimală. Procesul Scrum se realizează în
scurte iteraţii numite sprinturi, care durează până la patru săptămâni. Fiecare sprint începe
cu o sedinţă scurtă de planificare şi se finalizează cu un review. Ideea principală este de a
lăsa dezvoltatorilor posibilitatea de a se auto planifica, întrucât ei sunt cei mai in măsură
să estimeze si să realizeze corect livrarea şi de asemenea de a rezolva problemele pe
măsură ce acestea apar. În momentul de faţă este cea mai des folosită metodă din
categoria Agile, de sine stătătoare sau în combinaţie cu altele.
a. Product Owner
Product Ownerul lucrează în strânsă legătură cu clientul şi este responsabil de
comunicarea cu echipa de dezvoltatori si explicarea acestora viziunea clientului asupra
proiectului. El reprezintă interesele clientului prin descrierea cerinţelor şi prioritizarea lor
- 20 -
corectă. În general, în marile companii, acest rol are şi responsabilităţile unui Project
Manager, acest lucru neafectând responsabilităţile lui principale în dezvoltarea Scrum
b. Scrum Master
Scrum Masterul se asigură că procesul Scrum este urmat cu stricteţe si nu există
impedimente care ar putea afecta livrarea la sfârşitul sprintului. El este cel care motivează
în permanenţă echipa de dezvoltatori şi se asigură că problemele sunt rezolvate rapid şi
eficient. Este oarecum similar cu un team-leader şi se află ca mediator între echipa de
dezvoltatori şi Product Owner.
c. Membru al echipei
Echipa este responsabilă de livrarea la timp şi calitativă a produsului software. În
scrum, echipele sunt mixte, adică sunt alcătuite din ingineri software, analişti, arhitecţi,
programatori, testeri, designeri. Fiecare dintre aceşti membri particpă la sedinţele zilnice
şi ia parte la luarea de decizii. Echipa este autonomă, fără a fi nevoie de prezenţa unui
team-leader.
d. Roluri secundare
Printre rolurile secundare se numără Stakeholders (părţile interesate) – clienţii, care au
interes în finalizarea produsului, reprezentaţi de către Product Owner, şi utilizatorii finali,
care sunt cei cărora li se adresează produsul.
- 21 -
Deşi la prima vedere pare foarte similară ca metodologie cu Scrum, între cele doua
există şi diferenţe notabile [10]:
În general, Test Driven Development este alcătuit din mai multe faze, ca în figura de
mai jos [15]:
să cunoască foarte bine cerinţele înaintea scrierii codului, ceea ce va ridica considerabil
calitatea codului şi va îmbunătăţi aria de acoperire a sa.
c. Implementarea funcţionalităţii
În aces pas, singurul scop este scrierea de cod care va face testele să fie terminate cu
succes. Nu este esenţială atenţia la calitatea codului, este importantă viteza cu care noua
funcţionalitate este scrisă. Acest pas trebuie să dureze cât mai puţin.
e. Refactorizarea codului
Având certitudinea faptului că noua funcţionalitate este complet implementată şi în
conformitate cu cerinţele, aces pas se asigură de calitatea codului. Codul va fi refactorizat,
respectând tehnicile moderne de ingineria programării. Acest pas se realizează
conconmitent cu pasul anterior, pentru a avea certitudinea că refactorizarea nu cauzează
defecte în funcţionalitatea existentă.
Toate etapele de mai sus se vor repeta ori de câte ori este necesar, până la sfârşitul
proiectului. Acest tip de dezvoltare determină o mare calitate a codului scris şi se asigură
că defectele sunt descoperite şi reparate cât mai devreme în procesul de dezvoltare.
Venind cu aceste beneficii, acest model de dezvoltare vine şi cu un defect considerat
- 26 -
adesea major, şi anume faptul că procesul este îndelungat şi costisitor, fiind mai potrivit
uneori pentru proiectele de mică anvergură şi cu module slab cuplate între ele.
În acest tip de dezvoltare, există câteva reguli „best-practice”, care ajută la obţinerea
unei calităţi superioare a TDD şi implicit, a proiectului final. Printre ele se numără:
f. Deploymentul automat
Deploymentul automat uşurează foarte mult munca dezvoltatorilor. Ideal ar fi să
existe taskuri care realizează deployment automat pe toate maşinile de integrare şi testare,
eventual şi în producţie. Eventualele greşeli de integrare pot fi apoi rezolvate manual, dar
un proces automat minimizează existenţa erorilor umane.
2.5 Kanban
Metodologia Kanban provine de la Toyota – sistemul JIT (just-in-time), şi se axează
pe eliminarea efectului de dop de sticlă (bottleneck), prin optimizarea procesului de
producţie în orice domeniu. Deşi tehnologia construcţiilor de maşini nu are foarte multe
similarităţi cu ingineria software, procesul Kanban a fost bine primit în ultima vreme şi se
regăseşte printre metodologiile Agile.
Kanban îşi propune să rezolve această problemă, limitând dinamic volumul de muncă
al fiecărui rol, folosind aşa numita tablă Kanban, ca in figura de mai jos [11]:
Cifrele de deasupra fiecărui pas reprezintă numărul maxim de itemi care pot fi la un
moment dat în curs în pasul respectiv. Dacă acest număr este depăşit pe vreuna dintre
coloane, aceasta devine blocaj şi trebuie găsite rapid soluţii pentru a scădea numărul
aferent. Oricare dintre coloane poate conţine itemi în curs şi terminaţi, figura exemplifică
acest lucru doar pe două dintre coloane.
- 32 -
3. Estimarea în Agile
Estimarea este una dintre problemele cele mai dificile cu care se confruntă toate
părţile implicate într-un proiect software. Pornind de la calcule simple şi până la algoritmi
complecşi, estimările pot fi foarte dificil de realizat în industria IT, datorită lipsei
constantelor din tehnologia actuală. Spre deosebire de alte industrii, nu se poate calcula
cu precizie cât va dura un task, deoarece există prea mulţi factori de luat în considerare,
factori care includ tehnologiile folosite, experienţa pe proiect, resursele fizice pe care va
rula proiectul etc.
În Agile există două tipuri de estimări care se folosesc în mod frecvent, şi anume
estimarea bazată pe puncte (story point) şi estimarea bazată pe zile de dezvoltare (ideal
developer days) [16]. Deşi în trecut estimarea pe zile a fost mai des folosită,
metodologiile tradiţionale având nevoie de estimări stricte pe perioade lungi de timp,
odată cu apariţia Agile a inceput să prindă contur estimarea bazată pe puncte [17].
În ambele cazuri, estimarea are loc în 4 paşi standard, care se pot vedea în figura de
mai jos:
Dacă este nevoie, ultimii 2 paşi se pot repeta până când se ajunge la un consens.
- 33 -
Aceste aplicaţii au foarte multe întrebuinţări şi sunt folosite la scară largă în industria
software. Ele pot avea use-case-uri de tipul:
o un dezvoltator poate vedea taskurile care i-au fost atribuite, le poate sorta în funcţie de
prioritate, de modulul afectat, de gravitate etc.
o un dezvoltator îşi poate loga orele lucrate la diverse sarcini
o un utilizator (team leader, project manager) poate estima diverse taskuri şi le poate
atribui priorităţi, le poate atribui dezvoltatorilor etc
o un tester poate realiza aceleaşi acţiuni pe un test plan ca şi dezvoltatorii pe taskuri
o un project manager poate observa planificările, poate schimba diverse informaţii la
nivel de proiect
o un project manager poate crea rapoarte despre taskurile terminate, în lucru sau
neîncepute, şi poate avea o imagine de ansamblu a muncii fiecărui membru al echipei
de dezvoltatori sau testeri
- 37 -
4.1 Problema
Deşi aplicaţiile sunt făcute în aşa fel încât să ofere foarte multe funcţionalităţi, ele
sunt organizate în aşa fel încât să fie concentrate pe proiect şi pe taskurile componente.
Un task poate fi estimat la începutul proiectului la un număr de ore sau zile şi eventual
reestimat pe parcurs, în funcţie de diverse module care l-ar putea afecta. Apoi unui
dezvoltator îi este atribuit acel task. Respectivul dezvoltator trebuie să încerce pe cât
posibil să se incradreze în acea estimare, cu toate că acest lucru îi este uneori imposibil,
datorită factorilor externi sau interni:
o Factori externi: meetinguri lungi o dată sau de mai multe ori pe zi, colegi care
trebuie ajutaţi, probleme administrative în cadrul companiei, traininguri etc.
o Factori interni: capacitatea dezvoltatorului de a rezolva taskul, în funcţie de
experienţa sa, cunoasterea tehnologiilor necesare, talentului său de
programator etc.
Acest task i-a fost atribuit dezvoltatorului D, cu un nivel mediu de experienţă, dar cu
vechime pe proiect. Putem presupune astfel că taskul nu va fi greu de integrat de către
dezvoltator, datorită cunoştinţelor acestuia despre proiect şi modulele sale, dar că i-ar
putea crea anumite întârzieri datorită limbajului L, de exemplu, limbaj pe care
- 38 -
Din exemplu de mai sus putem deduce că taskul T poate avea întârzieri mari, iar
timpul real în care taskul a fost terminat poate fi şi dublu faţă de estimarea iniţială. Şi cu
toate că în unele companii este posibilă şi raportarea timpului petrecut în sedinţe, multe
aplicaţii nu permit decîr raportarea muncii la taskuri, deci este necesar să se raporteze 8
ore pe zi. Este simplu de dedus că, impreună cu diverse pauze scurte din timpul zilei, cu
prezentarea proiectului către noul coleg, cu şedinţa si cu alte eventuale modalităţi de
distragere a atenţiei, nu este posibil să se fi lucrat 100 % din zi la task, deci vor apărea
întărzieri. Sub un deadline strâns, multi dezvoltatori sunt nevoiţi să petreacă foarte multe
ore în plus la servici, pentru a rezolva taskurile prost estimate in iniţial. În urma multor
ore de muncă în plus, productivitatea va scădea, nemulţumirile personale vor creşte, fapt
care nu este benefic nici pentru angajat, nici pentru proiect şi nici pentru companie, pe
termen lung.
User story – modulele care vor intra în sprintul curent. Mai multe persoane pot lucra
concomintent la acelaşi user story.
Task - unitate de muncă, sarcină mică care intră în componenţa unui user story. Un
task este rezolvat de un singur dezvoltator.
Skill – calităţile, abilităţile şi factorii externi care ţin strict de Resource şi care
influenţează estimarea taskurilor. Acestea au fiecare un Skill Weight (pondere): unele
sunt mai importante ca altele, în sensul că vor influenţa mai mult estimarea.
Figura 11: lista de taskuri ale sprintului curent, împreună cu informaţii despre ele
Exemplu: un dezvoltator senior poate termina un task estimat la 8 ore în mai puţin de
atâta, dacă lucrează neîntrerupt. Dar tot acelaşi programator senior mai are si alte atribuţii
în afara sarcinilor ce ţin strict de proiect, cum ar fi realizarea de diverse trainiguri la
interni şi juniori (inclusiv pregătirea prezentărilor respective), şedinţe, ajutarea diverşilor
colegi cu diverse probleme etc. Presupunând munca la task de 7 ore, plus o sedinţă de o
ora, un training de o oră şi explicarea problemelor unor colegi care au nevoie de ajutor
încă o oră, estimarea este uşor depăşită. Adăugând mai multe taskuri similare, într-un user
story este foarte uşor să nu se respecte acel estimările iniţiale.
- 41 -
Figura 12: Pagina de detalii a unui dezvoltator, conţinând detalii despre skilluri,
productivity index, taskuri atribuite
∑ ( )
Orele reale pentru un task se calculează din orele estimate, folosind Productivity
Index pentru dezvoltatorul atribuit. Atribuirea taskului altui dezvoltator modifică orele
reale. Acestea se calculeazo conform formulei:
( )
Unde simbolurile au următoarea semnificaţie:
Formula foloseşte o diferenţă între 100 şi Productivity Index, deoarece, cu cât acesta
este mai mare, cu atât acel dezvoltator este mai bine pregătit şi va putea rezolva mai rapid
taskul. Diferenţa de la 100 provine de la faptul că Productivity Index se calculează ca un
procent.
- 43 -
Figura 12: pagina de editare a unui task sugerează numele unui alt dezvoltator, care
ar putea rezolva taskul în mai puţin timp
4.3.5 Auto-atribuirea
În unele cazuri, project managerul poate dori ca aplicaţia să atribuie automat taskurile
pentru a minimiza timpul de întârziere. Aplicaţia permite acest lucru prin folosirea unui
buton de Auto-assign, care va declanşa algoritmul de auto-atribuire a taskurilor. Nu este
obligatorie folosirea acestui algoritm, deoarece, de obicei, într-un proiect taskurile se
atribuie în funcţie de experienţă, cunoaşterea tehnologiilor etc. În Scrum, dezvoltatorii
- 44 -
decid singuri cum işi vor atribui taskurile, de aceea este important ca aplicaţia să permită
auto atribuirea, cât şi atribuirea manuală.
max_possible_hours=constant
sort list_of_tasks
sort list_of_programmers
break
Acest algoritm asigură certitudinea că taskurile cele mai lungi, la care pot apărea cele
mai mari întârzieri, sunt atribuite întâi programatorilor cei mai buni. De asemenea se
asigură că, în procesul de atribuire de taskuri, programatorii cei mai buni vor fi luaţi în
calcul, înainte de a atribui taskuri celorlalţi.
Observăm posibilitatea unor întârzieri în proiect de 34 de ore, cu 43% mai mult decât
perioada estimată.
Această atribuire s-a făcut manual, în timpul şedinţei de sprint planning. Echipa este
alcătuită din juniori şi seniori. Aceştia au totalul de ore atribuite, precum şi productivity
index ca în figura mai jos:
- 46 -
Algoritmul rulează rapid, datorită mulţimii reduse de date de procesat, apoi putem
urmări noua atribuite a taskurilor.
Oscar Wilde, cu un index de 77.60, iar cel cu indexul de productivitate cel mai mic
este Dan Brown, cu un index de 39.23.
Observăm că taskul cel mai lung i-a fost atribuit lui Oscar Wilde, astfel fiindu-i
atribuite un total de 20 de ore, apoi programatorul cu indexul imediat următor, respectiv
Umberto Eco, are atribuite 2 taskuri care totalizează 20 de ore. Dan Brown din contră,
având indexul de productivitate cel mai mic, are cele mai puţine ore atribuite, respectiv 10
ore ale unui singur task, dar care, datorită productivităţii reduse, vor putea avea o
întârziere de 6 ore.
Durata totală posibilă s-a redus la 107 ore, iar întârzierea totală posibilă este acum de
doar 27 de ore. Acest algoritm a redus intârzierea posibilă de la 42% la 33% din perioada
estimată.
Limbajul de back-end este C# 4.5, iar pentru front se foloseşte ASP.MVC 4, rezultând
o arhitectură Model View Controller.
Baza de date folosită este SQL Server Express 2008, iar ca Object Relational
Mapping (ORM) se foloseşte Entity Framework 5, disponibil în regim open-source.
Concluzie
Aplicaţia Scrum Planner oferă o imagine nouă estimărilor clasice, punând accent pe
om în locul taskului. Programatorul, respectiv cel ce realizează taskul este cel de care
trebuie să ţinem seama atunci când estimăm.
Aplicaţia poate fi extinsă pentru echipele de testare, suport, sau chiar pentru echipe
din afara sferei IT, pentru un mai bun management al timpului, respectiv al riscului de
întârziere.
Agile este o mulţime de metodologii care, pentru a avea rezultate cât mai bune,
trebuie folosite împreună. Importantă este cunoaşterea proprietăţilor specifice fiecarei
metodologii şi mularea pe proiectul care urmează a fi dezvoltat, precum şi pe echipa de
dezvoltatori, testeri, business analişti, project manageri care vor lucra împreună la proiect.
Nu există nici o metodologie potrivită perfect oricărui tip de proiect şi oricărei echipe.
Decizia de a folosi Agile nu poate fi luată peste noapte, este nevoie de studiu şi
consultarea tuturor membrilor echipei, dar este o decizie care, conform susţinătorilor săi,
va îmbunătăţi considerabil procesul de dezvoltare software. În ziua de astăzi, multe
companii IT şi mulţi clienţi ai acestora se orientează spre aceste metodologii moderne,
deoarece au incredere în rezultatele obţinute.
Agile este o direcţie care câştigă teren, iar în viitor probabil că vom vedea toate
proiectele IT conţinând, măcar intr-o mică parte, idei preluate din metodologia Agile.
- 50 -
Bibliografie
[4] Mikolouk, Kasia – Agile Vs. Waterfall: Evaluating The Pros And Cons (2013)
[7] Boehm, Barry – A Spiral Model of Software Development and Enhancement (1986)
[12] http://www.kanbanblog.com/
[13] http://www.learnaccessvba.com/application_development/waterfall_method.htm
[14] http://ultimatesdlc.com/spiral-model/
[15]http://www.codeproject.com/Articles/320791/Developing-Factorial-Application-
Using-Test-Driven
[17] Martini, Arialdo – 8 practical rules for producing decent estimates (2012)
[21] http://grouper.ieee.org/