Enginyeria de programari

Lenginyeria de programari és la disciplina o àrea de la informàtica que ofereix mètodes i tècniques per a desenvolupar i mantenir un programari de qualitat. La creació del programari és un procés intrínsecament creatiu, l'enginyeria de programari pretén sistematitzar aquest procés amb la finalitat d'acotar el risc del fracàs en la consecució de l'objectiu creatiu i ho fa per mitjà de diverses tècniques que s'han demostrat adequades a partir de l'experiència prèvia. Aquesta enginyeria tracta amb àrees molt diverses de la informàtica i de les ciències de la computació, com ara la construcció de compiladors i els sistemes operatius; utilitza totes les fases del cicle de vida del desenvolupament de qualsevol tipus de sistemes d'informació i és aplicable a infinitat d'àrees: negocis, investigació científica, medicina, logística, banca, control del trànsit, meteorologia, dret, Internet…

El terme enginyeria de programari va ser popularitzat l'any 1968 a la NATO Software Engineering Conference -que va tenir lloc a Garmisch, Alemanya- pel seu president F.L. Bauer, i s'ha fet servir àmpliament des de llavors. La disciplina d'enginyeria de programari comprèn coneixements, eines, i mètodes per a la definició de requisits de programari, i la realització de tasques de disseny de programari, programació de computadores, disseny d'interfícies d'usuari, proves de programari, i manteniment de programari.

L'enginyeria de programari també es basa en coneixements de ciències de la computació, enginyeria de la computació, gestió, matemàtiques, gestió de projectes, gestió de la qualitat, ergonomia de programari, i enginyeria de sistemes.

El terme enginyeria de programari ha generat certa polèmica, ja que és discutible que el desenvolupament de programes informàtics sigui més un art que una ciència, i que tractar d'imposar disciplines de l'enginyeria sobre un tipus d'art, com el que representa una bona pràctica a la creació de programari, és un exercici inútil.

L'Institut d'Enginyers Elèctrics i Electrònics defineix "Enginnering programari" com l'aplicació d'un enfocament sistemàtic, disciplinat, un enfocament quantificable al desenvolupament, operació i manteniment del programari, i l'estudi d'aquests enfocaments, és a dir, l'aplicació d'Enginyeria del programari.

L'enginyeria de software va aparèixer per primera vegada el 1968 a la Conferència d'Enginyeria de Software de l'OTAN i estava destinada a suscitar la reflexió sobre l'actual "crisi del programari" en aquell moment.

Des d'aleshores, ha continuat com a professió i el su camp d'acció és dissenyar, implementar i millorar el programari que és de més qualitat, més accessible, més fàcil de mantenir i més ràpid de desenvolupar. Atès que el camp és encara relativament jove en comparació amb els seus germans dels camps de l'enginyeria, hi ha molt debat sobre què és realment l'enginyeria de programari, i si s'ajusta a la definició clàssica de l'enginyeria.

Tot i que és discutible l'impacte que ha tingut durant el desenvolupament de programes efectius als últims 40 anys, el futur del camp sembla brillant d'acord amb Money Magazine i Salary.com que van qualificar l'"enginyeria de programari" com el millor treball als Estats Units en 2006.

Història 
Quan els primers equips digitals moderns van aparèixer a la dècada del 1940, les instruccions per fer-los funcionar s'implementaven directament a la màquina. Els professionals es van adonar ràpidament que aquest disseny no era flexible i se'ls va acudir l'"arquitectura de programa emmagatzemat", o l'arquitectura de Von Neumann. Així, la primera divisió entre "maquinari" i "programari", va començar amb abstracció, i es va fer servir per tractar la complexitat de la computació.

Els llenguatges de programació van començar a aparèixer a la dècada del 1950 i això és també un altre pas important a l'abstracció. Els principals idiomes com el Fortran, ALGOL, i Cobol van ser alliberats a finals del 1950 per fer front a científics, algorísmica, i els problemes de negocis. E.W. Dijkstra va escriure el seu treball seminal, "Go-to statement considered harmful", el 1968 i David Parnas va introduir el concepte clau de la modularitat i ocultació d'informació el 1972 per ajudar els programadors a bregar amb la complexitat, cada vegada més gran, dels sistemes informàtics. Un sistema de programari per a la gestió del maquinari anomenat sistema operatiu també va ser introduït, en particular per Unix, el 1969. El 1967, el Simula va introduir el llenguatge de programació orientada a objectes paradigma.

