# Software-garapen

Softwarearen garapena softwarea sortzeko erabiltzen den prozesua da. Iturburu-kodea programatzea eta mantentzea prozesu honen funtsezko urratsak dira, baina, horrez gain, proiektua bururatzea, bideragarritasuna ebaluatzea, negozio-eskakizunak aztertzea, softwarearen diseinua, probak eta softwarea merkaturatzea ere barne hartzen ditu. Softwarearen ingeniaritzak, garapenaz gain, proiektuen kudeaketa, langileen kudeaketa eta bestelako funtzio orokorrak ere barne hartzen ditu. Softwarearen garapena sekuentziala izan daiteke, non urrats bakoitza amaitu behar den hurrengoari ekin aurretik; baina, era berean, garapen iteratiboko metodoak ere badaude, zeinetan urratsak elkarrekin garatu eta aurreko urratsak berrikusi daitezkeen malgutasuna, eraginkortasuna eta programazioa hobetzeko.

Softwarearen garapenean hainbat arlotako profesionalek parte hartzen dute. Ez dira soilik software-programatzaileak aritzen prozesu honetan, baizik eta baita testetan, dokumentazioaren idazketan, diseinu grafikoan, erabiltzaileari laguntza ematean, marketinean eta finantzazioa lortzean espezializatutako pertsonak ere. Softwarearen garapenean, ohikoa da hainbat tresna eta eredu erabiltzea, hala nola, garapen-ingurune integratuak (IDE), bertsio-kontrola, ordenagailuz lagundutako softwarearen ingeniaritza tresnak, eta softwarearen dokumentazio tresnak.

## Metodologiak

Eskura dagoen metodologia bakoitza egokiagoa da proiektu mota zehatzetarako, hainbat kontsiderazio tekniko, antolamenduzko, proiektuko eta taldekoak oinarri hartuta.

* Metodologiarik sinpleena *"kodea eta finkapena"* da, normalean proiektu txiki batean lan egiten duen programatzaile bakar batek erabiltzen duena. Programaren helburua laburki aztertu ondoren, programatzaileak kodetu eta zuzendu egiten du funtzionatzen duen jakiteko. Amaitutakoan, produktua argitaratzen da. Metodologia hau erabilgarria da prototipoetarako, baina ezin da erabili programa konplexuetarako.

* Ur-jauziaren ereduan, bideragarritasuna, analisia, diseinua, garapena, kalitatea bermatzea eta ezarpena ordena horretan gertatzen dira sekuentzialki. Eredu honek hurrengoa hasi baino lehen urrats bat betetzea eskatzen du, atzerapenak eraginez, eta ezinezkoa egiten du aurreko urratsak berrikustea beharrezkoa izanez gero.

* *Prozesu iteratiboak* metodo zirkularrak erabiliz, urrats horiek elkarren artean tartekatzea ahalbidetzen dute, malgutasuna, eraginkortasuna eta programazio errealistagoa lortzeko. Proiektuaren urrats gehienak osagai bakar batean burutu daitezke, eta iterazio bakoitzean ezaugarri garrantzitsuenak lehenets daitezke. Metodo arina garapen iteratiboan oinarritzen da eta garatzaileei kontrol handiagoa ematen die, proiektuaren ezaugarriak eta baliabideak eraginkortasunez kudeatuz. Metodo arineko eredu ezagunak dira *muturreko programazioa* eta *Scrum*.

* Metodo arinetik haratago, enpresa batzuek IT eragiketak softwarearen garapenarekin integratzen dituzte *DevOps* edo *DevSecOps* estrategien bidez, hau da, etengabeko garapena, probak, eta bezeroari entregatzea. Integrazio honen helburua IT zerbitzuak azkarrago eta eraginkorrago ematea da.

Programazio-metodologia askoren beste ardatz bat segurtasun-ahultasunak eta zomorroak (erroreak) ahalik eta azkarren detektatzea da, jarraipena eta konponketaren kostua murrizteko. 2009an egindako kalkuluen arabera, software-proiektuen %32 garaiz eta aurrekontuan aurkeztu ziren, funtzionaltasun osoarekin; %44k ezaugarri bat edo gehiago falta zituzten eta %24 bertan behera geratu ziren askatu aurretik.

