Det siste tiåret har gapet mellom etterspørselen etter nye, komplekse programvaresystemer og tilbudet av slike systemer utvidet seg. Dette gapet, samt vanskelighetene som programvareingeniører møter i arbeidet med å tette dette, har blitt beskrevet som programvarekrisen, hvor systemene har blitt så store og komplekse at det er stadig vanskeligere å fullføre utviklingen innen tidsfrister og prosjektbudsjett. Programvaregjenbruk er av økende betydning som en viktig faktor for å lindre noen av de problemene som oppstår som følge av programvarekrisen.

Gjennom tidene har programvareteknologier utviklet seg betydelig, og i dag ser vi en økende interesse for gjenbruk av programvarekomponenter. I motsetning til tradisjonell maskinteknikk, hvor produkter kan brytes ned, produseres og deretter endres i henhold til en fysisk produksjonsprosess, har programvare en annen natur. Den er et symbolsk produkt som, når den er designet, ikke har en produksjonsfase, og den forringes ikke, selv om endringer i miljøet kan kreve modifikasjoner. Dette gir programvaren et potensial for gjenbruk på en måte som fysiske produkter ikke kan etterligne.

Gjenbruk av programvare kan betydelig forbedre både produktiviteten og kvaliteten på programvareutviklingen. Ved å bruke deler utviklet for tidligere prosjekter, kan man spare utviklingstid, og kvaliteten kan heves ettersom de hyppig brukte komponentene allerede har blitt testet og feilsøkt i ulike sammenhenger. Til tross for disse fordelene er det flere faktorer som hindrer programvareutviklere fra å omfavne gjenbruk fullt ut.

De hyppigst nevnte grunnene til at programvare ikke gjenbrukes er mangel på nødvendige verktøy som kan støtte utviklerne i å finne og bruke eksisterende komponenter, mangel på opplæring for utviklerne i hvordan de kan lage gjenbrukbare komponenter, samt et manglende fokus på metodologi og motivasjon for både utviklerne og ledelsen for å se de langsiktige fordelene med gjenbruk. Dette peker på et grunnleggende problem med eksisterende utviklingspraksis, organisasjonsstrukturer og teknologier som brukes i programvareutvikling.

I boken som omhandler dette temaet, er det fire hovedseksjoner som gir en helhetlig tilnærming til programvaregjenbruk. Først introduseres bakgrunnen for programvareutvikling og programvareforvaltning, som setter konteksten for forståelsen av hvordan programvare kan gjenbrukes i dagens teknologiske landskap. Deretter presenteres et konseptuelt rammeverk for gjenbruk som understreker betydningen av organisatoriske spørsmål og relevante standarder. Den tredje seksjonen utforsker hvordan man kan organisere, hente ut og reorganisere programvarekomponenter fra et bibliotek, mens den fjerde delen fokuserer på praktiske eksempler og verktøy som kan hjelpe utviklere i arbeidet med å implementere gjenbruk i sitt arbeid. Her undersøkes blant annet kursware, et eksempel på et område hvor gjenbruk har vist seg spesielt nyttig.

Et område hvor gjenbruk er av særlig interesse er i utdanning. Programvarekurs og utdanning om programvaregjenbruk kan spille en viktig rolle i å støtte utviklingen av praksis på dette området. Mangelen på tilstrekkelig utdanning om gjenbruk er en betydelig barriere for at praksisen skal bli mer utbredt og effektiv. Ved å benytte internettets potensial, kan man også tilby opplæring og deling av informasjon gjennom virtuelle klasserom og nettbaserte kurs. Denne tilgangen gjør det lettere for utviklere å få tilgang til verktøy og ressurser som kan fremme gjenbruk.

Programvaregjenbruk har mange fordeler, men for at denne praksisen skal bli mer akseptert og effektiv, må det skje en endring i hvordan utviklingsprosesser er strukturert og hvordan utdanning og opplæring omkring gjenbruk gjennomføres. Mangelen på verktøy, utdanning og motivasjon er de største hindringene som må overvinnes.

For å forstå betydningen av programvaregjenbruk, er det viktig å anerkjenne at gjenbruk er mer enn bare et teknisk valg – det handler om en kulturell og organisatorisk tilnærming til programvareutvikling. Et skifte i tenkning, som støttes av riktig utdanning og verktøy, kan gjøre programvaregjenbruk til en sentral del av programvareutviklingens fremtid.

Hvordan DRACO og Generative Tilnærminger Endrer Programvareutvikling og Gjenbruk