Aquests avenços en el programari es van trobar amb més avenços en el maquinari. A la dècada del 1970, el microordinadors es va introduir, per la qual cosa va ser econòmic pels aficionats d'obtenir un ordinador i es comença a escriure programari per a aquest motiu. Això, al seu torn, va conduir al, ara famós, ordinador personal (PC) i Microsoft Windows. El Desenvolupament de Software Cicle de Vida o SDLC també comencen a aparèixer com un consens per a la construcció centralitzada del programari als anys 1980. A final del 1970 i principis del 1980, es va veure la introducció de diversos nous Simula inspirats en els llenguatges de programació orientada, incloent-hi C, Smalltalk, i Objective C.

Els codis oberts de programari van començar a aparèixer als anys 90 en forma de Linux, i altres programaris van presentar el "basar" o l'estil descentralitzat de la construcció del programari. Després d'Internet i el World Wide Web va arribar, a mitjans dels 90, el canvi de l'enginyeria de programari, una vegada més. Els Sistemes distribuïts van guanyar influència com una forma de disseny de sistemes, i el llenguatge Java de programació es va introduir amb la seva pròpia màquina virtual com un pas més en l'abstracció. Programadors col·laboradors i van escriure el Manifest àgil, que va afavorir els processos més lleugers per crear una forma més econòmica i oportuna de programari.

Implicacions socioeconòmiques 
L'enginyeria de programari afecta l'economia i les societats de diverses maneres. A més a més, amb la indústria del llenguatge s'estan trobant cada vegada més camps d'aplicació a escala global.

L'enginyeria de programari canvia la cultura del món a causa de l'ús generalitzat de l'ordinador. El correu electrònic (e-mail), la WWW i la missatgeria instantània permeten a la gent interaccionar de noves maneres. El programari baixa el cost i millora la qualitat dels serveis de salut, els departaments de bombers, les dependències governamentals i altres serveis socials. Els projectes reeixits on s'han utilitzat mètodes d'enginyeria de programari inclouen GNU / Linux, el programa del transbordador espacial, els caixers automàtics i molts altres.

Metodologia 
Un objectiu de dècades ha estat trobar processos i metodologies, que fossin sistemàtics, predictibles i repetibles, per tal de millorar la productivitat en el desenvolupament i la qualitat del producte software.

Etapes del procés 
L'enginyeria de programari requereix dur a terme nombroses tasques, dins d'etapes com les següents:

Anàlisi de requisits 
Extreure els requisits d'un producte de programari és la primera etapa per crear-lo. Mentre que els clients pensen que ells saben allò que el programari ha de fer, es requereix habilitat i d'experiència en l'enginyeria de programari per a reconèixer requisits incomplets, ambigus o contradictoris. El resultat de l'anàlisi de requisits amb el client es plasma en el document ERS, Especificació de Requisits del sistema. Així mateix, es defineix un diagrama d'Entitat/Relació, en què es plasmen les principals entitats que participaran en el desenvolupament del programari.

La captura, anàlisi i especificació de requisits és una part crucial; d'aquesta etapa depèn en gran manera l'assoliment dels objectius finals. S'han ideat models i diversos processos de treball per a aquestes finalitats. Tot i que encara no està formalitzada, ja es parla de l'anàlisi de requisits.

L'IEEE Std 830-1998 normalitza la creació de les especificacions de requisits de Programari (Software Requirements Specification).

Especificació 
L'especificació de requisits descriu el comportament esperat en el programari un cop desenvolupat. Gran part de l'èxit d'un projecte de programari radicarà en la identificació de les necessitats del negoci (definides pel client o el director de producte), així com la interacció amb els usuaris funcionals per a la recollida, classificació, identificació, priorització i especificació dels requisits del programari.

D'entre les tècniques utilitzades per a l'especificació de requisits se'n troben:

 Casos d'Ús, més rigorosos i formals.
 Històries d'usuari, més àgils i informals.