## Pausuak

Softwarearen garapenaren bizi-zikloa aplikazioak garatzeko prozesu sistematikoari dagokio.

### Bideragarritasuna

Software produktuen ideia iturriak ugariak dira. Ideia horiek merkatu-ikerketatik etor daitezke, bezero berri potentzialen demografiatik, lehendik dauden bezeroetatik, produktua baztertzen zuten salmenta-aukeretatik, softwarearen garapeneko beste langile batzuetatik edo hirugarren sortzaile batengandik. Software-produktuetarako ideiak lehenik eta behin merkaturatzaileek ebaluatzen dituzte bideragarritasun ekonomikoari dagokionez, banaketa-kanal existitzen direnentzako egokitzapenean, produktu-lerroetan izan ditzaketen ondorioetan, eskatutako ezaugarrietan eta enpresaren marketin-helburuekin duten bateragarritasunean. Marketina ebaluatzeko fasean, kostuaren eta denboraren hipotesiak aztertzen dira. Bideragarritasun-analisiak proiektuaren inbertsioaren errentagarritasuna, garapen-kostuak eta epeak kalkulatzen ditu. Analisi horren arabera, enpresak erabaki dezake garapenean gehiago inbertitzea. Softwarea garatzea erabaki ondoren, enpresa produktua kalkulatutako kostuaren eta denboraren barruan, kalitate-estandar altuarekin (hau da, akatsik gabe) eta nahi den funtzionaltasunarekin entregatzera bideratzen da. Hala ere, software-proiektu gehienak berandu iristen dira, eta batzuetan konpromisoak hartu behar izaten dira ezaugarrietan edo kalitatean epea betetzeko.

### Analisia

Softwarearen analisia eskakizunen analisi batekin hasten da, beharrak identifikatzeko erronken artean daude gaur egungo edo erabiltzaile potentzialek behar desberdinak eta bateraezinak izatea, beren beharrak ulertzen ez jakitea edo softwarearen garapen-prozesuan zehar beharrak aldatzea. Azken finean, analisiaren emaitza garatzaileek lan egin dezaketen produktuaren zehaztapen zehatza izaten da. Software-analistek askotan proiektua objektu edo osagai txikiagoetan deskonposatzen dute; osagai horiek berrerabilgarriak izan daitezke, kostu-eraginkortasuna, eraginkortasuna eta fidagarritasuna handitzeko. Proiektua deskonposatzeak multiprozesadoreak erabiltzen dituzten ordenagailuetan nabarmen azkarrago exekutatzen den inplementazio harilkatu bat ahalbidetu dezake.

### Diseinua

Diseinuak softwarearen ezarpenari buruzko aukerak hartzea dakar, hala nola zein programazio-lengoaia eta datu-baseetako softwarea erabili, edo nola antolatuko diren hardwarea eta sareko komunikazioak. Diseinua iteratiboa izan daiteke, erabiltzaileekin proba-eta-akats prozesu baten bidez dituzten beharrei buruzko kontsultak eginez. Diseinuan adituak diren pertsonek parte hartu ohi dute, hala nola datu-baseen diseinuan, pantailen arkitekturan eta zerbitzarien nahiz beste hardware batzuen errendimenduan. Diseinatzaileek askotan saiatzen dira softwarearen funtzionaltasunean ereduak identifikatzen, objektuetara bideratutako programazioarekin berrerabil daitezkeen modulu bereiziak sortzeko.

### Programazioa

Softwarearen garapenaren ezaugarri nagusia da nahi den funtzionaltasuna inplementatzen duen softwarea sortzea eta ulertzea. Kodea idazteko hainbat estrategia daude. Software kohesionatuak osagai ugari izaten ditu, elkarren artean independenteak direnak. Akoplamendua, berriz, softwarearen osagai desberdinen arteko erlazioa da, eta ez da gomendagarria, mantentze-lanak zailtzen dituelako.