DRACO er utviklet for å fange og gjenbruke analyseinformasjon, snarere enn lavnivåinformasjon som kodekomponenter. Prosessoren mottar høynivåbeskrivelser av ønskede programmer og genererer koden ut fra disse. Designene for et spesifikt domene uttrykkes på en formell måte, noe som fører til en klar forståelse av input, output og prosesser. DRACO er basert på domener og involverer tre nye menneskelige roller i programvareutviklingsprosessen:

  • Applikasjonsdomeneanalysemann - en domeneekspert som kan identifisere felles elementer i kravene til flere systemer i et domene eller problemområde. Hans eller hennes jobb er å definere objektene og operasjonene som er viktige i dette domenet.

  • Domene-designer - spesifiserer forskjellige implementeringer for disse objektene og operasjonene med hensyn til andre domener.

  • Modellering-domeneanalysemann - ligner på applikasjonsdomeneanalysemannen, men har mer fokus på hvilke krav i domenet som har vist seg å være generelle på tvers av flere interesseområder.

Når DRACO-domenet er stort nok, kan nye systemer bygges fra eksisterende komponentinformasjon. Dette er et eksempel på gjenbruk på programvarekonseptnivå, som deretter kan transformeres til kode. Systemet har mange domener, organisert hierarkisk, og noen av disse inneholder eksekverbar informasjon som tillater at kodetransformasjonen finner sted.

I sammenheng med gjenbruk kan tilnærmingene klassifiseres som enten komposisjonelle eller generative. Komposisjonelle tilnærminger støtter utviklingen av systemer fra bunnen av ved å bruke et bibliotek av tilgjengelige lavnivåkomponenter. Stort arbeid er lagt ned i klassifisering og hentesystemteknologi samt utviklingen av automatiserte systemer som støtter dette. Generative tilnærminger, på den annen side, er spesifikke for applikasjonsdomener; de tar i bruk en standardisert domenearkitekturmodell og standardgrensesnitt for komponentene. Deres mål er å kunne generere et nytt system automatisk fra en passende spesifikasjon av dets parametere.

Fjerdegenerasjonsprogrammeringsspråk, som brukes i kommersiell programvareutvikling, kan betraktes som et eksempel på generativ gjenbruk. Slike tilnærminger kan være svært effektive i godt forståtte domener, men det kreves betydelig innsats for å utvikle den innledende modellen. Applikasjonsgeneratorer aksepterer spesifikasjoner for ønskede applikasjonskarakteristikker og genererer applikasjonsprodukter. Et eksempel på dette er en generator som støtter interaktiv konstruksjon av grafiske brukergrensesnitt. Slike verktøy tillater direkte spesifikasjon av brukergrensesnittabstraksjoner, som menyer og knapper.

Et applikasjonsgenerator tillater brukeren å manipulere relativt høynivåkonstruksjoner og i praksis omorganisere komponentene til et nytt produkt. På denne måten kan applikasjonsgeneratorer betraktes som verktøy for gjenbruk. Noen vil imidlertid argumentere for at en applikasjonsgenerator ikke nødvendigvis er et gjenbruksverktøy i seg selv, men heller et nytt program som kan brukes til å lage andre programmer.

Når vi ser på brukergrensesnittet, er et av de viktigste kravene enkelhet i bruk. Selv om dette kan være et subjektivt mål, finnes det flere retningslinjer som kan hjelpe utviklere. En av de viktigste behovene ved utforming av et grensesnitt er konsistens. Konsistens må eksistere på mange nivåer: fra vindu til vindu i et program, fra program til program på en plattform, og så videre. Hvis alle "gadgets" (funksjonelle deler av grensesnittet, som knapper eller rullefelt) fungerer på samme måte, kan brukeren ikke bare overføre ferdigheter fra gadget til gadget når de brukes til samme funksjon (f.eks. at alle rullevinduer har samme type rullefelt, enten de ruller tekst eller grafikk), men også forutsi hva en ny grensesnittkomponent gjør basert på hvilke gadgets den bruker. Dette reduserer også potensielt kostbare feil som brukerne kan gjøre.

Konsistens i brukergrensesnittet er nært knyttet til gjenbruk av kode, ettersom den samme koden kan brukes til å sikre at alle funksjoner av en bestemt type oppfører seg identisk. Dette er spesielt viktig i utvikling av komplekse systemer hvor flere programmer kan dele felles elementer og funksjoner.

Når det gjelder generative tilnærminger som DRACO og applikasjonsgeneratorer, er det viktig å forstå at de potensielt kan føre til betydelig tidsbesparelse og økt kvalitet, men samtidig stiller de krav til at utviklere har tilstrekkelig forståelse og kontroll over de standardiserte modellene og komponentene som brukes. For at generative tilnærminger skal være effektive, er det avgjørende at den opprinnelige modellen som utvikles, er grundig og tilpasset det aktuelle domenet. Jo bedre modellen reflekterer virkeligheten i det aktuelle området, desto mer effektivt kan den generere applikasjoner som er både nyttige og brukervennlige.

Hvordan kan programvaregjenbruk effektivt implementeres i utviklingsprosesser?

Gjenbruk av programvarekomponenter har blitt en avgjørende praksis i utviklingen av moderne programvare. Særlig innen store organisasjoner som IBM, har denne praksisen utviklet seg fra sporadiske forsøk til vellykkede, systematiske tilnærminger. En av de største utfordringene som har oppstått, er hvordan man kan strukturere og forenkle bruken av gjenbrukbare deler, slik at de kan integreres effektivt i nye prosjekter.