Arquitectura 
La integració d'infraestructura, desenvolupament d'aplicacions, bases de dades i eines gerencials, requereixen capacitat i lideratge per poder ser conceptualizats i projectats en un futur, solucionant els problemes d'avui. El rol en el qual es deleguen totes aquestes activitats és el de l'arquitecte.

L'arquitecte del software és la persona que afegeix valor als processos de negoci gràcies a la seva aportació important de solucions tecnològiques.
L'Arquitectura de Sistemes en general, és una activitat de planificació, ja sigui a nivell d'infraestructures de xarxa i hardware, o de software.
L'arquitectura de software consisteix en el disseny de components d'una aplicació (entitats del negoci), generalment utilitzant patrons d'arquitectura. El disseny arquitectònic ha de permetre visualitzar la interacció entre les entitats del negoci i a més pot ser validat, per exemple, mitjançant els diagrames de seqüència.

Un disseny arquitectònic descriu en general com es construirà una aplicació de software. Per això es documenta utilitzant diagrames, per exemple:

 Diagrama de classes.
 Diagrama Entitat-Relació
 Diagrama de Diagrames de desplegament.
 Diagrama de seqüència.

Els dos primers són els mínims necessaris per descriure l'arquitectura d'un projecte, i, depenent de l'abast, complexitat i necessitats del projecte, els arquitectes trien quins diagrames elaboren.

Programació 
Reduir un disseny a codi pot ser la part més òbvia del treball d'enginyeria de programari, però no necessàriament és la que demana més treball i ni la més complicada. La complexitat i la durada d'aquesta etapa està íntimament relacionada amb el o els llenguatges de programació utilitzats, així com amb el disseny prèviament realitzat.

Prova 
Consisteix a comprovar que el programari realitzi correctament les tasques indicades en l'especificació del problema. Una tècnica de prova és provar per separat cada mòdul del programari, i després provar-lo de forma integral, per així arribar a l'objectiu.

Es considera una bona pràctica que les proves siguin efectuades per algú que no sigui el desenvolupador que el va programar, idealment una àrea de proves, sense perjudicis perquè el programador faci les seves pròpies proves.

En general, hi ha dues grans formes d'organitzar una àrea de proves, la primera és que estigui formada per personal inexpert i que desconegui el tema de proves, d'aquesta manera s'avalua que la documentació lliurada sigui de qualitat, que els processos descrits són tan clars que qualsevol pot entendre'ls i el programari fa les coses tal com estan descrites. El segon enfocament és tenir una àrea de proves conformada per programadors amb experiència, persones que saben sense més indicacions en quines condicions pot fallar una aplicació i que poden posar atenció en detalls que personal inexpert no consideraria.

Documentació 
Tot el que està relacionat amb la documentació del propi desenvolupament del programari i de la gestió del projecte, passant per models (UML), diagrames, proves, manuals d'usuari, manuals tècnics, etc.; tot amb el propòsit d'eventuals correccions, usabilitat, manteniment futur i ampliacions al sistema. Aquesta part és força important, ja que des de sempre es pensa el producte des de zero, i el client final no arribarà a entendre-ho tan bé com nosaltres. Per això cal documentar tot el material existent. Proves, manuals, instruccions específiques...tot en general, per tal que el client sempre sigui capaç de resoldre ell tot sol un possible problema de conceptes.

Manteniment 
Mantenir i millorar el software per arreglar errors i aplicar nous requisits. Això pot requerir més temps que fins i tot el mateix desenvolupament inicial del software. Al voltant d'un 60% de tota l'enginyeria del software té a veure amb el manteniment. Una petita part del treball consisteix a solucionar errors, o bugs. La major part consisteix a estendre el sistema per fer noves aplicacions. De manera similar, al voltant del 60% de tota l'enginyeria civil, arquitectura i treballs de construcció és donar manteniment.

Models de desenvolupament de programari 
L'enginyeria de programari té diversos models, paradigmes o filosofies de desenvolupament en els quals es pot donar suport per a la realització de programari, dels quals podem destacar aquests per ser els més utilitzats i els més complets:

 Model cascada o Clàssic (model tradicional).
 Model espiral (model evolutiu).
 Desenvolupament per etapes.
 Desenvolupament iteratiu i creixent o iterativa i incremental.
 RAD (Rapid Application Development).
 Desenvolupament concurrent.
 RUP (Model Racional).
 UML.