Askotan, software-programatzaileek ez dituzte sektoreko jardunbide onenak jarraitzen; horrek eraginkortasun gutxiko kodea sortzea ekar dezake, ulertzeko zaila eta funtzionaltasunaren dokumentaziorik gabe. Arau horiek bereziki hautsi egiten dira epeak presiopean daudenean. Ondorioz, kodea probatzea, araztea eta berrikustea askoz zailagoa bihurtzen da. Kodearen birfaktorizazioa, adibidez, kodeari iruzkin gehiago gehitzea, kodearen ulergarritasuna hobetzeko irtenbide bat da.

### Probak

Proba kodea zuzen eta akatsik gabe exekutatzen dela ziurtatzeko prozesua da. Arazketa software-garatzaile bakoitzak bere kodean egiten du, kodeak aurreikusitako funtzioa betetzen duela egiaztatzeko. Bereziki, funtsezkoa da softwareak sarrera guztietan exekutatzeko gaitasuna izatea, emaitza okerra ematen badu ere. Beste garatzaile batzuen kode-berrikuspenak sarritan erabiltzen dira proiektuari gehitutako kode berria zorrotz aztertzeko, eta zenbait kalkuluren arabera, izugarri murrizten da proben ondoren geratzen diren akatsen kopurua. Behin kodea aurkeztuta, kalitate-berme sailak—enpresa handietan programatzaileak ez diren pertsonen sail bereizi bat—software-produktu osoaren zehaztasuna probatzen du. Onarpen-probak, softwarearen jatorrizko eskakizunetatik eratorritakoak, tresna ezagunak dira horretarako. Kalitate-probak, gainera, estres eta karga egiaztatzea (softwareak sarrera edo erabilera maila handiei erantzuteko duen sendotasuna), integrazio-probak (softwarea beste software batzuekin behar bezala integratuta dagoela bermatzea) eta bateragarritasun-probak (softwarearen errendimendua sistema eragile edo nabigatzaile desberdinetan neurtzea) barne hartzen ditu. Probak kodea idatzi aurretik sortzen direnean, testek bultzatutako garapena (test-driven development) esaten zaio.

### Ekoizpena

Produkzioa softwarea azken erabiltzaileari zabaltzeko fasea da. Fase honetan, garatzaileak laguntza teknikorako baliabideak sortu ditzake erabiltzaileentzat, edo aurretik detektatu ez diren akatsak eta erroreak (bug-ak) konpontzeko prozesu bat ezarri. Halaber, baliteke aurreko garapen-faseetara itzultzea erabiltzaileen beharrak aldatu edo gaizki ulertu badira.

## Langileak

Softwarearen garapena software-garatzaileek egiten dute, gehienetan taldeka lan eginez. Taldekideen arteko komunikazio eraginkorra funtsezkoa da arrakasta lortzeko, eta hori errazagoa da taldea txikia bada, elkarrekin lan egiten ohituta badago eta fisikoki gertu kokatuta badago. Komunikazioak garapenaren hasierako faseetan arazoak identifikatzen laguntzen du eta ahalegin bikoiztuak saihesten ditu. Gainera, garapen-proiektu askok langile bakar baten eskuetan dagoen funtsezko ezagutza galtzeko arriskua murrizten dute, langile anitz osagai bakoitzarekin ezagututa daudela ziurtatuz.

Softwarearen garapenean hainbat arlotako profesionalek parte hartzen dute: ez bakarrik software-programatzaileek, baita probetan, dokumentazioa idaztean, diseinu grafikoan, erabiltzailearen laguntzan, marketinean eta funtsak biltzean espezializatutako pertsonek ere. Software pribatua garatzen duten langileak normalean ordaindu egiten dira, baina kode irekiko softwarearen ekarpen gehienak boluntarioek egiten dituzte. Hala ere, batzuetan enpresek, softwarea saltzea negozio-eredu nagusi ez dutenek, garatzaile horiek ordaintzen dituzte, kode irekiko softwarearen zerbitzuak edo aldaketak eskaintzen dituzten jarduera osagarrien bidez.

## Ereduak eta tresnak

### Ordenagailuz lagundutako softwarearen ingeniaritza