Et eksempel på tidlig forsøk med programvaregjenbruk er IBM Boblingen, hvor initiativet startet på 1980-tallet. På denne tiden hadde gjenbruk ikke blitt implementert på tvers av prosjekter, og det fantes ingen organisatoriske strukturer som støttet kommunikasjon på tvers av prosjekter. Det var også mangel på et felles designspråk, noe som gjorde deling av kode vanskelig. IBM Boblingen oppdaget snart at dataabstraksjon var en viktig tilnærming for å gjøre koden mer modulær og gjenbrukbar. Ved å utvikle et system for abstrakte datatyper, kunne de redusere avhengighetene i koden og øke mulighetene for å gjenbruke programvarekomponenter på tvers av prosjekter.

Etter hvert ble det klart at et dedikert "Parts Center" var nødvendig for å lagre og distribuere gjenbrukbare programvarekomponenter. Et slikt senter kunne tilby verktøy som gjorde det enklere for utviklere å finne og bruke eksisterende byggesteiner i stedet for å skrive ny kode fra bunnen av. Dette inkluderte blant annet en kode telleverktøy for å telle gjenbrukte instruksjoner og et konfigurasjonsstyringsverktøy for kildesystemer som støttet integreringen av gjenbrukbare deler.

På et mer operasjonelt nivå, ble ideen om «fingertupp-gjenbruk» introdusert som en del av teknologioverføringen. Dette konseptet er inspirert av hvordan folk raskt kan finne informasjon ved å bruke «Yellow Pages» -bøker. Med denne tilnærmingen hadde utviklerne et verktøy som gjorde det mulig å finne og bruke gjenbrukbare komponenter på sekunder, akkurat når behovet for dem oppstod. Dette redusere terskelen for å benytte eksisterende ressurser, noe som i sin tur økte graden av gjenbruk i prosjektene.

Den store utfordringen med programvaregjenbruk er å finne en balansegang mellom å oppmuntre til gjenbruk og å opprettholde et fleksibelt utviklingsmiljø. IBM lærte at den beste tilnærmingen ofte var en kombinasjon av "grass-roots" prosjekter og "edict" tilnærminger. "Edict"-metoden kunne raskt generere resultater, men det var ikke alltid den mest effektive måten å få aksept fra utviklerne. Grass-roots tilnærmingen, derimot, krevde mer tid og tålmodighet, men den førte til dypere forståelse og forankring av metoden blant utviklerne.

En annen viktig lærdom fra IBM var nødvendigheten av et system som kunne administrere og vedlikeholde et bibliotek av gjenbrukbare deler på en effektiv måte. IBM Boblingen utviklet et omfattende bibliotek med standardiserte og parametriserte komponenter som kunne brukes på tvers av prosjekter. Dette biblioteket var et viktig skritt mot å skape en kultur av gjenbruk, da det gjorde det lettere for utviklere å finne og bruke eksisterende løsninger fremfor å utvikle nye.

En sentral komponent i suksessen til disse initiativene var IBM’s forståelse av at teknologien alene ikke var nok. De innså at støttende verktøy og en strukturert tilnærming til gjenbruk var nødvendig. Derfor ble det utviklet verktøy som kunne støtte hele prosessen, fra opprettelsen av byggesteiner til integrering av disse i nye applikasjoner.

Erfaringene fra IBM Boblingen viser at det er nødvendig med en velorganisert struktur for å kunne implementere gjenbruk effektivt. Dette inkluderer både tekniske verktøy og organisatoriske rammer, samt en kultur som fremmer forståelse og aksept blant utviklerne. IBM lærte at gjenbruk av programvare ikke bare handler om å lage et bibliotek med gjenbrukbare deler, men også om å tilrettelegge for en prosess som gjør det lett for utviklere å bruke disse delene i sine egne prosjekter.

Slik gjenbruk kan gi store fordeler både i form av reduserte utviklingskostnader og økt kvalitet, da kode som er testet og validert tidligere, trolig vil være mer stabil og pålitelig enn nyutviklet kode. De største utfordringene er imidlertid å bygge et system og en kultur som gjør det mulig for utviklere å integrere gjenbrukbare deler i sine prosjekter på en måte som føles naturlig og effektiv.

En viktig erfaring å trekke fra IBM’s arbeid er at implementeringen av gjenbruk krever et langsiktig perspektiv. Det handler ikke bare om å lage tekniske verktøy, men også om å bygge en organisasjon og en kultur som støtter gjenbruk som en naturlig del av utviklingsprosessen. Ved å tilrettelegge for gjenbruk på en smart og effektiv måte, kan organisasjoner drastisk redusere tiden og ressursene som trengs for å utvikle nye programvarer, samtidig som de opprettholder en høy kvalitet på sine produkter.