L'enginyeria de programari té a veure amb diversos camps en diferents formes:

 Matemàtiques: Els programes tenen moltes propietats matemàtiques. Per exemple: la correcció i la complexitat de molts algorismes són conceptes matemàtics que poden ser rigorosament provats. L'ús de les matemàtiques a l'EP és anomenat mètodes formals.
 Creació: Els programes són construïts en una seqüència de passos. El fet de definir pròpiament i dur a terme aquests passos, com en una línia d'acoblament, és necessari per millorar la productivitat dels desenvolupadors i la qualitat final dels programes. Aquest punt de vista inspira els diferents processos i metodologies que trobem a l'EP.
 Gestió de Projectes : El programari comercial (i la majoria del no comercial) requereix gestió de projectes. Hi ha pressupostos i establiment de temps, gent per liderar, recursos (espai d'oficina, ordinadors) per adquirir... Tot això encaixa apropiadament amb la visió de la Gestió de Projectes.
 Art: Els programes contenen molts elements artístics. Les interfícies d'usuari, la codificació, etc. Fins i tot, la decisió per un nom d'una variable o una classe.

Fases de desenvolupament del programari 

El lliurament de programari és la distribució, ja sigui pública o privada, d'un producte nou o millorat en forma de programa per a ordinador. Cada cop que es canvia un programa o sistema, els enginyers informàtics i les empreses que realitzen el treball decideixen com canviaran o lliuraran aquests productes. Les actualitzacions de programari són un mètode de distribució de canvis, així com les descàrregues i els discos compactes.

Professió 
Els requisits legals per a la concessió de llicències o certificació d'enginyers de programari professionals varien al voltant del món. Al Regne Unit, la British Computer Society autoritza enginyers de programari i membres de la societat a convertir-se en Enginyers Col·legiats (CEng), mentre que en algunes zones del Canadà, com Alberta, Colúmbia Britànica, Ontario, i el Quebec, els enginyers de programari poden mantenir la designació d'Enginyer Professional (P. Eng) i/o la designació de Sistemes d'Informació Professional (ISP). Al Canadà, hi ha un requisit legal per obtenir el P. Eng quan es vol utilitzar el títol de "enginyer" o en la pràctica d'"enginyeria de programari".

Als Estats Units, a partir del 2013, hi ha un examen d'enginyer professional NCEES d'Enginyeria de Software, que permet els enginyers de programari d'obtenir la llicència i ser reconeguts. La llicència obligatòria està actualment sent objecte d'un intens debat, i percebuda com a polèmica. En algunes parts dels EUA com Texas, l'ús del terme d'Enginyer està regulat per la llei i reserva el seu ús només per a persones que tenen una llicència d'enginyer professional. L'IEEE informa que no es requereix la llicència d'enginyer professional llevat que l'individu treballi per al públic en matèries en què la salut dels altres podria estar en risc, o si l'enginyer no compleix amb els requerits estàndards de l'estat en particular. Les llicències d'enginyer professionals són específiques per a l'estat que les ha atorgat, i han de ser represes amb regularitat.

El IEEE Computer Society i l'ACM, les dues principals organitzacions professionals de l'enginyeria de programari, publiquen guies per a la professió de l'enginyeria de programari. L'IEEE Guia per al Cos d'Enginyeria del Software de coneixement - 2004 Versió, o SWEBOK, defineix l'àmbit i descriu el coneixement que la IEEE espera que un enginyer de programari ha de tenir. L'IEEE també promulga una "Codi Ètic d'Enginyeria de Programari".<ref>{{Ref-web |url=http://www.computer.org/portal/cms_docs_computer/computer/content/code-of-ethics.pdf |títol=''Enginyeria de Programari de Codi d'Ètica "  |consulta=2011-06-24 |arxiuurl=https://web.archive.org/web/20110629124254/http://www.computer.org/portal/cms_docs_computer/computer/content/code-of-ethics.pdf |arxiudata=2011-06-29}}</ref>

 Ocupació 
El 2004, l'U. S. Bureau of Labor Statistics comptà 760.840 enginyer de programaris ocupats als EUA i, al mateix període, hi va haver uns 1,4 milions de professionals empleats en els EUA en totes les disciplines d'enginyeria combinades.<ref>Oficina d'Estadístiques Laborals, Departament de Treball dels EUA, [ftp://ftp.bls.gov/pub/news.release/ocwage.txtUSDL 05-2145: Occupational Employment and Wages, novembre de 2004], el Quadre 1</ref> A causa de la seva relativa novetat com un camp d'estudi, la formació acadèmica a l'enginyeria de programari sovint s'ensenya com a part d'un pla d'estudis d'informàtica, i com a resultat, la majoria dels enginyers de programari tenen títols de ciències de la computació.

La majoria d'enginyers de programari treballen com a empleats o contractistes. Els enginyers de programari treballen amb empreses, organismes governamentals (civils o militars), i organitzacions no lucratives. Alguns enginyers de programari treballen per a si mateixos, com a independents. Algunes organitzacions compten amb especialistes per dur a terme cada una de les tasques del procés de desenvolupament de programari; altres organitzacions requereixen els enginyers de programari per a fer-ne només algunes, o totes elles. En els grans projectes, les persones poden especialitzar-se en una sola funció. En els projectes petits, les persones poden omplir diversos rols o tots al mateix temps. Algunes especialitzacions són: la indústria (analistes, arquitectes, desenvolupadors, emprovadors, suport tècnic, administradors...) i a l'acadèmia (educadors, investigadors).

Hi ha un debat considerable sobre les perspectives futures d'ocupació pels enginyers de programari i altres IT professionals. Per exemple: un mercat de futur en línia anomenat el "Futur de la TI: ITJOBS llocs de treball als Estats Units" intenta respondre si hi haurà més llocs de treball de TI, incloent-hi enginyers de programari, l'any 2012 dels que n'hi havia el 2002.

 Certificació 
La certificació professional dels enginyers de programari és un tema polèmic, amb algunes organitzacions professionals que hi donen suport, i altres que afirmen que no és apropiat donat l'actual nivell de maduresa en la professió. Alguns ho veuen com una eina per millorar la pràctica professional; "L'únic propòsit dels enginyers de programari de llicència és per protegir el públic''".

L'ACM tenia un programa de certificació professional a la dècada de 1980 que es va suspendre per la manca d'interès. L'ACM ha examinat la possibilitat de la certificació professional dels enginyers de programari a finals del 1990, però finalment es va decidir que aquesta certificació no era l'adequada per a la pràctica professional de l'enginyeria industrial de programari. A 2006 l'IEEE havia certificat a més de 575 professionals de programari.
El Software Engineering Institute ofereix certificació en temes específics com la seguretat, la millora de processos i arquitectura de programari.

La majoria de certificacions en els programes de la tecnologia IT estan orientades a tecnologies específiques, i són gestionades pels venedors d'aquestes tecnologies. Aquests programes de certificació s'adapten a les institucions que donen feina a persones que utilitzen aquestes tecnologies.

 Responsabilitat 
En un projecte la responsabilitat serà compartida per tots els integrants que el conformen, encara que no serà repartida en parts iguals. El programari demana una clara distribució de la responsabilitat entre els diferents rols que es donen en el procés de producció. L'enginyer de programari té una responsabilitat moral i legal limitada a les conseqüències directes.

 Disciplines relacionades amb l'enginyeria del programari 
L'enginyeria de programari es podria dividir en:
 Anàlisi de requisits.
 Prototipatge.
 Desenvolupament de programari.
 Proves de programari.
 Manteniment de programari.
 Convenció sobre configuració.
 Eines CASE.

L'enginyeria de programari està relacionada amb les disciplines de ciències de la computació, gestió de projectes i enginyeria de sistemes.

Informàtica L'enginyeria de programari és considerada un subcamp de la informàtica per molts acadèmics. Molts dels fonaments de l'enginyeria de programari provenen de la informàtica.Gestió de projectes La construcció d'un sistema de programari es considera, generalment, com un projecte i pren prestats molts principis del camp de la gestió de projectes.Enginyeria de sistemes'''
 Els enginyers de sistemes s'han ocupat de la complexitat dels sistemes durant moltes dècades i el seu coneixement s'aplica a molts problemes d'enginyeria de programari.

Subdisciplines 
L'enginyeria de programari pot ser dividit en deu subdisciplines, que són:
 Requisits de programari: L'anàlisi de l'obtenció, especificació i validació de requisits de programari.
 Disseny de programari: El disseny del programari se sol fer amb Computer-Aided Software Engineering (CASE) i l'ús de normes per al format, com el Llenguatge Unificat de Modelat (UML).
 Desenvolupament de programari: La construcció de programari a través de la utilització de llenguatges de programació.
 Proves de programari.
 Manteniment de programari: Els sistemes de programari sovint tenen problemes i necessiten millores després d'un llarg temps des de la primera prova. En aquest subcamp es tracten aquests problemes.
 Gestió de configuració de programari: Com que els sistemes de programari són molt complexos, la seva configuració (com ara el control de versions i control de codi font) han de ser gestionats en un mètode normalitzat i estructurat.
 Gestió d'enginyeria de programari: La gestió dels sistemes de programari s'inspira en gran manera a partir de gestió de projectes, però hi ha matisos trobats en el programari que no es veu en les disciplines de gestió.
 Procés de desenvolupament de programari: El procés de construcció de programari és objecte d'acalorats debats entre els professionals sobre els principals paradigmes i l'agilitat del desenvolupament de programari o el model en cascada.
 Les eines d'enginyeria de programari, vegeu Eines CASE.
 La qualitat del programari.

Educació 
El coneixement de la programació és el principal requisit per a convertir-se en un enginyer de programari, però no és suficient. Molts enginyers de programari tenen títols en informàtica a causa de la manca de programes d'enginyeria de programari a l'educació superior. Tanmateix, això ha començat a canviar amb la introducció de noves titulacions d'enginyeria de software, especialment en l'educació de postgrau. Un programa internacional per a les titulacions d'enginyeria de programari de pregrau va ser definit pel CCSE.

Steve McConnell opina que pel fet que la majoria de les universitats ensenyin ciències de la computació en lloc d'enginyeria de programari, hi ha una veritable escassetat d'enginyers de programari. El 2004, el IEEE Computer Society va produir el SWEBOK, que ha esdevingut un estàndard ISO que descriu el cos de coneixement cobert per un enginyer de programari.

La Comissió Europea al programa Erasmus Mundus ofereix una màster europeu, anomenat Màster Europeu en Enginyeria de Programari per als estudiants d'Europa i també fora d'Europa. Aquest és un programa conjunt (doble titulació) amb la participació de quatre universitats a Europa.

Organitzacions 
 Software Engineering Institute (SEI).
 Association for Computing Machinery (ACM).
 British Computer Society (BCS).
 IEEE Computer Society.
 RUSSOFT.
 Society of Software Engineers.

Referències

Vegeu també 
 Patró de disseny (informàtica).
 Patró arquitectònic (informàtica).
 Enertrònica.

Bibliografia

Enllaços externs 
 Computing Curricula 2005: L'informe general  de la Força de Tasca Conjunta de Computing Curricula ACM / AIS / IEEE-CS
 Directrius de pla d'estudis per a programes de grau en Enginyeria de Programari de la Força de Tasca Conjunta de plans d'estudis d'Informàtica ACM / IEEE-CS
 Directrius per Grau Associat de transferència de Currículum en Enginyeria de Programari  per l'ACM de Dos Anys de Colegio del Comitè d'Educació i la Força Especial Conjunta d'Enginyeria del Software Association for Computing Machinery IEEE Computer Societat
 Guia per al Cos d'Enginyeria del Software de Coneixement
 Computer Software Engineers - Definició i estadístiques dels EUA Oficina d'Estadístiques del Treball 
 IEEE Software Engineering Online 
 Guia de l'estudiant per a Projectes d'Enginyeria de Software  - una guia en línia gratuït per als estudiants que prenen cursos del projecte ES