Ordenagailuz lagundutako softwarearen ingeniaritza (CASE) softwarearen garapenaren automatizazio partzialerako tresnak dira. CASEak diseinatzaileei aukera ematen die programa baten logikaren zirriborroa egiteko, bai idatzi beharrekoa, bai lehendik dagoena, kode berriarekin integratzen edo alderantzizko ingeniaritza (adibidez, programazio-lengoaia aldatzeko) egiteko.

### Dokumentazioa

Dokumentazioa bi formatutan iristen da, normalean bereizita mantentzen direnak: software-garatzaileentzat, eta azken erabiltzaileei softwarea erabiltzen laguntzeko eskura jartzen zaienak. Garatzaileen dokumentazio gehiena aplikazioaren programazio-interfazea (API) estaltzen duten fitxategi, klase eta metodo bakoitzeko kode-iruzkinetan dago, hau da, softwarearen zati bat beste batek nola eskura dezakeen azaltzen duen informazioan, eta askotan, aplikazioaren ezarpen xehetasunetan ere. Dokumentazio hau lagungarria da garatzaile berrientzat, proiektua ulertzen hasteko. Agile garapenean, dokumentazioa maiz kodearekin batera idazten da. Erabiltzaileen dokumentazioa, berriz, idazle teknikoek idazten dute maizago.

### Esfortzuaren estimazioa

Estimazio zehatza funtsezkoa da bideragarritasun-fasean eta produktua garaiz eta aurrekontuaren barruan entregatzean. Estimazioak sortzeko prozesua proiektuaren zuzendariak delegatzen ohi du. Ahaleginaren zenbatespena aplikazio osoaren tamainarekin zuzenean lotuta dagoenez, eskakizunen ezaugarriak gehitzeak eragin handia du — zenbat eta eskakizun gehiago, orduan eta garapen-kostu handiagoa —. Funtzionaltasunarekin zerikusirik ez duten alderdiak ere kontuan hartu behar dira estimazioan, hala nola software-garatzaileen esperientzia eta kodearen berrerabilgarritasuna.

### Garapen-ingurune integratua

Garapen-ingurune integratu batek (IDE) ezaugarri hobetuak eskaintzen dizkio softwarearen garapenari testu-editore sinple baten aldean. IDEek, askotan, konpilazio automatizatua, akatsak nabarmentzeko sintaxia, arazketa-laguntza, bertsioen kontrolarekiko integrazioa eta proben erdiautomatizazioa barne hartzen dituzte.

### Bertsio kontrola

Bertsioen kontrola softwarean egindako aldaketak kudeatzeko modu ezaguna da. Bertsio berri bat egiaztatzen den bakoitzean, softwareak aldatutako fitxategi guztien segurtasun-kopia bat gordetzen du. Programatzaile bat baino gehiago softwarean aldi berean ari badira lanean, beren kode aldaketen fusioa kudeatzen du. Softwareak bi aldaketa multzoren artean gatazka dagoen kasuak nabarmentzen ditu eta programatzaileei gatazka konpontzeko aukera ematen die.

### Ikuspegi-eredua

Ikuspegi-eredua sistemaren eta bere ingurunearen ikuspuntuak eskaintzen dituen esparru bat da, softwarearen garapen-prozesuan erabili beharrekoa. Ikuspegi baten azpian dagoen semantika grafikoaren irudikapena da.

Ikuspuntuen eta ikuspegien helburua da giza ingeniariek sistema oso konplexuak ulertzea eta arazoaren elementuak espezializazio-eremuen inguruan antolatzea. Fisikoki intentsiboak diren sistemen ingeniaritzan, ikuspegiak ingeniaritzaren antolaketan dauden gaitasunei eta erantzukizunei dagozkie.

## Jabetza intelektuala

Jabetza intelektuala arazo bat izan daiteke garatzaileek kode irekiko kodea edo liburutegiak produktu pribatibo batean integratzen dituztenean, izan ere, softwarearen kode irekiko lizentzia gehienek aldaketak lizentzia berarekin askatzea eskatzen dute. Alternatiba gisa, garatzaileek aukera pribatibo bat aukeratu ahal izango dute edo beren software-modulua sortu.

## Erreferentziak